diff --git a/BUILD.gn b/BUILD.gn
index a36e366..0be93385 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -311,6 +311,7 @@
       "//tools/android/customtabs_benchmark:customtabs_benchmark_apk",
       "//tools/android/errorprone_plugin:errorprone_plugin_java",
       "//tools/android/kerberos/SpnegoAuthenticator:spnego_authenticator_apk",
+      "//tools/cygprofile:cygprofile_unittests",
       "//ui/android:ui_junit_tests",
     ]
     deps -= [
@@ -1151,16 +1152,6 @@
       "Do not use a platform name in your output directory (found \"$root_build_dir\"). http://crbug.com/548283")
 }
 
-if (!is_win || !is_clang) {
-  group("webui_closure_compile") {
-    data_deps = []
-    if (is_chromeos) {
-      data_deps +=
-          [ "//chrome/browser/resources/chromeos/login:closure_compile" ]
-    }
-  }
-}
-
 assert_valid_out_dir("_unused") {
   actual_sources = [ "$root_build_dir/foo" ]
 }
diff --git a/DEPS b/DEPS
index f7d1ee0d..eb65035 100644
--- a/DEPS
+++ b/DEPS
@@ -75,15 +75,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling sfntly
   # and whatever else without interference from each other.
-  'sfntly_revision': '16f3404e41edc9708a51fbce481f22e46b809686',
+  'sfntly_revision': '2804148152d27fa2e6ec97a32bc2d56318e51142',
   # 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': '835e26526f27a2cb6a408fd556edcaee9a2cf138',
+  'skia_revision': '6ede412188278e3b9529fe4b486f3b4899c922d0',
   # 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': '2dbaa17d287cfd2df02b6396d2c96e164b48a9fc',
+  'v8_revision': 'b00d05802cf53775ccdfb441e2494d99d3188ac9',
   # 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.
@@ -91,7 +91,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '8d986bf24128b2eb05b1e14dfdea42d05225ccd1',
+  'angle_revision': '24842908c4bd011178d01be6e61000a166f822fd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -103,7 +103,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '8df7805e66d3b32513b05554aacd5959a5e5928f',
+  'pdfium_revision': 'aa2aff78e082f14e4bc418f68b27817f90e3f07a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -135,7 +135,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '3994526859f1e56267ce0c669c928968fa53078e',
+  'catapult_revision': '922be470d304acb298558e74a555ad41a0c9bed4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -171,17 +171,6 @@
   'src/buildtools':
     Var('chromium_git') + '/chromium/buildtools.git' + '@' +  Var('buildtools_revision'),
 
-  'src/chrome/android/profiles': {
-      'packages': [
-          {
-              'package': 'chromium/afdo/profiles/android',
-              'version': 'version:3309',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/chrome/installer/mac/third_party/xz/xz': {
       'url': Var('chromium_git') + '/chromium/deps/xz.git' + '@' + 'eecaf55632ca72e90eb2641376bce7cdbc7284f7',
       'condition': 'checkout_mac',
@@ -272,17 +261,6 @@
   'src/third_party/SPIRV-Tools/src':
     Var('chromium_git') + '/external/github.com/KhronosGroup/SPIRV-Tools.git' + '@' + '9166854ac93ef81b026e943ccd230fed6c8b8d3c',
 
-  'src/third_party/accessibility_test_framework': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/accessibility-test-framework',
-              'version': 'version:2.1-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/android_protobuf/src': {
       'url': Var('chromium_git') + '/external/android_protobuf.git' + '@' + '7fca48d8ce97f7ba3ab8eea5c472f1ad3711762f',
       'condition': 'checkout_android',
@@ -293,28 +271,6 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/android_support_test_runner': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/android_support_test_runner',
-              'version': 'version:0.5-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
-  'src/third_party/android_system_sdk': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/android_system_sdk',
-              'version': 'version:27-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/android_tools': {
       'url': Var('chromium_git') + '/android_tools.git' + '@' + '9a70d48fcdd68cd0e7e968f342bd767ee6323bd1',
       'condition': 'checkout_android',
@@ -328,33 +284,11 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/apk-patch-size-estimator': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/apk-patch-size-estimator',
-              'version': 'version:0.2-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/auto/src': {
       'url': Var('chromium_git') + '/external/github.com/google/auto.git' + '@' + '8a81a858ae7b78a1aef71ac3905fade0bbd64e82',
       'condition': 'checkout_android',
   },
 
-  'src/third_party/bazel': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/bazel',
-              'version': 'version:0.10.0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/bidichecker':
     Var('chromium_git') + '/external/bidichecker/lib.git' + '@' + '97f2aa645b74c28c57eca56992235c79850fa9e0',
 
@@ -366,31 +300,9 @@
   'src/third_party/boringssl/src':
     Var('boringssl_git') + '/boringssl.git' + '@' +  Var('boringssl_revision'),
 
-  'src/third_party/bouncycastle': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/bouncycastle',
-              'version': 'version:1.46-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/breakpad/breakpad':
     Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'ac4a549e29fbc8fe58212380e41fa24f36e6c3ec',
 
-  'src/third_party/byte_buddy': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/byte_buddy',
-              'version': 'version:1.4.17-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/catapult':
     Var('chromium_git') + '/catapult.git' + '@' + Var('catapult_revision'),
 
@@ -424,7 +336,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b422e687a5b098a3284ffa754bac7f945019663f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '543dc3e4c34ee236dd6e40d7f92be28a28410480',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -442,17 +354,6 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/espresso': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/espresso',
-              'version': 'version:2.2.1-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/ffmpeg':
     Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '9ed334093692f2dc77c4ad8186ddadde584e1e20',
 
@@ -499,83 +400,17 @@
       'condition': 'checkout_win',
   },
 
-  'src/third_party/gson': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/gson',
-              'version': 'version:2.8.0-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
-  'src/third_party/guava': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/guava',
-              'version': 'version:23.0-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/gvr-android-sdk/src': {
       'url': Var('chromium_git') + '/external/github.com/googlevr/gvr-android-sdk.git' + '@' + '6aef4ab34276aac81ee38f1cb1d034de7fc4a4eb',
       'condition': 'checkout_android',
   },
 
-  'src/third_party/hamcrest': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/hamcrest',
-              'version': 'version:1.3-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/hunspell_dictionaries':
     Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + 'a9bac57ce6c9d390a52ebaad3259f5fdb871210e',
 
   'src/third_party/icu':
     Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'd888fd2a1be890f4d35e43f68d6d79f42519a357',
 
-  'src/third_party/icu4j': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/icu4j',
-              'version': 'version:53.1-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
-  'src/third_party/intellij': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/intellij',
-              'version': 'version:12.0-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
-  'src/third_party/javax_inject': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/javax_inject',
-              'version': 'version:1-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/jsoncpp/source':
     Var('chromium_git') + '/external/github.com/open-source-parsers/jsoncpp.git' + '@' + 'f572e8e42e22cfcf5ab0aea26574f408943edfa4', # from svn 248
 
@@ -710,34 +545,12 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/objenesis': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/objenesis',
-              'version': 'version:2.4-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/openh264/src':
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '2e96d62426547ac4fb5cbcd122e5f6eb68d66ee6',
 
   'src/third_party/openmax_dl':
     Var('webrtc_git') + '/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
 
-  'src/third_party/ow2_asm': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/ow2_asm',
-              'version': 'version:5.0.1-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/pdfium':
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
@@ -775,17 +588,6 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/robolectric': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/robolectric',
-              'version': 'version:3.5.1',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/robolectric/robolectric': {
       'url': Var('chromium_git') + '/external/robolectric.git' + '@' + '7e067f1112e1502caa742f7be72d37b5678d3403',
       'condition': 'checkout_android',
@@ -806,17 +608,6 @@
   'src/third_party/snappy/src':
     Var('chromium_git') + '/external/github.com/google/snappy.git' + '@' + 'ca37ab7fb9b718e056009babb4fea591626e5882',
 
-  'src/third_party/sqlite4java': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/sqlite4java',
-              'version': 'version:0.282-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/swiftshader':
     Var('swiftshader_git') + '/SwiftShader.git' + '@' +  Var('swiftshader_revision'),
 
@@ -856,24 +647,13 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a182a9ad3078aca566d8355eabf2d9f56f70ee82',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fc8d26bd8ad627a4469bbe2ca6e343ae9fe4e537', # commit position 21742
+    Var('webrtc_git') + '/src.git' + '@' + '5283022790de569cd0792fbd9d434f1fb56ce289', # commit position 21742
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
       'condition': 'checkout_linux',
   },
 
-  'src/third_party/xstream': {
-      'packages': [
-          {
-              'package': 'chromium/third_party/xstream',
-              'version': 'version:1.4.8-cr0',
-          },
-      ],
-      'condition': 'checkout_android',
-      'dep_type': 'cipd',
-  },
-
   'src/third_party/yasm/source/patched-yasm':
     Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + 'b98114e18d8b9b84586b10d24353ab8616d4c5fc',
 
@@ -1475,6 +1255,15 @@
   },
 
   {
+    'name': 'Android CIPD Ensure',
+    'pattern': '.',
+    'condition': 'checkout_android',
+    'action': ['src/build/cipd/cipd_wrapper.py',
+               '--chromium-root', 'src',
+               '--ensure-file', 'src/build/cipd/android/android.ensure',
+    ],
+  },
+  {
     'name': 'Fetch Android AFDO profile',
     'pattern': '.',
     'condition': 'checkout_android',
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/FontPreloadingWorkaround.java b/android_webview/glue/java/src/com/android/webview/chromium/FontPreloadingWorkaround.java
index fed007b..e637086 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/FontPreloadingWorkaround.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/FontPreloadingWorkaround.java
@@ -89,6 +89,7 @@
             mRealPackageManager = realPackageManager;
         }
 
+        @Override
         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
             Object result;
             try {
diff --git a/android_webview/tools/apk_merger.py b/android_webview/tools/apk_merger.py
index bfba16f..bfb1dad2 100755
--- a/android_webview/tools/apk_merger.py
+++ b/android_webview/tools/apk_merger.py
@@ -145,25 +145,6 @@
                                  compress=compress)
 
 
-def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path,
-                    keystore_path, key_name, key_password):
-  try:
-    finalize_apk.JarSigner(
-        keystore_path,
-        key_name,
-        key_password,
-        tmp_apk,
-        signed_tmp_apk)
-  except build_utils.CalledProcessError as e:
-    raise ApkMergeFailure('Failed to sign APK: ' + e.output)
-
-  try:
-    finalize_apk.AlignApk(zipalign_path,
-                          signed_tmp_apk,
-                          new_apk)
-  except build_utils.CalledProcessError as e:
-    raise ApkMergeFailure('Failed to align APK: ' + e.output)
-
 def GetSecondaryAbi(apk_zipfile, shared_library):
   ret = ''
   for name in apk_zipfile.namelist():
@@ -258,16 +239,16 @@
   tmp_dir_64 = os.path.join(tmp_dir, '64_bit')
   tmp_dir_32 = os.path.join(tmp_dir, '32_bit')
   tmp_apk = os.path.join(tmp_dir, 'tmp.apk')
-  signed_tmp_apk = os.path.join(tmp_dir, 'signed.apk')
   new_apk = args.out_apk
 
   try:
     MergeApk(args, tmp_apk, tmp_dir_32, tmp_dir_64)
 
-    SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, args.zipalign_path,
-                    args.keystore_path, args.key_name, args.key_password)
-  except ApkMergeFailure as exc:
-    return 'ERROR: %s' % exc
+    apksigner_path = os.path.join(
+        os.path.dirname(args.zipalign_path), 'apksigner')
+    finalize_apk.FinalizeApk(apksigner_path, args.zipalign_path,
+                             tmp_apk, new_apk, args.keystore_path,
+                             args.key_password, args.key_name)
   finally:
     shutil.rmtree(tmp_dir)
   return 0
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
index d634220..a7a9a9e 100644
--- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
+++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
@@ -174,9 +174,7 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            WebView.setWebContentsDebuggingEnabled(true);
-        }
+        WebView.setWebContentsDebuggingEnabled(true);
         setContentView(R.layout.activity_webview_browser);
         mUrlBar = (EditText) findViewById(R.id.url_field);
         mUrlBar.setOnKeyListener(new OnKeyListener() {
diff --git a/ash/components/ash_components_strings.grd b/ash/components/ash_components_strings.grd
new file mode 100644
index 0000000..5c5a942b
--- /dev/null
+++ b/ash/components/ash_components_strings.grd
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<grit base_dir="." latest_public_release="0" current_release="1"
+      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+  <outputs>
+    <output filename="grit/ash_components_strings.h" type="rc_header">
+      <emit emit_type='prepend'></emit>
+    </output>
+    <output filename="ash_components_strings_am.pak" type="data_package" lang="am" />
+    <output filename="ash_components_strings_ar.pak" type="data_package" lang="ar" />
+    <output filename="ash_components_strings_bg.pak" type="data_package" lang="bg" />
+    <output filename="ash_components_strings_bn.pak" type="data_package" lang="bn" />
+    <output filename="ash_components_strings_ca.pak" type="data_package" lang="ca" />
+    <output filename="ash_components_strings_cs.pak" type="data_package" lang="cs" />
+    <output filename="ash_components_strings_da.pak" type="data_package" lang="da" />
+    <output filename="ash_components_strings_de.pak" type="data_package" lang="de" />
+    <output filename="ash_components_strings_el.pak" type="data_package" lang="el" />
+    <output filename="ash_components_strings_en-GB.pak" type="data_package" lang="en-GB" />
+    <output filename="ash_components_strings_en-US.pak" type="data_package" lang="en" />
+    <output filename="ash_components_strings_es.pak" type="data_package" lang="es" />
+    <output filename="ash_components_strings_es-419.pak" type="data_package" lang="es-419" />
+    <output filename="ash_components_strings_et.pak" type="data_package" lang="et" />
+    <output filename="ash_components_strings_fa.pak" type="data_package" lang="fa" />
+    <output filename="ash_components_strings_fake-bidi.pak" type="data_package" lang="fake-bidi" />
+    <output filename="ash_components_strings_fi.pak" type="data_package" lang="fi" />
+    <output filename="ash_components_strings_fil.pak" type="data_package" lang="fil" />
+    <output filename="ash_components_strings_fr.pak" type="data_package" lang="fr" />
+    <output filename="ash_components_strings_gu.pak" type="data_package" lang="gu" />
+    <output filename="ash_components_strings_he.pak" type="data_package" lang="he" />
+    <output filename="ash_components_strings_hi.pak" type="data_package" lang="hi" />
+    <output filename="ash_components_strings_hr.pak" type="data_package" lang="hr" />
+    <output filename="ash_components_strings_hu.pak" type="data_package" lang="hu" />
+    <output filename="ash_components_strings_id.pak" type="data_package" lang="id" />
+    <output filename="ash_components_strings_it.pak" type="data_package" lang="it" />
+    <output filename="ash_components_strings_ja.pak" type="data_package" lang="ja" />
+    <output filename="ash_components_strings_kn.pak" type="data_package" lang="kn" />
+    <output filename="ash_components_strings_ko.pak" type="data_package" lang="ko" />
+    <output filename="ash_components_strings_lt.pak" type="data_package" lang="lt" />
+    <output filename="ash_components_strings_lv.pak" type="data_package" lang="lv" />
+    <output filename="ash_components_strings_ml.pak" type="data_package" lang="ml" />
+    <output filename="ash_components_strings_mr.pak" type="data_package" lang="mr" />
+    <output filename="ash_components_strings_ms.pak" type="data_package" lang="ms" />
+    <output filename="ash_components_strings_nl.pak" type="data_package" lang="nl" />
+    <!-- The translation console uses 'no' for Norwegian Bokmål. It should
+         be 'nb'. -->
+    <output filename="ash_components_strings_nb.pak" type="data_package" lang="no" />
+    <output filename="ash_components_strings_pl.pak" type="data_package" lang="pl" />
+    <output filename="ash_components_strings_pt-BR.pak" type="data_package" lang="pt-BR" />
+    <output filename="ash_components_strings_pt-PT.pak" type="data_package" lang="pt-PT" />
+    <output filename="ash_components_strings_ro.pak" type="data_package" lang="ro" />
+    <output filename="ash_components_strings_ru.pak" type="data_package" lang="ru" />
+    <output filename="ash_components_strings_sk.pak" type="data_package" lang="sk" />
+    <output filename="ash_components_strings_sl.pak" type="data_package" lang="sl" />
+    <output filename="ash_components_strings_sr.pak" type="data_package" lang="sr" />
+    <output filename="ash_components_strings_sv.pak" type="data_package" lang="sv" />
+    <output filename="ash_components_strings_sw.pak" type="data_package" lang="sw" />
+    <output filename="ash_components_strings_ta.pak" type="data_package" lang="ta" />
+    <output filename="ash_components_strings_te.pak" type="data_package" lang="te" />
+    <output filename="ash_components_strings_th.pak" type="data_package" lang="th" />
+    <output filename="ash_components_strings_tr.pak" type="data_package" lang="tr" />
+    <output filename="ash_components_strings_uk.pak" type="data_package" lang="uk" />
+    <output filename="ash_components_strings_vi.pak" type="data_package" lang="vi" />
+    <output filename="ash_components_strings_zh-CN.pak" type="data_package" lang="zh-CN" />
+    <output filename="ash_components_strings_zh-TW.pak" type="data_package" lang="zh-TW" />
+  </outputs>
+  <translations>
+    <file path="strings/ash_components_strings_am.xtb" lang="am" />
+    <file path="strings/ash_components_strings_ar.xtb" lang="ar" />
+    <file path="strings/ash_components_strings_bg.xtb" lang="bg" />
+    <file path="strings/ash_components_strings_bn.xtb" lang="bn" />
+    <file path="strings/ash_components_strings_ca.xtb" lang="ca" />
+    <file path="strings/ash_components_strings_cs.xtb" lang="cs" />
+    <file path="strings/ash_components_strings_da.xtb" lang="da" />
+    <file path="strings/ash_components_strings_de.xtb" lang="de" />
+    <file path="strings/ash_components_strings_el.xtb" lang="el" />
+    <file path="strings/ash_components_strings_en-GB.xtb" lang="en-GB" />
+    <file path="strings/ash_components_strings_es.xtb" lang="es" />
+    <file path="strings/ash_components_strings_es-419.xtb" lang="es-419" />
+    <file path="strings/ash_components_strings_et.xtb" lang="et" />
+    <file path="strings/ash_components_strings_fa.xtb" lang="fa" />
+    <file path="strings/ash_components_strings_fi.xtb" lang="fi" />
+    <file path="strings/ash_components_strings_fil.xtb" lang="fil" />
+    <file path="strings/ash_components_strings_fr.xtb" lang="fr" />
+    <file path="strings/ash_components_strings_gu.xtb" lang="gu" />
+    <file path="strings/ash_components_strings_hi.xtb" lang="hi" />
+    <file path="strings/ash_components_strings_hr.xtb" lang="hr" />
+    <file path="strings/ash_components_strings_hu.xtb" lang="hu" />
+    <file path="strings/ash_components_strings_id.xtb" lang="id" />
+    <file path="strings/ash_components_strings_it.xtb" lang="it" />
+    <!-- The translation console uses 'iw' for Hebrew, but we use 'he'. -->
+    <file path="strings/ash_components_strings_iw.xtb" lang="he" />
+    <file path="strings/ash_components_strings_ja.xtb" lang="ja" />
+    <file path="strings/ash_components_strings_kn.xtb" lang="kn" />
+    <file path="strings/ash_components_strings_ko.xtb" lang="ko" />
+    <file path="strings/ash_components_strings_lt.xtb" lang="lt" />
+    <file path="strings/ash_components_strings_lv.xtb" lang="lv" />
+    <file path="strings/ash_components_strings_ml.xtb" lang="ml" />
+    <file path="strings/ash_components_strings_mr.xtb" lang="mr" />
+    <file path="strings/ash_components_strings_ms.xtb" lang="ms" />
+    <file path="strings/ash_components_strings_nl.xtb" lang="nl" />
+    <file path="strings/ash_components_strings_no.xtb" lang="no" />
+    <file path="strings/ash_components_strings_pl.xtb" lang="pl" />
+    <file path="strings/ash_components_strings_pt-BR.xtb" lang="pt-BR" />
+    <file path="strings/ash_components_strings_pt-PT.xtb" lang="pt-PT" />
+    <file path="strings/ash_components_strings_ro.xtb" lang="ro" />
+    <file path="strings/ash_components_strings_ru.xtb" lang="ru" />
+    <file path="strings/ash_components_strings_sk.xtb" lang="sk" />
+    <file path="strings/ash_components_strings_sl.xtb" lang="sl" />
+    <file path="strings/ash_components_strings_sr.xtb" lang="sr" />
+    <file path="strings/ash_components_strings_sv.xtb" lang="sv" />
+    <file path="strings/ash_components_strings_sw.xtb" lang="sw" />
+    <file path="strings/ash_components_strings_ta.xtb" lang="ta" />
+    <file path="strings/ash_components_strings_te.xtb" lang="te" />
+    <file path="strings/ash_components_strings_th.xtb" lang="th" />
+    <file path="strings/ash_components_strings_tr.xtb" lang="tr" />
+    <file path="strings/ash_components_strings_uk.xtb" lang="uk" />
+    <file path="strings/ash_components_strings_vi.xtb" lang="vi" />
+    <file path="strings/ash_components_strings_zh-CN.xtb" lang="zh-CN" />
+    <file path="strings/ash_components_strings_zh-TW.xtb" lang="zh-TW" />
+  </translations>
+  <release seq="1" allow_pseudo="false">
+    <messages fallback_to_english="true">
+
+    </messages>
+  </release>
+</grit>
diff --git a/ash/components/resources/BUILD.gn b/ash/components/resources/BUILD.gn
new file mode 100644
index 0000000..4d3fc29
--- /dev/null
+++ b/ash/components/resources/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/grit_rule.gni")
+
+grit("resources") {
+  source = "ash_components_resources.grd"
+  outputs = [
+    "grit/ash_components_resources.h",
+    "grit/ash_components_resources_map.cc",
+    "grit/ash_components_resources_map.h",
+    "ash_components_resources_100_percent.pak",
+    "ash_components_resources_200_percent.pak",
+  ]
+}
diff --git a/ash/components/resources/ash_components_resources.grd b/ash/components/resources/ash_components_resources.grd
new file mode 100644
index 0000000..cda8305f
--- /dev/null
+++ b/ash/components/resources/ash_components_resources.grd
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+  <outputs>
+    <output filename="grit/ash_components_resources.h" type="rc_header" context="default_100_percent">
+      <emit emit_type='prepend'></emit>
+    </output>
+    <output filename="grit/ash_components_resources_map.cc" type="resource_map_source" context="default_100_percent" />
+    <output filename="grit/ash_components_resources_map.h" type="resource_map_header" context="default_100_percent" />
+    <output filename="ash_components_resources_100_percent.pak" type="data_package" context="default_100_percent" />
+    <output filename="ash_components_resources_200_percent.pak" type="data_package" context="default_200_percent" />
+  </outputs>
+  <release seq="1">
+    <structures fallback_to_low_resolution="true">
+      <!-- Keyboard Shortcut Viewer icons. -->
+      <structure type="chrome_scaled_image" name="IDR_KEYBOARD_SHORTCUT_VIEWER_APP_ICON" file="shortcut_viewer/ksv_app_icon.png" />
+
+    </structures>
+  </release>
+</grit>
diff --git a/ash/components/resources/default_100_percent/shortcut_viewer/ksv_app_icon.png b/ash/components/resources/default_100_percent/shortcut_viewer/ksv_app_icon.png
new file mode 100644
index 0000000..03f8b4f2
--- /dev/null
+++ b/ash/components/resources/default_100_percent/shortcut_viewer/ksv_app_icon.png
Binary files differ
diff --git a/ash/components/resources/default_200_percent/shortcut_viewer/ksv_app_icon.png b/ash/components/resources/default_200_percent/shortcut_viewer/ksv_app_icon.png
new file mode 100644
index 0000000..f79cb03
--- /dev/null
+++ b/ash/components/resources/default_200_percent/shortcut_viewer/ksv_app_icon.png
Binary files differ
diff --git a/ash/components/strings/BUILD.gn b/ash/components/strings/BUILD.gn
new file mode 100644
index 0000000..1079117
--- /dev/null
+++ b/ash/components/strings/BUILD.gn
@@ -0,0 +1,66 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/grit_rule.gni")
+
+grit("strings") {
+  source = "../ash_components_strings.grd"
+  outputs = [
+    "grit/ash_components_strings.h",
+    "ash_components_strings_am.pak",
+    "ash_components_strings_ar.pak",
+    "ash_components_strings_bg.pak",
+    "ash_components_strings_bn.pak",
+    "ash_components_strings_ca.pak",
+    "ash_components_strings_cs.pak",
+    "ash_components_strings_da.pak",
+    "ash_components_strings_de.pak",
+    "ash_components_strings_el.pak",
+    "ash_components_strings_en-GB.pak",
+    "ash_components_strings_en-US.pak",
+    "ash_components_strings_es-419.pak",
+    "ash_components_strings_es.pak",
+    "ash_components_strings_et.pak",
+    "ash_components_strings_fake-bidi.pak",
+    "ash_components_strings_fa.pak",
+    "ash_components_strings_fil.pak",
+    "ash_components_strings_fi.pak",
+    "ash_components_strings_fr.pak",
+    "ash_components_strings_gu.pak",
+    "ash_components_strings_he.pak",
+    "ash_components_strings_hi.pak",
+    "ash_components_strings_hr.pak",
+    "ash_components_strings_hu.pak",
+    "ash_components_strings_id.pak",
+    "ash_components_strings_it.pak",
+    "ash_components_strings_ja.pak",
+    "ash_components_strings_kn.pak",
+    "ash_components_strings_ko.pak",
+    "ash_components_strings_lt.pak",
+    "ash_components_strings_lv.pak",
+    "ash_components_strings_ml.pak",
+    "ash_components_strings_mr.pak",
+    "ash_components_strings_ms.pak",
+    "ash_components_strings_nb.pak",
+    "ash_components_strings_nl.pak",
+    "ash_components_strings_pl.pak",
+    "ash_components_strings_pt-BR.pak",
+    "ash_components_strings_pt-PT.pak",
+    "ash_components_strings_ro.pak",
+    "ash_components_strings_ru.pak",
+    "ash_components_strings_sk.pak",
+    "ash_components_strings_sl.pak",
+    "ash_components_strings_sr.pak",
+    "ash_components_strings_sv.pak",
+    "ash_components_strings_sw.pak",
+    "ash_components_strings_ta.pak",
+    "ash_components_strings_te.pak",
+    "ash_components_strings_th.pak",
+    "ash_components_strings_tr.pak",
+    "ash_components_strings_uk.pak",
+    "ash_components_strings_vi.pak",
+    "ash_components_strings_zh-CN.pak",
+    "ash_components_strings_zh-TW.pak",
+  ]
+}
diff --git a/ash/components/strings/ash_components_strings_am.xtb b/ash/components/strings/ash_components_strings_am.xtb
new file mode 100644
index 0000000..92406ec2
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_am.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="am">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ar.xtb b/ash/components/strings/ash_components_strings_ar.xtb
new file mode 100644
index 0000000..198ea62
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ar.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ar">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_bg.xtb b/ash/components/strings/ash_components_strings_bg.xtb
new file mode 100644
index 0000000..6681995
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_bg.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="bg">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb
new file mode 100644
index 0000000..eca68d46
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="bn">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ca.xtb b/ash/components/strings/ash_components_strings_ca.xtb
new file mode 100644
index 0000000..71cdd772
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ca.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ca">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_cs.xtb b/ash/components/strings/ash_components_strings_cs.xtb
new file mode 100644
index 0000000..dc153a85
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_cs.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="cs">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_da.xtb b/ash/components/strings/ash_components_strings_da.xtb
new file mode 100644
index 0000000..1256832
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_da.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="da">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_de.xtb b/ash/components/strings/ash_components_strings_de.xtb
new file mode 100644
index 0000000..43dd909
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_de.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="de">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_el.xtb b/ash/components/strings/ash_components_strings_el.xtb
new file mode 100644
index 0000000..1b096642
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_el.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="el">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_en-GB.xtb b/ash/components/strings/ash_components_strings_en-GB.xtb
new file mode 100644
index 0000000..12c3fa00
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_en-GB.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="en-GB">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_es-419.xtb b/ash/components/strings/ash_components_strings_es-419.xtb
new file mode 100644
index 0000000..b652ed0
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_es-419.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="es-419">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_es.xtb b/ash/components/strings/ash_components_strings_es.xtb
new file mode 100644
index 0000000..4d4f400
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_es.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="es">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_et.xtb b/ash/components/strings/ash_components_strings_et.xtb
new file mode 100644
index 0000000..ab777bc5
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_et.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="et">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_fa.xtb b/ash/components/strings/ash_components_strings_fa.xtb
new file mode 100644
index 0000000..4cff15d
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_fa.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fa">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_fi.xtb b/ash/components/strings/ash_components_strings_fi.xtb
new file mode 100644
index 0000000..60ba9aa
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_fi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fi">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_fil.xtb b/ash/components/strings/ash_components_strings_fil.xtb
new file mode 100644
index 0000000..8f6a880
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_fil.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fil">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_fr.xtb b/ash/components/strings/ash_components_strings_fr.xtb
new file mode 100644
index 0000000..bf48975a
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_fr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="fr">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_gu.xtb b/ash/components/strings/ash_components_strings_gu.xtb
new file mode 100644
index 0000000..7969d06
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_gu.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="gu">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_hi.xtb b/ash/components/strings/ash_components_strings_hi.xtb
new file mode 100644
index 0000000..279503cd
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_hi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hi">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_hr.xtb b/ash/components/strings/ash_components_strings_hr.xtb
new file mode 100644
index 0000000..9ec62af
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_hr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hr">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_hu.xtb b/ash/components/strings/ash_components_strings_hu.xtb
new file mode 100644
index 0000000..bdc02eeac
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_hu.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="hu">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_id.xtb b/ash/components/strings/ash_components_strings_id.xtb
new file mode 100644
index 0000000..5f2882d0
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_id.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="id">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_it.xtb b/ash/components/strings/ash_components_strings_it.xtb
new file mode 100644
index 0000000..e7df702
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_it.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="it">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_iw.xtb b/ash/components/strings/ash_components_strings_iw.xtb
new file mode 100644
index 0000000..a29d4ad
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_iw.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="iw">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ja.xtb b/ash/components/strings/ash_components_strings_ja.xtb
new file mode 100644
index 0000000..d8a3543
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ja.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ja">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_kn.xtb b/ash/components/strings/ash_components_strings_kn.xtb
new file mode 100644
index 0000000..4ecb12ba
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_kn.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="kn">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ko.xtb b/ash/components/strings/ash_components_strings_ko.xtb
new file mode 100644
index 0000000..558b05b
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ko.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ko">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_lt.xtb b/ash/components/strings/ash_components_strings_lt.xtb
new file mode 100644
index 0000000..f20c0fa2
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_lt.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="lt">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_lv.xtb b/ash/components/strings/ash_components_strings_lv.xtb
new file mode 100644
index 0000000..6f3afbc
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_lv.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="lv">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ml.xtb b/ash/components/strings/ash_components_strings_ml.xtb
new file mode 100644
index 0000000..e01197e
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ml.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ml">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_mr.xtb b/ash/components/strings/ash_components_strings_mr.xtb
new file mode 100644
index 0000000..b137924e
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_mr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="mr">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ms.xtb b/ash/components/strings/ash_components_strings_ms.xtb
new file mode 100644
index 0000000..518685dd
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ms.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ms">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_nl.xtb b/ash/components/strings/ash_components_strings_nl.xtb
new file mode 100644
index 0000000..05ab957
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_nl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="nl">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_no.xtb b/ash/components/strings/ash_components_strings_no.xtb
new file mode 100644
index 0000000..ede4de30
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_no.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="no">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_pl.xtb b/ash/components/strings/ash_components_strings_pl.xtb
new file mode 100644
index 0000000..1bf17bd5
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_pl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pl">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_pt-BR.xtb b/ash/components/strings/ash_components_strings_pt-BR.xtb
new file mode 100644
index 0000000..de39dfa
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_pt-BR.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pt-BR">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_pt-PT.xtb b/ash/components/strings/ash_components_strings_pt-PT.xtb
new file mode 100644
index 0000000..0b98ee77
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_pt-PT.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="pt-PT">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ro.xtb b/ash/components/strings/ash_components_strings_ro.xtb
new file mode 100644
index 0000000..7129eb4
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ro.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ro">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ru.xtb b/ash/components/strings/ash_components_strings_ru.xtb
new file mode 100644
index 0000000..6dfaa442
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ru.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ru">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_sk.xtb b/ash/components/strings/ash_components_strings_sk.xtb
new file mode 100644
index 0000000..202e515a
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_sk.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sk">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_sl.xtb b/ash/components/strings/ash_components_strings_sl.xtb
new file mode 100644
index 0000000..31b5a1a
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_sl.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sl">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_sr.xtb b/ash/components/strings/ash_components_strings_sr.xtb
new file mode 100644
index 0000000..984d7192
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_sr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sr">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_sv.xtb b/ash/components/strings/ash_components_strings_sv.xtb
new file mode 100644
index 0000000..9a787b8
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_sv.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sv">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_sw.xtb b/ash/components/strings/ash_components_strings_sw.xtb
new file mode 100644
index 0000000..9aa61cb
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_sw.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="sw">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_ta.xtb b/ash/components/strings/ash_components_strings_ta.xtb
new file mode 100644
index 0000000..c983c75f2
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_ta.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="ta">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_te.xtb b/ash/components/strings/ash_components_strings_te.xtb
new file mode 100644
index 0000000..7affb9a
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_te.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="te">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_th.xtb b/ash/components/strings/ash_components_strings_th.xtb
new file mode 100644
index 0000000..dbe6a601
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_th.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="th">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_tr.xtb b/ash/components/strings/ash_components_strings_tr.xtb
new file mode 100644
index 0000000..d99480c0
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_tr.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="tr">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_uk.xtb b/ash/components/strings/ash_components_strings_uk.xtb
new file mode 100644
index 0000000..6e80099d
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_uk.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="uk">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_vi.xtb b/ash/components/strings/ash_components_strings_vi.xtb
new file mode 100644
index 0000000..8a42ab1
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_vi.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="vi">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_zh-CN.xtb b/ash/components/strings/ash_components_strings_zh-CN.xtb
new file mode 100644
index 0000000..c7d76e8
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_zh-CN.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="zh-CN">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/components/strings/ash_components_strings_zh-TW.xtb b/ash/components/strings/ash_components_strings_zh-TW.xtb
new file mode 100644
index 0000000..3e0c306
--- /dev/null
+++ b/ash/components/strings/ash_components_strings_zh-TW.xtb
@@ -0,0 +1,4 @@
+<?xml version="1.0" ?>
+<!DOCTYPE translationbundle>
+<translationbundle lang="zh-TW">
+</translationbundle>
\ No newline at end of file
diff --git a/ash/display/display_color_manager_chromeos_unittest.cc b/ash/display/display_color_manager_chromeos_unittest.cc
index 361ab795..9dba0e1 100644
--- a/ash/display/display_color_manager_chromeos_unittest.cc
+++ b/ash/display/display_color_manager_chromeos_unittest.cc
@@ -126,7 +126,7 @@
     quirks::QuirksManager::Initialize(
         std::unique_ptr<quirks::QuirksManager::Delegate>(
             new QuirksManagerDelegateTestImpl(color_path_)),
-        base::CreateTaskRunnerWithTraits({base::MayBlock()}), nullptr, nullptr);
+        nullptr, nullptr);
   }
 
   void TearDown() override {
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 5263f788..c918bdf 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -339,9 +339,15 @@
   opt_secondary_auth_ = nullptr;
   users_list_ = nullptr;
   rotation_actions_.clear();
+  users_.clear();
+
+  // If there are no users we have no UI to build.
+  if (users.empty()) {
+    LOG(ERROR) << "Empty user list received";
+    return;
+  }
 
   // Build user state list.
-  users_.clear();
   for (const mojom::LoginUserInfoPtr& user : users)
     users_.push_back(UserState{user->basic_user_info->account_id});
 
diff --git a/ash/public/cpp/mus_property_mirror_ash.cc b/ash/public/cpp/mus_property_mirror_ash.cc
index 58b06e7..90189f8 100644
--- a/ash/public/cpp/mus_property_mirror_ash.cc
+++ b/ash/public/cpp/mus_property_mirror_ash.cc
@@ -46,6 +46,12 @@
     root_window->SetProperty(kWindowPinTypeKey, value);
   } else if (key == aura::client::kAppIconKey) {
     MirrorOwnedProperty(window, root_window, aura::client::kAppIconKey);
+  } else if (key == kRestoreBoundsOverrideKey) {
+    MirrorOwnedProperty(window, root_window, kRestoreBoundsOverrideKey);
+  } else if (key == kRestoreWindowStateTypeOverrideKey) {
+    ash::mojom::WindowStateType value =
+        window->GetProperty(kRestoreWindowStateTypeOverrideKey);
+    root_window->SetProperty(kRestoreWindowStateTypeOverrideKey, value);
   } else if (key == kShelfIDKey) {
     MirrorOwnedProperty(window, root_window, kShelfIDKey);
   } else if (key == aura::client::kDrawAttentionKey) {
diff --git a/ash/public/cpp/window_properties.cc b/ash/public/cpp/window_properties.cc
index 2b82b7e..ef32a424 100644
--- a/ash/public/cpp/window_properties.cc
+++ b/ash/public/cpp/window_properties.cc
@@ -7,6 +7,7 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/interfaces/window_pin_type.mojom.h"
 #include "ash/public/interfaces/window_state_type.mojom.h"
+#include "ui/gfx/geometry/rect.h"
 
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT,
                                        ash::mojom::WindowPinType)
@@ -18,6 +19,12 @@
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kCanConsumeSystemKeysKey, false);
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kHideShelfWhenFullscreenKey, true);
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kPanelAttachedKey, true);
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect,
+                                   kRestoreBoundsOverrideKey,
+                                   nullptr);
+DEFINE_UI_CLASS_PROPERTY_KEY(mojom::WindowStateType,
+                             kRestoreWindowStateTypeOverrideKey,
+                             mojom::WindowStateType::DEFAULT);
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kShelfIDKey, nullptr);
 DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kShelfItemTypeKey, TYPE_UNDEFINED);
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kShowInOverviewKey, true);
diff --git a/ash/public/cpp/window_properties.h b/ash/public/cpp/window_properties.h
index 490dee1..e021810 100644
--- a/ash/public/cpp/window_properties.h
+++ b/ash/public/cpp/window_properties.h
@@ -17,6 +17,10 @@
 using WindowProperty = ui::ClassProperty<T>;
 }
 
+namespace gfx {
+class Rect;
+}
+
 namespace ash {
 
 namespace mojom {
@@ -41,6 +45,19 @@
 ASH_PUBLIC_EXPORT extern const aura::WindowProperty<bool>* const
     kPanelAttachedKey;
 
+// A property key which stores the bounds to restore a window to. These take
+// preference over the current bounds. This is used by e.g. the tablet mode
+// window manager.
+ASH_PUBLIC_EXPORT extern const aura::WindowProperty<gfx::Rect*>* const
+    kRestoreBoundsOverrideKey;
+
+// A property key which stores the window state to restore a window to. These
+// take preference over the current state if
+// |kRestoreWindowStateTypeOverrideKey| is set. This is used by e.g. the tablet
+// mode window manager.
+ASH_PUBLIC_EXPORT extern const aura::WindowProperty<
+    mojom::WindowStateType>* const kRestoreWindowStateTypeOverrideKey;
+
 // A property key to store the id for a window's shelf item.
 ASH_PUBLIC_EXPORT extern const aura::WindowProperty<std::string*>* const
     kShelfIDKey;
diff --git a/ash/public/interfaces/window_properties.mojom b/ash/public/interfaces/window_properties.mojom
index af14f4fcf..0c54b00 100644
--- a/ash/public/interfaces/window_properties.mojom
+++ b/ash/public/interfaces/window_properties.mojom
@@ -19,3 +19,16 @@
 // minimize overlap.
 const string kWindowPositionManaged_Property =
   "ash:window-position-managed";
+
+// A property key which stores the bounds to restore a window to. These take
+// preference over the current bounds. This is used by e.g. the tablet mode
+// window manager.
+const string kRestoreBoundsOverride_Property =
+  "ash:restore-bounds-override";
+
+// A property key which stores the window state to restore a window to. These
+// take preference over the current state if
+// |kRestoreWindowStateTypeOverrideKey| is set. This is used by e.g. the tablet
+// mode window manager.
+const string kRestoreWindowStateTypeOverride_Property  =
+  "ash:restore-window-state-type-override";
diff --git a/ash/resources/ash_resources.grd b/ash/resources/ash_resources.grd
index ed160c0..b0b2c0a 100644
--- a/ash/resources/ash_resources.grd
+++ b/ash/resources/ash_resources.grd
@@ -33,6 +33,9 @@
       <structure type="chrome_scaled_image" name="IDR_AVATAR_HOLDER" file="cros/avatar_holder.png" />
       <structure type="chrome_scaled_image" name="IDR_AVATAR_HOLDER_MASK" file="cros/avatar_holder_mask.png" />
 
+      <!-- Crostini terminal images -->
+      <structure type="chrome_scaled_image" name="IDR_LOGO_CROSTINI_TERMINAL" file="cros/crostini/logo_crostini_terminal.png" />
+
     </structures>
   </release>
 </grit>
diff --git a/ash/resources/default_100_percent/cros/crostini/logo_crostini_terminal.png b/ash/resources/default_100_percent/cros/crostini/logo_crostini_terminal.png
new file mode 100644
index 0000000..934bd33f
--- /dev/null
+++ b/ash/resources/default_100_percent/cros/crostini/logo_crostini_terminal.png
Binary files differ
diff --git a/ash/resources/default_200_percent/cros/crostini/logo_crostini_terminal.png b/ash/resources/default_200_percent/cros/crostini/logo_crostini_terminal.png
new file mode 100644
index 0000000..de541f3
--- /dev/null
+++ b/ash/resources/default_200_percent/cros/crostini/logo_crostini_terminal.png
Binary files differ
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 70c35e2..da97204 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -84,7 +84,7 @@
 <translation id="2844169650293029770">USB-C デバイス(左手前のポート)</translation>
 <translation id="2865888419503095837">ネットワーク情報</translation>
 <translation id="2872961005593481000">終了</translation>
-<translation id="2878884018241093801">最近のタスクはありません</translation>
+<translation id="2878884018241093801">最近使用されたアイテムはありません</translation>
 <translation id="2903844815300039659"><ph name="NAME" /> に接続されています(<ph name="STRENGTH" />)</translation>
 <translation id="2911940648265863620">画面を共有中です</translation>
 <translation id="2942516765047364088">シェルフの位置</translation>
diff --git a/ash/window_manager.cc b/ash/window_manager.cc
index c53262f..4daa25f 100644
--- a/ash/window_manager.cc
+++ b/ash/window_manager.cc
@@ -121,6 +121,13 @@
       aura::PropertyConverter::CreateAcceptAnyValueCallback());
   property_converter_->RegisterStringProperty(
       kShelfIDKey, ui::mojom::WindowManager::kShelfID_Property);
+  property_converter_->RegisterPrimitiveProperty(
+      kRestoreBoundsOverrideKey, ash::mojom::kRestoreBoundsOverride_Property,
+      aura::PropertyConverter::CreateAcceptAnyValueCallback());
+  property_converter_->RegisterPrimitiveProperty(
+      kRestoreWindowStateTypeOverrideKey,
+      ash::mojom::kRestoreWindowStateTypeOverride_Property,
+      base::BindRepeating(&ash::IsValidWindowStateType));
 }
 
 WindowManager::~WindowManager() {
diff --git a/ash/wm/client_controlled_state.cc b/ash/wm/client_controlled_state.cc
index ffa901e..a1c243a1 100644
--- a/ash/wm/client_controlled_state.cc
+++ b/ash/wm/client_controlled_state.cc
@@ -35,6 +35,8 @@
 
 void ClientControlledState::HandleTransitionEvents(WindowState* window_state,
                                                    const WMEvent* event) {
+  if (!delegate_)
+    return;
   bool pin_transition = window_state->IsTrustedPinned() ||
                         window_state->IsPinned() || event->IsPinEvent();
   // Pinned State transition is handled on server side.
@@ -117,6 +119,8 @@
 
 void ClientControlledState::HandleCompoundEvents(WindowState* window_state,
                                                  const WMEvent* event) {
+  if (!delegate_)
+    return;
   switch (event->type()) {
     case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION:
       if (window_state->IsFullscreen()) {
@@ -160,6 +164,8 @@
 
 void ClientControlledState::HandleBoundsEvents(WindowState* window_state,
                                                const WMEvent* event) {
+  if (!delegate_)
+    return;
   switch (event->type()) {
     case WM_EVENT_SET_BOUNDS: {
       const gfx::Rect& bounds =
@@ -191,12 +197,17 @@
   }
 }
 
+void ClientControlledState::OnWindowDestroying(WindowState* window_state) {
+  delegate_.reset();
+}
+
 bool ClientControlledState::EnterNextState(
     WindowState* window_state,
     mojom::WindowStateType next_state_type,
     BoundsChangeAnimationType animation_type) {
-  // Do nothing if  we're already in the same state.
-  if (state_type_ == next_state_type)
+  // Do nothing if  we're already in the same state, or delegate has already
+  // been deleted.
+  if (state_type_ == next_state_type || !delegate_)
     return false;
   bounds_change_animation_type_ = animation_type;
   mojom::WindowStateType previous_state_type = state_type_;
diff --git a/ash/wm/client_controlled_state.h b/ash/wm/client_controlled_state.h
index 9f83f31..6189a4d 100644
--- a/ash/wm/client_controlled_state.h
+++ b/ash/wm/client_controlled_state.h
@@ -74,6 +74,7 @@
                           const WMEvent* event) override;
   void HandleTransitionEvents(WindowState* window_state,
                               const WMEvent* event) override;
+  void OnWindowDestroying(WindowState* window_state) override;
 
   // Enters next state. This is used when the state moves from one to another
   // within the same desktop mode. Returns true if the state has changed, or
diff --git a/ash/wm/client_controlled_state_unittest.cc b/ash/wm/client_controlled_state_unittest.cc
index 9543860..47a67ef 100644
--- a/ash/wm/client_controlled_state_unittest.cc
+++ b/ash/wm/client_controlled_state_unittest.cc
@@ -30,6 +30,7 @@
 
   void HandleWindowStateRequest(WindowState* window_state,
                                 mojom::WindowStateType next_state) override {
+    EXPECT_FALSE(deleted_);
     old_state_ = window_state->GetStateType();
     new_state_ = next_state;
   }
@@ -58,10 +59,13 @@
     requested_bounds_.SetRect(0, 0, 0, 0);
   }
 
+  void mark_as_deleted() { deleted_ = true; }
+
  private:
   mojom::WindowStateType old_state_ = mojom::WindowStateType::DEFAULT;
   mojom::WindowStateType new_state_ = mojom::WindowStateType::DEFAULT;
   gfx::Rect requested_bounds_;
+  bool deleted_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(TestClientControlledStateDelegate);
 };
@@ -397,6 +401,18 @@
   EXPECT_TRUE(window_state_2->IsTrustedPinned());
 }
 
+TEST_F(ClientControlledStateTest, ClosePinned) {
+  EXPECT_FALSE(window_state()->IsPinned());
+  EXPECT_FALSE(GetScreenPinningController()->IsPinned());
+
+  const WMEvent trusted_pin_event(WM_EVENT_TRUSTED_PIN);
+  window_state()->OnWMEvent(&trusted_pin_event);
+  EXPECT_TRUE(window_state()->IsPinned());
+  EXPECT_TRUE(GetScreenPinningController()->IsPinned());
+  delegate()->mark_as_deleted();
+  widget()->CloseNow();
+}
+
 TEST_F(ClientControlledStateTest, MoveWindowToDisplay) {
   UpdateDisplay("500x500, 500x500");
 
diff --git a/ash/wm/overview/overview_utils.cc b/ash/wm/overview/overview_utils.cc
index 618f1c7..a16b3eb 100644
--- a/ash/wm/overview/overview_utils.cc
+++ b/ash/wm/overview/overview_utils.cc
@@ -5,13 +5,21 @@
 #include "ash/wm/overview/overview_utils.h"
 
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shell.h"
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/window_state.h"
 #include "base/command_line.h"
 #include "base/optional.h"
+#include "third_party/skia/include/pathops/SkPathOps.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/scoped_canvas.h"
+#include "ui/views/background.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+#include "ui/wm/core/window_animations.h"
 
 namespace ash {
 
@@ -22,6 +30,69 @@
 base::Optional<bool> g_enable_new_overview_animations = base::nullopt;
 base::Optional<bool> g_enable_new_overview_ui = base::nullopt;
 
+// BackgroundWith1PxBorder renders a solid background color, with a one pixel
+// border with rounded corners. This accounts for the scaling of the canvas, so
+// that the border is 1 pixel thick regardless of display scaling.
+class BackgroundWith1PxBorder : public views::Background {
+ public:
+  BackgroundWith1PxBorder(SkColor background,
+                          SkColor border_color,
+                          int border_thickness,
+                          int corner_radius)
+      : border_color_(border_color),
+        border_thickness_(border_thickness),
+        corner_radius_(corner_radius) {
+    SetNativeControlColor(background);
+  }
+
+  // views::Background:
+  void Paint(gfx::Canvas* canvas, views::View* view) const override {
+    gfx::RectF border_rect_f(view->GetContentsBounds());
+
+    gfx::ScopedCanvas scoped_canvas(canvas);
+    const float scale = canvas->UndoDeviceScaleFactor();
+    border_rect_f.Inset(border_thickness_, border_thickness_);
+    border_rect_f = gfx::ScaleRect(border_rect_f, scale);
+
+    SkPath path;
+    const SkScalar scaled_corner_radius =
+        SkIntToScalar(gfx::ToCeiledInt(corner_radius_ * scale));
+    path.addRoundRect(gfx::RectFToSkRect(border_rect_f), scaled_corner_radius,
+                      scaled_corner_radius);
+
+    cc::PaintFlags flags;
+    flags.setStyle(cc::PaintFlags::kStroke_Style);
+    flags.setStrokeWidth(1);
+    flags.setAntiAlias(true);
+
+    SkPath stroke_path;
+    flags.getFillPath(path, &stroke_path);
+
+    SkPath fill_path;
+    Op(path, stroke_path, kDifference_SkPathOp, &fill_path);
+    flags.setStyle(cc::PaintFlags::kFill_Style);
+    flags.setColor(get_color());
+    canvas->sk_canvas()->drawPath(fill_path, flags);
+
+    if (border_thickness_ > 0) {
+      flags.setColor(border_color_);
+      canvas->sk_canvas()->drawPath(stroke_path, flags);
+    }
+  }
+
+ private:
+  // Color for the one pixel border.
+  const SkColor border_color_;
+
+  // Thickness of border inset.
+  const int border_thickness_;
+
+  // Corner radius of the inside edge of the roundrect border stroke.
+  const int corner_radius_;
+
+  DISALLOW_COPY_AND_ASSIGN(BackgroundWith1PxBorder);
+};
+
 }  // namespace
 
 bool CanCoverAvailableWorkspace(aura::Window* window) {
@@ -60,4 +131,54 @@
   g_enable_new_overview_ui = base::nullopt;
 }
 
+std::unique_ptr<views::Widget> CreateBackgroundWidget(aura::Window* root_window,
+                                                      ui::LayerType layer_type,
+                                                      SkColor background_color,
+                                                      int border_thickness,
+                                                      int border_radius,
+                                                      SkColor border_color,
+                                                      float initial_opacity,
+                                                      aura::Window* parent,
+                                                      bool stack_on_top) {
+  std::unique_ptr<views::Widget> widget(new views::Widget());
+  views::Widget::InitParams params;
+  params.type = views::Widget::InitParams::TYPE_POPUP;
+  params.keep_on_top = false;
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+  params.layer_type = layer_type;
+  params.accept_events = false;
+  widget->set_focus_on_creation(false);
+  // Parenting in kShellWindowId_WallpaperContainer allows proper layering of
+  // the shield and selection widgets. Since that container is created with
+  // USE_LOCAL_COORDINATES BoundsInScreenBehavior local bounds in |root_window_|
+  // need to be provided.
+  params.parent =
+      parent ? parent
+             : root_window->GetChildById(kShellWindowId_WallpaperContainer);
+  widget->Init(params);
+  aura::Window* widget_window = widget->GetNativeWindow();
+  // Disable the "bounce in" animation when showing the window.
+  ::wm::SetWindowVisibilityAnimationTransition(widget_window,
+                                               ::wm::ANIMATE_NONE);
+  // The background widget should not activate the shelf when passing under it.
+  wm::GetWindowState(widget_window)->set_ignored_by_shelf(true);
+  if (params.layer_type == ui::LAYER_SOLID_COLOR) {
+    widget_window->layer()->SetColor(background_color);
+  } else {
+    views::View* content_view = new views::View();
+    content_view->SetBackground(std::make_unique<BackgroundWith1PxBorder>(
+        background_color, border_color, border_thickness, border_radius));
+    widget->SetContentsView(content_view);
+  }
+  if (stack_on_top) {
+    widget_window->parent()->StackChildAtTop(widget_window);
+  } else {
+    widget_window->parent()->StackChildAtBottom(widget_window);
+  }
+  widget->Show();
+  widget_window->layer()->SetOpacity(initial_opacity);
+  return widget;
+}
+
 }  // namespace ash
diff --git a/ash/wm/overview/overview_utils.h b/ash/wm/overview/overview_utils.h
index 13f633c..e329165 100644
--- a/ash/wm/overview/overview_utils.h
+++ b/ash/wm/overview/overview_utils.h
@@ -6,6 +6,16 @@
 #define ASH_WM_OVERVIEW_OVERVIEW_UTILS_H_
 
 #include "ash/ash_export.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/compositor/layer_type.h"
+
+namespace aura {
+class Window;
+}  // namespace aura
+
+namespace views {
+class Widget;
+}  // namespace views
 
 namespace aura {
 class Window;
@@ -31,6 +41,23 @@
 ASH_EXPORT void ResetCachedOverviewAnimationsValueForTesting();
 ASH_EXPORT void ResetCachedOverviewUiValueForTesting();
 
+// Creates and returns a background translucent widget parented in
+// |root_window|'s default container and having |background_color|.
+// When |border_thickness| is non-zero, a border is created having
+// |border_color|, otherwise |border_color| parameter is ignored.
+// The new background widget starts with |initial_opacity| and then fades in.
+// If |parent| is prvoided the return widget will be parented to that window,
+// otherwise its parent will be in kShellWindowId_WallpaperContainer of
+// |root_window|.
+std::unique_ptr<views::Widget> CreateBackgroundWidget(aura::Window* root_window,
+                                                      ui::LayerType layer_type,
+                                                      SkColor background_color,
+                                                      int border_thickness,
+                                                      int border_radius,
+                                                      SkColor border_color,
+                                                      float initial_opacity,
+                                                      aura::Window* parent,
+                                                      bool stack_on_top);
 }  // namespace ash
 
 #endif  // ASH_WM_OVERVIEW_OVERVIEW_UTILS_H_
diff --git a/ash/wm/overview/scoped_transform_overview_window.cc b/ash/wm/overview/scoped_transform_overview_window.cc
index 4c5d6ac..fdaff62 100644
--- a/ash/wm/overview/scoped_transform_overview_window.cc
+++ b/ash/wm/overview/scoped_transform_overview_window.cc
@@ -331,6 +331,8 @@
   if (IsNewOverviewUi()) {
     mask_.reset();
     selector_item_->SetShadowBounds(base::nullopt);
+    selector_item_->DisableBackdrop();
+
     if (window_->GetProperty(aura::client::kShowStateKey) !=
         ui::SHOW_STATE_MINIMIZED) {
       window_->layer()->SetMaskLayer(original_mask_layer_);
@@ -646,6 +648,8 @@
 void ScopedTransformOverviewWindow::OnImplicitAnimationsCompleted() {
   // Add the mask which gives the window selector items rounded corners, and add
   // the shadow around the window.
+  DCHECK(IsNewOverviewUi());
+
   ui::Layer* layer = minimized_widget_
                          ? minimized_widget_->GetContentsView()->layer()
                          : window_->layer();
@@ -657,6 +661,7 @@
   mask_->set_top_inset(GetTopInset());
   layer->SetMaskLayer(mask_->layer());
   selector_item_->SetShadowBounds(base::make_optional(GetTransformedBounds()));
+  selector_item_->EnableBackdropIfNeeded();
 }
 
 aura::Window*
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc
index f127c78..f6f4c33 100644
--- a/ash/wm/overview/window_grid.cc
+++ b/ash/wm/overview/window_grid.cc
@@ -29,32 +29,24 @@
 #include "ash/wm/overview/window_selector.h"
 #include "ash/wm/overview/window_selector_delegate.h"
 #include "ash/wm/overview/window_selector_item.h"
-#include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/window_state.h"
 #include "base/i18n/string_search.h"
 #include "base/strings/string_number_conversions.h"
 #include "third_party/skia/include/core/SkColor.h"
-#include "third_party/skia/include/pathops/SkPathOps.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/animation/tween.h"
-#include "ui/gfx/canvas.h"
 #include "ui/gfx/color_analysis.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/safe_integer_conversions.h"
 #include "ui/gfx/geometry/vector2d.h"
-#include "ui/gfx/scoped_canvas.h"
-#include "ui/views/background.h"
-#include "ui/views/border.h"
 #include "ui/views/layout/box_layout.h"
-#include "ui/views/painter.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
 #include "ui/wm/core/shadow.h"
-#include "ui/wm/core/window_animations.h"
 
 namespace ash {
 namespace {
@@ -118,69 +110,6 @@
 constexpr SkColor kNoItemsIndicatorTextColor = SK_ColorWHITE;
 constexpr float kNoItemsIndicatorBackgroundOpacity = 0.8f;
 
-// BackgroundWith1PxBorder renders a solid background color, with a one pixel
-// border with rounded corners. This accounts for the scaling of the canvas, so
-// that the border is 1 pixel thick regardless of display scaling.
-class BackgroundWith1PxBorder : public views::Background {
- public:
-  BackgroundWith1PxBorder(SkColor background,
-                          SkColor border_color,
-                          int border_thickness,
-                          int corner_radius)
-      : border_color_(border_color),
-        border_thickness_(border_thickness),
-        corner_radius_(corner_radius) {
-    SetNativeControlColor(background);
-  }
-
-  // views::Background:
-  void Paint(gfx::Canvas* canvas, views::View* view) const override {
-    gfx::RectF border_rect_f(view->GetContentsBounds());
-
-    gfx::ScopedCanvas scoped_canvas(canvas);
-    const float scale = canvas->UndoDeviceScaleFactor();
-    border_rect_f.Inset(border_thickness_, border_thickness_);
-    border_rect_f = gfx::ScaleRect(border_rect_f, scale);
-
-    SkPath path;
-    const SkScalar scaled_corner_radius =
-        SkFloatToScalar(corner_radius_ * scale + 0.5f);
-    path.addRoundRect(gfx::RectFToSkRect(border_rect_f), scaled_corner_radius,
-                      scaled_corner_radius);
-
-    cc::PaintFlags flags;
-    flags.setStyle(cc::PaintFlags::kStroke_Style);
-    flags.setStrokeWidth(1);
-    flags.setAntiAlias(true);
-
-    SkPath stroke_path;
-    flags.getFillPath(path, &stroke_path);
-
-    SkPath fill_path;
-    Op(path, stroke_path, kDifference_SkPathOp, &fill_path);
-    flags.setStyle(cc::PaintFlags::kFill_Style);
-    flags.setColor(get_color());
-    canvas->sk_canvas()->drawPath(fill_path, flags);
-
-    if (border_thickness_ > 0) {
-      flags.setColor(border_color_);
-      canvas->sk_canvas()->drawPath(stroke_path, flags);
-    }
-  }
-
- private:
-  // Color for the one pixel border.
-  SkColor border_color_;
-
-  // Thickness of border inset.
-  int border_thickness_;
-
-  // Corner radius of the inside edge of the roundrect border stroke.
-  int corner_radius_;
-
-  DISALLOW_COPY_AND_ASSIGN(BackgroundWith1PxBorder);
-};
-
 // Returns the vector for the fade in animation.
 gfx::Vector2d GetSlideVectorForFadeIn(WindowSelector::Direction direction,
                                       const gfx::Rect& bounds) {
@@ -198,54 +127,6 @@
   return vector;
 }
 
-// Creates and returns a background translucent widget parented in
-// |root_window|'s default container and having |background_color|.
-// When |border_thickness| is non-zero, a border is created having
-// |border_color|, otherwise |border_color| parameter is ignored.
-// The new background widget starts with |initial_opacity| and then fades in.
-views::Widget* CreateBackgroundWidget(aura::Window* root_window,
-                                      ui::LayerType layer_type,
-                                      SkColor background_color,
-                                      int border_thickness,
-                                      int border_radius,
-                                      SkColor border_color,
-                                      float initial_opacity) {
-  views::Widget* widget = new views::Widget;
-  views::Widget::InitParams params;
-  params.type = views::Widget::InitParams::TYPE_POPUP;
-  params.keep_on_top = false;
-  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
-  params.layer_type = layer_type;
-  params.accept_events = false;
-  widget->set_focus_on_creation(false);
-  // Parenting in kShellWindowId_WallpaperContainer allows proper layering of
-  // the shield and selection widgets. Since that container is created with
-  // USE_LOCAL_COORDINATES BoundsInScreenBehavior local bounds in |root_window_|
-  // need to be provided.
-  params.parent = root_window->GetChildById(kShellWindowId_WallpaperContainer);
-  widget->Init(params);
-  aura::Window* widget_window = widget->GetNativeWindow();
-  // Disable the "bounce in" animation when showing the window.
-  ::wm::SetWindowVisibilityAnimationTransition(widget_window,
-                                               ::wm::ANIMATE_NONE);
-  // The background widget should not activate the shelf when passing under it.
-  wm::GetWindowState(widget_window)->set_ignored_by_shelf(true);
-  if (params.layer_type == ui::LAYER_SOLID_COLOR) {
-    widget_window->layer()->SetColor(background_color);
-  } else {
-    views::View* content_view =
-        new RoundedRectView(border_radius, SK_ColorTRANSPARENT);
-    content_view->SetBackground(std::make_unique<BackgroundWith1PxBorder>(
-        background_color, border_color, border_thickness, border_radius));
-    widget->SetContentsView(content_view);
-  }
-  widget_window->parent()->StackChildAtTop(widget_window);
-  widget->Show();
-  widget_window->layer()->SetOpacity(initial_opacity);
-  return widget;
-}
-
 }  // namespace
 
 // ShieldView contains the background for overview mode. It also contains text
@@ -703,9 +584,9 @@
     window_selector_item->OnSelectorItemDragStarted(item);
 }
 
-void WindowGrid::OnSelectorItemDragEnded(WindowSelectorItem* item) {
+void WindowGrid::OnSelectorItemDragEnded() {
   for (auto& window_selector_item : window_list_)
-    window_selector_item->OnSelectorItemDragEnded(item);
+    window_selector_item->OnSelectorItemDragEnded();
 }
 
 void WindowGrid::OnWindowDestroying(aura::Window* window) {
@@ -836,10 +717,11 @@
                                                          dark_muted_color);
     }
   }
-  shield_widget_.reset(CreateBackgroundWidget(
+  shield_widget_ = CreateBackgroundWidget(
       root_window_, ui::LAYER_SOLID_COLOR,
       IsNewOverviewUi() ? SK_ColorTRANSPARENT : shield_color, 0, 0,
-      SK_ColorTRANSPARENT, initial_opacity));
+      SK_ColorTRANSPARENT, initial_opacity, /*parent=*/nullptr,
+      /*stack_on_top=*/true);
   aura::Window* widget_window = shield_widget_->GetNativeWindow();
   const gfx::Rect bounds = widget_window->parent()->bounds();
   widget_window->SetBounds(bounds);
@@ -865,14 +747,16 @@
 
 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) {
   if (IsNewOverviewUi()) {
-    selection_widget_.reset(CreateBackgroundWidget(
+    selection_widget_ = CreateBackgroundWidget(
         root_window_, ui::LAYER_TEXTURED, kWindowSelectionColor, 0,
-        kWindowSelectionRadius, SK_ColorTRANSPARENT, 0.f));
+        kWindowSelectionRadius, SK_ColorTRANSPARENT, 0.f, /*parent=*/nullptr,
+        /*stack_on_top=*/true);
   } else {
-    selection_widget_.reset(CreateBackgroundWidget(
+    selection_widget_ = CreateBackgroundWidget(
         root_window_, ui::LAYER_TEXTURED, kOldWindowSelectionColor,
         kWindowSelectionBorderThickness, kOldWindowSelectionRadius,
-        kWindowSelectionBorderColor, 0.f));
+        kWindowSelectionBorderColor, 0.f, /*parent=*/nullptr,
+        /*stack_on_top=*/true);
   }
   aura::Window* widget_window = selection_widget_->GetNativeWindow();
   gfx::Rect target_bounds = SelectedWindow()->target_bounds();
diff --git a/ash/wm/overview/window_grid.h b/ash/wm/overview/window_grid.h
index 9353960..dfb2519f 100644
--- a/ash/wm/overview/window_grid.h
+++ b/ash/wm/overview/window_grid.h
@@ -128,7 +128,7 @@
   // Called when any WindowSelectorItem on any WindowGrid has started/ended
   // being dragged.
   void OnSelectorItemDragStarted(WindowSelectorItem* item);
-  void OnSelectorItemDragEnded(WindowSelectorItem* item);
+  void OnSelectorItemDragEnded();
 
   // Returns true if the grid has no more windows.
   bool empty() const { return window_list_.empty(); }
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index 4c9c9a2..ede3545 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -578,7 +578,7 @@
     return;
 
   for (std::unique_ptr<WindowGrid>& grid : grid_list_)
-    grid->OnSelectorItemDragEnded(item);
+    grid->OnSelectorItemDragEnded();
 }
 
 void WindowSelector::ActivateDraggedWindow() {
diff --git a/ash/wm/overview/window_selector_item.cc b/ash/wm/overview/window_selector_item.cc
index 9d24bb3..de64b2b 100644
--- a/ash/wm/overview/window_selector_item.cc
+++ b/ash/wm/overview/window_selector_item.cc
@@ -26,7 +26,6 @@
 #include "ash/wm/splitview/split_view_constants.h"
 #include "ash/wm/splitview/split_view_utils.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
-#include "ash/wm/window_state.h"
 #include "base/auto_reset.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/string_util.h"
@@ -147,6 +146,10 @@
 
 constexpr int kShadowElevation = 16;
 
+// Values of the backdrop.
+constexpr int kBackdropRoundingDp = 4;
+constexpr SkColor kBackdropColor = SkColorSetARGBMacro(0x24, 0xFF, 0xFF, 0xFF);
+
 // Convenience method to fade in a Window with predefined animation settings.
 // Note: The fade in animation will occur after a delay where the delay is how
 // long the lay out animations take.
@@ -159,6 +162,15 @@
   window->layer()->SetOpacity(1.0f);
 }
 
+std::unique_ptr<views::Widget> CreateBackdropWidget(aura::Window* parent) {
+  auto widget = CreateBackgroundWidget(
+      /*root_window=*/nullptr, ui::LAYER_TEXTURED, kBackdropColor,
+      /*border_thickness=*/0, kBackdropRoundingDp, kBackdropColor,
+      /*initial_opacity=*/1.f, parent,
+      /*stack_on_top=*/false);
+  return widget;
+}
+
 // A Button that has a listener and listens to mouse / gesture events on the
 // visible part of an overview window. Note that the drag events are only
 // handled in maximized mode.
@@ -224,7 +236,7 @@
           listener()->HandleReleaseEvent(location);
           break;
         case ui::ET_GESTURE_TAP:
-          listener()->ActivateDraggedWindow();
+          listener()->ActivateDraggedWindow(location);
           break;
         case ui::ET_GESTURE_END:
           listener()->ResetDraggedWindowGesture();
@@ -500,6 +512,8 @@
 
   ShieldButton* listener_button() { return listener_button_; }
 
+  gfx::Rect backdrop_bounds() const { return backdrop_bounds_; }
+
   void SetCloseButtonVisibility(bool visible) {
     AnimateLayerOpacity(close_button_->layer(), visible);
   }
@@ -535,6 +549,8 @@
         std::max(label_size.height(), kSplitviewLabelPreferredHeightDp));
 
     const int visible_height = close_button_->GetPreferredSize().height();
+    backdrop_bounds_ = bounds;
+    backdrop_bounds_.Inset(0, visible_height, 0, 0);
 
     // Center the cannot snap label in the middle of the item, minus the title.
     gfx::Rect cannot_snap_bounds = GetLocalBounds();
@@ -611,6 +627,7 @@
   views::Label* cannot_snap_label_;
   RoundedRectView* cannot_snap_container_;
   views::ImageButton* close_button_;
+  gfx::Rect backdrop_bounds_;
 
   DISALLOW_COPY_AND_ASSIGN(CaptionContainerView);
 };
@@ -631,6 +648,10 @@
       window_grid_(window_grid) {
   CreateWindowLabel(window->GetTitle());
   GetWindow()->AddObserver(this);
+  if (GetWindowDimensionsType() !=
+      ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
+    backdrop_widget_ = CreateBackdropWidget(window->parent());
+  }
 }
 
 WindowSelectorItem::~WindowSelectorItem() {
@@ -714,6 +735,8 @@
   // SetItemBounds is called before UpdateHeaderLayout so the header can
   // properly use the updated windows bounds.
   UpdateHeaderLayout(HeaderFadeInMode::UPDATE, animation_type);
+
+  UpdateBackdropBounds();
 }
 
 void WindowSelectorItem::SetSelected(bool selected) {
@@ -768,7 +791,7 @@
     caption_container_view_->SetTitleLabelVisibility(false);
 }
 
-void WindowSelectorItem::OnSelectorItemDragEnded(WindowSelectorItem* item) {
+void WindowSelectorItem::OnSelectorItemDragEnded() {
   caption_container_view_->SetCloseButtonVisibility(true);
   caption_container_view_->SetTitleLabelVisibility(true);
 }
@@ -780,6 +803,43 @@
 
 void WindowSelectorItem::UpdateWindowDimensionsType() {
   transform_window_.UpdateWindowDimensionsType();
+  if (GetWindowDimensionsType() ==
+      ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
+    // Delete the backdrop widget, if it exists for normal windows.
+    if (backdrop_widget_)
+      backdrop_widget_.reset();
+  } else {
+    // Create the backdrop widget if needed.
+    if (!backdrop_widget_) {
+      backdrop_widget_ =
+          CreateBackdropWidget(transform_window_.window()->parent());
+    }
+  }
+}
+
+void WindowSelectorItem::EnableBackdropIfNeeded() {
+  if (GetWindowDimensionsType() ==
+      ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
+    DisableBackdrop();
+    return;
+  }
+
+  UpdateBackdropBounds();
+}
+
+void WindowSelectorItem::DisableBackdrop() {
+  if (backdrop_widget_)
+    backdrop_widget_->Hide();
+}
+
+void WindowSelectorItem::UpdateBackdropBounds() {
+  if (!backdrop_widget_)
+    return;
+
+  gfx::Rect backdrop_bounds = caption_container_view_->backdrop_bounds();
+  ::wm::ConvertRectToScreen(item_widget_->GetNativeWindow(), &backdrop_bounds);
+  backdrop_widget_->SetBounds(backdrop_bounds);
+  backdrop_widget_->Show();
 }
 
 void WindowSelectorItem::SetDimmed(bool dimmed) {
@@ -830,26 +890,53 @@
 
 void WindowSelectorItem::HandlePressEvent(
     const gfx::Point& location_in_screen) {
+  // Check the y position instead of using GetBoundsInScreen().Contains() so
+  // that it includes the image, close button and invisible margins.
+  tap_down_event_on_title_ = base::nullopt;
+  if (IsNewOverviewUi() &&
+      location_in_screen.y() < background_view_->GetBoundsInScreen().bottom()) {
+    tap_down_event_on_title_ = base::make_optional(location_in_screen);
+    return;
+  }
+
   StartDrag();
   window_selector_->InitiateDrag(this, location_in_screen);
 }
 
 void WindowSelectorItem::HandleReleaseEvent(
     const gfx::Point& location_in_screen) {
+  if (tap_down_event_on_title_) {
+    SelectWindowIfBelowDistanceThreshold(location_in_screen);
+    return;
+  }
+
   EndDrag();
   window_selector_->CompleteDrag(this, location_in_screen);
 }
 
 void WindowSelectorItem::HandleDragEvent(const gfx::Point& location_in_screen) {
+  if (tap_down_event_on_title_)
+    return;
+
   window_selector_->Drag(this, location_in_screen);
 }
 
-void WindowSelectorItem::ActivateDraggedWindow() {
+void WindowSelectorItem::ActivateDraggedWindow(
+    const gfx::Point& location_in_screen) {
+  if (tap_down_event_on_title_) {
+    SelectWindowIfBelowDistanceThreshold(location_in_screen);
+    return;
+  }
+
   DCHECK_EQ(this, window_selector_->window_drag_controller()->item());
   window_selector_->ActivateDraggedWindow();
 }
 
 void WindowSelectorItem::ResetDraggedWindowGesture() {
+  OnSelectorItemDragEnded();
+  if (tap_down_event_on_title_)
+    return;
+
   DCHECK_EQ(this, window_selector_->window_drag_controller()->item());
   window_selector_->ResetDraggedWindowGesture();
 }
@@ -1136,6 +1223,16 @@
   widget_ptr->SetOpacity(0.f);
 }
 
+void WindowSelectorItem::SelectWindowIfBelowDistanceThreshold(
+    const gfx::Point& event_location) {
+  DCHECK(tap_down_event_on_title_.has_value());
+
+  const gfx::Vector2d distance =
+      event_location - tap_down_event_on_title_.value();
+  if (distance.Length() < OverviewWindowDragController::kMinimumDragOffset)
+    window_selector_->SelectWindow(this);
+}
+
 gfx::SlideAnimation* WindowSelectorItem::GetBackgroundViewAnimation() {
   return background_view_ ? background_view_->animation() : nullptr;
 }
diff --git a/ash/wm/overview/window_selector_item.h b/ash/wm/overview/window_selector_item.h
index 6d4b3c3..003c2938 100644
--- a/ash/wm/overview/window_selector_item.h
+++ b/ash/wm/overview/window_selector_item.h
@@ -133,9 +133,9 @@
 
   // Called when a WindowSelectorItem on any grid is dragged. Hides the close
   // button when a drag is started, and reshows it when a drag is finished.
-  // Additional hides the title and window icon if |item| is this.
+  // Additionally hides the title and window icon if |item| is this.
   void OnSelectorItemDragStarted(WindowSelectorItem* item);
-  void OnSelectorItemDragEnded(WindowSelectorItem* item);
+  void OnSelectorItemDragEnded();
 
   ScopedTransformOverviewWindow::GridWindowFillMode GetWindowDimensionsType()
       const;
@@ -144,6 +144,12 @@
   // |window_|'s bounds change.
   void UpdateWindowDimensionsType();
 
+  // Enable or disable the backdrop. If the window is not letter or pillar
+  // boxed, nothing will happen.
+  void EnableBackdropIfNeeded();
+  void DisableBackdrop();
+  void UpdateBackdropBounds();
+
   // Sets if the item is dimmed in the overview. Changing the value will also
   // change the visibility of the transform windows.
   void SetDimmed(bool dimmed);
@@ -162,7 +168,7 @@
   void HandlePressEvent(const gfx::Point& location_in_screen);
   void HandleReleaseEvent(const gfx::Point& location_in_screen);
   void HandleDragEvent(const gfx::Point& location_in_screen);
-  void ActivateDraggedWindow();
+  void ActivateDraggedWindow(const gfx::Point& location_in_screen);
   void ResetDraggedWindowGesture();
 
   // Sets the bounds of the window shadow. If |bounds_in_screen| is nullopt,
@@ -235,6 +241,11 @@
   // Fades out a window caption when exiting overview mode.
   void FadeOut(std::unique_ptr<views::Widget> widget);
 
+  // Select this window if |event_location| is less than the drag threshold for
+  // clicks. This should only be called if the original event was on the title
+  // bar (|tap_down_event_on_title_| has a value).
+  void SelectWindowIfBelowDistanceThreshold(const gfx::Point& event_location);
+
   // Allows a test to directly set animation state.
   gfx::SlideAnimation* GetBackgroundViewAnimation();
 
@@ -271,11 +282,21 @@
   // when the item is selected.
   bool selected_;
 
+  // Has a value if last seen tap down event was on the title bar. Behavior of
+  // subsequent drags/tap up differ if the original event was on the overview
+  // title.
+  base::Optional<gfx::Point> tap_down_event_on_title_;
+
   // A widget that covers the |transform_window_|. The widget has
   // |caption_container_view_| as its contents view. The widget is backed by a
   // NOT_DRAWN layer since most of its surface is transparent.
   std::unique_ptr<views::Widget> item_widget_;
 
+  // A widget that is available if the window is letter or pillar boxed. It is
+  // stacked below |transform_window_|'s window. This is nullptr when the window
+  // is normal boxed.
+  std::unique_ptr<views::Widget> backdrop_widget_;
+
   // Container view that owns a Button view covering the |transform_window_|.
   // That button serves as an event shield to receive all events such as clicks
   // targeting the |transform_window_| or the overview header above the window.
@@ -326,6 +347,8 @@
   // rounded edges mask applied on entering overview window.
   std::unique_ptr<::wm::Shadow> shadow_;
 
+  bool event_on_title_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(WindowSelectorItem);
 };
 
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index b76f5ab..3a4900f 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -376,6 +376,10 @@
     return item->transform_window_.minimized_widget();
   }
 
+  views::Widget* backdrop_widget(WindowSelectorItem* item) {
+    return item->backdrop_widget_.get();
+  }
+
  private:
   aura::test::TestWindowDelegate delegate_;
   NonActivatableActivationDelegate non_activatable_activation_delegate_;
@@ -2482,6 +2486,49 @@
             index_of(widget1->GetNativeWindow(), parent));
 }
 
+// Verify that a windows which enter overview mode have a visible backdrop, if
+// the window is to be letter or pillar fitted.
+TEST_F(WindowSelectorTest, Backdrop) {
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kAshEnableNewOverviewUi);
+
+  // Add three windows which in overview mode will be considered wide, tall and
+  // normal. Window |wide|, with size (400, 160) will be resized to (200, 160)
+  // when the 400x200 is rotated to 200x400, and should be considered a normal
+  // overview window after display change.
+  UpdateDisplay("400x200");
+  std::unique_ptr<aura::Window> wide(CreateWindow(gfx::Rect(10, 10, 400, 160)));
+  std::unique_ptr<aura::Window> tall(CreateWindow(gfx::Rect(10, 10, 50, 200)));
+  std::unique_ptr<aura::Window> normal(
+      CreateWindow(gfx::Rect(10, 10, 200, 200)));
+
+  ToggleOverview();
+  RunAllPendingInMessageLoop();
+  WindowSelectorItem* wide_item = GetWindowItemForWindow(0, wide.get());
+  WindowSelectorItem* tall_item = GetWindowItemForWindow(0, tall.get());
+  WindowSelectorItem* normal_item = GetWindowItemForWindow(0, normal.get());
+
+  // Only very tall and very wide windows will have a backdrop.
+  EXPECT_TRUE(backdrop_widget(wide_item));
+  EXPECT_TRUE(backdrop_widget(tall_item));
+  EXPECT_FALSE(backdrop_widget(normal_item));
+
+  display::Screen* screen = display::Screen::GetScreen();
+  const display::Display& display = screen->GetPrimaryDisplay();
+  display_manager()->SetDisplayRotation(
+      display.id(), display::Display::ROTATE_90,
+      display::Display::RotationSource::ACTIVE);
+
+  // After rotation the former wide window will be a normal window and lose its
+  // backdrop.
+  EXPECT_FALSE(backdrop_widget(wide_item));
+  EXPECT_TRUE(backdrop_widget(tall_item));
+  EXPECT_FALSE(backdrop_widget(normal_item));
+
+  // Test that leaving overview mode cleans up properly.
+  ToggleOverview();
+}
+
 class SplitViewWindowSelectorTest : public WindowSelectorTest {
  public:
   SplitViewWindowSelectorTest() = default;
@@ -3569,4 +3616,48 @@
   EXPECT_FALSE(wm::IsActiveWindow(window1.get()));
 }
 
+// Verify that events that originate on the overview title bar will not allow
+// the item to be dragged or enter splitview, but will still be able to select a
+// window.
+TEST_F(SplitViewWindowSelectorTest, EventsOnOverviewTitleBar) {
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kAshEnableNewOverviewUi);
+
+  const gfx::Rect bounds(0, 0, 400, 400);
+  std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
+
+  ToggleOverview();
+
+  const int grid_index = 0;
+  WindowSelectorItem* selector_item1 =
+      GetWindowItemForWindow(grid_index, window1.get());
+  const gfx::Rect original_bounds = selector_item1->target_bounds();
+
+  // Click on the title of the selector item.
+  const gfx::Point point_on_title =
+      GetLabelView(selector_item1)->GetBoundsInScreen().CenterPoint();
+  GetEventGenerator().MoveMouseTo(point_on_title);
+  GetEventGenerator().PressLeftButton();
+
+  // Verify that dragging the mouse does change the selector item bounds.
+  GetEventGenerator().MoveMouseTo(0, 0);
+  EXPECT_EQ(original_bounds, selector_item1->target_bounds());
+
+  // We dragged into the left snap region. Verify that after releasing the
+  // mouse, we do not enter split view mode, which would be the case if we did
+  // not click on the title.
+  GetEventGenerator().ReleaseLeftButton();
+  EXPECT_FALSE(split_view_controller()->IsSplitViewModeActive());
+
+  // Verify that clicking on the title still exits overview and activates the
+  // associated window of the clicked selector item.
+  ASSERT_TRUE(window_selector());
+  GetEventGenerator().MoveMouseTo(point_on_title);
+  GetEventGenerator().PressLeftButton();
+  GetEventGenerator().ReleaseLeftButton();
+
+  EXPECT_FALSE(window_selector());
+  EXPECT_TRUE(wm::IsActiveWindow(window1.get()));
+}
+
 }  // namespace ash
diff --git a/ash/wm/screen_pinning_controller.cc b/ash/wm/screen_pinning_controller.cc
index cb008822..65d68191 100644
--- a/ash/wm/screen_pinning_controller.cc
+++ b/ash/wm/screen_pinning_controller.cc
@@ -232,10 +232,8 @@
 void ScreenPinningController::OnWillRemoveWindowFromPinnedContainer(
     aura::Window* window) {
   window->RemoveObserver(pinned_container_child_window_observer_.get());
-  if (window == pinned_window_) {
+  if (window == pinned_window_)
     wm::GetWindowState(pinned_window_)->Restore();
-    return;
-  }
 }
 
 void ScreenPinningController::OnPinnedContainerWindowStackingChanged(
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index 4a4d5dc..333eea17 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "ash/display/screen_orientation_controller_chromeos.h"
+#include "ash/public/cpp/app_types.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/screen_util.h"
@@ -26,8 +27,11 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/optional.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
+#include "ui/base/class_property.h"
+#include "ui/base/hit_test.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer.h"
 #include "ui/views/widget/widget.h"
@@ -65,6 +69,26 @@
   rect->SetRect(rect->y(), rect->x(), rect->height(), rect->width());
 }
 
+// Returns true if |window| is an Arc app window.
+bool IsArcAppWindow(aura::Window* window) {
+  return window && window->GetProperty(aura::client::kAppType) ==
+                       static_cast<int>(AppType::ARC_APP);
+}
+
+// Gets the window that is stacked above the other. The windows for comparison
+// must have the same parent if they are both not nullptr.
+aura::Window* GetWindowStackedAbove(aura::Window* window1,
+                                    aura::Window* window2) {
+  if (!window1 || !window2)
+    return window1 ? window1 : window2;
+
+  DCHECK(window1->parent() == window2->parent());
+  const aura::Window::Windows windows = window1->parent()->children();
+  auto window1_i = std::find(windows.begin(), windows.end(), window1);
+  auto window2_i = std::find(windows.begin(), windows.end(), window2);
+  return window1_i > window2_i ? window1 : window2;
+}
+
 }  // namespace
 
 SplitViewController::SplitViewController() {
@@ -285,6 +309,18 @@
   is_resizing_ = true;
   split_view_divider_->UpdateDividerBounds(is_resizing_);
   previous_event_location_ = location_in_screen;
+
+  smooth_resize_window_ = GetWindowForSmoothResize();
+  DCHECK(smooth_resize_window_);
+  wm::WindowState* window_state = wm::GetWindowState(smooth_resize_window_);
+  gfx::Point location_in_parent(location_in_screen);
+  ::wm::ConvertPointFromScreen(smooth_resize_window_->parent(),
+                               &location_in_parent);
+  int window_component = GetWindowComponentForResize(smooth_resize_window_);
+  window_state->CreateDragDetails(location_in_parent, window_component,
+                                  ::wm::WINDOW_MOVE_SOURCE_TOUCH);
+  window_state->OnDragStarted(window_component);
+
   base::RecordAction(base::UserMetricsAction("SplitView_ResizeWindows"));
 }
 
@@ -326,6 +362,16 @@
   MoveDividerToClosestFixedPosition();
   NotifyDividerPositionChanged();
 
+  if (smooth_resize_window_) {
+    // Update snapped window/windows bounds before sending OnCompleteDrag() for
+    // smoother resizing visual result.
+    UpdateSnappedWindowsAndDividerBounds();
+    wm::WindowState* window_state = wm::GetWindowState(smooth_resize_window_);
+    window_state->OnCompleteDrag(
+        GetEndDragLocationInScreen(smooth_resize_window_, location_in_screen));
+    window_state->DeleteDragDetails();
+  }
+
   // Need to update snapped windows bounds even if the split view mode may have
   // to exit. Otherwise it's possible for a snapped window stuck in the edge of
   // of the screen while overview mode is active.
@@ -398,6 +444,8 @@
 void SplitViewController::OnWindowDestroying(aura::Window* window) {
   DCHECK(IsSplitViewModeActive());
   DCHECK(window == left_window_ || window == right_window_);
+  if (smooth_resize_window_ == window)
+    smooth_resize_window_ = nullptr;
   OnSnappedWindowMinimizedOrDestroyed(window);
 }
 
@@ -900,6 +948,70 @@
     position_ratios->push_back(kTwoThirdPositionRatio);
 }
 
+aura::Window* SplitViewController::GetWindowForSmoothResize() {
+  DCHECK(IsSplitViewModeActive());
+
+  // If there is only one snapped window, return it.
+  if (!left_window_ || !right_window_)
+    return left_window_ ? left_window_ : right_window_;
+
+  // If both of two snapped windows are Arc app windows or both are not Arc app
+  // windows, return the one who is stacked above the other. Otherwise return
+  // the one who is an Arc app window.
+  if (IsArcAppWindow(left_window_) == IsArcAppWindow(right_window_))
+    return GetWindowStackedAbove(left_window_, right_window_);
+  else
+    return IsArcAppWindow(left_window_) ? left_window_ : right_window_;
+}
+
+int SplitViewController::GetWindowComponentForResize(aura::Window* window) {
+  if (window && (window == left_window_ || window == right_window_)) {
+    switch (screen_orientation_) {
+      case blink::kWebScreenOrientationLockLandscapePrimary:
+        return (window == left_window_) ? HTRIGHT : HTLEFT;
+      case blink::kWebScreenOrientationLockLandscapeSecondary:
+        return (window == left_window_) ? HTLEFT : HTRIGHT;
+      case blink::kWebScreenOrientationLockPortraitPrimary:
+        return (window == left_window_) ? HTTOP : HTBOTTOM;
+      case blink::kWebScreenOrientationLockPortraitSecondary:
+        return (window == left_window_) ? HTBOTTOM : HTTOP;
+      default:
+        return HTNOWHERE;
+    }
+  }
+  return HTNOWHERE;
+}
+
+gfx::Point SplitViewController::GetEndDragLocationInScreen(
+    aura::Window* window,
+    const gfx::Point& location_in_screen) {
+  gfx::Point end_location(location_in_screen);
+  if (!window || (window != left_window_ && window != right_window_))
+    return end_location;
+
+  const gfx::Rect bounds = (window == left_window_)
+                               ? GetSnappedWindowBoundsInScreen(window, LEFT)
+                               : GetSnappedWindowBoundsInScreen(window, RIGHT);
+  switch (screen_orientation_) {
+    case blink::kWebScreenOrientationLockLandscapePrimary:
+      end_location.set_x(window == left_window_ ? bounds.right() : bounds.x());
+      break;
+    case blink::kWebScreenOrientationLockLandscapeSecondary:
+      end_location.set_x(window == left_window_ ? bounds.x() : bounds.right());
+      break;
+    case blink::kWebScreenOrientationLockPortraitPrimary:
+      end_location.set_y(window == left_window_ ? bounds.y() : bounds.bottom());
+      break;
+    case blink::kWebScreenOrientationLockPortraitSecondary:
+      end_location.set_y(window == left_window_ ? bounds.bottom() : bounds.y());
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+  return end_location;
+}
+
 void SplitViewController::StartOverview() {
   if (!Shell::Get()->window_selector_controller()->IsSelecting())
     Shell::Get()->window_selector_controller()->ToggleOverview();
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h
index 84fc18d4..ec63025 100644
--- a/ash/wm/splitview/split_view_controller.h
+++ b/ash/wm/splitview/split_view_controller.h
@@ -233,6 +233,19 @@
   // on the minimum size of current snapped windows.
   void GetDividerOptionalPositionRatios(std::vector<float>* positionRatios);
 
+  // Selects the window that needs the quick/smooth resize. It's needed as
+  // Android only supports smooth resize for one app window at a time. If there
+  // are two snapped Arc app windows, always return the one who stacked above
+  // the other.
+  aura::Window* GetWindowForSmoothResize();
+  // Gets the expected window component depending on current screen orientation
+  // for resizing purpose.
+  int GetWindowComponentForResize(aura::Window* window);
+  // Gets the expected end drag position for |window| depending on current
+  // screen orientation and split divider position.
+  gfx::Point GetEndDragLocationInScreen(aura::Window* window,
+                                        const gfx::Point& location_in_screen);
+
   // Starts/Ends overview mode if the overview mode is inactive/active.
   void StartOverview();
   void EndOverview();
@@ -284,6 +297,13 @@
   // The time when splitview starts. Used for metric collection purpose.
   base::Time splitview_start_time_;
 
+  // The window that needs smooth resize. It's needed as Android only supports
+  // smooth resize for one app window at a time. It's always the snapped Arc app
+  // window if there is one. And if there are two snapped Arc app windows, it's
+  // the one who stacked above the other, see GetWindowForSmoothResize() for
+  // details.
+  aura::Window* smooth_resize_window_ = nullptr;
+
   base::ObserverList<Observer> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(SplitViewController);
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
index 17c4c02..57c5e37c 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -8,6 +8,8 @@
 
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/shelf_prefs.h"
+#include "ash/public/cpp/window_properties.h"
+#include "ash/public/cpp/window_state_type.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/session/session_controller.h"
@@ -549,8 +551,8 @@
   gfx::Rect* bounds = window->GetProperty(kRestoreBoundsOverrideKey);
   if (bounds) {
     gfx::Rect restore_bounds = *bounds;
-    ui::WindowShowState restore_state =
-        window->GetProperty(kRestoreShowStateOverrideKey);
+    ui::WindowShowState restore_state = ToWindowShowState(
+        window->GetProperty(kRestoreWindowStateTypeOverrideKey));
     return GetPlacementString(restore_bounds, restore_state);
   }
   return std::string();
diff --git a/ash/wm/tablet_mode/tablet_mode_window_state.cc b/ash/wm/tablet_mode/tablet_mode_window_state.cc
index 8fab2dd..b551310 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_state.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_state.cc
@@ -7,6 +7,8 @@
 #include <utility>
 
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/public/cpp/window_properties.h"
+#include "ash/public/cpp/window_state_type.h"
 #include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "ash/wm/screen_pinning_controller.h"
@@ -31,11 +33,12 @@
                                const gfx::Rect& bounds_override,
                                ui::WindowShowState window_state_override) {
   if (bounds_override.IsEmpty()) {
-    window->ClearProperty(kRestoreShowStateOverrideKey);
+    window->ClearProperty(kRestoreWindowStateTypeOverrideKey);
     window->ClearProperty(kRestoreBoundsOverrideKey);
     return;
   }
-  window->SetProperty(kRestoreShowStateOverrideKey, window_state_override);
+  window->SetProperty(kRestoreWindowStateTypeOverrideKey,
+                      ToWindowStateType(window_state_override));
   window->SetProperty(kRestoreBoundsOverrideKey,
                       new gfx::Rect(bounds_override));
 }
diff --git a/ash/wm/window_properties.cc b/ash/wm/window_properties.cc
index 653f7ee..2642753a 100644
--- a/ash/wm/window_properties.cc
+++ b/ash/wm/window_properties.cc
@@ -16,12 +16,6 @@
 
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kRenderTitleAreaProperty, false);
 
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect, kRestoreBoundsOverrideKey, NULL);
-
-DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState,
-                             kRestoreShowStateOverrideKey,
-                             ui::SHOW_STATE_DEFAULT);
-
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kSnapChildrenToPixelBoundary, false);
 
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kUsesScreenCoordinatesKey, false);
diff --git a/ash/wm/window_properties.h b/ash/wm/window_properties.h
index 2646a745..b88c7b1 100644
--- a/ash/wm/window_properties.h
+++ b/ash/wm/window_properties.h
@@ -9,10 +9,6 @@
 #include "ui/base/class_property.h"
 #include "ui/base/ui_base_types.h"
 
-namespace gfx {
-class Rect;
-}
-
 namespace aura {
 template <typename T>
 using WindowProperty = ui::ClassProperty<T>;
@@ -51,18 +47,6 @@
 ASH_EXPORT extern const aura::WindowProperty<bool>* const
     kRenderTitleAreaProperty;
 
-// A property key which stores the bounds to restore a window to. These take
-// preference over the current bounds/state. This is used by e.g. the always
-// tablet mode window manager.
-ASH_EXPORT extern const aura::WindowProperty<gfx::Rect*>* const
-    kRestoreBoundsOverrideKey;
-
-// A property key which stores the bounds to restore a window to. These take
-// preference over the current bounds/state if |kRestoreBoundsOverrideKey| is
-// set. This is used by e.g. the always tablet mode window manager.
-ASH_EXPORT extern const aura::WindowProperty<ui::WindowShowState>* const
-    kRestoreShowStateOverrideKey;
-
 // Containers with this property (true) are aligned with physical pixel
 // boundary.
 extern const aura::WindowProperty<bool>* const kSnapChildrenToPixelBoundary;
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc
index 4980783..14fa771 100644
--- a/ash/wm/window_state.cc
+++ b/ash/wm/window_state.cc
@@ -695,5 +695,11 @@
   MoveAllTransientChildrenToNewRoot(window);
 }
 
+void WindowState::OnWindowDestroying(aura::Window* window) {
+  DCHECK_EQ(window_, window);
+  current_state_->OnWindowDestroying(this);
+  delegate_.reset();
+}
+
 }  // namespace wm
 }  // namespace ash
diff --git a/ash/wm/window_state.h b/ash/wm/window_state.h
index 0c09884..041237ab 100644
--- a/ash/wm/window_state.h
+++ b/ash/wm/window_state.h
@@ -86,6 +86,9 @@
     // Note: This only gets called when the state object gets changed.
     virtual void DetachState(WindowState* window_state) = 0;
 
+    // Called when the window is being destroyed.
+    virtual void OnWindowDestroying(WindowState* window_state) {}
+
    private:
     DISALLOW_COPY_AND_ASSIGN(State);
   };
@@ -404,6 +407,7 @@
                                const void* key,
                                intptr_t old) override;
   void OnWindowAddedToRootWindow(aura::Window* window) override;
+  void OnWindowDestroying(aura::Window* window) override;
 
   // The owner of this window settings.
   aura::Window* window_;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 821464b3..8b8eb99e 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -720,6 +720,8 @@
     "rand_util_win.cc",
     "run_loop.cc",
     "run_loop.h",
+    "sampling_heap_profiler/sampling_heap_profiler.cc",
+    "sampling_heap_profiler/sampling_heap_profiler.h",
     "scoped_clear_errno.h",
     "scoped_generic.h",
     "scoped_native_library.cc",
@@ -904,8 +906,6 @@
     "threading/sequence_local_storage_slot.h",
     "threading/sequenced_task_runner_handle.cc",
     "threading/sequenced_task_runner_handle.h",
-    "threading/sequenced_worker_pool.cc",
-    "threading/sequenced_worker_pool.h",
     "threading/simple_thread.cc",
     "threading/simple_thread.h",
     "threading/thread.cc",
@@ -1156,19 +1156,20 @@
 
   deps = [
     "//base/allocator",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//base/third_party/dynamic_annotations",
     "//third_party/modp_b64",
   ]
 
   public_deps = [
-    ":anchor_functions_flags",
+    ":anchor_functions_buildflags",
     ":base_static",
     ":build_date",
-    ":cfi_flags",
-    ":debugging_flags",
-    ":protected_memory_flags",
-    ":synchronization_flags",
+    ":cfi_buildflags",
+    ":debugging_buildflags",
+    ":protected_memory_buildflags",
+    ":sampling_heap_profiler_buildflags",
+    ":synchronization_buildflags",
     "//base/numerics:base_numerics",
   ]
 
@@ -1448,7 +1449,7 @@
 
     deps += [
       "//base/trace_event/etw_manifest:chrome_events_win",
-      "//base/win:base_win_features",
+      "//base/win:base_win_buildflags",
     ]
 
     if (com_init_check_hook_disabled) {
@@ -1746,8 +1747,8 @@
 
 # Build flags for Control Flow Integrity
 # https://www.chromium.org/developers/testing/control-flow-integrity
-buildflag_header("cfi_flags") {
-  header = "cfi_flags.h"
+buildflag_header("cfi_buildflags") {
+  header = "cfi_buildflags.h"
 
   # buildflag entries added to this header must also must be manually added to
   # tools/gn/bootstrap/bootstrap.py
@@ -1760,8 +1761,8 @@
   ]
 }
 
-buildflag_header("debugging_flags") {
-  header = "debugging_flags.h"
+buildflag_header("debugging_buildflags") {
+  header = "debugging_buildflags.h"
   header_dir = "base/debug"
 
   # buildflag entries added to this header must also must be manually added to
@@ -1776,8 +1777,8 @@
 
 # Build flags for ProtectedMemory, temporary workaround for crbug.com/792777
 # TODO(vtsyrklevich): Remove once support for gold on Android/CrOs is dropped
-buildflag_header("protected_memory_flags") {
-  header = "protected_memory_flags.h"
+buildflag_header("protected_memory_buildflags") {
+  header = "protected_memory_buildflags.h"
   header_dir = "base/memory"
 
   # buildflag entries added to this header must also must be manually added to
@@ -1785,16 +1786,16 @@
   flags = [ "USE_LLD=$use_lld" ]
 }
 
-buildflag_header("synchronization_flags") {
-  header = "synchronization_flags.h"
+buildflag_header("synchronization_buildflags") {
+  header = "synchronization_buildflags.h"
   header_dir = "base/synchronization"
 
   flags =
       [ "ENABLE_MUTEX_PRIORITY_INHERITANCE=$enable_mutex_priority_inheritance" ]
 }
 
-buildflag_header("anchor_functions_flags") {
-  header = "anchor_functions_flags.h"
+buildflag_header("anchor_functions_buildflags") {
+  header = "anchor_functions_buildflags.h"
   header_dir = "base/android/library_loader"
   _supports_code_ordering = current_cpu == "arm"
 
@@ -1806,6 +1807,13 @@
   ]
 }
 
+buildflag_header("sampling_heap_profiler_buildflags") {
+  header = "sampling_heap_profiler_buildflags.h"
+  header_dir = "base/sampling_heap_profiler"
+
+  flags = [ "USE_PARTITION_ALLOC=$use_partition_alloc" ]
+}
+
 # This is the subset of files from base that should not be used with a dynamic
 # library. Note that this library cannot depend on base because base depends on
 # base_static.
@@ -1991,7 +1999,7 @@
     ]
     deps = [
       ":base",
-      "//base/win:base_win_features",
+      "//base/win:base_win_buildflags",
     ]
   }
 }
@@ -2314,7 +2322,6 @@
     "threading/sequence_local_storage_map_unittest.cc",
     "threading/sequence_local_storage_slot_unittest.cc",
     "threading/sequenced_task_runner_handle_unittest.cc",
-    "threading/sequenced_worker_pool_unittest.cc",
     "threading/simple_thread_unittest.cc",
     "threading/thread_checker_unittest.cc",
     "threading/thread_collision_warner_unittest.cc",
@@ -2394,7 +2401,7 @@
   deps = [
     ":base",
     ":i18n",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//base/test:native_library_test_utils",
     "//base/test:run_all_base_unittests",
     "//base/test:test_support",
@@ -2532,7 +2539,10 @@
   }
 
   if (use_allocator_shim) {
-    sources += [ "allocator/allocator_shim_unittest.cc" ]
+    sources += [
+      "allocator/allocator_shim_unittest.cc",
+      "sampling_heap_profiler/sampling_heap_profiler_unittest.cc",
+    ]
   }
 
   # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn
index fd24ea4..636a342 100644
--- a/base/allocator/BUILD.gn
+++ b/base/allocator/BUILD.gn
@@ -264,8 +264,8 @@
   }
 }  # use_allocator == "tcmalloc"
 
-buildflag_header("features") {
-  header = "features.h"
+buildflag_header("buildflags") {
+  header = "buildflags.h"
   flags = [ "USE_ALLOCATOR_SHIM=$use_allocator_shim" ]
 }
 
diff --git a/base/allocator/allocator_check.cc b/base/allocator/allocator_check.cc
index fba38d15..5fb86467 100644
--- a/base/allocator/allocator_check.cc
+++ b/base/allocator/allocator_check.cc
@@ -4,7 +4,7 @@
 
 #include "base/allocator/allocator_check.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "build/build_config.h"
 
 #if defined(OS_WIN)
diff --git a/base/allocator/allocator_interception_mac.mm b/base/allocator/allocator_interception_mac.mm
index 68fa5468b..5020287 100644
--- a/base/allocator/allocator_interception_mac.mm
+++ b/base/allocator/allocator_interception_mac.mm
@@ -27,7 +27,7 @@
 
 #include <new>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/allocator/malloc_zone_functions_mac.h"
 #include "base/bind.h"
 #include "base/logging.h"
diff --git a/base/allocator/allocator_shim_unittest.cc b/base/allocator/allocator_shim_unittest.cc
index 2bafed5..3be8f2ca 100644
--- a/base/allocator/allocator_shim_unittest.cc
+++ b/base/allocator/allocator_shim_unittest.cc
@@ -11,7 +11,7 @@
 #include <new>
 #include <vector>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/atomicops.h"
 #include "base/process/process_metrics.h"
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index c1ea4bd..37655285 100644
--- a/base/android/jni_android.cc
+++ b/base/android/jni_android.cc
@@ -12,7 +12,7 @@
 #include "base/android/build_info.h"
 #include "base/android/jni_string.h"
 #include "base/android/jni_utils.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/threading/thread_local.h"
diff --git a/base/android/jni_android.h b/base/android/jni_android.h
index abaccd1a..fba6113c 100644
--- a/base/android/jni_android.h
+++ b/base/android/jni_android.h
@@ -14,7 +14,7 @@
 #include "base/atomicops.h"
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/stack_trace.h"
 #include "base/macros.h"
 
diff --git a/base/android/library_loader/anchor_functions.h b/base/android/library_loader/anchor_functions.h
index c120faf8..9894583 100644
--- a/base/android/library_loader/anchor_functions.h
+++ b/base/android/library_loader/anchor_functions.h
@@ -6,7 +6,7 @@
 #define BASE_ANDROID_LIBRARY_LOADER_ANCHOR_FUNCTIONS_H_
 
 #include <cstdint>
-#include "base/android/library_loader/anchor_functions_flags.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
 
 #include "base/base_export.h"
 
diff --git a/base/android/library_loader/library_loader_hooks.cc b/base/android/library_loader/library_loader_hooks.cc
index 0b426185..e88c90d 100644
--- a/base/android/library_loader/library_loader_hooks.cc
+++ b/base/android/library_loader/library_loader_hooks.cc
@@ -5,7 +5,7 @@
 #include "base/android/library_loader/library_loader_hooks.h"
 
 #include "base/android/jni_string.h"
-#include "base/android/library_loader/anchor_functions_flags.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
 #include "base/android/library_loader/library_load_from_apk_status_codes.h"
 #include "base/android/library_loader/library_prefetcher.h"
 #include "base/at_exit.h"
diff --git a/base/android/library_loader/library_prefetcher.cc b/base/android/library_loader/library_prefetcher.cc
index 4b3c3d2..ac34c9c 100644
--- a/base/android/library_loader/library_prefetcher.cc
+++ b/base/android/library_loader/library_prefetcher.cc
@@ -160,9 +160,9 @@
 
 // static
 bool NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary() {
+  // Avoid forking with cygprofile instrumentation because the latter performs
+  // memory allocations.
 #if defined(CYGPROFILE_INSTRUMENTATION)
-  // Avoid forking with cygprofile instrumentation because the child process
-  // would create a dump as well.
   return false;
 #endif
 
diff --git a/base/android/library_loader/library_prefetcher.h b/base/android/library_loader/library_prefetcher.h
index 885ed604..d6ed7f11 100644
--- a/base/android/library_loader/library_prefetcher.h
+++ b/base/android/library_loader/library_prefetcher.h
@@ -9,7 +9,7 @@
 
 #include <stdint.h>
 
-#include "base/android/library_loader/anchor_functions_flags.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
 #include "base/base_export.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
diff --git a/base/android/library_loader/library_prefetcher_unittest.cc b/base/android/library_loader/library_prefetcher_unittest.cc
index 0c81220..ebb0d48f 100644
--- a/base/android/library_loader/library_prefetcher_unittest.cc
+++ b/base/android/library_loader/library_prefetcher_unittest.cc
@@ -7,7 +7,7 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/mman.h>
-#include "base/android/library_loader/anchor_functions_flags.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
 #include "base/memory/shared_memory.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/base/debug/profiler.cc b/base/debug/profiler.cc
index e225f684..7718162 100644
--- a/base/debug/profiler.cc
+++ b/base/debug/profiler.cc
@@ -6,7 +6,7 @@
 
 #include <string>
 
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/process/process_handle.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
diff --git a/base/debug/stack_trace.h b/base/debug/stack_trace.h
index fd3bcb3..81e6672 100644
--- a/base/debug/stack_trace.h
+++ b/base/debug/stack_trace.h
@@ -11,7 +11,7 @@
 #include <string>
 
 #include "base/base_export.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/macros.h"
 #include "build/build_config.h"
 
diff --git a/base/debug/stack_trace_posix.cc b/base/debug/stack_trace_posix.cc
index 1d341c0..f3f05da 100644
--- a/base/debug/stack_trace_posix.cc
+++ b/base/debug/stack_trace_posix.cc
@@ -39,7 +39,7 @@
 #include "base/debug/proc_maps_linux.h"
 #endif
 
-#include "base/cfi_flags.h"
+#include "base/cfi_buildflags.h"
 #include "base/debug/debugger.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
diff --git a/base/debug/stack_trace_unittest.cc b/base/debug/stack_trace_unittest.cc
index d150c37..959cd53 100644
--- a/base/debug/stack_trace_unittest.cc
+++ b/base/debug/stack_trace_unittest.cc
@@ -8,7 +8,7 @@
 #include <sstream>
 #include <string>
 
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/stack_trace.h"
 #include "base/logging.h"
 #include "base/process/kill.h"
diff --git a/base/debug/thread_heap_usage_tracker.cc b/base/debug/thread_heap_usage_tracker.cc
index a7a3942..6d00b1cc 100644
--- a/base/debug/thread_heap_usage_tracker.cc
+++ b/base/debug/thread_heap_usage_tracker.cc
@@ -11,7 +11,7 @@
 #include <type_traits>
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "base/threading/thread_local_storage.h"
diff --git a/base/debug/thread_heap_usage_tracker.h b/base/debug/thread_heap_usage_tracker.h
index 7d19b18..eb03b3f 100644
--- a/base/debug/thread_heap_usage_tracker.h
+++ b/base/debug/thread_heap_usage_tracker.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/base_export.h"
 #include "base/threading/thread_checker.h"
 
diff --git a/base/debug/thread_heap_usage_tracker_unittest.cc b/base/debug/thread_heap_usage_tracker_unittest.cc
index 56c66b2..b99576c 100644
--- a/base/debug/thread_heap_usage_tracker_unittest.cc
+++ b/base/debug/thread_heap_usage_tracker_unittest.cc
@@ -7,7 +7,7 @@
 #include <map>
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if defined(OS_MACOSX)
diff --git a/base/location.h b/base/location.h
index bf08682a..14fe2fa6b 100644
--- a/base/location.h
+++ b/base/location.h
@@ -11,7 +11,7 @@
 #include <string>
 
 #include "base/base_export.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/hash.h"
 
 namespace base {
diff --git a/base/memory/protected_memory.h b/base/memory/protected_memory.h
index 2bfb75f..edf5555 100644
--- a/base/memory/protected_memory.h
+++ b/base/memory/protected_memory.h
@@ -17,7 +17,7 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/protected_memory_flags.h"
+#include "base/memory/protected_memory_buildflags.h"
 #include "base/synchronization/lock.h"
 #include "build/build_config.h"
 
diff --git a/base/memory/protected_memory_cfi.h b/base/memory/protected_memory_cfi.h
index dad25d2..955a448 100644
--- a/base/memory/protected_memory_cfi.h
+++ b/base/memory/protected_memory_cfi.h
@@ -13,7 +13,7 @@
 
 #include <utility>
 
-#include "base/cfi_flags.h"
+#include "base/cfi_buildflags.h"
 #include "base/macros.h"
 #include "base/memory/protected_memory.h"
 #include "build/build_config.h"
diff --git a/base/memory/protected_memory_unittest.cc b/base/memory/protected_memory_unittest.cc
index 9b08bf69..b7daed3 100644
--- a/base/memory/protected_memory_unittest.cc
+++ b/base/memory/protected_memory_unittest.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/cfi_flags.h"
 #include "base/memory/protected_memory.h"
+#include "base/cfi_buildflags.h"
 #include "base/memory/protected_memory_cfi.h"
 #include "base/synchronization/lock.h"
 #include "base/test/gtest_util.h"
diff --git a/base/process/memory_linux.cc b/base/process/memory_linux.cc
index 7f760ab7..21b2069 100644
--- a/base/process/memory_linux.cc
+++ b/base/process/memory_linux.cc
@@ -9,7 +9,7 @@
 #include <new>
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
diff --git a/base/process/memory_mac.mm b/base/process/memory_mac.mm
index 7fca3d90..5b8cd13 100644
--- a/base/process/memory_mac.mm
+++ b/base/process/memory_mac.mm
@@ -6,7 +6,7 @@
 
 #include "base/allocator/allocator_interception_mac.h"
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "build/build_config.h"
 
 namespace base {
diff --git a/base/process/memory_unittest.cc b/base/process/memory_unittest.cc
index 3f6716b1..835cf7e 100644
--- a/base/process/memory_unittest.cc
+++ b/base/process/memory_unittest.cc
@@ -11,7 +11,7 @@
 #include <limits>
 
 #include "base/allocator/allocator_check.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/compiler_specific.h"
 #include "base/debug/alias.h"
 #include "base/memory/aligned_memory.h"
diff --git a/third_party/WebKit/common/sampling_heap_profiler/OWNERS b/base/sampling_heap_profiler/OWNERS
similarity index 100%
rename from third_party/WebKit/common/sampling_heap_profiler/OWNERS
rename to base/sampling_heap_profiler/OWNERS
diff --git a/third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc
similarity index 75%
rename from third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler.cc
rename to base/sampling_heap_profiler/sampling_heap_profiler.cc
index 782d446..edd957f 100644
--- a/third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler.cc
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -2,22 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 
 #include <algorithm>
 #include <cmath>
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/atomicops.h"
 #include "base/debug/alias.h"
 #include "base/debug/stack_trace.h"
-#include "base/memory/singleton.h"
+#include "base/no_destructor.h"
 #include "base/rand_util.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler_buildflags.h"
 #include "build/build_config.h"
 
-namespace blink {
+namespace base {
 
 using base::allocator::AllocatorDispatch;
 using base::subtle::Atomic32;
@@ -27,25 +28,44 @@
 
 // Control how many top frames to skip when recording call stack.
 // These frames correspond to the profiler own frames.
-const uint32_t kSkipBaseAllocatorFrames = 4;
-const uint32_t kSkipPartitionAllocFrames = 2;
+const uint32_t kSkipBaseAllocatorFrames = 2;
 
 const size_t kDefaultSamplingIntervalBytes = 128 * 1024;
 
+// Controls if sample intervals should not be randomized. Used for testing.
 bool g_deterministic;
+
+// A positive value if profiling is running, otherwise it's zero.
 Atomic32 g_running;
+
+// Number of lock-free safe (not causing rehashing) accesses to samples_ map
+// currently being performed.
 Atomic32 g_operations_in_flight;
+
+// Controls if new incoming lock-free accesses are allowed.
+// When set to true, threads should not enter lock-free paths.
 Atomic32 g_fast_path_is_closed;
+
+// Number of bytes left to form the sample being collected.
 AtomicWord g_bytes_left;
+
+// Current sample size to be accumulated. Basically:
+// <bytes accumulated toward sample> == g_current_interval - g_bytes_left
 AtomicWord g_current_interval;
+
+// Sampling interval parameter, the mean value for intervals between samples.
 AtomicWord g_sampling_interval = kDefaultSamplingIntervalBytes;
+
+// Last generated sample ordinal number.
 uint32_t g_last_sample_ordinal = 0;
+
 SamplingHeapProfiler* g_instance;
+void (*g_hooks_install_callback)();
+Atomic32 g_hooks_installed;
 
 void* AllocFn(const AllocatorDispatch* self, size_t size, void* context) {
   void* address = self->next->alloc_function(self->next, size, context);
-  SamplingHeapProfiler::MaybeRecordAlloc(address, size,
-                                         kSkipBaseAllocatorFrames);
+  SamplingHeapProfiler::RecordAlloc(address, size, kSkipBaseAllocatorFrames);
   return address;
 }
 
@@ -55,8 +75,8 @@
                              void* context) {
   void* address =
       self->next->alloc_zero_initialized_function(self->next, n, size, context);
-  SamplingHeapProfiler::MaybeRecordAlloc(address, n * size,
-                                         kSkipBaseAllocatorFrames);
+  SamplingHeapProfiler::RecordAlloc(address, n * size,
+                                    kSkipBaseAllocatorFrames);
   return address;
 }
 
@@ -66,8 +86,7 @@
                      void* context) {
   void* address =
       self->next->alloc_aligned_function(self->next, alignment, size, context);
-  SamplingHeapProfiler::MaybeRecordAlloc(address, size,
-                                         kSkipBaseAllocatorFrames);
+  SamplingHeapProfiler::RecordAlloc(address, size, kSkipBaseAllocatorFrames);
   return address;
 }
 
@@ -76,15 +95,14 @@
                 size_t size,
                 void* context) {
   // Note: size == 0 actually performs free.
-  SamplingHeapProfiler::MaybeRecordFree(address);
+  SamplingHeapProfiler::RecordFree(address);
   address = self->next->realloc_function(self->next, address, size, context);
-  SamplingHeapProfiler::MaybeRecordAlloc(address, size,
-                                         kSkipBaseAllocatorFrames);
+  SamplingHeapProfiler::RecordAlloc(address, size, kSkipBaseAllocatorFrames);
   return address;
 }
 
 void FreeFn(const AllocatorDispatch* self, void* address, void* context) {
-  SamplingHeapProfiler::MaybeRecordFree(address);
+  SamplingHeapProfiler::RecordFree(address);
   self->next->free_function(self->next, address, context);
 }
 
@@ -102,8 +120,8 @@
   unsigned num_allocated = self->next->batch_malloc_function(
       self->next, size, results, num_requested, context);
   for (unsigned i = 0; i < num_allocated; ++i) {
-    SamplingHeapProfiler::MaybeRecordAlloc(results[i], size,
-                                           kSkipBaseAllocatorFrames);
+    SamplingHeapProfiler::RecordAlloc(results[i], size,
+                                      kSkipBaseAllocatorFrames);
   }
   return num_allocated;
 }
@@ -113,7 +131,7 @@
                  unsigned num_to_be_freed,
                  void* context) {
   for (unsigned i = 0; i < num_to_be_freed; ++i)
-    SamplingHeapProfiler::MaybeRecordFree(to_be_freed[i]);
+    SamplingHeapProfiler::RecordFree(to_be_freed[i]);
   self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed,
                                   context);
 }
@@ -122,7 +140,7 @@
                         void* address,
                         size_t size,
                         void* context) {
-  SamplingHeapProfiler::MaybeRecordFree(address);
+  SamplingHeapProfiler::RecordFree(address);
   self->next->free_definite_size_function(self->next, address, size, context);
 }
 
@@ -137,15 +155,18 @@
                                           &FreeDefiniteSizeFn,
                                           nullptr};
 
+#if BUILDFLAG(USE_PARTITION_ALLOC) && !defined(OS_NACL)
+
 void PartitionAllocHook(void* address, size_t size, const char*) {
-  SamplingHeapProfiler::MaybeRecordAlloc(address, size,
-                                         kSkipPartitionAllocFrames);
+  SamplingHeapProfiler::RecordAlloc(address, size);
 }
 
 void PartitionFreeHook(void* address) {
-  SamplingHeapProfiler::MaybeRecordFree(address);
+  SamplingHeapProfiler::RecordFree(address);
 }
 
+#endif  // BUILDFLAG(USE_PARTITION_ALLOC) && !defined(OS_NACL)
+
 }  // namespace
 
 SamplingHeapProfiler::Sample::Sample(size_t size,
@@ -153,6 +174,10 @@
                                      uint32_t ordinal)
     : size(size), count(count), ordinal(ordinal) {}
 
+SamplingHeapProfiler::Sample::Sample(const Sample&) = default;
+
+SamplingHeapProfiler::Sample::~Sample() = default;
+
 SamplingHeapProfiler::SamplingHeapProfiler() {
   g_instance = this;
 }
@@ -173,12 +198,31 @@
       << "base::allocator shims are not available for memory sampling.";
 #endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
 
+#if BUILDFLAG(USE_PARTITION_ALLOC) && !defined(OS_NACL)
   base::PartitionAllocHooks::SetAllocationHook(&PartitionAllocHook);
   base::PartitionAllocHooks::SetFreeHook(&PartitionFreeHook);
+#endif  // BUILDFLAG(USE_PARTITION_ALLOC) && !defined(OS_NACL)
+
+  int32_t hooks_install_callback_has_been_set =
+      base::subtle::Acquire_CompareAndSwap(&g_hooks_installed, 0, 1);
+  if (hooks_install_callback_has_been_set)
+    g_hooks_install_callback();
 
   return true;
 }
 
+// static
+void SamplingHeapProfiler::SetHooksInstallCallback(
+    void (*hooks_install_callback)()) {
+  CHECK(!g_hooks_install_callback && hooks_install_callback);
+  g_hooks_install_callback = hooks_install_callback;
+
+  int32_t profiler_has_already_been_initialized =
+      base::subtle::Release_CompareAndSwap(&g_hooks_installed, 0, 1);
+  if (profiler_has_already_been_initialized)
+    g_hooks_install_callback();
+}
+
 uint32_t SamplingHeapProfiler::Start() {
   InstallAllocatorHooksOnce();
   size_t next_interval =
@@ -226,9 +270,9 @@
 }
 
 // static
-void SamplingHeapProfiler::MaybeRecordAlloc(void* address,
-                                            size_t size,
-                                            uint32_t skip_frames) {
+void SamplingHeapProfiler::RecordAlloc(void* address,
+                                       size_t size,
+                                       uint32_t skip_frames) {
   if (UNLIKELY(!base::subtle::NoBarrier_Load(&g_running)))
     return;
 
@@ -257,32 +301,36 @@
 
   // Put the next sampling interval to g_bytes_left, thus allowing threads to
   // start accumulating bytes towards the next sample.
-  // Simulateneously extract the current value (which is negative or zero)
+  // Simultaneously extract the current value (which is negative or zero)
   // and take it into account when calculating the number of bytes
   // accumulated for the current sample.
   accumulated -=
       base::subtle::NoBarrier_AtomicExchange(&g_bytes_left, next_interval);
 
-  g_instance->RecordAlloc(accumulated, size, address, kSkipBaseAllocatorFrames);
+  g_instance->DoRecordAlloc(accumulated, size, address,
+                            kSkipBaseAllocatorFrames);
 }
 
 void SamplingHeapProfiler::RecordStackTrace(Sample* sample,
                                             uint32_t skip_frames) {
+#if !defined(OS_NACL)
   // TODO(alph): Consider using debug::TraceStackFramePointers. It should be
   // somewhat faster than base::debug::StackTrace.
   base::debug::StackTrace trace;
   size_t count;
   void* const* addresses = const_cast<void* const*>(trace.Addresses(&count));
-  // Skip SamplingHeapProfiler frames.
+  const uint32_t kSkipProfilerOwnFrames = 2;
+  skip_frames += kSkipProfilerOwnFrames;
   sample->stack.insert(
       sample->stack.end(), &addresses[skip_frames],
       &addresses[std::max(count, static_cast<size_t>(skip_frames))]);
+#endif
 }
 
-void SamplingHeapProfiler::RecordAlloc(size_t total_allocated,
-                                       size_t size,
-                                       void* address,
-                                       uint32_t skip_frames) {
+void SamplingHeapProfiler::DoRecordAlloc(size_t total_allocated,
+                                         size_t size,
+                                         void* address,
+                                         uint32_t skip_frames) {
   // TODO(alph): It's better to use a recursive mutex and move the check
   // inside the critical section.
   if (entered_.Get())
@@ -302,35 +350,35 @@
     while (base::subtle::NoBarrier_Load(&g_operations_in_flight)) {
     }
   }
-  for (auto observer : observers_)
+  for (auto* observer : observers_)
     observer->SampleAdded(sample.ordinal, size, count);
   // TODO(alph): We can do better by keeping the fast-path open when
   // we know insert won't cause rehashing.
-  samples_.insert(std::make_pair(address, std::move(sample)));
+  samples_.emplace(address, std::move(sample));
   base::subtle::Release_Store(&g_fast_path_is_closed, 0);
 
   entered_.Set(false);
 }
 
 // static
-void SamplingHeapProfiler::MaybeRecordFree(void* address) {
+void SamplingHeapProfiler::RecordFree(void* address) {
   bool maybe_sampled = true;  // Pessimistically assume allocation was sampled.
   base::subtle::Barrier_AtomicIncrement(&g_operations_in_flight, 1);
   if (LIKELY(!base::subtle::NoBarrier_Load(&g_fast_path_is_closed)))
     maybe_sampled = g_instance->samples_.count(address);
   base::subtle::Barrier_AtomicIncrement(&g_operations_in_flight, -1);
   if (maybe_sampled)
-    g_instance->RecordFree(address);
+    g_instance->DoRecordFree(address);
 }
 
-void SamplingHeapProfiler::RecordFree(void* address) {
+void SamplingHeapProfiler::DoRecordFree(void* address) {
   if (entered_.Get())
     return;
   base::AutoLock lock(mutex_);
   entered_.Set(true);
   auto it = samples_.find(address);
   if (it != samples_.end()) {
-    for (auto observer : observers_)
+    for (auto* observer : observers_)
       observer->SampleRemoved(it->second.ordinal);
     samples_.erase(it);
   }
@@ -339,9 +387,8 @@
 
 // static
 SamplingHeapProfiler* SamplingHeapProfiler::GetInstance() {
-  return base::Singleton<
-      SamplingHeapProfiler,
-      base::LeakySingletonTraits<SamplingHeapProfiler>>::get();
+  static base::NoDestructor<SamplingHeapProfiler> instance;
+  return instance.get();
 }
 
 // static
@@ -378,4 +425,4 @@
   return samples;
 }
 
-}  // namespace blink
+}  // namespace base
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.h b/base/sampling_heap_profiler/sampling_heap_profiler.h
new file mode 100644
index 0000000..e1a66e20
--- /dev/null
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.h
@@ -0,0 +1,104 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
+#define BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
+
+#include <unordered_map>
+#include <vector>
+
+#include "base/base_export.h"
+#include "base/macros.h"
+#include "base/synchronization/lock.h"
+#include "base/threading/thread_local.h"
+
+namespace base {
+
+template <typename T>
+class NoDestructor;
+
+// The class implements sampling profiling of native memory heap.
+// It hooks on base::allocator and base::PartitionAlloc.
+// When started it selects and records allocation samples based on
+// the sampling_interval parameter.
+// The recorded samples can then be retrieved using GetSamples method.
+class BASE_EXPORT SamplingHeapProfiler {
+ public:
+  class BASE_EXPORT Sample {
+   public:
+    Sample(const Sample&);
+    ~Sample();
+
+    size_t size;
+    size_t count;
+    std::vector<void*> stack;
+
+   private:
+    friend class SamplingHeapProfiler;
+
+    Sample(size_t, size_t count, uint32_t ordinal);
+
+    uint32_t ordinal;
+  };
+
+  class SamplesObserver {
+   public:
+    virtual ~SamplesObserver() = default;
+    virtual void SampleAdded(uint32_t id, size_t size, size_t count) = 0;
+    virtual void SampleRemoved(uint32_t id) = 0;
+  };
+
+  // This is an entry point for plugging in an external allocator.
+  // Profiler will invoke the provided callback upon initialization.
+  // The callback should install hooks onto the corresponding memory allocator
+  // and make them invoke SamplingHeapProfiler::RecordAlloc and
+  // SamplingHeapProfiler::RecordFree upon corresponding allocation events.
+  //
+  // If the method is called after profiler is initialized, the callback
+  // is invoked right away.
+  static void SetHooksInstallCallback(void (*hooks_install_callback)());
+
+  void AddSamplesObserver(SamplesObserver*);
+  void RemoveSamplesObserver(SamplesObserver*);
+
+  uint32_t Start();
+  void Stop();
+  void SetSamplingInterval(size_t sampling_interval);
+  void SuppressRandomnessForTest();
+
+  std::vector<Sample> GetSamples(uint32_t profile_id);
+
+  static void RecordAlloc(void* address, size_t, uint32_t skip_frames = 0);
+  static void RecordFree(void* address);
+
+  static SamplingHeapProfiler* GetInstance();
+
+ private:
+  SamplingHeapProfiler();
+  ~SamplingHeapProfiler() = delete;
+
+  static void InstallAllocatorHooksOnce();
+  static bool InstallAllocatorHooks();
+  static size_t GetNextSampleInterval(size_t base_interval);
+
+  void DoRecordAlloc(size_t total_allocated,
+                     size_t allocation_size,
+                     void* address,
+                     uint32_t skip_frames);
+  void DoRecordFree(void* address);
+  void RecordStackTrace(Sample*, uint32_t skip_frames);
+
+  base::ThreadLocalBoolean entered_;
+  base::Lock mutex_;
+  std::unordered_map<void*, Sample> samples_;
+  std::vector<SamplesObserver*> observers_;
+
+  friend class base::NoDestructor<SamplingHeapProfiler>;
+
+  DISALLOW_COPY_AND_ASSIGN(SamplingHeapProfiler);
+};
+
+}  // namespace base
+
+#endif  // BASE_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
diff --git a/third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler_unittest.cc b/base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
similarity index 68%
rename from third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
rename to base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
index c756d06..9bb3f3a 100644
--- a/third_party/WebKit/common/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
+++ b/base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
@@ -2,24 +2,30 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 
-#include <memory>
+#include <stdlib.h>
 
+#include "base/allocator/allocator_shim.h"
 #include "base/debug/stack_trace.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace blink {
+namespace base {
 namespace {
 
-class SamplingHeapProfilerTest : public ::testing::Test {};
+class SamplingHeapProfilerTest : public ::testing::Test {
+#if defined(OS_MACOSX)
+  void SetUp() override { allocator::InitializeAllocatorShim(); }
+#endif
+};
 
 class SamplesCollector : public SamplingHeapProfiler::SamplesObserver {
  public:
   explicit SamplesCollector(size_t watch_size) : watch_size_(watch_size) {}
 
   void SampleAdded(uint32_t id, size_t size, size_t count) override {
-    if (size < watch_size_ || !count)
+    if (sample_added || size != watch_size_ || !count)
       return;
     sample_id_ = id;
     sample_added = true;
@@ -39,14 +45,14 @@
 };
 
 TEST_F(SamplingHeapProfilerTest, CollectSamples) {
-  SamplesCollector collector(sizeof(testing::Message));
+  SamplesCollector collector(10000);
   SamplingHeapProfiler* profiler = SamplingHeapProfiler::GetInstance();
   profiler->SuppressRandomnessForTest();
-  profiler->SetSamplingInterval(256);
+  profiler->SetSamplingInterval(1024);
   profiler->Start();
   profiler->AddSamplesObserver(&collector);
-  std::unique_ptr<testing::Message> data(new testing::Message());
-  data.reset();
+  void* volatile p = malloc(10000);
+  free(p);
   profiler->Stop();
   profiler->RemoveSamplesObserver(&collector);
   CHECK(collector.sample_added);
@@ -54,4 +60,4 @@
 }
 
 }  // namespace
-}  // namespace blink
+}  // namespace base
diff --git a/base/security_unittest.cc b/base/security_unittest.cc
index 8d29221..8515179b 100644
--- a/base/security_unittest.cc
+++ b/base/security_unittest.cc
@@ -14,7 +14,7 @@
 #include <limits>
 #include <memory>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/free_deleter.h"
diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc
index b3dd4fdc..daa774b 100644
--- a/base/sequence_checker_impl.cc
+++ b/base/sequence_checker_impl.cc
@@ -7,22 +7,13 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/sequence_token.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_checker_impl.h"
 
 namespace base {
 
 class SequenceCheckerImpl::Core {
  public:
-  Core()
-      : sequence_token_(SequenceToken::GetForCurrentThread()),
-        sequenced_worker_pool_token_(
-            SequencedWorkerPool::GetSequenceTokenForCurrentThread()) {
-    // SequencedWorkerPool doesn't use SequenceToken and code outside of
-    // SequencedWorkerPool doesn't set a SequencedWorkerPool token.
-    DCHECK(!sequence_token_.IsValid() ||
-           !sequenced_worker_pool_token_.IsValid());
-  }
+  Core() : sequence_token_(SequenceToken::GetForCurrentThread()) {}
 
   ~Core() = default;
 
@@ -30,11 +21,6 @@
     if (sequence_token_.IsValid())
       return sequence_token_ == SequenceToken::GetForCurrentThread();
 
-    if (sequenced_worker_pool_token_.IsValid()) {
-      return sequenced_worker_pool_token_.Equals(
-          SequencedWorkerPool::GetSequenceTokenForCurrentThread());
-    }
-
     // SequenceChecker behaves as a ThreadChecker when it is not bound to a
     // valid sequence token.
     return thread_checker_.CalledOnValidThread();
@@ -43,11 +29,7 @@
  private:
   SequenceToken sequence_token_;
 
-  // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of
-  // TaskScheduler. crbug.com/622400
-  SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_;
-
-  // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid.
+  // Used when |sequence_token_| is invalid.
   ThreadCheckerImpl thread_checker_;
 };
 
diff --git a/base/sequence_checker_unittest.cc b/base/sequence_checker_unittest.cc
index db3e450..a36c467 100644
--- a/base/sequence_checker_unittest.cc
+++ b/base/sequence_checker_unittest.cc
@@ -17,7 +17,6 @@
 #include "base/sequence_token.h"
 #include "base/single_thread_task_runner.h"
 #include "base/test/gtest_util.h"
-#include "base/test/sequenced_worker_pool_owner.h"
 #include "base/threading/simple_thread.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -25,8 +24,6 @@
 
 namespace {
 
-constexpr size_t kNumWorkerThreads = 3;
-
 // Runs a callback on another thread.
 class RunCallbackThread : public SimpleThread {
  public:
@@ -45,27 +42,6 @@
   DISALLOW_COPY_AND_ASSIGN(RunCallbackThread);
 };
 
-class SequenceCheckerTest : public testing::Test {
- protected:
-  SequenceCheckerTest() : pool_owner_(kNumWorkerThreads, "test") {}
-
-  void PostToSequencedWorkerPool(const Closure& callback,
-                                 const std::string& token_name) {
-    pool_owner_.pool()->PostNamedSequencedWorkerTask(token_name, FROM_HERE,
-                                                     callback);
-  }
-
-  void FlushSequencedWorkerPoolForTesting() {
-    pool_owner_.pool()->FlushForTesting();
-  }
-
- private:
-  MessageLoop message_loop_;  // Needed by SequencedWorkerPool to function.
-  SequencedWorkerPoolOwner pool_owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequenceCheckerTest);
-};
-
 void ExpectCalledOnValidSequence(SequenceCheckerImpl* sequence_checker) {
   ASSERT_TRUE(sequence_checker);
 
@@ -93,25 +69,25 @@
 
 }  // namespace
 
-TEST_F(SequenceCheckerTest, CallsAllowedOnSameThreadNoSequenceToken) {
+TEST(SequenceCheckerTest, CallsAllowedOnSameThreadNoSequenceToken) {
   SequenceCheckerImpl sequence_checker;
   EXPECT_TRUE(sequence_checker.CalledOnValidSequence());
 }
 
-TEST_F(SequenceCheckerTest, CallsAllowedOnSameThreadSameSequenceToken) {
+TEST(SequenceCheckerTest, CallsAllowedOnSameThreadSameSequenceToken) {
   ScopedSetSequenceTokenForCurrentThread
       scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
   SequenceCheckerImpl sequence_checker;
   EXPECT_TRUE(sequence_checker.CalledOnValidSequence());
 }
 
-TEST_F(SequenceCheckerTest, CallsDisallowedOnDifferentThreadsNoSequenceToken) {
+TEST(SequenceCheckerTest, CallsDisallowedOnDifferentThreadsNoSequenceToken) {
   SequenceCheckerImpl sequence_checker;
   RunCallbackThread thread(
       Bind(&ExpectNotCalledOnValidSequence, Unretained(&sequence_checker)));
 }
 
-TEST_F(SequenceCheckerTest, CallsAllowedOnDifferentThreadsSameSequenceToken) {
+TEST(SequenceCheckerTest, CallsAllowedOnDifferentThreadsSameSequenceToken) {
   const SequenceToken sequence_token(SequenceToken::Create());
 
   ScopedSetSequenceTokenForCurrentThread
@@ -123,7 +99,7 @@
                                 Unretained(&sequence_checker), sequence_token));
 }
 
-TEST_F(SequenceCheckerTest, CallsDisallowedOnSameThreadDifferentSequenceToken) {
+TEST(SequenceCheckerTest, CallsDisallowedOnSameThreadDifferentSequenceToken) {
   std::unique_ptr<SequenceCheckerImpl> sequence_checker;
 
   {
@@ -143,7 +119,7 @@
   EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
 }
 
-TEST_F(SequenceCheckerTest, DetachFromSequence) {
+TEST(SequenceCheckerTest, DetachFromSequence) {
   std::unique_ptr<SequenceCheckerImpl> sequence_checker;
 
   {
@@ -163,7 +139,7 @@
   }
 }
 
-TEST_F(SequenceCheckerTest, DetachFromSequenceNoSequenceToken) {
+TEST(SequenceCheckerTest, DetachFromSequenceNoSequenceToken) {
   SequenceCheckerImpl sequence_checker;
   sequence_checker.DetachFromSequence();
 
@@ -175,138 +151,32 @@
   EXPECT_FALSE(sequence_checker.CalledOnValidSequence());
 }
 
-TEST_F(SequenceCheckerTest, SequencedWorkerPool_SameSequenceTokenValid) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
+TEST(SequenceCheckerMacroTest, Macros) {
+  auto scope = std::make_unique<ScopedSetSequenceTokenForCurrentThread>(
+      SequenceToken::Create());
+  SEQUENCE_CHECKER(my_sequence_checker);
 
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  FlushSequencedWorkerPoolForTesting();
-}
+  // Don't expect a DCHECK death when a SequenceChecker is used on the right
+  // sequence.
+  DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
 
-TEST_F(SequenceCheckerTest, SequencedWorkerPool_DetachSequenceTokenValid) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
+  scope.reset();
 
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  FlushSequencedWorkerPoolForTesting();
-
-  sequence_checker.DetachFromSequence();
-
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "B");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "B");
-  FlushSequencedWorkerPoolForTesting();
-}
-
-TEST_F(SequenceCheckerTest,
-       SequencedWorkerPool_DifferentSequenceTokensInvalid) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
-
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  FlushSequencedWorkerPoolForTesting();
-
-  PostToSequencedWorkerPool(
-      Bind(&ExpectNotCalledOnValidSequence, Unretained(&sequence_checker)),
-      "B");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectNotCalledOnValidSequence, Unretained(&sequence_checker)),
-      "B");
-  FlushSequencedWorkerPoolForTesting();
-}
-
-TEST_F(SequenceCheckerTest,
-       SequencedWorkerPool_WorkerPoolAndSimpleThreadInvalid) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
-
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  FlushSequencedWorkerPoolForTesting();
-
-  EXPECT_FALSE(sequence_checker.CalledOnValidSequence());
-}
-
-TEST_F(SequenceCheckerTest,
-       SequencedWorkerPool_TwoDifferentWorkerPoolsInvalid) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
-
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  PostToSequencedWorkerPool(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)), "A");
-  FlushSequencedWorkerPoolForTesting();
-
-  SequencedWorkerPoolOwner second_pool_owner(kNumWorkerThreads, "test2");
-  second_pool_owner.pool()->PostNamedSequencedWorkerTask(
-      "A", FROM_HERE,
-      base::BindOnce(&ExpectNotCalledOnValidSequence,
-                     base::Unretained(&sequence_checker)));
-  second_pool_owner.pool()->FlushForTesting();
-}
-
-namespace {
-
-// This fixture is a helper for unit testing the sequence checker macros as it
-// is not possible to inline ExpectDeathOnOtherSequence() and
-// ExpectNoDeathOnOtherSequenceAfterDetach() as lambdas since binding
-// |Unretained(&my_sequence_checker)| wouldn't compile on non-dcheck builds
-// where it won't be defined.
-class SequenceCheckerMacroTest : public SequenceCheckerTest {
- public:
-  SequenceCheckerMacroTest() = default;
-
-  void ExpectDeathOnOtherSequence() {
 #if DCHECK_IS_ON()
-    EXPECT_DCHECK_DEATH({
-      DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_) << "Error message.";
-    });
+  // Expect DCHECK death when used on a different sequence.
+  EXPECT_DCHECK_DEATH({
+    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
+  });
 #else
     // Happily no-ops on non-dcheck builds.
-    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_) << "Error message.";
+    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
 #endif
-  }
 
-  void ExpectNoDeathOnOtherSequenceAfterDetach() {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_) << "Error message.";
-  }
+  DETACH_FROM_SEQUENCE(my_sequence_checker);
 
- protected:
-  SEQUENCE_CHECKER(my_sequence_checker_);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SequenceCheckerMacroTest);
-};
-
-}  // namespace
-
-TEST_F(SequenceCheckerMacroTest, Macros) {
-  PostToSequencedWorkerPool(
-      Bind(&SequenceCheckerMacroTest::ExpectDeathOnOtherSequence,
-           Unretained(this)),
-      "A");
-  FlushSequencedWorkerPoolForTesting();
-
-  DETACH_FROM_SEQUENCE(my_sequence_checker_);
-
-  PostToSequencedWorkerPool(
-      Bind(&SequenceCheckerMacroTest::ExpectNoDeathOnOtherSequenceAfterDetach,
-           Unretained(this)),
-      "A");
-  FlushSequencedWorkerPoolForTesting();
+  // Don't expect a DCHECK death when a SequenceChecker is used for the first
+  // time after having been detached.
+  DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
 }
 
 }  // namespace base
diff --git a/base/synchronization/lock_impl_posix.cc b/base/synchronization/lock_impl_posix.cc
index 0895691..540c940f 100644
--- a/base/synchronization/lock_impl_posix.cc
+++ b/base/synchronization/lock_impl_posix.cc
@@ -8,7 +8,7 @@
 
 #include "base/debug/activity_tracker.h"
 #include "base/synchronization/lock.h"
-#include "base/synchronization/synchronization_flags.h"
+#include "base/synchronization/synchronization_buildflags.h"
 #include "build/build_config.h"
 
 namespace base {
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc
index fb10e39..e620c35 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.cc
+++ b/base/task_scheduler/scheduler_worker_pool_impl.cc
@@ -12,6 +12,7 @@
 #include "base/atomicops.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/compiler_specific.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
@@ -109,7 +110,7 @@
  private:
   // Returns true if |worker| is allowed to cleanup and remove itself from the
   // pool. Called from GetWork() when no work is available.
-  bool CanCleanup(SchedulerWorker* worker);
+  bool CanCleanupLockRequired(SchedulerWorker* worker);
 
   // Calls cleanup on |worker| and removes it from the pool.
   void CleanupLockRequired(SchedulerWorker* worker);
@@ -294,13 +295,15 @@
 #if DCHECK_IS_ON()
   join_for_testing_started_.Set();
 #endif
-  DCHECK(!CanWorkerCleanupForTesting() || suggested_reclaim_time_.is_max())
-      << "Workers can cleanup during join.";
 
   decltype(workers_) workers_copy;
   {
     AutoSchedulerLock auto_lock(lock_);
 
+    DCHECK(!CanWorkerCleanupForTestingLockRequired() ||
+           suggested_reclaim_time_.is_max())
+        << "Workers can cleanup during join.";
+
     // Make a copy of the SchedulerWorkers so that we can call
     // SchedulerWorker::JoinForTesting() without holding |lock_| since
     // SchedulerWorkers may need to access |workers_|.
@@ -319,7 +322,8 @@
 }
 
 void SchedulerWorkerPoolImpl::DisallowWorkerCleanupForTesting() {
-  worker_cleanup_disallowed_.Set();
+  AutoSchedulerLock auto_lock(lock_);
+  worker_cleanup_disallowed_for_testing_ = true;
 }
 
 size_t SchedulerWorkerPoolImpl::NumberOfWorkersForTesting() {
@@ -398,7 +402,7 @@
     DCHECK_EQ(is_on_idle_workers_stack_,
               outer_->idle_workers_stack_.Contains(worker));
     if (is_on_idle_workers_stack_) {
-      if (CanCleanup(worker))
+      if (CanCleanupLockRequired(worker))
         CleanupLockRequired(worker);
 
       // Since we got here from timing out from the WaitableEvent rather than
@@ -485,10 +489,10 @@
   return outer_->suggested_reclaim_time_;
 }
 
-bool SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::CanCleanup(
-    SchedulerWorker* worker) {
+bool SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
+    CanCleanupLockRequired(SchedulerWorker* worker) {
   return worker != outer_->PeekAtIdleWorkersStackLockRequired() &&
-         outer_->CanWorkerCleanupForTesting();
+         LIKELY(outer_->CanWorkerCleanupForTestingLockRequired());
 }
 
 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::CleanupLockRequired(
@@ -621,43 +625,51 @@
 }
 
 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::MayBlockEntered() {
-  AutoSchedulerLock auto_lock(outer_->lock_);
+  {
+    AutoSchedulerLock auto_lock(outer_->lock_);
 
-  DCHECK(!incremented_worker_capacity_since_blocked_);
-  DCHECK(may_block_start_time_.is_null());
-  may_block_start_time_ = TimeTicks::Now();
-  ++outer_->num_pending_may_block_workers_;
-
-  if (!outer_->polling_worker_capacity_ &&
-      outer_->ShouldPeriodicallyAdjustWorkerCapacityLockRequired()) {
-    outer_->PostAdjustWorkerCapacityTaskLockRequired();
+    DCHECK(!incremented_worker_capacity_since_blocked_);
+    DCHECK(may_block_start_time_.is_null());
+    may_block_start_time_ = TimeTicks::Now();
+    ++outer_->num_pending_may_block_workers_;
   }
+  outer_->PostAdjustWorkerCapacityTaskIfNeeded();
 }
 
 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::WillBlockEntered() {
-  std::unique_ptr<PriorityQueue::Transaction> shared_transaction(
-      outer_->shared_priority_queue_.BeginTransaction());
-  AutoSchedulerLock auto_lock(outer_->lock_);
+  bool wake_up_allowed = false;
+  {
+    std::unique_ptr<PriorityQueue::Transaction> shared_transaction(
+        outer_->shared_priority_queue_.BeginTransaction());
+    AutoSchedulerLock auto_lock(outer_->lock_);
 
-  DCHECK(!incremented_worker_capacity_since_blocked_);
-  DCHECK(may_block_start_time_.is_null());
-  incremented_worker_capacity_since_blocked_ = true;
-  outer_->IncrementWorkerCapacityLockRequired();
+    DCHECK(!incremented_worker_capacity_since_blocked_);
+    DCHECK(may_block_start_time_.is_null());
+    incremented_worker_capacity_since_blocked_ = true;
+    outer_->IncrementWorkerCapacityLockRequired();
 
-  // If the number of workers was less than the old worker capacity, PostTask
-  // would've handled creating extra workers during WakeUpOneWorker. Therefore,
-  // we don't need to do anything here.
-  if (outer_->workers_.size() < outer_->worker_capacity_ - 1)
-    return;
+    // If the number of workers was less than the old worker capacity, PostTask
+    // would've handled creating extra workers during WakeUpOneWorker.
+    // Therefore, we don't need to do anything here.
+    if (outer_->workers_.size() < outer_->worker_capacity_ - 1)
+      return;
 
-  if (shared_transaction->IsEmpty()) {
-    outer_->MaintainAtLeastOneIdleWorkerLockRequired();
-  } else {
-    // TODO(crbug.com/757897): We may create extra workers in this case:
-    // |workers.size()| was equal to the old |worker_capacity_|, we had multiple
-    // ScopedBlockingCalls in parallel and we had work on the PQ.
-    outer_->WakeUpOneWorkerLockRequired();
+    if (shared_transaction->IsEmpty()) {
+      outer_->MaintainAtLeastOneIdleWorkerLockRequired();
+    } else {
+      // TODO(crbug.com/757897): We may create extra workers in this case:
+      // |workers.size()| was equal to the old |worker_capacity_|, we had
+      // multiple ScopedBlockingCalls in parallel and we had work on the PQ.
+      wake_up_allowed = outer_->WakeUpOneWorkerLockRequired();
+      // |wake_up_allowed| is true when the pool is started, and a WILL_BLOCK
+      // scope cannot be entered before the pool starts.
+      DCHECK(wake_up_allowed);
+    }
   }
+  // TODO(crbug.com/813857): This can be better handled in the PostTask()
+  // codepath. We really only should do this if there are tasks pending.
+  if (wake_up_allowed)
+    outer_->PostAdjustWorkerCapacityTaskIfNeeded();
 }
 
 bool SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
@@ -687,12 +699,12 @@
     idle_workers_stack_cv_for_testing_->Wait();
 }
 
-void SchedulerWorkerPoolImpl::WakeUpOneWorkerLockRequired() {
+bool SchedulerWorkerPoolImpl::WakeUpOneWorkerLockRequired() {
   lock_.AssertAcquired();
 
   if (workers_.empty()) {
     ++num_wake_ups_before_start_;
-    return;
+    return false;
   }
 
   // Ensure that there is one worker that can run tasks on top of the idle
@@ -714,15 +726,17 @@
   // stack, capacity permitting.
   MaintainAtLeastOneIdleWorkerLockRequired();
 
-  if (!polling_worker_capacity_ &&
-      ShouldPeriodicallyAdjustWorkerCapacityLockRequired()) {
-    PostAdjustWorkerCapacityTaskLockRequired();
-  }
+  return true;
 }
 
 void SchedulerWorkerPoolImpl::WakeUpOneWorker() {
-  AutoSchedulerLock auto_lock(lock_);
-  WakeUpOneWorkerLockRequired();
+  bool wake_up_allowed;
+  {
+    AutoSchedulerLock auto_lock(lock_);
+    wake_up_allowed = WakeUpOneWorkerLockRequired();
+  }
+  if (wake_up_allowed)
+    PostAdjustWorkerCapacityTaskIfNeeded();
 }
 
 void SchedulerWorkerPoolImpl::MaintainAtLeastOneIdleWorkerLockRequired() {
@@ -764,8 +778,9 @@
   idle_workers_stack_.Remove(worker);
 }
 
-bool SchedulerWorkerPoolImpl::CanWorkerCleanupForTesting() {
-  return !worker_cleanup_disallowed_.IsSet();
+bool SchedulerWorkerPoolImpl::CanWorkerCleanupForTestingLockRequired() {
+  lock_.AssertAcquired();
+  return !worker_cleanup_disallowed_for_testing_;
 }
 
 SchedulerWorker*
@@ -801,6 +816,8 @@
 }
 
 void SchedulerWorkerPoolImpl::AdjustWorkerCapacity() {
+  DCHECK(service_thread_task_runner_->RunsTasksInCurrentSequence());
+
   std::unique_ptr<PriorityQueue::Transaction> shared_transaction(
       shared_priority_queue_.BeginTransaction());
   AutoSchedulerLock auto_lock(lock_);
@@ -823,8 +840,11 @@
   const size_t num_wake_ups_needed = std::min(
       worker_capacity_ - original_worker_capacity, num_pending_sequences);
 
-  for (size_t i = 0; i < num_wake_ups_needed; ++i)
+  for (size_t i = 0; i < num_wake_ups_needed; ++i) {
+    // No need to call PostAdjustWorkerCapacityTaskIfNeeded() as the caller will
+    // take care of that for us.
     WakeUpOneWorkerLockRequired();
+  }
 
   MaintainAtLeastOneIdleWorkerLockRequired();
 }
@@ -840,28 +860,39 @@
   return TimeDelta::FromMilliseconds(10);
 }
 
-void SchedulerWorkerPoolImpl::PostAdjustWorkerCapacityTaskLockRequired() {
-  lock_.AssertAcquired();
-
-  polling_worker_capacity_ = true;
-
+void SchedulerWorkerPoolImpl::PostAdjustWorkerCapacityTaskIfNeeded() {
+  {
+    AutoSchedulerLock auto_lock(lock_);
+    if (polling_worker_capacity_ ||
+        !ShouldPeriodicallyAdjustWorkerCapacityLockRequired()) {
+      return;
+    }
+    polling_worker_capacity_ = true;
+  }
   service_thread_task_runner_->PostDelayedTask(
       FROM_HERE,
-      base::BindOnce(
-          [](SchedulerWorkerPoolImpl* worker_pool) {
-            worker_pool->AdjustWorkerCapacity();
+      BindOnce(&SchedulerWorkerPoolImpl::AdjustWorkerCapacityTaskFunction,
+               Unretained(this)),
+      kBlockedWorkersPollPeriod);
+}
 
-            AutoSchedulerLock auto_lock(worker_pool->lock_);
-            DCHECK(worker_pool->polling_worker_capacity_);
+void SchedulerWorkerPoolImpl::AdjustWorkerCapacityTaskFunction() {
+  DCHECK(service_thread_task_runner_->RunsTasksInCurrentSequence());
 
-            if (worker_pool
-                    ->ShouldPeriodicallyAdjustWorkerCapacityLockRequired()) {
-              worker_pool->PostAdjustWorkerCapacityTaskLockRequired();
-            } else {
-              worker_pool->polling_worker_capacity_ = false;
-            }
-          },
-          Unretained(this)),
+  AdjustWorkerCapacity();
+  {
+    AutoSchedulerLock auto_lock(lock_);
+    DCHECK(polling_worker_capacity_);
+
+    if (!ShouldPeriodicallyAdjustWorkerCapacityLockRequired()) {
+      polling_worker_capacity_ = false;
+      return;
+    }
+  }
+  service_thread_task_runner_->PostDelayedTask(
+      FROM_HERE,
+      BindOnce(&SchedulerWorkerPoolImpl::AdjustWorkerCapacityTaskFunction,
+               Unretained(this)),
       kBlockedWorkersPollPeriod);
 }
 
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.h b/base/task_scheduler/scheduler_worker_pool_impl.h
index 7a3d314..b424e759 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.h
+++ b/base/task_scheduler/scheduler_worker_pool_impl.h
@@ -112,9 +112,9 @@
   void WaitForAllWorkersIdleForTesting();
 
   // Disallows worker cleanup. If the suggested reclaim time is not
-  // TimeDelta::Max(), the test must call this before JoinForTesting() to reduce
-  // the chance of thread detachment during the process of joining all of the
-  // threads, and as a result, threads running after JoinForTesting().
+  // TimeDelta::Max(), the test must call this before JoinForTesting() to
+  // prevent thread detachment during the process of joining all of the threads,
+  // and as a result, threads running after JoinForTesting().
   void DisallowWorkerCleanupForTesting();
 
   // Returns the number of workers in this worker pool.
@@ -158,8 +158,9 @@
   void WakeUpOneWorker();
 
   // Performs the same action as WakeUpOneWorker() except asserts |lock_| is
-  // acquired rather than acquires it.
-  void WakeUpOneWorkerLockRequired();
+  // acquired rather than acquires it and returns true if worker wakeups are
+  // permitted.
+  bool WakeUpOneWorkerLockRequired();
 
   // Adds a worker, if needed, to maintain one idle worker, |worker_capacity_|
   // permitting.
@@ -175,7 +176,7 @@
   void RemoveFromIdleWorkersStackLockRequired(SchedulerWorker* worker);
 
   // Returns true if worker cleanup is permitted.
-  bool CanWorkerCleanupForTesting();
+  bool CanWorkerCleanupForTestingLockRequired();
 
   // Tries to add a new SchedulerWorker to the pool. Returns the new
   // SchedulerWorker on success, nullptr otherwise. Cannot be called before
@@ -196,8 +197,12 @@
   TimeDelta MayBlockThreshold() const;
 
   // Starts calling AdjustWorkerCapacity() periodically on
-  // |service_thread_task_runner_|.
-  void PostAdjustWorkerCapacityTaskLockRequired();
+  // |service_thread_task_runner_| if not already requested.
+  void PostAdjustWorkerCapacityTaskIfNeeded();
+
+  // Calls AdjustWorkerCapacity() and schedules it again as necessary. May only
+  // be called from the service thread.
+  void AdjustWorkerCapacityTaskFunction();
 
   // Returns true if AdjustWorkerCapacity() should periodically be called on
   // |service_thread_task_runner_|.
@@ -222,6 +227,7 @@
   // |num_pending_may_block_workers_|, |idle_workers_stack_|,
   // |idle_workers_stack_cv_for_testing_|, |num_wake_ups_before_start_|,
   // |cleanup_timestamps_|, |polling_worker_capacity_|,
+  // |worker_cleanup_disallowed_for_testing_|,
   // |SchedulerWorkerDelegateImpl::is_on_idle_workers_stack_|,
   // |SchedulerWorkerDelegateImpl::incremented_worker_capacity_since_blocked_|
   // and |SchedulerWorkerDelegateImpl::may_block_start_time_|. Has
@@ -269,6 +275,9 @@
   // |worker_capacity_|.
   bool polling_worker_capacity_ = false;
 
+  // Indicates to the delegates that workers are not permitted to cleanup.
+  bool worker_cleanup_disallowed_for_testing_ = false;
+
   // Used for testing and makes MayBlockThreshold() return the maximum
   // TimeDelta.
   AtomicFlag maximum_blocked_threshold_for_testing_;
@@ -276,9 +285,6 @@
   // Signaled once JoinForTesting() has returned.
   WaitableEvent join_for_testing_returned_;
 
-  // Indicates to the delegates that workers are not permitted to cleanup.
-  AtomicFlag worker_cleanup_disallowed_;
-
 #if DCHECK_IS_ON()
   // Set at the start of JoinForTesting().
   AtomicFlag join_for_testing_started_;
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index e6e7752aa..b64b9840 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -88,8 +88,6 @@
     "scoped_task_environment.h",
     "sequenced_task_runner_test_template.cc",
     "sequenced_task_runner_test_template.h",
-    "sequenced_worker_pool_owner.cc",
-    "sequenced_worker_pool_owner.h",
     "simple_test_clock.cc",
     "simple_test_clock.h",
     "simple_test_tick_clock.cc",
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
index 5ff5634..3ca756a 100644
--- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
+++ b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
@@ -42,6 +42,7 @@
         super(testClass);
     }
 
+    @Override
     protected Class<? extends TestLifecycle> getTestLifecycleClass() {
         return BaseTestLifecycle.class;
     }
diff --git a/base/test/sequenced_worker_pool_owner.cc b/base/test/sequenced_worker_pool_owner.cc
deleted file mode 100644
index d2925bc8..0000000
--- a/base/test/sequenced_worker_pool_owner.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/sequenced_worker_pool_owner.h"
-
-#include "base/location.h"
-#include "base/message_loop/message_loop.h"
-#include "base/single_thread_task_runner.h"
-
-namespace base {
-
-SequencedWorkerPoolOwner::SequencedWorkerPoolOwner(
-    size_t max_threads,
-    const std::string& thread_name_prefix)
-    : constructor_message_loop_(MessageLoop::current()),
-      pool_(new SequencedWorkerPool(max_threads,
-                                    thread_name_prefix,
-                                    TaskPriority::USER_VISIBLE,
-                                    this)),
-      has_work_call_count_(0) {}
-
-SequencedWorkerPoolOwner::~SequencedWorkerPoolOwner() {
-  pool_->Shutdown();
-  pool_ = nullptr;
-
-  // Spin the current message loop until SWP destruction verified in OnDestruct.
-  exit_loop_.Run();
-}
-
-const scoped_refptr<SequencedWorkerPool>& SequencedWorkerPoolOwner::pool()
-    const {
-  return pool_;
-}
-
-void SequencedWorkerPoolOwner::SetWillWaitForShutdownCallback(
-    const Closure& callback) {
-  will_wait_for_shutdown_callback_ = callback;
-}
-
-int SequencedWorkerPoolOwner::has_work_call_count() const {
-  AutoLock lock(has_work_lock_);
-  return has_work_call_count_;
-}
-
-void SequencedWorkerPoolOwner::OnHasWork() {
-  AutoLock lock(has_work_lock_);
-  ++has_work_call_count_;
-}
-
-void SequencedWorkerPoolOwner::WillWaitForShutdown() {
-  if (!will_wait_for_shutdown_callback_.is_null()) {
-    will_wait_for_shutdown_callback_.Run();
-
-    // Release the reference to the callback to prevent retain cycles.
-    will_wait_for_shutdown_callback_ = Closure();
-  }
-}
-
-void SequencedWorkerPoolOwner::OnDestruct() {
-  constructor_message_loop_->task_runner()->PostTask(FROM_HERE,
-                                                     exit_loop_.QuitClosure());
-}
-
-}  // namespace base
diff --git a/base/test/sequenced_worker_pool_owner.h b/base/test/sequenced_worker_pool_owner.h
deleted file mode 100644
index 28a6cf0..0000000
--- a/base/test/sequenced_worker_pool_owner.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
-#define BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
-
-#include <stddef.h>
-
-#include <cstddef>
-#include <string>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/run_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/sequenced_worker_pool.h"
-
-namespace base {
-
-class MessageLoop;
-
-// Wrapper around SequencedWorkerPool for testing that blocks destruction
-// until the pool is actually destroyed.  This is so that a
-// SequencedWorkerPool from one test doesn't outlive its test and cause
-// strange races with other tests that touch global stuff (like histograms and
-// logging).  However, this requires that nothing else on this thread holds a
-// ref to the pool when the SequencedWorkerPoolOwner is destroyed.
-//
-// This class calls Shutdown on the owned SequencedWorkerPool in the destructor.
-// Tests may themselves call Shutdown earlier to test shutdown behavior.
-class SequencedWorkerPoolOwner : public SequencedWorkerPool::TestingObserver {
- public:
-  SequencedWorkerPoolOwner(size_t max_threads,
-                           const std::string& thread_name_prefix);
-
-  ~SequencedWorkerPoolOwner() override;
-
-  // Don't change the returned pool's testing observer.
-  const scoped_refptr<SequencedWorkerPool>& pool() const;
-
-  // The given callback will be called on WillWaitForShutdown().
-  void SetWillWaitForShutdownCallback(const Closure& callback);
-
-  int has_work_call_count() const;
-
- private:
-  // SequencedWorkerPool::TestingObserver implementation.
-  void OnHasWork() override;
-  void WillWaitForShutdown() override;
-  void OnDestruct() override;
-
-  // Used to run the current thread's message loop until the
-  // SequencedWorkerPool's destruction has been verified.
-  base::RunLoop exit_loop_;
-  MessageLoop* const constructor_message_loop_;
-
-  scoped_refptr<SequencedWorkerPool> pool_;
-  Closure will_wait_for_shutdown_callback_;
-
-  mutable Lock has_work_lock_;
-  int has_work_call_count_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolOwner);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
index 15399e6b..4cb2208 100644
--- a/base/test/test_suite.cc
+++ b/base/test/test_suite.cc
@@ -33,7 +33,6 @@
 #include "base/test/multiprocess_test.h"
 #include "base/test/test_switches.h"
 #include "base/test/test_timeouts.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -457,11 +456,6 @@
 #endif
 #endif
 
-  // Enable SequencedWorkerPool in tests.
-  // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler
-  // redirection experiment concludes https://crbug.com/622400.
-  SequencedWorkerPool::EnableForProcess();
-
   CatchMaybeTests();
   ResetCommandLine();
   AddTestLauncherResultPrinter();
diff --git a/base/threading/sequenced_task_runner_handle.cc b/base/threading/sequenced_task_runner_handle.cc
index eb2a0e3b..e6920f5f 100644
--- a/base/threading/sequenced_task_runner_handle.cc
+++ b/base/threading/sequenced_task_runner_handle.cc
@@ -8,7 +8,6 @@
 
 #include "base/lazy_instance.h"
 #include "base/logging.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_local.h"
 #include "base/threading/thread_task_runner_handle.h"
 
@@ -26,26 +25,8 @@
   // Return the registered SequencedTaskRunner, if any.
   const SequencedTaskRunnerHandle* handle =
       sequenced_task_runner_tls.Pointer()->Get();
-  if (handle) {
-    // Various modes of setting SequencedTaskRunnerHandle don't combine.
-    DCHECK(!SequencedWorkerPool::GetSequenceTokenForCurrentThread().IsValid());
-
+  if (handle)
     return handle->task_runner_;
-  }
-
-  // If we are on a worker thread for a SequencedWorkerPool that is running a
-  // sequenced task, return a SequencedTaskRunner for it.
-  scoped_refptr<SequencedWorkerPool> pool =
-      SequencedWorkerPool::GetWorkerPoolForCurrentThread();
-  if (pool) {
-    SequencedWorkerPool::SequenceToken sequence_token =
-        SequencedWorkerPool::GetSequenceTokenForCurrentThread();
-    DCHECK(sequence_token.IsValid());
-    scoped_refptr<SequencedTaskRunner> sequenced_task_runner(
-        pool->GetSequencedTaskRunner(sequence_token));
-    DCHECK(sequenced_task_runner->RunsTasksInCurrentSequence());
-    return sequenced_task_runner;
-  }
 
   // Note if you hit this: the problem is the lack of a sequenced context. The
   // ThreadTaskRunnerHandle is just the last attempt at finding such a context.
@@ -58,7 +39,6 @@
 // static
 bool SequencedTaskRunnerHandle::IsSet() {
   return sequenced_task_runner_tls.Pointer()->Get() ||
-         SequencedWorkerPool::GetSequenceTokenForCurrentThread().IsValid() ||
          ThreadTaskRunnerHandle::IsSet();
 }
 
diff --git a/base/threading/sequenced_task_runner_handle.h b/base/threading/sequenced_task_runner_handle.h
index b7f4bae..f55cee5 100644
--- a/base/threading/sequenced_task_runner_handle.h
+++ b/base/threading/sequenced_task_runner_handle.h
@@ -24,10 +24,7 @@
   // a) A SequencedTaskRunner has been assigned to the current thread by
   //    instantiating a SequencedTaskRunnerHandle.
   // b) The current thread has a ThreadTaskRunnerHandle (which includes any
-  //    thread that has a MessageLoop associated with it), or
-  // c) The current thread is a worker thread belonging to a SequencedWorkerPool
-  //    *and* is currently running a sequenced task (note: not supporting
-  //    unsequenced tasks is intentional: https://crbug.com/618043#c4).
+  //    thread that has a MessageLoop associated with it).
   static bool IsSet();
 
   // Binds |task_runner| to the current thread.
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
deleted file mode 100644
index 7ea030a2..0000000
--- a/base/threading/sequenced_worker_pool.cc
+++ /dev/null
@@ -1,1602 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/sequenced_worker_pool.h"
-
-#include <stdint.h>
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-#include "base/atomic_sequence_num.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/critical_closure.h"
-#include "base/debug/dump_without_crashing.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/stl_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread_local.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-
-#if defined(OS_MACOSX)
-#include "base/mac/scoped_nsautorelease_pool.h"
-#elif defined(OS_WIN)
-#include "base/win/scoped_com_initializer.h"
-#endif
-
-#if !defined(OS_NACL)
-#include "base/metrics/histogram_macros.h"
-#endif
-
-namespace base {
-
-namespace {
-
-// An enum representing the state of all pools. A non-test process should only
-// ever transition from POST_TASK_DISABLED to one of the active states. A test
-// process may transition from one of the active states to POST_TASK_DISABLED
-// when DisableForProcessForTesting() is called.
-//
-// External memory synchronization is required to call a method that reads
-// |g_all_pools_state| after calling a method that modifies it.
-//
-// TODO(gab): Remove this if http://crbug.com/622400 fails (SequencedWorkerPool
-// will be phased out completely otherwise).
-enum class AllPoolsState {
-  POST_TASK_DISABLED,
-  USE_WORKER_POOL,
-  REDIRECTED_TO_TASK_SCHEDULER,
-};
-
-// TODO(fdoray): Change the initial state to POST_TASK_DISABLED. It is initially
-// USE_WORKER_POOL to avoid a revert of the CL that adds
-// debug::DumpWithoutCrashing() in case of waterfall failures.
-AllPoolsState g_all_pools_state = AllPoolsState::USE_WORKER_POOL;
-
-struct SequencedTask {
-  SequencedTask()
-      : sequence_token_id(0),
-        trace_id(0),
-        sequence_task_number(0),
-        shutdown_behavior(SequencedWorkerPool::BLOCK_SHUTDOWN) {}
-
-  ~SequencedTask() = default;
-
-  SequencedTask(SequencedTask&&) = default;
-  SequencedTask& operator=(SequencedTask&&) = default;
-
-  int sequence_token_id;
-  int trace_id;
-  int64_t sequence_task_number;
-  SequencedWorkerPool::WorkerShutdown shutdown_behavior;
-  Location posted_from;
-  OnceClosure task;
-
-  // Non-delayed tasks and delayed tasks are managed together by time-to-run
-  // order. We calculate the time by adding the posted time and the given delay.
-  TimeTicks time_to_run;
-};
-
-struct SequencedTaskLessThan {
- public:
-  bool operator()(const SequencedTask& lhs, const SequencedTask& rhs) const {
-    if (lhs.time_to_run < rhs.time_to_run)
-      return true;
-
-    if (lhs.time_to_run > rhs.time_to_run)
-      return false;
-
-    // If the time happen to match, then we use the sequence number to decide.
-    return lhs.sequence_task_number < rhs.sequence_task_number;
-  }
-};
-
-// Create a process-wide unique ID to represent this task in trace events. This
-// will be mangled with a Process ID hash to reduce the likelyhood of colliding
-// with MessageLoop pointers on other processes.
-uint64_t GetTaskTraceID(const SequencedTask& task, void* pool) {
-  return (static_cast<uint64_t>(task.trace_id) << 32) |
-         static_cast<uint64_t>(reinterpret_cast<intptr_t>(pool));
-}
-
-// SequencedWorkerPoolTaskRunner ---------------------------------------------
-// A TaskRunner which posts tasks to a SequencedWorkerPool with a
-// fixed ShutdownBehavior.
-//
-// Note that this class is RefCountedThreadSafe (inherited from TaskRunner).
-class SequencedWorkerPoolTaskRunner : public TaskRunner {
- public:
-  SequencedWorkerPoolTaskRunner(
-      scoped_refptr<SequencedWorkerPool> pool,
-      SequencedWorkerPool::WorkerShutdown shutdown_behavior);
-
-  // TaskRunner implementation
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       TimeDelta delay) override;
-  bool RunsTasksInCurrentSequence() const override;
-
- private:
-  ~SequencedWorkerPoolTaskRunner() override;
-
-  const scoped_refptr<SequencedWorkerPool> pool_;
-
-  const SequencedWorkerPool::WorkerShutdown shutdown_behavior_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner);
-};
-
-SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner(
-    scoped_refptr<SequencedWorkerPool> pool,
-    SequencedWorkerPool::WorkerShutdown shutdown_behavior)
-    : pool_(std::move(pool)), shutdown_behavior_(shutdown_behavior) {}
-
-SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() = default;
-
-bool SequencedWorkerPoolTaskRunner::PostDelayedTask(const Location& from_here,
-                                                    OnceClosure task,
-                                                    TimeDelta delay) {
-  if (delay.is_zero()) {
-    return pool_->PostWorkerTaskWithShutdownBehavior(from_here, std::move(task),
-                                                     shutdown_behavior_);
-  }
-  return pool_->PostDelayedTask(from_here, std::move(task), delay);
-}
-
-bool SequencedWorkerPoolTaskRunner::RunsTasksInCurrentSequence() const {
-  return pool_->RunsTasksInCurrentSequence();
-}
-
-}  // namespace
-
-// SequencedWorkerPool::PoolSequencedTaskRunner ------------------------------
-// A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a
-// fixed sequence token.
-//
-// Note that this class is RefCountedThreadSafe (inherited from TaskRunner).
-class SequencedWorkerPool::PoolSequencedTaskRunner
-    : public SequencedTaskRunner {
- public:
-  PoolSequencedTaskRunner(
-      scoped_refptr<SequencedWorkerPool> pool,
-      SequencedWorkerPool::SequenceToken token,
-      SequencedWorkerPool::WorkerShutdown shutdown_behavior);
-
-  // TaskRunner implementation
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       TimeDelta delay) override;
-  bool RunsTasksInCurrentSequence() const override;
-
-
-  // SequencedTaskRunner implementation
-  bool PostNonNestableDelayedTask(const Location& from_here,
-                                  OnceClosure task,
-                                  TimeDelta delay) override;
-
- private:
-  ~PoolSequencedTaskRunner() override;
-
-  const scoped_refptr<SequencedWorkerPool> pool_;
-
-  const SequencedWorkerPool::SequenceToken token_;
-
-  const SequencedWorkerPool::WorkerShutdown shutdown_behavior_;
-
-  DISALLOW_COPY_AND_ASSIGN(PoolSequencedTaskRunner);
-};
-
-SequencedWorkerPool::PoolSequencedTaskRunner::
-    PoolSequencedTaskRunner(
-        scoped_refptr<SequencedWorkerPool> pool,
-        SequencedWorkerPool::SequenceToken token,
-        SequencedWorkerPool::WorkerShutdown shutdown_behavior)
-    : pool_(std::move(pool)),
-      token_(token),
-      shutdown_behavior_(shutdown_behavior) {}
-
-SequencedWorkerPool::PoolSequencedTaskRunner::
-    ~PoolSequencedTaskRunner() = default;
-
-bool SequencedWorkerPool::PoolSequencedTaskRunner::PostDelayedTask(
-    const Location& from_here,
-    OnceClosure task,
-    TimeDelta delay) {
-  if (delay.is_zero()) {
-    return pool_->PostSequencedWorkerTaskWithShutdownBehavior(
-        token_, from_here, std::move(task), shutdown_behavior_);
-  }
-  return pool_->PostDelayedSequencedWorkerTask(token_, from_here,
-                                               std::move(task), delay);
-}
-
-bool SequencedWorkerPool::PoolSequencedTaskRunner::
-    RunsTasksInCurrentSequence() const {
-  return pool_->IsRunningSequenceOnCurrentThread(token_);
-}
-
-bool SequencedWorkerPool::PoolSequencedTaskRunner::PostNonNestableDelayedTask(
-    const Location& from_here,
-    OnceClosure task,
-    TimeDelta delay) {
-  // There's no way to run nested tasks, so simply forward to
-  // PostDelayedTask.
-  return PostDelayedTask(from_here, std::move(task), delay);
-}
-
-// Worker ---------------------------------------------------------------------
-
-class SequencedWorkerPool::Worker : public SimpleThread {
- public:
-  // Hold a (cyclic) ref to |worker_pool|, since we want to keep it
-  // around as long as we are running.
-  Worker(scoped_refptr<SequencedWorkerPool> worker_pool,
-         int thread_number,
-         const std::string& thread_name_prefix);
-  ~Worker() override;
-
-  // SimpleThread implementation. This actually runs the background thread.
-  void Run() override;
-
-  // Gets the worker for the current thread out of thread-local storage.
-  static Worker* GetForCurrentThread();
-
-  // Indicates that a task is about to be run. The parameters provide
-  // additional metainformation about the task being run.
-  void set_running_task_info(SequenceToken token,
-                             WorkerShutdown shutdown_behavior) {
-    is_processing_task_ = true;
-    task_sequence_token_ = token;
-    task_shutdown_behavior_ = shutdown_behavior;
-
-    // It is dangerous for tasks with CONTINUE_ON_SHUTDOWN to access a class
-    // that implements a non-leaky base::Singleton because they are generally
-    // destroyed before the process terminates via an AtExitManager
-    // registration. This will trigger a DCHECK to warn of such cases. See the
-    // comment about CONTINUE_ON_SHUTDOWN for more details.
-    ThreadRestrictions::SetSingletonAllowed(task_shutdown_behavior_ !=
-                                            CONTINUE_ON_SHUTDOWN);
-  }
-
-  // Indicates that the task has finished running.
-  void reset_running_task_info() { is_processing_task_ = false; }
-
-  // Whether the worker is processing a task.
-  bool is_processing_task() { return is_processing_task_; }
-
-  SequenceToken task_sequence_token() const {
-    DCHECK(is_processing_task_);
-    return task_sequence_token_;
-  }
-
-  WorkerShutdown task_shutdown_behavior() const {
-    DCHECK(is_processing_task_);
-    return task_shutdown_behavior_;
-  }
-
-  scoped_refptr<SequencedWorkerPool> worker_pool() const {
-    return worker_pool_;
-  }
-
- private:
-  static LazyInstance<ThreadLocalPointer<SequencedWorkerPool::Worker>>::Leaky
-      lazy_tls_ptr_;
-
-  scoped_refptr<SequencedWorkerPool> worker_pool_;
-  // The sequence token of the task being processed. Only valid when
-  // is_processing_task_ is true.
-  SequenceToken task_sequence_token_;
-  // The shutdown behavior of the task being processed. Only valid when
-  // is_processing_task_ is true.
-  WorkerShutdown task_shutdown_behavior_;
-  // Whether the Worker is processing a task.
-  bool is_processing_task_;
-
-  DISALLOW_COPY_AND_ASSIGN(Worker);
-};
-
-// Inner ----------------------------------------------------------------------
-
-class SequencedWorkerPool::Inner {
- public:
-  // Take a raw pointer to |worker| to avoid cycles (since we're owned
-  // by it).
-  Inner(SequencedWorkerPool* worker_pool,
-        size_t max_threads,
-        const std::string& thread_name_prefix,
-        base::TaskPriority task_priority,
-        TestingObserver* observer);
-
-  ~Inner();
-
-  static SequenceToken GetSequenceToken();
-
-  SequenceToken GetNamedSequenceToken(const std::string& name);
-
-  // This function accepts a name and an ID. If the name is null, the
-  // token ID is used. This allows us to implement the optional name lookup
-  // from a single function without having to enter the lock a separate time.
-  bool PostTask(const std::string* optional_token_name,
-                SequenceToken sequence_token,
-                WorkerShutdown shutdown_behavior,
-                const Location& from_here,
-                OnceClosure task,
-                TimeDelta delay);
-
-  bool RunsTasksOnCurrentThread() const;
-
-  bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const;
-
-  void CleanupForTesting();
-
-  void SignalHasWorkForTesting();
-
-  int GetWorkSignalCountForTesting() const;
-
-  void Shutdown(int max_blocking_tasks_after_shutdown);
-
-  // Runs the worker loop on the background thread.
-  void ThreadLoop(Worker* this_worker);
-
- private:
-  enum GetWorkStatus {
-    GET_WORK_FOUND,
-    GET_WORK_NOT_FOUND,
-    GET_WORK_WAIT,
-  };
-
-  enum CleanupState {
-    CLEANUP_REQUESTED,
-    CLEANUP_STARTING,
-    CLEANUP_RUNNING,
-    CLEANUP_FINISHING,
-    CLEANUP_DONE,
-  };
-
-  // Clears ScheduledTasks in |tasks_to_delete| while ensuring that
-  // |this_worker| has the desired task info context during ~ScheduledTask() to
-  // allow sequence-checking.
-  void DeleteWithoutLock(std::vector<SequencedTask>* tasks_to_delete,
-                         Worker* this_worker);
-
-  // Helper used by PostTask() to complete the work when redirection is on.
-  // Returns true if the task may run at some point in the future and false if
-  // it will definitely not run.
-  // Coalesce upon resolution of http://crbug.com/622400.
-  bool PostTaskToTaskScheduler(SequencedTask sequenced, const TimeDelta& delay);
-
-  // Returns the TaskScheduler TaskRunner for the specified |sequence_token_id|
-  // and |traits|.
-  scoped_refptr<TaskRunner> GetTaskSchedulerTaskRunner(
-      int sequence_token_id,
-      const TaskTraits& traits);
-
-  // Called from within the lock, this converts the given token name into a
-  // token ID, creating a new one if necessary.
-  int LockedGetNamedTokenID(const std::string& name);
-
-  // Called from within the lock, this returns the next sequence task number.
-  int64_t LockedGetNextSequenceTaskNumber();
-
-  // Gets new task. There are 3 cases depending on the return value:
-  //
-  // 1) If the return value is |GET_WORK_FOUND|, |task| is filled in and should
-  //    be run immediately.
-  // 2) If the return value is |GET_WORK_NOT_FOUND|, there are no tasks to run,
-  //    and |task| is not filled in. In this case, the caller should wait until
-  //    a task is posted.
-  // 3) If the return value is |GET_WORK_WAIT|, there are no tasks to run
-  //    immediately, and |task| is not filled in. Likewise, |wait_time| is
-  //    filled in the time to wait until the next task to run. In this case, the
-  //    caller should wait the time.
-  //
-  // In any case, the calling code should clear the given
-  // delete_these_outside_lock vector the next time the lock is released.
-  // See the implementation for a more detailed description.
-  GetWorkStatus GetWork(SequencedTask* task,
-                        TimeDelta* wait_time,
-                        std::vector<SequencedTask>* delete_these_outside_lock);
-
-  void HandleCleanup();
-
-  // Peforms init and cleanup around running the given task. WillRun...
-  // returns the value from PrepareToStartAdditionalThreadIfNecessary.
-  // The calling code should call FinishStartingAdditionalThread once the
-  // lock is released if the return values is nonzero.
-  int WillRunWorkerTask(const SequencedTask& task);
-  void DidRunWorkerTask(const SequencedTask& task);
-
-  // Returns true if there are no threads currently running the given
-  // sequence token.
-  bool IsSequenceTokenRunnable(int sequence_token_id) const;
-
-  // Checks if all threads are busy and the addition of one more could run an
-  // additional task waiting in the queue. This must be called from within
-  // the lock.
-  //
-  // If another thread is helpful, this will mark the thread as being in the
-  // process of starting and returns the index of the new thread which will be
-  // 0 or more. The caller should then call FinishStartingAdditionalThread to
-  // complete initialization once the lock is released.
-  //
-  // If another thread is not necessary, return 0;
-  //
-  // See the implementedion for more.
-  int PrepareToStartAdditionalThreadIfHelpful();
-
-  // The second part of thread creation after
-  // PrepareToStartAdditionalThreadIfHelpful with the thread number it
-  // generated. This actually creates the thread and should be called outside
-  // the lock to avoid blocking important work starting a thread in the lock.
-  void FinishStartingAdditionalThread(int thread_number);
-
-  // Signal |has_work_| and increment |has_work_signal_count_|.
-  void SignalHasWork();
-
-  // Checks whether there is work left that's blocking shutdown. Must be
-  // called inside the lock.
-  bool CanShutdown() const;
-
-  SequencedWorkerPool* const worker_pool_;
-
-  // The last sequence number used. Managed by GetSequenceToken, since this
-  // only does threadsafe increment operations, you do not need to hold the
-  // lock. This is class-static to make SequenceTokens issued by
-  // GetSequenceToken unique across SequencedWorkerPool instances.
-  static base::AtomicSequenceNumber g_last_sequence_number_;
-
-  // This lock protects |everything in this class|. Do not read or modify
-  // anything without holding this lock. Do not block while holding this
-  // lock.
-  mutable Lock lock_;
-
-  // Condition variable that is waited on by worker threads until new
-  // tasks are posted or shutdown starts.
-  ConditionVariable has_work_cv_;
-
-  // Condition variable that is waited on by non-worker threads (in
-  // Shutdown()) until CanShutdown() goes to true.
-  ConditionVariable can_shutdown_cv_;
-
-  // The maximum number of worker threads we'll create.
-  const size_t max_threads_;
-
-  const std::string thread_name_prefix_;
-
-  // Associates all known sequence token names with their IDs.
-  std::map<std::string, int> named_sequence_tokens_;
-
-  // Owning pointers to all threads we've created so far, indexed by
-  // ID. Since we lazily create threads, this may be less than
-  // max_threads_ and will be initially empty.
-  using ThreadMap = std::map<PlatformThreadId, std::unique_ptr<Worker>>;
-  ThreadMap threads_;
-
-  // Set to true when we're in the process of creating another thread.
-  // See PrepareToStartAdditionalThreadIfHelpful for more.
-  bool thread_being_created_;
-
-  // Number of threads currently waiting for work.
-  size_t waiting_thread_count_;
-
-  // Number of threads currently running tasks that have the BLOCK_SHUTDOWN
-  // or SKIP_ON_SHUTDOWN flag set.
-  size_t blocking_shutdown_thread_count_;
-
-  // A set of all pending tasks in time-to-run order. These are tasks that are
-  // either waiting for a thread to run on, waiting for their time to run,
-  // or blocked on a previous task in their sequence. We have to iterate over
-  // the tasks by time-to-run order, so we use the set instead of the
-  // traditional priority_queue.
-  typedef std::set<SequencedTask, SequencedTaskLessThan> PendingTaskSet;
-  PendingTaskSet pending_tasks_;
-
-  // The next sequence number for a new sequenced task.
-  int64_t next_sequence_task_number_;
-
-  // Number of tasks in the pending_tasks_ list that are marked as blocking
-  // shutdown.
-  size_t blocking_shutdown_pending_task_count_;
-
-  // Lists all sequence tokens currently executing.
-  std::set<int> current_sequences_;
-
-  // An ID for each posted task to distinguish the task from others in traces.
-  int trace_id_;
-
-  // Set when Shutdown is called and no further tasks should be
-  // allowed, though we may still be running existing tasks.
-  bool shutdown_called_;
-
-  // The number of new BLOCK_SHUTDOWN tasks that may be posted after Shudown()
-  // has been called.
-  int max_blocking_tasks_after_shutdown_;
-
-  // State used to cleanup for testing, all guarded by lock_.
-  CleanupState cleanup_state_;
-  size_t cleanup_idlers_;
-  ConditionVariable cleanup_cv_;
-
-  TestingObserver* const testing_observer_;
-
-  // Members below are used for the experimental redirection to TaskScheduler.
-  // TODO(gab): Remove these if http://crbug.com/622400 fails
-  // (SequencedWorkerPool will be phased out completely otherwise).
-
-  // The TaskPriority to be used for SequencedWorkerPool tasks redirected to the
-  // TaskScheduler as an experiment (unused otherwise).
-  const base::TaskPriority task_priority_;
-
-  // A map of SequenceToken IDs to TaskScheduler TaskRunners used to redirect
-  // sequenced tasks to the TaskScheduler.
-  std::unordered_map<int, scoped_refptr<TaskRunner>> sequenced_task_runner_map_;
-
-  // TaskScheduler TaskRunners to redirect unsequenced tasks to the
-  // TaskScheduler. Indexed by TaskShutdownBehavior.
-  scoped_refptr<TaskRunner> unsequenced_task_runners_[3];
-
-  // A dummy TaskRunner obtained from TaskScheduler with the same TaskTraits as
-  // used by this SequencedWorkerPool to query for RunsTasksOnCurrentThread().
-  // Mutable so it can be lazily instantiated from RunsTasksOnCurrentThread().
-  mutable scoped_refptr<TaskRunner> runs_tasks_on_verifier_;
-
-  DISALLOW_COPY_AND_ASSIGN(Inner);
-};
-
-// Worker definitions ---------------------------------------------------------
-
-SequencedWorkerPool::Worker::Worker(
-    scoped_refptr<SequencedWorkerPool> worker_pool,
-    int thread_number,
-    const std::string& prefix)
-    : SimpleThread(prefix + StringPrintf("Worker%d", thread_number)),
-      worker_pool_(std::move(worker_pool)),
-      task_shutdown_behavior_(BLOCK_SHUTDOWN),
-      is_processing_task_(false) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-  Start();
-}
-
-SequencedWorkerPool::Worker::~Worker() = default;
-
-void SequencedWorkerPool::Worker::Run() {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-#if defined(OS_WIN)
-  win::ScopedCOMInitializer com_initializer;
-#endif
-
-  // Store a pointer to this worker in thread local storage for static function
-  // access.
-  DCHECK(!lazy_tls_ptr_.Get().Get());
-  lazy_tls_ptr_.Get().Set(this);
-
-  // Just jump back to the Inner object to run the thread, since it has all the
-  // tracking information and queues. It might be more natural to implement
-  // using DelegateSimpleThread and have Inner implement the Delegate to avoid
-  // having these worker objects at all, but that method lacks the ability to
-  // send thread-specific information easily to the thread loop.
-  worker_pool_->inner_->ThreadLoop(this);
-  // Release our cyclic reference once we're done.
-  worker_pool_ = nullptr;
-}
-
-// static
-SequencedWorkerPool::Worker*
-SequencedWorkerPool::Worker::GetForCurrentThread() {
-  // Don't construct lazy instance on check.
-  if (!lazy_tls_ptr_.IsCreated())
-    return nullptr;
-
-  return lazy_tls_ptr_.Get().Get();
-}
-
-// static
-LazyInstance<ThreadLocalPointer<SequencedWorkerPool::Worker>>::Leaky
-    SequencedWorkerPool::Worker::lazy_tls_ptr_ = LAZY_INSTANCE_INITIALIZER;
-
-// Inner definitions ---------------------------------------------------------
-
-SequencedWorkerPool::Inner::Inner(SequencedWorkerPool* worker_pool,
-                                  size_t max_threads,
-                                  const std::string& thread_name_prefix,
-                                  base::TaskPriority task_priority,
-                                  TestingObserver* observer)
-    : worker_pool_(worker_pool),
-      lock_(),
-      has_work_cv_(&lock_),
-      can_shutdown_cv_(&lock_),
-      max_threads_(max_threads),
-      thread_name_prefix_(thread_name_prefix),
-      thread_being_created_(false),
-      waiting_thread_count_(0),
-      blocking_shutdown_thread_count_(0),
-      next_sequence_task_number_(0),
-      blocking_shutdown_pending_task_count_(0),
-      trace_id_(0),
-      shutdown_called_(false),
-      max_blocking_tasks_after_shutdown_(0),
-      cleanup_state_(CLEANUP_DONE),
-      cleanup_idlers_(0),
-      cleanup_cv_(&lock_),
-      testing_observer_(observer),
-      task_priority_(task_priority) {
-  DCHECK_GT(max_threads_, 1U);
-}
-
-SequencedWorkerPool::Inner::~Inner() {
-  // You must call Shutdown() before destroying the pool.
-  DCHECK(shutdown_called_);
-
-  // Need to explicitly join with the threads before they're destroyed or else
-  // they will be running when our object is half torn down.
-  for (ThreadMap::iterator it = threads_.begin(); it != threads_.end(); ++it)
-    it->second->Join();
-  threads_.clear();
-
-  if (testing_observer_)
-    testing_observer_->OnDestruct();
-}
-
-// static
-SequencedWorkerPool::SequenceToken
-SequencedWorkerPool::Inner::GetSequenceToken() {
-  // Need to add one because AtomicSequenceNumber starts at zero, which
-  // is used as a sentinel value in SequenceTokens.
-  return SequenceToken(g_last_sequence_number_.GetNext() + 1);
-}
-
-SequencedWorkerPool::SequenceToken
-SequencedWorkerPool::Inner::GetNamedSequenceToken(const std::string& name) {
-  AutoLock lock(lock_);
-  return SequenceToken(LockedGetNamedTokenID(name));
-}
-
-bool SequencedWorkerPool::Inner::PostTask(
-    const std::string* optional_token_name,
-    SequenceToken sequence_token,
-    WorkerShutdown shutdown_behavior,
-    const Location& from_here,
-    OnceClosure task,
-    TimeDelta delay) {
-  // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
-  // for details.
-  CHECK(task);
-
-  // TODO(fdoray): Uncomment this DCHECK. It is initially commented to avoid a
-  // revert of the CL that adds debug::DumpWithoutCrashing() if it fails on the
-  // waterfall. https://crbug.com/622400
-  // DCHECK_NE(AllPoolsState::POST_TASK_DISABLED, g_all_pools_state);
-  if (g_all_pools_state == AllPoolsState::POST_TASK_DISABLED)
-    debug::DumpWithoutCrashing();
-
-  DCHECK(delay.is_zero() || shutdown_behavior == SKIP_ON_SHUTDOWN);
-  SequencedTask sequenced;
-  sequenced.sequence_token_id = sequence_token.id_;
-  sequenced.shutdown_behavior = shutdown_behavior;
-  sequenced.posted_from = from_here;
-  sequenced.task = shutdown_behavior == BLOCK_SHUTDOWN
-                       ? base::MakeCriticalClosure(std::move(task))
-                       : std::move(task);
-  sequenced.time_to_run = TimeTicks::Now() + delay;
-
-  int create_thread_id = 0;
-  {
-    AutoLock lock(lock_);
-
-    if (shutdown_called_) {
-      // Don't allow a new task to be posted if it doesn't block shutdown.
-      if (shutdown_behavior != BLOCK_SHUTDOWN)
-        return false;
-
-      // If the current thread is running a task, and that task doesn't block
-      // shutdown, then it shouldn't be allowed to post any more tasks.
-      ThreadMap::const_iterator found =
-          threads_.find(PlatformThread::CurrentId());
-      if (found != threads_.end() && found->second->is_processing_task() &&
-          found->second->task_shutdown_behavior() != BLOCK_SHUTDOWN) {
-        return false;
-      }
-
-      if (max_blocking_tasks_after_shutdown_ <= 0) {
-        DLOG(WARNING) << "BLOCK_SHUTDOWN task disallowed";
-        return false;
-      }
-      max_blocking_tasks_after_shutdown_ -= 1;
-    }
-
-    // The trace_id is used for identifying the task in about:tracing.
-    sequenced.trace_id = trace_id_++;
-
-    TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("toplevel.flow"),
-        "SequencedWorkerPool::Inner::PostTask",
-        TRACE_ID_MANGLE(GetTaskTraceID(sequenced, static_cast<void*>(this))),
-        TRACE_EVENT_FLAG_FLOW_OUT);
-
-    sequenced.sequence_task_number = LockedGetNextSequenceTaskNumber();
-
-    // Now that we have the lock, apply the named token rules.
-    if (optional_token_name)
-      sequenced.sequence_token_id = LockedGetNamedTokenID(*optional_token_name);
-
-    if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-      if (!PostTaskToTaskScheduler(std::move(sequenced), delay))
-        return false;
-    } else {
-      shutdown_behavior = sequenced.shutdown_behavior;
-      pending_tasks_.insert(std::move(sequenced));
-
-      if (shutdown_behavior == BLOCK_SHUTDOWN)
-        blocking_shutdown_pending_task_count_++;
-
-      create_thread_id = PrepareToStartAdditionalThreadIfHelpful();
-    }
-  }
-
-  // Use != REDIRECTED_TO_TASK_SCHEDULER instead of == USE_WORKER_POOL to ensure
-  // correct behavior if a task is posted to a SequencedWorkerPool before
-  // Enable(WithRedirectionToTaskScheduler)ForProcess() in a non-DCHECK build.
-  if (g_all_pools_state != AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-    // Actually start the additional thread or signal an existing one outside
-    // the lock.
-    if (create_thread_id)
-      FinishStartingAdditionalThread(create_thread_id);
-    else
-      SignalHasWork();
-  }
-
-#if DCHECK_IS_ON()
-  {
-    AutoLock lock_for_dcheck(lock_);
-    // Some variables are exposed in both modes for convenience but only really
-    // intended for one of them at runtime, confirm exclusive usage here.
-    if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-      DCHECK(pending_tasks_.empty());
-      DCHECK_EQ(0, create_thread_id);
-    } else {
-      DCHECK(sequenced_task_runner_map_.empty());
-    }
-  }
-#endif  // DCHECK_IS_ON()
-
-  return true;
-}
-
-bool SequencedWorkerPool::Inner::PostTaskToTaskScheduler(
-    SequencedTask sequenced,
-    const TimeDelta& delay) {
-  DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
-
-  lock_.AssertAcquired();
-
-  // Confirm that the TaskScheduler's shutdown behaviors use the same
-  // underlying values as SequencedWorkerPool.
-  static_assert(
-      static_cast<int>(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) ==
-          static_cast<int>(CONTINUE_ON_SHUTDOWN),
-      "TaskShutdownBehavior and WorkerShutdown enum mismatch for "
-      "CONTINUE_ON_SHUTDOWN.");
-  static_assert(static_cast<int>(TaskShutdownBehavior::SKIP_ON_SHUTDOWN) ==
-                    static_cast<int>(SKIP_ON_SHUTDOWN),
-                "TaskShutdownBehavior and WorkerShutdown enum mismatch for "
-                "SKIP_ON_SHUTDOWN.");
-  static_assert(static_cast<int>(TaskShutdownBehavior::BLOCK_SHUTDOWN) ==
-                    static_cast<int>(BLOCK_SHUTDOWN),
-                "TaskShutdownBehavior and WorkerShutdown enum mismatch for "
-                "BLOCK_SHUTDOWN.");
-
-  const TaskShutdownBehavior task_shutdown_behavior =
-      static_cast<TaskShutdownBehavior>(sequenced.shutdown_behavior);
-  const TaskTraits traits = {MayBlock(), WithBaseSyncPrimitives(),
-                             task_priority_, task_shutdown_behavior};
-  return GetTaskSchedulerTaskRunner(sequenced.sequence_token_id, traits)
-      ->PostDelayedTask(sequenced.posted_from, std::move(sequenced.task),
-                        delay);
-}
-
-scoped_refptr<TaskRunner>
-SequencedWorkerPool::Inner::GetTaskSchedulerTaskRunner(
-    int sequence_token_id,
-    const TaskTraits& traits) {
-  DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
-
-  lock_.AssertAcquired();
-
-  static_assert(
-      static_cast<int>(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) == 0,
-      "TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN must be equal to 0 to be "
-      "used as an index in |unsequenced_task_runners_|.");
-  static_assert(static_cast<int>(TaskShutdownBehavior::SKIP_ON_SHUTDOWN) == 1,
-                "TaskShutdownBehavior::SKIP_ON_SHUTDOWN must be equal to 1 to "
-                "be used as an index in |unsequenced_task_runners_|.");
-  static_assert(static_cast<int>(TaskShutdownBehavior::BLOCK_SHUTDOWN) == 2,
-                "TaskShutdownBehavior::BLOCK_SHUTDOWN must be equal to 2 to be "
-                "used as an index in |unsequenced_task_runners_|.");
-  static_assert(arraysize(unsequenced_task_runners_) == 3,
-                "The size of |unsequenced_task_runners_| doesn't match the "
-                "number of shutdown behaviors.");
-
-  scoped_refptr<TaskRunner>& task_runner =
-      sequence_token_id ? sequenced_task_runner_map_[sequence_token_id]
-                        : unsequenced_task_runners_[static_cast<int>(
-                              traits.shutdown_behavior())];
-
-  // TODO(fdoray): DCHECK that all tasks posted to the same sequence have the
-  // same shutdown behavior.
-
-  if (!task_runner) {
-    task_runner = sequence_token_id
-                      ? CreateSequencedTaskRunnerWithTraits(traits)
-                      : CreateTaskRunnerWithTraits(traits);
-  }
-
-  return task_runner;
-}
-
-bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const {
-  AutoLock lock(lock_);
-  if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-    if (!runs_tasks_on_verifier_) {
-      runs_tasks_on_verifier_ = CreateTaskRunnerWithTraits(
-          {MayBlock(), WithBaseSyncPrimitives(), task_priority_});
-    }
-    return runs_tasks_on_verifier_->RunsTasksInCurrentSequence();
-  } else {
-    return ContainsKey(threads_, PlatformThread::CurrentId());
-  }
-}
-
-bool SequencedWorkerPool::Inner::IsRunningSequenceOnCurrentThread(
-    SequenceToken sequence_token) const {
-  DCHECK(sequence_token.IsValid());
-
-  AutoLock lock(lock_);
-
-  if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-    const auto sequenced_task_runner_it =
-        sequenced_task_runner_map_.find(sequence_token.id_);
-    return sequenced_task_runner_it != sequenced_task_runner_map_.end() &&
-           sequenced_task_runner_it->second->RunsTasksInCurrentSequence();
-  } else {
-    ThreadMap::const_iterator found =
-        threads_.find(PlatformThread::CurrentId());
-    return found != threads_.end() && found->second->is_processing_task() &&
-           sequence_token.Equals(found->second->task_sequence_token());
-  }
-}
-
-// See https://code.google.com/p/chromium/issues/detail?id=168415
-void SequencedWorkerPool::Inner::CleanupForTesting() {
-  DCHECK_NE(g_all_pools_state, AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER);
-  AutoLock lock(lock_);
-  CHECK_EQ(CLEANUP_DONE, cleanup_state_);
-  if (shutdown_called_)
-    return;
-  if (pending_tasks_.empty() && waiting_thread_count_ == threads_.size())
-    return;
-  cleanup_state_ = CLEANUP_REQUESTED;
-  cleanup_idlers_ = 0;
-  has_work_cv_.Signal();
-  while (cleanup_state_ != CLEANUP_DONE)
-    cleanup_cv_.Wait();
-}
-
-void SequencedWorkerPool::Inner::SignalHasWorkForTesting() {
-  SignalHasWork();
-}
-
-void SequencedWorkerPool::Inner::Shutdown(
-    int max_new_blocking_tasks_after_shutdown) {
-  DCHECK_GE(max_new_blocking_tasks_after_shutdown, 0);
-  {
-    AutoLock lock(lock_);
-    // Cleanup and Shutdown should not be called concurrently.
-    CHECK_EQ(CLEANUP_DONE, cleanup_state_);
-    if (shutdown_called_)
-      return;
-    shutdown_called_ = true;
-
-    max_blocking_tasks_after_shutdown_ = max_new_blocking_tasks_after_shutdown;
-
-    if (g_all_pools_state != AllPoolsState::USE_WORKER_POOL)
-      return;
-
-    // Tickle the threads. This will wake up a waiting one so it will know that
-    // it can exit, which in turn will wake up any other waiting ones.
-    SignalHasWork();
-
-    // There are no pending or running tasks blocking shutdown, we're done.
-    if (CanShutdown())
-      return;
-  }
-
-  // If we're here, then something is blocking shutdown.  So wait for
-  // CanShutdown() to go to true.
-
-  if (testing_observer_)
-    testing_observer_->WillWaitForShutdown();
-
-#if !defined(OS_NACL)
-  TimeTicks shutdown_wait_begin = TimeTicks::Now();
-#endif
-
-  {
-    base::ThreadRestrictions::ScopedAllowWait allow_wait;
-    AutoLock lock(lock_);
-    while (!CanShutdown())
-      can_shutdown_cv_.Wait();
-  }
-#if !defined(OS_NACL)
-  UMA_HISTOGRAM_TIMES("SequencedWorkerPool.ShutdownDelayTime",
-                      TimeTicks::Now() - shutdown_wait_begin);
-#endif
-}
-
-void SequencedWorkerPool::Inner::ThreadLoop(Worker* this_worker) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-  {
-    AutoLock lock(lock_);
-    DCHECK(thread_being_created_);
-    thread_being_created_ = false;
-    auto result = threads_.insert(
-        std::make_pair(this_worker->tid(), WrapUnique(this_worker)));
-    DCHECK(result.second);
-
-    while (true) {
-#if defined(OS_MACOSX)
-      base::mac::ScopedNSAutoreleasePool autorelease_pool;
-#endif
-
-      HandleCleanup();
-
-      // See GetWork for what delete_these_outside_lock is doing.
-      SequencedTask task;
-      TimeDelta wait_time;
-      std::vector<SequencedTask> delete_these_outside_lock;
-      GetWorkStatus status =
-          GetWork(&task, &wait_time, &delete_these_outside_lock);
-      if (status == GET_WORK_FOUND) {
-        TRACE_TASK_EXECUTION("SequencedWorkerPool::Inner::ThreadLoop", task);
-        TRACE_EVENT_WITH_FLOW0(TRACE_DISABLED_BY_DEFAULT("toplevel.flow"),
-            "SequencedWorkerPool::Inner::PostTask",
-            TRACE_ID_MANGLE(GetTaskTraceID(task, static_cast<void*>(this))),
-            TRACE_EVENT_FLAG_FLOW_IN);
-        int new_thread_id = WillRunWorkerTask(task);
-        {
-          AutoUnlock unlock(lock_);
-          // There may be more work available, so wake up another
-          // worker thread. (Technically not required, since we
-          // already get a signal for each new task, but it doesn't
-          // hurt.)
-          SignalHasWork();
-          DeleteWithoutLock(&delete_these_outside_lock, this_worker);
-
-          // Complete thread creation outside the lock if necessary.
-          if (new_thread_id)
-            FinishStartingAdditionalThread(new_thread_id);
-
-          this_worker->set_running_task_info(
-              SequenceToken(task.sequence_token_id), task.shutdown_behavior);
-
-          std::move(task.task).Run();
-
-          // Make sure our task is erased outside the lock for the
-          // same reason we do this with delete_these_oustide_lock.
-          // Also, do it before calling reset_running_task_info() so
-          // that sequence-checking from within the task's destructor
-          // still works.
-          DCHECK(!task.task);
-
-          this_worker->reset_running_task_info();
-        }
-        DidRunWorkerTask(task);  // Must be done inside the lock.
-      } else if (cleanup_state_ == CLEANUP_RUNNING) {
-        switch (status) {
-          case GET_WORK_WAIT: {
-              AutoUnlock unlock(lock_);
-              DeleteWithoutLock(&delete_these_outside_lock, this_worker);
-            }
-            break;
-          case GET_WORK_NOT_FOUND:
-            CHECK(delete_these_outside_lock.empty());
-            cleanup_state_ = CLEANUP_FINISHING;
-            cleanup_cv_.Broadcast();
-            break;
-          default:
-            NOTREACHED();
-        }
-      } else {
-        // When we're terminating and there's no more work, we can
-        // shut down, other workers can complete any pending or new tasks.
-        // We can get additional tasks posted after shutdown_called_ is set
-        // but only worker threads are allowed to post tasks at that time, and
-        // the workers responsible for posting those tasks will be available
-        // to run them. Also, there may be some tasks stuck behind running
-        // ones with the same sequence token, but additional threads won't
-        // help this case.
-        if (shutdown_called_ && blocking_shutdown_pending_task_count_ == 0) {
-          AutoUnlock unlock(lock_);
-          DeleteWithoutLock(&delete_these_outside_lock, this_worker);
-          break;
-        }
-
-        // No work was found, but there are tasks that need deletion. The
-        // deletion must happen outside of the lock.
-        if (delete_these_outside_lock.size()) {
-          AutoUnlock unlock(lock_);
-          DeleteWithoutLock(&delete_these_outside_lock, this_worker);
-
-          // Since the lock has been released, |status| may no longer be
-          // accurate. It might read GET_WORK_WAIT even if there are tasks
-          // ready to perform work. Jump to the top of the loop to recalculate
-          // |status|.
-          continue;
-        }
-
-        waiting_thread_count_++;
-
-        switch (status) {
-          case GET_WORK_NOT_FOUND:
-            has_work_cv_.Wait();
-            break;
-          case GET_WORK_WAIT:
-            has_work_cv_.TimedWait(wait_time);
-            break;
-          default:
-            NOTREACHED();
-        }
-        waiting_thread_count_--;
-      }
-      // |delete_these_outside_lock| should have been cleared via
-      // DeleteWithoutLock() above already.
-      DCHECK(delete_these_outside_lock.empty());
-    }
-  }  // Release lock_.
-
-  // We noticed we should exit. Wake up the next worker so it knows it should
-  // exit as well (because the Shutdown() code only signals once).
-  SignalHasWork();
-
-  // Possibly unblock shutdown.
-  can_shutdown_cv_.Signal();
-}
-
-void SequencedWorkerPool::Inner::DeleteWithoutLock(
-    std::vector<SequencedTask>* tasks_to_delete,
-    Worker* this_worker) {
-  while (!tasks_to_delete->empty()) {
-    const SequencedTask& deleted_task = tasks_to_delete->back();
-    this_worker->set_running_task_info(
-        SequenceToken(deleted_task.sequence_token_id),
-        deleted_task.shutdown_behavior);
-    tasks_to_delete->pop_back();
-  }
-  this_worker->reset_running_task_info();
-}
-
-void SequencedWorkerPool::Inner::HandleCleanup() {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-  lock_.AssertAcquired();
-  if (cleanup_state_ == CLEANUP_DONE)
-    return;
-  if (cleanup_state_ == CLEANUP_REQUESTED) {
-    // We win, we get to do the cleanup as soon as the others wise up and idle.
-    cleanup_state_ = CLEANUP_STARTING;
-    while (thread_being_created_ ||
-           cleanup_idlers_ != threads_.size() - 1) {
-      has_work_cv_.Signal();
-      cleanup_cv_.Wait();
-    }
-    cleanup_state_ = CLEANUP_RUNNING;
-    return;
-  }
-  if (cleanup_state_ == CLEANUP_STARTING) {
-    // Another worker thread is cleaning up, we idle here until thats done.
-    ++cleanup_idlers_;
-    cleanup_cv_.Broadcast();
-    while (cleanup_state_ != CLEANUP_FINISHING) {
-      cleanup_cv_.Wait();
-    }
-    --cleanup_idlers_;
-    cleanup_cv_.Broadcast();
-    return;
-  }
-  if (cleanup_state_ == CLEANUP_FINISHING) {
-    // We wait for all idlers to wake up prior to being DONE.
-    while (cleanup_idlers_ != 0) {
-      cleanup_cv_.Broadcast();
-      cleanup_cv_.Wait();
-    }
-    if (cleanup_state_ == CLEANUP_FINISHING) {
-      cleanup_state_ = CLEANUP_DONE;
-      cleanup_cv_.Signal();
-    }
-    return;
-  }
-}
-
-int SequencedWorkerPool::Inner::LockedGetNamedTokenID(
-    const std::string& name) {
-  lock_.AssertAcquired();
-  DCHECK(!name.empty());
-
-  std::map<std::string, int>::const_iterator found =
-      named_sequence_tokens_.find(name);
-  if (found != named_sequence_tokens_.end())
-    return found->second;  // Got an existing one.
-
-  // Create a new one for this name.
-  SequenceToken result = GetSequenceToken();
-  named_sequence_tokens_.insert(std::make_pair(name, result.id_));
-  return result.id_;
-}
-
-int64_t SequencedWorkerPool::Inner::LockedGetNextSequenceTaskNumber() {
-  lock_.AssertAcquired();
-  // We assume that we never create enough tasks to wrap around.
-  return next_sequence_task_number_++;
-}
-
-SequencedWorkerPool::Inner::GetWorkStatus SequencedWorkerPool::Inner::GetWork(
-    SequencedTask* task,
-    TimeDelta* wait_time,
-    std::vector<SequencedTask>* delete_these_outside_lock) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-  lock_.AssertAcquired();
-
-  // Find the next task with a sequence token that's not currently in use.
-  // If the token is in use, that means another thread is running something
-  // in that sequence, and we can't run it without going out-of-order.
-  //
-  // This algorithm is simple and fair, but inefficient in some cases. For
-  // example, say somebody schedules 1000 slow tasks with the same sequence
-  // number. We'll have to go through all those tasks each time we feel like
-  // there might be work to schedule. If this proves to be a problem, we
-  // should make this more efficient.
-  //
-  // One possible enhancement would be to keep a map from sequence ID to a
-  // list of pending but currently blocked SequencedTasks for that ID.
-  // When a worker finishes a task of one sequence token, it can pick up the
-  // next one from that token right away.
-  //
-  // This may lead to starvation if there are sufficient numbers of sequences
-  // in use. To alleviate this, we could add an incrementing priority counter
-  // to each SequencedTask. Then maintain a priority_queue of all runnable
-  // tasks, sorted by priority counter. When a sequenced task is completed
-  // we would pop the head element off of that tasks pending list and add it
-  // to the priority queue. Then we would run the first item in the priority
-  // queue.
-
-  GetWorkStatus status = GET_WORK_NOT_FOUND;
-  int unrunnable_tasks = 0;
-  PendingTaskSet::iterator i = pending_tasks_.begin();
-  // We assume that the loop below doesn't take too long and so we can just do
-  // a single call to TimeTicks::Now().
-  const TimeTicks current_time = TimeTicks::Now();
-  while (i != pending_tasks_.end()) {
-    if (!IsSequenceTokenRunnable(i->sequence_token_id)) {
-      unrunnable_tasks++;
-      ++i;
-      continue;
-    }
-
-    if (shutdown_called_ && i->shutdown_behavior != BLOCK_SHUTDOWN) {
-      // We're shutting down and the task we just found isn't blocking
-      // shutdown. Delete it and get more work.
-      //
-      // Note that we do not want to delete unrunnable tasks. Deleting a task
-      // can have side effects (like freeing some objects) and deleting a task
-      // that's supposed to run after one that's currently running could cause
-      // an obscure crash.
-      //
-      // We really want to delete these tasks outside the lock in case the
-      // closures are holding refs to objects that want to post work from their
-      // destructors (which would deadlock). The closures are internally
-      // refcounted, so we just need to keep a copy of them alive until the lock
-      // is exited. The calling code can just clear() the vector they passed to
-      // us once the lock is exited to make this happen.
-      //
-      // The const_cast here is safe since the object is erased from
-      // |pending_tasks_| soon after the move.
-      delete_these_outside_lock->push_back(
-          std::move(const_cast<SequencedTask&>(*i)));
-      pending_tasks_.erase(i++);
-      continue;
-    }
-
-    if (i->time_to_run > current_time) {
-      // The time to run has not come yet.
-      *wait_time = i->time_to_run - current_time;
-      status = GET_WORK_WAIT;
-      if (cleanup_state_ == CLEANUP_RUNNING) {
-        // Deferred tasks are deleted when cleaning up, see Inner::ThreadLoop.
-        // The const_cast here is safe since the object is erased from
-        // |pending_tasks_| soon after the move.
-        delete_these_outside_lock->push_back(
-            std::move(const_cast<SequencedTask&>(*i)));
-        pending_tasks_.erase(i);
-      }
-      break;
-    }
-
-    // Found a runnable task. The const_cast is safe here since the object is
-    // erased from |pending_tasks_| soon after the move.
-    *task = std::move(const_cast<SequencedTask&>(*i));
-    pending_tasks_.erase(i);
-    if (task->shutdown_behavior == BLOCK_SHUTDOWN) {
-      blocking_shutdown_pending_task_count_--;
-    }
-
-    status = GET_WORK_FOUND;
-    break;
-  }
-
-  return status;
-}
-
-int SequencedWorkerPool::Inner::WillRunWorkerTask(const SequencedTask& task) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-  lock_.AssertAcquired();
-
-  // Mark the task's sequence number as in use.
-  if (task.sequence_token_id)
-    current_sequences_.insert(task.sequence_token_id);
-
-  // Ensure that threads running tasks posted with either SKIP_ON_SHUTDOWN
-  // or BLOCK_SHUTDOWN will prevent shutdown until that task or thread
-  // completes.
-  if (task.shutdown_behavior != CONTINUE_ON_SHUTDOWN)
-    blocking_shutdown_thread_count_++;
-
-  // We just picked up a task. Since StartAdditionalThreadIfHelpful only
-  // creates a new thread if there is no free one, there is a race when posting
-  // tasks that many tasks could have been posted before a thread started
-  // running them, so only one thread would have been created. So we also check
-  // whether we should create more threads after removing our task from the
-  // queue, which also has the nice side effect of creating the workers from
-  // background threads rather than the main thread of the app.
-  //
-  // If another thread wasn't created, we want to wake up an existing thread
-  // if there is one waiting to pick up the next task.
-  //
-  // Note that we really need to do this *before* running the task, not
-  // after. Otherwise, if more than one task is posted, the creation of the
-  // second thread (since we only create one at a time) will be blocked by
-  // the execution of the first task, which could be arbitrarily long.
-  return PrepareToStartAdditionalThreadIfHelpful();
-}
-
-void SequencedWorkerPool::Inner::DidRunWorkerTask(const SequencedTask& task) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-  lock_.AssertAcquired();
-
-  if (task.shutdown_behavior != CONTINUE_ON_SHUTDOWN) {
-    DCHECK_GT(blocking_shutdown_thread_count_, 0u);
-    blocking_shutdown_thread_count_--;
-  }
-
-  if (task.sequence_token_id)
-    current_sequences_.erase(task.sequence_token_id);
-}
-
-bool SequencedWorkerPool::Inner::IsSequenceTokenRunnable(
-    int sequence_token_id) const {
-  DCHECK_NE(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
-
-  lock_.AssertAcquired();
-  return !sequence_token_id ||
-      current_sequences_.find(sequence_token_id) ==
-          current_sequences_.end();
-}
-
-int SequencedWorkerPool::Inner::PrepareToStartAdditionalThreadIfHelpful() {
-  DCHECK_NE(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
-
-  lock_.AssertAcquired();
-  // How thread creation works:
-  //
-  // We'de like to avoid creating threads with the lock held. However, we
-  // need to be sure that we have an accurate accounting of the threads for
-  // proper Joining and deltion on shutdown.
-  //
-  // We need to figure out if we need another thread with the lock held, which
-  // is what this function does. It then marks us as in the process of creating
-  // a thread. When we do shutdown, we wait until the thread_being_created_
-  // flag is cleared, which ensures that the new thread is properly added to
-  // all the data structures and we can't leak it. Once shutdown starts, we'll
-  // refuse to create more threads or they would be leaked.
-  //
-  // Note that this creates a mostly benign race condition on shutdown that
-  // will cause fewer workers to be created than one would expect. It isn't
-  // much of an issue in real life, but affects some tests. Since we only spawn
-  // one worker at a time, the following sequence of events can happen:
-  //
-  //  1. Main thread posts a bunch of unrelated tasks that would normally be
-  //     run on separate threads.
-  //  2. The first task post causes us to start a worker. Other tasks do not
-  //     cause a worker to start since one is pending.
-  //  3. Main thread initiates shutdown.
-  //  4. No more threads are created since the shutdown_called_ flag is set.
-  //
-  // The result is that one may expect that max_threads_ workers to be created
-  // given the workload, but in reality fewer may be created because the
-  // sequence of thread creation on the background threads is racing with the
-  // shutdown call.
-  if (!shutdown_called_ &&
-      !thread_being_created_ &&
-      cleanup_state_ == CLEANUP_DONE &&
-      threads_.size() < max_threads_ &&
-      waiting_thread_count_ == 0) {
-    // We could use an additional thread if there's work to be done.
-    for (PendingTaskSet::const_iterator i = pending_tasks_.begin();
-         i != pending_tasks_.end(); ++i) {
-      if (IsSequenceTokenRunnable(i->sequence_token_id)) {
-        // Found a runnable task, mark the thread as being started.
-        thread_being_created_ = true;
-        return static_cast<int>(threads_.size() + 1);
-      }
-    }
-  }
-  return 0;
-}
-
-void SequencedWorkerPool::Inner::FinishStartingAdditionalThread(
-    int thread_number) {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-
-  // Called outside of the lock.
-  DCHECK_GT(thread_number, 0);
-
-  // The worker is assigned to the list when the thread actually starts, which
-  // will manage the memory of the pointer.
-  new Worker(worker_pool_, thread_number, thread_name_prefix_);
-}
-
-void SequencedWorkerPool::Inner::SignalHasWork() {
-  DCHECK_NE(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
-
-  has_work_cv_.Signal();
-  if (testing_observer_) {
-    testing_observer_->OnHasWork();
-  }
-}
-
-bool SequencedWorkerPool::Inner::CanShutdown() const {
-  DCHECK_EQ(AllPoolsState::USE_WORKER_POOL, g_all_pools_state);
-  lock_.AssertAcquired();
-  // See PrepareToStartAdditionalThreadIfHelpful for how thread creation works.
-  return !thread_being_created_ &&
-         blocking_shutdown_thread_count_ == 0 &&
-         blocking_shutdown_pending_task_count_ == 0;
-}
-
-base::AtomicSequenceNumber SequencedWorkerPool::Inner::g_last_sequence_number_;
-
-// SequencedWorkerPool --------------------------------------------------------
-
-std::string SequencedWorkerPool::SequenceToken::ToString() const {
-  return base::StringPrintf("[%d]", id_);
-}
-
-// static
-SequencedWorkerPool::SequenceToken
-SequencedWorkerPool::GetSequenceTokenForCurrentThread() {
-  Worker* worker = Worker::GetForCurrentThread();
-  if (!worker)
-    return SequenceToken();
-
-  return worker->task_sequence_token();
-}
-
-// static
-scoped_refptr<SequencedWorkerPool>
-SequencedWorkerPool::GetWorkerPoolForCurrentThread() {
-  Worker* worker = Worker::GetForCurrentThread();
-  if (!worker)
-    return nullptr;
-
-  return worker->worker_pool();
-}
-
-// static
-void SequencedWorkerPool::EnableForProcess() {
-  // TODO(fdoray): Uncomment this line. It is initially commented to avoid a
-  // revert of the CL that adds debug::DumpWithoutCrashing() in case of
-  // waterfall failures.
-  // DCHECK_EQ(AllPoolsState::POST_TASK_DISABLED, g_all_pools_state);
-  g_all_pools_state = AllPoolsState::USE_WORKER_POOL;
-}
-
-// static
-void SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess() {
-  // TODO(fdoray): Uncomment this line. It is initially commented to avoid a
-  // revert of the CL that adds debug::DumpWithoutCrashing() in case of
-  // waterfall failures.
-  // DCHECK_EQ(AllPoolsState::POST_TASK_DISABLED, g_all_pools_state);
-  DCHECK(TaskScheduler::GetInstance());
-  g_all_pools_state = AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER;
-}
-
-// static
-void SequencedWorkerPool::DisableForProcessForTesting() {
-  g_all_pools_state = AllPoolsState::POST_TASK_DISABLED;
-}
-
-// static
-bool SequencedWorkerPool::IsEnabled() {
-  return g_all_pools_state != AllPoolsState::POST_TASK_DISABLED;
-}
-
-SequencedWorkerPool::SequencedWorkerPool(size_t max_threads,
-                                         const std::string& thread_name_prefix,
-                                         base::TaskPriority task_priority)
-    : constructor_task_runner_(SequencedTaskRunnerHandle::Get()),
-      inner_(new Inner(this,
-                       max_threads,
-                       thread_name_prefix,
-                       task_priority,
-                       nullptr)) {}
-
-SequencedWorkerPool::SequencedWorkerPool(size_t max_threads,
-                                         const std::string& thread_name_prefix,
-                                         base::TaskPriority task_priority,
-                                         TestingObserver* observer)
-    : constructor_task_runner_(SequencedTaskRunnerHandle::Get()),
-      inner_(new Inner(this,
-                       max_threads,
-                       thread_name_prefix,
-                       task_priority,
-                       observer)) {}
-
-SequencedWorkerPool::~SequencedWorkerPool() = default;
-
-void SequencedWorkerPool::OnDestruct() const {
-  // Avoid deleting ourselves on a worker thread (which would deadlock).
-  if (RunsTasksInCurrentSequence()) {
-    constructor_task_runner_->DeleteSoon(FROM_HERE, this);
-  } else {
-    delete this;
-  }
-}
-
-// static
-SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetSequenceToken() {
-  return Inner::GetSequenceToken();
-}
-
-SequencedWorkerPool::SequenceToken SequencedWorkerPool::GetNamedSequenceToken(
-    const std::string& name) {
-  return inner_->GetNamedSequenceToken(name);
-}
-
-scoped_refptr<SequencedTaskRunner> SequencedWorkerPool::GetSequencedTaskRunner(
-    SequenceToken token) {
-  return GetSequencedTaskRunnerWithShutdownBehavior(token, BLOCK_SHUTDOWN);
-}
-
-scoped_refptr<SequencedTaskRunner>
-SequencedWorkerPool::GetSequencedTaskRunnerWithShutdownBehavior(
-    SequenceToken token, WorkerShutdown shutdown_behavior) {
-  return new PoolSequencedTaskRunner(
-      this, token, shutdown_behavior);
-}
-
-scoped_refptr<TaskRunner>
-SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior(
-    WorkerShutdown shutdown_behavior) {
-  return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior);
-}
-
-bool SequencedWorkerPool::PostWorkerTask(const Location& from_here,
-                                         OnceClosure task) {
-  return inner_->PostTask(nullptr, SequenceToken(), BLOCK_SHUTDOWN, from_here,
-                          std::move(task), TimeDelta());
-}
-
-bool SequencedWorkerPool::PostWorkerTaskWithShutdownBehavior(
-    const Location& from_here,
-    OnceClosure task,
-    WorkerShutdown shutdown_behavior) {
-  return inner_->PostTask(nullptr, SequenceToken(), shutdown_behavior,
-                          from_here, std::move(task), TimeDelta());
-}
-
-bool SequencedWorkerPool::PostSequencedWorkerTask(SequenceToken sequence_token,
-                                                  const Location& from_here,
-                                                  OnceClosure task) {
-  return inner_->PostTask(nullptr, sequence_token, BLOCK_SHUTDOWN, from_here,
-                          std::move(task), TimeDelta());
-}
-
-bool SequencedWorkerPool::PostDelayedSequencedWorkerTask(
-    SequenceToken sequence_token,
-    const Location& from_here,
-    OnceClosure task,
-    TimeDelta delay) {
-  WorkerShutdown shutdown_behavior =
-      delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN;
-  return inner_->PostTask(nullptr, sequence_token, shutdown_behavior, from_here,
-                          std::move(task), delay);
-}
-
-bool SequencedWorkerPool::PostNamedSequencedWorkerTask(
-    const std::string& token_name,
-    const Location& from_here,
-    OnceClosure task) {
-  DCHECK(!token_name.empty());
-  return inner_->PostTask(&token_name, SequenceToken(), BLOCK_SHUTDOWN,
-                          from_here, std::move(task), TimeDelta());
-}
-
-bool SequencedWorkerPool::PostSequencedWorkerTaskWithShutdownBehavior(
-    SequenceToken sequence_token,
-    const Location& from_here,
-    OnceClosure task,
-    WorkerShutdown shutdown_behavior) {
-  return inner_->PostTask(nullptr, sequence_token, shutdown_behavior, from_here,
-                          std::move(task), TimeDelta());
-}
-
-bool SequencedWorkerPool::PostDelayedTask(const Location& from_here,
-                                          OnceClosure task,
-                                          TimeDelta delay) {
-  WorkerShutdown shutdown_behavior =
-      delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN;
-  return inner_->PostTask(nullptr, SequenceToken(), shutdown_behavior,
-                          from_here, std::move(task), delay);
-}
-
-bool SequencedWorkerPool::RunsTasksInCurrentSequence() const {
-  return inner_->RunsTasksOnCurrentThread();
-}
-
-void SequencedWorkerPool::FlushForTesting() {
-  DCHECK(!RunsTasksInCurrentSequence());
-  base::ThreadRestrictions::ScopedAllowWait allow_wait;
-  if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-    // TODO(gab): Remove this if http://crbug.com/622400 fails.
-    TaskScheduler::GetInstance()->FlushForTesting();
-  } else {
-    inner_->CleanupForTesting();
-  }
-}
-
-void SequencedWorkerPool::SignalHasWorkForTesting() {
-  inner_->SignalHasWorkForTesting();
-}
-
-void SequencedWorkerPool::Shutdown(int max_new_blocking_tasks_after_shutdown) {
-  DCHECK(constructor_task_runner_->RunsTasksInCurrentSequence());
-  inner_->Shutdown(max_new_blocking_tasks_after_shutdown);
-}
-
-bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread(
-    SequenceToken sequence_token) const {
-  return inner_->IsRunningSequenceOnCurrentThread(sequence_token);
-}
-
-}  // namespace base
diff --git a/base/threading/sequenced_worker_pool.h b/base/threading/sequenced_worker_pool.h
deleted file mode 100644
index 724c833..0000000
--- a/base/threading/sequenced_worker_pool.h
+++ /dev/null
@@ -1,385 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_THREADING_SEQUENCED_WORKER_POOL_H_
-#define BASE_THREADING_SEQUENCED_WORKER_POOL_H_
-
-#include <stddef.h>
-
-#include <cstddef>
-#include <memory>
-#include <string>
-
-#include "base/base_export.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "base/task_scheduler/task_traits.h"
-
-namespace base {
-
-class Location;
-class SequencedTaskRunner;
-
-template <class T> class DeleteHelper;
-
-// A worker thread pool that enforces ordering between sets of tasks. It also
-// allows you to specify what should happen to your tasks on shutdown.
-//
-// To enforce ordering, get a unique sequence token from the pool and post all
-// tasks you want to order with the token. All tasks with the same token are
-// guaranteed to execute serially, though not necessarily on the same thread.
-// This means that:
-//
-//   - No two tasks with the same token will run at the same time.
-//
-//   - Given two tasks T1 and T2 with the same token such that T2 will
-//     run after T1, then T2 will start after T1 is destroyed.
-//
-//   - If T2 will run after T1, then all memory changes in T1 and T1's
-//     destruction will be visible to T2.
-//
-// Example:
-//   SequencedWorkerPool::SequenceToken token = pool.GetSequenceToken();
-//   pool.PostSequencedWorkerTask(token, SequencedWorkerPool::SKIP_ON_SHUTDOWN,
-//                                FROM_HERE, base::Bind(...));
-//   pool.PostSequencedWorkerTask(token, SequencedWorkerPool::SKIP_ON_SHUTDOWN,
-//                                FROM_HERE, base::Bind(...));
-//
-// You can make named sequence tokens to make it easier to share a token
-// across different components.
-//
-// You can also post tasks to the pool without ordering using PostWorkerTask.
-// These will be executed in an unspecified order. The order of execution
-// between tasks with different sequence tokens is also unspecified.
-//
-// You must call EnableForProcess() or
-// EnableWithRedirectionToTaskSchedulerForProcess() before starting to post
-// tasks to a process' SequencedWorkerPools.
-//
-// This class may be leaked on shutdown to facilitate fast shutdown. The
-// expected usage, however, is to call Shutdown(), which correctly accounts
-// for CONTINUE_ON_SHUTDOWN behavior and is required for BLOCK_SHUTDOWN
-// behavior.
-//
-// Note that SequencedWorkerPool is RefCountedThreadSafe (inherited
-// from TaskRunner).
-//
-// Test-only code should wrap this in a base::SequencedWorkerPoolOwner to avoid
-// memory leaks. See http://crbug.com/273800
-class BASE_EXPORT SequencedWorkerPool : public TaskRunner {
- public:
-  // Defines what should happen to a task posted to the worker pool on
-  // shutdown.
-  enum WorkerShutdown {
-    // Tasks posted with this mode which have not run at shutdown will be
-    // deleted rather than run, and any tasks with this mode running at
-    // shutdown will be ignored (the worker thread will not be joined).
-    //
-    // This option provides a nice way to post stuff you don't want blocking
-    // shutdown. For example, you might be doing a slow DNS lookup and if it's
-    // blocked on the OS, you may not want to stop shutdown, since the result
-    // doesn't really matter at that point.
-    //
-    // However, you need to be very careful what you do in your callback when
-    // you use this option. Since the thread will continue to run until the OS
-    // terminates the process, the app can be in the process of tearing down
-    // when you're running. This means any singletons or global objects you
-    // use may suddenly become invalid out from under you. For this reason,
-    // it's best to use this only for slow but simple operations like the DNS
-    // example.
-    CONTINUE_ON_SHUTDOWN,
-
-    // Tasks posted with this mode that have not started executing at
-    // shutdown will be deleted rather than executed. However, any tasks that
-    // have already begun executing when shutdown is called will be allowed
-    // to continue, and will block shutdown until completion.
-    //
-    // Note: Because Shutdown() may block while these tasks are executing,
-    // care must be taken to ensure that they do not block on the thread that
-    // called Shutdown(), as this may lead to deadlock.
-    SKIP_ON_SHUTDOWN,
-
-    // Tasks posted with this mode will block shutdown until they're
-    // executed. Since this can have significant performance implications,
-    // use sparingly.
-    //
-    // Generally, this should be used only for user data, for example, a task
-    // writing a preference file.
-    //
-    // If a task is posted during shutdown, it will not get run since the
-    // workers may already be stopped. In this case, the post operation will
-    // fail (return false) and the task will be deleted.
-    BLOCK_SHUTDOWN,
-  };
-
-  // Opaque identifier that defines sequencing of tasks posted to the worker
-  // pool.
-  class BASE_EXPORT SequenceToken {
-   public:
-    SequenceToken() : id_(0) {}
-    ~SequenceToken() = default;
-
-    bool Equals(const SequenceToken& other) const {
-      return id_ == other.id_;
-    }
-
-    // Returns false if current thread is executing an unsequenced task.
-    bool IsValid() const {
-      return id_ != 0;
-    }
-
-    // Returns a string representation of this token. This method should only be
-    // used for debugging.
-    std::string ToString() const;
-
-   private:
-    friend class SequencedWorkerPool;
-
-    explicit SequenceToken(int id) : id_(id) {}
-
-    int id_;
-  };
-
-  // Allows tests to perform certain actions.
-  class TestingObserver {
-   public:
-    virtual ~TestingObserver() = default;
-    virtual void OnHasWork() = 0;
-    virtual void WillWaitForShutdown() = 0;
-    virtual void OnDestruct() = 0;
-  };
-
-  // Gets the SequencedToken of the current thread.
-  // If current thread is not a SequencedWorkerPool worker thread or is running
-  // an unsequenced task, returns an invalid SequenceToken.
-  static SequenceToken GetSequenceTokenForCurrentThread();
-
-  // Returns the SequencedWorkerPool that owns this thread, or null if the
-  // current thread is not a SequencedWorkerPool worker thread.
-  //
-  // Always returns nullptr when SequencedWorkerPool is redirected to
-  // TaskScheduler.
-  //
-  // DEPRECATED. Use SequencedTaskRunnerHandle::Get() instead. Consequentially
-  // the only remaining use case is in sequenced_task_runner_handle.cc to
-  // implement that and will soon be removed along with SequencedWorkerPool:
-  // http://crbug.com/622400.
-  static scoped_refptr<SequencedWorkerPool> GetWorkerPoolForCurrentThread();
-
-  // Returns a unique token that can be used to sequence tasks posted to
-  // PostSequencedWorkerTask(). Valid tokens are always nonzero.
-  static SequenceToken GetSequenceToken();
-
-  // Enables posting tasks to this process' SequencedWorkerPools. Cannot be
-  // called if already enabled. This is not thread-safe; proper synchronization
-  // is required to use any SequencedWorkerPool method after calling this.
-  static void EnableForProcess();
-
-  // Same as EnableForProcess(), but tasks are redirected to the registered
-  // TaskScheduler. There must be a registered TaskScheduler when this is
-  // called. TODO(gab): Phase out SequencedWorkerPool entirely:
-  // http://crbug.com/533920.
-  static void EnableWithRedirectionToTaskSchedulerForProcess();
-
-  // Disables posting tasks to this process' SequencedWorkerPools. Calling this
-  // while there are active SequencedWorkerPools is not supported. This is not
-  // thread-safe; proper synchronization is required to use any
-  // SequencedWorkerPool method after calling this.
-  static void DisableForProcessForTesting();
-
-  // Returns true if posting tasks to this process' SequencedWorkerPool is
-  // enabled (with or without redirection to TaskScheduler).
-  static bool IsEnabled();
-
-  // When constructing a SequencedWorkerPool, there must be a
-  // ThreadTaskRunnerHandle on the current thread unless you plan to
-  // deliberately leak it.
-
-  // Constructs a SequencedWorkerPool which will lazily create up to
-  // |max_threads| and a prefix for the thread name to aid in debugging.
-  // |max_threads| must be greater than 1. |task_priority| will be used to hint
-  // base::TaskScheduler for an experiment in which all SequencedWorkerPool
-  // tasks will be redirected to it in processes where a base::TaskScheduler was
-  // instantiated.
-  SequencedWorkerPool(size_t max_threads,
-                      const std::string& thread_name_prefix,
-                      base::TaskPriority task_priority);
-
-  // Like above, but with |observer| for testing.  Does not take ownership of
-  // |observer|.
-  SequencedWorkerPool(size_t max_threads,
-                      const std::string& thread_name_prefix,
-                      base::TaskPriority task_priority,
-                      TestingObserver* observer);
-
-  // Returns the sequence token associated with the given name. Calling this
-  // function multiple times with the same string will always produce the
-  // same sequence token. If the name has not been used before, a new token
-  // will be created.
-  SequenceToken GetNamedSequenceToken(const std::string& name);
-
-  // Returns a SequencedTaskRunner wrapper which posts to this
-  // SequencedWorkerPool using the given sequence token. Tasks with nonzero
-  // delay are posted with SKIP_ON_SHUTDOWN behavior and tasks with zero delay
-  // are posted with BLOCK_SHUTDOWN behavior.
-  scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunner(
-      SequenceToken token) WARN_UNUSED_RESULT;
-
-  // Returns a SequencedTaskRunner wrapper which posts to this
-  // SequencedWorkerPool using the given sequence token. Tasks with nonzero
-  // delay are posted with SKIP_ON_SHUTDOWN behavior and tasks with zero delay
-  // are posted with the given shutdown behavior.
-  scoped_refptr<SequencedTaskRunner> GetSequencedTaskRunnerWithShutdownBehavior(
-      SequenceToken token,
-      WorkerShutdown shutdown_behavior) WARN_UNUSED_RESULT;
-
-  // Returns a TaskRunner wrapper which posts to this SequencedWorkerPool using
-  // the given shutdown behavior. Tasks with nonzero delay are posted with
-  // SKIP_ON_SHUTDOWN behavior and tasks with zero delay are posted with the
-  // given shutdown behavior.
-  scoped_refptr<TaskRunner> GetTaskRunnerWithShutdownBehavior(
-      WorkerShutdown shutdown_behavior) WARN_UNUSED_RESULT;
-
-  // Posts the given task for execution in the worker pool. Tasks posted with
-  // this function will execute in an unspecified order on a background thread.
-  // Returns true if the task was posted. If your tasks have ordering
-  // requirements, see PostSequencedWorkerTask().
-  //
-  // This class will attempt to delete tasks that aren't run
-  // (non-block-shutdown semantics) but can't guarantee that this happens. If
-  // all worker threads are busy running CONTINUE_ON_SHUTDOWN tasks, there
-  // will be no workers available to delete these tasks. And there may be
-  // tasks with the same sequence token behind those CONTINUE_ON_SHUTDOWN
-  // tasks. Deleting those tasks before the previous one has completed could
-  // cause nondeterministic crashes because the task could be keeping some
-  // objects alive which do work in their destructor, which could voilate the
-  // assumptions of the running task.
-  //
-  // The task will be guaranteed to run to completion before shutdown
-  // (BLOCK_SHUTDOWN semantics).
-  //
-  // Returns true if the task was posted successfully. This may fail during
-  // shutdown regardless of the specified ShutdownBehavior.
-  bool PostWorkerTask(const Location& from_here, OnceClosure task);
-
-  // Same as PostWorkerTask but allows specification of the shutdown behavior.
-  bool PostWorkerTaskWithShutdownBehavior(const Location& from_here,
-                                          OnceClosure task,
-                                          WorkerShutdown shutdown_behavior);
-
-  // Like PostWorkerTask above, but provides sequencing semantics. This means
-  // that tasks posted with the same sequence token (see GetSequenceToken())
-  // are guaranteed to execute in order. This is useful in cases where you're
-  // doing operations that may depend on previous ones, like appending to a
-  // file.
-  //
-  // The task will be guaranteed to run to completion before shutdown
-  // (BLOCK_SHUTDOWN semantics).
-  //
-  // Returns true if the task was posted successfully. This may fail during
-  // shutdown regardless of the specified ShutdownBehavior.
-  bool PostSequencedWorkerTask(SequenceToken sequence_token,
-                               const Location& from_here,
-                               OnceClosure task);
-
-  // Like PostSequencedWorkerTask above, but allows you to specify a named
-  // token, which saves an extra call to GetNamedSequenceToken.
-  bool PostNamedSequencedWorkerTask(const std::string& token_name,
-                                    const Location& from_here,
-                                    OnceClosure task);
-
-  // Same as PostSequencedWorkerTask but allows a delay to be specified
-  // (although doing so changes the shutdown behavior). The task will be run
-  // after the given delay has elapsed.
-  //
-  // If the delay is nonzero, the task won't be guaranteed to run to completion
-  // before shutdown (SKIP_ON_SHUTDOWN semantics) to avoid shutdown hangs.
-  // If the delay is zero, this behaves exactly like PostSequencedWorkerTask,
-  // i.e. the task will be guaranteed to run to completion before shutdown
-  // (BLOCK_SHUTDOWN semantics).
-  bool PostDelayedSequencedWorkerTask(SequenceToken sequence_token,
-                                      const Location& from_here,
-                                      OnceClosure task,
-                                      TimeDelta delay);
-
-  // Same as PostSequencedWorkerTask but allows specification of the shutdown
-  // behavior.
-  bool PostSequencedWorkerTaskWithShutdownBehavior(
-      SequenceToken sequence_token,
-      const Location& from_here,
-      OnceClosure task,
-      WorkerShutdown shutdown_behavior);
-
-  // TaskRunner implementation. Forwards to PostDelayedWorkerTask().
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       TimeDelta delay) override;
-  bool RunsTasksInCurrentSequence() const override;
-
-  // Blocks until all pending tasks are complete. This should only be called in
-  // unit tests when you want to validate something that should have happened.
-  // Does not wait for delayed tasks. If redirection to TaskScheduler is
-  // disabled, delayed tasks are deleted. If redirection to TaskScheduler is
-  // enabled, this will wait for all tasks posted to TaskScheduler (not just
-  // tasks posted to this SequencedWorkerPool).
-  //
-  // Note that calling this will not prevent other threads from posting work to
-  // the queue while the calling thread is waiting on Flush(). In this case,
-  // Flush will return only when there's no more work in the queue. Normally,
-  // this doesn't come up since in a test, all the work is being posted from
-  // the main thread.
-  //
-  // TODO(gab): Remove mentions of TaskScheduler in this comment if
-  // http://crbug.com/622400 fails.
-  void FlushForTesting();
-
-  // Spuriously signal that there is work to be done.
-  void SignalHasWorkForTesting();
-
-  // Implements the worker pool shutdown. This should be called during app
-  // shutdown, and will discard/join with appropriate tasks before returning.
-  // After this call, subsequent calls to post tasks will fail.
-  //
-  // Must be called from the same thread this object was constructed on.
-  void Shutdown() { Shutdown(0); }
-
-  // A variant that allows an arbitrary number of new blocking tasks to be
-  // posted during shutdown. The tasks cannot be posted within the execution
-  // context of tasks whose shutdown behavior is not BLOCKING_SHUTDOWN. Once
-  // the limit is reached, subsequent calls to post task fail in all cases.
-  // Must be called from the same thread this object was constructed on.
-  void Shutdown(int max_new_blocking_tasks_after_shutdown);
-
- protected:
-  ~SequencedWorkerPool() override;
-
-  void OnDestruct() const override;
-
- private:
-  friend class RefCountedThreadSafe<SequencedWorkerPool>;
-  friend class DeleteHelper<SequencedWorkerPool>;
-
-  class Inner;
-  class PoolSequencedTaskRunner;
-  class Worker;
-
-  // Returns true if the current thread is processing a task with the given
-  // sequence_token.
-  bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const;
-
-  const scoped_refptr<SequencedTaskRunner> constructor_task_runner_;
-
-  // Avoid pulling in too many headers by putting (almost) everything
-  // into |inner_|.
-  const std::unique_ptr<Inner> inner_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPool);
-};
-
-}  // namespace base
-
-#endif  // BASE_THREADING_SEQUENCED_WORKER_POOL_H_
diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc
deleted file mode 100644
index 32ed912..0000000
--- a/base/threading/sequenced_worker_pool_unittest.cc
+++ /dev/null
@@ -1,1229 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/sequenced_worker_pool.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/stl_util.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/test/sequenced_task_runner_test_template.h"
-#include "base/test/sequenced_worker_pool_owner.h"
-#include "base/test/task_runner_test_template.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// IMPORTANT NOTE:
-//
-// Many of these tests have failure modes where they'll hang forever. These
-// tests should not be flaky, and hanging indicates a type of failure. Do not
-// mark as flaky if they're hanging, it's likely an actual bug.
-
-namespace {
-
-const size_t kNumWorkerThreads = 3;
-
-// Allows a number of threads to all be blocked on the same event, and
-// provides a way to unblock a certain number of them.
-class ThreadBlocker {
- public:
-  ThreadBlocker() : lock_(), cond_var_(&lock_), unblock_counter_(0) {}
-
-  void Block() {
-    {
-      base::AutoLock lock(lock_);
-      while (unblock_counter_ == 0)
-        cond_var_.Wait();
-      unblock_counter_--;
-    }
-    cond_var_.Signal();
-  }
-
-  void Unblock(size_t count) {
-    {
-      base::AutoLock lock(lock_);
-      DCHECK_EQ(unblock_counter_, 0u);
-      unblock_counter_ = count;
-    }
-    cond_var_.Signal();
-  }
-
- private:
-  base::Lock lock_;
-  base::ConditionVariable cond_var_;
-
-  size_t unblock_counter_;
-};
-
-class DestructionDeadlockChecker
-    : public base::RefCountedThreadSafe<DestructionDeadlockChecker> {
- public:
-  explicit DestructionDeadlockChecker(scoped_refptr<SequencedWorkerPool> pool)
-      : pool_(std::move(pool)) {}
-
- protected:
-  virtual ~DestructionDeadlockChecker() {
-    // This method should not deadlock.
-    pool_->RunsTasksInCurrentSequence();
-  }
-
- private:
-  scoped_refptr<SequencedWorkerPool> pool_;
-  friend class base::RefCountedThreadSafe<DestructionDeadlockChecker>;
-};
-
-class TestTracker : public base::RefCountedThreadSafe<TestTracker> {
- public:
-  TestTracker()
-      : lock_(),
-        cond_var_(&lock_),
-        started_events_(0) {
-  }
-
-  // Each of these tasks appends the argument to the complete sequence vector
-  // so calling code can see what order they finished in.
-  void FastTask(int id) {
-    SignalWorkerDone(id);
-  }
-
-  void SlowTask(int id) {
-    base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-    SignalWorkerDone(id);
-  }
-
-  void BlockTask(int id, ThreadBlocker* blocker) {
-    // Note that this task has started and signal anybody waiting for that
-    // to happen.
-    {
-      base::AutoLock lock(lock_);
-      started_events_++;
-    }
-    cond_var_.Signal();
-
-    blocker->Block();
-    SignalWorkerDone(id);
-  }
-
-  void PostAdditionalTasks(
-        int id, SequencedWorkerPool* pool,
-        bool expected_return_value) {
-    Closure fast_task = base::Bind(&TestTracker::FastTask, this, 100);
-    EXPECT_EQ(expected_return_value,
-              pool->PostWorkerTaskWithShutdownBehavior(
-                  FROM_HERE, fast_task,
-                  SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
-    EXPECT_EQ(expected_return_value,
-              pool->PostWorkerTaskWithShutdownBehavior(
-                  FROM_HERE, fast_task,
-                  SequencedWorkerPool::SKIP_ON_SHUTDOWN));
-    pool->PostWorkerTaskWithShutdownBehavior(
-        FROM_HERE, fast_task,
-        SequencedWorkerPool::BLOCK_SHUTDOWN);
-    SignalWorkerDone(id);
-  }
-
-  // This task posts itself back onto the SequencedWorkerPool before it
-  // finishes running. Each instance of the task maintains a strong reference
-  // to a DestructionDeadlockChecker. The DestructionDeadlockChecker is only
-  // destroyed when the task is destroyed without being run, which only happens
-  // during destruction of the SequencedWorkerPool.
-  void PostRepostingTask(
-      const scoped_refptr<SequencedWorkerPool>& pool,
-      const scoped_refptr<DestructionDeadlockChecker>& checker) {
-    Closure reposting_task =
-        base::Bind(&TestTracker::PostRepostingTask, this, pool, checker);
-    pool->PostWorkerTaskWithShutdownBehavior(
-        FROM_HERE, reposting_task, SequencedWorkerPool::SKIP_ON_SHUTDOWN);
-  }
-
-  // This task reposts itself back onto the SequencedWorkerPool before it
-  // finishes running.
-  void PostRepostingBlockingTask(
-      const scoped_refptr<SequencedWorkerPool>& pool,
-      const SequencedWorkerPool::SequenceToken& token) {
-    Closure reposting_task =
-        base::Bind(&TestTracker::PostRepostingBlockingTask, this, pool, token);
-    pool->PostSequencedWorkerTaskWithShutdownBehavior(token,
-        FROM_HERE, reposting_task, SequencedWorkerPool::BLOCK_SHUTDOWN);
-  }
-
-  void PostBlockingTaskThenUnblockThreads(
-      const scoped_refptr<SequencedWorkerPool>& pool,
-      ThreadBlocker* blocker,
-      size_t threads_to_wake) {
-    Closure arbitrary_task = base::Bind(&TestTracker::FastTask, this, 0);
-    pool->PostWorkerTaskWithShutdownBehavior(
-        FROM_HERE, arbitrary_task, SequencedWorkerPool::BLOCK_SHUTDOWN);
-    blocker->Unblock(threads_to_wake);
-  }
-
-  // Waits until the given number of tasks have started executing.
-  void WaitUntilTasksBlocked(size_t count) {
-    {
-      base::AutoLock lock(lock_);
-      while (started_events_ < count)
-        cond_var_.Wait();
-    }
-    cond_var_.Signal();
-  }
-
-  // Blocks the current thread until at least the given number of tasks are in
-  // the completed vector, and then returns a copy.
-  std::vector<int> WaitUntilTasksComplete(size_t num_tasks) {
-    std::vector<int> ret;
-    {
-      base::AutoLock lock(lock_);
-      while (complete_sequence_.size() < num_tasks)
-        cond_var_.Wait();
-      ret = complete_sequence_;
-    }
-    cond_var_.Signal();
-    return ret;
-  }
-
-  size_t GetTasksCompletedCount() {
-    base::AutoLock lock(lock_);
-    return complete_sequence_.size();
-  }
-
-  void ClearCompleteSequence() {
-    base::AutoLock lock(lock_);
-    complete_sequence_.clear();
-    started_events_ = 0;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<TestTracker>;
-  ~TestTracker() = default;
-
-  void SignalWorkerDone(int id) {
-    {
-      base::AutoLock lock(lock_);
-      complete_sequence_.push_back(id);
-    }
-    cond_var_.Signal();
-  }
-
-  // Protects the complete_sequence.
-  base::Lock lock_;
-
-  base::ConditionVariable cond_var_;
-
-  // Protected by lock_.
-  std::vector<int> complete_sequence_;
-
-  // Counter of the number of "block" workers that have started.
-  size_t started_events_;
-};
-
-enum class SequencedWorkerPoolRedirection { NONE, TO_TASK_SCHEDULER };
-
-class SequencedWorkerPoolTest
-    : public testing::TestWithParam<SequencedWorkerPoolRedirection> {
- public:
-  SequencedWorkerPoolTest()
-      : pool_owner_(new SequencedWorkerPoolOwner(kNumWorkerThreads, "test")),
-        tracker_(new TestTracker) {}
-
-  void SetUp() override {
-    if (RedirectedToTaskScheduler()) {
-      const SchedulerWorkerPoolParams worker_pool_params(
-          static_cast<int>(kNumWorkerThreads), TimeDelta::Max());
-      TaskScheduler::Create("SequencedWorkerPoolTest");
-      TaskScheduler::GetInstance()->Start(
-          {worker_pool_params, worker_pool_params, worker_pool_params,
-           worker_pool_params});
-
-      // Unit tests run in an environment where SequencedWorkerPool is enabled
-      // without redirection to TaskScheduler. For the current unit test,
-      // disable it and re-enable it with redirection to TaskScheduler.
-      SequencedWorkerPool::DisableForProcessForTesting();
-      SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess();
-    }
-  }
-
-  void TearDown() override {
-    // Wait until all references to the SequencedWorkerPool are gone and destroy
-    // it. This must be done before destroying the TaskScheduler. Otherwise, the
-    // SequencedWorkerPool could try to redirect tasks to a destroyed
-    // TaskScheduler.
-    DeletePool();
-
-    if (RedirectedToTaskScheduler()) {
-      // Reset SequencedWorkerPool to its original state (i.e. enabled without
-      // redirection to TaskScheduler).
-      SequencedWorkerPool::DisableForProcessForTesting();
-      SequencedWorkerPool::EnableForProcess();
-
-      // Delete the registered TaskScheduler.
-      DeleteTaskScheduler();
-    }
-  }
-
-  bool RedirectedToTaskScheduler() const {
-    return GetParam() == SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER;
-  }
-
-  const scoped_refptr<SequencedWorkerPool>& pool() {
-    return pool_owner_->pool();
-  }
-  TestTracker* tracker() { return tracker_.get(); }
-
-  // Waits until no tasks are running in the SequencedWorkerPool and no
-  // reference to it remain. Then, destroys the SequencedWorkerPool.
-  void DeletePool() { pool_owner_.reset(); }
-
-  // Destroys and unregisters the registered TaskScheduler, if any.
-  void DeleteTaskScheduler() {
-    if (TaskScheduler::GetInstance()) {
-      TaskScheduler::GetInstance()->FlushForTesting();
-      TaskScheduler::GetInstance()->JoinForTesting();
-      TaskScheduler::SetInstance(nullptr);
-    }
-  }
-
-  void SetWillWaitForShutdownCallback(const Closure& callback) {
-    pool_owner_->SetWillWaitForShutdownCallback(callback);
-  }
-
-  // Ensures that the given number of worker threads is created by adding
-  // tasks and waiting until they complete. Worker thread creation is
-  // serialized, can happen on background threads asynchronously, and doesn't
-  // happen any more at shutdown. This means that if a test posts a bunch of
-  // tasks and calls shutdown, fewer workers will be created than the test may
-  // expect.
-  //
-  // This function ensures that this condition can't happen so tests can make
-  // assumptions about the number of workers active. See the comment in
-  // PrepareToStartAdditionalThreadIfNecessary in the .cc file for more
-  // details.
-  //
-  // It will post tasks to the queue with id -1. It also assumes this is the
-  // first thing called in a test since it will clear the complete_sequence_.
-  void EnsureAllWorkersCreated() {
-    // Create a bunch of threads, all waiting. This will cause that may
-    // workers to be created.
-    ThreadBlocker blocker;
-    for (size_t i = 0; i < kNumWorkerThreads; i++) {
-      pool()->PostWorkerTask(
-          FROM_HERE,
-          base::BindOnce(&TestTracker::BlockTask, tracker(), -1, &blocker));
-    }
-    tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-    // Now wake them up and wait until they're done.
-    blocker.Unblock(kNumWorkerThreads);
-    tracker()->WaitUntilTasksComplete(kNumWorkerThreads);
-
-    // Clean up the task IDs we added.
-    tracker()->ClearCompleteSequence();
-  }
-
-  int has_work_call_count() const {
-    return pool_owner_->has_work_call_count();
-  }
-
- private:
-  MessageLoop message_loop_;
-  std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_;
-  const scoped_refptr<TestTracker> tracker_;
-};
-
-// Checks that the given number of entries are in the tasks to complete of
-// the given tracker, and then signals the given event the given number of
-// times. This is used to wake up blocked background threads before blocking
-// on shutdown.
-void EnsureTasksToCompleteCountAndUnblock(scoped_refptr<TestTracker> tracker,
-                                          size_t expected_tasks_to_complete,
-                                          ThreadBlocker* blocker,
-                                          size_t threads_to_awake) {
-  EXPECT_EQ(
-      expected_tasks_to_complete,
-      tracker->WaitUntilTasksComplete(expected_tasks_to_complete).size());
-
-  blocker->Unblock(threads_to_awake);
-}
-
-class DeletionHelper : public base::RefCountedThreadSafe<DeletionHelper> {
- public:
-  explicit DeletionHelper(
-      const scoped_refptr<base::RefCountedData<bool> >& deleted_flag)
-      : deleted_flag_(deleted_flag) {
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<DeletionHelper>;
-  virtual ~DeletionHelper() { deleted_flag_->data = true; }
-
-  const scoped_refptr<base::RefCountedData<bool> > deleted_flag_;
-  DISALLOW_COPY_AND_ASSIGN(DeletionHelper);
-};
-
-void ShouldNotRun(const scoped_refptr<DeletionHelper>& helper) {
-  ADD_FAILURE() << "Should never run";
-}
-
-// Tests that shutdown does not wait for delayed tasks.
-TEST_P(SequencedWorkerPoolTest, DelayedTaskDuringShutdown) {
-  // Post something to verify the pool is started up.
-  EXPECT_TRUE(pool()->PostTask(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 1)));
-
-  scoped_refptr<base::RefCountedData<bool> > deleted_flag(
-      new base::RefCountedData<bool>(false));
-
-  base::Time posted_at(base::Time::Now());
-  // Post something that shouldn't run.
-  EXPECT_TRUE(pool()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&ShouldNotRun,
-                     MakeRefCounted<DeletionHelper>(deleted_flag)),
-      TestTimeouts::action_timeout()));
-
-  std::vector<int> completion_sequence = tracker()->WaitUntilTasksComplete(1);
-  ASSERT_EQ(1u, completion_sequence.size());
-  ASSERT_EQ(1, completion_sequence[0]);
-
-  // Shutdown the pool.
-  pool()->Shutdown();
-  if (RedirectedToTaskScheduler())
-    TaskScheduler::GetInstance()->Shutdown();
-
-  // Verify that we didn't block until the task was due.
-  ASSERT_LT(base::Time::Now() - posted_at, TestTimeouts::action_timeout());
-
-  // TaskScheduler shouldn't delete the delayed task before it is itself
-  // deleted. SequencedWorkerPool starts deleting tasks as soon as its
-  // Shutdown() method is called (see SequencedWorkerPool::Inner::GetWork).
-  if (RedirectedToTaskScheduler())
-    EXPECT_FALSE(deleted_flag->data);
-
-  // Verify that the delayed task is deleted once the SequencedWorkerPool (and
-  // the TaskScheduler when applicable) have been deleted.
-  DeletePool();
-  if (RedirectedToTaskScheduler())
-    DeleteTaskScheduler();
-  EXPECT_TRUE(deleted_flag->data);
-}
-
-// Tests that same-named tokens have the same ID.
-TEST_P(SequencedWorkerPoolTest, NamedTokens) {
-  const std::string name1("hello");
-  SequencedWorkerPool::SequenceToken token1 =
-      pool()->GetNamedSequenceToken(name1);
-
-  SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
-
-  const std::string name3("goodbye");
-  SequencedWorkerPool::SequenceToken token3 =
-      pool()->GetNamedSequenceToken(name3);
-
-  // All 3 tokens should be different.
-  EXPECT_FALSE(token1.Equals(token2));
-  EXPECT_FALSE(token1.Equals(token3));
-  EXPECT_FALSE(token2.Equals(token3));
-
-  // Requesting the same name again should give the same value.
-  SequencedWorkerPool::SequenceToken token1again =
-      pool()->GetNamedSequenceToken(name1);
-  EXPECT_TRUE(token1.Equals(token1again));
-
-  SequencedWorkerPool::SequenceToken token3again =
-      pool()->GetNamedSequenceToken(name3);
-  EXPECT_TRUE(token3.Equals(token3again));
-}
-
-// Tests that posting a bunch of tasks (many more than the number of worker
-// threads) runs them all.
-TEST_P(SequencedWorkerPoolTest, LotsOfTasks) {
-  pool()->PostWorkerTask(FROM_HERE,
-                         base::BindOnce(&TestTracker::SlowTask, tracker(), 0));
-
-  const size_t kNumTasks = 20;
-  for (size_t i = 1; i < kNumTasks; i++) {
-    pool()->PostWorkerTask(
-        FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), i));
-  }
-
-  std::vector<int> result = tracker()->WaitUntilTasksComplete(kNumTasks);
-  EXPECT_EQ(kNumTasks, result.size());
-}
-
-// Tests that posting a bunch of tasks (many more than the number of
-// worker threads) to two pools simultaneously runs them all twice.
-// This test is meant to shake out any concurrency issues between
-// pools (like histograms).
-TEST_P(SequencedWorkerPoolTest, LotsOfTasksTwoPools) {
-  SequencedWorkerPoolOwner pool1(kNumWorkerThreads, "test1");
-  SequencedWorkerPoolOwner pool2(kNumWorkerThreads, "test2");
-
-  base::Closure slow_task = base::Bind(&TestTracker::SlowTask, tracker(), 0);
-  pool1.pool()->PostWorkerTask(FROM_HERE, slow_task);
-  pool2.pool()->PostWorkerTask(FROM_HERE, slow_task);
-
-  const size_t kNumTasks = 20;
-  for (size_t i = 1; i < kNumTasks; i++) {
-    base::Closure fast_task =
-        base::Bind(&TestTracker::FastTask, tracker(), i);
-    pool1.pool()->PostWorkerTask(FROM_HERE, fast_task);
-    pool2.pool()->PostWorkerTask(FROM_HERE, fast_task);
-  }
-
-  std::vector<int> result =
-      tracker()->WaitUntilTasksComplete(2*kNumTasks);
-  EXPECT_EQ(2 * kNumTasks, result.size());
-}
-
-// Test that tasks with the same sequence token are executed in order but don't
-// affect other tasks.
-TEST_P(SequencedWorkerPoolTest, Sequence) {
-  // Fill all the worker threads except one.
-  const size_t kNumBackgroundTasks = kNumWorkerThreads - 1;
-  ThreadBlocker background_blocker;
-  for (size_t i = 0; i < kNumBackgroundTasks; i++) {
-    pool()->PostWorkerTask(FROM_HERE,
-                           base::BindOnce(&TestTracker::BlockTask, tracker(), i,
-                                          &background_blocker));
-  }
-  tracker()->WaitUntilTasksBlocked(kNumBackgroundTasks);
-
-  // Create two tasks with the same sequence token, one that will block on the
-  // event, and one which will just complete quickly when it's run. Since there
-  // is one worker thread free, the first task will start and then block, and
-  // the second task should be waiting.
-  ThreadBlocker blocker;
-  SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
-  pool()->PostSequencedWorkerTask(
-      token1, FROM_HERE,
-      base::BindOnce(&TestTracker::BlockTask, tracker(), 100, &blocker));
-  pool()->PostSequencedWorkerTask(
-      token1, FROM_HERE,
-      base::BindOnce(&TestTracker::FastTask, tracker(), 101));
-  EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
-
-  // Create another two tasks as above with a different token. These will be
-  // blocked since there are no slots to run.
-  SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
-  pool()->PostSequencedWorkerTask(
-      token2, FROM_HERE,
-      base::BindOnce(&TestTracker::FastTask, tracker(), 200));
-  pool()->PostSequencedWorkerTask(
-      token2, FROM_HERE,
-      base::BindOnce(&TestTracker::FastTask, tracker(), 201));
-  EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
-
-  // Let one background task complete. This should then let both tasks of
-  // token2 run to completion in order. The second task of token1 should still
-  // be blocked.
-  background_blocker.Unblock(1);
-  std::vector<int> result = tracker()->WaitUntilTasksComplete(3);
-  ASSERT_EQ(3u, result.size());
-  EXPECT_EQ(200, result[1]);
-  EXPECT_EQ(201, result[2]);
-
-  // Finish the rest of the background tasks. This should leave some workers
-  // free with the second token1 task still blocked on the first.
-  background_blocker.Unblock(kNumBackgroundTasks - 1);
-  EXPECT_EQ(kNumBackgroundTasks + 2,
-            tracker()->WaitUntilTasksComplete(kNumBackgroundTasks + 2).size());
-
-  // Allow the first task of token1 to complete. This should run the second.
-  blocker.Unblock(1);
-  result = tracker()->WaitUntilTasksComplete(kNumBackgroundTasks + 4);
-  ASSERT_EQ(kNumBackgroundTasks + 4, result.size());
-  EXPECT_EQ(100, result[result.size() - 2]);
-  EXPECT_EQ(101, result[result.size() - 1]);
-}
-
-// Tests that any tasks posted after Shutdown are ignored.
-// Disabled for flakiness.  See http://crbug.com/166451.
-TEST_P(SequencedWorkerPoolTest, DISABLED_IgnoresAfterShutdown) {
-  // Start tasks to take all the threads and block them.
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-  for (size_t i = 0; i < kNumWorkerThreads; i++) {
-    pool()->PostWorkerTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
-                                                     tracker(), i, &blocker));
-  }
-  tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-  SetWillWaitForShutdownCallback(
-      base::Bind(&EnsureTasksToCompleteCountAndUnblock,
-                 scoped_refptr<TestTracker>(tracker()), 0,
-                 &blocker, kNumWorkerThreads));
-
-  // Shutdown the worker pool. This should discard all non-blocking tasks.
-  const int kMaxNewBlockingTasksAfterShutdown = 100;
-  pool()->Shutdown(kMaxNewBlockingTasksAfterShutdown);
-
-  int old_has_work_call_count = has_work_call_count();
-
-  std::vector<int> result =
-      tracker()->WaitUntilTasksComplete(kNumWorkerThreads);
-
-  // The kNumWorkerThread items should have completed, in no particular order.
-  ASSERT_EQ(kNumWorkerThreads, result.size());
-  for (size_t i = 0; i < kNumWorkerThreads; i++)
-    EXPECT_TRUE(ContainsValue(result, static_cast<int>(i)));
-
-  // No further tasks, regardless of shutdown mode, should be allowed.
-  EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 100),
-      SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
-  EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 101),
-      SequencedWorkerPool::SKIP_ON_SHUTDOWN));
-  EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 102),
-      SequencedWorkerPool::BLOCK_SHUTDOWN));
-
-  ASSERT_EQ(old_has_work_call_count, has_work_call_count());
-}
-
-TEST_P(SequencedWorkerPoolTest, AllowsAfterShutdown) {
-  // Test that <n> new blocking tasks are allowed provided they're posted
-  // by a running tasks.
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-
-  // Start tasks to take all the threads and block them.
-  const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads);
-  for (int i = 0; i < kNumBlockTasks; ++i) {
-    EXPECT_TRUE(pool()->PostWorkerTask(
-        FROM_HERE,
-        base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker)));
-  }
-  tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-  // Queue up shutdown blocking tasks behind those which will attempt to post
-  // additional tasks when run, PostAdditionalTasks attempts to post 3
-  // new FastTasks, one for each shutdown_behavior.
-  const int kNumQueuedTasks = static_cast<int>(kNumWorkerThreads);
-  for (int i = 0; i < kNumQueuedTasks; ++i) {
-    EXPECT_TRUE(pool()->PostWorkerTaskWithShutdownBehavior(
-        FROM_HERE,
-        base::BindOnce(&TestTracker::PostAdditionalTasks, tracker(), i,
-                       base::RetainedRef(pool()), false),
-        SequencedWorkerPool::BLOCK_SHUTDOWN));
-  }
-
-  // Half the additional blocking tasks will be allowed to run.
-  constexpr int kNumNewBlockingTasksToAllow = kNumWorkerThreads / 2;
-
-  if (RedirectedToTaskScheduler()) {
-    // When redirection to TaskScheduler is enabled,
-    // SequencedWorkerPool::Shutdown() sets the number of additional
-    // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for
-    // pending BLOCK_SHUTDOWN tasks to complete their execution.
-    pool()->Shutdown(kNumNewBlockingTasksToAllow);
-
-    // Unblock tasks.
-    EnsureTasksToCompleteCountAndUnblock(tracker(), 0, &blocker,
-                                         kNumBlockTasks);
-
-    // TaskScheduler::Shutdown() waits for pending BLOCK_SHUTDOWN tasks to
-    // complete their execution.
-    TaskScheduler::GetInstance()->Shutdown();
-  } else {
-    // Once shutdown starts, unblock tasks.
-    SetWillWaitForShutdownCallback(base::Bind(
-        &EnsureTasksToCompleteCountAndUnblock,
-        scoped_refptr<TestTracker>(tracker()), 0, &blocker, kNumBlockTasks));
-
-    // Set the number of additional BLOCK_SHUTDOWN tasks that can be posted and
-    // wait for pending BLOCK_SHUTDOWN tasks to complete their execution.
-    pool()->Shutdown(kNumNewBlockingTasksToAllow);
-  }
-
-  // Ensure that the correct number of tasks actually got run.
-  tracker()->WaitUntilTasksComplete(static_cast<size_t>(
-      kNumBlockTasks + kNumQueuedTasks + kNumNewBlockingTasksToAllow));
-
-  // Clean up the task IDs we added and go home.
-  tracker()->ClearCompleteSequence();
-}
-
-// Tests that blocking tasks can still be posted during shutdown, as long as
-// the task is not being posted within the context of a running task.
-TEST_P(SequencedWorkerPoolTest,
-       AllowsBlockingTasksDuringShutdownOutsideOfRunningTask) {
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-
-  // Start tasks to take all the threads and block them.
-  const int kNumBlockTasks = static_cast<int>(kNumWorkerThreads);
-  for (int i = 0; i < kNumBlockTasks; ++i) {
-    EXPECT_TRUE(pool()->PostWorkerTask(
-        FROM_HERE,
-        base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker)));
-  }
-  tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-  constexpr int kNumNewBlockingTasksToAllow = 1;
-
-  if (RedirectedToTaskScheduler()) {
-    // When redirection to TaskScheduler is enabled,
-    // SequencedWorkerPool::Shutdown() sets the number of additional
-    // BLOCK_SHUTDOWN tasks that can be posted and returns without waiting for
-    // pending BLOCK_SHUTDOWN tasks to complete their execution.
-    pool()->Shutdown(kNumNewBlockingTasksToAllow);
-
-    // Post a blocking task and unblock tasks.
-    tracker()->PostBlockingTaskThenUnblockThreads(pool(), &blocker,
-                                                  kNumWorkerThreads);
-
-    // TaskScheduler::Shutdown() waits for pending BLOCK_SHUTDOWN tasks to
-    // complete their execution.
-    TaskScheduler::GetInstance()->Shutdown();
-  } else {
-    // Once shutdown starts, post a blocking task and unblock tasks.
-    SetWillWaitForShutdownCallback(
-        base::Bind(&TestTracker::PostBlockingTaskThenUnblockThreads,
-                   scoped_refptr<TestTracker>(tracker()), pool(), &blocker,
-                   kNumWorkerThreads));
-
-    // Set the number of additional BLOCK_SHUTDOWN tasks that can be posted and
-    // wait for pending BLOCK_SHUTDOWN tasks to complete their execution.
-    pool()->Shutdown(kNumNewBlockingTasksToAllow);
-  }
-
-  // Ensure that the correct number of tasks actually got run.
-  tracker()->WaitUntilTasksComplete(
-      static_cast<size_t>(kNumWorkerThreads + kNumNewBlockingTasksToAllow));
-  tracker()->ClearCompleteSequence();
-}
-
-// Tests that unrun tasks are discarded properly according to their shutdown
-// mode.
-TEST_P(SequencedWorkerPoolTest, DiscardOnShutdown) {
-  // As tested by
-  // TaskSchedulerTaskTrackerTest.WillPostBeforeShutdownRunDuringShutdown, on
-  // shutdown, the TaskScheduler discards SKIP_ON_SHUTDOWN and
-  // CONTINUE_ON_SHUTDOWN tasks and runs BLOCK_SHUTDOWN tasks. However, since it
-  // doesn't provide a way to run a callback from inside its Shutdown() method,
-  // it would be hard to make this test work with redirection enabled.
-  if (RedirectedToTaskScheduler())
-    return;
-
-  // Start tasks to take all the threads and block them.
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-  for (size_t i = 0; i < kNumWorkerThreads; i++) {
-    pool()->PostWorkerTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
-                                                     tracker(), i, &blocker));
-  }
-  tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-  // Create some tasks with different shutdown modes.
-  pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 100),
-      SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
-  pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 101),
-      SequencedWorkerPool::SKIP_ON_SHUTDOWN);
-  pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 102),
-      SequencedWorkerPool::BLOCK_SHUTDOWN);
-
-  // Shutdown the worker pool. This should discard all non-blocking tasks.
-  SetWillWaitForShutdownCallback(
-      base::Bind(&EnsureTasksToCompleteCountAndUnblock,
-                 scoped_refptr<TestTracker>(tracker()), 0,
-                 &blocker, kNumWorkerThreads));
-  pool()->Shutdown();
-
-  std::vector<int> result =
-      tracker()->WaitUntilTasksComplete(kNumWorkerThreads + 1);
-
-  // The kNumWorkerThread items should have completed, plus the BLOCK_SHUTDOWN
-  // one, in no particular order.
-  ASSERT_EQ(kNumWorkerThreads + 1, result.size());
-  for (size_t i = 0; i < kNumWorkerThreads; i++)
-    EXPECT_TRUE(ContainsValue(result, static_cast<int>(i)));
-  EXPECT_TRUE(ContainsValue(result, 102));
-}
-
-// Tests that CONTINUE_ON_SHUTDOWN tasks don't block shutdown.
-TEST_P(SequencedWorkerPoolTest, ContinueOnShutdown) {
-  scoped_refptr<TaskRunner> runner(pool()->GetTaskRunnerWithShutdownBehavior(
-      SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
-  scoped_refptr<SequencedTaskRunner> sequenced_runner(
-      pool()->GetSequencedTaskRunnerWithShutdownBehavior(
-          pool()->GetSequenceToken(),
-          SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-  pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE,
-      base::BindOnce(&TestTracker::BlockTask, tracker(), 0, &blocker),
-      SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
-  runner->PostTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask, tracker(),
-                                             1, &blocker));
-  sequenced_runner->PostTask(FROM_HERE, base::BindOnce(&TestTracker::BlockTask,
-                                                       tracker(), 2, &blocker));
-
-  tracker()->WaitUntilTasksBlocked(3);
-
-  // This should not block. If this test hangs, it means it failed.
-  pool()->Shutdown();
-  if (RedirectedToTaskScheduler())
-    TaskScheduler::GetInstance()->Shutdown();
-
-  // The task should not have completed yet.
-  EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
-
-  // Posting more tasks should fail.
-  EXPECT_FALSE(pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0),
-      SequencedWorkerPool::CONTINUE_ON_SHUTDOWN));
-  EXPECT_FALSE(runner->PostTask(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0)));
-  EXPECT_FALSE(sequenced_runner->PostTask(
-      FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0)));
-
-  // Continue the background thread and make sure the tasks can complete.
-  blocker.Unblock(3);
-  std::vector<int> result = tracker()->WaitUntilTasksComplete(3);
-  EXPECT_EQ(3u, result.size());
-}
-
-// Tests that SKIP_ON_SHUTDOWN tasks that have been started block Shutdown
-// until they stop, but tasks not yet started do not.
-TEST_P(SequencedWorkerPoolTest, SkipOnShutdown) {
-  // As tested by
-  // TaskSchedulerTaskTrackerTest.WillPostAndRunLongTaskBeforeShutdown and
-  // TaskSchedulerTaskTrackerTest.WillPostBeforeShutdownRunDuringShutdown, the
-  // TaskScheduler correctly handles SKIP_ON_SHUTDOWN tasks. However, since it
-  // doesn't provide a way to run a callback from inside its Shutdown() method,
-  // it would be hard to make this test work with redirection enabled.
-  if (RedirectedToTaskScheduler())
-    return;
-
-  // Start tasks to take all the threads and block them.
-  EnsureAllWorkersCreated();
-  ThreadBlocker blocker;
-
-  // Now block all the threads with SKIP_ON_SHUTDOWN. Shutdown() should not
-  // return until these tasks have completed.
-  for (size_t i = 0; i < kNumWorkerThreads; i++) {
-    pool()->PostWorkerTaskWithShutdownBehavior(
-        FROM_HERE,
-        base::BindOnce(&TestTracker::BlockTask, tracker(), i, &blocker),
-        SequencedWorkerPool::SKIP_ON_SHUTDOWN);
-  }
-  tracker()->WaitUntilTasksBlocked(kNumWorkerThreads);
-
-  // Now post an additional task as SKIP_ON_SHUTDOWN, which should not be
-  // executed once Shutdown() has been called.
-  pool()->PostWorkerTaskWithShutdownBehavior(
-      FROM_HERE,
-      base::BindOnce(&TestTracker::BlockTask, tracker(), 0, &blocker),
-      SequencedWorkerPool::SKIP_ON_SHUTDOWN);
-
-  // This callback will only be invoked if SKIP_ON_SHUTDOWN tasks that have
-  // been started block shutdown.
-  SetWillWaitForShutdownCallback(
-      base::Bind(&EnsureTasksToCompleteCountAndUnblock,
-                 scoped_refptr<TestTracker>(tracker()), 0,
-                 &blocker, kNumWorkerThreads));
-
-  // No tasks should have completed yet.
-  EXPECT_EQ(0u, tracker()->WaitUntilTasksComplete(0).size());
-
-  // This should not block. If this test hangs, it means it failed.
-  pool()->Shutdown();
-
-  // Shutdown should not return until all of the tasks have completed.
-  std::vector<int> result =
-      tracker()->WaitUntilTasksComplete(kNumWorkerThreads);
-
-  // Only tasks marked SKIP_ON_SHUTDOWN that were already started should be
-  // allowed to complete. No additional non-blocking tasks should have been
-  // started.
-  ASSERT_EQ(kNumWorkerThreads, result.size());
-  for (size_t i = 0; i < kNumWorkerThreads; i++)
-    EXPECT_TRUE(ContainsValue(result, static_cast<int>(i)));
-}
-
-// Ensure all worker threads are created, and then trigger a spurious
-// work signal. This shouldn't cause any other work signals to be
-// triggered. This is a regression test for http://crbug.com/117469.
-TEST_P(SequencedWorkerPoolTest, SpuriousWorkSignal) {
-  // This test doesn't apply when tasks are redirected to the TaskScheduler.
-  if (RedirectedToTaskScheduler())
-    return;
-
-  EnsureAllWorkersCreated();
-  int old_has_work_call_count = has_work_call_count();
-  pool()->SignalHasWorkForTesting();
-  // This is inherently racy, but can only produce false positives.
-  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
-  EXPECT_EQ(old_has_work_call_count + 1, has_work_call_count());
-}
-
-void VerifyRunsTasksOnCurrentThread(
-    bool redirected_to_task_scheduler,
-    scoped_refptr<TaskRunner> test_positive_task_runner,
-    scoped_refptr<TaskRunner> test_negative_task_runner,
-    SequencedWorkerPool* pool,
-    SequencedWorkerPool* unused_pool) {
-  EXPECT_TRUE(test_positive_task_runner->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(test_negative_task_runner->RunsTasksInCurrentSequence());
-  EXPECT_TRUE(pool->RunsTasksInCurrentSequence());
-
-  // Tasks posted to different SequencedWorkerPools may run on the same
-  // TaskScheduler threads.
-  if (redirected_to_task_scheduler)
-    EXPECT_TRUE(unused_pool->RunsTasksInCurrentSequence());
-  else
-    EXPECT_FALSE(unused_pool->RunsTasksInCurrentSequence());
-}
-
-// Verify correctness of the RunsTasksOnCurrentThread() method on
-// SequencedWorkerPool and on TaskRunners it returns.
-TEST_P(SequencedWorkerPoolTest, RunsTasksOnCurrentThread) {
-  const scoped_refptr<SequencedTaskRunner> sequenced_task_runner_1 =
-      pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken());
-  const scoped_refptr<SequencedTaskRunner> sequenced_task_runner_2 =
-      pool()->GetSequencedTaskRunner(SequencedWorkerPool::GetSequenceToken());
-  const scoped_refptr<TaskRunner> unsequenced_task_runner =
-      pool()->GetTaskRunnerWithShutdownBehavior(
-          SequencedWorkerPool::BLOCK_SHUTDOWN);
-
-  SequencedWorkerPoolOwner unused_pool_owner(2, "unused_pool");
-
-  EXPECT_FALSE(pool()->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(sequenced_task_runner_1->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(sequenced_task_runner_2->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(unsequenced_task_runner->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(unused_pool_owner.pool()->RunsTasksInCurrentSequence());
-
-  // From a task posted to |sequenced_task_runner_1|:
-  // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns true.
-  // - sequenced_task_runner_2->RunsTasksOnCurrentThread() returns false.
-  // - pool()->RunsTasksOnCurrentThread() returns true.
-  // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false.
-  sequenced_task_runner_1->PostTask(
-      FROM_HERE,
-      base::BindOnce(&VerifyRunsTasksOnCurrentThread,
-                     RedirectedToTaskScheduler(), sequenced_task_runner_1,
-                     sequenced_task_runner_2, base::RetainedRef(pool()),
-                     base::RetainedRef(unused_pool_owner.pool())));
-  // From a task posted to |unsequenced_task_runner|:
-  // - unsequenced_task_runner->RunsTasksOnCurrentThread() returns true.
-  // - sequenced_task_runner_1->RunsTasksOnCurrentThread() returns false.
-  // - pool()->RunsTasksOnCurrentThread() returns true.
-  // - unused_pool_owner.pool()->RunsTasksOnCurrentThread() returns false.
-  unsequenced_task_runner->PostTask(
-      FROM_HERE,
-      base::BindOnce(&VerifyRunsTasksOnCurrentThread,
-                     RedirectedToTaskScheduler(), unsequenced_task_runner,
-                     sequenced_task_runner_1, base::RetainedRef(pool()),
-                     base::RetainedRef(unused_pool_owner.pool())));
-}
-
-// Checks that tasks are destroyed in the right context during shutdown. If a
-// task is destroyed while SequencedWorkerPool's global lock is held,
-// SequencedWorkerPool might deadlock.
-TEST_P(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) {
-  // Note: TaskScheduler destroys tasks when it is deleted rather than on
-  // shutdown. In production, it should never be destroyed.
-
-  for (int i = 0; i < 4; ++i) {
-    scoped_refptr<DestructionDeadlockChecker> checker(
-        new DestructionDeadlockChecker(pool()));
-    tracker()->PostRepostingTask(pool(), checker);
-  }
-
-  // Shutting down the pool should destroy the DestructionDeadlockCheckers,
-  // which in turn should not deadlock in their destructors.
-  pool()->Shutdown();
-}
-
-// Similar to the test AvoidsDeadlockOnShutdown, but there are now also
-// sequenced, blocking tasks in the queue during shutdown.
-TEST_P(SequencedWorkerPoolTest,
-       AvoidsDeadlockOnShutdownWithSequencedBlockingTasks) {
-  // This test continuously posts BLOCK_SHUTDOWN tasks
-  // (PostRepostingBlockingTask). It can't run when tasks are redirected to
-  // TaskScheduler because TaskScheduler doesn't provide a way to limit the
-  // number of BLOCK_SHUTDOWN tasks posted during shutdown.
-  if (RedirectedToTaskScheduler())
-    return;
-
-  const std::string sequence_token_name("name");
-  for (int i = 0; i < 4; ++i) {
-    scoped_refptr<DestructionDeadlockChecker> checker(
-        new DestructionDeadlockChecker(pool()));
-    tracker()->PostRepostingTask(pool(), checker);
-
-    SequencedWorkerPool::SequenceToken token1 =
-        pool()->GetNamedSequenceToken(sequence_token_name);
-    tracker()->PostRepostingBlockingTask(pool(), token1);
-  }
-
-  // Shutting down the pool should destroy the DestructionDeadlockCheckers,
-  // which in turn should not deadlock in their destructors.
-  pool()->Shutdown();
-}
-
-// Verify that FlushForTesting works as intended.
-TEST_P(SequencedWorkerPoolTest, FlushForTesting) {
-  // Should be fine to call on a new instance.
-  pool()->FlushForTesting();
-
-  // Queue up a bunch of work, including  a long delayed task and
-  // a task that produces additional tasks as an artifact.
-  pool()->PostDelayedTask(FROM_HERE,
-                          base::BindOnce(&TestTracker::FastTask, tracker(), 0),
-                          TimeDelta::FromMinutes(5));
-  pool()->PostWorkerTask(FROM_HERE,
-                         base::BindOnce(&TestTracker::SlowTask, tracker(), 0));
-  const size_t kNumFastTasks = 20;
-  for (size_t i = 0; i < kNumFastTasks; i++) {
-    pool()->PostWorkerTask(
-        FROM_HERE, base::BindOnce(&TestTracker::FastTask, tracker(), 0));
-  }
-  pool()->PostWorkerTask(
-      FROM_HERE, base::BindOnce(&TestTracker::PostAdditionalTasks, tracker(), 0,
-                                base::RetainedRef(pool()), true));
-
-  // We expect all except the delayed task to have been run. We verify all
-  // closures have been deleted by looking at the refcount of the
-  // tracker.
-  EXPECT_FALSE(tracker()->HasOneRef());
-  pool()->FlushForTesting();
-  EXPECT_EQ(1 + kNumFastTasks + 1 + 3, tracker()->GetTasksCompletedCount());
-  // TaskScheduler deletes unexecuted delayed tasks as part of ~TaskScheduler()
-  // instead of TaskScheduler::FlushForTesting().
-  EXPECT_EQ(!RedirectedToTaskScheduler(), tracker()->HasOneRef());
-
-  // Should be fine to call on an idle instance with all threads created, and
-  // spamming the method shouldn't deadlock or confuse the class.
-  pool()->FlushForTesting();
-  pool()->FlushForTesting();
-
-  // Should be fine to call after shutdown too.
-  pool()->Shutdown();
-  if (RedirectedToTaskScheduler())
-    TaskScheduler::GetInstance()->Shutdown();
-  pool()->FlushForTesting();
-
-  // Verify that all tasks are deleted once the SequencedWorkerPool and the
-  // TaskScheduler are deleted.
-  DeletePool();
-  if (RedirectedToTaskScheduler())
-    DeleteTaskScheduler();
-  EXPECT_TRUE(tracker()->HasOneRef());
-}
-
-namespace {
-
-void CheckWorkerPoolAndSequenceToken(
-      const scoped_refptr<SequencedWorkerPool>& expected_pool,
-    SequencedWorkerPool::SequenceToken expected_token) {
-  SequencedWorkerPool::SequenceToken token =
-      SequencedWorkerPool::GetSequenceTokenForCurrentThread();
-  EXPECT_EQ(expected_token.ToString(), token.ToString());
-
-  scoped_refptr<SequencedWorkerPool> pool =
-      SequencedWorkerPool::GetWorkerPoolForCurrentThread();
-  EXPECT_EQ(expected_pool, pool);
-}
-
-}  // namespace
-
-TEST_P(SequencedWorkerPoolTest, GetWorkerPoolAndSequenceTokenForCurrentThread) {
-  // GetSequenceTokenForCurrentThread() and GetWorkerPoolForCurrentThread()
-  // respectively return an invalid token and nullptr from a task posted to a
-  // SequencedWorkerPool when redirection to TaskScheduler is enabled. These
-  // methods are only used from SequencedTaskRunnerHandle and
-  // SequenceCheckerImpl which work fine in TaskScheduler.
-  if (RedirectedToTaskScheduler())
-    return;
-
-  EnsureAllWorkersCreated();
-
-  // The current thread should have neither a worker pool nor a sequence token.
-  SequencedWorkerPool::SequenceToken local_token =
-      SequencedWorkerPool::GetSequenceTokenForCurrentThread();
-  scoped_refptr<SequencedWorkerPool> local_pool =
-      SequencedWorkerPool::GetWorkerPoolForCurrentThread();
-  EXPECT_FALSE(local_token.IsValid()) << local_token.ToString();
-  EXPECT_FALSE(local_pool);
-
-  SequencedWorkerPool::SequenceToken token1 = pool()->GetSequenceToken();
-  SequencedWorkerPool::SequenceToken token2 = pool()->GetSequenceToken();
-  pool()->PostSequencedWorkerTask(
-      token1, FROM_HERE,
-      base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(), token1));
-  pool()->PostSequencedWorkerTask(
-      token2, FROM_HERE,
-      base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(), token2));
-
-  pool()->PostWorkerTask(
-      FROM_HERE, base::BindOnce(&CheckWorkerPoolAndSequenceToken, pool(),
-                                SequencedWorkerPool::SequenceToken()));
-
-  pool()->FlushForTesting();
-}
-
-TEST_P(SequencedWorkerPoolTest, ShutsDownCleanWithContinueOnShutdown) {
-  scoped_refptr<SequencedTaskRunner> task_runner =
-      pool()->GetSequencedTaskRunnerWithShutdownBehavior(
-          pool()->GetSequenceToken(),
-          base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
-
-  // Upon test exit, should shut down without hanging.
-  pool()->Shutdown();
-}
-
-INSTANTIATE_TEST_CASE_P(
-    NoRedirection,
-    SequencedWorkerPoolTest,
-    ::testing::Values(SequencedWorkerPoolRedirection::NONE));
-INSTANTIATE_TEST_CASE_P(
-    RedirectionToTaskScheduler,
-    SequencedWorkerPoolTest,
-    ::testing::Values(SequencedWorkerPoolRedirection::TO_TASK_SCHEDULER));
-
-class SequencedWorkerPoolTaskRunnerTestDelegate {
- public:
-  SequencedWorkerPoolTaskRunnerTestDelegate() = default;
-
-  ~SequencedWorkerPoolTaskRunnerTestDelegate() = default;
-
-  void StartTaskRunner() {
-    pool_owner_.reset(
-        new SequencedWorkerPoolOwner(10, "SequencedWorkerPoolTaskRunnerTest"));
-  }
-
-  scoped_refptr<SequencedWorkerPool> GetTaskRunner() {
-    return pool_owner_->pool();
-  }
-
-  void StopTaskRunner() {
-    // Make sure all tasks are run before shutting down. Delayed tasks are
-    // not run, they're simply deleted.
-    pool_owner_->pool()->FlushForTesting();
-    pool_owner_->pool()->Shutdown();
-    // Don't reset |pool_owner_| here, as the test may still hold a
-    // reference to the pool.
-  }
-
- private:
-  MessageLoop message_loop_;
-  std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_;
-};
-
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPool, TaskRunnerTest,
-    SequencedWorkerPoolTaskRunnerTestDelegate);
-INSTANTIATE_TYPED_TEST_CASE_P(SequencedWorkerPool, TaskRunnerAffinityTest,
-                              SequencedWorkerPoolTaskRunnerTestDelegate);
-
-class SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate {
- public:
-  SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate() = default;
-
-  ~SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate() = default;
-
-  void StartTaskRunner() {
-    pool_owner_.reset(
-        new SequencedWorkerPoolOwner(10, "SequencedWorkerPoolTaskRunnerTest"));
-    task_runner_ = pool_owner_->pool()->GetTaskRunnerWithShutdownBehavior(
-        SequencedWorkerPool::BLOCK_SHUTDOWN);
-  }
-
-  scoped_refptr<TaskRunner> GetTaskRunner() {
-    return task_runner_;
-  }
-
-  void StopTaskRunner() {
-    // Make sure all tasks are run before shutting down. Delayed tasks are
-    // not run, they're simply deleted.
-    pool_owner_->pool()->FlushForTesting();
-    pool_owner_->pool()->Shutdown();
-    // Don't reset |pool_owner_| here, as the test may still hold a
-    // reference to the pool.
-  }
-
- private:
-  MessageLoop message_loop_;
-  std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_;
-  scoped_refptr<TaskRunner> task_runner_;
-};
-
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolTaskRunner, TaskRunnerTest,
-    SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate);
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolTaskRunner, TaskRunnerAffinityTest,
-    SequencedWorkerPoolTaskRunnerWithShutdownBehaviorTestDelegate);
-
-class SequencedWorkerPoolSequencedTaskRunnerTestDelegate {
- public:
-  SequencedWorkerPoolSequencedTaskRunnerTestDelegate() = default;
-
-  ~SequencedWorkerPoolSequencedTaskRunnerTestDelegate() = default;
-
-  void StartTaskRunner() {
-    pool_owner_.reset(new SequencedWorkerPoolOwner(
-        10, "SequencedWorkerPoolSequencedTaskRunnerTest"));
-    task_runner_ = pool_owner_->pool()->GetSequencedTaskRunner(
-        pool_owner_->pool()->GetSequenceToken());
-  }
-
-  scoped_refptr<SequencedTaskRunner> GetTaskRunner() {
-    return task_runner_;
-  }
-
-  void StopTaskRunner() {
-    // Make sure all tasks are run before shutting down. Delayed tasks are
-    // not run, they're simply deleted.
-    pool_owner_->pool()->FlushForTesting();
-    pool_owner_->pool()->Shutdown();
-    // Don't reset |pool_owner_| here, as the test may still hold a
-    // reference to the pool.
-  }
-
- private:
-  MessageLoop message_loop_;
-  std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_;
-  scoped_refptr<SequencedTaskRunner> task_runner_;
-};
-
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolSequencedTaskRunner, TaskRunnerTest,
-    SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolSequencedTaskRunner, TaskRunnerAffinityTest,
-    SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
-
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolSequencedTaskRunner, SequencedTaskRunnerTest,
-    SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
-INSTANTIATE_TYPED_TEST_CASE_P(
-    SequencedWorkerPoolSequencedTaskRunner,
-    SequencedTaskRunnerDelayedTest,
-    SequencedWorkerPoolSequencedTaskRunnerTestDelegate);
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index 239fa2485..7090f2a 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -139,7 +139,6 @@
 }
 
 class GetAppOutputScopedAllowBaseSyncPrimitives;
-class SequencedWorkerPool;
 class SimpleThread;
 class StackSamplingProfiler;
 class Thread;
@@ -420,7 +419,6 @@
   friend class remoting::AutoThread;
   friend class ui::WindowResizeHelperMac;
   friend class MessagePumpDefault;
-  friend class SequencedWorkerPool;
   friend class SimpleThread;
   friend class Thread;
   friend class ThreadTestHelper;
diff --git a/base/tools_sanity_unittest.cc b/base/tools_sanity_unittest.cc
index a01d07bd..fbe1d2f 100644
--- a/base/tools_sanity_unittest.cc
+++ b/base/tools_sanity_unittest.cc
@@ -9,7 +9,7 @@
 #include <stddef.h>
 
 #include "base/atomicops.h"
-#include "base/cfi_flags.h"
+#include "base/cfi_buildflags.h"
 #include "base/debug/asan_invalid_access.h"
 #include "base/debug/profiler.h"
 #include "base/message_loop/message_loop.h"
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker.cc b/base/trace_event/heap_profiler_allocation_context_tracker.cc
index b974ee2..a375d3b9 100644
--- a/base/trace_event/heap_profiler_allocation_context_tracker.cc
+++ b/base/trace_event/heap_profiler_allocation_context_tracker.cc
@@ -8,7 +8,7 @@
 #include <iterator>
 
 #include "base/atomicops.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/leak_annotations.h"
 #include "base/debug/stack_trace.h"
 #include "base/no_destructor.h"
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc
index ffd51913..78d4b83 100644
--- a/base/trace_event/malloc_dump_provider.cc
+++ b/base/trace_event/malloc_dump_provider.cc
@@ -10,7 +10,7 @@
 
 #include "base/allocator/allocator_extension.h"
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/debug/profiler.h"
 #include "base/trace_event/heap_profiler_allocation_context.h"
 #include "base/trace_event/heap_profiler_allocation_context_tracker.h"
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index 33291032..9692671 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -11,7 +11,7 @@
 #include <memory>
 #include <utility>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/debug/alias.h"
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index 48546cfce..15b43508 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -10,7 +10,7 @@
 #include <utility>
 #include <vector>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/base_switches.h"
 #include "base/callback.h"
 #include "base/command_line.h"
diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
index 7a524af7..d1f3fc6 100644
--- a/base/trace_event/trace_event.h
+++ b/base/trace_event/trace_event.h
@@ -15,7 +15,7 @@
 #include <string>
 
 #include "base/atomicops.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "base/trace_event/common/trace_event_common.h"
diff --git a/base/win/BUILD.gn b/base/win/BUILD.gn
index 1d9210c..19c2982 100644
--- a/base/win/BUILD.gn
+++ b/base/win/BUILD.gn
@@ -16,10 +16,12 @@
   single_module_mode_handle_verifier = true
 }
 
-buildflag_header("base_win_features") {
-  header = "base_features.h"
+buildflag_header("base_win_buildflags") {
+  header = "base_win_buildflags.h"
   header_dir = "base/win"
-  flags = [ "SINGLE_MODULE_MODE_HANDLE_VERIFIER=$single_module_mode_handle_verifier" ]
+  flags = [
+    "SINGLE_MODULE_MODE_HANDLE_VERIFIER=$single_module_mode_handle_verifier",
+  ]
 }
 
 static_library("pe_image") {
diff --git a/base/win/scoped_handle_test_dll.cc b/base/win/scoped_handle_test_dll.cc
index b019251..75484aa4 100644
--- a/base/win/scoped_handle_test_dll.cc
+++ b/base/win/scoped_handle_test_dll.cc
@@ -6,7 +6,7 @@
 
 #include <vector>
 
-#include "base/win/base_features.h"
+#include "base/win/base_win_buildflags.h"
 #include "base/win/current_module.h"
 #include "base/win/scoped_handle.h"
 #include "base/win/scoped_handle_verifier.h"
diff --git a/base/win/scoped_handle_verifier.cc b/base/win/scoped_handle_verifier.cc
index a9fb8d5..191a240 100644
--- a/base/win/scoped_handle_verifier.cc
+++ b/base/win/scoped_handle_verifier.cc
@@ -12,7 +12,7 @@
 #include "base/debug/alias.h"
 #include "base/debug/stack_trace.h"
 #include "base/synchronization/lock_impl.h"
-#include "base/win/base_features.h"
+#include "base/win/base_win_buildflags.h"
 #include "base/win/current_module.h"
 
 extern "C" {
diff --git a/build/android/gyp/apkbuilder.py b/build/android/gyp/apkbuilder.py
index 1aadf2b2..97a514a 100755
--- a/build/android/gyp/apkbuilder.py
+++ b/build/android/gyp/apkbuilder.py
@@ -242,9 +242,6 @@
   def on_stale_md5():
     tmp_apk = options.output_apk + '.tmp'
     try:
-      # TODO(agrieve): It would be more efficient to combine this step
-      # with finalize_apk(), which sometimes aligns and uncompresses the
-      # native libraries.
       with zipfile.ZipFile(options.resource_apk) as resource_apk, \
            zipfile.ZipFile(tmp_apk, 'w', zipfile.ZIP_DEFLATED) as out_apk:
         def copy_resource(zipinfo):
diff --git a/build/android/gyp/finalize_apk.py b/build/android/gyp/finalize_apk.py
index ecb5ebfe..694e4db 100755
--- a/build/android/gyp/finalize_apk.py
+++ b/build/android/gyp/finalize_apk.py
@@ -3,121 +3,59 @@
 # Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
-"""Signs and zipaligns APK.
+"""Signs and aligns an APK."""
 
-"""
-
-import optparse
-import os
+import argparse
 import shutil
-import sys
+import subprocess
 import tempfile
-import zipfile
-
-# resource_sizes modifies zipfile for zip64 compatibility. See
-# https://bugs.python.org/issue14315.
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir))
-import resource_sizes  # pylint: disable=unused-import
-
-from util import build_utils
 
 
-def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path):
-  shutil.copy(unsigned_path, signed_path)
-  sign_cmd = [
-      'jarsigner',
-      '-sigalg', 'MD5withRSA',
-      '-digestalg', 'SHA1',
-      '-keystore', key_path,
-      '-storepass', key_passwd,
-      signed_path,
-      key_name,
-    ]
-  build_utils.CheckOutput(sign_cmd)
+def FinalizeApk(apksigner_path, zipalign_path, unsigned_apk_path,
+                final_apk_path, key_path, key_passwd, key_name):
+  # Use a tempfile so that Ctrl-C does not leave the file with a fresh mtime
+  # and a corrupted state.
+  with tempfile.NamedTemporaryFile() as staging_file:
+    # v2 signing requires that zipalign happen first.
+    subprocess.check_output([
+        zipalign_path, '-p', '-f', '4',
+        unsigned_apk_path, staging_file.name])
+    subprocess.check_output([
+        apksigner_path, 'sign',
+        '--in', staging_file.name,
+        '--out', staging_file.name,
+        '--ks', key_path,
+        '--ks-key-alias', key_name,
+        '--ks-pass', 'pass:' + key_passwd,
+        # Force SHA-1 (makes signing faster; insecure is fine for local builds).
+        '--min-sdk-version', '1',
+    ])
+    shutil.move(staging_file.name, final_apk_path)
+    staging_file.delete = False
 
 
-def AlignApk(zipalign_path, unaligned_path, final_path):
-  # Note -p will page align native libraries (files ending with .so), but
-  # only those that are stored uncompressed.
-  align_cmd = [
-      zipalign_path,
-      '-p',
-      '-f',
-      ]
+def main():
+  parser = argparse.ArgumentParser()
 
-
-  align_cmd += [
-      '4',  # 4 bytes
-      unaligned_path,
-      final_path,
-      ]
-  build_utils.CheckOutput(align_cmd)
-
-
-def main(args):
-  args = build_utils.ExpandFileArgs(args)
-
-  parser = optparse.OptionParser()
-  build_utils.AddDepfileOption(parser)
-
-  parser.add_option('--zipalign-path', help='Path to the zipalign tool.')
-  parser.add_option('--unsigned-apk-path', help='Path to input unsigned APK.')
-  parser.add_option('--final-apk-path',
-      help='Path to output signed and aligned APK.')
-  parser.add_option('--key-path', help='Path to keystore for signing.')
-  parser.add_option('--key-passwd', help='Keystore password')
-  parser.add_option('--key-name', help='Keystore name')
-
-  options, _ = parser.parse_args()
-
-  input_paths = [
-    options.unsigned_apk_path,
-    options.key_path,
-  ]
-
-  input_strings = [
-    options.key_name,
-    options.key_passwd,
-  ]
-
-  build_utils.CallAndWriteDepfileIfStale(
-      lambda: FinalizeApk(options),
-      options,
-      record_path=options.unsigned_apk_path + '.finalize.md5.stamp',
-      input_paths=input_paths,
-      input_strings=input_strings,
-      output_paths=[options.final_apk_path])
-
-
-def _NormalizeZip(path):
-  with tempfile.NamedTemporaryFile(suffix='.zip') as hermetic_signed_apk:
-    with zipfile.ZipFile(path, 'r') as zi:
-      with zipfile.ZipFile(hermetic_signed_apk, 'w') as zo:
-        for info in zi.infolist():
-          # Ignore 'extended local file headers'. Python doesn't write them
-          # properly (see https://bugs.python.org/issue1742205) which causes
-          # zipalign to miscalculate alignment. Since we don't use them except
-          # for alignment anyway, we write a stripped file here and let
-          # zipalign add them properly later. eLFHs are controlled by 'general
-          # purpose bit flag 03' (0x08) so we mask that out.
-          info.flag_bits = info.flag_bits & 0xF7
-
-          info.date_time = build_utils.HERMETIC_TIMESTAMP
-          zo.writestr(info, zi.read(info.filename))
-
-    shutil.copy(hermetic_signed_apk.name, path)
-
-
-def FinalizeApk(options):
-  with tempfile.NamedTemporaryFile() as signed_apk_path_tmp:
-    signed_apk_path = signed_apk_path_tmp.name
-    JarSigner(options.key_path, options.key_name, options.key_passwd,
-              options.unsigned_apk_path, signed_apk_path)
-    # Make the newly added signing files hermetic.
-    _NormalizeZip(signed_apk_path)
-
-    AlignApk(options.zipalign_path, signed_apk_path, options.final_apk_path)
+  parser.add_argument('--apksigner-path', required=True,
+                      help='Path to the apksigner executable.')
+  parser.add_argument('--zipalign-path', required=True,
+                      help='Path to the zipalign executable.')
+  parser.add_argument('--unsigned-apk-path', required=True,
+                      help='Path to input unsigned APK.')
+  parser.add_argument('--final-apk-path', required=True,
+                      help='Path to output signed and aligned APK.')
+  parser.add_argument('--key-path', required=True,
+                      help='Path to keystore for signing.')
+  parser.add_argument('--key-passwd', required=True,
+                      help='Keystore password')
+  parser.add_argument('--key-name', required=True,
+                      help='Keystore name')
+  options = parser.parse_args()
+  FinalizeApk(options.apksigner_path, options.zipalign_path,
+              options.unsigned_apk_path, options.final_apk_path,
+              options.key_path, options.key_passwd, options.key_name)
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+  main()
diff --git a/build/android/gyp/finalize_splits.py b/build/android/gyp/finalize_splits.py
deleted file mode 100755
index cb80d037..0000000
--- a/build/android/gyp/finalize_splits.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Signs and zipaligns split APKs.
-
-This script is require only by GYP (not GN).
-"""
-
-import optparse
-import sys
-
-import finalize_apk
-from util import build_utils
-
-def main():
-  parser = optparse.OptionParser()
-  parser.add_option('--zipalign-path', help='Path to the zipalign tool.')
-  parser.add_option('--resource-packaged-apk-path',
-      help='Base path to input .ap_s.')
-  parser.add_option('--base-output-path',
-      help='Path to output .apk, minus extension.')
-  parser.add_option('--key-path', help='Path to keystore for signing.')
-  parser.add_option('--key-passwd', help='Keystore password')
-  parser.add_option('--key-name', help='Keystore name')
-  parser.add_option('--densities',
-      help='Comma separated list of densities finalize.')
-  parser.add_option('--languages',
-      help='GYP list of language splits to finalize.')
-
-  options, _ = parser.parse_args()
-  options.load_library_from_zip = 0
-
-  if options.densities:
-    for density in options.densities.split(','):
-      options.unsigned_apk_path = ("%s_%s" %
-          (options.resource_packaged_apk_path, density))
-      options.final_apk_path = ("%s-density-%s.apk" %
-          (options.base_output_path, density))
-      finalize_apk.FinalizeApk(options)
-
-  if options.languages:
-    for lang in build_utils.ParseGnList(options.languages):
-      options.unsigned_apk_path = ("%s_%s" %
-          (options.resource_packaged_apk_path, lang))
-      options.final_apk_path = ("%s-lang-%s.apk" %
-          (options.base_output_path, lang))
-      finalize_apk.FinalizeApk(options)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py
index 9ad9bc7..c34780a4e 100755
--- a/build/android/gyp/javac.py
+++ b/build/android/gyp/javac.py
@@ -41,8 +41,6 @@
   'JUnitAmbiguousTestClass',
   # TODO(crbug.com/803486): Follow steps in bug.
   'AssertionFailureIgnored',
-  # TODO(crbug.com/803587): Follow steps in bug.
-  'MissingOverride',
   # TODO(crbug.com/803589): Follow steps in bug.
   'MissingFail',
   # TODO(crbug.com/803625): Follow steps in bug.
@@ -103,6 +101,7 @@
 ERRORPRONE_WARNINGS_TO_ERROR = [
   # Add warnings to this after fixing/suppressing all instances in our codebase.
   'FloatingPointLiteralPrecision',
+  'MissingOverride',
   'ParameterName',
   'StaticQualifiedUsingExpression',
 ]
@@ -203,9 +202,9 @@
       fileobj.write(re.sub(r'/tmp/[^/]*', temp_dir, pdb_data))
 
 
-def _CheckPathMatchesClassName(java_file):
+def _ParsePackageAndClassNames(java_file):
   package_name = ''
-  class_name = None
+  class_names = []
   with open(java_file) as f:
     for l in f:
       # Strip unindented comments.
@@ -221,17 +220,11 @@
       # In order to not match nested classes, it just checks for lack of indent.
       m = re.match(r'(?:\S.*?)?(?:class|@?interface|enum)\s+(.+?)\b', l)
       if m:
-        if class_name:
-          raise Exception(('File defines multiple top-level classes:\n    %s\n'
-                           'This confuses compiles with '
-                           'enable_incremental_javac=true.\n'
-                           'classes=%s,%s\n') %
-                          (java_file, class_name, m.groups(1)))
-        class_name = m.group(1)
+        class_names.append(m.group(1))
+  return package_name, class_names
 
-  if class_name is None:
-    raise Exception('Unable to find a class within %s' % java_file)
 
+def _CheckPathMatchesClassName(java_file, package_name, class_name):
   parts = package_name.split('.') + [class_name + '.java']
   expected_path_suffix = os.path.sep.join(parts)
   if not java_file.endswith(expected_path_suffix):
@@ -240,17 +233,64 @@
                     (java_file, expected_path_suffix))
 
 
+def _ParseInfoFile(info_path):
+  info_data = dict()
+  if os.path.exists(info_path):
+    with open(info_path, 'r') as info_file:
+      for line in info_file:
+        line = line.strip()
+        if line:
+          fully_qualified_name, path = line.split(',', 1)
+          info_data[fully_qualified_name] = path
+  return info_data
+
+
+def _WriteInfoFile(info_path, info_data, srcjar_files):
+  with open(info_path, 'w') as info_file:
+    for fully_qualified_name, path in info_data.iteritems():
+      if path in srcjar_files:
+        path = srcjar_files[path]
+      assert not path.startswith('/tmp'), (
+          'Java file path should not be in temp dir: {}'.format(path))
+      info_file.write('{},{}\n'.format(fully_qualified_name, path))
+
+
+def _CreateInfoFile(java_files, options, srcjar_files):
+  """Writes a .jar.info file.
+
+  This maps fully qualified names for classes to either the java file that they
+  are defined in or the path of the srcjar that they came from.
+
+  For apks this also produces a coalesced .apk.jar.info file combining all the
+  .jar.info files of its transitive dependencies.
+  """
+  info_data = dict()
+  for java_file in java_files:
+    package_name, class_names = _ParsePackageAndClassNames(java_file)
+    for class_name in class_names:
+      fully_qualified_name = '{}.{}'.format(package_name, class_name)
+      info_data[fully_qualified_name] = java_file
+    # Skip aidl srcjars since they don't indent code correctly.
+    source = srcjar_files.get(java_file, java_file)
+    if source.endswith('_aidl.srcjar'):
+      continue
+    assert not options.chromium_code or len(class_names) == 1, (
+        'Chromium java files must only have one class: {}'.format(source))
+    if options.chromium_code:
+      _CheckPathMatchesClassName(java_file, package_name, class_names[0])
+  _WriteInfoFile(options.jar_path + '.info', info_data, srcjar_files)
+
+  # Collect all the info files for transitive dependencies of the apk.
+  if options.apk_jar_info_path:
+    for jar_path in options.full_classpath:
+      info_data.update(_ParseInfoFile(jar_path + '.info'))
+    _WriteInfoFile(options.apk_jar_info_path, info_data, srcjar_files)
+
+
 def _OnStaleMd5(changes, options, javac_cmd, java_files, classpath_inputs,
                 classpath):
-  incremental = options.incremental
-  # Don't bother enabling incremental compilation for third_party code, since
-  # _CheckPathMatchesClassName() fails on some of it, and it's not really much
-  # benefit.
-  for java_file in java_files:
-    if 'third_party' in java_file or not options.chromium_code:
-      incremental = False
-    else:
-      _CheckPathMatchesClassName(java_file)
+  # Don't bother enabling incremental compilation for non-chromium code.
+  incremental = options.incremental and options.chromium_code
 
   with build_utils.TempDir() as temp_dir:
     srcjars = options.java_srcjars
@@ -287,6 +327,7 @@
       if srcjars:
         _FixTempPathsInIncrementalMetadata(pdb_path, temp_dir)
 
+    srcjar_files = dict()
     if srcjars:
       java_dir = os.path.join(temp_dir, 'java')
       os.makedirs(java_dir)
@@ -294,7 +335,10 @@
         if changed_paths:
           changed_paths.update(os.path.join(java_dir, f)
                                for f in changes.IterChangedSubpaths(srcjar))
-        build_utils.ExtractAll(srcjar, path=java_dir, pattern='*.java')
+        extracted_files = build_utils.ExtractAll(
+            srcjar, path=java_dir, pattern='*.java')
+        for path in extracted_files:
+          srcjar_files[path] = srcjar
       jar_srcs = build_utils.FindInDirectory(java_dir, '*.java')
       java_files.extend(jar_srcs)
       if changed_paths:
@@ -303,6 +347,8 @@
         for path in jar_srcs:
           os.utime(path, (0, 0))
 
+    _CreateInfoFile(java_files, options, srcjar_files)
+
     if java_files:
       if changed_paths:
         changed_java_files = [p for p in java_files if p in changed_paths]
@@ -391,7 +437,7 @@
       '--java-version',
       help='Java language version to use in -source and -target args to javac.')
   parser.add_option(
-      '--classpath',
+      '--full-classpath',
       action='append',
       help='Classpath to use when annotation processors are present.')
   parser.add_option(
@@ -444,12 +490,15 @@
       action='append',
       default=[],
       help='Additional arguments to pass to javac.')
+  parser.add_option(
+      '--apk-jar-info-path',
+      help='Coalesced jar.info files for the apk')
 
   options, args = parser.parse_args(argv)
   build_utils.CheckOptions(options, parser, required=('jar_path',))
 
   options.bootclasspath = _ParseAndFlattenGnLists(options.bootclasspath)
-  options.classpath = _ParseAndFlattenGnLists(options.classpath)
+  options.full_classpath = _ParseAndFlattenGnLists(options.full_classpath)
   options.interface_classpath = _ParseAndFlattenGnLists(
       options.interface_classpath)
   options.processorpath = _ParseAndFlattenGnLists(options.processorpath)
@@ -534,7 +583,8 @@
 
   # Annotation processors crash when given interface jars.
   active_classpath = (
-      options.classpath if options.processors else options.interface_classpath)
+      options.full_classpath
+      if options.processors else options.interface_classpath)
   classpath = []
   if active_classpath:
     classpath.extend(active_classpath)
@@ -556,9 +606,12 @@
 
   output_paths = [
       options.jar_path,
+      options.jar_path + '.info',
   ]
   if options.incremental:
     output_paths.append(options.jar_path + '.pdb')
+  if options.apk_jar_info_path:
+    output_paths.append(options.apk_jar_info_path)
 
   # An escape hatch to be able to check if incremental compiles are causing
   # problems.
diff --git a/build/buildflag_header.gni b/build/buildflag_header.gni
index 53db6a83..281c164 100644
--- a/build/buildflag_header.gni
+++ b/build/buildflag_header.gni
@@ -79,8 +79,8 @@
 #
 # Example
 #
-#   buildflag_header("foo_features") {
-#     header = "foo_features.h"
+#   buildflag_header("foo_buildflags") {
+#     header = "foo_buildflags.h"
 #
 #     flags = [
 #       # This uses the GN build flag enable_doom_melon as the definition.
diff --git a/build/cipd/android/OWNERS b/build/cipd/android/OWNERS
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/build/cipd/android/OWNERS
@@ -0,0 +1 @@
+*
diff --git a/build/cipd/android/android.ensure b/build/cipd/android/android.ensure
new file mode 100644
index 0000000..42e2bda
--- /dev/null
+++ b/build/cipd/android/android.ensure
@@ -0,0 +1,137 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Dependencies for Android target OS.
+
+# -crX indicates the chromium-specific revision of a package at a given version.
+
+@Subdir third_party/accessibility_test_framework
+chromium/third_party/accessibility-test-framework version:2.1-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/android_support_test_runner
+chromium/third_party/android_support_test_runner version:0.5-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/android_system_sdk
+chromium/third_party/android_system_sdk version:27-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/apk-patch-size-estimator
+chromium/third_party/apk-patch-size-estimator version:0.2-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/bazel
+chromium/third_party/bazel version:0.10.0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/bouncycastle
+chromium/third_party/bouncycastle version:1.46-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/byte_buddy
+chromium/third_party/byte_buddy version:1.4.17-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/espresso
+chromium/third_party/espresso version:2.2.1-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/gson
+chromium/third_party/gson version:2.8.0-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/guava
+chromium/third_party/guava version:23.0-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/hamcrest
+chromium/third_party/hamcrest version:1.3-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/icu4j
+chromium/third_party/icu4j version:53.1-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/intellij
+chromium/third_party/intellij version:12.0-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/javax_inject
+chromium/third_party/javax_inject version:1-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/objenesis
+chromium/third_party/objenesis version:2.4-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/ow2_asm
+chromium/third_party/ow2_asm version:5.0.1-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/robolectric
+chromium/third_party/robolectric version:3.5.1
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/sqlite4java
+chromium/third_party/sqlite4java version:0.282-cr0
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
+@Subdir third_party/xstream
+chromium/third_party/xstream version:1.4.8-cr0
+
diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn
index fabde6c..4e73318 100644
--- a/build/config/android/BUILD.gn
+++ b/build/config/android/BUILD.gn
@@ -216,7 +216,11 @@
 
 config("cygprofile_instrumentation") {
   defines = [ "CYGPROFILE_INSTRUMENTATION=1" ]
-  cflags = [ "-finstrument-function-entry-bare" ]
+  if (use_lightweight_order_profiling) {
+    cflags = [ "-finstrument-function-entry-bare" ]
+  } else {
+    cflags = [ "-finstrument-functions-after-inlining" ]
+  }
 }
 
 config("no_cygprofile_instrumentation") {
diff --git a/build/config/android/abi.gni b/build/config/android/abi.gni
index 877c3f74..24bef19 100644
--- a/build/config/android/abi.gni
+++ b/build/config/android/abi.gni
@@ -12,6 +12,11 @@
   # functions are called at startup.
   use_order_profiling = false
 
+  # Use a lightweight variant of order profiling. Does nothing without
+  # use_order_profiling set above. Will either replace use_order_profiling
+  # or be removed.
+  use_lightweight_order_profiling = false
+
   # Builds secondary abi for APKs, supports build 32-bit arch as secondary
   # abi in 64-bit Monochrome and WebView.
   build_apk_secondary_abi = true
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index e4002393..cf339a2 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -263,8 +263,6 @@
   # Path to the SDK's android.jar
   android_sdk_jar = "$android_sdk/android.jar"
 
-  zipalign_path = "$android_sdk_build_tools/zipalign"
-
   # Subdirectories inside android_ndk_root that contain the sysroot for the
   # associated platform.
   x86_android_sysroot_subdir =
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index e9937a4..365ec895 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1866,9 +1866,6 @@
   #   keystore_password: Keystore password.
   template("finalize_apk") {
     action(target_name) {
-      deps = []
-      script = "//build/android/gyp/finalize_apk.py"
-      depfile = "$target_gen_dir/$target_name.d"
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -1877,10 +1874,13 @@
                                "testonly",
                              ])
 
-      sources = [
-        invoker.input_apk_path,
-      ]
+      script = "//build/android/gyp/finalize_apk.py"
+      _apksigner = "$android_sdk_build_tools/apksigner"
+      _zipalign = "$android_sdk_build_tools/zipalign"
       inputs = [
+        _apksigner,
+        _zipalign,
+        invoker.input_apk_path,
         invoker.keystore_path,
       ]
       outputs = [
@@ -1891,14 +1891,14 @@
       ]
 
       args = [
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
-        "--zipalign-path",
-        rebase_path(zipalign_path, root_build_dir),
         "--unsigned-apk-path",
         rebase_path(invoker.input_apk_path, root_build_dir),
         "--final-apk-path",
         rebase_path(invoker.output_apk_path, root_build_dir),
+        "--apksigner-path",
+        rebase_path(_apksigner, root_build_dir),
+        "--zipalign-path",
+        rebase_path(_zipalign, root_build_dir),
         "--key-path",
         rebase_path(invoker.keystore_path, root_build_dir),
         "--key-name",
@@ -2011,6 +2011,7 @@
     package_apk(_package_target) {
       forward_variables_from(invoker,
                              [
+                               "apk_name",
                                "assets_build_config",
                                "native_lib_placeholders",
                                "native_libs_filearg",
@@ -2030,10 +2031,6 @@
         dex_path = _dex_path
       }
 
-      if (defined(invoker.apk_name)) {
-        apk_name = invoker.apk_name
-      }
-
       output_apk_path = _packaged_apk_path
     }
 
@@ -2211,6 +2208,7 @@
       outputs = [
         invoker.javac_jar_path,
         invoker.javac_jar_path + ".md5.stamp",
+        invoker.javac_jar_path + ".info",
       ]
       inputs = invoker.java_files + _java_srcjars + [ _build_config ]
       if (invoker.java_files != []) {
@@ -2228,7 +2226,7 @@
         "--java-srcjars=$_rebased_java_srcjars",
         "--java-srcjars=@FileArg($_rebased_build_config:javac:srcjars)",
         "--java-version=1.8",
-        "--classpath=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)",
+        "--full-classpath=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)",
         "--interface-classpath=@FileArg($_rebased_build_config:deps_info:javac_full_interface_classpath)",
         "--processorpath=@FileArg($_rebased_build_config:javac:processor_classpath)",
         "--processors=@FileArg($_rebased_build_config:javac:processor_classes)",
@@ -2270,6 +2268,15 @@
           "--processorpath=$_rebased_errorprone_processorpath",
         ]
       }
+      if (defined(invoker.apk_name)) {
+        # The supersize tool will search in this directory for each apk.
+        _apk_jar_info_path = "size-info/${invoker.apk_name}.apk.jar.info"
+        args += [
+          "--apk-jar-info-path",
+          _apk_jar_info_path,
+        ]
+        outputs += [ "$root_build_dir/$_apk_jar_info_path" ]
+      }
       foreach(e, _provider_configurations) {
         args += [ "--provider-configuration=" + rebase_path(e, root_build_dir) ]
       }
@@ -2553,6 +2560,9 @@
         requires_android = _requires_android
         deps = _accumulated_deps
         javac_jar_path = _javac_jar_path
+        if (defined(invoker.apk_name)) {
+          apk_name = invoker.apk_name
+        }
       }
       _accumulated_deps += [ ":$_compile_java_target" ]
 
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 38d667c..7678f68 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2187,6 +2187,7 @@
     java_library_impl(_java_target) {
       forward_variables_from(invoker,
                              [
+                               "apk_name",
                                "android_manifest",
                                "android_manifest_dep",
                                "apk_under_test",
@@ -2591,7 +2592,7 @@
     _apk_operations = []
     _incremental_apk_operations = []
 
-    # Generate apk opeartion related script.
+    # Generate apk operation related script.
     if (!defined(invoker.create_apk_script) || invoker.create_apk_script) {
       _apk_operations_target_name = "${target_name}__apk_operations"
       action(_apk_operations_target_name) {
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index a4e5213..8a42635 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1000,7 +1000,10 @@
 
 config("clang_revision") {
   if (is_clang && clang_base_path == default_clang_base_path) {
-    update_args = [ "--print-revision" ]
+    update_args = [
+      "--print-revision",
+      "--verify-version=$clang_version",
+    ]
     if (llvm_force_head_revision) {
       update_args += [ "--llvm-force-head-revision" ]
     }
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index 7770022..22e63275 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -298,61 +298,61 @@
   dbg_list="${dbg_list} libstdc++6-4.8-dbg"
 fi
 if package_exists libgtk-3-0-dbgsym; then
-  lib_list="${lib_list} libgtk-3-0-dbgsym"
+  dbg_list="${dbg_list} libgtk-3-0-dbgsym"
 elif package_exists libgtk-3-0-dbg; then
-  lib_list="${lib_list} libgtk-3-0-dbg"
+  dbg_list="${dbg_list} libgtk-3-0-dbg"
 fi
 if package_exists libatk1.0-0-dbgsym; then
-  lib_list="${lib_list} libatk1.0-0-dbgsym"
+  dbg_list="${dbg_list} libatk1.0-0-dbgsym"
 elif package_exists libatk1.0-dbg; then
-  lib_list="${lib_list} libatk1.0-dbg"
+  dbg_list="${dbg_list} libatk1.0-dbg"
 fi
 if package_exists libcairo2-dbgsym; then
-  lib_list="${lib_list} libcairo2-dbgsym"
+  dbg_list="${dbg_list} libcairo2-dbgsym"
 elif package_exists libcairo2-dbg; then
-  lib_list="${lib_list} libcairo2-dbg"
+  dbg_list="${dbg_list} libcairo2-dbg"
 fi
 if package_exists libfontconfig1-dbgsym; then
-  lib_list="${lib_list} libfontconfig1-dbgsym"
+  dbg_list="${dbg_list} libfontconfig1-dbgsym"
 else
-  lib_list="${lib_list} libfontconfig1-dbg"
+  dbg_list="${dbg_list} libfontconfig1-dbg"
 fi
 if package_exists libxdamage1-dbgsym; then
-  lib_list="${lib_list} libxdamage1-dbgsym"
+  dbg_list="${dbg_list} libxdamage1-dbgsym"
 elif package_exists libxdamage1-dbg; then
-  lib_list="${lib_list} libxdamage1-dbg"
+  dbg_list="${dbg_list} libxdamage1-dbg"
 fi
 if package_exists libpango1.0-dev-dbgsym; then
-  lib_list="${lib_list} libpango1.0-dev-dbgsym"
+  dbg_list="${dbg_list} libpango1.0-dev-dbgsym"
 elif package_exists libpango1.0-0-dbg; then
-  lib_list="${lib_list} libpango1.0-0-dbg"
+  dbg_list="${dbg_list} libpango1.0-0-dbg"
 fi
 if package_exists libx11-6-dbg; then
-    lib_list="${lib_list} libx11-6-dbg"
+  dbg_list="${dbg_list} libx11-6-dbg"
 fi
 if package_exists libx11-xcb1-dbg; then
-    lib_list="${lib_list} libx11-xcb1-dbg"
+  dbg_list="${dbg_list} libx11-xcb1-dbg"
 fi
 if package_exists libxfixes3-dbg; then
-    lib_list="${lib_list} libxfixes3-dbg"
+  dbg_list="${dbg_list} libxfixes3-dbg"
 fi
 if package_exists libxi6-dbg; then
-    lib_list="${lib_list} libxi6-dbg"
+  dbg_list="${dbg_list} libxi6-dbg"
 fi
 if package_exists libxrandr2-dbg; then
-    lib_list="${lib_list} libxrandr2-dbg"
+  dbg_list="${dbg_list} libxrandr2-dbg"
 fi
 if package_exists libxrender1-dbg; then
-    lib_list="${lib_list} libxrender1-dbg"
+  dbg_list="${dbg_list} libxrender1-dbg"
 fi
 if package_exists libxtst6-dbg; then
-    lib_list="${lib_list} libxtst6-dbg"
+  dbg_list="${dbg_list} libxtst6-dbg"
 fi
 if package_exists libglib2.0-0-dbg; then
-    lib_list="${lib_list} libglib2.0-0-dbg"
+  dbg_list="${dbg_list} libglib2.0-0-dbg"
 fi
 if package_exists libxcursor1-dbg; then
-    lib_list="${lib_list} libxcursor1-dbg"
+  dbg_list="${dbg_list} libxcursor1-dbg"
 fi
 
 # 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
diff --git a/build/linux/sysroot_scripts/packagelist.sid.amd64 b/build/linux/sysroot_scripts/packagelist.sid.amd64
index 83a6e38..776847a 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.amd64
+++ b/build/linux/sysroot_scripts/packagelist.sid.amd64
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_amd64.deb
@@ -160,6 +161,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_amd64.deb
@@ -202,6 +209,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_amd64.deb
@@ -231,6 +240,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_amd64.deb
@@ -254,6 +265,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_amd64.deb
@@ -267,6 +282,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_amd64.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.arm b/build/linux/sysroot_scripts/packagelist.sid.arm
index de3a8d7..998b787d 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.arm
+++ b/build/linux/sysroot_scripts/packagelist.sid.arm
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_armhf.deb
@@ -158,6 +159,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_armhf.deb
@@ -200,6 +207,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_armhf.deb
@@ -229,6 +238,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_armhf.deb
@@ -252,6 +263,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_armhf.deb
@@ -265,6 +280,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_armhf.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.arm64 b/build/linux/sysroot_scripts/packagelist.sid.arm64
index c8cb71c4..bdb1692 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.arm64
+++ b/build/linux/sysroot_scripts/packagelist.sid.arm64
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_arm64.deb
@@ -158,6 +159,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_arm64.deb
@@ -200,6 +207,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_arm64.deb
@@ -229,6 +238,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_arm64.deb
@@ -252,6 +263,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_arm64.deb
@@ -265,6 +280,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_arm64.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.i386 b/build/linux/sysroot_scripts/packagelist.sid.i386
index 1369714..3657a50 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.i386
+++ b/build/linux/sysroot_scripts/packagelist.sid.i386
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_i386.deb
@@ -158,6 +159,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_i386.deb
@@ -200,6 +207,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_i386.deb
@@ -229,6 +238,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_i386.deb
@@ -252,6 +263,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_i386.deb
@@ -265,6 +280,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_i386.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.mips64el b/build/linux/sysroot_scripts/packagelist.sid.mips64el
index a7dd247..e09f1936 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.mips64el
+++ b/build/linux/sysroot_scripts/packagelist.sid.mips64el
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_mips64el.deb
@@ -151,6 +152,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_mips64el.deb
@@ -193,6 +200,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_mips64el.deb
@@ -222,6 +231,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_mips64el.deb
@@ -245,6 +256,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_mips64el.deb
@@ -258,6 +273,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_mips64el.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.mipsel b/build/linux/sysroot_scripts/packagelist.sid.mipsel
index 32ff79d..63dd0c2 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.mipsel
+++ b/build/linux/sysroot_scripts/packagelist.sid.mipsel
@@ -34,6 +34,7 @@
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.5-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.5-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.12.6-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.12.6-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_mipsel.deb
@@ -151,6 +152,12 @@
 http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.0.0-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.5-4.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.5-4.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx4_1.6.1-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx-dev_1.6.1-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp6_0.6.0-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.0-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.0-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.0-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.4-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.4-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.4-3_mipsel.deb
@@ -193,6 +200,8 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.10-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.2-1+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.29-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.29-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_mipsel.deb
@@ -222,6 +231,8 @@
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2n-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0g-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0g-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.2.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.2.1-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.9-2_mipsel.deb
@@ -245,6 +256,10 @@
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_11.1-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_11.1-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_11.1-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-3_20170101+dfsg-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20170101+dfsg-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-1_mipsel.deb
@@ -258,6 +273,7 @@
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.31.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.31.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.31.1-0.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.31.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.14.0-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.14.0-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.14.0-1+b1_mipsel.deb
diff --git a/build/linux/sysroot_scripts/sysroot-creator-sid.sh b/build/linux/sysroot_scripts/sysroot-creator-sid.sh
index b4029014..919e43a2 100755
--- a/build/linux/sysroot_scripts/sysroot-creator-sid.sh
+++ b/build/linux/sysroot_scripts/sysroot-creator-sid.sh
@@ -94,6 +94,7 @@
   libexpat1-dev
   libffi-dev
   libffi6
+  libflac-dev
   libflac8
   libfontconfig1
   libfontconfig1-dev
@@ -144,8 +145,8 @@
   libice6
   libicu57
   libidl-2-0
-  libidn2-0
   libidn11
+  libidn2-0
   libindicator3-7
   libindicator7
   libjbig0
@@ -176,6 +177,8 @@
   libnss3-dev
   libogg0
   libopengl0
+  libopus-dev
+  libopus0
   liborbit-2-0
   liborbit2
   libp11-kit0
@@ -203,9 +206,13 @@
   libpulse-dev
   libpulse-mainloop-glib0
   libpulse0
+  libre2-3
+  libre2-dev
   librest-0.7-0
   libselinux1
   libsm6
+  libsnappy-dev
+  libsnappy1v5
   libsndfile1
   libsoup-gnome2.4-1
   libsoup2.4-1
@@ -234,11 +241,17 @@
   libva2
   libvorbis0a
   libvorbisenc2
+  libvpx-dev
+  libvpx4
   libwayland-client0
   libwayland-cursor0
   libwayland-dev
   libwayland-egl1-mesa
   libwayland-server0
+  libwebp-dev
+  libwebp6
+  libwebpdemux2
+  libwebpmux3
   libwrap0
   libx11-6
   libx11-dev
@@ -283,6 +296,8 @@
   libxrender-dev
   libxrender1
   libxshmfence1
+  libxslt1-dev
+  libxslt1.1
   libxss-dev
   libxss1
   libxt-dev
@@ -293,6 +308,7 @@
   linux-libc-dev
   mesa-common-dev
   speech-dispatcher
+  uuid-dev
   wayland-protocols
   x11proto-composite-dev
   x11proto-core-dev
diff --git a/build/toolchain/win/rc/linux64/rc.sha1 b/build/toolchain/win/rc/linux64/rc.sha1
index edbf354d1..ad14ca46 100644
--- a/build/toolchain/win/rc/linux64/rc.sha1
+++ b/build/toolchain/win/rc/linux64/rc.sha1
@@ -1 +1 @@
-c6f648cc36e963072f6c18e980a69b299512a3ff
\ No newline at end of file
+2d0c766039264dc2514d005a42f074af4838a446
\ No newline at end of file
diff --git a/build/toolchain/win/rc/mac/rc.sha1 b/build/toolchain/win/rc/mac/rc.sha1
index 03d09a0..dbd6302a 100644
--- a/build/toolchain/win/rc/mac/rc.sha1
+++ b/build/toolchain/win/rc/mac/rc.sha1
@@ -1 +1 @@
-15fae6b7960f0614628b14c7f5e3809ff05dd75a
\ No newline at end of file
+4c25c3bcb6608109bb52028d008835895cf72629
\ No newline at end of file
diff --git a/build/toolchain/win/rc/win/rc.exe.sha1 b/build/toolchain/win/rc/win/rc.exe.sha1
index f3bfe1f2..3fdbfc0c 100644
--- a/build/toolchain/win/rc/win/rc.exe.sha1
+++ b/build/toolchain/win/rc/win/rc.exe.sha1
@@ -1 +1 @@
-f87131fc898652b637554cf22097a077e13142dc
\ No newline at end of file
+ba51d69039ffb88310b72b6568efa9f0de148f8f
\ No newline at end of file
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 9d81997..44a6ad8 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -710,7 +710,7 @@
     "animation/scroll_offset_animation_curve_unittest.cc",
     "animation/scroll_timeline_unittest.cc",
     "animation/transform_operations_unittest.cc",
-    "animation/worklet_animation_player_unittest.cc",
+    "animation/worklet_animation_unittest.cc",
 
     # Setup.
     "test/cc_test_suite.cc",
diff --git a/cc/animation/BUILD.gn b/cc/animation/BUILD.gn
index e94d8ab..cdad662a 100644
--- a/cc/animation/BUILD.gn
+++ b/cc/animation/BUILD.gn
@@ -7,6 +7,8 @@
 cc_component("animation") {
   output_name = "cc_animation"
   sources = [
+    "animation.cc",
+    "animation.h",
     "animation_curve.cc",
     "animation_curve.h",
     "animation_delegate.h",
@@ -17,8 +19,6 @@
     "animation_host.h",
     "animation_id_provider.cc",
     "animation_id_provider.h",
-    "animation_player.cc",
-    "animation_player.h",
     "animation_target.h",
     "animation_timeline.cc",
     "animation_timeline.h",
@@ -38,16 +38,16 @@
     "scroll_offset_animations_impl.h",
     "scroll_timeline.cc",
     "scroll_timeline.h",
-    "single_keyframe_effect_animation_player.cc",
-    "single_keyframe_effect_animation_player.h",
+    "single_keyframe_effect_animation.cc",
+    "single_keyframe_effect_animation.h",
     "timing_function.cc",
     "timing_function.h",
     "transform_operation.cc",
     "transform_operation.h",
     "transform_operations.cc",
     "transform_operations.h",
-    "worklet_animation_player.cc",
-    "worklet_animation_player.h",
+    "worklet_animation.cc",
+    "worklet_animation.h",
   ]
 
   defines = [ "CC_ANIMATION_IMPLEMENTATION=1" ]
diff --git a/cc/animation/README.md b/cc/animation/README.md
index 872440c..7f68611 100644
--- a/cc/animation/README.md
+++ b/cc/animation/README.md
@@ -40,23 +40,23 @@
 Animations are grouped together based on their
 [animation target](https://codesearch.chromium.org/chromium/src/cc/animation/animation_target.h)
 (the entity whose property is being animated) and each such group is owned by an
-[animation player](https://codesearch.chromium.org/chromium/src/cc/animation/animation_player.h).
-Note that there may be multiple animation players with the same target (each
+[animation](https://codesearch.chromium.org/chromium/src/cc/animation/animation.h).
+Note that there may be multiple animations with the same target (each
 with a set of KeyframeModels for that target); the
 [ElementAnimations](https://codesearch.chromium.org/chromium/src/cc/animation/element_animations.h)
-class wraps the multiple animation players and has a 1:1 relationship with
+class wraps the multiple animations and has a 1:1 relationship with
 target entities.
 
-`TODO(smcgruer): Why are ElementAnimations and AnimationPlayers separate?`
+`TODO(smcgruer): Why are ElementAnimations and Animations separate?`
 
 In order to play an animation, input time values must be provided to the
 animation curve and output values fed back into the animating entity. This is
 called 'ticking' an animation and is the responsibility of the
 [animation host](https://codesearch.chromium.org/chromium/src/cc/animation/animation_host.h).
-The animation host has a list of currently ticking players (i.e. those that have
+The animation host has a list of currently ticking animations (i.e. those that have
 any non-deleted animations), which it iterates through whenever it receives a
 tick call from the client (along with a corresponding input time).  The
-animation players then call into their non-deleted animations, retrieving the
+animations then call into their non-deleted animations, retrieving the
 value from the animation curve.  As they are computed, output values are sent to
 the target which is responsible for passing them to the client entity that is
 being animated.
@@ -93,7 +93,7 @@
 [animation timeline](https://codesearch.chromium.org/chromium/src/cc/animation/animation_timeline.h).
 This should not be confused with the identically named Blink concept. In
 cc/animation, animation timelines are an implementation detail - they hold the
-animation players and are responsible for syncing them to the impl thread (see
+animations and are responsible for syncing them to the impl thread (see
 below), but do not participate in the ticking process in any way.
 
 ### Main/Impl Threads
diff --git a/cc/animation/animation_player.cc b/cc/animation/animation.cc
similarity index 71%
rename from cc/animation/animation_player.cc
rename to cc/animation/animation.cc
index 5e6565b..8dd68be 100644
--- a/cc/animation/animation_player.cc
+++ b/cc/animation/animation.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 "cc/animation/animation_player.h"
+#include "cc/animation/animation.h"
 
 #include <inttypes.h>
 #include <algorithm>
@@ -19,11 +19,11 @@
 
 namespace cc {
 
-scoped_refptr<AnimationPlayer> AnimationPlayer::Create(int id) {
-  return base::WrapRefCounted(new AnimationPlayer(id));
+scoped_refptr<Animation> Animation::Create(int id) {
+  return base::WrapRefCounted(new Animation(id));
 }
 
-AnimationPlayer::AnimationPlayer(int id)
+Animation::Animation(int id)
     : animation_host_(),
       animation_timeline_(),
       animation_delegate_(),
@@ -32,30 +32,29 @@
   DCHECK(id_);
 }
 
-AnimationPlayer::~AnimationPlayer() {
+Animation::~Animation() {
   DCHECK(!animation_timeline_);
 }
 
-scoped_refptr<AnimationPlayer> AnimationPlayer::CreateImplInstance() const {
-  scoped_refptr<AnimationPlayer> player = AnimationPlayer::Create(id());
-  return player;
+scoped_refptr<Animation> Animation::CreateImplInstance() const {
+  return Animation::Create(id());
 }
 
-ElementId AnimationPlayer::element_id_of_keyframe_effect(
+ElementId Animation::element_id_of_keyframe_effect(
     KeyframeEffectId keyframe_effect_id) const {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
   return GetKeyframeEffectById(keyframe_effect_id)->element_id();
 }
 
-bool AnimationPlayer::IsElementAttached(ElementId id) const {
+bool Animation::IsElementAttached(ElementId id) const {
   return !!element_to_keyframe_effect_id_map_.count(id);
 }
 
-void AnimationPlayer::SetAnimationHost(AnimationHost* animation_host) {
+void Animation::SetAnimationHost(AnimationHost* animation_host) {
   animation_host_ = animation_host;
 }
 
-void AnimationPlayer::SetAnimationTimeline(AnimationTimeline* timeline) {
+void Animation::SetAnimationTimeline(AnimationTimeline* timeline) {
   if (animation_timeline_ == timeline)
     return;
 
@@ -68,37 +67,37 @@
 
   animation_timeline_ = timeline;
 
-  // Register player only if layer AND host attached. Unlike the
-  // SingleAnimationPlayer case, all keyframe_effects have been attached to
-  // their corresponding elements.
+  // Register animation only if layer AND host attached. Unlike the
+  // SingleKeyframeEffectAnimation case, all keyframe_effects have been attached
+  // to their corresponding elements.
   if (!element_to_keyframe_effect_id_map_.empty() && animation_host_) {
     RegisterKeyframeEffects();
   }
 }
 
-bool AnimationPlayer::has_element_animations() const {
+bool Animation::has_element_animations() const {
   return !element_to_keyframe_effect_id_map_.empty();
 }
 
-scoped_refptr<ElementAnimations> AnimationPlayer::element_animations(
+scoped_refptr<ElementAnimations> Animation::element_animations(
     KeyframeEffectId keyframe_effect_id) const {
   return GetKeyframeEffectById(keyframe_effect_id)->element_animations();
 }
 
-void AnimationPlayer::AttachElementForKeyframeEffect(
+void Animation::AttachElementForKeyframeEffect(
     ElementId element_id,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
   GetKeyframeEffectById(keyframe_effect_id)->AttachElement(element_id);
   element_to_keyframe_effect_id_map_[element_id].emplace(keyframe_effect_id);
-  // Register player only if layer AND host attached.
+  // Register animation only if layer AND host attached.
   if (animation_host_) {
     // Create ElementAnimations or re-use existing.
     RegisterKeyframeEffect(element_id, keyframe_effect_id);
   }
 }
 
-void AnimationPlayer::DetachElementForKeyframeEffect(
+void Animation::DetachElementForKeyframeEffect(
     ElementId element_id,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
@@ -110,7 +109,7 @@
   element_to_keyframe_effect_id_map_[element_id].erase(keyframe_effect_id);
 }
 
-void AnimationPlayer::DetachElement() {
+void Animation::DetachElement() {
   if (animation_host_) {
     // Destroy ElementAnimations or release it if it's still needed.
     UnregisterKeyframeEffects();
@@ -128,9 +127,8 @@
   DCHECK_EQ(element_to_keyframe_effect_id_map_.size(), 0u);
 }
 
-void AnimationPlayer::RegisterKeyframeEffect(
-    ElementId element_id,
-    KeyframeEffectId keyframe_effect_id) {
+void Animation::RegisterKeyframeEffect(ElementId element_id,
+                                       KeyframeEffectId keyframe_effect_id) {
   DCHECK(animation_host_);
   KeyframeEffect* keyframe_effect = GetKeyframeEffectById(keyframe_effect_id);
   DCHECK(!keyframe_effect->has_bound_element_animations());
@@ -141,9 +139,8 @@
                                                     keyframe_effect);
 }
 
-void AnimationPlayer::UnregisterKeyframeEffect(
-    ElementId element_id,
-    KeyframeEffectId keyframe_effect_id) {
+void Animation::UnregisterKeyframeEffect(ElementId element_id,
+                                         KeyframeEffectId keyframe_effect_id) {
   DCHECK(animation_host_);
   KeyframeEffect* keyframe_effect = GetKeyframeEffectById(keyframe_effect_id);
   DCHECK(keyframe_effect);
@@ -153,7 +150,7 @@
                                                         keyframe_effect);
   }
 }
-void AnimationPlayer::RegisterKeyframeEffects() {
+void Animation::RegisterKeyframeEffects() {
   for (auto& element_id_keyframe_effect_id :
        element_to_keyframe_effect_id_map_) {
     const ElementId element_id = element_id_keyframe_effect_id.first;
@@ -164,7 +161,7 @@
   }
 }
 
-void AnimationPlayer::UnregisterKeyframeEffects() {
+void Animation::UnregisterKeyframeEffects() {
   for (auto& element_id_keyframe_effect_id :
        element_to_keyframe_effect_id_map_) {
     const ElementId element_id = element_id_keyframe_effect_id.first;
@@ -176,30 +173,30 @@
   animation_host_->RemoveFromTicking(this);
 }
 
-void AnimationPlayer::PushAttachedKeyframeEffectsToImplThread(
-    AnimationPlayer* player_impl) const {
+void Animation::PushAttachedKeyframeEffectsToImplThread(
+    Animation* animation_impl) const {
   for (auto& keyframe_effect : keyframe_effects_) {
     KeyframeEffect* keyframe_effect_impl =
-        player_impl->GetKeyframeEffectById(keyframe_effect->id());
+        animation_impl->GetKeyframeEffectById(keyframe_effect->id());
     if (keyframe_effect_impl)
       continue;
 
     std::unique_ptr<KeyframeEffect> to_add =
         keyframe_effect->CreateImplInstance();
-    player_impl->AddKeyframeEffect(std::move(to_add));
+    animation_impl->AddKeyframeEffect(std::move(to_add));
   }
 }
 
-void AnimationPlayer::PushPropertiesToImplThread(AnimationPlayer* player_impl) {
+void Animation::PushPropertiesToImplThread(Animation* animation_impl) {
   for (auto& keyframe_effect : keyframe_effects_) {
     if (KeyframeEffect* keyframe_effect_impl =
-            player_impl->GetKeyframeEffectById(keyframe_effect->id())) {
+            animation_impl->GetKeyframeEffectById(keyframe_effect->id())) {
       keyframe_effect->PushPropertiesTo(keyframe_effect_impl);
     }
   }
 }
 
-void AnimationPlayer::AddKeyframeModelForKeyframeEffect(
+void Animation::AddKeyframeModelForKeyframeEffect(
     std::unique_ptr<KeyframeModel> keyframe_model,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
@@ -207,7 +204,7 @@
       ->AddKeyframeModel(std::move(keyframe_model));
 }
 
-void AnimationPlayer::PauseKeyframeModelForKeyframeEffect(
+void Animation::PauseKeyframeModelForKeyframeEffect(
     int keyframe_model_id,
     double time_offset,
     KeyframeEffectId keyframe_effect_id) {
@@ -216,7 +213,7 @@
       ->PauseKeyframeModel(keyframe_model_id, time_offset);
 }
 
-void AnimationPlayer::RemoveKeyframeModelForKeyframeEffect(
+void Animation::RemoveKeyframeModelForKeyframeEffect(
     int keyframe_model_id,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
@@ -224,7 +221,7 @@
       ->RemoveKeyframeModel(keyframe_model_id);
 }
 
-void AnimationPlayer::AbortKeyframeModelForKeyframeEffect(
+void Animation::AbortKeyframeModelForKeyframeEffect(
     int keyframe_model_id,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
@@ -232,32 +229,32 @@
       ->AbortKeyframeModel(keyframe_model_id);
 }
 
-void AnimationPlayer::AbortKeyframeModels(TargetProperty::Type target_property,
-                                          bool needs_completion) {
+void Animation::AbortKeyframeModels(TargetProperty::Type target_property,
+                                    bool needs_completion) {
   for (auto& keyframe_effect : keyframe_effects_)
     keyframe_effect->AbortKeyframeModels(target_property, needs_completion);
 }
 
-void AnimationPlayer::PushPropertiesTo(AnimationPlayer* player_impl) {
-  PushAttachedKeyframeEffectsToImplThread(player_impl);
-  PushPropertiesToImplThread(player_impl);
+void Animation::PushPropertiesTo(Animation* animation_impl) {
+  PushAttachedKeyframeEffectsToImplThread(animation_impl);
+  PushPropertiesToImplThread(animation_impl);
 }
 
-void AnimationPlayer::Tick(base::TimeTicks monotonic_time) {
+void Animation::Tick(base::TimeTicks monotonic_time) {
   DCHECK(!monotonic_time.is_null());
   for (auto& keyframe_effect : keyframe_effects_)
     keyframe_effect->Tick(monotonic_time, nullptr);
 }
 
-void AnimationPlayer::UpdateState(bool start_ready_animations,
-                                  AnimationEvents* events) {
+void Animation::UpdateState(bool start_ready_animations,
+                            AnimationEvents* events) {
   for (auto& keyframe_effect : keyframe_effects_) {
     keyframe_effect->UpdateState(start_ready_animations, events);
     keyframe_effect->UpdateTickingState(UpdateTickingType::NORMAL);
   }
 }
 
-void AnimationPlayer::AddToTicking() {
+void Animation::AddToTicking() {
   ++ticking_keyframe_effects_count;
   if (ticking_keyframe_effects_count > 1)
     return;
@@ -265,7 +262,7 @@
   animation_host_->AddToTicking(this);
 }
 
-void AnimationPlayer::KeyframeModelRemovedFromTicking() {
+void Animation::KeyframeModelRemovedFromTicking() {
   DCHECK_GE(ticking_keyframe_effects_count, 0);
   if (!ticking_keyframe_effects_count)
     return;
@@ -277,28 +274,28 @@
   animation_host_->RemoveFromTicking(this);
 }
 
-void AnimationPlayer::NotifyKeyframeModelStarted(const AnimationEvent& event) {
+void Animation::NotifyKeyframeModelStarted(const AnimationEvent& event) {
   if (animation_delegate_) {
     animation_delegate_->NotifyAnimationStarted(
         event.monotonic_time, event.target_property, event.group_id);
   }
 }
 
-void AnimationPlayer::NotifyKeyframeModelFinished(const AnimationEvent& event) {
+void Animation::NotifyKeyframeModelFinished(const AnimationEvent& event) {
   if (animation_delegate_) {
     animation_delegate_->NotifyAnimationFinished(
         event.monotonic_time, event.target_property, event.group_id);
   }
 }
 
-void AnimationPlayer::NotifyKeyframeModelAborted(const AnimationEvent& event) {
+void Animation::NotifyKeyframeModelAborted(const AnimationEvent& event) {
   if (animation_delegate_) {
     animation_delegate_->NotifyAnimationAborted(
         event.monotonic_time, event.target_property, event.group_id);
   }
 }
 
-void AnimationPlayer::NotifyKeyframeModelTakeover(const AnimationEvent& event) {
+void Animation::NotifyKeyframeModelTakeover(const AnimationEvent& event) {
   DCHECK(event.target_property == TargetProperty::SCROLL_OFFSET);
 
   if (animation_delegate_) {
@@ -310,32 +307,32 @@
   }
 }
 
-size_t AnimationPlayer::TickingKeyframeModelsCount() const {
+size_t Animation::TickingKeyframeModelsCount() const {
   size_t count = 0;
   for (auto& keyframe_effect : keyframe_effects_)
     count += keyframe_effect->TickingKeyframeModelsCount();
   return count;
 }
 
-void AnimationPlayer::SetNeedsCommit() {
+void Animation::SetNeedsCommit() {
   DCHECK(animation_host_);
   animation_host_->SetNeedsCommit();
 }
 
-void AnimationPlayer::SetNeedsPushProperties() {
+void Animation::SetNeedsPushProperties() {
   if (!animation_timeline_)
     return;
   animation_timeline_->SetNeedsPushProperties();
 }
 
-void AnimationPlayer::ActivateKeyframeEffects() {
+void Animation::ActivateKeyframeEffects() {
   for (auto& keyframe_effect : keyframe_effects_) {
     keyframe_effect->ActivateKeyframeEffects();
     keyframe_effect->UpdateTickingState(UpdateTickingType::NORMAL);
   }
 }
 
-KeyframeModel* AnimationPlayer::GetKeyframeModelForKeyframeEffect(
+KeyframeModel* Animation::GetKeyframeModelForKeyframeEffect(
     TargetProperty::Type target_property,
     KeyframeEffectId keyframe_effect_id) const {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
@@ -343,8 +340,8 @@
       ->GetKeyframeModel(target_property);
 }
 
-std::string AnimationPlayer::ToString() const {
-  std::string output = base::StringPrintf("AnimationPlayer{id=%d", id_);
+std::string Animation::ToString() const {
+  std::string output = base::StringPrintf("Animation{id=%d", id_);
   for (const auto& keyframe_effect : keyframe_effects_) {
     output +=
         base::StringPrintf(", element_id=%s, keyframe_models=[%s]",
@@ -354,19 +351,19 @@
   return output + "}";
 }
 
-bool AnimationPlayer::IsWorkletAnimationPlayer() const {
+bool Animation::IsWorkletAnimation() const {
   return false;
 }
 
-void AnimationPlayer::AddKeyframeEffect(
+void Animation::AddKeyframeEffect(
     std::unique_ptr<KeyframeEffect> keyframe_effect) {
-  keyframe_effect->SetAnimationPlayer(this);
+  keyframe_effect->SetAnimation(this);
   keyframe_effects_.push_back(std::move(keyframe_effect));
 
   SetNeedsPushProperties();
 }
 
-KeyframeEffect* AnimationPlayer::GetKeyframeEffectById(
+KeyframeEffect* Animation::GetKeyframeEffectById(
     KeyframeEffectId keyframe_effect_id) const {
   // May return nullptr when syncing keyframe_effects_ to impl.
   return keyframe_effects_.size() > keyframe_effect_id
diff --git a/cc/animation/animation_player.h b/cc/animation/animation.h
similarity index 83%
rename from cc/animation/animation_player.h
rename to cc/animation/animation.h
index c0e11237..ddf192a 100644
--- a/cc/animation/animation_player.h
+++ b/cc/animation/animation.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 CC_ANIMATION_ANIMATION_PLAYER_H_
-#define CC_ANIMATION_ANIMATION_PLAYER_H_
+#ifndef CC_ANIMATION_ANIMATION_H_
+#define CC_ANIMATION_ANIMATION_H_
 
 #include <vector>
 
@@ -26,7 +26,7 @@
 class AnimationTimeline;
 struct AnimationEvent;
 
-// An AnimationPlayer manages grouped sets of KeyframeModels (each set of which
+// An Animation manages grouped sets of KeyframeModels (each set of which
 // are stored in a KeyframeEffect), and handles the interaction with the
 // AnimationHost and AnimationTimeline.
 //
@@ -34,15 +34,14 @@
 // relationship. Currently the blink logic is responsible for handling of
 // conflicting same-property animations.
 //
-// Each cc AnimationPlayer has a copy on the impl thread, and will take care of
+// Each cc Animation has a copy on the impl thread, and will take care of
 // synchronizing properties to/from the impl thread when requested.
 //
-// There is a 1:n relationship between AnimationPlayer and KeyframeEffect.
-class CC_ANIMATION_EXPORT AnimationPlayer
-    : public base::RefCounted<AnimationPlayer> {
+// There is a 1:n relationship between Animation and KeyframeEffect.
+class CC_ANIMATION_EXPORT Animation : public base::RefCounted<Animation> {
  public:
-  static scoped_refptr<AnimationPlayer> Create(int id);
-  virtual scoped_refptr<AnimationPlayer> CreateImplInstance() const;
+  static scoped_refptr<Animation> Create(int id);
+  virtual scoped_refptr<Animation> CreateImplInstance() const;
 
   int id() const { return id_; }
   typedef size_t KeyframeEffectId;
@@ -50,8 +49,7 @@
       KeyframeEffectId keyframe_effect_id) const;
   bool IsElementAttached(ElementId id) const;
 
-  // Parent AnimationHost. AnimationPlayer can be detached from
-  // AnimationTimeline.
+  // Parent AnimationHost. Animation can be detached from AnimationTimeline.
   AnimationHost* animation_host() { return animation_host_; }
   const AnimationHost* animation_host() const { return animation_host_; }
   void SetAnimationHost(AnimationHost* animation_host);
@@ -92,7 +90,7 @@
   void AbortKeyframeModels(TargetProperty::Type target_property,
                            bool needs_completion);
 
-  virtual void PushPropertiesTo(AnimationPlayer* player_impl);
+  virtual void PushPropertiesTo(Animation* animation_impl);
 
   void UpdateState(bool start_ready_keyframe_models, AnimationEvents* events);
   virtual void Tick(base::TimeTicks monotonic_time);
@@ -124,7 +122,7 @@
 
   void SetNeedsCommit();
 
-  virtual bool IsWorkletAnimationPlayer() const;
+  virtual bool IsWorkletAnimation() const;
   void AddKeyframeEffect(std::unique_ptr<KeyframeEffect>);
 
   KeyframeEffect* GetKeyframeEffectById(
@@ -132,7 +130,7 @@
   KeyframeEffectId NextKeyframeEffectId() { return keyframe_effects_.size(); }
 
  private:
-  friend class base::RefCounted<AnimationPlayer>;
+  friend class base::RefCounted<Animation>;
 
   void RegisterKeyframeEffect(ElementId element_id,
                               KeyframeEffectId keyframe_effect_id);
@@ -141,12 +139,12 @@
   void RegisterKeyframeEffects();
   void UnregisterKeyframeEffects();
 
-  void PushAttachedKeyframeEffectsToImplThread(AnimationPlayer* player) const;
-  void PushPropertiesToImplThread(AnimationPlayer* player);
+  void PushAttachedKeyframeEffectsToImplThread(Animation* animation_impl) const;
+  void PushPropertiesToImplThread(Animation* animation_impl);
 
  protected:
-  explicit AnimationPlayer(int id);
-  virtual ~AnimationPlayer();
+  explicit Animation(int id);
+  virtual ~Animation();
 
   AnimationHost* animation_host_;
   AnimationTimeline* animation_timeline_;
@@ -167,9 +165,9 @@
 
   int ticking_keyframe_effects_count;
 
-  DISALLOW_COPY_AND_ASSIGN(AnimationPlayer);
+  DISALLOW_COPY_AND_ASSIGN(Animation);
 };
 
 }  // namespace cc
 
-#endif  // CC_ANIMATION_ANIMATION_PLAYER_H_
+#endif  // CC_ANIMATION_ANIMATION_H_
diff --git a/cc/animation/animation_delegate.h b/cc/animation/animation_delegate.h
index 703b8f58..013e3431 100644
--- a/cc/animation/animation_delegate.h
+++ b/cc/animation/animation_delegate.h
@@ -17,8 +17,8 @@
   // animation (once for effect/property pairing).
   // Ideally, we would only notify start once (e.g., wait on all effects to
   // start before notifying delegate) this way effect becomes an internal
-  // details of the player. Perhaps we can do that at some point maybe as part
-  // of https://bugs.chromium.org/p/chromium/issues/detail?id=810003
+  // details of the animation. Perhaps we can do that at some point maybe as
+  // part of https://bugs.chromium.org/p/chromium/issues/detail?id=810003
   virtual void NotifyAnimationStarted(base::TimeTicks monotonic_time,
                                       int target_property,
                                       int group) = 0;
diff --git a/cc/animation/animation_host.cc b/cc/animation/animation_host.cc
index 37468b0..2e67d9a 100644
--- a/cc/animation/animation_host.cc
+++ b/cc/animation/animation_host.cc
@@ -11,10 +11,10 @@
 #include "base/macros.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_argument.h"
+#include "cc/animation/animation.h"
 #include "cc/animation/animation_delegate.h"
 #include "cc/animation/animation_events.h"
 #include "cc/animation/animation_id_provider.h"
-#include "cc/animation/animation_player.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/element_animations.h"
 #include "cc/animation/keyframe_effect.h"
@@ -23,7 +23,7 @@
 #include "cc/animation/scroll_offset_animations_impl.h"
 #include "cc/animation/scroll_timeline.h"
 #include "cc/animation/timing_function.h"
-#include "cc/animation/worklet_animation_player.h"
+#include "cc/animation/worklet_animation.h"
 #include "ui/gfx/geometry/box_f.h"
 #include "ui/gfx/geometry/scroll_offset.h"
 
@@ -87,7 +87,7 @@
 }
 
 void AnimationHost::EraseTimeline(scoped_refptr<AnimationTimeline> timeline) {
-  timeline->ClearPlayers();
+  timeline->ClearAnimations();
   timeline->SetAnimationHost(nullptr);
 }
 
@@ -226,8 +226,8 @@
 }
 
 void AnimationHost::PushPropertiesToImplThread(AnimationHost* host_impl) {
-  // Sync all players with impl thread to create ElementAnimations. This needs
-  // to happen before the element animations are synced below.
+  // Sync all animations with impl thread to create ElementAnimations. This
+  // needs to happen before the element animations are synced below.
   for (auto& kv : id_to_timeline_map_) {
     AnimationTimeline* timeline = kv.second.get();
     if (AnimationTimeline* timeline_impl =
@@ -273,24 +273,24 @@
 }
 
 bool AnimationHost::NeedsTickAnimations() const {
-  return NeedsTickAnimationPlayers() || NeedsTickMutator();
+  return NeedsTickAnimation() || NeedsTickMutator();
 }
 
 bool AnimationHost::NeedsTickMutator() const {
   return mutator_ && mutator_->HasAnimators();
 }
 
-bool AnimationHost::NeedsTickAnimationPlayers() const {
-  return !ticking_players_.empty();
+bool AnimationHost::NeedsTickAnimation() const {
+  return !ticking_animations_.empty();
 }
 
 bool AnimationHost::ActivateAnimations() {
-  if (!NeedsTickAnimationPlayers())
+  if (!NeedsTickAnimation())
     return false;
 
   TRACE_EVENT0("cc", "AnimationHost::ActivateAnimations");
-  PlayersList ticking_players_copy = ticking_players_;
-  for (auto& it : ticking_players_copy)
+  AnimationsList ticking_animations_copy = ticking_animations_;
+  for (auto& it : ticking_animations_copy)
     it->ActivateKeyframeEffects();
 
   return true;
@@ -301,9 +301,9 @@
   TRACE_EVENT0("cc", "AnimationHost::TickAnimations");
   bool did_animate = false;
 
-  if (NeedsTickAnimationPlayers()) {
-    PlayersList ticking_players_copy = ticking_players_;
-    for (auto& it : ticking_players_copy)
+  if (NeedsTickAnimation()) {
+    AnimationsList ticking_animations_copy = ticking_animations_;
+    for (auto& it : ticking_animations_copy)
       it->Tick(monotonic_time);
 
     did_animate = true;
@@ -325,8 +325,8 @@
   // TODO(majidvp) For now the logic simply assumes all AnimationWorklet
   // animations depend on scroll offset but this is inefficient. We need a more
   // fine-grained approach based on invalidating individual ScrollTimelines and
-  // then ticking the animation players attached to those timelines. To make
-  // this happen we probably need to move "ticking" players to timeline.
+  // then ticking the animations attached to those timelines. To make this
+  // happen we probably need to move "ticking" animations to timeline.
 
   // TODO(majidvp): We need to return a boolean here so that LTHI knows
   // whether it needs to schedule another frame.
@@ -341,15 +341,15 @@
   std::unique_ptr<MutatorInputState> result =
       std::make_unique<MutatorInputState>();
 
-  for (auto& player : ticking_players_) {
-    if (!player->IsWorkletAnimationPlayer())
+  for (auto& animation : ticking_animations_) {
+    if (!animation->IsWorkletAnimation())
       continue;
 
-    WorkletAnimationPlayer* worklet_player =
-        static_cast<WorkletAnimationPlayer*>(player.get());
+    WorkletAnimation* worklet_animation =
+        static_cast<WorkletAnimation*>(animation.get());
     MutatorInputState::AnimationState state{
-        worklet_player->id(), worklet_player->name(),
-        worklet_player->CurrentTime(monotonic_time, scroll_tree)};
+        worklet_animation->id(), worklet_animation->name(),
+        worklet_animation->CurrentTime(monotonic_time, scroll_tree)};
 
     result->animations.push_back(std::move(state));
   }
@@ -359,14 +359,14 @@
 
 bool AnimationHost::UpdateAnimationState(bool start_ready_animations,
                                          MutatorEvents* mutator_events) {
-  if (!NeedsTickAnimationPlayers())
+  if (!NeedsTickAnimation())
     return false;
 
   auto* animation_events = static_cast<AnimationEvents*>(mutator_events);
 
   TRACE_EVENT0("cc", "AnimationHost::UpdateAnimationState");
-  PlayersList ticking_players_copy = ticking_players_;
-  for (auto& it : ticking_players_copy)
+  AnimationsList ticking_animations_copy = ticking_animations_;
+  for (auto& it : ticking_animations_copy)
     it->UpdateState(start_ready_animations, animation_events);
 
   return true;
@@ -385,8 +385,8 @@
        ++event_index) {
     ElementId element_id = events->events_[event_index].element_id;
 
-    // Use the map of all ElementAnimations, not just ticking players, since
-    // non-ticking Players may still receive events for impl-only animations.
+    // Use the map of all ElementAnimations, not just ticking animations, since
+    // non-ticking animations may still receive events for impl-only animations.
     const ElementToAnimationsMap& all_element_animations =
         element_to_animations_map_;
     auto iter = all_element_animations.find(element_id);
@@ -573,22 +573,22 @@
       false /* needs_completion */);
 }
 
-void AnimationHost::AddToTicking(scoped_refptr<AnimationPlayer> player) {
-  DCHECK(std::find(ticking_players_.begin(), ticking_players_.end(), player) ==
-         ticking_players_.end());
-  ticking_players_.push_back(player);
+void AnimationHost::AddToTicking(scoped_refptr<Animation> animation) {
+  DCHECK(std::find(ticking_animations_.begin(), ticking_animations_.end(),
+                   animation) == ticking_animations_.end());
+  ticking_animations_.push_back(animation);
 }
 
-void AnimationHost::RemoveFromTicking(scoped_refptr<AnimationPlayer> player) {
-  auto to_erase =
-      std::find(ticking_players_.begin(), ticking_players_.end(), player);
-  if (to_erase != ticking_players_.end())
-    ticking_players_.erase(to_erase);
+void AnimationHost::RemoveFromTicking(scoped_refptr<Animation> animation) {
+  auto to_erase = std::find(ticking_animations_.begin(),
+                            ticking_animations_.end(), animation);
+  if (to_erase != ticking_animations_.end())
+    ticking_animations_.erase(to_erase);
 }
 
-const AnimationHost::PlayersList& AnimationHost::ticking_players_for_testing()
-    const {
-  return ticking_players_;
+const AnimationHost::AnimationsList&
+AnimationHost::ticking_animations_for_testing() const {
+  return ticking_animations_;
 }
 
 const AnimationHost::ElementToAnimationsMap&
@@ -611,27 +611,27 @@
 
   TRACE_EVENT0("cc", "AnimationHost::SetMutationUpdate");
   for (auto& animation_state : output_state->animations) {
-    int id = animation_state.animation_player_id;
+    int id = animation_state.animation_id;
 
     // TODO(majidvp): Use a map to make lookup O(1)
     auto to_update =
-        std::find_if(ticking_players_.begin(), ticking_players_.end(),
+        std::find_if(ticking_animations_.begin(), ticking_animations_.end(),
                      [id](auto& it) { return it->id() == id; });
 
-    if (to_update == ticking_players_.end())
+    if (to_update == ticking_animations_.end())
       continue;
 
-    DCHECK(to_update->get()->IsWorkletAnimationPlayer());
-    WorkletAnimationPlayer* worklet_player_to_update =
-        static_cast<WorkletAnimationPlayer*>(to_update->get());
+    DCHECK(to_update->get()->IsWorkletAnimation());
+    WorkletAnimation* worklet_animation_to_update =
+        static_cast<WorkletAnimation*>(to_update->get());
 
-    worklet_player_to_update->SetLocalTime(animation_state.local_time);
+    worklet_animation_to_update->SetLocalTime(animation_state.local_time);
   }
 }
 
 size_t AnimationHost::CompositedAnimationsCount() const {
   size_t composited_animations_count = 0;
-  for (const auto& it : ticking_players_)
+  for (const auto& it : ticking_animations_)
     composited_animations_count += it->TickingKeyframeModelsCount();
   return composited_animations_count;
 }
@@ -642,17 +642,17 @@
     bool current_frame_had_raf,
     bool next_frame_has_pending_raf) {
   // The |total_animations_count| is the total number of blink::Animations.
-  // A blink::Animation holds a CompositorAnimationPlayerHolder, which holds
-  // a CompositorAnimationPlayer, which holds a AnimationPlayer. In other
+  // A blink::Animation holds a CompositorAnimationHolder, which holds
+  // a CompositorAnimation, which holds a Animation. In other
   // words, if a blink::Animation can be accelerated on compositor, it would
-  // have a 1:1 mapping to a AnimationPlayer.
+  // have a 1:1 mapping to a Animation.
   // So to check how many main thread animations there are, we subtract the
-  // number of AnimationPlayer from |total_animations_count|.
-  size_t ticking_players_count = ticking_players_.size();
+  // number of Animation from |total_animations_count|.
+  size_t ticking_animations_count = ticking_animations_.size();
   if (main_thread_animations_count_ !=
-      total_animations_count - ticking_players_count) {
+      total_animations_count - ticking_animations_count) {
     main_thread_animations_count_ =
-        total_animations_count - ticking_players_count;
+        total_animations_count - ticking_animations_count;
     DCHECK_GE(main_thread_animations_count_, 0u);
     SetNeedsPushProperties();
   }
diff --git a/cc/animation/animation_host.h b/cc/animation/animation_host.h
index cebc9cb0..dc681c9 100644
--- a/cc/animation/animation_host.h
+++ b/cc/animation/animation_host.h
@@ -26,7 +26,7 @@
 
 namespace cc {
 
-class AnimationPlayer;
+class Animation;
 class AnimationTimeline;
 class ElementAnimations;
 class LayerTreeHost;
@@ -51,7 +51,7 @@
       std::unordered_map<ElementId,
                          scoped_refptr<ElementAnimations>,
                          ElementIdHash>;
-  using PlayersList = std::vector<scoped_refptr<AnimationPlayer>>;
+  using AnimationsList = std::vector<scoped_refptr<Animation>>;
 
   static std::unique_ptr<AnimationHost> CreateMainInstance();
   static std::unique_ptr<AnimationHost> CreateForTesting(
@@ -167,15 +167,15 @@
   // This should only be called from the main thread.
   ScrollOffsetAnimations& scroll_offset_animations() const;
 
-  // Registers the given animation player as ticking. A ticking animation
-  // player is one that has a running animation.
-  void AddToTicking(scoped_refptr<AnimationPlayer> player);
+  // Registers the given animation as ticking. A ticking animation is one that
+  // has a running keyframe model.
+  void AddToTicking(scoped_refptr<Animation> animation);
 
-  // Unregisters the given animation player. When this happens, the
-  // animation player will no longer be ticked.
-  void RemoveFromTicking(scoped_refptr<AnimationPlayer> player);
+  // Unregisters the given animation. When this happens, the animation will no
+  // longer be ticked.
+  void RemoveFromTicking(scoped_refptr<Animation> animation);
 
-  const PlayersList& ticking_players_for_testing() const;
+  const AnimationsList& ticking_animations_for_testing() const;
   const ElementToAnimationsMap& element_animations_for_testing() const;
 
   // LayerTreeMutatorClient.
@@ -201,7 +201,7 @@
 
   void EraseTimeline(scoped_refptr<AnimationTimeline> timeline);
 
-  bool NeedsTickAnimationPlayers() const;
+  bool NeedsTickAnimation() const;
   bool NeedsTickMutator() const;
 
   // Return the animator state representing all ticking worklet animations.
@@ -210,7 +210,7 @@
       const ScrollTree& scroll_tree);
 
   ElementToAnimationsMap element_to_animations_map_;
-  PlayersList ticking_players_;
+  AnimationsList ticking_animations_;
 
   // A list of all timelines which this host owns.
   using IdToTimelineMap =
diff --git a/cc/animation/animation_host_perftest.cc b/cc/animation/animation_host_perftest.cc
index 77a88856..afadb46 100644
--- a/cc/animation/animation_host_perftest.cc
+++ b/cc/animation/animation_host_perftest.cc
@@ -8,7 +8,7 @@
 #include "cc/animation/animation_id_provider.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/keyframe_effect.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/base/lap_timer.h"
 #include "cc/test/fake_impl_task_runner_provider.h"
 #include "cc/test/fake_layer_tree_host.h"
@@ -27,8 +27,8 @@
       : root_layer_impl_(),
         first_timeline_id_(),
         last_timeline_id_(),
-        first_player_id_(),
-        last_player_id_() {}
+        first_animation_id_(),
+        last_animation_id_() {}
 
   void SetUp() override {
     LayerTreeSettings settings;
@@ -57,37 +57,38 @@
     return layer_tree_host_->host_impl()->animation_host();
   }
 
-  void CreatePlayers(int num_players) {
-    all_players_timeline_ =
+  void CreateAnimations(int num_animations) {
+    all_animations_timeline_ =
         AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
-    host()->AddAnimationTimeline(all_players_timeline_);
+    host()->AddAnimationTimeline(all_animations_timeline_);
 
-    first_player_id_ = AnimationIdProvider::NextPlayerId();
-    last_player_id_ = first_player_id_;
+    first_animation_id_ = AnimationIdProvider::NextAnimationId();
+    last_animation_id_ = first_animation_id_;
 
-    for (int i = 0; i < num_players; ++i) {
+    for (int i = 0; i < num_animations; ++i) {
       scoped_refptr<Layer> layer = Layer::Create();
       root_layer_->AddChild(layer);
       layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
 
-      scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-          SingleKeyframeEffectAnimationPlayer::Create(last_player_id_);
-      last_player_id_ = AnimationIdProvider::NextPlayerId();
+      scoped_refptr<SingleKeyframeEffectAnimation> animation =
+          SingleKeyframeEffectAnimation::Create(last_animation_id_);
+      last_animation_id_ = AnimationIdProvider::NextAnimationId();
 
-      all_players_timeline_->AttachPlayer(player);
-      player->AttachElement(layer->element_id());
-      EXPECT_TRUE(player->element_animations(player->keyframe_effect()->id()));
+      all_animations_timeline_->AttachAnimation(animation);
+      animation->AttachElement(layer->element_id());
+      EXPECT_TRUE(
+          animation->element_animations(animation->keyframe_effect()->id()));
     }
 
-    // Create impl players.
+    // Create impl animations.
     layer_tree_host_->CommitAndCreateLayerImplTree();
 
     // Check impl instances created.
     scoped_refptr<AnimationTimeline> timeline_impl =
-        host_impl()->GetTimelineById(all_players_timeline_->id());
+        host_impl()->GetTimelineById(all_animations_timeline_->id());
     EXPECT_TRUE(timeline_impl);
-    for (int i = first_player_id_; i < last_player_id_; ++i)
-      EXPECT_TRUE(timeline_impl->GetPlayerById(i));
+    for (int i = first_animation_id_; i < last_animation_id_; ++i)
+      EXPECT_TRUE(timeline_impl->GetAnimationById(i));
   }
 
   void CreateTimelines(int num_timelines) {
@@ -114,9 +115,9 @@
       host_impl()->GetTimelineById(i)->SetNeedsPushProperties();
   }
 
-  void SetAllPlayersNeedPushProperties() const {
-    for (int i = first_player_id_; i < last_player_id_; ++i)
-      all_players_timeline_->GetPlayerById(i)->SetNeedsPushProperties();
+  void SetAllAnimationsNeedPushProperties() const {
+    for (int i = first_animation_id_; i < last_animation_id_; ++i)
+      all_animations_timeline_->GetAnimationById(i)->SetNeedsPushProperties();
   }
 
   void DoTest() {
@@ -124,7 +125,7 @@
     do {
       // Invalidate dirty flags.
       SetAllTimelinesNeedPushProperties();
-      SetAllPlayersNeedPushProperties();
+      SetAllAnimationsNeedPushProperties();
       host()->PushPropertiesTo(host_impl());
       timer_.NextLap();
     } while (!timer_.HasTimeLimitExpired());
@@ -140,20 +141,20 @@
   std::unique_ptr<FakeLayerTreeHost> layer_tree_host_;
   scoped_refptr<Layer> root_layer_;
   LayerImpl* root_layer_impl_;
-  scoped_refptr<AnimationTimeline> all_players_timeline_;
+  scoped_refptr<AnimationTimeline> all_animations_timeline_;
 
   int first_timeline_id_;
   int last_timeline_id_;
 
-  int first_player_id_;
-  int last_player_id_;
+  int first_animation_id_;
+  int last_animation_id_;
 
   LapTimer timer_;
   TestTaskGraphRunner task_graph_runner_;
 };
 
-TEST_F(AnimationHostPerfTest, Push1000PlayersPropertiesTo) {
-  CreatePlayers(1000);
+TEST_F(AnimationHostPerfTest, Push1000AnimationsPropertiesTo) {
+  CreateAnimations(1000);
   DoTest();
 }
 
diff --git a/cc/animation/animation_host_unittest.cc b/cc/animation/animation_host_unittest.cc
index ba20b92..df816b4 100644
--- a/cc/animation/animation_host_unittest.cc
+++ b/cc/animation/animation_host_unittest.cc
@@ -20,8 +20,8 @@
   ~AnimationHostTest() override = default;
 };
 
-// See AnimationPlayer tests on layer registration/unregistration in
-// animation_player_unittest.cc.
+// See Animation tests on layer registration/unregistration in
+// animation_unittest.cc.
 
 TEST_F(AnimationHostTest, SyncTimelinesAddRemove) {
   std::unique_ptr<AnimationHost> host(
@@ -99,7 +99,7 @@
   EXPECT_TRUE(host_impl_->ImplOnlyScrollAnimationUpdateTarget(
       element_id_, scroll_delta, max_scroll_offset, time, base::TimeDelta()));
 
-  // Detach all players from layers and timelines.
+  // Detach all animations from layers and timelines.
   host_impl_->ClearMutators();
 
   time += base::TimeDelta::FromSecondsD(0.1);
diff --git a/cc/animation/animation_id_provider.cc b/cc/animation/animation_id_provider.cc
index 8abb353..97b00977 100644
--- a/cc/animation/animation_id_provider.cc
+++ b/cc/animation/animation_id_provider.cc
@@ -10,7 +10,7 @@
 base::AtomicSequenceNumber g_next_keyframe_model_id;
 base::AtomicSequenceNumber g_next_group_id;
 base::AtomicSequenceNumber g_next_timeline_id;
-base::AtomicSequenceNumber g_next_player_id;
+base::AtomicSequenceNumber g_next_animation_id;
 
 int AnimationIdProvider::NextKeyframeModelId() {
   // Animation IDs start from 1.
@@ -26,8 +26,8 @@
   return g_next_timeline_id.GetNext() + 1;
 }
 
-int AnimationIdProvider::NextPlayerId() {
-  return g_next_player_id.GetNext() + 1;
+int AnimationIdProvider::NextAnimationId() {
+  return g_next_animation_id.GetNext() + 1;
 }
 
 }  // namespace cc
diff --git a/cc/animation/animation_id_provider.h b/cc/animation/animation_id_provider.h
index b0425bddd..62823be 100644
--- a/cc/animation/animation_id_provider.h
+++ b/cc/animation/animation_id_provider.h
@@ -16,7 +16,7 @@
   static int NextKeyframeModelId();
   static int NextGroupId();
   static int NextTimelineId();
-  static int NextPlayerId();
+  static int NextAnimationId();
 
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(AnimationIdProvider);
diff --git a/cc/animation/animation_player_unittest.cc b/cc/animation/animation_player_unittest.cc
index 59c3933..19f7ce7 100644
--- a/cc/animation/animation_player_unittest.cc
+++ b/cc/animation/animation_player_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 "cc/animation/animation_player.h"
+#include "cc/animation/animation.h"
 
 #include <memory>
 
@@ -19,21 +19,21 @@
 namespace cc {
 namespace {
 
-class AnimationPlayerTest : public AnimationTimelinesTest {
+class AnimationTest : public AnimationTimelinesTest {
  public:
-  AnimationPlayerTest()
-      : player_(AnimationPlayer::Create(player_id_)),
+  AnimationTest()
+      : animation_(Animation::Create(animation_id_)),
         group_id_(100),
         keyframe_model_id_(100) {
-    keyframe_effect_id_ = player_->NextKeyframeEffectId();
+    keyframe_effect_id_ = animation_->NextKeyframeEffectId();
   }
-  ~AnimationPlayerTest() override = default;
+  ~AnimationTest() override = default;
 
   int NextGroupId() { return ++group_id_; }
 
   int NextKeyframeModelId() { return ++keyframe_model_id_; }
 
-  int AddOpacityTransition(AnimationPlayer* target,
+  int AddOpacityTransition(Animation* target,
                            double duration,
                            float start_opacity,
                            float end_opacity,
@@ -63,7 +63,7 @@
     return id;
   }
 
-  int AddAnimatedTransform(AnimationPlayer* target,
+  int AddAnimatedTransform(Animation* target,
                            double duration,
                            TransformOperations start_operations,
                            TransformOperations operations,
@@ -90,7 +90,7 @@
     return id;
   }
 
-  int AddAnimatedTransform(AnimationPlayer* target,
+  int AddAnimatedTransform(Animation* target,
                            double duration,
                            int delta_x,
                            int delta_y,
@@ -106,7 +106,7 @@
                                 keyframe_effect_id);
   }
 
-  int AddAnimatedFilter(AnimationPlayer* target,
+  int AddAnimatedFilter(Animation* target,
                         double duration,
                         float start_brightness,
                         float end_brightness,
@@ -142,36 +142,36 @@
       bool needs_push_properties,
       KeyframeEffectId keyframe_effect_id) const {
     KeyframeEffect* keyframe_effect =
-        player_->GetKeyframeEffectById(keyframe_effect_id);
+        animation_->GetKeyframeEffectById(keyframe_effect_id);
     EXPECT_EQ(keyframe_effect->needs_push_properties(), needs_push_properties);
     EXPECT_EQ(timeline_->needs_push_properties(), needs_push_properties);
   }
 
  protected:
-  scoped_refptr<AnimationPlayer> player_;
-  scoped_refptr<AnimationPlayer> player_impl_;
+  scoped_refptr<Animation> animation_;
+  scoped_refptr<Animation> animation_impl_;
   int group_id_;
   KeyframeEffectId keyframe_effect_id_;
   int keyframe_model_id_;
 };
 // See element_animations_unittest.cc for active/pending observers tests.
 
-TEST_F(AnimationPlayerTest, AttachDetachLayerIfTimelineAttached) {
-  player_->AddKeyframeEffect(
+TEST_F(AnimationTest, AttachDetachLayerIfTimelineAttached) {
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
   CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_);
 
   host_->AddAnimationTimeline(timeline_);
   EXPECT_TRUE(timeline_->needs_push_properties());
 
-  timeline_->AttachPlayer(player_);
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id_));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id_));
+  timeline_->AttachAnimation(animation_);
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_));
   EXPECT_TRUE(timeline_->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
 
   host_->PushPropertiesTo(host_impl_);
@@ -180,118 +180,120 @@
 
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = timeline_impl_->GetPlayerById(player_id_);
-  EXPECT_TRUE(player_impl_);
+  animation_impl_ = timeline_impl_->GetAnimationById(animation_id_);
+  EXPECT_TRUE(animation_impl_);
 
-  EXPECT_FALSE(player_impl_->element_animations(keyframe_effect_id_));
+  EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id_));
   EXPECT_FALSE(
-      player_impl_->element_id_of_keyframe_effect(keyframe_effect_id_));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+      animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
   EXPECT_FALSE(timeline_->needs_push_properties());
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_),
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  EXPECT_EQ(animation_->GetKeyframeEffectById(keyframe_effect_id_),
             GetKeyframeEffectForElementId(element_id_));
-  EXPECT_TRUE(player_->element_animations(keyframe_effect_id_));
-  EXPECT_EQ(player_->element_id_of_keyframe_effect(keyframe_effect_id_),
+  EXPECT_TRUE(animation_->element_animations(keyframe_effect_id_));
+  EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id_),
             element_id_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
 
-  EXPECT_EQ(player_impl_->GetKeyframeEffectById(keyframe_effect_id_),
+  EXPECT_EQ(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_),
             GetImplKeyframeEffectForLayerId(element_id_));
-  EXPECT_TRUE(player_impl_->element_animations(keyframe_effect_id_));
-  EXPECT_EQ(player_impl_->element_id_of_keyframe_effect(keyframe_effect_id_),
+  EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id_));
+  EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_),
             element_id_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_);
 
-  player_->DetachElement();
+  animation_->DetachElement();
   EXPECT_FALSE(GetKeyframeEffectForElementId(element_id_));
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id_));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_));
   CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
 
   EXPECT_FALSE(GetImplKeyframeEffectForLayerId(element_id_));
-  EXPECT_FALSE(player_impl_->element_animations(keyframe_effect_id_));
+  EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id_));
   EXPECT_FALSE(
-      player_impl_->element_id_of_keyframe_effect(keyframe_effect_id_));
+      animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id_));
   CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_);
 
-  timeline_->DetachPlayer(player_);
-  EXPECT_FALSE(player_->animation_timeline());
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id_));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id_));
+  timeline_->DetachAnimation(animation_);
+  EXPECT_FALSE(animation_->animation_timeline());
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id_));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id_));
   EXPECT_TRUE(timeline_->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
   host_->PushPropertiesTo(host_impl_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_);
 }
 
-TEST_F(AnimationPlayerTest, AttachDetachTimelineIfLayerAttached) {
+TEST_F(AnimationTest, AttachDetachTimelineIfLayerAttached) {
   host_->AddAnimationTimeline(timeline_);
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_));
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_));
 
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id());
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
-  EXPECT_FALSE(player_->animation_timeline());
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  EXPECT_FALSE(animation_->animation_timeline());
   EXPECT_FALSE(GetKeyframeEffectForElementId(element_id_));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
-            element_id_);
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      element_id_);
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
 
-  timeline_->AttachPlayer(player_);
-  EXPECT_EQ(timeline_, player_->animation_timeline());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_),
+  timeline_->AttachAnimation(animation_);
+  EXPECT_EQ(timeline_, animation_->animation_timeline());
+  EXPECT_EQ(animation_->GetKeyframeEffectById(keyframe_effect_id_),
             GetKeyframeEffectForElementId(element_id_));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
-            element_id_);
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      element_id_);
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->needs_push_properties());
 
-  // Removing player from timeline detaches layer.
-  timeline_->DetachPlayer(player_);
-  EXPECT_FALSE(player_->animation_timeline());
+  // Removing animation from timeline detaches layer.
+  timeline_->DetachAnimation(animation_);
+  EXPECT_FALSE(animation_->animation_timeline());
   EXPECT_FALSE(GetKeyframeEffectForElementId(element_id_));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->needs_push_properties());
 }
 
-TEST_F(AnimationPlayerTest, PropertiesMutate) {
+TEST_F(AnimationTest, PropertiesMutate) {
   client_.RegisterElement(element_id_, ElementListType::ACTIVE);
   client_impl_.RegisterElement(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElement(element_id_, ElementListType::ACTIVE);
 
   host_->AddAnimationTimeline(timeline_);
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_));
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_));
 
-  timeline_->AttachPlayer(player_);
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  timeline_->AttachAnimation(animation_);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
@@ -308,13 +310,13 @@
 
   const double duration = 1.;
 
-  AddOpacityTransition(player_.get(), duration, start_opacity, end_opacity,
+  AddOpacityTransition(animation_.get(), duration, start_opacity, end_opacity,
                        false, keyframe_effect_id_);
 
-  AddAnimatedTransform(player_.get(), duration, transform_x, transform_y,
+  AddAnimatedTransform(animation_.get(), duration, transform_x, transform_y,
                        keyframe_effect_id_);
-  AddAnimatedFilter(player_.get(), duration, start_brightness, end_brightness,
-                    keyframe_effect_id_);
+  AddAnimatedFilter(animation_.get(), duration, start_brightness,
+                    end_brightness, keyframe_effect_id_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
@@ -367,7 +369,7 @@
       element_id_, ElementListType::PENDING, end_brightness);
 }
 
-TEST_F(AnimationPlayerTest, AttachTwoPlayersToOneLayer) {
+TEST_F(AnimationTest, AttachTwoAnimationsToOneLayer) {
   TestAnimationDelegate delegate1;
   TestAnimationDelegate delegate2;
 
@@ -375,32 +377,32 @@
   client_impl_.RegisterElement(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElement(element_id_, ElementListType::ACTIVE);
 
-  scoped_refptr<AnimationPlayer> player1 = AnimationPlayer::Create(100);
-  scoped_refptr<AnimationPlayer> player2 = AnimationPlayer::Create(200);
+  scoped_refptr<Animation> animation1 = Animation::Create(100);
+  scoped_refptr<Animation> animation2 = Animation::Create(200);
 
-  KeyframeEffectId keyframe_effect_id1 = player1->NextKeyframeEffectId();
-  player1->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id1 = animation1->NextKeyframeEffectId();
+  animation1->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id1));
-  ASSERT_TRUE(player1->GetKeyframeEffectById(keyframe_effect_id1));
-  KeyframeEffectId keyframe_effect_id2 = player2->NextKeyframeEffectId();
-  player2->AddKeyframeEffect(
+  ASSERT_TRUE(animation1->GetKeyframeEffectById(keyframe_effect_id1));
+  KeyframeEffectId keyframe_effect_id2 = animation2->NextKeyframeEffectId();
+  animation2->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id2));
-  ASSERT_TRUE(player2->GetKeyframeEffectById(keyframe_effect_id2));
+  ASSERT_TRUE(animation2->GetKeyframeEffectById(keyframe_effect_id2));
 
   host_->AddAnimationTimeline(timeline_);
 
-  timeline_->AttachPlayer(player1);
+  timeline_->AttachAnimation(animation1);
   EXPECT_TRUE(timeline_->needs_push_properties());
 
-  timeline_->AttachPlayer(player2);
+  timeline_->AttachAnimation(animation2);
   EXPECT_TRUE(timeline_->needs_push_properties());
 
-  player1->set_animation_delegate(&delegate1);
-  player2->set_animation_delegate(&delegate2);
+  animation1->set_animation_delegate(&delegate1);
+  animation2->set_animation_delegate(&delegate2);
 
-  // Attach players to the same layer.
-  player1->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
-  player2->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
+  // Attach animations to the same layer.
+  animation1->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
+  animation2->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
 
   const float start_opacity = .7f;
   const float end_opacity = .3f;
@@ -410,9 +412,9 @@
 
   const double duration = 1.;
 
-  AddOpacityTransition(player1.get(), duration, start_opacity, end_opacity,
+  AddOpacityTransition(animation1.get(), duration, start_opacity, end_opacity,
                        false, keyframe_effect_id1);
-  AddAnimatedTransform(player2.get(), duration, transform_x, transform_y,
+  AddAnimatedTransform(animation2.get(), duration, transform_x, transform_y,
                        keyframe_effect_id2);
 
   host_->PushPropertiesTo(host_impl_);
@@ -434,9 +436,9 @@
   EXPECT_TRUE(delegate2.started());
   EXPECT_FALSE(delegate2.finished());
 
-  EXPECT_FALSE(player1->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation1->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
-  EXPECT_FALSE(player2->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation2->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   time += base::TimeDelta::FromSecondsD(duration);
@@ -445,9 +447,9 @@
   EXPECT_TRUE(delegate1.finished());
   EXPECT_TRUE(delegate2.finished());
 
-  EXPECT_TRUE(player1->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_TRUE(animation1->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
-  EXPECT_TRUE(player2->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_TRUE(animation2->GetKeyframeEffectById(keyframe_effect_id2)
                   ->needs_push_properties());
 
   client_.ExpectOpacityPropertyMutated(element_id_, ElementListType::ACTIVE,
@@ -466,49 +468,50 @@
       element_id_, ElementListType::PENDING, transform_x, transform_y);
 }
 
-TEST_F(AnimationPlayerTest, AddRemoveAnimationToNonAttachedPlayer) {
+TEST_F(AnimationTest, AddRemoveAnimationToNonAttachedAnimation) {
   client_.RegisterElement(element_id_, ElementListType::ACTIVE);
   client_impl_.RegisterElement(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElement(element_id_, ElementListType::ACTIVE);
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_));
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_));
 
   const double duration = 1.;
   const float start_opacity = .7f;
   const float end_opacity = .3f;
 
-  const int filter_id = AddAnimatedFilter(player_.get(), duration, 0.1f, 0.9f,
-                                          keyframe_effect_id_);
-  AddOpacityTransition(player_.get(), duration, start_opacity, end_opacity,
+  const int filter_id = AddAnimatedFilter(animation_.get(), duration, 0.1f,
+                                          0.9f, keyframe_effect_id_);
+  AddOpacityTransition(animation_.get(), duration, start_opacity, end_opacity,
                        false, keyframe_effect_id_);
 
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
 
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(player_);
+  timeline_->AttachAnimation(animation_);
 
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations());
-  player_->RemoveKeyframeModelForKeyframeEffect(filter_id, keyframe_effect_id_);
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  animation_->RemoveKeyframeModelForKeyframeEffect(filter_id,
+                                                   keyframe_effect_id_);
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->needs_push_properties());
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
 
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations()
                    ->HasAnyAnimationTargetingProperty(TargetProperty::FILTER));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations()
                   ->HasAnyAnimationTargetingProperty(TargetProperty::OPACITY));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->needs_push_properties());
 
   host_->PushPropertiesTo(host_impl_);
@@ -545,142 +548,147 @@
       element_id_, ElementListType::ACTIVE, TargetProperty::FILTER));
 }
 
-TEST_F(AnimationPlayerTest, AddRemoveAnimationCausesSetNeedsCommit) {
+TEST_F(AnimationTest, AddRemoveAnimationCausesSetNeedsCommit) {
   client_.RegisterElement(element_id_, ElementListType::ACTIVE);
   host_->AddAnimationTimeline(timeline_);
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_));
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_));
 
-  timeline_->AttachPlayer(player_);
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  timeline_->AttachAnimation(animation_);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
 
   EXPECT_FALSE(client_.mutators_need_commit());
 
   const int keyframe_model_id = AddOpacityTransition(
-      player_.get(), 1., .7f, .3f, false, keyframe_effect_id_);
+      animation_.get(), 1., .7f, .3f, false, keyframe_effect_id_);
 
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 
-  player_->PauseKeyframeModelForKeyframeEffect(keyframe_model_id, 1.,
-                                               keyframe_effect_id_);
+  animation_->PauseKeyframeModelForKeyframeEffect(keyframe_model_id, 1.,
+                                                  keyframe_effect_id_);
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 
-  player_->RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
-                                                keyframe_effect_id_);
+  animation_->RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                                   keyframe_effect_id_);
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 }
 
-// If main-thread player switches to another layer within one frame then
-// impl-thread player must be switched as well.
-TEST_F(AnimationPlayerTest, SwitchToLayer) {
+// If main-thread animation switches to another layer within one frame then
+// impl-thread animation must be switched as well.
+TEST_F(AnimationTest, SwitchToLayer) {
   host_->AddAnimationTimeline(timeline_);
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  timeline_->AttachPlayer(player_);
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  timeline_->AttachAnimation(animation_);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
 
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = timeline_impl_->GetPlayerById(player_id_);
-  EXPECT_TRUE(player_impl_);
+  animation_impl_ = timeline_impl_->GetAnimationById(animation_id_);
+  EXPECT_TRUE(animation_impl_);
 
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_),
+  EXPECT_EQ(animation_->GetKeyframeEffectById(keyframe_effect_id_),
             GetKeyframeEffectForElementId(element_id_));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
-            element_id_);
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      element_id_);
 
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = timeline_impl_->GetPlayerById(player_id_);
-  EXPECT_TRUE(player_impl_);
-  EXPECT_EQ(player_impl_->GetKeyframeEffectById(keyframe_effect_id_),
+  animation_impl_ = timeline_impl_->GetAnimationById(animation_id_);
+  EXPECT_TRUE(animation_impl_);
+  EXPECT_EQ(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_),
             GetImplKeyframeEffectForLayerId(element_id_));
-  EXPECT_TRUE(player_impl_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
   EXPECT_EQ(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
       element_id_);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(false, keyframe_effect_id_);
 
   const ElementId new_element_id(NextTestLayerId());
-  player_->DetachElement();
-  player_->AttachElementForKeyframeEffect(new_element_id, keyframe_effect_id_);
+  animation_->DetachElement();
+  animation_->AttachElementForKeyframeEffect(new_element_id,
+                                             keyframe_effect_id_);
 
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_),
+  EXPECT_EQ(animation_->GetKeyframeEffectById(keyframe_effect_id_),
             GetKeyframeEffectForElementId(new_element_id));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
-            new_element_id);
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      new_element_id);
   CheckKeyframeEffectAndTimelineNeedsPushProperties(true, keyframe_effect_id_);
 
   host_->PushPropertiesTo(host_impl_);
 
-  EXPECT_EQ(player_impl_->GetKeyframeEffectById(keyframe_effect_id_),
+  EXPECT_EQ(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_),
             GetImplKeyframeEffectForLayerId(new_element_id));
-  EXPECT_TRUE(player_impl_->GetKeyframeEffectById(keyframe_effect_id_)
+  EXPECT_TRUE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
   EXPECT_EQ(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id_)->element_id(),
       new_element_id);
 }
 
-TEST_F(AnimationPlayerTest, ToString) {
-  player_->AddKeyframeEffect(
+TEST_F(AnimationTest, ToString) {
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id_));
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
-  EXPECT_EQ(base::StringPrintf(
-                "AnimationPlayer{id=%d, element_id=%s, keyframe_models=[]}",
-                player_->id(), element_id_.ToString().c_str()),
-            player_->ToString());
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
+  EXPECT_EQ(
+      base::StringPrintf("Animation{id=%d, element_id=%s, keyframe_models=[]}",
+                         animation_->id(), element_id_.ToString().c_str()),
+      animation_->ToString());
 
-  player_->AddKeyframeModelForKeyframeEffect(
+  animation_->AddKeyframeModelForKeyframeEffect(
       KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(15), 42,
                             73, TargetProperty::OPACITY),
       keyframe_effect_id_);
-  EXPECT_EQ(base::StringPrintf("AnimationPlayer{id=%d, element_id=%s, "
-                               "keyframe_models=[KeyframeModel{id=42, "
-                               "group=73, target_property_id=1, "
-                               "run_state=WAITING_FOR_TARGET_AVAILABILITY}]}",
-                               player_->id(), element_id_.ToString().c_str()),
-            player_->ToString());
+  EXPECT_EQ(
+      base::StringPrintf("Animation{id=%d, element_id=%s, "
+                         "keyframe_models=[KeyframeModel{id=42, "
+                         "group=73, target_property_id=1, "
+                         "run_state=WAITING_FOR_TARGET_AVAILABILITY}]}",
+                         animation_->id(), element_id_.ToString().c_str()),
+      animation_->ToString());
 
-  player_->AddKeyframeModelForKeyframeEffect(
+  animation_->AddKeyframeModelForKeyframeEffect(
       KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(18), 45,
                             76, TargetProperty::BOUNDS),
       keyframe_effect_id_);
   EXPECT_EQ(
       base::StringPrintf(
-          "AnimationPlayer{id=%d, element_id=%s, "
+          "Animation{id=%d, element_id=%s, "
           "keyframe_models=[KeyframeModel{id=42, "
           "group=73, target_property_id=1, "
           "run_state=WAITING_FOR_TARGET_AVAILABILITY}, KeyframeModel{id=45, "
           "group=76, "
           "target_property_id=5, run_state=WAITING_FOR_TARGET_AVAILABILITY}]}",
-          player_->id(), element_id_.ToString().c_str()),
-      player_->ToString());
+          animation_->id(), element_id_.ToString().c_str()),
+      animation_->ToString());
 
-  KeyframeEffectId second_keyframe_effect_id = player_->NextKeyframeEffectId();
+  KeyframeEffectId second_keyframe_effect_id =
+      animation_->NextKeyframeEffectId();
   ElementId second_element_id(NextTestLayerId());
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(second_keyframe_effect_id));
-  player_->AttachElementForKeyframeEffect(second_element_id,
-                                          second_keyframe_effect_id);
-  player_->AddKeyframeModelForKeyframeEffect(
+  animation_->AttachElementForKeyframeEffect(second_element_id,
+                                             second_keyframe_effect_id);
+  animation_->AddKeyframeModelForKeyframeEffect(
       KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(20), 48,
                             78, TargetProperty::OPACITY),
       second_keyframe_effect_id);
   EXPECT_EQ(
       base::StringPrintf(
-          "AnimationPlayer{id=%d, element_id=%s, "
+          "Animation{id=%d, element_id=%s, "
           "keyframe_models=[KeyframeModel{id=42, "
           "group=73, target_property_id=1, "
           "run_state=WAITING_FOR_TARGET_AVAILABILITY}, KeyframeModel{id=45, "
@@ -690,270 +698,272 @@
           "keyframe_models=[KeyframeModel{id=48, "
           "group=78, target_property_id=1, "
           "run_state=WAITING_FOR_TARGET_AVAILABILITY}]}",
-          player_->id(), element_id_.ToString().c_str(),
+          animation_->id(), element_id_.ToString().c_str(),
           second_element_id.ToString().c_str()),
-      player_->ToString());
+      animation_->ToString());
 }
 
-TEST_F(AnimationPlayerTest,
-       AddTwoKeyframeEffectsFromTheSameElementToOnePlayerTest) {
+TEST_F(AnimationTest,
+       AddTwoKeyframeEffectsFromTheSameElementToOneAnimationTest) {
   host_->AddAnimationTimeline(timeline_);
   EXPECT_TRUE(timeline_->needs_push_properties());
 
-  KeyframeEffectId keyframe_effect_id1 = player_->NextKeyframeEffectId();
+  KeyframeEffectId keyframe_effect_id1 = animation_->NextKeyframeEffectId();
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id1));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
 
-  KeyframeEffectId keyframe_effect_id2 = player_->NextKeyframeEffectId();
-  player_->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id2 = animation_->NextKeyframeEffectId();
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id2));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
-  timeline_->AttachPlayer(player_);
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id2));
+  timeline_->AttachAnimation(animation_);
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2));
   EXPECT_TRUE(timeline_->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   host_->PushPropertiesTo(host_impl_);
 
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = timeline_impl_->GetPlayerById(player_id_);
-  EXPECT_TRUE(player_impl_);
+  animation_impl_ = timeline_impl_->GetAnimationById(animation_id_);
+  EXPECT_TRUE(animation_impl_);
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
-  EXPECT_TRUE(player_->element_animations(keyframe_effect_id1));
-  EXPECT_EQ(player_->element_id_of_keyframe_effect(keyframe_effect_id1),
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
+  EXPECT_TRUE(animation_->element_animations(keyframe_effect_id1));
+  EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id1),
             element_id_);
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
 
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_NE(player_->element_id_of_keyframe_effect(keyframe_effect_id2),
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_NE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2),
             element_id_);
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   const scoped_refptr<ElementAnimations> element_animations =
       host_->GetElementAnimationsForElementId(element_id_);
   EXPECT_TRUE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id1)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)));
   EXPECT_FALSE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
-  EXPECT_TRUE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_EQ(player_->element_id_of_keyframe_effect(keyframe_effect_id2),
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
+  EXPECT_TRUE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_EQ(animation_->element_id_of_keyframe_effect(keyframe_effect_id2),
             element_id_);
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                   ->needs_push_properties());
 
   EXPECT_TRUE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
 
   host_->PushPropertiesTo(host_impl_);
 
   const scoped_refptr<ElementAnimations> element_animations_impl =
       host_impl_->GetElementAnimationsForElementId(element_id_);
   EXPECT_TRUE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
   EXPECT_TRUE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
 
-  EXPECT_TRUE(player_impl_->element_animations(keyframe_effect_id1));
-  EXPECT_EQ(player_impl_->element_id_of_keyframe_effect(keyframe_effect_id1),
+  EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id1));
+  EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id1),
             element_id_);
-  EXPECT_TRUE(player_impl_->element_animations(keyframe_effect_id2));
-  EXPECT_EQ(player_impl_->element_id_of_keyframe_effect(keyframe_effect_id2),
+  EXPECT_TRUE(animation_impl_->element_animations(keyframe_effect_id2));
+  EXPECT_EQ(animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id2),
             element_id_);
 
-  player_->DetachElement();
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id1));
+  animation_->DetachElement();
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1));
   EXPECT_FALSE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id1)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)));
 
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2));
   EXPECT_FALSE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
 
   EXPECT_TRUE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
   EXPECT_TRUE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
 
   host_->PushPropertiesTo(host_impl_);
 
-  EXPECT_FALSE(player_impl_->element_animations(keyframe_effect_id1));
+  EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id1));
   EXPECT_FALSE(
-      player_impl_->element_id_of_keyframe_effect(keyframe_effect_id1));
+      animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id1));
   EXPECT_FALSE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
-  EXPECT_FALSE(player_impl_->element_animations(keyframe_effect_id2));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id1)));
+  EXPECT_FALSE(animation_impl_->element_animations(keyframe_effect_id2));
   EXPECT_FALSE(
-      player_impl_->element_id_of_keyframe_effect(keyframe_effect_id2));
+      animation_impl_->element_id_of_keyframe_effect(keyframe_effect_id2));
   EXPECT_FALSE(element_animations_impl->keyframe_effects_list().HasObserver(
-      player_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_impl_->GetKeyframeEffectById(keyframe_effect_id2)));
 
-  timeline_->DetachPlayer(player_);
-  EXPECT_FALSE(player_->animation_timeline());
+  timeline_->DetachAnimation(animation_);
+  EXPECT_FALSE(animation_->animation_timeline());
 
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2));
 
   EXPECT_TRUE(timeline_->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 }
 
-TEST_F(AnimationPlayerTest,
-       AddTwoKeyframeEffectsFromDifferentElementsToOnePlayerTest) {
+TEST_F(AnimationTest,
+       AddTwoKeyframeEffectsFromDifferentElementsToOneAnimationTest) {
   host_->AddAnimationTimeline(timeline_);
 
-  KeyframeEffectId keyframe_effect_id1 = player_->NextKeyframeEffectId();
+  KeyframeEffectId keyframe_effect_id1 = animation_->NextKeyframeEffectId();
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id1));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
 
-  KeyframeEffectId keyframe_effect_id2 = player_->NextKeyframeEffectId();
-  player_->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id2 = animation_->NextKeyframeEffectId();
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id2));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_animations(keyframe_effect_id2));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id1));
-  EXPECT_FALSE(player_->element_id_of_keyframe_effect(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_animations(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->element_id_of_keyframe_effect(keyframe_effect_id2));
   EXPECT_TRUE(timeline_->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   ElementId element1(NextTestLayerId());
   ElementId element2(NextTestLayerId());
 
-  player_->AttachElementForKeyframeEffect(element1, keyframe_effect_id1);
-  player_->AttachElementForKeyframeEffect(element2, keyframe_effect_id2);
+  animation_->AttachElementForKeyframeEffect(element1, keyframe_effect_id1);
+  animation_->AttachElementForKeyframeEffect(element2, keyframe_effect_id2);
 
-  EXPECT_FALSE(player_->animation_timeline());
+  EXPECT_FALSE(animation_->animation_timeline());
 
   scoped_refptr<ElementAnimations> element_animations =
       host_->GetElementAnimationsForElementId(element1);
   EXPECT_FALSE(element_animations);
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(),
-            element1);
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(),
+      element1);
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
 
-  timeline_->AttachPlayer(player_);
-  EXPECT_EQ(timeline_, player_->animation_timeline());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  timeline_->AttachAnimation(animation_);
+  EXPECT_EQ(timeline_, animation_->animation_timeline());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->element_animations());
-  EXPECT_EQ(player_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(),
-            element1);
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_EQ(
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id(),
+      element1);
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
 
   element_animations = host_->GetElementAnimationsForElementId(element1);
   EXPECT_TRUE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id1)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)));
   EXPECT_FALSE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
 
   element_animations = host_->GetElementAnimationsForElementId(element2);
   EXPECT_TRUE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
 
-  player_->DetachElement();
-  EXPECT_TRUE(player_->animation_timeline());
+  animation_->DetachElement();
+  EXPECT_TRUE(animation_->animation_timeline());
   EXPECT_FALSE(element_animations->keyframe_effects_list().HasObserver(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id1)->element_id());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)->element_id());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                   ->needs_push_properties());
 
-  // Removing player from timeline detaches layer.
-  timeline_->DetachPlayer(player_);
-  EXPECT_FALSE(player_->animation_timeline());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  // Removing animation from timeline detaches layer.
+  timeline_->DetachAnimation(animation_);
+  EXPECT_FALSE(animation_->animation_timeline());
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id1)->element_id());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+      animation_->GetKeyframeEffectById(keyframe_effect_id1)->element_id());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->element_animations());
   EXPECT_FALSE(
-      player_->GetKeyframeEffectById(keyframe_effect_id2)->element_id());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+      animation_->GetKeyframeEffectById(keyframe_effect_id2)->element_id());
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                   ->needs_push_properties());
 }
 
-TEST_F(AnimationPlayerTest, TickingAnimationsFromTwoKeyframeEffects) {
+TEST_F(AnimationTest, TickingAnimationsFromTwoKeyframeEffects) {
   TestAnimationDelegate delegate1;
 
   client_.RegisterElement(element_id_, ElementListType::ACTIVE);
   client_impl_.RegisterElement(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElement(element_id_, ElementListType::ACTIVE);
 
-  KeyframeEffectId keyframe_effect_id1 = player_->NextKeyframeEffectId();
+  KeyframeEffectId keyframe_effect_id1 = animation_->NextKeyframeEffectId();
 
-  player_->AddKeyframeEffect(
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id1));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
 
-  KeyframeEffectId keyframe_effect_id2 = player_->NextKeyframeEffectId();
-  player_->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id2 = animation_->NextKeyframeEffectId();
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id2));
-  ASSERT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  ASSERT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   host_->AddAnimationTimeline(timeline_);
 
-  timeline_->AttachPlayer(player_);
+  timeline_->AttachAnimation(animation_);
   EXPECT_TRUE(timeline_->needs_push_properties());
 
-  player_->set_animation_delegate(&delegate1);
+  animation_->set_animation_delegate(&delegate1);
 
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
-  player_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id1);
+  animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id2);
 
   const float start_opacity = .7f;
   const float end_opacity = .3f;
@@ -963,9 +973,9 @@
 
   const double duration = 1.;
 
-  AddOpacityTransition(player_.get(), duration, start_opacity, end_opacity,
+  AddOpacityTransition(animation_.get(), duration, start_opacity, end_opacity,
                        false, keyframe_effect_id1);
-  AddAnimatedTransform(player_.get(), duration, transform_x, transform_y,
+  AddAnimatedTransform(animation_.get(), duration, transform_x, transform_y,
                        keyframe_effect_id2);
   host_->PushPropertiesTo(host_impl_);
   host_impl_->ActivateAnimations();
@@ -980,9 +990,9 @@
   EXPECT_TRUE(delegate1.started());
   EXPECT_FALSE(delegate1.finished());
 
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                    ->needs_push_properties());
 
   time += base::TimeDelta::FromSecondsD(duration);
@@ -990,9 +1000,9 @@
 
   EXPECT_TRUE(delegate1.finished());
 
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                   ->needs_push_properties());
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id2)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id2)
                   ->needs_push_properties());
 
   client_.ExpectOpacityPropertyMutated(element_id_, ElementListType::ACTIVE,
@@ -1011,36 +1021,36 @@
       element_id_, ElementListType::PENDING, transform_x, transform_y);
 }
 
-TEST_F(AnimationPlayerTest, KeyframeEffectSyncToImplTest) {
+TEST_F(AnimationTest, KeyframeEffectSyncToImplTest) {
   host_->AddAnimationTimeline(timeline_);
   EXPECT_TRUE(timeline_->needs_push_properties());
-  timeline_->AttachPlayer(player_);
+  timeline_->AttachAnimation(animation_);
 
-  KeyframeEffectId keyframe_effect_id1 = player_->NextKeyframeEffectId();
-  player_->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id1 = animation_->NextKeyframeEffectId();
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id1));
-  EXPECT_TRUE(player_->GetKeyframeEffectById(keyframe_effect_id1));
-  EXPECT_FALSE(player_->GetKeyframeEffectById(keyframe_effect_id1)
+  EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id1));
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id1)
                    ->needs_push_properties());
 
   host_->PushPropertiesTo(host_impl_);
 
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = timeline_impl_->GetPlayerById(player_id_);
-  EXPECT_TRUE(player_impl_);
-  EXPECT_TRUE(player_impl_->GetKeyframeEffectById(keyframe_effect_id1));
+  animation_impl_ = timeline_impl_->GetAnimationById(animation_id_);
+  EXPECT_TRUE(animation_impl_);
+  EXPECT_TRUE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id1));
 
   EXPECT_FALSE(timeline_->needs_push_properties());
 
-  KeyframeEffectId keyframe_effect_id2 = player_->NextKeyframeEffectId();
-  player_->AddKeyframeEffect(
+  KeyframeEffectId keyframe_effect_id2 = animation_->NextKeyframeEffectId();
+  animation_->AddKeyframeEffect(
       base::MakeUnique<KeyframeEffect>(keyframe_effect_id2));
   EXPECT_TRUE(timeline_->needs_push_properties());
 
   host_->PushPropertiesTo(host_impl_);
 
-  EXPECT_TRUE(player_impl_->GetKeyframeEffectById(keyframe_effect_id2));
+  EXPECT_TRUE(animation_impl_->GetKeyframeEffectById(keyframe_effect_id2));
 }
 
 }  // namespace
diff --git a/cc/animation/animation_timeline.cc b/cc/animation/animation_timeline.cc
index 0c7147e..0d57f639 100644
--- a/cc/animation/animation_timeline.cc
+++ b/cc/animation/animation_timeline.cc
@@ -6,8 +6,8 @@
 
 #include <algorithm>
 
+#include "cc/animation/animation.h"
 #include "cc/animation/animation_host.h"
-#include "cc/animation/animation_player.h"
 
 namespace cc {
 
@@ -22,7 +22,7 @@
       is_impl_only_(false) {}
 
 AnimationTimeline::~AnimationTimeline() {
-  for (auto& kv : id_to_player_map_)
+  for (auto& kv : id_to_animation_map_)
     kv.second->SetAnimationTimeline(nullptr);
 }
 
@@ -36,38 +36,39 @@
     return;
 
   animation_host_ = animation_host;
-  for (auto& kv : id_to_player_map_)
+  for (auto& kv : id_to_animation_map_)
     kv.second->SetAnimationHost(animation_host);
 
   SetNeedsPushProperties();
 }
 
-void AnimationTimeline::AttachPlayer(scoped_refptr<AnimationPlayer> player) {
-  DCHECK(player->id());
-  player->SetAnimationHost(animation_host_);
-  player->SetAnimationTimeline(this);
-  id_to_player_map_.insert(std::make_pair(player->id(), std::move(player)));
+void AnimationTimeline::AttachAnimation(scoped_refptr<Animation> animation) {
+  DCHECK(animation->id());
+  animation->SetAnimationHost(animation_host_);
+  animation->SetAnimationTimeline(this);
+  id_to_animation_map_.insert(
+      std::make_pair(animation->id(), std::move(animation)));
 
   SetNeedsPushProperties();
 }
 
-void AnimationTimeline::DetachPlayer(scoped_refptr<AnimationPlayer> player) {
-  DCHECK(player->id());
-  ErasePlayer(player);
-  id_to_player_map_.erase(player->id());
+void AnimationTimeline::DetachAnimation(scoped_refptr<Animation> animation) {
+  DCHECK(animation->id());
+  EraseAnimation(animation);
+  id_to_animation_map_.erase(animation->id());
 
   SetNeedsPushProperties();
 }
 
-AnimationPlayer* AnimationTimeline::GetPlayerById(int player_id) const {
-  auto f = id_to_player_map_.find(player_id);
-  return f == id_to_player_map_.end() ? nullptr : f->second.get();
+Animation* AnimationTimeline::GetAnimationById(int animation_id) const {
+  auto f = id_to_animation_map_.find(animation_id);
+  return f == id_to_animation_map_.end() ? nullptr : f->second.get();
 }
 
-void AnimationTimeline::ClearPlayers() {
-  for (auto& kv : id_to_player_map_)
-    ErasePlayer(kv.second);
-  id_to_player_map_.clear();
+void AnimationTimeline::ClearAnimations() {
+  for (auto& kv : id_to_animation_map_)
+    EraseAnimation(kv.second);
+  id_to_animation_map_.clear();
 
   SetNeedsPushProperties();
 }
@@ -81,54 +82,55 @@
 void AnimationTimeline::PushPropertiesTo(AnimationTimeline* timeline_impl) {
   if (needs_push_properties_) {
     needs_push_properties_ = false;
-    PushAttachedPlayersToImplThread(timeline_impl);
-    RemoveDetachedPlayersFromImplThread(timeline_impl);
+    PushAttachedAnimationsToImplThread(timeline_impl);
+    RemoveDetachedAnimationsFromImplThread(timeline_impl);
     PushPropertiesToImplThread(timeline_impl);
   }
 }
 
-void AnimationTimeline::PushAttachedPlayersToImplThread(
+void AnimationTimeline::PushAttachedAnimationsToImplThread(
     AnimationTimeline* timeline_impl) const {
-  for (auto& kv : id_to_player_map_) {
-    auto& player = kv.second;
-    AnimationPlayer* player_impl = timeline_impl->GetPlayerById(player->id());
-    if (player_impl)
+  for (auto& kv : id_to_animation_map_) {
+    auto& animation = kv.second;
+    Animation* animation_impl =
+        timeline_impl->GetAnimationById(animation->id());
+    if (animation_impl)
       continue;
 
-    scoped_refptr<AnimationPlayer> to_add = player->CreateImplInstance();
-    timeline_impl->AttachPlayer(to_add.get());
+    scoped_refptr<Animation> to_add = animation->CreateImplInstance();
+    timeline_impl->AttachAnimation(to_add.get());
   }
 }
 
-void AnimationTimeline::RemoveDetachedPlayersFromImplThread(
+void AnimationTimeline::RemoveDetachedAnimationsFromImplThread(
     AnimationTimeline* timeline_impl) const {
-  IdToPlayerMap& players_impl = timeline_impl->id_to_player_map_;
+  IdToAnimationMap& animations_impl = timeline_impl->id_to_animation_map_;
 
-  // Erase all the impl players which |this| doesn't have.
-  for (auto it = players_impl.begin(); it != players_impl.end();) {
-    if (GetPlayerById(it->second->id())) {
+  // Erase all the impl animations which |this| doesn't have.
+  for (auto it = animations_impl.begin(); it != animations_impl.end();) {
+    if (GetAnimationById(it->second->id())) {
       ++it;
     } else {
-      timeline_impl->ErasePlayer(it->second);
-      it = players_impl.erase(it);
+      timeline_impl->EraseAnimation(it->second);
+      it = animations_impl.erase(it);
     }
   }
 }
 
-void AnimationTimeline::ErasePlayer(scoped_refptr<AnimationPlayer> player) {
-  if (player->has_element_animations())
-    player->DetachElement();
-  player->SetAnimationTimeline(nullptr);
-  player->SetAnimationHost(nullptr);
+void AnimationTimeline::EraseAnimation(scoped_refptr<Animation> animation) {
+  if (animation->has_element_animations())
+    animation->DetachElement();
+  animation->SetAnimationTimeline(nullptr);
+  animation->SetAnimationHost(nullptr);
 }
 
 void AnimationTimeline::PushPropertiesToImplThread(
     AnimationTimeline* timeline_impl) {
-  for (auto& kv : id_to_player_map_) {
-    AnimationPlayer* player = kv.second.get();
-    if (AnimationPlayer* player_impl =
-            timeline_impl->GetPlayerById(player->id())) {
-      player->PushPropertiesTo(player_impl);
+  for (auto& kv : id_to_animation_map_) {
+    Animation* animation = kv.second.get();
+    if (Animation* animation_impl =
+            timeline_impl->GetAnimationById(animation->id())) {
+      animation->PushPropertiesTo(animation_impl);
     }
   }
 }
diff --git a/cc/animation/animation_timeline.h b/cc/animation/animation_timeline.h
index b72cc01..4c08bb5 100644
--- a/cc/animation/animation_timeline.h
+++ b/cc/animation/animation_timeline.h
@@ -14,12 +14,12 @@
 
 namespace cc {
 
+class Animation;
 class AnimationHost;
-class AnimationPlayer;
 
-// An AnimationTimeline owns a group of AnimationPlayers.
+// An AnimationTimeline owns a group of Animations.
 // This is a cc counterpart for blink::AnimationTimeline (in 1:1 relationship).
-// Each AnimationTimeline and its AnimationPlayers have their copies on
+// Each AnimationTimeline and its Animations have their copies on
 // the impl thread. We synchronize main thread and impl thread instances
 // using integer IDs.
 class CC_ANIMATION_EXPORT AnimationTimeline
@@ -38,14 +38,14 @@
   void set_is_impl_only(bool is_impl_only) { is_impl_only_ = is_impl_only; }
   bool is_impl_only() const { return is_impl_only_; }
 
-  void AttachPlayer(scoped_refptr<AnimationPlayer> player);
-  void DetachPlayer(scoped_refptr<AnimationPlayer> player);
+  void AttachAnimation(scoped_refptr<Animation> animation);
+  void DetachAnimation(scoped_refptr<Animation> animation);
 
-  void ClearPlayers();
+  void ClearAnimations();
 
   void PushPropertiesTo(AnimationTimeline* timeline_impl);
 
-  AnimationPlayer* GetPlayerById(int player_id) const;
+  Animation* GetAnimationById(int animation_id) const;
 
   void SetNeedsPushProperties();
   bool needs_push_properties() const { return needs_push_properties_; }
@@ -56,15 +56,16 @@
   explicit AnimationTimeline(int id);
   virtual ~AnimationTimeline();
 
-  void PushAttachedPlayersToImplThread(AnimationTimeline* timeline) const;
-  void RemoveDetachedPlayersFromImplThread(AnimationTimeline* timeline) const;
+  void PushAttachedAnimationsToImplThread(AnimationTimeline* timeline) const;
+  void RemoveDetachedAnimationsFromImplThread(
+      AnimationTimeline* timeline) const;
   void PushPropertiesToImplThread(AnimationTimeline* timeline);
 
-  void ErasePlayer(scoped_refptr<AnimationPlayer> player);
+  void EraseAnimation(scoped_refptr<Animation> animation);
 
-  // A list of all players which this timeline owns.
-  using IdToPlayerMap = std::unordered_map<int, scoped_refptr<AnimationPlayer>>;
-  IdToPlayerMap id_to_player_map_;
+  // A list of all animations which this timeline owns.
+  using IdToAnimationMap = std::unordered_map<int, scoped_refptr<Animation>>;
+  IdToAnimationMap id_to_animation_map_;
 
   int id_;
   AnimationHost* animation_host_;
diff --git a/cc/animation/animation_timeline_unittest.cc b/cc/animation/animation_timeline_unittest.cc
index 3f210f2..e6c9874 100644
--- a/cc/animation/animation_timeline_unittest.cc
+++ b/cc/animation/animation_timeline_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "cc/animation/animation_host.h"
 #include "cc/animation/animation_id_provider.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/test/animation_test_common.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -14,14 +14,14 @@
 namespace cc {
 namespace {
 
-TEST(AnimationTimelineTest, SyncPlayersAttachDetach) {
+TEST(AnimationTimelineTest, SyncAnimationsAttachDetach) {
   std::unique_ptr<AnimationHost> host(
       AnimationHost::CreateForTesting(ThreadInstance::MAIN));
   std::unique_ptr<AnimationHost> host_impl(
       AnimationHost::CreateForTesting(ThreadInstance::IMPL));
 
   const int timeline_id = AnimationIdProvider::NextTimelineId();
-  const int player_id = AnimationIdProvider::NextPlayerId();
+  const int animation_id = AnimationIdProvider::NextAnimationId();
 
   scoped_refptr<AnimationTimeline> timeline_impl(
       AnimationTimeline::Create(timeline_id));
@@ -34,42 +34,42 @@
   host_impl->AddAnimationTimeline(timeline_impl.get());
   EXPECT_TRUE(timeline_impl->animation_host());
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player(
-      SingleKeyframeEffectAnimationPlayer::Create(player_id));
-  timeline->AttachPlayer(player.get());
-  EXPECT_TRUE(player->animation_timeline());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation(
+      SingleKeyframeEffectAnimation::Create(animation_id));
+  timeline->AttachAnimation(animation.get());
+  EXPECT_TRUE(animation->animation_timeline());
 
-  EXPECT_FALSE(timeline_impl->GetPlayerById(player_id));
+  EXPECT_FALSE(timeline_impl->GetAnimationById(animation_id));
 
   timeline->PushPropertiesTo(timeline_impl.get());
 
-  scoped_refptr<AnimationPlayer> player_impl =
-      timeline_impl->GetPlayerById(player_id);
-  EXPECT_TRUE(player_impl);
-  EXPECT_EQ(player_impl->id(), player_id);
-  EXPECT_TRUE(player_impl->animation_timeline());
+  scoped_refptr<Animation> animation_impl =
+      timeline_impl->GetAnimationById(animation_id);
+  EXPECT_TRUE(animation_impl);
+  EXPECT_EQ(animation_impl->id(), animation_id);
+  EXPECT_TRUE(animation_impl->animation_timeline());
 
   timeline->PushPropertiesTo(timeline_impl.get());
-  EXPECT_EQ(player_impl, timeline_impl->GetPlayerById(player_id));
+  EXPECT_EQ(animation_impl, timeline_impl->GetAnimationById(animation_id));
 
-  timeline->DetachPlayer(player.get());
-  EXPECT_FALSE(player->animation_timeline());
+  timeline->DetachAnimation(animation.get());
+  EXPECT_FALSE(animation->animation_timeline());
 
   timeline->PushPropertiesTo(timeline_impl.get());
-  EXPECT_FALSE(timeline_impl->GetPlayerById(player_id));
+  EXPECT_FALSE(timeline_impl->GetAnimationById(animation_id));
 
-  EXPECT_FALSE(player_impl->animation_timeline());
+  EXPECT_FALSE(animation_impl->animation_timeline());
 }
 
-TEST(AnimationTimelineTest, ClearPlayers) {
+TEST(AnimationTimelineTest, ClearAnimations) {
   std::unique_ptr<AnimationHost> host(
       AnimationHost::CreateForTesting(ThreadInstance::MAIN));
   std::unique_ptr<AnimationHost> host_impl(
       AnimationHost::CreateForTesting(ThreadInstance::IMPL));
 
   const int timeline_id = AnimationIdProvider::NextTimelineId();
-  const int player_id1 = AnimationIdProvider::NextPlayerId();
-  const int player_id2 = AnimationIdProvider::NextPlayerId();
+  const int animation_id1 = AnimationIdProvider::NextAnimationId();
+  const int animation_id2 = AnimationIdProvider::NextAnimationId();
 
   scoped_refptr<AnimationTimeline> timeline_impl(
       AnimationTimeline::Create(timeline_id));
@@ -79,25 +79,25 @@
   host->AddAnimationTimeline(timeline.get());
   host_impl->AddAnimationTimeline(timeline_impl.get());
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player1(
-      SingleKeyframeEffectAnimationPlayer::Create(player_id1));
-  timeline->AttachPlayer(player1.get());
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player2(
-      SingleKeyframeEffectAnimationPlayer::Create(player_id2));
-  timeline->AttachPlayer(player2.get());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation1(
+      SingleKeyframeEffectAnimation::Create(animation_id1));
+  timeline->AttachAnimation(animation1.get());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation2(
+      SingleKeyframeEffectAnimation::Create(animation_id2));
+  timeline->AttachAnimation(animation2.get());
 
   timeline->PushPropertiesTo(timeline_impl.get());
 
-  EXPECT_TRUE(timeline_impl->GetPlayerById(player_id1));
-  EXPECT_TRUE(timeline_impl->GetPlayerById(player_id2));
+  EXPECT_TRUE(timeline_impl->GetAnimationById(animation_id1));
+  EXPECT_TRUE(timeline_impl->GetAnimationById(animation_id2));
 
-  timeline->ClearPlayers();
-  EXPECT_FALSE(timeline->GetPlayerById(player_id1));
-  EXPECT_FALSE(timeline->GetPlayerById(player_id2));
+  timeline->ClearAnimations();
+  EXPECT_FALSE(timeline->GetAnimationById(animation_id1));
+  EXPECT_FALSE(timeline->GetAnimationById(animation_id2));
 
-  timeline_impl->ClearPlayers();
-  EXPECT_FALSE(timeline_impl->GetPlayerById(player_id1));
-  EXPECT_FALSE(timeline_impl->GetPlayerById(player_id2));
+  timeline_impl->ClearAnimations();
+  EXPECT_FALSE(timeline_impl->GetAnimationById(animation_id1));
+  EXPECT_FALSE(timeline_impl->GetAnimationById(animation_id2));
 }
 
 }  // namespace
diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc
index 1e4c555..9cff257 100644
--- a/cc/animation/element_animations_unittest.cc
+++ b/cc/animation/element_animations_unittest.cc
@@ -13,7 +13,7 @@
 #include "cc/animation/keyframe_effect.h"
 #include "cc/animation/keyframed_animation_curve.h"
 #include "cc/animation/scroll_offset_animation_curve.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/transform_operations.h"
 #include "cc/test/animation_test_common.h"
 #include "cc/test/animation_timelines_test_common.h"
@@ -41,11 +41,11 @@
 
   void SetUp() override {
     AnimationTimelinesTest::SetUp();
-    player_ = SingleKeyframeEffectAnimationPlayer::Create(player_id_);
+    animation_ = SingleKeyframeEffectAnimation::Create(animation_id_);
   }
 
-  void CreateImplTimelineAndPlayer() override {
-    AnimationTimelinesTest::CreateImplTimelineAndPlayer();
+  void CreateImplTimelineAndAnimation() override {
+    AnimationTimelinesTest::CreateImplTimelineAndAnimation();
   }
 
   std::unique_ptr<AnimationEvents> CreateEventsForTesting() {
@@ -55,7 +55,7 @@
   }
 };
 
-// See animation_player_unittest.cc for integration with AnimationPlayer.
+// See animation_unittest.cc for integration with Animation.
 
 TEST_F(ElementAnimationsTest, AttachToLayerInActiveTree) {
   // Set up the layer which is in active tree for main thread and not
@@ -66,14 +66,14 @@
   EXPECT_TRUE(client_.IsElementInList(element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.IsElementInList(element_id_, ElementListType::PENDING));
 
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   EXPECT_TRUE(element_animations_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_->has_element_in_pending_list());
 
   PushProperties();
 
-  GetImplTimelineAndPlayerByID();
+  GetImplTimelineAndAnimationByID();
 
   EXPECT_FALSE(element_animations_impl_->has_element_in_active_list());
   EXPECT_TRUE(element_animations_impl_->has_element_in_pending_list());
@@ -91,40 +91,40 @@
   // kill layer on main thread.
   client_.UnregisterElement(element_id_, ElementListType::ACTIVE);
   EXPECT_EQ(element_animations_,
-            player_->keyframe_effect()->element_animations());
+            animation_->keyframe_effect()->element_animations());
   EXPECT_FALSE(element_animations_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_->has_element_in_pending_list());
 
   // Sync doesn't detach LayerImpl.
   PushProperties();
   EXPECT_EQ(element_animations_impl_,
-            player_impl_->keyframe_effect()->element_animations());
+            animation_impl_->keyframe_effect()->element_animations());
   EXPECT_TRUE(element_animations_impl_->has_element_in_active_list());
   EXPECT_TRUE(element_animations_impl_->has_element_in_pending_list());
 
   // Kill layer on impl thread in pending tree.
   client_impl_.UnregisterElement(element_id_, ElementListType::PENDING);
   EXPECT_EQ(element_animations_impl_,
-            player_impl_->keyframe_effect()->element_animations());
+            animation_impl_->keyframe_effect()->element_animations());
   EXPECT_TRUE(element_animations_impl_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_impl_->has_element_in_pending_list());
 
   // Kill layer on impl thread in active tree.
   client_impl_.UnregisterElement(element_id_, ElementListType::ACTIVE);
   EXPECT_EQ(element_animations_impl_,
-            player_impl_->keyframe_effect()->element_animations());
+            animation_impl_->keyframe_effect()->element_animations());
   EXPECT_FALSE(element_animations_impl_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_impl_->has_element_in_pending_list());
 
   // Sync doesn't change anything.
   PushProperties();
   EXPECT_EQ(element_animations_impl_,
-            player_impl_->keyframe_effect()->element_animations());
+            animation_impl_->keyframe_effect()->element_animations());
   EXPECT_FALSE(element_animations_impl_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_impl_->has_element_in_pending_list());
 
-  player_->DetachElement();
-  EXPECT_FALSE(player_->keyframe_effect()->element_animations());
+  animation_->DetachElement();
+  EXPECT_FALSE(animation_->keyframe_effect()->element_animations());
 
   // Release ptrs now to test the order of destruction.
   ReleaseRefPtrs();
@@ -132,21 +132,21 @@
 
 TEST_F(ElementAnimationsTest, AttachToNotYetCreatedLayer) {
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(player_);
+  timeline_->AttachAnimation(animation_);
 
   PushProperties();
-  GetImplTimelineAndPlayerByID();
+  GetImplTimelineAndAnimationByID();
 
   // Perform attachment separately.
-  player_->AttachElement(element_id_);
-  element_animations_ = player_->keyframe_effect()->element_animations();
+  animation_->AttachElement(element_id_);
+  element_animations_ = animation_->keyframe_effect()->element_animations();
 
   EXPECT_FALSE(element_animations_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_->has_element_in_pending_list());
 
   PushProperties();
   element_animations_impl_ =
-      player_impl_->keyframe_effect()->element_animations();
+      animation_impl_->keyframe_effect()->element_animations();
 
   EXPECT_FALSE(element_animations_impl_->has_element_in_active_list());
   EXPECT_FALSE(element_animations_impl_->has_element_in_pending_list());
@@ -165,39 +165,39 @@
   EXPECT_TRUE(element_animations_impl_->has_element_in_pending_list());
 }
 
-TEST_F(ElementAnimationsTest, AddRemovePlayers) {
+TEST_F(ElementAnimationsTest, AddRemoveAnimations) {
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(player_);
-  player_->AttachElement(element_id_);
+  timeline_->AttachAnimation(animation_);
+  animation_->AttachElement(element_id_);
 
   scoped_refptr<ElementAnimations> element_animations =
-      player_->keyframe_effect()->element_animations();
+      animation_->keyframe_effect()->element_animations();
   EXPECT_TRUE(element_animations);
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player1 =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player2 =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation1 =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation2 =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
 
-  timeline_->AttachPlayer(player1);
-  timeline_->AttachPlayer(player2);
+  timeline_->AttachAnimation(animation1);
+  timeline_->AttachAnimation(animation2);
 
-  // Attach players to the same layer.
-  player1->AttachElement(element_id_);
-  player2->AttachElement(element_id_);
+  // Attach animations to the same layer.
+  animation1->AttachElement(element_id_);
+  animation2->AttachElement(element_id_);
 
   EXPECT_EQ(element_animations,
-            player1->keyframe_effect()->element_animations());
+            animation1->keyframe_effect()->element_animations());
   EXPECT_EQ(element_animations,
-            player2->keyframe_effect()->element_animations());
+            animation2->keyframe_effect()->element_animations());
 
   PushProperties();
-  GetImplTimelineAndPlayerByID();
+  GetImplTimelineAndAnimationByID();
 
   scoped_refptr<ElementAnimations> element_animations_impl =
-      player_impl_->keyframe_effect()->element_animations();
+      animation_impl_->keyframe_effect()->element_animations();
   EXPECT_TRUE(element_animations_impl);
 
   const ElementAnimations::KeyframeEffectsList& keyframe_effects =
@@ -207,16 +207,16 @@
     ++list_size_before;
   EXPECT_EQ(3, list_size_before);
 
-  player2->DetachElement();
-  EXPECT_FALSE(player2->keyframe_effect()->element_animations());
+  animation2->DetachElement();
+  EXPECT_FALSE(animation2->keyframe_effect()->element_animations());
   EXPECT_EQ(element_animations,
-            player_->keyframe_effect()->element_animations());
+            animation_->keyframe_effect()->element_animations());
   EXPECT_EQ(element_animations,
-            player1->keyframe_effect()->element_animations());
+            animation1->keyframe_effect()->element_animations());
 
   PushProperties();
   EXPECT_EQ(element_animations_impl,
-            player_impl_->keyframe_effect()->element_animations());
+            animation_impl_->keyframe_effect()->element_animations());
 
   int list_size_after = 0;
   for (auto it = keyframe_effects.begin(); it != keyframe_effects.end(); ++it)
@@ -226,30 +226,30 @@
 
 TEST_F(ElementAnimationsTest, SyncNewAnimation) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  EXPECT_FALSE(player_->GetKeyframeModel(TargetProperty::OPACITY));
-  EXPECT_FALSE(player_impl_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_FALSE(animation_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_FALSE(animation_impl_->GetKeyframeModel(TargetProperty::OPACITY));
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
   EXPECT_TRUE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_->keyframe_effect()
+            animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 }
@@ -257,11 +257,12 @@
 TEST_F(ElementAnimationsTest,
        SyncScrollOffsetAnimationRespectsHasSetInitialValue) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  EXPECT_FALSE(player_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
-  EXPECT_FALSE(player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+  EXPECT_FALSE(animation_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+  EXPECT_FALSE(
+      animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
 
   gfx::ScrollOffset initial_value(100.f, 300.f);
   gfx::ScrollOffset provider_initial_value(150.f, 300.f);
@@ -278,9 +279,9 @@
   const int animation1_id = 1;
   std::unique_ptr<KeyframeModel> animation_fixed(KeyframeModel::Create(
       std::move(curve_fixed), animation1_id, 0, TargetProperty::SCROLL_OFFSET));
-  player_->AddKeyframeModel(std::move(animation_fixed));
+  animation_->AddKeyframeModel(std::move(animation_fixed));
   PushProperties();
-  EXPECT_VECTOR2DF_EQ(initial_value, player_impl_->keyframe_effect()
+  EXPECT_VECTOR2DF_EQ(initial_value, animation_impl_->keyframe_effect()
                                          ->GetKeyframeModelById(animation1_id)
                                          ->curve()
                                          ->ToScrollOffsetAnimationCurve()
@@ -294,84 +295,85 @@
   const int animation2_id = 2;
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve), animation2_id, 0, TargetProperty::SCROLL_OFFSET));
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
   PushProperties();
   EXPECT_VECTOR2DF_EQ(provider_initial_value,
-                      player_impl_->keyframe_effect()
+                      animation_impl_->keyframe_effect()
                           ->GetKeyframeModelById(animation2_id)
                           ->curve()
                           ->ToScrollOffsetAnimationCurve()
                           ->GetValue(base::TimeDelta()));
 }
 
-class TestAnimationDelegateThatDestroysPlayer : public TestAnimationDelegate {
+class TestAnimationDelegateThatDestroysAnimation
+    : public TestAnimationDelegate {
  public:
-  TestAnimationDelegateThatDestroysPlayer() = default;
+  TestAnimationDelegateThatDestroysAnimation() = default;
 
   void NotifyAnimationStarted(base::TimeTicks monotonic_time,
                               int target_property,
                               int group) override {
     TestAnimationDelegate::NotifyAnimationStarted(monotonic_time,
                                                   target_property, group);
-    // Detaching player from the timeline ensures that the timeline doesn't hold
-    // a reference to the player and the player is destroyed.
-    timeline_->DetachPlayer(player_);
+    // Detaching animation from the timeline ensures that the timeline doesn't
+    // hold a reference to the animation and the animation is destroyed.
+    timeline_->DetachAnimation(animation_);
   };
 
-  void setTimelineAndPlayer(
+  void setTimelineAndAnimation(
       scoped_refptr<AnimationTimeline> timeline,
-      scoped_refptr<SingleKeyframeEffectAnimationPlayer> player) {
+      scoped_refptr<SingleKeyframeEffectAnimation> animation) {
     timeline_ = timeline;
-    player_ = player;
+    animation_ = animation;
   }
 
  private:
   scoped_refptr<AnimationTimeline> timeline_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_;
 };
 
-// Test that we don't crash if a player is deleted while ElementAnimations is
-// iterating through the list of players (see crbug.com/631052). This test
+// Test that we don't crash if a animation is deleted while ElementAnimations is
+// iterating through the list of animations (see crbug.com/631052). This test
 // passes if it doesn't crash.
-TEST_F(ElementAnimationsTest, AddedPlayerIsDestroyed) {
+TEST_F(ElementAnimationsTest, AddedAnimationIsDestroyed) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  TestAnimationDelegateThatDestroysPlayer delegate;
+  TestAnimationDelegateThatDestroysAnimation delegate;
 
-  const int player2_id = AnimationIdProvider::NextPlayerId();
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player2 =
-      SingleKeyframeEffectAnimationPlayer::Create(player2_id);
-  delegate.setTimelineAndPlayer(timeline_, player2);
+  const int animation2_id = AnimationIdProvider::NextAnimationId();
+  scoped_refptr<SingleKeyframeEffectAnimation> animation2 =
+      SingleKeyframeEffectAnimation::Create(animation2_id);
+  delegate.setTimelineAndAnimation(timeline_, animation2);
 
-  timeline_->AttachPlayer(player2);
-  player2->AttachElement(element_id_);
-  player2->set_animation_delegate(&delegate);
+  timeline_->AttachAnimation(animation2);
+  animation2->AttachElement(element_id_);
+  animation2->set_animation_delegate(&delegate);
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player2.get(), 1.0, 0.f, 1.f, false);
+      AddOpacityTransitionToAnimation(animation2.get(), 1.0, 0.f, 1.f, false);
 
   PushProperties();
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player2_impl =
-      (SingleKeyframeEffectAnimationPlayer*)timeline_impl_->GetPlayerById(
-          player2_id);
-  DCHECK(player2_impl);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation2_impl =
+      (SingleKeyframeEffectAnimation*)timeline_impl_->GetAnimationById(
+          animation2_id);
+  DCHECK(animation2_impl);
 
-  player2_impl->ActivateKeyframeEffects();
-  EXPECT_TRUE(
-      player2_impl->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  animation2_impl->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation2_impl->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 
-  player2_impl->Tick(kInitialTickTime);
+  animation2_impl->Tick(kInitialTickTime);
 
   auto events = CreateEventsForTesting();
-  player2_impl->UpdateState(true, events.get());
+  animation2_impl->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[0].type);
 
   // The actual detachment happens here, inside the callback
-  player2->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation2->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   EXPECT_TRUE(delegate.started());
 }
 
@@ -379,99 +381,99 @@
 // thread, we must be sure to respect the synchronized start time.
 TEST_F(ElementAnimationsTest, DoNotClobberStartTimes) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  EXPECT_FALSE(player_impl_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_FALSE(animation_impl_->GetKeyframeModel(TargetProperty::OPACITY));
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Synchronize the start times.
   EXPECT_EQ(1u, events->events_.size());
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
-  EXPECT_EQ(player_->keyframe_effect()
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  EXPECT_EQ(animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time(),
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time());
 
   // Start the animation on the main thread. Should not affect the start time.
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_impl_->UpdateState(true, nullptr);
-  EXPECT_EQ(player_->keyframe_effect()
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_impl_->UpdateState(true, nullptr);
+  EXPECT_EQ(animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time(),
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time());
 }
 
 TEST_F(ElementAnimationsTest, UseSpecifiedStartTimes) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
 
   const TimeTicks start_time = TicksFromSecondsF(123);
-  player_->GetKeyframeModel(TargetProperty::OPACITY)
+  animation_->GetKeyframeModel(TargetProperty::OPACITY)
       ->set_start_time(start_time);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Synchronize the start times.
   EXPECT_EQ(1u, events->events_.size());
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
-  EXPECT_EQ(start_time, player_->keyframe_effect()
+  EXPECT_EQ(start_time, animation_->keyframe_effect()
                             ->GetKeyframeModelById(keyframe_model_id)
                             ->start_time());
-  EXPECT_EQ(player_->keyframe_effect()
+  EXPECT_EQ(animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time(),
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time());
 
   // Start the animation on the main thread. Should not affect the start time.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, nullptr);
-  EXPECT_EQ(start_time, player_->keyframe_effect()
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, nullptr);
+  EXPECT_EQ(start_time, animation_->keyframe_effect()
                             ->GetKeyframeModelById(keyframe_model_id)
                             ->start_time());
-  EXPECT_EQ(player_->keyframe_effect()
+  EXPECT_EQ(animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time(),
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->start_time());
 }
@@ -479,8 +481,8 @@
 // Tests that animationss activate and deactivate as expected.
 TEST_F(ElementAnimationsTest, Activation) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   AnimationHost* host = client_.host();
   AnimationHost* host_impl = client_impl_.host();
@@ -491,90 +493,91 @@
   EXPECT_EQ(1u, host_impl->element_animations_for_testing().size());
 
   // Initially, both animationss should be inactive.
-  EXPECT_EQ(0u, host->ticking_players_for_testing().size());
-  EXPECT_EQ(0u, host_impl->ticking_players_for_testing().size());
+  EXPECT_EQ(0u, host->ticking_animations_for_testing().size());
+  EXPECT_EQ(0u, host_impl->ticking_animations_for_testing().size());
 
-  AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+  AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
   // The main thread animations should now be active.
-  EXPECT_EQ(1u, host->ticking_players_for_testing().size());
+  EXPECT_EQ(1u, host->ticking_animations_for_testing().size());
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   // Both animationss should now be active.
-  EXPECT_EQ(1u, host->ticking_players_for_testing().size());
-  EXPECT_EQ(1u, host_impl->ticking_players_for_testing().size());
+  EXPECT_EQ(1u, host->ticking_animations_for_testing().size());
+  EXPECT_EQ(1u, host_impl->ticking_animations_for_testing().size());
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
-  EXPECT_EQ(1u, host->ticking_players_for_testing().size());
-  EXPECT_EQ(1u, host_impl->ticking_players_for_testing().size());
+  EXPECT_EQ(1u, host->ticking_animations_for_testing().size());
+  EXPECT_EQ(1u, host_impl->ticking_animations_for_testing().size());
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, nullptr);
-  EXPECT_EQ(1u, host->ticking_players_for_testing().size());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, nullptr);
+  EXPECT_EQ(1u, host->ticking_animations_for_testing().size());
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
   EXPECT_EQ(KeyframeModel::FINISHED,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
-  EXPECT_EQ(1u, host->ticking_players_for_testing().size());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+  EXPECT_EQ(1u, host->ticking_animations_for_testing().size());
 
   events = CreateEventsForTesting();
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
+  animation_impl_->UpdateState(true, events.get());
 
   EXPECT_EQ(
       KeyframeModel::WAITING_FOR_DELETION,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   // The impl thread animations should have de-activated.
-  EXPECT_EQ(0u, host_impl->ticking_players_for_testing().size());
+  EXPECT_EQ(0u, host_impl->ticking_animations_for_testing().size());
 
   EXPECT_EQ(1u, events->events_.size());
-  player_->keyframe_effect()->NotifyKeyframeModelFinished(events->events_[0]);
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
-  player_->UpdateState(true, nullptr);
+  animation_->keyframe_effect()->NotifyKeyframeModelFinished(
+      events->events_[0]);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
+  animation_->UpdateState(true, nullptr);
 
   EXPECT_EQ(KeyframeModel::WAITING_FOR_DELETION,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   // The main thread animations should have de-activated.
-  EXPECT_EQ(0u, host->ticking_players_for_testing().size());
+  EXPECT_EQ(0u, host->ticking_animations_for_testing().size());
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_->keyframe_effect()->has_any_keyframe_model());
-  EXPECT_FALSE(player_impl_->keyframe_effect()->has_any_keyframe_model());
-  EXPECT_EQ(0u, host->ticking_players_for_testing().size());
-  EXPECT_EQ(0u, host_impl->ticking_players_for_testing().size());
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_EQ(0u, host->ticking_animations_for_testing().size());
+  EXPECT_EQ(0u, host_impl->ticking_animations_for_testing().size());
 }
 
 TEST_F(ElementAnimationsTest, SyncPause) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  EXPECT_FALSE(player_impl_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_FALSE(animation_impl_->GetKeyframeModel(TargetProperty::OPACITY));
 
   // Two steps, three ranges: [0-1) -> 0.2, [1-2) -> 0.3, [2-3] -> 0.4.
   const double duration = 3.0;
   const int keyframe_model_id =
-      AddOpacityStepsToPlayer(player_.get(), duration, 0.2f, 0.4f, 2);
+      AddOpacityStepsToAnimation(animation_.get(), duration, 0.2f, 0.4f, 2);
 
   // Set start offset to be at the beginning of the second range.
-  player_->keyframe_effect()
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_time_offset(TimeDelta::FromSecondsD(1.01));
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
@@ -582,20 +585,20 @@
 
   // Start the animations on each animations.
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(time);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(time);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
 
-  player_->Tick(time);
-  player_->UpdateState(true, nullptr);
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->Tick(time);
+  animation_->UpdateState(true, nullptr);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_->keyframe_effect()
+            animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
@@ -603,30 +606,30 @@
   EXPECT_EQ(0.3f,
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  EXPECT_EQ(kInitialTickTime, player_->keyframe_effect()
+  EXPECT_EQ(kInitialTickTime, animation_->keyframe_effect()
                                   ->GetKeyframeModelById(keyframe_model_id)
                                   ->start_time());
-  EXPECT_EQ(kInitialTickTime, player_impl_->keyframe_effect()
+  EXPECT_EQ(kInitialTickTime, animation_impl_->keyframe_effect()
                                   ->GetKeyframeModelById(keyframe_model_id)
                                   ->start_time());
 
   // Pause the animation at the middle of the second range so the offset
   // delays animation until the middle of the third range.
-  player_->PauseKeyframeModel(keyframe_model_id, 1.5);
-  EXPECT_EQ(KeyframeModel::PAUSED, player_->keyframe_effect()
+  animation_->PauseKeyframeModel(keyframe_model_id, 1.5);
+  EXPECT_EQ(KeyframeModel::PAUSED, animation_->keyframe_effect()
                                        ->GetKeyframeModelById(keyframe_model_id)
                                        ->run_state());
 
   // The pause run state change should make it to the impl thread animations.
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
   // Advance time so it stays within the first range.
   time += TimeDelta::FromMilliseconds(10);
-  player_->Tick(time);
-  player_impl_->Tick(time);
+  animation_->Tick(time);
+  animation_impl_->Tick(time);
 
-  EXPECT_EQ(KeyframeModel::PAUSED, player_impl_->keyframe_effect()
+  EXPECT_EQ(KeyframeModel::PAUSED, animation_impl_->keyframe_effect()
                                        ->GetKeyframeModelById(keyframe_model_id)
                                        ->run_state());
 
@@ -638,94 +641,95 @@
 
 TEST_F(ElementAnimationsTest, DoNotSyncFinishedAnimation) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
-  EXPECT_FALSE(player_impl_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_FALSE(animation_impl_->GetKeyframeModel(TargetProperty::OPACITY));
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[0].type);
 
   // Notify main thread animations that the animation has started.
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
   // Complete animation on impl thread.
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromSeconds(1));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromSeconds(1));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(AnimationEvent::FINISHED, events->events_[0].type);
 
-  player_->keyframe_effect()->NotifyKeyframeModelFinished(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelFinished(
+      events->events_[0]);
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromSeconds(2));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromSeconds(2));
+  animation_->UpdateState(true, nullptr);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 }
 
 // Ensure that a finished animation is eventually deleted by both the
 // main-thread and the impl-thread animationss.
 TEST_F(ElementAnimationsTest, AnimationsAreDeleted) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
-  AddOpacityTransitionToPlayer(player_.get(), 1.0, 0.0f, 1.0f, false);
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->needs_push_properties());
+  AddOpacityTransitionToAnimation(animation_.get(), 1.0, 0.0f, 1.0f, false);
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->needs_push_properties());
 
   PushProperties();
-  EXPECT_FALSE(player_->keyframe_effect()->needs_push_properties());
+  EXPECT_FALSE(animation_->keyframe_effect()->needs_push_properties());
 
   EXPECT_FALSE(host_->needs_push_properties());
   EXPECT_FALSE(host_impl_->needs_push_properties());
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_impl_->UpdateState(true, events.get());
 
   // There should be a STARTED event for the animation.
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[0].type);
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
 
   EXPECT_FALSE(host_->needs_push_properties());
   EXPECT_FALSE(host_impl_->needs_push_properties());
 
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
   EXPECT_TRUE(host_impl_->needs_push_properties());
 
@@ -734,13 +738,14 @@
   EXPECT_EQ(AnimationEvent::FINISHED, events->events_[0].type);
 
   // Neither animations should have deleted the animation yet.
-  EXPECT_TRUE(player_->GetKeyframeModel(TargetProperty::OPACITY));
-  EXPECT_TRUE(player_impl_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_TRUE(animation_->GetKeyframeModel(TargetProperty::OPACITY));
+  EXPECT_TRUE(animation_impl_->GetKeyframeModel(TargetProperty::OPACITY));
 
-  player_->keyframe_effect()->NotifyKeyframeModelFinished(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelFinished(
+      events->events_[0]);
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
+  animation_->UpdateState(true, nullptr);
   EXPECT_TRUE(host_->needs_push_properties());
 
   PushProperties();
@@ -749,8 +754,8 @@
   // should have deleted the animation even though activation has not occurred,
   // since the animation was already waiting for deletion when
   // PushPropertiesTo was called.
-  EXPECT_FALSE(player_->keyframe_effect()->has_any_keyframe_model());
-  EXPECT_FALSE(player_impl_->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation_->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->has_any_keyframe_model());
 }
 
 // Tests that transitioning opacity from 0 to 1 works as expected.
@@ -764,7 +769,7 @@
 
 TEST_F(ElementAnimationsTest, TrivialTransition) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -774,32 +779,32 @@
   int keyframe_model_id = to_add->id();
 
   EXPECT_FALSE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  player_->AddKeyframeModel(std::move(to_add));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  animation_->AddKeyframeModel(std::move(to_add));
   EXPECT_TRUE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_->keyframe_effect()
+            animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  player_->Tick(kInitialTickTime);
+  animation_->Tick(kInitialTickTime);
   EXPECT_EQ(KeyframeModel::STARTING,
-            player_->keyframe_effect()
+            animation_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 TEST_F(ElementAnimationsTest, FilterTransition) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -817,32 +822,32 @@
 
   std::unique_ptr<KeyframeModel> keyframe_model(
       KeyframeModel::Create(std::move(curve), 1, 0, TargetProperty::FILTER));
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(start_filters,
             client_.GetFilters(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(1u,
             client_.GetFilters(element_id_, ElementListType::ACTIVE).size());
   EXPECT_EQ(FilterOperation::CreateBrightnessFilter(1.5f),
             client_.GetFilters(element_id_, ElementListType::ACTIVE).at(0));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(end_filters,
             client_.GetFilters(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 TEST_F(ElementAnimationsTest, ScrollOffsetTransition) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -856,63 +861,64 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
   keyframe_model->set_needs_synchronized_start_time(true);
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
 
   client_impl_.SetScrollOffsetForAnimation(initial_value);
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
   TimeDelta duration =
-      player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+      animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
           ->curve()
           ->Duration();
-  EXPECT_EQ(duration, player_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
-                          ->curve()
-                          ->Duration());
+  EXPECT_EQ(duration,
+            animation_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+                ->curve()
+                ->Duration());
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(initial_value,
             client_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(initial_value,
             client_impl_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
-  player_->Tick(kInitialTickTime + duration / 2);
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->Tick(kInitialTickTime + duration / 2);
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_VECTOR2DF_EQ(
       gfx::Vector2dF(200.f, 250.f),
       client_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + duration / 2);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration / 2);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(
       gfx::Vector2dF(200.f, 250.f),
       client_impl_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + duration);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(target_value, client_impl_.GetScrollOffset(
                                         element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
 
-  player_->Tick(kInitialTickTime + duration);
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + duration);
+  animation_->UpdateState(true, nullptr);
   EXPECT_VECTOR2DF_EQ(target_value, client_.GetScrollOffset(
                                         element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 TEST_F(ElementAnimationsTest, ScrollOffsetTransitionOnImplOnly) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -928,28 +934,28 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
   keyframe_model->SetIsImplOnly();
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(initial_value,
             client_impl_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
   TimeDelta duration = TimeDelta::FromMicroseconds(
       duration_in_seconds * base::Time::kMicrosecondsPerSecond);
 
-  player_impl_->Tick(kInitialTickTime + duration / 2);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration / 2);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(
       gfx::Vector2dF(200.f, 250.f),
       client_impl_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + duration);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(target_value, client_impl_.GetScrollOffset(
                                         element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // This test verifies that if an animation is added after a layer is animated,
@@ -958,46 +964,46 @@
 // last_tick_time_.
 TEST_F(ElementAnimationsTest, UpdateStateWithoutAnimate) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   // Add first scroll offset animation.
-  AddScrollOffsetAnimationToPlayer(player_impl_.get(),
-                                   gfx::ScrollOffset(100.f, 300.f),
-                                   gfx::ScrollOffset(100.f, 200.f));
+  AddScrollOffsetAnimationToAnimation(animation_impl_.get(),
+                                      gfx::ScrollOffset(100.f, 300.f),
+                                      gfx::ScrollOffset(100.f, 200.f));
 
   // Calling UpdateState after Animate should promote the animation to running
   // state.
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
                 ->run_state());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(nullptr,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
 
   // Add second scroll offset animation.
-  AddScrollOffsetAnimationToPlayer(player_impl_.get(),
-                                   gfx::ScrollOffset(100.f, 200.f),
-                                   gfx::ScrollOffset(100.f, 100.f));
+  AddScrollOffsetAnimationToAnimation(animation_impl_.get(),
+                                      gfx::ScrollOffset(100.f, 200.f),
+                                      gfx::ScrollOffset(100.f, 100.f));
 
   // Calling UpdateState without Animate should NOT promote the animation to
   // running state.
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
                 ->run_state());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
                 ->run_state());
   EXPECT_VECTOR2DF_EQ(
       gfx::ScrollOffset(100.f, 200.f),
@@ -1010,8 +1016,8 @@
 TEST_F(ElementAnimationsTest, ScrollOffsetTransitionNoImplProvider) {
   CreateTestLayer(false, false);
   CreateTestImplLayer(ElementListType::PENDING);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   EXPECT_TRUE(element_animations_impl_->has_element_in_pending_list());
   EXPECT_FALSE(element_animations_impl_->has_element_in_active_list());
@@ -1028,71 +1034,72 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
   keyframe_model->set_needs_synchronized_start_time(true);
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
 
   client_.SetScrollOffsetForAnimation(initial_value);
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
   TimeDelta duration =
-      player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+      animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
           ->curve()
           ->Duration();
-  EXPECT_EQ(duration, player_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
-                          ->curve()
-                          ->Duration());
+  EXPECT_EQ(duration,
+            animation_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+                ->curve()
+                ->Duration());
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, nullptr);
 
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(initial_value,
             client_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
   EXPECT_EQ(gfx::ScrollOffset(), client_impl_.GetScrollOffset(
                                      element_id_, ElementListType::PENDING));
 
-  player_impl_->Tick(kInitialTickTime);
+  animation_impl_->Tick(kInitialTickTime);
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(initial_value, client_impl_.GetScrollOffset(
                                element_id_, ElementListType::PENDING));
 
   CreateTestImplLayer(ElementListType::ACTIVE);
 
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
   DCHECK_EQ(1UL, events->events_.size());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
-  player_->Tick(kInitialTickTime + duration / 2);
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->Tick(kInitialTickTime + duration / 2);
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_VECTOR2DF_EQ(
       gfx::Vector2dF(400.f, 150.f),
       client_.GetScrollOffset(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + duration / 2);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration / 2);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(
       gfx::Vector2dF(400.f, 150.f),
       client_impl_.GetScrollOffset(element_id_, ElementListType::PENDING));
 
-  player_impl_->Tick(kInitialTickTime + duration);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + duration);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_VECTOR2DF_EQ(target_value, client_impl_.GetScrollOffset(
                                         element_id_, ElementListType::PENDING));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasTickingKeyframeModel());
 
-  player_->Tick(kInitialTickTime + duration);
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + duration);
+  animation_->UpdateState(true, nullptr);
   EXPECT_VECTOR2DF_EQ(target_value, client_.GetScrollOffset(
                                         element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 TEST_F(ElementAnimationsTest, ScrollOffsetRemovalClearsScrollDelta) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -1107,26 +1114,26 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve), keyframe_model_id, 0, TargetProperty::SCROLL_OFFSET));
   keyframe_model->set_needs_synchronized_start_time(true);
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_TRUE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
   PushProperties();
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->scroll_offset_animation_was_interrupted());
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
   // Now, test the 2-argument version of RemoveKeyframeModel.
@@ -1136,72 +1143,74 @@
   keyframe_model = KeyframeModel::Create(std::move(curve), keyframe_model_id, 0,
                                          TargetProperty::SCROLL_OFFSET);
   keyframe_model->set_needs_synchronized_start_time(true);
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_TRUE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
   PushProperties();
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->scroll_offset_animation_was_interrupted());
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
   // Check that removing non-scroll-offset animations does not cause
   // scroll_offset_animation_was_interrupted() to get set.
-  keyframe_model_id = AddAnimatedTransformToPlayer(player_.get(), 1.0, 1, 2);
+  keyframe_model_id =
+      AddAnimatedTransformToAnimation(animation_.get(), 1.0, 1, 2);
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
   PushProperties();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  keyframe_model_id = AddAnimatedFilterToPlayer(player_.get(), 1.0, 0.1f, 0.2f);
+  keyframe_model_id =
+      AddAnimatedFilterToAnimation(animation_.get(), 1.0, 0.1f, 0.2f);
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
   PushProperties();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
   EXPECT_FALSE(
-      player_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 }
 
@@ -1210,13 +1219,13 @@
 TEST_F(ElementAnimationsTest,
        NotificationsForImplOnlyAnimationsAreSentToImplThreadDelegate) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   TestAnimationDelegate delegate;
-  player_impl_->set_animation_delegate(&delegate);
+  animation_impl_->set_animation_delegate(&delegate);
 
   gfx::ScrollOffset initial_value(100.f, 300.f);
   gfx::ScrollOffset target_value(300.f, 200.f);
@@ -1229,24 +1238,24 @@
   std::unique_ptr<KeyframeModel> to_add(KeyframeModel::Create(
       std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
   to_add->SetIsImplOnly();
-  player_impl_->AddKeyframeModel(std::move(to_add));
+  animation_impl_->AddKeyframeModel(std::move(to_add));
 
   EXPECT_FALSE(delegate.started());
   EXPECT_FALSE(delegate.finished());
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   EXPECT_TRUE(delegate.started());
   EXPECT_FALSE(delegate.finished());
 
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime + duration);
+  animation_impl_->Tick(kInitialTickTime + duration);
   EXPECT_EQ(duration,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
                 ->curve()
                 ->Duration());
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
 
   EXPECT_TRUE(delegate.started());
   EXPECT_TRUE(delegate.finished());
@@ -1255,36 +1264,36 @@
 // Tests that specified start times are sent to the main thread delegate
 TEST_F(ElementAnimationsTest, SpecifiedStartTimesAreSentToMainThreadDelegate) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   TestAnimationDelegate delegate;
-  player_->set_animation_delegate(&delegate);
+  animation_->set_animation_delegate(&delegate);
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0, 1, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0, 1, false);
 
   const TimeTicks start_time = TicksFromSecondsF(123);
-  player_->GetKeyframeModel(TargetProperty::OPACITY)
+  animation_->GetKeyframeModel(TargetProperty::OPACITY)
       ->set_start_time(start_time);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Synchronize the start times.
   EXPECT_EQ(1u, events->events_.size());
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
 
   // Validate start time on the main thread delegate.
   EXPECT_EQ(start_time, delegate.start_time());
@@ -1295,7 +1304,7 @@
 TEST_F(ElementAnimationsTest,
        AnimationsWaitingForStartTimeDoNotFinishIfTheyOutwaitTheirFinish) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -1306,151 +1315,155 @@
 
   // We should pause at the first keyframe indefinitely waiting for that
   // animation to start.
-  player_->AddKeyframeModel(std::move(to_add));
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->AddKeyframeModel(std::move(to_add));
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // Send the synchronized start time.
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(AnimationEvent(
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(AnimationEvent(
       AnimationEvent::STARTED, ElementId(), 1, TargetProperty::OPACITY,
       kInitialTickTime + TimeDelta::FromMilliseconds(2000)));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(5000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(5000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Tests that two queued animations affecting the same property run in sequence.
 TEST_F(ElementAnimationsTest, TrivialQueuing) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
   int animation1_id = 1;
   int animation2_id = 2;
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       animation1_id, 1, TargetProperty::OPACITY));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       animation2_id, 2, TargetProperty::OPACITY));
 
-  player_->Tick(kInitialTickTime);
+  animation_->Tick(kInitialTickTime);
 
   // The first animation should have been started.
-  EXPECT_TRUE(player_->keyframe_effect()->GetKeyframeModelById(animation1_id));
-  EXPECT_EQ(KeyframeModel::STARTING, player_->keyframe_effect()
+  EXPECT_TRUE(
+      animation_->keyframe_effect()->GetKeyframeModelById(animation1_id));
+  EXPECT_EQ(KeyframeModel::STARTING, animation_->keyframe_effect()
                                          ->GetKeyframeModelById(animation1_id)
                                          ->run_state());
 
   // The second animation still needs to be started.
-  EXPECT_TRUE(player_->keyframe_effect()->GetKeyframeModelById(animation2_id));
+  EXPECT_TRUE(
+      animation_->keyframe_effect()->GetKeyframeModelById(animation2_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_->keyframe_effect()
+            animation_->keyframe_effect()
                 ->GetKeyframeModelById(animation2_id)
                 ->run_state());
 
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
 
   // Now the first should be finished, and the second started.
-  EXPECT_TRUE(player_->keyframe_effect()->GetKeyframeModelById(animation1_id));
-  EXPECT_EQ(KeyframeModel::FINISHED, player_->keyframe_effect()
+  EXPECT_TRUE(
+      animation_->keyframe_effect()->GetKeyframeModelById(animation1_id));
+  EXPECT_EQ(KeyframeModel::FINISHED, animation_->keyframe_effect()
                                          ->GetKeyframeModelById(animation1_id)
                                          ->run_state());
-  EXPECT_TRUE(player_->keyframe_effect()->GetKeyframeModelById(animation2_id));
-  EXPECT_EQ(KeyframeModel::RUNNING, player_->keyframe_effect()
+  EXPECT_TRUE(
+      animation_->keyframe_effect()->GetKeyframeModelById(animation2_id));
+  EXPECT_EQ(KeyframeModel::RUNNING, animation_->keyframe_effect()
                                         ->GetKeyframeModelById(animation2_id)
                                         ->run_state());
 
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Tests interrupting a transition with another transition.
 TEST_F(ElementAnimationsTest, Interrupt) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   std::unique_ptr<KeyframeModel> to_add(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  player_->AbortKeyframeModels(TargetProperty::OPACITY, false);
-  player_->AddKeyframeModel(std::move(to_add));
+  animation_->AbortKeyframeModels(TargetProperty::OPACITY, false);
+  animation_->AddKeyframeModel(std::move(to_add));
 
   // Since the previous animation was aborted, the new animation should start
   // right in this call to animate.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1500));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Tests scheduling two animations to run together when only one property is
 // free.
 TEST_F(ElementAnimationsTest, ScheduleTogetherWhenAPropertyIsBlocked) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1)), 1,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1)), 2,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       2, TargetProperty::OPACITY));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
   // Should not have started the float transition yet.
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
   // The float animation should have started at time 1 and should be done.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Tests scheduling two animations to run together with different lengths and
@@ -1458,46 +1471,46 @@
 // wait for both to finish).
 TEST_F(ElementAnimationsTest, ScheduleTogetherWithAnAnimWaiting) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(2)), 1,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
 
   // Animations with id 1 should both start now.
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
   // The opacity animation should have finished at time 1, but the group
   // of animations with id 1 don't finish until time 2 because of the length
   // of the transform animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, events.get());
   // Should not have started the float transition yet.
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // The second opacity animation should start at time 2 and should be done by
   // time 3.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Test that a looping animation loops and for the correct number of iterations.
 TEST_F(ElementAnimationsTest, TrivialLooping) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -1505,43 +1518,43 @@
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
   to_add->set_iterations(3);
-  player_->AddKeyframeModel(std::move(to_add));
+  animation_->AddKeyframeModel(std::move(to_add));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1250));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1250));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.25f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1750));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1750));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2250));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2250));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.25f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2750));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2750));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
-  player_->UpdateState(true, events.get());
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // Just be extra sure.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
+  animation_->UpdateState(true, events.get());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 // Test that an infinitely looping animation does indeed go until aborted.
 TEST_F(ElementAnimationsTest, InfiniteLooping) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -1549,129 +1562,131 @@
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
   to_add->set_iterations(-1);
-  player_->AddKeyframeModel(std::move(to_add));
+  animation_->AddKeyframeModel(std::move(to_add));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1250));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1250));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.25f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1750));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1750));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1073741824250));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime +
+                   TimeDelta::FromMilliseconds(1073741824250));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.25f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1073741824750));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime +
+                   TimeDelta::FromMilliseconds(1073741824750));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  EXPECT_TRUE(player_->GetKeyframeModel(TargetProperty::OPACITY));
-  player_->GetKeyframeModel(TargetProperty::OPACITY)
+  EXPECT_TRUE(animation_->GetKeyframeModel(TargetProperty::OPACITY));
+  animation_->GetKeyframeModel(TargetProperty::OPACITY)
       ->SetRunState(KeyframeModel::ABORTED,
                     kInitialTickTime + TimeDelta::FromMilliseconds(750));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 // Test that pausing and resuming work as expected.
 TEST_F(ElementAnimationsTest, PauseResume) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  EXPECT_TRUE(player_->GetKeyframeModel(TargetProperty::OPACITY));
-  player_->GetKeyframeModel(TargetProperty::OPACITY)
+  EXPECT_TRUE(animation_->GetKeyframeModel(TargetProperty::OPACITY));
+  animation_->GetKeyframeModel(TargetProperty::OPACITY)
       ->SetRunState(KeyframeModel::PAUSED,
                     kInitialTickTime + TimeDelta::FromMilliseconds(500));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  EXPECT_TRUE(player_->GetKeyframeModel(TargetProperty::OPACITY));
-  player_->GetKeyframeModel(TargetProperty::OPACITY)
+  EXPECT_TRUE(animation_->GetKeyframeModel(TargetProperty::OPACITY));
+  animation_->GetKeyframeModel(TargetProperty::OPACITY)
       ->SetRunState(KeyframeModel::RUNNING,
                     kInitialTickTime + TimeDelta::FromMilliseconds(1024000));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024250));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024250));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024500));
-  player_->UpdateState(true, events.get());
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1024500));
+  animation_->UpdateState(true, events.get());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, AbortAGroupedAnimation) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
   const int keyframe_model_id = 2;
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1)), 1, 1,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(2.0, 0.f, 1.f)),
       keyframe_model_id, 1, TargetProperty::OPACITY));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.75f)),
       3, 2, TargetProperty::OPACITY));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.5f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   EXPECT_TRUE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  player_->keyframe_effect()
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->SetRunState(KeyframeModel::ABORTED,
                     kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(!player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(!animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.75f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, PushUpdatesWhenSynchronizedStartTimeNeeded) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -1679,22 +1694,22 @@
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(2.0, 0.f, 1.f)),
       0, TargetProperty::OPACITY));
   to_add->set_needs_synchronized_start_time(true);
-  player_->AddKeyframeModel(std::move(to_add));
+  animation_->AddKeyframeModel(std::move(to_add));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   KeyframeModel* active_keyframe_model =
-      player_->GetKeyframeModel(TargetProperty::OPACITY);
+      animation_->GetKeyframeModel(TargetProperty::OPACITY);
   EXPECT_TRUE(active_keyframe_model);
   EXPECT_TRUE(active_keyframe_model->needs_synchronized_start_time());
 
-  EXPECT_TRUE(player_->keyframe_effect()->needs_push_properties());
+  EXPECT_TRUE(animation_->keyframe_effect()->needs_push_properties());
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
   active_keyframe_model =
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY);
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY);
   EXPECT_TRUE(active_keyframe_model);
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
             active_keyframe_model->run_state());
@@ -1703,7 +1718,7 @@
 // Tests that skipping a call to UpdateState works as expected.
 TEST_F(ElementAnimationsTest, SkipUpdateState) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   auto events = CreateEventsForTesting();
 
@@ -1711,84 +1726,84 @@
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1)), 1,
       TargetProperty::TRANSFORM));
   first_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_->AddKeyframeModel(std::move(first_keyframe_model));
+  animation_->AddKeyframeModel(std::move(first_keyframe_model));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, events.get());
 
   std::unique_ptr<KeyframeModel> second_keyframe_model(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       2, TargetProperty::OPACITY));
   second_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_->AddKeyframeModel(std::move(second_keyframe_model));
+  animation_->AddKeyframeModel(std::move(second_keyframe_model));
 
   // Animate but don't UpdateState.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
   events = CreateEventsForTesting();
-  player_->UpdateState(true, events.get());
+  animation_->UpdateState(true, events.get());
 
   // Should have one STARTED event and one FINISHED event.
   EXPECT_EQ(2u, events->events_.size());
   EXPECT_NE(events->events_[0].type, events->events_[1].type);
 
   // The float transition should still be at its starting point.
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
-  player_->UpdateState(true, events.get());
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
+  animation_->UpdateState(true, events.get());
 
   // The float tranisition should now be done.
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 }
 
 // Tests that an animation animations with only a pending observer gets ticked
 // but doesn't progress animations past the STARTING state.
 TEST_F(ElementAnimationsTest, InactiveObserverGetsTicked) {
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   const int id = 1;
-  player_impl_->AddKeyframeModel(CreateKeyframeModel(
+  animation_impl_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.5f, 1.f)),
       id, TargetProperty::OPACITY));
 
   // Without an observer, the animation shouldn't progress to the STARTING
   // state.
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(0u, events->events_.size());
   EXPECT_EQ(
       KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
 
   CreateTestImplLayer(ElementListType::PENDING);
 
   // With only a pending observer, the animation should progress to the
   // STARTING state and get ticked at its starting point, but should not
   // progress to RUNNING.
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(0u, events->events_.size());
   EXPECT_EQ(
       KeyframeModel::STARTING,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
 
   // Even when already in the STARTING state, the animation should stay
   // there, and shouldn't be ticked past its starting point.
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(0u, events->events_.size());
   EXPECT_EQ(
       KeyframeModel::STARTING,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
 
@@ -1796,19 +1811,19 @@
 
   // Now that an active observer has been added, the animation should still
   // initially tick at its starting point, but should now progress to RUNNING.
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(
       KeyframeModel::RUNNING,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // The animation should now tick past its starting point.
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3500));
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(3500));
   EXPECT_NE(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
   EXPECT_NE(0.5f,
@@ -1819,165 +1834,175 @@
 // specified property.
 TEST_F(ElementAnimationsTest, AbortKeyframeModels) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   // Start with several animations, and allow some of them to reach the finished
   // state.
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1.0)), 1, 1,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       2, 2, TargetProperty::OPACITY));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1.0)), 3, 3,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(2.0)), 4, 4,
       TargetProperty::TRANSFORM));
-  player_->AddKeyframeModel(KeyframeModel::Create(
+  animation_->AddKeyframeModel(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       5, 5, TargetProperty::OPACITY));
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, nullptr);
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
 
-  EXPECT_EQ(KeyframeModel::FINISHED,
-            player_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
-  EXPECT_EQ(KeyframeModel::FINISHED,
-            player_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
-  EXPECT_EQ(KeyframeModel::RUNNING,
-            player_->keyframe_effect()->GetKeyframeModelById(3)->run_state());
-  EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_->keyframe_effect()->GetKeyframeModelById(4)->run_state());
-  EXPECT_EQ(KeyframeModel::RUNNING,
-            player_->keyframe_effect()->GetKeyframeModelById(5)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::FINISHED,
+      animation_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::FINISHED,
+      animation_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::RUNNING,
+      animation_->keyframe_effect()->GetKeyframeModelById(3)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+      animation_->keyframe_effect()->GetKeyframeModelById(4)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::RUNNING,
+      animation_->keyframe_effect()->GetKeyframeModelById(5)->run_state());
 
-  player_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  animation_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   // Only un-finished TRANSFORM animations should have been aborted.
-  EXPECT_EQ(KeyframeModel::FINISHED,
-            player_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
-  EXPECT_EQ(KeyframeModel::FINISHED,
-            player_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
-  EXPECT_EQ(KeyframeModel::ABORTED,
-            player_->keyframe_effect()->GetKeyframeModelById(3)->run_state());
-  EXPECT_EQ(KeyframeModel::ABORTED,
-            player_->keyframe_effect()->GetKeyframeModelById(4)->run_state());
-  EXPECT_EQ(KeyframeModel::RUNNING,
-            player_->keyframe_effect()->GetKeyframeModelById(5)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::FINISHED,
+      animation_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::FINISHED,
+      animation_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::ABORTED,
+      animation_->keyframe_effect()->GetKeyframeModelById(3)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::ABORTED,
+      animation_->keyframe_effect()->GetKeyframeModelById(4)->run_state());
+  EXPECT_EQ(
+      KeyframeModel::RUNNING,
+      animation_->keyframe_effect()->GetKeyframeModelById(5)->run_state());
 }
 
 // An animation aborted on the main thread should get deleted on both threads.
 TEST_F(ElementAnimationsTest, MainThreadAbortedAnimationGetsDeleted) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1.0, 0.f, 1.f, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1.0, 0.f, 1.f, false);
   EXPECT_TRUE(host_->needs_push_properties());
 
   PushProperties();
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_FALSE(host_->needs_push_properties());
 
-  player_->AbortKeyframeModels(TargetProperty::OPACITY, false);
+  animation_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_EQ(KeyframeModel::ABORTED,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_TRUE(host_->needs_push_properties());
 
-  player_->Tick(kInitialTickTime);
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime);
+  animation_->UpdateState(true, nullptr);
   EXPECT_EQ(KeyframeModel::ABORTED,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
 
-  EXPECT_TRUE(player_->keyframe_effect()->needs_push_properties());
+  EXPECT_TRUE(animation_->keyframe_effect()->needs_push_properties());
   EXPECT_TRUE(host_->needs_push_properties());
 
   PushProperties();
-  EXPECT_FALSE(player_->keyframe_effect()->needs_push_properties());
+  EXPECT_FALSE(animation_->keyframe_effect()->needs_push_properties());
   EXPECT_FALSE(host_->needs_push_properties());
 
   EXPECT_FALSE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 }
 
 // An animation aborted on the impl thread should get deleted on both threads.
 TEST_F(ElementAnimationsTest, ImplThreadAbortedAnimationGetsDeleted) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   TestAnimationDelegate delegate;
-  player_->set_animation_delegate(&delegate);
+  animation_->set_animation_delegate(&delegate);
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1.0, 0.f, 1.f, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1.0, 0.f, 1.f, false);
 
   PushProperties();
   EXPECT_FALSE(host_->needs_push_properties());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 
-  player_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_EQ(
       KeyframeModel::ABORTED,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_TRUE(host_impl_->needs_push_properties());
-  EXPECT_TRUE(player_impl_->keyframe_effect()->needs_push_properties());
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->needs_push_properties());
 
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_TRUE(host_impl_->needs_push_properties());
   EXPECT_EQ(1u, events->events_.size());
   EXPECT_EQ(AnimationEvent::ABORTED, events->events_[0].type);
   EXPECT_EQ(
       KeyframeModel::WAITING_FOR_DELETION,
-      player_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+      animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
 
-  player_->keyframe_effect()->NotifyKeyframeModelAborted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelAborted(events->events_[0]);
   EXPECT_EQ(KeyframeModel::ABORTED,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_TRUE(delegate.aborted());
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_->UpdateState(true, nullptr);
   EXPECT_TRUE(host_->needs_push_properties());
   EXPECT_EQ(KeyframeModel::WAITING_FOR_DELETION,
-            player_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
+            animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
 
   PushProperties();
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 }
 
 // Test that an impl-only scroll offset animation that needs to be completed on
 // the main thread gets deleted.
 TEST_F(ElementAnimationsTest, ImplThreadTakeoverAnimationGetsDeleted) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   TestAnimationDelegate delegate_impl;
-  player_impl_->set_animation_delegate(&delegate_impl);
+  animation_impl_->set_animation_delegate(&delegate_impl);
   TestAnimationDelegate delegate;
-  player_->set_animation_delegate(&delegate);
+  animation_->set_animation_delegate(&delegate);
 
   // Add impl-only scroll offset animation.
   const int keyframe_model_id = 1;
@@ -1992,24 +2017,24 @@
       std::move(curve), keyframe_model_id, 0, TargetProperty::SCROLL_OFFSET));
   keyframe_model->set_start_time(TicksFromSecondsF(123));
   keyframe_model->SetIsImplOnly();
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
   PushProperties();
   EXPECT_FALSE(host_->needs_push_properties());
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 
-  player_impl_->AbortKeyframeModels(TargetProperty::SCROLL_OFFSET, true);
+  animation_impl_->AbortKeyframeModels(TargetProperty::SCROLL_OFFSET, true);
   EXPECT_TRUE(host_impl_->needs_push_properties());
   EXPECT_EQ(KeyframeModel::ABORTED_BUT_NEEDS_COMPLETION,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
                 ->run_state());
 
   auto events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_TRUE(delegate_impl.finished());
   EXPECT_TRUE(host_impl_->needs_push_properties());
   EXPECT_EQ(1u, events->events_.size());
@@ -2019,33 +2044,34 @@
       target_value,
       events->events_[0].curve->ToScrollOffsetAnimationCurve()->target_value());
   EXPECT_EQ(nullptr,
-            player_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
+            animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET));
 
   // MT receives the event to take over.
-  player_->keyframe_effect()->NotifyKeyframeModelTakeover(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelTakeover(
+      events->events_[0]);
   EXPECT_TRUE(delegate.takeover());
 
-  // SingleKeyframeEffectAnimationPlayer::NotifyAnimationTakeover requests
+  // SingleKeyframeEffectAnimation::NotifyAnimationTakeover requests
   // SetNeedsPushProperties to purge CT animations marked for deletion.
-  EXPECT_TRUE(player_->keyframe_effect()->needs_push_properties());
+  EXPECT_TRUE(animation_->keyframe_effect()->needs_push_properties());
 
   // ElementAnimations::PurgeAnimationsMarkedForDeletion call happens only in
   // ElementAnimations::PushPropertiesTo.
   PushProperties();
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 }
 
 // Ensure that we only generate FINISHED events for animations in a group
 // once all animations in that group are finished.
 TEST_F(ElementAnimationsTest, FinishedEventsForGroup) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -2056,16 +2082,16 @@
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(2.0)), 1,
       group_id, TargetProperty::TRANSFORM));
   first_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_impl_->AddKeyframeModel(std::move(first_keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(first_keyframe_model));
 
   std::unique_ptr<KeyframeModel> second_keyframe_model(KeyframeModel::Create(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       2, group_id, TargetProperty::OPACITY));
   second_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_impl_->AddKeyframeModel(std::move(second_keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(second_keyframe_model));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Both animations should have started.
   EXPECT_EQ(2u, events->events_.size());
@@ -2073,21 +2099,21 @@
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[1].type);
 
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
 
   // The opacity animation should be finished, but should not have generated
   // a FINISHED event yet.
   EXPECT_EQ(0u, events->events_.size());
   EXPECT_EQ(
       KeyframeModel::FINISHED,
-      player_impl_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
+      animation_impl_->keyframe_effect()->GetKeyframeModelById(2)->run_state());
   EXPECT_EQ(
       KeyframeModel::RUNNING,
-      player_impl_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
+      animation_impl_->keyframe_effect()->GetKeyframeModelById(1)->run_state());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
   // Both animations should have generated FINISHED events.
   EXPECT_EQ(2u, events->events_.size());
@@ -2100,8 +2126,8 @@
 // event for the aborted animation.
 TEST_F(ElementAnimationsTest, FinishedAndAbortedEventsForGroup) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -2110,27 +2136,27 @@
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1.0)), 1,
       TargetProperty::TRANSFORM));
   first_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_impl_->AddKeyframeModel(std::move(first_keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(first_keyframe_model));
 
   std::unique_ptr<KeyframeModel> second_keyframe_model(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
   second_keyframe_model->set_is_controlling_instance_for_test(true);
-  player_impl_->AddKeyframeModel(std::move(second_keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(second_keyframe_model));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Both animations should have started.
   EXPECT_EQ(2u, events->events_.size());
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[0].type);
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[1].type);
 
-  player_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
 
   events = CreateEventsForTesting();
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
 
   // We should have exactly 2 events: a FINISHED event for the tranform
   // animation, and an ABORTED event for the opacity animation.
@@ -2143,22 +2169,22 @@
 
 TEST_F(ElementAnimationsTest, HasOnlyTranslationTransforms) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
 
-  player_impl_->AddKeyframeModel(CreateKeyframeModel(
+  animation_impl_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)),
       1, TargetProperty::OPACITY));
 
   // Opacity animations aren't non-translation transforms.
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve1(
@@ -2173,12 +2199,12 @@
 
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve1), 2, 2, TargetProperty::TRANSFORM));
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
   // The only transform animation we've added is a translation.
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve2(
@@ -2194,43 +2220,43 @@
   keyframe_model =
       KeyframeModel::Create(std::move(curve2), 3, 3, TargetProperty::TRANSFORM);
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
   // A scale animation is not a translation.
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
 
-  player_impl_->keyframe_effect()
+  animation_impl_->keyframe_effect()
       ->GetKeyframeModelById(3)
       ->set_affects_pending_elements(false);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
 
-  player_impl_->keyframe_effect()->GetKeyframeModelById(3)->SetRunState(
+  animation_impl_->keyframe_effect()->GetKeyframeModelById(3)->SetRunState(
       KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
 
   // Only unfinished animations should be considered by
   // HasOnlyTranslationTransforms.
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::PENDING));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->HasOnlyTranslationTransforms(
       ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, AnimationStartScale) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve1(
       KeyframedTransformAnimationCurve::Create());
@@ -2245,21 +2271,21 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve1), 1, 1, TargetProperty::TRANSFORM));
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
   float start_scale = 0.f;
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::PENDING, &start_scale));
   EXPECT_EQ(4.f, start_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::ACTIVE, &start_scale));
   EXPECT_EQ(0.f, start_scale);
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::PENDING, &start_scale));
   EXPECT_EQ(4.f, start_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::ACTIVE, &start_scale));
   EXPECT_EQ(4.f, start_scale);
 
@@ -2273,14 +2299,14 @@
   curve2->AddKeyframe(TransformKeyframe::Create(
       base::TimeDelta::FromSecondsD(1.0), operations3, nullptr));
 
-  player_impl_->RemoveKeyframeModel(1);
+  animation_impl_->RemoveKeyframeModel(1);
   keyframe_model =
       KeyframeModel::Create(std::move(curve2), 2, 2, TargetProperty::TRANSFORM);
 
   // Reverse Direction
   keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve3(
       KeyframedTransformAnimationCurve::Create());
@@ -2296,46 +2322,46 @@
   keyframe_model =
       KeyframeModel::Create(std::move(curve3), 3, 3, TargetProperty::TRANSFORM);
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::PENDING, &start_scale));
   EXPECT_EQ(6.f, start_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::ACTIVE, &start_scale));
   EXPECT_EQ(0.f, start_scale);
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::PENDING, &start_scale));
   EXPECT_EQ(6.f, start_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::ACTIVE, &start_scale));
   EXPECT_EQ(6.f, start_scale);
 
-  player_impl_->keyframe_effect()->GetKeyframeModelById(2)->SetRunState(
+  animation_impl_->keyframe_effect()->GetKeyframeModelById(2)->SetRunState(
       KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
 
   // Only unfinished animations should be considered by
   // AnimationStartScale.
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::PENDING, &start_scale));
   EXPECT_EQ(5.f, start_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->AnimationStartScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->AnimationStartScale(
       ElementListType::ACTIVE, &start_scale));
   EXPECT_EQ(5.f, start_scale);
 }
 
 TEST_F(ElementAnimationsTest, MaximumTargetScale) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   float max_scale = 0.f;
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(0.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(0.f, max_scale);
 
@@ -2352,20 +2378,20 @@
   std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
       std::move(curve1), 1, 1, TargetProperty::TRANSFORM));
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(4.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(0.f, max_scale);
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(4.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(4.f, max_scale);
 
@@ -2382,20 +2408,20 @@
   keyframe_model =
       KeyframeModel::Create(std::move(curve2), 2, 2, TargetProperty::TRANSFORM);
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(4.f, max_scale);
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 
@@ -2412,39 +2438,39 @@
   keyframe_model =
       KeyframeModel::Create(std::move(curve3), 3, 3, TargetProperty::TRANSFORM);
   keyframe_model->set_affects_active_elements(false);
-  player_impl_->AddKeyframeModel(std::move(keyframe_model));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model));
 
-  EXPECT_FALSE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_FALSE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
-  EXPECT_FALSE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
 
-  player_impl_->keyframe_effect()->GetKeyframeModelById(3)->SetRunState(
+  animation_impl_->keyframe_effect()->GetKeyframeModelById(3)->SetRunState(
       KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
-  player_impl_->keyframe_effect()->GetKeyframeModelById(2)->SetRunState(
+  animation_impl_->keyframe_effect()->GetKeyframeModelById(2)->SetRunState(
       KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
 
   // Only unfinished animations should be considered by
   // MaximumTargetScale.
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(4.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(4.f, max_scale);
 }
 
 TEST_F(ElementAnimationsTest, MaximumTargetScaleWithDirection) {
   CreateTestLayer(true, false);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve1(
       KeyframedTransformAnimationCurve::Create());
@@ -2460,7 +2486,7 @@
   std::unique_ptr<KeyframeModel> keyframe_model_owned(KeyframeModel::Create(
       std::move(curve1), 1, 1, TargetProperty::TRANSFORM));
   KeyframeModel* keyframe_model = keyframe_model_owned.get();
-  player_impl_->AddKeyframeModel(std::move(keyframe_model_owned));
+  animation_impl_->AddKeyframeModel(std::move(keyframe_model_owned));
 
   float max_scale = 0.f;
 
@@ -2468,37 +2494,37 @@
 
   // NORMAL direction with positive playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::NORMAL);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 
   // ALTERNATE direction with positive playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 
   // REVERSE direction with positive playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(3.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(3.f, max_scale);
 
   // ALTERNATE reverse direction.
   keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(3.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(3.f, max_scale);
 
@@ -2506,81 +2532,81 @@
 
   // NORMAL direction with negative playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::NORMAL);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(3.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(3.f, max_scale);
 
   // ALTERNATE direction with negative playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(3.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(3.f, max_scale);
 
   // REVERSE direction with negative playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 
   // ALTERNATE reverse direction with negative playback rate.
   keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::PENDING, &max_scale));
   EXPECT_EQ(6.f, max_scale);
-  EXPECT_TRUE(player_impl_->keyframe_effect()->MaximumTargetScale(
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->MaximumTargetScale(
       ElementListType::ACTIVE, &max_scale));
   EXPECT_EQ(6.f, max_scale);
 }
 
 TEST_F(ElementAnimationsTest, NewlyPushedAnimationWaitsForActivation) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0.5f, 1.f, false);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0.5f, 1.f, false);
   EXPECT_TRUE(
-      player_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
-  EXPECT_FALSE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+      animation_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
 
   PushProperties();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(keyframe_model_id)
                    ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime);
+  animation_impl_->Tick(kInitialTickTime);
   EXPECT_EQ(KeyframeModel::STARTING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
 
   // Since the animation hasn't been activated, it should still be STARTING
   // rather than RUNNING.
   EXPECT_EQ(KeyframeModel::STARTING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
@@ -2590,21 +2616,21 @@
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
   EXPECT_EQ(0.f, client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
 
   // Since the animation has been activated, it should have reached the
   // RUNNING state and the active observer should start to get ticked.
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(0.5f,
@@ -2615,30 +2641,30 @@
 
 TEST_F(ElementAnimationsTest, ActivationBetweenAnimateAndUpdateState) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   const int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0.5f, 1.f, true);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0.5f, 1.f, true);
 
   PushProperties();
 
-  EXPECT_TRUE(
-      player_impl_->keyframe_effect()->GetKeyframeModelById(keyframe_model_id));
+  EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
+      keyframe_model_id));
   EXPECT_EQ(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(keyframe_model_id)
                    ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime);
+  animation_impl_->Tick(kInitialTickTime);
 
   // Since the animation hasn't been activated, only the pending observer
   // should have been ticked.
@@ -2646,24 +2672,24 @@
             client_impl_.GetOpacity(element_id_, ElementListType::PENDING));
   EXPECT_EQ(0.f, client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_active_elements());
 
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
 
   // Since the animation has been activated, it should have reached the
   // RUNNING state.
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
 
   // Both elements should have been ticked.
   EXPECT_EQ(0.75f,
@@ -2674,8 +2700,8 @@
 
 TEST_F(ElementAnimationsTest, ObserverNotifiedWhenTransformAnimationChanges) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -2693,7 +2719,7 @@
       element_id_, ElementListType::ACTIVE));
 
   // Case 1: An animation that's allowed to run until its finish point.
-  AddAnimatedTransformToPlayer(player_.get(), 1.0, 1, 1);
+  AddAnimatedTransformToAnimation(animation_.get(), 1.0, 1, 1);
   EXPECT_TRUE(client_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetTransformIsCurrentlyAnimating(
@@ -2709,7 +2735,7 @@
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
@@ -2719,15 +2745,15 @@
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
   // Finish the animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
   EXPECT_FALSE(client_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetTransformIsCurrentlyAnimating(
@@ -2746,8 +2772,8 @@
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_FALSE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
@@ -2759,12 +2785,13 @@
 
   // Case 2: An animation that's removed before it finishes.
   int keyframe_model_id =
-      AddAnimatedTransformToPlayer(player_.get(), 10.0, 2, 2);
-  int animation2_id = AddAnimatedTransformToPlayer(player_.get(), 10.0, 2, 1);
-  player_->keyframe_effect()
+      AddAnimatedTransformToAnimation(animation_.get(), 10.0, 2, 2);
+  int animation2_id =
+      AddAnimatedTransformToAnimation(animation_.get(), 10.0, 2, 1);
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(animation2_id)
       ->set_time_offset(base::TimeDelta::FromMilliseconds(-10000));
-  player_->keyframe_effect()
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(animation2_id)
       ->set_fill_mode(KeyframeModel::FillMode::NONE);
   EXPECT_TRUE(client_.GetHasPotentialTransformAnimation(
@@ -2782,7 +2809,7 @@
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   // animation1 is in effect currently and animation2 isn't. As the element has
@@ -2791,14 +2818,14 @@
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
-  player_->RemoveKeyframeModel(animation2_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(animation2_id);
   EXPECT_FALSE(client_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetTransformIsCurrentlyAnimating(
@@ -2814,14 +2841,15 @@
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
   // Case 3: An animation that's aborted before it finishes.
-  keyframe_model_id = AddAnimatedTransformToPlayer(player_.get(), 10.0, 3, 3);
+  keyframe_model_id =
+      AddAnimatedTransformToAnimation(animation_.get(), 10.0, 3, 3);
   EXPECT_TRUE(client_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetTransformIsCurrentlyAnimating(
@@ -2837,19 +2865,19 @@
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_impl_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
@@ -2859,8 +2887,8 @@
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
+  animation_impl_->UpdateState(true, events.get());
 
   element_animations_->NotifyAnimationAborted(events->events_[0]);
   EXPECT_FALSE(client_.GetHasPotentialTransformAnimation(
@@ -2869,11 +2897,12 @@
       element_id_, ElementListType::ACTIVE));
 
   // Case 4 : An animation that's not in effect.
-  keyframe_model_id = AddAnimatedTransformToPlayer(player_.get(), 1.0, 1, 6);
-  player_->keyframe_effect()
+  keyframe_model_id =
+      AddAnimatedTransformToAnimation(animation_.get(), 1.0, 1, 6);
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_time_offset(base::TimeDelta::FromMilliseconds(-10000));
-  player_->keyframe_effect()
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_fill_mode(KeyframeModel::FillMode::NONE);
 
@@ -2887,7 +2916,7 @@
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
@@ -2896,8 +2925,8 @@
 
 TEST_F(ElementAnimationsTest, ObserverNotifiedWhenOpacityAnimationChanges) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -2915,8 +2944,8 @@
       element_id_, ElementListType::ACTIVE));
 
   // Case 1: An animation that's allowed to run until its finish point.
-  AddOpacityTransitionToPlayer(player_.get(), 1.0, 0.f, 1.f,
-                               false /*use_timing_function*/);
+  AddOpacityTransitionToAnimation(animation_.get(), 1.0, 0.f, 1.f,
+                                  false /*use_timing_function*/);
   EXPECT_TRUE(client_.GetHasPotentialOpacityAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -2932,7 +2961,7 @@
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
@@ -2942,15 +2971,15 @@
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
   // Finish the animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
   EXPECT_FALSE(client_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -2969,8 +2998,8 @@
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_FALSE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
@@ -2981,8 +3010,8 @@
       element_id_, ElementListType::ACTIVE));
 
   // Case 2: An animation that's removed before it finishes.
-  int keyframe_model_id = AddOpacityTransitionToPlayer(
-      player_.get(), 10.0, 0.f, 1.f, false /*use_timing_function*/);
+  int keyframe_model_id = AddOpacityTransitionToAnimation(
+      animation_.get(), 10.0, 0.f, 1.f, false /*use_timing_function*/);
   EXPECT_TRUE(client_.GetHasPotentialOpacityAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -2998,19 +3027,19 @@
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(client_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -3026,15 +3055,15 @@
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
   // Case 3: An animation that's aborted before it finishes.
-  keyframe_model_id = AddOpacityTransitionToPlayer(
-      player_.get(), 10.0, 0.f, 0.5f, false /*use_timing_function*/);
+  keyframe_model_id = AddOpacityTransitionToAnimation(
+      animation_.get(), 10.0, 0.f, 0.5f, false /*use_timing_function*/);
   EXPECT_TRUE(client_.GetHasPotentialOpacityAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -3050,19 +3079,19 @@
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
@@ -3072,8 +3101,8 @@
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
+  animation_impl_->UpdateState(true, events.get());
 
   element_animations_->NotifyAnimationAborted(events->events_[0]);
   EXPECT_FALSE(client_.GetHasPotentialOpacityAnimation(
@@ -3082,12 +3111,12 @@
                                                       ElementListType::ACTIVE));
 
   // Case 4 : An animation that's not in effect.
-  keyframe_model_id = AddOpacityTransitionToPlayer(
-      player_.get(), 1.0, 0.f, 0.5f, false /*use_timing_function*/);
-  player_->keyframe_effect()
+  keyframe_model_id = AddOpacityTransitionToAnimation(
+      animation_.get(), 1.0, 0.f, 0.5f, false /*use_timing_function*/);
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_time_offset(base::TimeDelta::FromMilliseconds(-10000));
-  player_->keyframe_effect()
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_fill_mode(KeyframeModel::FillMode::NONE);
 
@@ -3101,7 +3130,7 @@
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
@@ -3110,8 +3139,8 @@
 
 TEST_F(ElementAnimationsTest, ObserverNotifiedWhenFilterAnimationChanges) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
@@ -3129,7 +3158,7 @@
       element_id_, ElementListType::ACTIVE));
 
   // Case 1: An animation that's allowed to run until its finish point.
-  AddAnimatedFilterToPlayer(player_.get(), 1.0, 0.f, 1.f);
+  AddAnimatedFilterToAnimation(animation_.get(), 1.0, 0.f, 1.f);
   EXPECT_TRUE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                      ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3145,7 +3174,7 @@
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
@@ -3155,15 +3184,15 @@
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
   // Finish the animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->UpdateState(true, nullptr);
   EXPECT_FALSE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3182,8 +3211,8 @@
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_FALSE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
@@ -3195,7 +3224,7 @@
 
   // Case 2: An animation that's removed before it finishes.
   int keyframe_model_id =
-      AddAnimatedFilterToPlayer(player_.get(), 10.0, 0.f, 1.f);
+      AddAnimatedFilterToAnimation(animation_.get(), 10.0, 0.f, 1.f);
   EXPECT_TRUE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                      ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3211,19 +3240,19 @@
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3239,14 +3268,15 @@
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_FALSE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
   // Case 3: An animation that's aborted before it finishes.
-  keyframe_model_id = AddAnimatedFilterToPlayer(player_.get(), 10.0, 0.f, 0.5f);
+  keyframe_model_id =
+      AddAnimatedFilterToAnimation(animation_.get(), 10.0, 0.f, 0.5f);
   EXPECT_TRUE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                      ElementListType::ACTIVE));
   EXPECT_TRUE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3262,19 +3292,19 @@
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_TRUE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_impl_->UpdateState(true, events.get());
 
-  player_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
+  animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  player_impl_->AbortKeyframeModels(TargetProperty::FILTER, false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::FILTER, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
@@ -3284,8 +3314,8 @@
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
+  animation_impl_->UpdateState(true, events.get());
 
   element_animations_->NotifyAnimationAborted(events->events_[0]);
   EXPECT_FALSE(client_.GetHasPotentialFilterAnimation(element_id_,
@@ -3294,11 +3324,12 @@
                                                      ElementListType::ACTIVE));
 
   // Case 4 : An animation that's not in effect.
-  keyframe_model_id = AddAnimatedFilterToPlayer(player_.get(), 1.0, 0.f, 0.5f);
-  player_->keyframe_effect()
+  keyframe_model_id =
+      AddAnimatedFilterToAnimation(animation_.get(), 1.0, 0.f, 0.5f);
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_time_offset(base::TimeDelta::FromMilliseconds(-10000));
-  player_->keyframe_effect()
+  animation_->keyframe_effect()
       ->GetKeyframeModelById(keyframe_model_id)
       ->set_fill_mode(KeyframeModel::FillMode::NONE);
 
@@ -3312,7 +3343,7 @@
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
       element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   EXPECT_TRUE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
@@ -3321,47 +3352,47 @@
 
 TEST_F(ElementAnimationsTest, ClippedOpacityValues) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
-  AddOpacityTransitionToPlayer(player_.get(), 1, 1.f, 2.f, true);
+  AddOpacityTransitionToAnimation(animation_.get(), 1, 1.f, 2.f, true);
 
-  player_->Tick(kInitialTickTime);
+  animation_->Tick(kInitialTickTime);
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // Opacity values are clipped [0,1]
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, ClippedNegativeOpacityValues) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
-  AddOpacityTransitionToPlayer(player_.get(), 1, 0.f, -2.f, true);
+  AddOpacityTransitionToAnimation(animation_.get(), 1, 0.f, -2.f, true);
 
-  player_->Tick(kInitialTickTime);
+  animation_->Tick(kInitialTickTime);
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // Opacity values are clipped [0,1]
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, PushedDeletedAnimationWaitsForActivation) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   const int keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0.5f, 1.f, true);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0.5f, 1.f, true);
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->ActivateKeyframeEffects();
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(0.5f,
@@ -3369,28 +3400,28 @@
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_active_elements());
 
   // Delete the animation on the main-thread animations.
-  player_->RemoveKeyframeModel(
-      player_->GetKeyframeModel(TargetProperty::OPACITY)->id());
+  animation_->RemoveKeyframeModel(
+      animation_->GetKeyframeModel(TargetProperty::OPACITY)->id());
   PushProperties();
 
   // The animation should no longer affect pending elements.
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(keyframe_model_id)
                    ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(keyframe_model_id)
                   ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_impl_->UpdateState(true, events.get());
 
   // Only the active observer should have been ticked.
   EXPECT_EQ(0.5f,
@@ -3398,77 +3429,77 @@
   EXPECT_EQ(0.75f,
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
   events = CreateEventsForTesting();
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->UpdateState(true, events.get());
 
   // After Activation the animation doesn't affect neither active nor pending
   // thread. UpdateState for this animation would put the animation to wait for
   // deletion state.
   EXPECT_EQ(KeyframeModel::WAITING_FOR_DELETION,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(1u, events->events_.size());
 
   // The animation is finished on impl thread, and main thread will delete it
   // during commit.
-  player_->animation_host()->SetAnimationEvents(std::move(events));
+  animation_->animation_host()->SetAnimationEvents(std::move(events));
   PushProperties();
-  EXPECT_FALSE(player_impl_->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()->has_any_keyframe_model());
 }
 
 // Tests that an animation that affects only active elements won't block
 // an animation that affects only pending elements from starting.
 TEST_F(ElementAnimationsTest, StartAnimationsAffectingDifferentObservers) {
   CreateTestLayer(true, true);
-  AttachTimelinePlayerLayer();
-  CreateImplTimelineAndPlayer();
+  AttachTimelineAnimationLayer();
+  CreateImplTimelineAndAnimation();
 
   auto events = CreateEventsForTesting();
 
   const int first_keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0.f, 1.f, true);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0.f, 1.f, true);
 
   PushProperties();
-  player_impl_->ActivateKeyframeEffects();
-  player_impl_->Tick(kInitialTickTime);
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->ActivateKeyframeEffects();
+  animation_impl_->Tick(kInitialTickTime);
+  animation_impl_->UpdateState(true, events.get());
 
   // Remove the first animation from the main-thread animations, and add a
   // new animation affecting the same property.
-  player_->RemoveKeyframeModel(
-      player_->GetKeyframeModel(TargetProperty::OPACITY)->id());
+  animation_->RemoveKeyframeModel(
+      animation_->GetKeyframeModel(TargetProperty::OPACITY)->id());
   const int second_keyframe_model_id =
-      AddOpacityTransitionToPlayer(player_.get(), 1, 1.f, 0.5f, true);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 1.f, 0.5f, true);
   PushProperties();
 
   // The original animation should only affect active elements, and the new
   // animation should only affect pending elements.
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(first_keyframe_model_id)
                    ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(first_keyframe_model_id)
                   ->affects_active_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(second_keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(second_keyframe_model_id)
                    ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(500));
+  animation_impl_->UpdateState(true, events.get());
 
   // The original animation should still be running, and the new animation
   // should be starting.
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(first_keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(KeyframeModel::STARTING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(second_keyframe_model_id)
                 ->run_state());
 
@@ -3479,36 +3510,36 @@
   EXPECT_EQ(0.5f,
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
-  player_impl_->ActivateKeyframeEffects();
+  animation_impl_->ActivateKeyframeEffects();
 
   // The original animation no longer affect either elements, and the new
   // animation should now affect both elements.
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(first_keyframe_model_id)
                    ->affects_pending_elements());
-  EXPECT_FALSE(player_impl_->keyframe_effect()
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->GetKeyframeModelById(first_keyframe_model_id)
                    ->affects_active_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(second_keyframe_model_id)
                   ->affects_pending_elements());
-  EXPECT_TRUE(player_impl_->keyframe_effect()
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
                   ->GetKeyframeModelById(second_keyframe_model_id)
                   ->affects_active_elements());
 
-  player_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
-  player_impl_->UpdateState(true, events.get());
+  animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
+  animation_impl_->UpdateState(true, events.get());
 
   // The original animation should be marked for waiting for deletion.
   EXPECT_EQ(KeyframeModel::WAITING_FOR_DELETION,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(first_keyframe_model_id)
                 ->run_state());
 
   // The new animation should be running, and the active observer should have
   // been ticked at the new animation's starting point.
   EXPECT_EQ(KeyframeModel::RUNNING,
-            player_impl_->keyframe_effect()
+            animation_impl_->keyframe_effect()
                 ->GetKeyframeModelById(second_keyframe_model_id)
                 ->run_state());
   EXPECT_EQ(1.f,
@@ -3518,7 +3549,7 @@
 
 TEST_F(ElementAnimationsTest, TestIsCurrentlyAnimatingProperty) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   // Create an animation that initially affects only pending elements.
   std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(
@@ -3526,60 +3557,60 @@
       1, TargetProperty::OPACITY));
   keyframe_model->set_affects_active_elements(false);
 
-  player_->AddKeyframeModel(std::move(keyframe_model));
-  player_->Tick(kInitialTickTime);
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  animation_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->Tick(kInitialTickTime);
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
 
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
-  player_->ActivateKeyframeEffects();
+  animation_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(10));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(10));
+  animation_->UpdateState(true, nullptr);
 
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
   EXPECT_EQ(0.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
 
   // Tick past the end of the animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1100));
-  player_->UpdateState(true, nullptr);
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1100));
+  animation_->UpdateState(true, nullptr);
 
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
   EXPECT_EQ(1.f, client_.GetOpacity(element_id_, ElementListType::ACTIVE));
@@ -3587,7 +3618,7 @@
 
 TEST_F(ElementAnimationsTest, TestIsAnimatingPropertyTimeOffsetFillMode) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
   // Create an animation that initially affects only pending elements, and has
   // a start delay of 2 seconds.
@@ -3598,128 +3629,129 @@
   keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(-2000));
   keyframe_model->set_affects_active_elements(false);
 
-  player_->AddKeyframeModel(std::move(keyframe_model));
+  animation_->AddKeyframeModel(std::move(keyframe_model));
 
-  player_->Tick(kInitialTickTime);
+  animation_->Tick(kInitialTickTime);
 
   // Since the animation has a start delay, the elements it affects have a
   // potentially running transform animation but aren't currently animating
   // transform.
-  EXPECT_TRUE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
-  player_->ActivateKeyframeEffects();
+  animation_->ActivateKeyframeEffects();
 
-  EXPECT_TRUE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_TRUE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_TRUE(player_->keyframe_effect()->HasTickingKeyframeModel());
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->HasTickingKeyframeModel());
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::FILTER, ElementListType::ACTIVE));
 
-  player_->UpdateState(true, nullptr);
+  animation_->UpdateState(true, nullptr);
 
   // Tick past the start delay.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
-  player_->UpdateState(true, nullptr);
-  EXPECT_TRUE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(2000));
+  animation_->UpdateState(true, nullptr);
+  EXPECT_TRUE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_TRUE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_TRUE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_TRUE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
 
   // After the animaton finishes, the elements it affects have neither a
   // potentially running transform animation nor a currently running transform
   // animation.
-  player_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
-  player_->UpdateState(true, nullptr);
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  animation_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(4000));
+  animation_->UpdateState(true, nullptr);
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsPotentiallyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsPotentiallyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::PENDING));
-  EXPECT_FALSE(player_->keyframe_effect()->IsCurrentlyAnimatingProperty(
+  EXPECT_FALSE(animation_->keyframe_effect()->IsCurrentlyAnimatingProperty(
       TargetProperty::OPACITY, ElementListType::ACTIVE));
 }
 
 TEST_F(ElementAnimationsTest, DestroyTestMainLayerBeforePushProperties) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
-  EXPECT_EQ(0u, host_->ticking_players_for_testing().size());
+  AttachTimelineAnimationLayer();
+  EXPECT_EQ(0u, host_->ticking_animations_for_testing().size());
 
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  EXPECT_EQ(1u, host_->ticking_players_for_testing().size());
+  EXPECT_EQ(1u, host_->ticking_animations_for_testing().size());
 
   DestroyTestMainLayer();
-  EXPECT_EQ(0u, host_->ticking_players_for_testing().size());
+  EXPECT_EQ(0u, host_->ticking_animations_for_testing().size());
 
   PushProperties();
-  EXPECT_EQ(0u, host_->ticking_players_for_testing().size());
-  EXPECT_EQ(0u, host_impl_->ticking_players_for_testing().size());
+  EXPECT_EQ(0u, host_->ticking_animations_for_testing().size());
+  EXPECT_EQ(0u, host_impl_->ticking_animations_for_testing().size());
 }
 
-TEST_F(ElementAnimationsTest, RemoveAndReAddPlayerToTicking) {
+TEST_F(ElementAnimationsTest, RemoveAndReAddAnimationToTicking) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
-  EXPECT_EQ(0u, host_->ticking_players_for_testing().size());
+  AttachTimelineAnimationLayer();
+  EXPECT_EQ(0u, host_->ticking_animations_for_testing().size());
 
-  // Add an animation and ensure the player is in the host's ticking players.
-  // Remove the player using RemoveFromTicking().
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  // Add an animation and ensure the animation is in the host's ticking
+  // animations. Remove the animation using RemoveFromTicking().
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  ASSERT_EQ(1u, host_->ticking_players_for_testing().size());
-  player_->keyframe_effect()->RemoveFromTicking();
-  ASSERT_EQ(0u, host_->ticking_players_for_testing().size());
+  ASSERT_EQ(1u, host_->ticking_animations_for_testing().size());
+  animation_->keyframe_effect()->RemoveFromTicking();
+  ASSERT_EQ(0u, host_->ticking_animations_for_testing().size());
 
   // Ensure that adding a new animation will correctly update the ticking
-  // players list.
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  // animations list.
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  EXPECT_EQ(1u, host_->ticking_players_for_testing().size());
+  EXPECT_EQ(1u, host_->ticking_animations_for_testing().size());
 }
 
 TEST_F(ElementAnimationsTest, TickingKeyframeModelsCount) {
   CreateTestLayer(false, false);
-  AttachTimelinePlayerLayer();
+  AttachTimelineAnimationLayer();
 
-  // Add an animation and ensure the player is in the host's ticking players.
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  // Add an animation and ensure the animation is in the host's ticking
+  // animations.
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  EXPECT_EQ(1u, player_->TickingKeyframeModelsCount());
+  EXPECT_EQ(1u, animation_->TickingKeyframeModelsCount());
   EXPECT_EQ(1u, host_->CompositedAnimationsCount());
-  player_->AddKeyframeModel(CreateKeyframeModel(
+  animation_->AddKeyframeModel(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeTransformTransition(1)), 1,
       TargetProperty::TRANSFORM));
-  EXPECT_EQ(2u, player_->TickingKeyframeModelsCount());
+  EXPECT_EQ(2u, animation_->TickingKeyframeModelsCount());
   EXPECT_EQ(2u, host_->CompositedAnimationsCount());
-  player_->keyframe_effect()->RemoveFromTicking();
+  animation_->keyframe_effect()->RemoveFromTicking();
   EXPECT_EQ(0u, host_->CompositedAnimationsCount());
 }
 
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc
index 52e1045d..cf7b892 100644
--- a/cc/animation/keyframe_effect.cc
+++ b/cc/animation/keyframe_effect.cc
@@ -8,9 +8,9 @@
 
 #include "base/stl_util.h"
 #include "base/time/time.h"
+#include "cc/animation/animation.h"
 #include "cc/animation/animation_curve.h"
 #include "cc/animation/animation_host.h"
-#include "cc/animation/animation_player.h"
 #include "cc/animation/keyframe_model.h"
 #include "cc/animation/scroll_offset_animation_curve.h"
 #include "cc/animation/transform_operations.h"
@@ -46,7 +46,7 @@
 }  // namespace
 
 KeyframeEffect::KeyframeEffect(KeyframeEffectId id)
-    : animation_player_(),
+    : animation_(),
       id_(id),
       element_animations_(),
       needs_to_start_keyframe_models_(false),
@@ -74,7 +74,7 @@
   DCHECK(element_animations());
   element_animations()->SetNeedsPushProperties();
 
-  animation_player_->SetNeedsPushProperties();
+  animation_->SetNeedsPushProperties();
 }
 
 void KeyframeEffect::BindElementAnimations(
@@ -179,7 +179,7 @@
   // Resetting last_tick_time_ here ensures that calling ::UpdateState
   // before ::Animate doesn't start a keyframe model.
   last_tick_time_ = base::TimeTicks();
-  animation_player_->KeyframeModelRemovedFromTicking();
+  animation_->KeyframeModelRemovedFromTicking();
 }
 
 void KeyframeEffect::UpdateState(bool start_ready_keyframe_models,
@@ -210,7 +210,7 @@
 
 void KeyframeEffect::UpdateTickingState(UpdateTickingType type) {
   bool force = type == UpdateTickingType::FORCE;
-  if (animation_player_->has_animation_host()) {
+  if (animation_->has_animation_host()) {
     bool was_ticking = is_ticking_;
     is_ticking_ = HasNonDeletedKeyframeModel();
 
@@ -218,7 +218,7 @@
         element_animations_->has_element_in_any_list();
 
     if (is_ticking_ && ((!was_ticking && has_element_in_any_list) || force)) {
-      animation_player_->AddToTicking();
+      animation_->AddToTicking();
     } else if (!is_ticking_ && (was_ticking || force)) {
       RemoveFromTicking();
     }
@@ -227,7 +227,7 @@
 
 void KeyframeEffect::AddKeyframeModel(
     std::unique_ptr<KeyframeModel> keyframe_model) {
-  AnimationHost* animation_host = animation_player_->animation_host();
+  AnimationHost* animation_host = animation_->animation_host();
   DCHECK(keyframe_model->target_property_id() !=
              TargetProperty::SCROLL_OFFSET ||
          (animation_host && animation_host->SupportsScrollAnimations()));
@@ -254,7 +254,7 @@
   }
 
   if (has_bound_element_animations()) {
-    animation_player_->SetNeedsCommit();
+    animation_->SetNeedsCommit();
     SetNeedsPushProperties();
   }
 }
@@ -287,7 +287,7 @@
     UpdateTickingState(UpdateTickingType::NORMAL);
     if (keyframe_model_removed)
       element_animations_->UpdateClientAnimationState();
-    animation_player_->SetNeedsCommit();
+    animation_->SetNeedsCommit();
     SetNeedsPushProperties();
   }
 }
@@ -302,7 +302,7 @@
   }
 
   if (has_bound_element_animations()) {
-    animation_player_->SetNeedsCommit();
+    animation_->SetNeedsCommit();
     SetNeedsPushProperties();
   }
 }
@@ -331,7 +331,7 @@
   if (has_bound_element_animations()) {
     if (aborted_keyframe_model)
       element_animations_->UpdateClientAnimationState();
-    animation_player_->SetNeedsCommit();
+    animation_->SetNeedsCommit();
     SetNeedsPushProperties();
   }
 }
@@ -358,7 +358,7 @@
 void KeyframeEffect::KeyframeModelAdded() {
   DCHECK(has_bound_element_animations());
 
-  animation_player_->SetNeedsCommit();
+  animation_->SetNeedsCommit();
   needs_to_start_keyframe_models_ = true;
 
   UpdateTickingState(UpdateTickingType::NORMAL);
@@ -374,7 +374,7 @@
       keyframe_model->set_needs_synchronized_start_time(false);
       if (!keyframe_model->has_set_start_time())
         keyframe_model->set_start_time(event.monotonic_time);
-      animation_player_->NotifyKeyframeModelStarted(event);
+      animation_->NotifyKeyframeModelStarted(event);
       return true;
     }
   }
@@ -387,7 +387,7 @@
     if (keyframe_model->group() == event.group_id &&
         keyframe_model->target_property_id() == event.target_property) {
       keyframe_model->set_received_finished_event(true);
-      animation_player_->NotifyKeyframeModelFinished(event);
+      animation_->NotifyKeyframeModelFinished(event);
       return true;
     }
   }
@@ -406,7 +406,7 @@
   // We need to purge KeyframeModels marked for deletion on CT.
   SetNeedsPushProperties();
 
-  animation_player_->NotifyKeyframeModelTakeover(event);
+  animation_->NotifyKeyframeModelTakeover(event);
 }
 
 bool KeyframeEffect::NotifyKeyframeModelAborted(const AnimationEvent& event) {
@@ -416,7 +416,7 @@
         keyframe_model->target_property_id() == event.target_property) {
       keyframe_model->SetRunState(KeyframeModel::ABORTED, event.monotonic_time);
       keyframe_model->set_received_finished_event(true);
-      animation_player_->NotifyKeyframeModelAborted(event);
+      animation_->NotifyKeyframeModelAborted(event);
       return true;
     }
   }
@@ -670,8 +670,8 @@
 
 void KeyframeEffect::PushNewKeyframeModelsToImplThread(
     KeyframeEffect* keyframe_effect_impl) const {
-  // Any new KeyframeModels owned by the main thread's AnimationPlayer are
-  // cloned and added to the impl thread's AnimationPlayer.
+  // Any new KeyframeModels owned by the main thread's Animation are
+  // cloned and added to the impl thread's Animation.
   for (const auto& keyframe_model : keyframe_models_) {
     // If the keyframe_model is already running on the impl thread, there is no
     // need to copy it over.
@@ -755,14 +755,14 @@
 
   // Synchronize the keyframe_model target between main and impl side.
   if (element_id_ != keyframe_effect_impl->element_id_) {
-    // We have to detach/attach via the AnimationPlayer as it may need to inform
+    // We have to detach/attach via the Animation as it may need to inform
     // the host as well.
     if (keyframe_effect_impl->has_attached_element()) {
-      keyframe_effect_impl->animation_player_->DetachElementForKeyframeEffect(
+      keyframe_effect_impl->animation_->DetachElementForKeyframeEffect(
           keyframe_effect_impl->element_id_, keyframe_effect_impl->id_);
     }
     if (element_id_) {
-      keyframe_effect_impl->animation_player_->AttachElementForKeyframeEffect(
+      keyframe_effect_impl->animation_->AttachElementForKeyframeEffect(
           element_id_, id_);
     }
   }
@@ -799,8 +799,8 @@
   keyframe_effect_impl->UpdateTickingState(UpdateTickingType::NORMAL);
 }
 
-void KeyframeEffect::SetAnimationPlayer(AnimationPlayer* animation_player) {
-  animation_player_ = animation_player;
+void KeyframeEffect::SetAnimation(Animation* animation) {
+  animation_ = animation;
 }
 
 std::string KeyframeEffect::KeyframeModelsToString() const {
@@ -1084,13 +1084,13 @@
   // For impl only animations notify delegate directly, do not record the event.
   switch (type) {
     case AnimationEvent::FINISHED:
-      animation_player_->NotifyKeyframeModelFinished(event);
+      animation_->NotifyKeyframeModelFinished(event);
       break;
     case AnimationEvent::STARTED:
-      animation_player_->NotifyKeyframeModelStarted(event);
+      animation_->NotifyKeyframeModelStarted(event);
       break;
     case AnimationEvent::ABORTED:
-      animation_player_->NotifyKeyframeModelAborted(event);
+      animation_->NotifyKeyframeModelAborted(event);
       break;
     case AnimationEvent::TAKEOVER:
       // We never expect to receive a TAKEOVER notification on impl only
@@ -1116,7 +1116,7 @@
       keyframe_model.curve()->ToScrollOffsetAnimationCurve();
   takeover_event.curve = scroll_offset_animation_curve->Clone();
   // Notify the compositor that the animation is finished.
-  animation_player_->NotifyKeyframeModelFinished(takeover_event);
+  animation_->NotifyKeyframeModelFinished(takeover_event);
   // Notify main thread.
   events->events_.push_back(takeover_event);
 }
diff --git a/cc/animation/keyframe_effect.h b/cc/animation/keyframe_effect.h
index 55ab14a..8db169e7 100644
--- a/cc/animation/keyframe_effect.h
+++ b/cc/animation/keyframe_effect.h
@@ -22,7 +22,7 @@
 
 namespace cc {
 
-class AnimationPlayer;
+class Animation;
 class KeyframeModel;
 struct PropertyAnimationState;
 
@@ -165,7 +165,7 @@
       KeyframeEffect* element_keyframe_effect_impl) const;
   void PushPropertiesTo(KeyframeEffect* keyframe_effect_impl);
 
-  void SetAnimationPlayer(AnimationPlayer* animation_player);
+  void SetAnimation(Animation* animation);
 
   std::string KeyframeModelsToString() const;
   KeyframeEffectId id() const { return id_; }
@@ -189,7 +189,7 @@
       base::TimeTicks monotonic_time);
 
   std::vector<std::unique_ptr<KeyframeModel>> keyframe_models_;
-  AnimationPlayer* animation_player_;
+  Animation* animation_;
 
   KeyframeEffectId id_;
   ElementId element_id_;
diff --git a/cc/animation/keyframe_model.h b/cc/animation/keyframe_model.h
index 2118c7ee..517d8be 100644
--- a/cc/animation/keyframe_model.h
+++ b/cc/animation/keyframe_model.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 CC_ANIMATION_KEYFRAMEMODEL_H_
-#define CC_ANIMATION_KEYFRAMEMODEL_H_
+#ifndef CC_ANIMATION_KEYFRAME_MODEL_H_
+#define CC_ANIMATION_KEYFRAME_MODEL_H_
 
 #include <memory>
 
@@ -21,9 +21,9 @@
 // It represents a model of the keyframes (internally represented as a curve).
 class CC_ANIMATION_EXPORT KeyframeModel {
  public:
-  // TODO(yigu): RunState is supposed to be managed/accessed at a higher level.
-  // e.g. the counterpart of blink::Animation, which is AnimationPlayer at
-  // the moment (https://crbug.com/812652).
+  // TODO(yigu): RunState is supposed to be managed/accessed at Animation
+  // level rather than KeyframeModel level. See https://crbug.com/812652.
+  //
   // KeyframeModels begin in the 'WAITING_FOR_TARGET_AVAILABILITY' state. A
   // KeyframeModel waiting for target availibility will run as soon as its
   // target property is free (and all the KeyframeModels animating with it are
@@ -249,4 +249,4 @@
 
 }  // namespace cc
 
-#endif  // CC_ANIMATION_KEYFRAMEMODEL_H_
+#endif  // CC_ANIMATION_KEYFRAME_MODEL_H_
diff --git a/cc/animation/scroll_offset_animation_curve.h b/cc/animation/scroll_offset_animation_curve.h
index 7a26777..d471d2b 100644
--- a/cc/animation/scroll_offset_animation_curve.h
+++ b/cc/animation/scroll_offset_animation_curve.h
@@ -20,10 +20,10 @@
 // ScrollOffsetAnimationCurve computes scroll offset as a function of time
 // during a scroll offset animation.
 //
-// Scroll offset animations can run either in Blink or on a cc AnimationPlayer,
-// in response to user input or programmatic scroll operations.  For more
-// information about scheduling and servicing scroll animations, see
-// blink::ScrollAnimator and blink::ProgrammaticScrollAnimator.
+// Scroll offset animations can run either in Blink or in cc, in response to
+// user input or programmatic scroll operations.  For more information about
+// scheduling and servicing scroll animations, see blink::ScrollAnimator and
+// blink::ProgrammaticScrollAnimator.
 
 class CC_ANIMATION_EXPORT ScrollOffsetAnimationCurve : public AnimationCurve {
  public:
diff --git a/cc/animation/scroll_offset_animations_impl.cc b/cc/animation/scroll_offset_animations_impl.cc
index dda852a..9e0b9aa 100644
--- a/cc/animation/scroll_offset_animations_impl.cc
+++ b/cc/animation/scroll_offset_animations_impl.cc
@@ -8,7 +8,7 @@
 #include "cc/animation/animation_id_provider.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/element_animations.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/timing_function.h"
 
 namespace cc {
@@ -18,18 +18,17 @@
     : animation_host_(animation_host),
       scroll_offset_timeline_(
           AnimationTimeline::Create(AnimationIdProvider::NextTimelineId())),
-      scroll_offset_animation_player_(
-          SingleKeyframeEffectAnimationPlayer::Create(
-              AnimationIdProvider::NextPlayerId())) {
+      scroll_offset_animation_(SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId())) {
   scroll_offset_timeline_->set_is_impl_only(true);
-  scroll_offset_animation_player_->set_animation_delegate(this);
+  scroll_offset_animation_->set_animation_delegate(this);
 
   animation_host_->AddAnimationTimeline(scroll_offset_timeline_.get());
-  scroll_offset_timeline_->AttachPlayer(scroll_offset_animation_player_.get());
+  scroll_offset_timeline_->AttachAnimation(scroll_offset_animation_.get());
 }
 
 ScrollOffsetAnimationsImpl::~ScrollOffsetAnimationsImpl() {
-  scroll_offset_timeline_->DetachPlayer(scroll_offset_animation_player_.get());
+  scroll_offset_timeline_->DetachAnimation(scroll_offset_animation_.get());
   animation_host_->RemoveAnimationTimeline(scroll_offset_timeline_.get());
 }
 
@@ -52,12 +51,12 @@
   keyframe_model->set_time_offset(animation_start_offset);
   keyframe_model->SetIsImplOnly();
 
-  DCHECK(scroll_offset_animation_player_);
-  DCHECK(scroll_offset_animation_player_->animation_timeline());
+  DCHECK(scroll_offset_animation_);
+  DCHECK(scroll_offset_animation_->animation_timeline());
 
-  ReattachScrollOffsetPlayerIfNeeded(element_id);
+  ReattachScrollOffsetAnimationIfNeeded(element_id);
 
-  scroll_offset_animation_player_->AddKeyframeModel(std::move(keyframe_model));
+  scroll_offset_animation_->AddKeyframeModel(std::move(keyframe_model));
 }
 
 bool ScrollOffsetAnimationsImpl::ScrollAnimationUpdateTarget(
@@ -66,17 +65,16 @@
     const gfx::ScrollOffset& max_scroll_offset,
     base::TimeTicks frame_monotonic_time,
     base::TimeDelta delayed_by) {
-  DCHECK(scroll_offset_animation_player_);
-  if (!scroll_offset_animation_player_->has_element_animations())
+  DCHECK(scroll_offset_animation_);
+  if (!scroll_offset_animation_->has_element_animations())
     return false;
 
-  DCHECK_EQ(element_id, scroll_offset_animation_player_->element_id());
+  DCHECK_EQ(element_id, scroll_offset_animation_->element_id());
 
   KeyframeModel* keyframe_model =
-      scroll_offset_animation_player_->GetKeyframeModel(
-          TargetProperty::SCROLL_OFFSET);
+      scroll_offset_animation_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
   if (!keyframe_model) {
-    scroll_offset_animation_player_->DetachElement();
+    scroll_offset_animation_->DetachElement();
     return false;
   }
   if (scroll_delta.IsZero())
@@ -111,16 +109,15 @@
 void ScrollOffsetAnimationsImpl::ScrollAnimationApplyAdjustment(
     ElementId element_id,
     const gfx::Vector2dF& adjustment) {
-  DCHECK(scroll_offset_animation_player_);
-  if (element_id != scroll_offset_animation_player_->element_id())
+  DCHECK(scroll_offset_animation_);
+  if (element_id != scroll_offset_animation_->element_id())
     return;
 
-  if (!scroll_offset_animation_player_->has_element_animations())
+  if (!scroll_offset_animation_->has_element_animations())
     return;
 
   KeyframeModel* keyframe_model =
-      scroll_offset_animation_player_->GetKeyframeModel(
-          TargetProperty::SCROLL_OFFSET);
+      scroll_offset_animation_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
   if (!keyframe_model)
     return;
 
@@ -141,14 +138,13 @@
   ScrollAnimationAbort(/* needs_completion */ false);
 
   // Start a new one with the adjusment.
-  scroll_offset_animation_player_->AddKeyframeModel(
-      std::move(new_keyframe_model));
+  scroll_offset_animation_->AddKeyframeModel(std::move(new_keyframe_model));
 }
 
 void ScrollOffsetAnimationsImpl::ScrollAnimationAbort(bool needs_completion) {
-  DCHECK(scroll_offset_animation_player_);
-  scroll_offset_animation_player_->AbortKeyframeModels(
-      TargetProperty::SCROLL_OFFSET, needs_completion);
+  DCHECK(scroll_offset_animation_);
+  scroll_offset_animation_->AbortKeyframeModels(TargetProperty::SCROLL_OFFSET,
+                                                needs_completion);
 }
 
 void ScrollOffsetAnimationsImpl::NotifyAnimationFinished(
@@ -160,13 +156,13 @@
   animation_host_->mutator_host_client()->ScrollOffsetAnimationFinished();
 }
 
-void ScrollOffsetAnimationsImpl::ReattachScrollOffsetPlayerIfNeeded(
+void ScrollOffsetAnimationsImpl::ReattachScrollOffsetAnimationIfNeeded(
     ElementId element_id) {
-  if (scroll_offset_animation_player_->element_id() != element_id) {
-    if (scroll_offset_animation_player_->element_id())
-      scroll_offset_animation_player_->DetachElement();
+  if (scroll_offset_animation_->element_id() != element_id) {
+    if (scroll_offset_animation_->element_id())
+      scroll_offset_animation_->DetachElement();
     if (element_id)
-      scroll_offset_animation_player_->AttachElement(element_id);
+      scroll_offset_animation_->AttachElement(element_id);
   }
 }
 
diff --git a/cc/animation/scroll_offset_animations_impl.h b/cc/animation/scroll_offset_animations_impl.h
index fa56d82..69341f89f 100644
--- a/cc/animation/scroll_offset_animations_impl.h
+++ b/cc/animation/scroll_offset_animations_impl.h
@@ -17,11 +17,11 @@
 
 class AnimationHost;
 class AnimationTimeline;
-class SingleKeyframeEffectAnimationPlayer;
+class SingleKeyframeEffectAnimation;
 
-// Contains an AnimationTimeline and its AnimationPlayer that owns the impl
+// Contains an AnimationTimeline and its Animation that owns the impl
 // only scroll offset animations running on a particular CC Layer.
-// We have just one player for impl-only scroll offset animations. I.e. only
+// We have just one animation for impl-only scroll offset animations. I.e. only
 // one element can have an impl-only scroll offset animation at any given time.
 // Note that this class only exists on the compositor thread.
 class CC_ANIMATION_EXPORT ScrollOffsetAnimationsImpl
@@ -70,16 +70,15 @@
   }
 
  private:
-  void ReattachScrollOffsetPlayerIfNeeded(ElementId element_id);
+  void ReattachScrollOffsetAnimationIfNeeded(ElementId element_id);
 
   AnimationHost* animation_host_;
   scoped_refptr<AnimationTimeline> scroll_offset_timeline_;
 
-  // We have just one player for impl-only scroll offset animations.
+  // We have just one animation for impl-only scroll offset animations.
   // I.e. only one element can have an impl-only scroll offset animation at
   // any given time.
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer>
-      scroll_offset_animation_player_;
+  scoped_refptr<SingleKeyframeEffectAnimation> scroll_offset_animation_;
 
   DISALLOW_COPY_AND_ASSIGN(ScrollOffsetAnimationsImpl);
 };
diff --git a/cc/animation/single_keyframe_effect_animation.cc b/cc/animation/single_keyframe_effect_animation.cc
new file mode 100644
index 0000000..23b1dc9
--- /dev/null
+++ b/cc/animation/single_keyframe_effect_animation.cc
@@ -0,0 +1,106 @@
+// 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 "cc/animation/single_keyframe_effect_animation.h"
+
+#include <inttypes.h>
+#include <algorithm>
+
+#include "base/stl_util.h"
+#include "base/strings/stringprintf.h"
+#include "cc/animation/animation_delegate.h"
+#include "cc/animation/animation_events.h"
+#include "cc/animation/animation_host.h"
+#include "cc/animation/animation_timeline.h"
+#include "cc/animation/keyframe_effect.h"
+#include "cc/animation/scroll_offset_animation_curve.h"
+#include "cc/animation/transform_operations.h"
+#include "cc/trees/property_animation_state.h"
+
+namespace cc {
+
+scoped_refptr<SingleKeyframeEffectAnimation>
+SingleKeyframeEffectAnimation::Create(int id) {
+  return base::WrapRefCounted(new SingleKeyframeEffectAnimation(id));
+}
+
+SingleKeyframeEffectAnimation::SingleKeyframeEffectAnimation(int id)
+    : Animation(id) {
+  DCHECK(id_);
+  AddKeyframeEffect(base::MakeUnique<KeyframeEffect>(NextKeyframeEffectId()));
+}
+
+SingleKeyframeEffectAnimation::SingleKeyframeEffectAnimation(
+    int id,
+    size_t keyframe_effect_id)
+    : Animation(id) {
+  DCHECK(id_);
+  AddKeyframeEffect(base::MakeUnique<KeyframeEffect>(keyframe_effect_id));
+}
+
+SingleKeyframeEffectAnimation::~SingleKeyframeEffectAnimation() {}
+
+KeyframeEffect* SingleKeyframeEffectAnimation::GetKeyframeEffect() const {
+  DCHECK_EQ(keyframe_effects_.size(), 1u);
+  return keyframe_effects_[0].get();
+}
+
+scoped_refptr<Animation> SingleKeyframeEffectAnimation::CreateImplInstance()
+    const {
+  DCHECK(GetKeyframeEffect());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation = base::WrapRefCounted(
+      new SingleKeyframeEffectAnimation(id(), GetKeyframeEffect()->id()));
+  return animation;
+}
+
+ElementId SingleKeyframeEffectAnimation::element_id() const {
+  return element_id_of_keyframe_effect(GetKeyframeEffect()->id());
+}
+
+void SingleKeyframeEffectAnimation::AttachElement(ElementId element_id) {
+  AttachElementForKeyframeEffect(element_id, GetKeyframeEffect()->id());
+}
+
+KeyframeEffect* SingleKeyframeEffectAnimation::keyframe_effect() const {
+  return GetKeyframeEffect();
+}
+
+void SingleKeyframeEffectAnimation::AddKeyframeModel(
+    std::unique_ptr<KeyframeModel> keyframe_model) {
+  AddKeyframeModelForKeyframeEffect(std::move(keyframe_model),
+                                    GetKeyframeEffect()->id());
+}
+
+void SingleKeyframeEffectAnimation::PauseKeyframeModel(int keyframe_model_id,
+                                                       double time_offset) {
+  PauseKeyframeModelForKeyframeEffect(keyframe_model_id, time_offset,
+                                      GetKeyframeEffect()->id());
+}
+
+void SingleKeyframeEffectAnimation::RemoveKeyframeModel(int keyframe_model_id) {
+  RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                       GetKeyframeEffect()->id());
+}
+
+void SingleKeyframeEffectAnimation::AbortKeyframeModel(int keyframe_model_id) {
+  AbortKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                      GetKeyframeEffect()->id());
+}
+
+bool SingleKeyframeEffectAnimation::NotifyKeyframeModelFinishedForTesting(
+    TargetProperty::Type target_property,
+    int group_id) {
+  AnimationEvent event(AnimationEvent::FINISHED,
+                       GetKeyframeEffect()->element_id(), group_id,
+                       target_property, base::TimeTicks());
+  return GetKeyframeEffect()->NotifyKeyframeModelFinished(event);
+}
+
+KeyframeModel* SingleKeyframeEffectAnimation::GetKeyframeModel(
+    TargetProperty::Type target_property) const {
+  return GetKeyframeModelForKeyframeEffect(target_property,
+                                           GetKeyframeEffect()->id());
+}
+
+}  // namespace cc
diff --git a/cc/animation/single_keyframe_effect_animation.h b/cc/animation/single_keyframe_effect_animation.h
new file mode 100644
index 0000000..c406892
--- /dev/null
+++ b/cc/animation/single_keyframe_effect_animation.h
@@ -0,0 +1,70 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_H_
+#define CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_H_
+
+#include <vector>
+
+#include <memory>
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
+#include "cc/animation/animation.h"
+#include "cc/animation/animation_curve.h"
+#include "cc/animation/animation_export.h"
+#include "cc/animation/element_animations.h"
+#include "cc/animation/keyframe_model.h"
+#include "cc/trees/element_id.h"
+
+namespace cc {
+
+class KeyframeEffect;
+
+// SingleKeyframeEffectAnimation is a sub-class of Animation. It
+// serves as a bridge between the cc animation clients and cc because we
+// previously only supported single effect(keyframe_effect) per animation.
+//
+// There is a 1:1 relationship between SingleKeyframeEffectAnimation and
+// the KeyframeEffect. In general, the base class Animation is a 1:N
+// relationship to allow for grouped animations.
+//
+// TODO(yigu): Deprecate SingleKeyframeEffectAnimation once grouped
+// animations are fully supported by all clients.
+class CC_ANIMATION_EXPORT SingleKeyframeEffectAnimation : public Animation {
+ public:
+  static scoped_refptr<SingleKeyframeEffectAnimation> Create(int id);
+  scoped_refptr<Animation> CreateImplInstance() const override;
+
+  ElementId element_id() const;
+
+  void AttachElement(ElementId element_id);
+
+  KeyframeEffect* keyframe_effect() const;
+  void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model);
+  void PauseKeyframeModel(int keyframe_model_id, double time_offset);
+  void RemoveKeyframeModel(int keyframe_model_id);
+  void AbortKeyframeModel(int keyframe_model_id);
+
+  bool NotifyKeyframeModelFinishedForTesting(
+      TargetProperty::Type target_property,
+      int group_id);
+  KeyframeModel* GetKeyframeModel(TargetProperty::Type target_property) const;
+
+ private:
+  friend class base::RefCounted<SingleKeyframeEffectAnimation>;
+
+  KeyframeEffect* GetKeyframeEffect() const;
+
+ protected:
+  explicit SingleKeyframeEffectAnimation(int id);
+  explicit SingleKeyframeEffectAnimation(int id, size_t keyframe_effect_id);
+  ~SingleKeyframeEffectAnimation() override;
+
+  DISALLOW_COPY_AND_ASSIGN(SingleKeyframeEffectAnimation);
+};
+
+}  // namespace cc
+
+#endif  // CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_H_
diff --git a/cc/animation/single_keyframe_effect_animation_player.cc b/cc/animation/single_keyframe_effect_animation_player.cc
deleted file mode 100644
index 83544f69..0000000
--- a/cc/animation/single_keyframe_effect_animation_player.cc
+++ /dev/null
@@ -1,110 +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 "cc/animation/single_keyframe_effect_animation_player.h"
-
-#include <inttypes.h>
-#include <algorithm>
-
-#include "base/stl_util.h"
-#include "base/strings/stringprintf.h"
-#include "cc/animation/animation_delegate.h"
-#include "cc/animation/animation_events.h"
-#include "cc/animation/animation_host.h"
-#include "cc/animation/animation_timeline.h"
-#include "cc/animation/keyframe_effect.h"
-#include "cc/animation/scroll_offset_animation_curve.h"
-#include "cc/animation/transform_operations.h"
-#include "cc/trees/property_animation_state.h"
-
-namespace cc {
-
-scoped_refptr<SingleKeyframeEffectAnimationPlayer>
-SingleKeyframeEffectAnimationPlayer::Create(int id) {
-  return base::WrapRefCounted(new SingleKeyframeEffectAnimationPlayer(id));
-}
-
-SingleKeyframeEffectAnimationPlayer::SingleKeyframeEffectAnimationPlayer(int id)
-    : AnimationPlayer(id) {
-  DCHECK(id_);
-  AddKeyframeEffect(base::MakeUnique<KeyframeEffect>(NextKeyframeEffectId()));
-}
-
-SingleKeyframeEffectAnimationPlayer::SingleKeyframeEffectAnimationPlayer(
-    int id,
-    size_t keyframe_effect_id)
-    : AnimationPlayer(id) {
-  DCHECK(id_);
-  AddKeyframeEffect(base::MakeUnique<KeyframeEffect>(keyframe_effect_id));
-}
-
-SingleKeyframeEffectAnimationPlayer::~SingleKeyframeEffectAnimationPlayer() {}
-
-KeyframeEffect* SingleKeyframeEffectAnimationPlayer::GetKeyframeEffect() const {
-  DCHECK_EQ(keyframe_effects_.size(), 1u);
-  return keyframe_effects_[0].get();
-}
-
-scoped_refptr<AnimationPlayer>
-SingleKeyframeEffectAnimationPlayer::CreateImplInstance() const {
-  DCHECK(GetKeyframeEffect());
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      base::WrapRefCounted(new SingleKeyframeEffectAnimationPlayer(
-          id(), GetKeyframeEffect()->id()));
-  return player;
-}
-
-ElementId SingleKeyframeEffectAnimationPlayer::element_id() const {
-  return element_id_of_keyframe_effect(GetKeyframeEffect()->id());
-}
-
-void SingleKeyframeEffectAnimationPlayer::AttachElement(ElementId element_id) {
-  AttachElementForKeyframeEffect(element_id, GetKeyframeEffect()->id());
-}
-
-KeyframeEffect* SingleKeyframeEffectAnimationPlayer::keyframe_effect() const {
-  return GetKeyframeEffect();
-}
-
-void SingleKeyframeEffectAnimationPlayer::AddKeyframeModel(
-    std::unique_ptr<KeyframeModel> keyframe_model) {
-  AddKeyframeModelForKeyframeEffect(std::move(keyframe_model),
-                                    GetKeyframeEffect()->id());
-}
-
-void SingleKeyframeEffectAnimationPlayer::PauseKeyframeModel(
-    int keyframe_model_id,
-    double time_offset) {
-  PauseKeyframeModelForKeyframeEffect(keyframe_model_id, time_offset,
-                                      GetKeyframeEffect()->id());
-}
-
-void SingleKeyframeEffectAnimationPlayer::RemoveKeyframeModel(
-    int keyframe_model_id) {
-  RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
-                                       GetKeyframeEffect()->id());
-}
-
-void SingleKeyframeEffectAnimationPlayer::AbortKeyframeModel(
-    int keyframe_model_id) {
-  AbortKeyframeModelForKeyframeEffect(keyframe_model_id,
-                                      GetKeyframeEffect()->id());
-}
-
-bool SingleKeyframeEffectAnimationPlayer::NotifyKeyframeModelFinishedForTesting(
-    TargetProperty::Type target_property,
-    int group_id) {
-  AnimationEvent event(AnimationEvent::FINISHED,
-                       GetKeyframeEffect()->element_id(), group_id,
-                       target_property, base::TimeTicks());
-  return GetKeyframeEffect()->NotifyKeyframeModelFinished(event);
-}
-
-KeyframeModel* SingleKeyframeEffectAnimationPlayer::GetKeyframeModel(
-    TargetProperty::Type target_property) const {
-  return GetKeyframeModelForKeyframeEffect(target_property,
-                                           GetKeyframeEffect()->id());
-}
-
-}  // namespace cc
diff --git a/cc/animation/single_keyframe_effect_animation_player.h b/cc/animation/single_keyframe_effect_animation_player.h
deleted file mode 100644
index acdc743..0000000
--- a/cc/animation/single_keyframe_effect_animation_player.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_PLAYER_H_
-#define CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_PLAYER_H_
-
-#include <vector>
-
-#include <memory>
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/time/time.h"
-#include "cc/animation/animation_curve.h"
-#include "cc/animation/animation_export.h"
-#include "cc/animation/animation_player.h"
-#include "cc/animation/element_animations.h"
-#include "cc/animation/keyframe_model.h"
-#include "cc/trees/element_id.h"
-
-namespace cc {
-
-class KeyframeEffect;
-
-// SingleKeyframeEffectAnimationPlayer is a sub-class of AnimationPlayer. It
-// serves as a bridge between the cc animation clients and cc because we
-// previously only supported single effect(keyframe_effect) per player.
-//
-// There is a 1:1 relationship between SingleKeyframeEffectAnimationPlayer and
-// the KeyframeEffect. In general, the base class AnimationPlayer is a 1:N
-// relationship to allow for grouped animations.
-//
-// TODO(yigu): Deprecate SingleKeyframeEffectAnimationPlayer once grouped
-// animations are fully supported by all clients.
-class CC_ANIMATION_EXPORT SingleKeyframeEffectAnimationPlayer
-    : public AnimationPlayer {
- public:
-  static scoped_refptr<SingleKeyframeEffectAnimationPlayer> Create(int id);
-  scoped_refptr<AnimationPlayer> CreateImplInstance() const override;
-
-  ElementId element_id() const;
-
-  void AttachElement(ElementId element_id);
-
-  KeyframeEffect* keyframe_effect() const;
-  void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model);
-  void PauseKeyframeModel(int keyframe_model_id, double time_offset);
-  void RemoveKeyframeModel(int keyframe_model_id);
-  void AbortKeyframeModel(int keyframe_model_id);
-
-  bool NotifyKeyframeModelFinishedForTesting(
-      TargetProperty::Type target_property,
-      int group_id);
-  KeyframeModel* GetKeyframeModel(TargetProperty::Type target_property) const;
-
- private:
-  friend class base::RefCounted<SingleKeyframeEffectAnimationPlayer>;
-
-  KeyframeEffect* GetKeyframeEffect() const;
-
- protected:
-  explicit SingleKeyframeEffectAnimationPlayer(int id);
-  explicit SingleKeyframeEffectAnimationPlayer(int id,
-                                               size_t keyframe_effect_id);
-  ~SingleKeyframeEffectAnimationPlayer() override;
-
-  DISALLOW_COPY_AND_ASSIGN(SingleKeyframeEffectAnimationPlayer);
-};
-
-}  // namespace cc
-
-#endif  // CC_ANIMATION_SINGLE_KEYFRAME_EFFECT_ANIMATION_PLAYER_H_
diff --git a/cc/animation/worklet_animation.cc b/cc/animation/worklet_animation.cc
new file mode 100644
index 0000000..e62f2a5
--- /dev/null
+++ b/cc/animation/worklet_animation.cc
@@ -0,0 +1,77 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/animation/worklet_animation.h"
+
+#include "base/memory/ptr_util.h"
+#include "cc/animation/scroll_timeline.h"
+
+namespace cc {
+
+WorkletAnimation::WorkletAnimation(
+    int id,
+    const std::string& name,
+    std::unique_ptr<ScrollTimeline> scroll_timeline)
+    : SingleKeyframeEffectAnimation(id),
+      name_(name),
+      scroll_timeline_(std::move(scroll_timeline)) {}
+
+WorkletAnimation::~WorkletAnimation() = default;
+
+scoped_refptr<WorkletAnimation> WorkletAnimation::Create(
+    int id,
+    const std::string& name,
+    std::unique_ptr<ScrollTimeline> scroll_timeline) {
+  return WrapRefCounted(
+      new WorkletAnimation(id, name, std::move(scroll_timeline)));
+}
+
+scoped_refptr<Animation> WorkletAnimation::CreateImplInstance() const {
+  std::unique_ptr<ScrollTimeline> impl_timeline;
+  if (scroll_timeline_)
+    impl_timeline = scroll_timeline_->CreateImplInstance();
+
+  return WrapRefCounted(
+      new WorkletAnimation(id(), name(), std::move(impl_timeline)));
+}
+
+void WorkletAnimation::SetLocalTime(base::TimeDelta local_time) {
+  local_time_ = local_time;
+  SetNeedsPushProperties();
+}
+
+void WorkletAnimation::Tick(base::TimeTicks monotonic_time) {
+  keyframe_effect()->Tick(monotonic_time, this);
+}
+
+// TODO(crbug.com/780151): The current time returned should be an offset against
+// the animation's start time and based on the playback rate, not just the
+// timeline time directly.
+double WorkletAnimation::CurrentTime(base::TimeTicks monotonic_time,
+                                     const ScrollTree& scroll_tree) {
+  if (scroll_timeline_) {
+    return scroll_timeline_->CurrentTime(scroll_tree);
+  }
+
+  // TODO(crbug.com/783333): Support DocumentTimeline's originTime concept.
+  return (monotonic_time - base::TimeTicks()).InMillisecondsF();
+}
+
+base::TimeTicks WorkletAnimation::GetTimeForKeyframeModel(
+    const KeyframeModel& keyframe_model) const {
+  // Animation local time is equivalent to animation active time. So we have to
+  // convert it from active time to monotonic time.
+  return keyframe_model.ConvertFromActiveTime(local_time_);
+}
+
+void WorkletAnimation::PushPropertiesTo(Animation* animation_impl) {
+  SingleKeyframeEffectAnimation::PushPropertiesTo(animation_impl);
+  static_cast<WorkletAnimation*>(animation_impl)->SetLocalTime(local_time_);
+}
+
+bool WorkletAnimation::IsWorkletAnimation() const {
+  return true;
+}
+
+}  // namespace cc
diff --git a/cc/animation/worklet_animation.h b/cc/animation/worklet_animation.h
new file mode 100644
index 0000000..64f434a
--- /dev/null
+++ b/cc/animation/worklet_animation.h
@@ -0,0 +1,72 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_ANIMATION_WORKLET_ANIMATION_H_
+#define CC_ANIMATION_WORKLET_ANIMATION_H_
+
+#include "base/time/time.h"
+#include "cc/animation/animation_export.h"
+#include "cc/animation/keyframe_effect.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
+
+namespace cc {
+
+class ScrollTimeline;
+
+// A WorkletAnimation is an animation that allows its animation
+// timing to be controlled by an animator instance that is running in a
+// AnimationWorkletGlobalScope.
+class CC_ANIMATION_EXPORT WorkletAnimation final
+    : public SingleKeyframeEffectAnimation,
+      KeyframeEffect::AnimationTimeProvider {
+ public:
+  WorkletAnimation(int id,
+                   const std::string& name,
+                   std::unique_ptr<ScrollTimeline> scroll_timeline);
+  static scoped_refptr<WorkletAnimation> Create(
+      int id,
+      const std::string& name,
+      std::unique_ptr<ScrollTimeline> scroll_timeline);
+  scoped_refptr<Animation> CreateImplInstance() const override;
+
+  const std::string& name() const { return name_; }
+  const ScrollTimeline* scroll_timeline() const {
+    return scroll_timeline_.get();
+  }
+
+  void SetLocalTime(base::TimeDelta local_time);
+  bool IsWorkletAnimation() const override;
+
+  void Tick(base::TimeTicks monotonic_time) override;
+
+  // Returns the current time to be passed into the underlying AnimationWorklet.
+  // The current time is based on the timeline associated with the animation.
+  double CurrentTime(base::TimeTicks monotonic_time,
+                     const ScrollTree& scroll_tree);
+
+  // KeyframeEffect::AnimationTimeProvider:
+  base::TimeTicks GetTimeForKeyframeModel(
+      const KeyframeModel& keyframe_model) const override;
+
+  void PushPropertiesTo(Animation* animation_impl) override;
+
+ private:
+  ~WorkletAnimation() override;
+
+  std::string name_;
+
+  // The ScrollTimeline associated with the underlying animation. If null, the
+  // animation is based on a DocumentTimeline.
+  //
+  // TODO(crbug.com/780148): A WorkletAnimation should own an AnimationTimeline
+  // which must exist but can either be a DocumentTimeline, ScrollTimeline, or
+  // some other future implementation.
+  std::unique_ptr<ScrollTimeline> scroll_timeline_;
+
+  base::TimeDelta local_time_;
+};
+
+}  // namespace cc
+
+#endif  // CC_ANIMATION_WORKLET_ANIMATION_H_
diff --git a/cc/animation/worklet_animation_player.cc b/cc/animation/worklet_animation_player.cc
deleted file mode 100644
index b0c8aea20..0000000
--- a/cc/animation/worklet_animation_player.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/animation/worklet_animation_player.h"
-
-#include "base/memory/ptr_util.h"
-#include "cc/animation/scroll_timeline.h"
-
-namespace cc {
-
-WorkletAnimationPlayer::WorkletAnimationPlayer(
-    int id,
-    const std::string& name,
-    std::unique_ptr<ScrollTimeline> scroll_timeline)
-    : SingleKeyframeEffectAnimationPlayer(id),
-      name_(name),
-      scroll_timeline_(std::move(scroll_timeline)) {}
-
-WorkletAnimationPlayer::~WorkletAnimationPlayer() = default;
-
-scoped_refptr<WorkletAnimationPlayer> WorkletAnimationPlayer::Create(
-    int id,
-    const std::string& name,
-    std::unique_ptr<ScrollTimeline> scroll_timeline) {
-  return WrapRefCounted(
-      new WorkletAnimationPlayer(id, name, std::move(scroll_timeline)));
-}
-
-scoped_refptr<AnimationPlayer> WorkletAnimationPlayer::CreateImplInstance()
-    const {
-  std::unique_ptr<ScrollTimeline> impl_timeline;
-  if (scroll_timeline_)
-    impl_timeline = scroll_timeline_->CreateImplInstance();
-
-  return WrapRefCounted(
-      new WorkletAnimationPlayer(id(), name(), std::move(impl_timeline)));
-}
-
-void WorkletAnimationPlayer::SetLocalTime(base::TimeDelta local_time) {
-  local_time_ = local_time;
-  SetNeedsPushProperties();
-}
-
-void WorkletAnimationPlayer::Tick(base::TimeTicks monotonic_time) {
-  keyframe_effect()->Tick(monotonic_time, this);
-}
-
-// TODO(crbug.com/780151): The current time returned should be an offset against
-// the animation's start time and based on the playback rate, not just the
-// timeline time directly.
-double WorkletAnimationPlayer::CurrentTime(base::TimeTicks monotonic_time,
-                                           const ScrollTree& scroll_tree) {
-  if (scroll_timeline_) {
-    return scroll_timeline_->CurrentTime(scroll_tree);
-  }
-
-  // TODO(crbug.com/783333): Support DocumentTimeline's originTime concept.
-  return (monotonic_time - base::TimeTicks()).InMillisecondsF();
-}
-
-base::TimeTicks WorkletAnimationPlayer::GetTimeForKeyframeModel(
-    const KeyframeModel& keyframe_model) const {
-  // Animation player local time is equivalent to animation active time. So
-  // we have to convert it from active time to monotonic time.
-  return keyframe_model.ConvertFromActiveTime(local_time_);
-}
-
-void WorkletAnimationPlayer::PushPropertiesTo(
-    AnimationPlayer* animation_player_impl) {
-  SingleKeyframeEffectAnimationPlayer::PushPropertiesTo(animation_player_impl);
-  static_cast<WorkletAnimationPlayer*>(animation_player_impl)
-      ->SetLocalTime(local_time_);
-}
-
-bool WorkletAnimationPlayer::IsWorkletAnimationPlayer() const {
-  return true;
-}
-
-}  // namespace cc
diff --git a/cc/animation/worklet_animation_player.h b/cc/animation/worklet_animation_player.h
deleted file mode 100644
index 7e6908ff..0000000
--- a/cc/animation/worklet_animation_player.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_ANIMATION_WORKLET_ANIMATION_PLAYER_H_
-#define CC_ANIMATION_WORKLET_ANIMATION_PLAYER_H_
-
-#include "base/time/time.h"
-#include "cc/animation/animation_export.h"
-#include "cc/animation/keyframe_effect.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
-
-namespace cc {
-
-class ScrollTimeline;
-
-// A WorkletAnimationPlayer is an animations player that allows its animation
-// timing to be controlled by an animator instance that is running in a
-// AnimationWorkletGlobalScope.
-class CC_ANIMATION_EXPORT WorkletAnimationPlayer final
-    : public SingleKeyframeEffectAnimationPlayer,
-      KeyframeEffect::AnimationTimeProvider {
- public:
-  WorkletAnimationPlayer(int id,
-                         const std::string& name,
-                         std::unique_ptr<ScrollTimeline> scroll_timeline);
-  static scoped_refptr<WorkletAnimationPlayer> Create(
-      int id,
-      const std::string& name,
-      std::unique_ptr<ScrollTimeline> scroll_timeline);
-  scoped_refptr<AnimationPlayer> CreateImplInstance() const override;
-
-  const std::string& name() const { return name_; }
-  const ScrollTimeline* scroll_timeline() const {
-    return scroll_timeline_.get();
-  }
-
-  void SetLocalTime(base::TimeDelta local_time);
-  bool IsWorkletAnimationPlayer() const override;
-
-  void Tick(base::TimeTicks monotonic_time) override;
-
-  // Returns the current time to be passed into the underlying AnimationWorklet.
-  // The current time is based on the timeline associated with the animation.
-  double CurrentTime(base::TimeTicks monotonic_time,
-                     const ScrollTree& scroll_tree);
-
-  // KeyframeEffect::AnimationTimeProvider:
-  base::TimeTicks GetTimeForKeyframeModel(
-      const KeyframeModel& keyframe_model) const override;
-
-  void PushPropertiesTo(AnimationPlayer* animation_player_impl) override;
-
- private:
-  ~WorkletAnimationPlayer() override;
-
-  std::string name_;
-
-  // The ScrollTimeline associated with the underlying animation. If null, the
-  // animation is based on a DocumentTimeline.
-  //
-  // TODO(crbug.com/780148): A WorkletAnimationPlayer should own an
-  // AnimationTimeline which must exist but can either be a DocumentTimeline,
-  // ScrollTimeline, or some other future implementation.
-  std::unique_ptr<ScrollTimeline> scroll_timeline_;
-
-  base::TimeDelta local_time_;
-};
-
-}  // namespace cc
-
-#endif  // CC_ANIMATION_WORKLET_ANIMATION_PLAYER_H_
diff --git a/cc/animation/worklet_animation_player_unittest.cc b/cc/animation/worklet_animation_unittest.cc
similarity index 66%
rename from cc/animation/worklet_animation_player_unittest.cc
rename to cc/animation/worklet_animation_unittest.cc
index 70daefa3..dca0568 100644
--- a/cc/animation/worklet_animation_player_unittest.cc
+++ b/cc/animation/worklet_animation_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 "cc/animation/worklet_animation_player.h"
+#include "cc/animation/worklet_animation.h"
 
 #include "cc/animation/scroll_timeline.h"
 #include "cc/test/animation_test_common.h"
@@ -19,12 +19,12 @@
 
 namespace {
 
-class WorkletAnimationPlayerTest : public AnimationTimelinesTest {
+class WorkletAnimationTest : public AnimationTimelinesTest {
  public:
-  WorkletAnimationPlayerTest() = default;
-  ~WorkletAnimationPlayerTest() override = default;
+  WorkletAnimationTest() = default;
+  ~WorkletAnimationTest() override = default;
 
-  int worklet_player_id_ = 11;
+  int worklet_animation_id_ = 11;
 };
 
 class MockScrollTimeline : public ScrollTimeline {
@@ -34,7 +34,7 @@
   MOCK_CONST_METHOD1(CurrentTime, double(const ScrollTree&));
 };
 
-TEST_F(WorkletAnimationPlayerTest, LocalTimeIsUsedWithAnimations) {
+TEST_F(WorkletAnimationTest, LocalTimeIsUsedWithAnimations) {
   client_.RegisterElement(element_id_, ElementListType::ACTIVE);
   client_impl_.RegisterElement(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElement(element_id_, ElementListType::ACTIVE);
@@ -46,20 +46,20 @@
   const float expected_opacity =
       start_opacity + (end_opacity - start_opacity) / 2;
 
-  scoped_refptr<WorkletAnimationPlayer> worklet_player_ =
-      WorkletAnimationPlayer::Create(worklet_player_id_, "test_name", nullptr);
+  scoped_refptr<WorkletAnimation> worklet_animation_ =
+      WorkletAnimation::Create(worklet_animation_id_, "test_name", nullptr);
 
-  worklet_player_->AttachElement(element_id_);
+  worklet_animation_->AttachElement(element_id_);
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(worklet_player_);
+  timeline_->AttachAnimation(worklet_animation_);
 
-  AddOpacityTransitionToPlayer(worklet_player_.get(), duration, start_opacity,
-                               end_opacity, true);
+  AddOpacityTransitionToAnimation(worklet_animation_.get(), duration,
+                                  start_opacity, end_opacity, true);
 
   host_->PushPropertiesTo(host_impl_);
   host_impl_->ActivateAnimations();
 
-  // TODO(majidvp): At the moment the player does not use the local time when
+  // TODO(majidvp): At the moment the animation does not use the local time when
   // it is starting. This is because KeyframeModel::ConvertToActiveTime always
   // returns the time_offset when starting. We need to change this.
   base::TimeTicks time;
@@ -67,7 +67,7 @@
   TickAnimationsTransferEvents(time, 1u);
 
   base::TimeDelta local_time = base::TimeDelta::FromSecondsD(duration / 2);
-  worklet_player_->SetLocalTime(local_time);
+  worklet_animation_->SetLocalTime(local_time);
 
   host_->PushPropertiesTo(host_impl_);
 
@@ -82,8 +82,7 @@
 
 // Tests that verify interaction of AnimationHost with LayerTreeMutator.
 // TODO(majidvp): Perhaps moves these to AnimationHostTest.
-TEST_F(WorkletAnimationPlayerTest,
-       LayerTreeMutatorsIsMutatedWithCorrectInputState) {
+TEST_F(WorkletAnimationTest, LayerTreeMutatorsIsMutatedWithCorrectInputState) {
   MockLayerTreeMutator* mock_mutator = new MockLayerTreeMutator();
   host_impl_->SetLayerTreeMutator(
       base::WrapUnique<LayerTreeMutator>(mock_mutator));
@@ -97,15 +96,15 @@
   const float end_opacity = .3f;
   const double duration = 1.;
 
-  scoped_refptr<WorkletAnimationPlayer> worklet_player_ =
-      WorkletAnimationPlayer::Create(worklet_player_id_, "test_name", nullptr);
+  scoped_refptr<WorkletAnimation> worklet_animation_ =
+      WorkletAnimation::Create(worklet_animation_id_, "test_name", nullptr);
 
-  worklet_player_->AttachElement(element_id_);
+  worklet_animation_->AttachElement(element_id_);
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(worklet_player_);
+  timeline_->AttachAnimation(worklet_animation_);
 
-  AddOpacityTransitionToPlayer(worklet_player_.get(), duration, start_opacity,
-                               end_opacity, true);
+  AddOpacityTransitionToAnimation(worklet_animation_.get(), duration,
+                                  start_opacity, end_opacity, true);
 
   host_->PushPropertiesTo(host_impl_);
   host_impl_->ActivateAnimations();
@@ -119,16 +118,15 @@
   Mock::VerifyAndClearExpectations(mock_mutator);
 }
 
-TEST_F(WorkletAnimationPlayerTest, CurrentTimeCorrectlyUsesScrolltimeline) {
+TEST_F(WorkletAnimationTest, CurrentTimeCorrectlyUsesScrolltimeline) {
   auto scroll_timeline = std::make_unique<MockScrollTimeline>();
   EXPECT_CALL(*scroll_timeline, CurrentTime(_)).WillOnce(Return(1234));
-  scoped_refptr<WorkletAnimationPlayer> worklet_player =
-      WorkletAnimationPlayer::Create(worklet_player_id_, "test_name",
-                                     std::move(scroll_timeline));
+  scoped_refptr<WorkletAnimation> worklet_animation = WorkletAnimation::Create(
+      worklet_animation_id_, "test_name", std::move(scroll_timeline));
 
   ScrollTree scroll_tree;
-  EXPECT_EQ(1234,
-            worklet_player->CurrentTime(base::TimeTicks::Now(), scroll_tree));
+  EXPECT_EQ(1234, worklet_animation->CurrentTime(base::TimeTicks::Now(),
+                                                 scroll_tree));
 }
 
 }  // namespace
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
index 09e2eab9..53e5874 100644
--- a/cc/layers/layer_unittest.cc
+++ b/cc/layers/layer_unittest.cc
@@ -1476,8 +1476,8 @@
       AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
   animation_host_->AddAnimationTimeline(timeline);
 
-  AddOpacityTransitionToElementWithPlayer(element_id, timeline, 10.0, 1.f, 0.f,
-                                          false);
+  AddOpacityTransitionToElementWithAnimation(element_id, timeline, 10.0, 1.f,
+                                             0.f, false);
   EXPECT_TRUE(animation_host_->IsElementAnimating(element_id));
 
   EXPECT_EQ(nullptr, layer_tree_host_->LayerByElementId(element_id));
@@ -1532,8 +1532,8 @@
       AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
   animation_host_->AddAnimationTimeline(timeline);
 
-  AddOpacityTransitionToElementWithPlayer(element_id, timeline, 10.0, 1.f, 0.f,
-                                          false);
+  AddOpacityTransitionToElementWithAnimation(element_id, timeline, 10.0, 1.f,
+                                             0.f, false);
   EXPECT_TRUE(animation_host_->IsElementAnimating(element_id));
 
   EXPECT_EQ(nullptr, layer_tree_host_->LayerByElementId(element_id));
diff --git a/cc/test/animation_test_common.cc b/cc/test/animation_test_common.cc
index fbcb098..bfd4504 100644
--- a/cc/test/animation_test_common.cc
+++ b/cc/test/animation_test_common.cc
@@ -11,7 +11,7 @@
 #include "cc/animation/keyframe_effect.h"
 #include "cc/animation/keyframed_animation_curve.h"
 #include "cc/animation/scroll_offset_animation_curve.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/timing_function.h"
 #include "cc/animation/transform_operations.h"
 #include "cc/base/time_util.h"
@@ -28,7 +28,7 @@
 
 namespace cc {
 
-int AddOpacityTransition(SingleKeyframeEffectAnimationPlayer* target,
+int AddOpacityTransition(SingleKeyframeEffectAnimation* target,
                          double duration,
                          float start_opacity,
                          float end_opacity,
@@ -58,7 +58,7 @@
   return id;
 }
 
-int AddAnimatedTransform(SingleKeyframeEffectAnimationPlayer* target,
+int AddAnimatedTransform(SingleKeyframeEffectAnimation* target,
                          double duration,
                          TransformOperations start_operations,
                          TransformOperations operations) {
@@ -85,7 +85,7 @@
   return id;
 }
 
-int AddAnimatedTransform(SingleKeyframeEffectAnimationPlayer* target,
+int AddAnimatedTransform(SingleKeyframeEffectAnimation* target,
                          double duration,
                          int delta_x,
                          int delta_y) {
@@ -99,7 +99,7 @@
   return AddAnimatedTransform(target, duration, start_operations, operations);
 }
 
-int AddAnimatedFilter(SingleKeyframeEffectAnimationPlayer* target,
+int AddAnimatedFilter(SingleKeyframeEffectAnimation* target,
                       double duration,
                       float start_brightness,
                       float end_brightness) {
@@ -216,8 +216,8 @@
   return base::WrapUnique(new FakeFloatTransition(*this));
 }
 
-int AddScrollOffsetAnimationToPlayer(
-    SingleKeyframeEffectAnimationPlayer* player,
+int AddScrollOffsetAnimationToAnimation(
+    SingleKeyframeEffectAnimation* animation,
     gfx::ScrollOffset initial_value,
     gfx::ScrollOffset target_value) {
   std::unique_ptr<ScrollOffsetAnimationCurve> curve(
@@ -233,47 +233,49 @@
       TargetProperty::SCROLL_OFFSET));
   keyframe_model->SetIsImplOnly();
 
-  player->AddKeyframeModelForKeyframeEffect(std::move(keyframe_model),
-                                            player->keyframe_effect()->id());
+  animation->AddKeyframeModelForKeyframeEffect(
+      std::move(keyframe_model), animation->keyframe_effect()->id());
 
   return id;
 }
 
-int AddAnimatedTransformToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                                 double duration,
-                                 int delta_x,
-                                 int delta_y) {
-  return AddAnimatedTransform(player, duration, delta_x, delta_y);
+int AddAnimatedTransformToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    int delta_x,
+                                    int delta_y) {
+  return AddAnimatedTransform(animation, duration, delta_x, delta_y);
 }
 
-int AddAnimatedTransformToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                                 double duration,
-                                 TransformOperations start_operations,
-                                 TransformOperations operations) {
-  return AddAnimatedTransform(player, duration, start_operations, operations);
+int AddAnimatedTransformToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    TransformOperations start_operations,
+                                    TransformOperations operations) {
+  return AddAnimatedTransform(animation, duration, start_operations,
+                              operations);
 }
 
-int AddOpacityTransitionToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                                 double duration,
-                                 float start_opacity,
-                                 float end_opacity,
-                                 bool use_timing_function) {
-  return AddOpacityTransition(player, duration, start_opacity, end_opacity,
+int AddOpacityTransitionToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    float start_opacity,
+                                    float end_opacity,
+                                    bool use_timing_function) {
+  return AddOpacityTransition(animation, duration, start_opacity, end_opacity,
                               use_timing_function);
 }
 
-int AddAnimatedFilterToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                              double duration,
-                              float start_brightness,
-                              float end_brightness) {
-  return AddAnimatedFilter(player, duration, start_brightness, end_brightness);
+int AddAnimatedFilterToAnimation(SingleKeyframeEffectAnimation* animation,
+                                 double duration,
+                                 float start_brightness,
+                                 float end_brightness) {
+  return AddAnimatedFilter(animation, duration, start_brightness,
+                           end_brightness);
 }
 
-int AddOpacityStepsToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                            double duration,
-                            float start_opacity,
-                            float end_opacity,
-                            int num_steps) {
+int AddOpacityStepsToAnimation(SingleKeyframeEffectAnimation* animation,
+                               double duration,
+                               float start_opacity,
+                               float end_opacity,
+                               int num_steps) {
   std::unique_ptr<KeyframedFloatAnimationCurve> curve(
       KeyframedFloatAnimationCurve::Create());
 
@@ -292,22 +294,22 @@
       TargetProperty::OPACITY));
   keyframe_model->set_needs_synchronized_start_time(true);
 
-  player->AddKeyframeModelForKeyframeEffect(std::move(keyframe_model),
-                                            player->keyframe_effect()->id());
+  animation->AddKeyframeModelForKeyframeEffect(
+      std::move(keyframe_model), animation->keyframe_effect()->id());
   return id;
 }
 
-void AddKeyframeModelToElementWithPlayer(
+void AddKeyframeModelToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     std::unique_ptr<KeyframeModel> keyframe_model) {
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(player);
-  player->AttachElement(element_id);
-  DCHECK(player->keyframe_effect()->element_animations());
-  player->AddKeyframeModel(std::move(keyframe_model));
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(animation);
+  animation->AttachElement(element_id);
+  DCHECK(animation->keyframe_effect()->element_animations());
+  animation->AddKeyframeModel(std::move(keyframe_model));
 }
 
 void AddKeyframeModelToElementWithExistingKeyframeEffect(
@@ -352,68 +354,70 @@
   return keyframe_effect->GetKeyframeModelById(keyframe_model_id);
 }
 
-int AddAnimatedFilterToElementWithPlayer(
+int AddAnimatedFilterToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     float start_brightness,
     float end_brightness) {
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(player);
-  player->AttachElement(element_id);
-  DCHECK(player->keyframe_effect()->element_animations());
-  return AddAnimatedFilterToPlayer(player.get(), duration, start_brightness,
-                                   end_brightness);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(animation);
+  animation->AttachElement(element_id);
+  DCHECK(animation->keyframe_effect()->element_animations());
+  return AddAnimatedFilterToAnimation(animation.get(), duration,
+                                      start_brightness, end_brightness);
 }
 
-int AddAnimatedTransformToElementWithPlayer(
+int AddAnimatedTransformToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     int delta_x,
     int delta_y) {
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(player);
-  player->AttachElement(element_id);
-  DCHECK(player->keyframe_effect()->element_animations());
-  return AddAnimatedTransformToPlayer(player.get(), duration, delta_x, delta_y);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(animation);
+  animation->AttachElement(element_id);
+  DCHECK(animation->keyframe_effect()->element_animations());
+  return AddAnimatedTransformToAnimation(animation.get(), duration, delta_x,
+                                         delta_y);
 }
 
-int AddAnimatedTransformToElementWithPlayer(
+int AddAnimatedTransformToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     TransformOperations start_operations,
     TransformOperations operations) {
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(player);
-  player->AttachElement(element_id);
-  DCHECK(player->keyframe_effect()->element_animations());
-  return AddAnimatedTransformToPlayer(player.get(), duration, start_operations,
-                                      operations);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(animation);
+  animation->AttachElement(element_id);
+  DCHECK(animation->keyframe_effect()->element_animations());
+  return AddAnimatedTransformToAnimation(animation.get(), duration,
+                                         start_operations, operations);
 }
 
-int AddOpacityTransitionToElementWithPlayer(
+int AddOpacityTransitionToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     float start_opacity,
     float end_opacity,
     bool use_timing_function) {
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(player);
-  player->AttachElement(element_id);
-  DCHECK(player->keyframe_effect()->element_animations());
-  return AddOpacityTransitionToPlayer(player.get(), duration, start_opacity,
-                                      end_opacity, use_timing_function);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(animation);
+  animation->AttachElement(element_id);
+  DCHECK(animation->keyframe_effect()->element_animations());
+  return AddOpacityTransitionToAnimation(animation.get(), duration,
+                                         start_opacity, end_opacity,
+                                         use_timing_function);
 }
 
 }  // namespace cc
diff --git a/cc/test/animation_test_common.h b/cc/test/animation_test_common.h
index d6322e3..b1525e2 100644
--- a/cc/test/animation_test_common.h
+++ b/cc/test/animation_test_common.h
@@ -19,7 +19,7 @@
 
 namespace cc {
 
-class SingleKeyframeEffectAnimationPlayer;
+class SingleKeyframeEffectAnimation;
 
 class FakeFloatAnimationCurve : public FloatAnimationCurve {
  public:
@@ -73,39 +73,39 @@
   float to_;
 };
 
-int AddScrollOffsetAnimationToPlayer(
-    SingleKeyframeEffectAnimationPlayer* player,
+int AddScrollOffsetAnimationToAnimation(
+    SingleKeyframeEffectAnimation* animation,
     gfx::ScrollOffset initial_value,
     gfx::ScrollOffset target_value);
 
-int AddAnimatedTransformToPlayer(SingleKeyframeEffectAnimationPlayer* player,
+int AddAnimatedTransformToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    int delta_x,
+                                    int delta_y);
+
+int AddAnimatedTransformToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    TransformOperations start_operations,
+                                    TransformOperations operations);
+
+int AddOpacityTransitionToAnimation(SingleKeyframeEffectAnimation* animation,
+                                    double duration,
+                                    float start_opacity,
+                                    float end_opacity,
+                                    bool use_timing_function);
+
+int AddAnimatedFilterToAnimation(SingleKeyframeEffectAnimation* animation,
                                  double duration,
-                                 int delta_x,
-                                 int delta_y);
+                                 float start_brightness,
+                                 float end_brightness);
 
-int AddAnimatedTransformToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                                 double duration,
-                                 TransformOperations start_operations,
-                                 TransformOperations operations);
+int AddOpacityStepsToAnimation(SingleKeyframeEffectAnimation* animation,
+                               double duration,
+                               float start_opacity,
+                               float end_opacity,
+                               int num_steps);
 
-int AddOpacityTransitionToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                                 double duration,
-                                 float start_opacity,
-                                 float end_opacity,
-                                 bool use_timing_function);
-
-int AddAnimatedFilterToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                              double duration,
-                              float start_brightness,
-                              float end_brightness);
-
-int AddOpacityStepsToPlayer(SingleKeyframeEffectAnimationPlayer* player,
-                            double duration,
-                            float start_opacity,
-                            float end_opacity,
-                            int num_steps);
-
-void AddKeyframeModelToElementWithPlayer(
+void AddKeyframeModelToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     std::unique_ptr<KeyframeModel> keyframe_model);
@@ -124,28 +124,28 @@
     scoped_refptr<AnimationTimeline> timeline,
     int keyframe_model_id);
 
-int AddAnimatedFilterToElementWithPlayer(
+int AddAnimatedFilterToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     float start_brightness,
     float end_brightness);
 
-int AddAnimatedTransformToElementWithPlayer(
+int AddAnimatedTransformToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     int delta_x,
     int delta_y);
 
-int AddAnimatedTransformToElementWithPlayer(
+int AddAnimatedTransformToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
     TransformOperations start_operations,
     TransformOperations operations);
 
-int AddOpacityTransitionToElementWithPlayer(
+int AddOpacityTransitionToElementWithAnimation(
     ElementId element_id,
     scoped_refptr<AnimationTimeline> timeline,
     double duration,
diff --git a/cc/test/animation_timelines_test_common.cc b/cc/test/animation_timelines_test_common.cc
index 9d63007..cc2c8c16 100644
--- a/cc/test/animation_timelines_test_common.cc
+++ b/cc/test/animation_timelines_test_common.cc
@@ -10,7 +10,7 @@
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/element_animations.h"
 #include "cc/animation/keyframe_effect.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/paint/filter_operation.h"
 #include "cc/paint/filter_operations.h"
 #include "cc/trees/property_tree.h"
@@ -352,7 +352,7 @@
       host_(nullptr),
       host_impl_(nullptr),
       timeline_id_(AnimationIdProvider::NextTimelineId()),
-      player_id_(AnimationIdProvider::NextPlayerId()),
+      animation_id_(AnimationIdProvider::NextAnimationId()),
       next_test_layer_id_(0) {
   host_ = client_.host();
   host_impl_ = client_impl_.host();
@@ -395,34 +395,34 @@
   client_impl_.RegisterElement(element_id_, element_list_type);
 }
 
-void AnimationTimelinesTest::AttachTimelinePlayerLayer() {
+void AnimationTimelinesTest::AttachTimelineAnimationLayer() {
   host_->AddAnimationTimeline(timeline_);
-  timeline_->AttachPlayer(player_);
-  player_->AttachElement(element_id_);
+  timeline_->AttachAnimation(animation_);
+  animation_->AttachElement(element_id_);
 
-  element_animations_ = player_->keyframe_effect()->element_animations();
+  element_animations_ = animation_->keyframe_effect()->element_animations();
 }
 
-void AnimationTimelinesTest::CreateImplTimelineAndPlayer() {
+void AnimationTimelinesTest::CreateImplTimelineAndAnimation() {
   host_->PushPropertiesTo(host_impl_);
-  GetImplTimelineAndPlayerByID();
+  GetImplTimelineAndAnimationByID();
 }
 
-void AnimationTimelinesTest::GetImplTimelineAndPlayerByID() {
+void AnimationTimelinesTest::GetImplTimelineAndAnimationByID() {
   timeline_impl_ = host_impl_->GetTimelineById(timeline_id_);
   EXPECT_TRUE(timeline_impl_);
-  player_impl_ = static_cast<SingleKeyframeEffectAnimationPlayer*>(
-      timeline_impl_->GetPlayerById(player_id_));
-  EXPECT_TRUE(player_impl_);
+  animation_impl_ = static_cast<SingleKeyframeEffectAnimation*>(
+      timeline_impl_->GetAnimationById(animation_id_));
+  EXPECT_TRUE(animation_impl_);
 
   element_animations_impl_ =
-      player_impl_->keyframe_effect()->element_animations();
+      animation_impl_->keyframe_effect()->element_animations();
 }
 
 void AnimationTimelinesTest::ReleaseRefPtrs() {
-  player_ = nullptr;
+  animation_ = nullptr;
   timeline_ = nullptr;
-  player_impl_ = nullptr;
+  animation_impl_ = nullptr;
   timeline_impl_ = nullptr;
 }
 
@@ -469,12 +469,12 @@
 
 bool AnimationTimelinesTest::CheckKeyframeEffectTimelineNeedsPushProperties(
     bool needs_push_properties) const {
-  DCHECK(player_);
+  DCHECK(animation_);
   DCHECK(timeline_);
 
   bool result = true;
 
-  KeyframeEffect* keyframe_effect = player_->keyframe_effect();
+  KeyframeEffect* keyframe_effect = animation_->keyframe_effect();
   if (keyframe_effect->needs_push_properties() != needs_push_properties) {
     ADD_FAILURE() << "keyframe_effect->needs_push_properties() expected to be "
                   << needs_push_properties;
diff --git a/cc/test/animation_timelines_test_common.h b/cc/test/animation_timelines_test_common.h
index 0a58d58..ff76f1d 100644
--- a/cc/test/animation_timelines_test_common.h
+++ b/cc/test/animation_timelines_test_common.h
@@ -19,7 +19,7 @@
 namespace cc {
 
 class KeyframeEffect;
-class SingleKeyframeEffectAnimationPlayer;
+class SingleKeyframeEffectAnimation;
 
 class TestLayer {
  public:
@@ -236,12 +236,12 @@
   void SetUp() override;
   void TearDown() override;
 
-  void GetImplTimelineAndPlayerByID();
+  void GetImplTimelineAndAnimationByID();
 
   void CreateTestLayer(bool needs_active_value_observations,
                        bool needs_pending_value_observations);
-  void AttachTimelinePlayerLayer();
-  virtual void CreateImplTimelineAndPlayer();
+  void AttachTimelineAnimationLayer();
+  virtual void CreateImplTimelineAndAnimation();
 
   void CreateTestMainLayer();
   void DestroyTestMainLayer();
@@ -269,17 +269,17 @@
   AnimationHost* host_impl_;
 
   const int timeline_id_;
-  const int player_id_;
+  const int animation_id_;
   ElementId element_id_;
 
   int next_test_layer_id_;
 
   scoped_refptr<AnimationTimeline> timeline_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_;
   scoped_refptr<ElementAnimations> element_animations_;
 
   scoped_refptr<AnimationTimeline> timeline_impl_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_impl_;
   scoped_refptr<ElementAnimations> element_animations_impl_;
 };
 
diff --git a/cc/test/layer_test_common.cc b/cc/test/layer_test_common.cc
index 83f23f8..c705f25 100644
--- a/cc/test/layer_test_common.cc
+++ b/cc/test/layer_test_common.cc
@@ -6,9 +6,9 @@
 
 #include <stddef.h>
 
+#include "cc/animation/animation.h"
 #include "cc/animation/animation_host.h"
 #include "cc/animation/animation_id_provider.h"
-#include "cc/animation/animation_player.h"
 #include "cc/base/math_util.h"
 #include "cc/base/region.h"
 #include "cc/layers/append_quads_data.h"
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 94b0496..63b8263a 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -13,7 +13,7 @@
 #include "cc/animation/animation_host.h"
 #include "cc/animation/keyframe_effect.h"
 #include "cc/animation/keyframe_model.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/timing_function.h"
 #include "cc/base/switches.h"
 #include "cc/input/input_handler.h"
@@ -342,7 +342,7 @@
   void UpdateAnimationState(bool start_ready_animations) override {
     LayerTreeHostImpl::UpdateAnimationState(start_ready_animations);
     bool has_unfinished_animation = false;
-    for (const auto& it : animation_host()->ticking_players_for_testing()) {
+    for (const auto& it : animation_host()->ticking_animations_for_testing()) {
       if (it.get()->TickingKeyframeModelsCount()) {
         has_unfinished_animation = true;
         break;
@@ -642,31 +642,31 @@
       base::TimeDelta::FromMilliseconds(delay_milliseconds));
 }
 
-void LayerTreeTest::PostAddAnimationToMainThreadPlayer(
-    SingleKeyframeEffectAnimationPlayer* player_to_receive_animation) {
+void LayerTreeTest::PostAddOpacityAnimationToMainThread(
+    SingleKeyframeEffectAnimation* animation_to_receive_animation) {
   main_task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&LayerTreeTest::DispatchAddAnimationToPlayer,
-                     main_thread_weak_ptr_,
-                     base::Unretained(player_to_receive_animation), 0.000004));
+      base::BindOnce(
+          &LayerTreeTest::DispatchAddOpacityAnimation, main_thread_weak_ptr_,
+          base::Unretained(animation_to_receive_animation), 0.000004));
 }
 
-void LayerTreeTest::PostAddInstantAnimationToMainThreadPlayer(
-    SingleKeyframeEffectAnimationPlayer* player_to_receive_animation) {
+void LayerTreeTest::PostAddOpacityAnimationToMainThreadInstantly(
+    SingleKeyframeEffectAnimation* animation_to_receive_animation) {
   main_task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&LayerTreeTest::DispatchAddAnimationToPlayer,
+      base::BindOnce(&LayerTreeTest::DispatchAddOpacityAnimation,
                      main_thread_weak_ptr_,
-                     base::Unretained(player_to_receive_animation), 0.0));
+                     base::Unretained(animation_to_receive_animation), 0.0));
 }
 
-void LayerTreeTest::PostAddLongAnimationToMainThreadPlayer(
-    SingleKeyframeEffectAnimationPlayer* player_to_receive_animation) {
+void LayerTreeTest::PostAddOpacityAnimationToMainThreadDelayed(
+    SingleKeyframeEffectAnimation* animation_to_receive_animation) {
   main_task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&LayerTreeTest::DispatchAddAnimationToPlayer,
+      base::BindOnce(&LayerTreeTest::DispatchAddOpacityAnimation,
                      main_thread_weak_ptr_,
-                     base::Unretained(player_to_receive_animation), 1.0));
+                     base::Unretained(animation_to_receive_animation), 1.0));
 }
 
 void LayerTreeTest::PostSetLocalSurfaceIdToMainThread(
@@ -835,14 +835,14 @@
   base::RunLoop::QuitCurrentWhenIdleDeprecated();
 }
 
-void LayerTreeTest::DispatchAddAnimationToPlayer(
-    SingleKeyframeEffectAnimationPlayer* player_to_receive_animation,
+void LayerTreeTest::DispatchAddOpacityAnimation(
+    SingleKeyframeEffectAnimation* animation_to_receive_animation,
     double animation_duration) {
   DCHECK(main_task_runner_->BelongsToCurrentThread());
 
-  if (player_to_receive_animation) {
-    AddOpacityTransitionToPlayer(player_to_receive_animation,
-                                 animation_duration, 0, 0.5, true);
+  if (animation_to_receive_animation) {
+    AddOpacityTransitionToAnimation(animation_to_receive_animation,
+                                    animation_duration, 0, 0.5, true);
   }
 }
 
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index a59a1316..176a7cb3 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -29,7 +29,7 @@
 class LayerTreeHostForTesting;
 class LayerTreeTestLayerTreeFrameSinkClient;
 class Proxy;
-class SingleKeyframeEffectAnimationPlayer;
+class SingleKeyframeEffectAnimation;
 class TestContextProvider;
 class TestTaskGraphRunner;
 
@@ -72,12 +72,12 @@
   virtual void EndTest();
   void EndTestAfterDelayMs(int delay_milliseconds);
 
-  void PostAddAnimationToMainThreadPlayer(
-      SingleKeyframeEffectAnimationPlayer* player_to_receive_animation);
-  void PostAddInstantAnimationToMainThreadPlayer(
-      SingleKeyframeEffectAnimationPlayer* player_to_receive_animation);
-  void PostAddLongAnimationToMainThreadPlayer(
-      SingleKeyframeEffectAnimationPlayer* player_to_receive_animation);
+  void PostAddOpacityAnimationToMainThread(
+      SingleKeyframeEffectAnimation* animation_to_receive_animation);
+  void PostAddOpacityAnimationToMainThreadInstantly(
+      SingleKeyframeEffectAnimation* animation_to_receive_animation);
+  void PostAddOpacityAnimationToMainThreadDelayed(
+      SingleKeyframeEffectAnimation* animation_to_receive_animation);
   void PostSetLocalSurfaceIdToMainThread(
       const viz::LocalSurfaceId& local_surface_id);
   void PostSetDeferCommitsToMainThread(bool defer_commits);
@@ -166,8 +166,8 @@
   }
 
  private:
-  virtual void DispatchAddAnimationToPlayer(
-      SingleKeyframeEffectAnimationPlayer* player_to_receive_animation,
+  virtual void DispatchAddOpacityAnimation(
+      SingleKeyframeEffectAnimation* animation_to_receive_animation,
       double animation_duration);
   void DispatchSetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id);
   void DispatchSetDeferCommits(bool defer_commits);
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index a0bade4..b9ad8b4a 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -15,7 +15,7 @@
 #include "cc/animation/animation_host.h"
 #include "cc/animation/animation_id_provider.h"
 #include "cc/animation/keyframed_animation_curve.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/transform_operations.h"
 #include "cc/base/math_util.h"
 #include "cc/input/main_thread_scrolling_reason.h"
@@ -2055,24 +2055,24 @@
   root->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
 
   // Put an animated opacity on the render surface.
-  AddOpacityTransitionToElementWithPlayer(
+  AddOpacityTransitionToElementWithAnimation(
       render_surface1->element_id(), timeline_impl(), 10.0, 1.f, 0.f, false);
 
   // Also put an animated opacity on a layer without descendants.
-  AddOpacityTransitionToElementWithPlayer(grand_child_of_root->element_id(),
-                                          timeline_impl(), 10.0, 1.f, 0.f,
-                                          false);
+  AddOpacityTransitionToElementWithAnimation(grand_child_of_root->element_id(),
+                                             timeline_impl(), 10.0, 1.f, 0.f,
+                                             false);
 
   // Put a transform animation on the render surface.
-  AddAnimatedTransformToElementWithPlayer(render_surface2->element_id(),
-                                          timeline_impl(), 10.0, 30, 0);
+  AddAnimatedTransformToElementWithAnimation(render_surface2->element_id(),
+                                             timeline_impl(), 10.0, 30, 0);
 
   // Also put transform animations on grand_child_of_root, and
   // grand_child_of_rs2
-  AddAnimatedTransformToElementWithPlayer(grand_child_of_root->element_id(),
-                                          timeline_impl(), 10.0, 30, 0);
-  AddAnimatedTransformToElementWithPlayer(grand_child_of_rs2->element_id(),
-                                          timeline_impl(), 10.0, 30, 0);
+  AddAnimatedTransformToElementWithAnimation(grand_child_of_root->element_id(),
+                                             timeline_impl(), 10.0, 30, 0);
+  AddAnimatedTransformToElementWithAnimation(grand_child_of_rs2->element_id(),
+                                             timeline_impl(), 10.0, 30, 0);
 
   root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
@@ -2199,7 +2199,7 @@
       TargetProperty::TRANSFORM);
   keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
   keyframe_model->set_time_offset(base::TimeDelta::FromMilliseconds(-1000));
-  AddKeyframeModelToElementWithPlayer(
+  AddKeyframeModelToElementWithAnimation(
       grand_child->element_id(), timeline_impl(), std::move(keyframe_model));
   ExecuteCalculateDrawProperties(root);
 
@@ -3905,11 +3905,11 @@
   SetElementIdsForTesting();
 
   // Animate the transform on the render surface.
-  AddAnimatedTransformToElementWithPlayer(animating_surface->element_id(),
-                                          timeline_impl(), 10.0, 30, 0);
+  AddAnimatedTransformToElementWithAnimation(animating_surface->element_id(),
+                                             timeline_impl(), 10.0, 30, 0);
   // This is just an animating layer, not a surface.
-  AddAnimatedTransformToElementWithPlayer(animating_child->element_id(),
-                                          timeline_impl(), 10.0, 30, 0);
+  AddAnimatedTransformToElementWithAnimation(animating_child->element_id(),
+                                             timeline_impl(), 10.0, 30, 0);
 
   root->SetBounds(gfx::Size(100, 100));
   child->SetBounds(gfx::Size(100, 100));
@@ -4424,8 +4424,8 @@
   ElementId child_element_id =
       host_impl.pending_tree()->LayerById(child_id)->element_id();
 
-  AddOpacityTransitionToElementWithPlayer(child_element_id, timeline, 10.0,
-                                          0.0f, 1.0f, false);
+  AddOpacityTransitionToElementWithAnimation(child_element_id, timeline, 10.0,
+                                             0.0f, 1.0f, false);
 
   RenderSurfaceList render_surface_list;
   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
@@ -4673,8 +4673,8 @@
 
   SetElementIdsForTesting();
 
-  AddOpacityTransitionToElementWithPlayer(child_->element_id(), timeline(),
-                                          10.0, 0.9f, 0.1f, false);
+  AddOpacityTransitionToElementWithAnimation(child_->element_id(), timeline(),
+                                             10.0, 0.9f, 0.1f, false);
   ExecuteCalculateDrawProperties(root_, 1.f, 1.f, nullptr, nullptr, nullptr);
   // Text LCD should be adjusted while animation is active.
   EXPECT_EQ(expect_lcd_text, root_->CanUseLCDText());
@@ -4695,8 +4695,8 @@
 
   // Mark contents non-opaque within the first animation frame.
   child_->SetContentsOpaque(false);
-  AddOpacityTransitionToElementWithPlayer(child_->element_id(), timeline(),
-                                          10.0, 0.9f, 0.1f, false);
+  AddOpacityTransitionToElementWithAnimation(child_->element_id(), timeline(),
+                                             10.0, 0.9f, 0.1f, false);
   ExecuteCalculateDrawProperties(root_, 1.f, 1.f, nullptr, nullptr, nullptr);
   // LCD text should be disabled for non-opaque layers even during animations.
   EXPECT_EQ(expect_lcd_text, root_->CanUseLCDText());
@@ -6189,9 +6189,9 @@
   end_operations.AppendMatrix(end_scale);
   SetElementIdsForTesting();
 
-  AddAnimatedTransformToElementWithPlayer(animated_layer->element_id(),
-                                          timeline_impl(), 1.0,
-                                          start_operations, end_operations);
+  AddAnimatedTransformToElementWithAnimation(animated_layer->element_id(),
+                                             timeline_impl(), 1.0,
+                                             start_operations, end_operations);
   BuildPropertyTreesForTesting();
   gfx::Vector2dF scroll_delta(5.f, 9.f);
   SetScrollOffsetDelta(scroller, scroll_delta);
@@ -7328,32 +7328,32 @@
 
   host_impl.active_tree()->SetElementIdsForTesting();
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> grand_parent_player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(grand_parent_player);
-  grand_parent_player->AttachElement(grand_parent_raw->element_id());
+  scoped_refptr<SingleKeyframeEffectAnimation> grand_parent_animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(grand_parent_animation);
+  grand_parent_animation->AttachElement(grand_parent_raw->element_id());
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> parent_player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(parent_player);
-  parent_player->AttachElement(parent_raw->element_id());
+  scoped_refptr<SingleKeyframeEffectAnimation> parent_animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(parent_animation);
+  parent_animation->AttachElement(parent_raw->element_id());
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> child_player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(child_player);
-  child_player->AttachElement(child_raw->element_id());
+  scoped_refptr<SingleKeyframeEffectAnimation> child_animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(child_animation);
+  child_animation->AttachElement(child_raw->element_id());
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> grand_child_player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline->AttachPlayer(grand_child_player);
-  grand_child_player->AttachElement(grand_child_raw->element_id());
+  scoped_refptr<SingleKeyframeEffectAnimation> grand_child_animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline->AttachAnimation(grand_child_animation);
+  grand_child_animation->AttachElement(grand_child_raw->element_id());
 
-  AddAnimatedTransformToPlayer(parent_player.get(), 1.0, TransformOperations(),
-                               translation);
+  AddAnimatedTransformToAnimation(parent_animation.get(), 1.0,
+                                  TransformOperations(), translation);
 
   // No layers have scale-affecting animations.
   EXPECT_EQ(0.f, GetMaximumAnimationScale(grand_parent_raw));
@@ -7369,8 +7369,8 @@
   TransformOperations scale;
   scale.AppendScale(5.f, 4.f, 3.f);
 
-  AddAnimatedTransformToPlayer(child_player.get(), 1.0, TransformOperations(),
-                               scale);
+  AddAnimatedTransformToAnimation(child_animation.get(), 1.0,
+                                  TransformOperations(), scale);
   child_raw->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(grand_parent_raw);
 
@@ -7385,8 +7385,8 @@
   EXPECT_EQ(1.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(1.f, GetStartingAnimationScale(grand_child_raw));
 
-  AddAnimatedTransformToPlayer(grand_parent_player.get(), 1.0,
-                               TransformOperations(), scale);
+  AddAnimatedTransformToAnimation(grand_parent_animation.get(), 1.0,
+                                  TransformOperations(), scale);
   grand_parent_raw->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(grand_parent_raw);
 
@@ -7403,8 +7403,8 @@
   EXPECT_EQ(0.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(0.f, GetStartingAnimationScale(grand_child_raw));
 
-  AddAnimatedTransformToPlayer(parent_player.get(), 1.0, TransformOperations(),
-                               scale);
+  AddAnimatedTransformToAnimation(parent_animation.get(), 1.0,
+                                  TransformOperations(), scale);
   parent_raw->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(grand_parent_raw);
 
@@ -7419,15 +7419,15 @@
   EXPECT_EQ(0.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(0.f, GetStartingAnimationScale(grand_child_raw));
 
-  grand_parent_player->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
-  parent_player->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
-  child_player->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  grand_parent_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  parent_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  child_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   TransformOperations perspective;
   perspective.AppendPerspective(10.f);
 
-  AddAnimatedTransformToPlayer(child_player.get(), 1.0, TransformOperations(),
-                               perspective);
+  AddAnimatedTransformToAnimation(child_animation.get(), 1.0,
+                                  TransformOperations(), perspective);
   child_raw->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(grand_parent_raw);
 
@@ -7443,7 +7443,7 @@
   EXPECT_EQ(0.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(0.f, GetStartingAnimationScale(grand_child_raw));
 
-  child_player->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  child_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   gfx::Transform scale_matrix;
   scale_matrix.Scale(1.f, 2.f);
@@ -7451,8 +7451,8 @@
   parent_raw->test_properties()->transform = scale_matrix;
   grand_parent_raw->layer_tree_impl()->property_trees()->needs_rebuild = true;
 
-  AddAnimatedTransformToPlayer(parent_player.get(), 1.0, TransformOperations(),
-                               scale);
+  AddAnimatedTransformToAnimation(parent_animation.get(), 1.0,
+                                  TransformOperations(), scale);
   ExecuteCalculateDrawProperties(grand_parent_raw);
 
   // |grand_parent| and |parent| each have scale 2.f. |parent| has a  scale
@@ -7806,8 +7806,8 @@
   child2_layer->test_properties()->transform = scale_transform_child2;
   child2_layer->SetBounds(gfx::Size(1, 1));
   child2_layer->SetDrawsContent(true);
-  AddAnimatedTransformToElementWithPlayer(child2_layer->element_id(), timeline,
-                                          1.0, TransformOperations(), scale);
+  AddAnimatedTransformToElementWithAnimation(
+      child2_layer->element_id(), timeline, 1.0, TransformOperations(), scale);
 
   root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root_layer);
@@ -7913,8 +7913,8 @@
       AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
   host_impl.animation_host()->AddAnimationTimeline(timeline);
 
-  AddAnimatedTransformToElementWithPlayer(child2_layer->element_id(), timeline,
-                                          1.0, TransformOperations(), scale);
+  AddAnimatedTransformToElementWithAnimation(
+      child2_layer->element_id(), timeline, 1.0, TransformOperations(), scale);
 
   // Correctly computes animation scale when rebuilding property trees.
   root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
@@ -7981,8 +7981,8 @@
       AnimationTimeline::Create(AnimationIdProvider::NextTimelineId());
   host_impl.animation_host()->AddAnimationTimeline(timeline);
 
-  AddAnimatedTransformToElementWithPlayer(child_layer->element_id(), timeline,
-                                          1.0, TransformOperations(), scale);
+  AddAnimatedTransformToElementWithAnimation(
+      child_layer->element_id(), timeline, 1.0, TransformOperations(), scale);
 
   root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root_layer);
@@ -8157,7 +8157,7 @@
   animated->test_properties()->opacity = 0.f;
   animated->SetBounds(gfx::Size(20, 20));
 
-  AddOpacityTransitionToElementWithPlayer(
+  AddOpacityTransitionToElementWithAnimation(
       animated->element_id(), timeline_impl(), 10.0, 0.f, 1.f, false);
   animated->test_properties()->opacity_can_animate = true;
   root->layer_tree_impl()->property_trees()->needs_rebuild = true;
@@ -8215,7 +8215,7 @@
   start_transform_operations.AppendMatrix(uninvertible_matrix);
   TransformOperations end_transform_operations;
 
-  AddAnimatedTransformToElementWithPlayer(
+  AddAnimatedTransformToElementWithAnimation(
       animated->element_id(), timeline_impl(), 10.0, start_transform_operations,
       end_transform_operations);
   ExecuteCalculateDrawProperties(root);
@@ -8282,8 +8282,8 @@
   grandchild->SetDrawsContent(true);
 
   SetElementIdsForTesting();
-  AddOpacityTransitionToElementWithPlayer(child->element_id(), timeline_impl(),
-                                          10.0, 1.f, 0.2f, false);
+  AddOpacityTransitionToElementWithAnimation(
+      child->element_id(), timeline_impl(), 10.0, 1.f, 0.2f, false);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_EQ(1.f, child->Opacity());
@@ -8309,8 +8309,8 @@
   grandchild->SetBounds(gfx::Size(50, 50));
 
   SetElementIdsForTesting();
-  AddAnimatedFilterToElementWithPlayer(child->element_id(), timeline_impl(),
-                                       10.0, 0.1f, 0.2f);
+  AddAnimatedFilterToElementWithAnimation(child->element_id(), timeline_impl(),
+                                          10.0, 0.1f, 0.2f);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(GetRenderSurface(root));
@@ -8358,8 +8358,8 @@
   keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
   keyframe_model->set_time_offset(base::TimeDelta::FromMilliseconds(-1000));
 
-  AddKeyframeModelToElementWithPlayer(child->element_id(), timeline_impl(),
-                                      std::move(keyframe_model));
+  AddKeyframeModelToElementWithAnimation(child->element_id(), timeline_impl(),
+                                         std::move(keyframe_model));
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(GetRenderSurface(root));
@@ -8658,8 +8658,8 @@
       keyframe_model_id, 1, TargetProperty::TRANSFORM);
   keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
   keyframe_model->set_time_offset(base::TimeDelta::FromMilliseconds(-1000));
-  AddKeyframeModelToElementWithPlayer(child->element_id(), timeline(),
-                                      std::move(keyframe_model));
+  AddKeyframeModelToElementWithAnimation(child->element_id(), timeline(),
+                                         std::move(keyframe_model));
   ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList(root.get());
   update_list = GetUpdateLayerList();
   EXPECT_TRUE(VerifyLayerInList(grandchild, update_list));
@@ -8821,14 +8821,14 @@
       base::TimeDelta::FromSecondsD(1.0), operation, nullptr));
   std::unique_ptr<KeyframeModel> transform_animation(
       KeyframeModel::Create(std::move(curve), 3, 3, TargetProperty::TRANSFORM));
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player(
-      SingleKeyframeEffectAnimationPlayer::Create(1));
-  timeline()->AttachPlayer(player);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation(
+      SingleKeyframeEffectAnimation::Create(1));
+  timeline()->AttachAnimation(animation);
   // TODO(smcgruer): Should attach a timeline and element rather than call this
   // directly. See http://crbug.com/771316
   host_impl.animation_host()->RegisterKeyframeEffectForElement(
-      root_ptr->element_id(), player->keyframe_effect());
-  player->AddKeyframeModel(std::move(transform_animation));
+      root_ptr->element_id(), animation->keyframe_effect());
+  animation->AddKeyframeModel(std::move(transform_animation));
   grandchild_ptr->set_visible_layer_rect(gfx::Rect());
   root_ptr->test_properties()->transform = singular;
   child_ptr->test_properties()->transform = singular;
@@ -8837,9 +8837,9 @@
   EXPECT_EQ(gfx::Rect(0, 0), grandchild_ptr->visible_layer_rect());
 
   host_impl.animation_host()->UnregisterKeyframeEffectForElement(
-      root_ptr->element_id(), player->keyframe_effect());
-  host_impl.animation_host()->RemoveFromTicking(player.get());
-  timeline()->DetachPlayer(player);
+      root_ptr->element_id(), animation->keyframe_effect());
+  host_impl.animation_host()->RemoveFromTicking(animation.get());
+  timeline()->DetachAnimation(animation);
 }
 
 TEST_F(LayerTreeHostCommonTest, LayerSkippingInSubtreeOfSingularTransform) {
@@ -8874,23 +8874,23 @@
       base::TimeDelta::FromSecondsD(1.0), operation, nullptr));
   std::unique_ptr<KeyframeModel> transform_animation(
       KeyframeModel::Create(std::move(curve), 3, 3, TargetProperty::TRANSFORM));
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player(
-      SingleKeyframeEffectAnimationPlayer::Create(1));
-  timeline()->AttachPlayer(player);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation(
+      SingleKeyframeEffectAnimation::Create(1));
+  timeline()->AttachAnimation(animation);
   // TODO(smcgruer): Should attach a timeline and element rather than call this
   // directly. See http://crbug.com/771316
   host_impl()->animation_host()->RegisterKeyframeEffectForElement(
-      grand_child->element_id(), player->keyframe_effect());
-  player->AddKeyframeModel(std::move(transform_animation));
+      grand_child->element_id(), animation->keyframe_effect());
+  animation->AddKeyframeModel(std::move(transform_animation));
 
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(0, 0), grand_child->visible_layer_rect());
   EXPECT_EQ(gfx::Rect(0, 0), child->visible_layer_rect());
 
   host_impl()->animation_host()->UnregisterKeyframeEffectForElement(
-      grand_child->element_id(), player->keyframe_effect());
-  host_impl()->animation_host()->RemoveFromTicking(player.get());
-  timeline()->DetachPlayer(player);
+      grand_child->element_id(), animation->keyframe_effect());
+  host_impl()->animation_host()->RemoveFromTicking(animation.get());
+  timeline()->DetachAnimation(animation);
 }
 
 TEST_F(LayerTreeHostCommonTest, SkippingPendingLayerImpl) {
@@ -8940,14 +8940,14 @@
       FloatKeyframe::Create(base::TimeDelta::FromSecondsD(1.0), 0.3f, nullptr));
   std::unique_ptr<KeyframeModel> keyframe_model(
       KeyframeModel::Create(std::move(curve), 3, 3, TargetProperty::OPACITY));
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player(
-      SingleKeyframeEffectAnimationPlayer::Create(1));
-  timeline()->AttachPlayer(player);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation(
+      SingleKeyframeEffectAnimation::Create(1));
+  timeline()->AttachAnimation(animation);
   // TODO(smcgruer): Should attach a timeline and element rather than call this
   // directly. See http://crbug.com/771316
   host_impl.animation_host()->RegisterKeyframeEffectForElement(
-      root_ptr->element_id(), player->keyframe_effect());
-  player->AddKeyframeModel(std::move(keyframe_model));
+      root_ptr->element_id(), animation->keyframe_effect());
+  animation->AddKeyframeModel(std::move(keyframe_model));
   root_ptr->test_properties()->opacity = 0.f;
   grandchild_ptr->set_visible_layer_rect(gfx::Rect());
   root_ptr->layer_tree_impl()->property_trees()->needs_rebuild = true;
@@ -8955,9 +8955,9 @@
   EXPECT_EQ(gfx::Rect(10, 10), grandchild_ptr->visible_layer_rect());
 
   host_impl.animation_host()->UnregisterKeyframeEffectForElement(
-      root_ptr->element_id(), player->keyframe_effect());
-  host_impl.animation_host()->RemoveFromTicking(player.get());
-  timeline()->DetachPlayer(player);
+      root_ptr->element_id(), animation->keyframe_effect());
+  host_impl.animation_host()->RemoveFromTicking(animation.get());
+  timeline()->DetachAnimation(animation);
 }
 
 TEST_F(LayerTreeHostCommonTest, SkippingLayer) {
@@ -9774,12 +9774,12 @@
   animated->SetBounds(gfx::Size(20, 20));
   animated->SetOpacity(0.f);
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline()->AttachPlayer(player);
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline()->AttachAnimation(animation);
 
-  player->AttachElement(animated->element_id());
+  animation->AttachElement(animated->element_id());
 
   int keyframe_model_id = 0;
   std::unique_ptr<KeyframeModel> keyframe_model = KeyframeModel::Create(
@@ -9804,8 +9804,8 @@
   EXPECT_TRUE(node->is_currently_animating_opacity);
   EXPECT_TRUE(node->has_potential_opacity_animation);
 
-  player->AbortKeyframeModels(TargetProperty::OPACITY,
-                              false /*needs_completion*/);
+  animation->AbortKeyframeModels(TargetProperty::OPACITY,
+                                 false /*needs_completion*/);
   node = tree.Node(animated->effect_tree_index());
   EXPECT_FALSE(node->is_currently_animating_opacity);
   EXPECT_FALSE(node->has_potential_opacity_animation);
@@ -9823,11 +9823,11 @@
   root->SetForceRenderSurfaceForTesting(true);
   animated->SetBounds(gfx::Size(20, 20));
 
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player =
-      SingleKeyframeEffectAnimationPlayer::Create(
-          AnimationIdProvider::NextPlayerId());
-  timeline()->AttachPlayer(player);
-  player->AttachElement(animated->element_id());
+  scoped_refptr<SingleKeyframeEffectAnimation> animation =
+      SingleKeyframeEffectAnimation::Create(
+          AnimationIdProvider::NextAnimationId());
+  timeline()->AttachAnimation(animation);
+  animation->AttachElement(animated->element_id());
 
   std::unique_ptr<KeyframedTransformAnimationCurve> curve(
       KeyframedTransformAnimationCurve::Create());
@@ -9863,8 +9863,8 @@
   EXPECT_TRUE(node->is_currently_animating);
   EXPECT_TRUE(node->has_potential_animation);
 
-  player->AbortKeyframeModels(TargetProperty::TRANSFORM,
-                              false /*needs_completion*/);
+  animation->AbortKeyframeModels(TargetProperty::TRANSFORM,
+                                 false /*needs_completion*/);
   node = tree.Node(animated->transform_tree_index());
   EXPECT_FALSE(node->is_currently_animating);
   EXPECT_FALSE(node->has_potential_animation);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 4a73f317..d83bc5e 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1875,8 +1875,8 @@
 
   host_impl_->pending_tree()->SetElementIdsForTesting();
 
-  AddAnimatedTransformToElementWithPlayer(child->element_id(), timeline(), 10.0,
-                                          3, 0);
+  AddAnimatedTransformToElementWithAnimation(child->element_id(), timeline(),
+                                             10.0, 3, 0);
   host_impl_->pending_tree()->BuildPropertyTreesForTesting();
 
   EXPECT_FALSE(did_request_next_frame_);
@@ -1936,8 +1936,8 @@
   start.AppendTranslate(6.f, 7.f, 0.f);
   TransformOperations end;
   end.AppendTranslate(8.f, 9.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(child->element_id(), timeline(), 4.0,
-                                          start, end);
+  AddAnimatedTransformToElementWithAnimation(child->element_id(), timeline(),
+                                             4.0, start, end);
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
   base::TimeTicks now = base::TimeTicks::Now();
@@ -1998,8 +1998,8 @@
 
   host_impl_->active_tree()->SetElementIdsForTesting();
 
-  AddAnimatedTransformToElementWithPlayer(child->element_id(), timeline(), 10.0,
-                                          3, 0);
+  AddAnimatedTransformToElementWithAnimation(child->element_id(), timeline(),
+                                             10.0, 3, 0);
 
   // Set up the property trees so that UpdateDrawProperties will work in
   // CommitComplete below.
@@ -2047,8 +2047,8 @@
   start.AppendTranslate(6.f, 7.f, 0.f);
   TransformOperations end;
   end.AppendTranslate(8.f, 9.f, 0.f);
-  AddAnimatedTransformToElementWithPlayer(child->element_id(), timeline(), 4.0,
-                                          start, end);
+  AddAnimatedTransformToElementWithAnimation(child->element_id(), timeline(),
+                                             4.0, start, end);
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
   base::TimeTicks now = base::TimeTicks::Now();
@@ -4804,8 +4804,8 @@
         had_incomplete_tile_(had_incomplete_tile) {
     if (animating) {
       this->SetElementId(LayerIdToElementIdForTesting(id));
-      AddAnimatedTransformToElementWithPlayer(this->element_id(), timeline,
-                                              10.0, 3, 0);
+      AddAnimatedTransformToElementWithAnimation(this->element_id(), timeline,
+                                                 10.0, 3, 0);
     }
   }
 
@@ -4937,7 +4937,7 @@
       to_remove.push_back(child);
     for (auto* child : to_remove)
       root->test_properties()->RemoveChild(child);
-    timeline()->ClearPlayers();
+    timeline()->ClearAnimations();
 
     std::ostringstream scope;
     scope << "Test case: " << i;
@@ -13688,7 +13688,7 @@
   TransformOperations start_transform_operations;
   start_transform_operations.AppendMatrix(singular);
   TransformOperations end_transform_operations;
-  AddAnimatedTransformToElementWithPlayer(
+  AddAnimatedTransformToElementWithAnimation(
       animated_transform_layer->element_id(), timeline(), 10.0,
       start_transform_operations, end_transform_operations);
 
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc
index 67b0d668..683856d 100644
--- a/cc/trees/layer_tree_host_unittest_animation.cc
+++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -16,7 +16,7 @@
 #include "cc/animation/keyframe_effect.h"
 #include "cc/animation/scroll_offset_animation_curve.h"
 #include "cc/animation/scroll_offset_animations.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/animation/timing_function.h"
 #include "cc/animation/transform_operations.h"
 #include "cc/base/completion_event.h"
@@ -36,33 +36,33 @@
  public:
   LayerTreeHostAnimationTest()
       : timeline_id_(AnimationIdProvider::NextTimelineId()),
-        player_id_(AnimationIdProvider::NextPlayerId()),
-        player_child_id_(AnimationIdProvider::NextPlayerId()) {
+        animation_id_(AnimationIdProvider::NextAnimationId()),
+        animation_child_id_(AnimationIdProvider::NextAnimationId()) {
     timeline_ = AnimationTimeline::Create(timeline_id_);
-    player_ = SingleKeyframeEffectAnimationPlayer::Create(player_id_);
-    player_child_ =
-        SingleKeyframeEffectAnimationPlayer::Create(player_child_id_);
+    animation_ = SingleKeyframeEffectAnimation::Create(animation_id_);
+    animation_child_ =
+        SingleKeyframeEffectAnimation::Create(animation_child_id_);
 
-    player_->set_animation_delegate(this);
+    animation_->set_animation_delegate(this);
   }
 
-  void AttachPlayersToTimeline() {
+  void AttachAnimationsToTimeline() {
     animation_host()->AddAnimationTimeline(timeline_.get());
     layer_tree_host()->SetElementIdsForTesting();
-    timeline_->AttachPlayer(player_.get());
-    timeline_->AttachPlayer(player_child_.get());
+    timeline_->AttachAnimation(animation_.get());
+    timeline_->AttachAnimation(animation_child_.get());
   }
 
-  void GetImplTimelineAndPlayerByID(const LayerTreeHostImpl& host_impl) {
+  void GetImplTimelineAndAnimationByID(const LayerTreeHostImpl& host_impl) {
     AnimationHost* animation_host_impl = GetImplAnimationHost(&host_impl);
     timeline_impl_ = animation_host_impl->GetTimelineById(timeline_id_);
     EXPECT_TRUE(timeline_impl_);
-    player_impl_ = static_cast<SingleKeyframeEffectAnimationPlayer*>(
-        timeline_impl_->GetPlayerById(player_id_));
-    EXPECT_TRUE(player_impl_);
-    player_child_impl_ = static_cast<SingleKeyframeEffectAnimationPlayer*>(
-        timeline_impl_->GetPlayerById(player_child_id_));
-    EXPECT_TRUE(player_child_impl_);
+    animation_impl_ = static_cast<SingleKeyframeEffectAnimation*>(
+        timeline_impl_->GetAnimationById(animation_id_));
+    EXPECT_TRUE(animation_impl_);
+    animation_child_impl_ = static_cast<SingleKeyframeEffectAnimation*>(
+        timeline_impl_->GetAnimationById(animation_child_id_));
+    EXPECT_TRUE(animation_child_impl_);
   }
 
   AnimationHost* GetImplAnimationHost(
@@ -72,16 +72,16 @@
 
  protected:
   scoped_refptr<AnimationTimeline> timeline_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_child_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_child_;
 
   scoped_refptr<AnimationTimeline> timeline_impl_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl_;
-  scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_child_impl_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_impl_;
+  scoped_refptr<SingleKeyframeEffectAnimation> animation_child_impl_;
 
   const int timeline_id_;
-  const int player_id_;
-  const int player_child_id_;
+  const int animation_id_;
+  const int animation_child_id_;
 };
 
 // Makes sure that SetNeedsAnimate does not cause the CommitRequested() state to
@@ -170,9 +170,9 @@
       : update_animation_state_was_called_(false) {}
 
   void BeginTest() override {
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    PostAddInstantAnimationToMainThreadPlayer(player_.get());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    PostAddOpacityAnimationToMainThreadInstantly(animation_.get());
   }
 
   void UpdateAnimationState(LayerTreeHostImpl* host_impl,
@@ -187,9 +187,9 @@
     EXPECT_LT(base::TimeTicks(), monotonic_time);
 
     KeyframeModel* keyframe_model =
-        player_->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_->GetKeyframeModel(TargetProperty::OPACITY);
     if (keyframe_model)
-      player_->RemoveKeyframeModel(keyframe_model->id());
+      animation_->RemoveKeyframeModel(keyframe_model->id());
 
     EndTest();
   }
@@ -211,9 +211,9 @@
       : started_animating_(false) {}
 
   void BeginTest() override {
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    PostAddAnimationToMainThreadPlayer(player_.get());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    PostAddOpacityAnimationToMainThread(animation_.get());
   }
 
   void AnimateLayers(LayerTreeHostImpl* host_impl,
@@ -249,15 +249,16 @@
       : started_animating_(false) {}
 
   void BeginTest() override {
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    PostAddAnimationToMainThreadPlayer(player_.get());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    PostAddOpacityAnimationToMainThread(animation_.get());
   }
 
   void AnimateLayers(LayerTreeHostImpl* host_impl,
                      base::TimeTicks monotonic_time) override {
-    bool have_animations =
-        !GetImplAnimationHost(host_impl)->ticking_players_for_testing().empty();
+    bool have_animations = !GetImplAnimationHost(host_impl)
+                                ->ticking_animations_for_testing()
+                                .empty();
     if (!started_animating_ && have_animations) {
       started_animating_ = true;
       return;
@@ -294,12 +295,12 @@
     client_.set_bounds(picture_->bounds());
     layer_tree_host()->root_layer()->AddChild(picture_);
 
-    AttachPlayersToTimeline();
-    player_child_->AttachElement(picture_->element_id());
+    AttachAnimationsToTimeline();
+    animation_child_->AttachElement(picture_->element_id());
   }
 
   void BeginTest() override {
-    PostAddAnimationToMainThreadPlayer(player_child_.get());
+    PostAddOpacityAnimationToMainThread(animation_child_.get());
   }
 
   void AnimateLayers(LayerTreeHostImpl* host_impl,
@@ -315,12 +316,12 @@
 
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_child_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_child_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_child_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_child_id_));
 
     KeyframeModel* keyframe_model =
-        player_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
 
     const FloatAnimationCurve* curve =
         keyframe_model->curve()->ToFloatAnimationCurve();
@@ -359,22 +360,22 @@
 
     layer_tree_host()->root_layer()->AddChild(picture_);
 
-    AttachPlayersToTimeline();
-    player_child_->set_animation_delegate(this);
-    player_child_->AttachElement(picture_->element_id());
+    AttachAnimationsToTimeline();
+    animation_child_->set_animation_delegate(this);
+    animation_child_->AttachElement(picture_->element_id());
   }
 
   void BeginTest() override {
-    PostAddAnimationToMainThreadPlayer(player_child_.get());
+    PostAddOpacityAnimationToMainThread(animation_child_.get());
   }
 
   void NotifyAnimationStarted(base::TimeTicks monotonic_time,
                               int target_property,
                               int group) override {
     KeyframeModel* keyframe_model =
-        player_child_->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_child_->GetKeyframeModel(TargetProperty::OPACITY);
     main_start_time_ = keyframe_model->start_time();
-    player_child_->RemoveKeyframeModel(keyframe_model->id());
+    animation_child_->RemoveKeyframeModel(keyframe_model->id());
     EndTest();
   }
 
@@ -382,12 +383,12 @@
                             bool has_unfinished_animation) override {
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(impl_host)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_child_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_child_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_child_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_child_id_));
 
     KeyframeModel* keyframe_model =
-        player_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
     if (!keyframe_model)
       return;
 
@@ -414,18 +415,18 @@
     : public LayerTreeHostAnimationTest {
  public:
   void BeginTest() override {
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    PostAddInstantAnimationToMainThreadPlayer(player_.get());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    PostAddOpacityAnimationToMainThreadInstantly(animation_.get());
   }
 
   void NotifyAnimationFinished(base::TimeTicks monotonic_time,
                                int target_property,
                                int group) override {
     KeyframeModel* keyframe_model =
-        player_->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_->GetKeyframeModel(TargetProperty::OPACITY);
     if (keyframe_model)
-      player_->RemoveKeyframeModel(keyframe_model->id());
+      animation_->RemoveKeyframeModel(keyframe_model->id());
     EndTest();
   }
 
@@ -450,24 +451,24 @@
     client_.set_bounds(update_check_layer_->bounds());
     LayerTreeHostAnimationTest::SetupTree();
 
-    AttachPlayersToTimeline();
-    player_->AttachElement(update_check_layer_->element_id());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(update_check_layer_->element_id());
   }
 
   void BeginTest() override {
-    PostAddAnimationToMainThreadPlayer(player_.get());
+    PostAddOpacityAnimationToMainThread(animation_.get());
   }
 
   void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_id_));
 
     KeyframeModel* keyframe_model_impl =
-        player_impl->GetKeyframeModel(TargetProperty::OPACITY);
-    player_impl->RemoveKeyframeModel(keyframe_model_impl->id());
+        animation_impl->GetKeyframeModel(TargetProperty::OPACITY);
+    animation_impl->RemoveKeyframeModel(keyframe_model_impl->id());
     EndTest();
   }
 
@@ -497,18 +498,18 @@
 
   void DidCommit() override {
     if (layer_tree_host()->SourceFrameNumber() == 1) {
-      AttachPlayersToTimeline();
+      AttachAnimationsToTimeline();
 
       scoped_refptr<Layer> layer = Layer::Create();
       layer->SetElementId(ElementId(42));
-      player_->AttachElement(layer->element_id());
-      player_->set_animation_delegate(this);
+      animation_->AttachElement(layer->element_id());
+      animation_->set_animation_delegate(this);
 
       // Any valid AnimationCurve will do here.
       std::unique_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve());
       std::unique_ptr<KeyframeModel> keyframe_model(KeyframeModel::Create(
           std::move(curve), 1, 1, TargetProperty::OPACITY));
-      player_->AddKeyframeModel(std::move(keyframe_model));
+      animation_->AddKeyframeModel(std::move(keyframe_model));
 
       // We add the animation *before* attaching the layer to the tree.
       layer_tree_host()->root_layer()->AddChild(layer);
@@ -652,9 +653,9 @@
     client_.set_bounds(picture_->bounds());
     layer_tree_host()->root_layer()->AddChild(picture_);
 
-    AttachPlayersToTimeline();
-    player_child_->AttachElement(picture_->element_id());
-    player_child_->set_animation_delegate(this);
+    AttachAnimationsToTimeline();
+    animation_child_->AttachElement(picture_->element_id());
+    animation_child_->set_animation_delegate(this);
   }
 
   void InitializeSettings(LayerTreeSettings* settings) override {
@@ -690,12 +691,12 @@
     switch (layer_tree_host()->SourceFrameNumber()) {
       case 1:
         // The animation is longer than 1 BeginFrame interval.
-        AddOpacityTransitionToPlayer(player_child_.get(), 0.1, 0.2f, 0.8f,
-                                     false);
+        AddOpacityTransitionToAnimation(animation_child_.get(), 0.1, 0.2f, 0.8f,
+                                        false);
         break;
       case 2:
         // This second animation will not be drawn so it should not start.
-        AddAnimatedTransformToPlayer(player_child_.get(), 0.1, 5, 5);
+        AddAnimatedTransformToAnimation(animation_child_.get(), 0.1, 5, 5);
         break;
     }
   }
@@ -741,8 +742,8 @@
     scroll_layer_->SetScrollOffset(gfx::ScrollOffset(10, 20));
     layer_tree_host()->root_layer()->AddChild(scroll_layer_);
 
-    AttachPlayersToTimeline();
-    player_child_->AttachElement(scroll_layer_->element_id());
+    AttachAnimationsToTimeline();
+    animation_child_->AttachElement(scroll_layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -760,7 +761,7 @@
         keyframe_model->set_needs_synchronized_start_time(true);
         bool impl_scrolling_supported = proxy()->SupportsImplScrolling();
         if (impl_scrolling_supported)
-          player_child_->AddKeyframeModel(std::move(keyframe_model));
+          animation_child_->AddKeyframeModel(std::move(keyframe_model));
         else
           EndTest();
         break;
@@ -801,10 +802,10 @@
     scroll_layer_->SetScrollable(gfx::Size(10, 10));
     layer_tree_host()->root_layer()->AddChild(scroll_layer_);
 
-    AttachPlayersToTimeline();
-    player_child_->AttachElement(scroll_layer_->element_id());
+    AttachAnimationsToTimeline();
+    animation_child_->AttachElement(scroll_layer_->element_id());
     // Allows NotifyAnimationTakeover to get called.
-    player_child_->set_animation_delegate(this);
+    animation_child_->set_animation_delegate(this);
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -861,7 +862,7 @@
     scroll_layer_->SetScrollable(gfx::Size(10, 10));
     layer_tree_host()->root_layer()->AddChild(scroll_layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
   }
 
   KeyframeEffect& ScrollOffsetKeyframeEffect(
@@ -899,7 +900,7 @@
     // Note that the frame number gets incremented after BeginCommitOnThread but
     // before WillCommitCompleteOnThread and CommitCompleteOnThread.
     if (host_impl->sync_tree()->source_frame_number() == 0) {
-      GetImplTimelineAndPlayerByID(*host_impl);
+      GetImplTimelineAndAnimationByID(*host_impl);
       // This happens after the impl-only animation is added in
       // WillCommitCompleteOnThread.
       KeyframeModel* keyframe_model =
@@ -982,9 +983,9 @@
         std::move(curve), 1, 0, TargetProperty::SCROLL_OFFSET));
     keyframe_model->set_needs_synchronized_start_time(true);
 
-    AttachPlayersToTimeline();
-    player_child_->AttachElement(scroll_layer_->element_id());
-    player_child_->AddKeyframeModel(std::move(keyframe_model));
+    AttachAnimationsToTimeline();
+    animation_child_->AttachElement(scroll_layer_->element_id());
+    animation_child_->AddKeyframeModel(std::move(keyframe_model));
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -999,8 +1000,8 @@
         EXPECT_GE(scroll_layer_->scroll_offset().x(), 100);
         EXPECT_GE(scroll_layer_->scroll_offset().y(), 200);
         KeyframeModel* keyframe_model =
-            player_child_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
-        player_child_->RemoveKeyframeModel(keyframe_model->id());
+            animation_child_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
+        animation_child_->RemoveKeyframeModel(keyframe_model->id());
         scroll_layer_->SetScrollOffset(final_postion_);
         break;
       }
@@ -1051,14 +1052,14 @@
 
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_child_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_child_id_));
 
     LayerImpl* scroll_layer_impl =
         host_impl->active_tree()->LayerById(scroll_layer_->id());
     KeyframeModel* keyframe_model =
-        player_impl->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
+        animation_impl->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
 
     if (!keyframe_model ||
         keyframe_model->run_state() != KeyframeModel::RUNNING)
@@ -1090,16 +1091,16 @@
       : frame_count_with_pending_tree_(0) {}
 
   void BeginTest() override {
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
     PostSetNeedsCommitToMainThread();
   }
 
   void DidCommit() override {
     if (layer_tree_host()->SourceFrameNumber() == 1) {
-      player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-      AddAnimatedTransformToPlayer(player_.get(), 4, 1, 1);
+      animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+      AddAnimatedTransformToAnimation(animation_.get(), 4, 1, 1);
     } else if (layer_tree_host()->SourceFrameNumber() == 2) {
-      AddOpacityTransitionToPlayer(player_.get(), 1, 0.f, 0.5f, true);
+      AddOpacityTransitionToAnimation(animation_.get(), 1, 0.f, 0.5f, true);
 
       scoped_refptr<Layer> layer = Layer::Create();
       layer_tree_host()->root_layer()->AddChild(layer);
@@ -1107,9 +1108,10 @@
       layer_tree_host()->SetElementIdsForTesting();
       layer->SetBounds(gfx::Size(4, 4));
 
-      player_child_->AttachElement(layer->element_id());
-      player_child_->set_animation_delegate(this);
-      AddOpacityTransitionToPlayer(player_child_.get(), 1, 0.f, 0.5f, true);
+      animation_child_->AttachElement(layer->element_id());
+      animation_child_->set_animation_delegate(this);
+      AddOpacityTransitionToAnimation(animation_child_.get(), 1, 0.f, 0.5f,
+                                      true);
     }
   }
 
@@ -1143,31 +1145,31 @@
                             bool has_unfinished_animation) override {
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_id_));
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_child_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_child_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_child_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_child_id_));
 
     // wait for tree activation.
-    if (!player_impl->keyframe_effect()->element_animations())
+    if (!animation_impl->keyframe_effect()->element_animations())
       return;
 
     KeyframeModel* root_keyframe_model =
-        player_impl->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_impl->GetKeyframeModel(TargetProperty::OPACITY);
     if (!root_keyframe_model ||
         root_keyframe_model->run_state() != KeyframeModel::RUNNING)
       return;
 
     KeyframeModel* child_keyframe_model =
-        player_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_child_impl->GetKeyframeModel(TargetProperty::OPACITY);
     EXPECT_EQ(KeyframeModel::RUNNING, child_keyframe_model->run_state());
     EXPECT_EQ(root_keyframe_model->start_time(),
               child_keyframe_model->start_time());
-    player_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
-    player_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
-    player_child_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
+    animation_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
+    animation_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+    animation_child_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
     EndTest();
   }
 
@@ -1198,9 +1200,9 @@
     layer_tree_host()->root_layer()->AddChild(layer_);
     layer_tree_host()->SetElementIdsForTesting();
 
-    player_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_->element_id());
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
   }
 
   void BeginTest() override {
@@ -1209,7 +1211,7 @@
     start.AppendTranslate(6.f, 7.f, 0.f);
     TransformOperations end;
     end.AppendTranslate(8.f, 9.f, 0.f);
-    AddAnimatedTransformToPlayer(player_.get(), 4.0, start, end);
+    AddAnimatedTransformToAnimation(animation_.get(), 4.0, start, end);
 
     PostSetNeedsCommitToMainThread();
   }
@@ -1226,13 +1228,13 @@
 
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_id_));
 
     LayerImpl* child = sync_tree->LayerById(layer_->id());
     KeyframeModel* keyframe_model =
-        player_impl->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_impl->GetKeyframeModel(TargetProperty::TRANSFORM);
 
     // The animation should be starting for the first frame.
     EXPECT_EQ(KeyframeModel::STARTING, keyframe_model->run_state());
@@ -1245,7 +1247,7 @@
     // And the sync tree layer should know it is animating.
     EXPECT_TRUE(child->screen_space_transform_is_animating());
 
-    player_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+    animation_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
     EndTest();
   }
 
@@ -1272,11 +1274,12 @@
     layer_tree_host()->SetElementIdsForTesting();
 
     animation_host()->AddAnimationTimeline(timeline_.get());
-    timeline_->AttachPlayer(player_.get());
-    player_->AttachElement(layer_->element_id());
-    DCHECK(player_->keyframe_effect()->element_animations());
+    timeline_->AttachAnimation(animation_.get());
+    animation_->AttachElement(layer_->element_id());
+    DCHECK(animation_->keyframe_effect()->element_animations());
 
-    AddOpacityTransitionToPlayer(player_.get(), 10000.0, 0.1f, 0.9f, true);
+    AddOpacityTransitionToAnimation(animation_.get(), 10000.0, 0.1f, 0.9f,
+                                    true);
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1284,30 +1287,30 @@
   void DidCommit() override {
     switch (layer_tree_host()->SourceFrameNumber()) {
       case 0:
-        EXPECT_TRUE(player_->keyframe_effect()
+        EXPECT_TRUE(animation_->keyframe_effect()
                         ->element_animations()
                         ->has_element_in_active_list());
-        EXPECT_FALSE(player_->keyframe_effect()
+        EXPECT_FALSE(animation_->keyframe_effect()
                          ->element_animations()
                          ->has_element_in_pending_list());
         EXPECT_TRUE(animation_host()->NeedsTickAnimations());
         break;
       case 1:
         layer_->RemoveFromParent();
-        EXPECT_FALSE(player_->keyframe_effect()
+        EXPECT_FALSE(animation_->keyframe_effect()
                          ->element_animations()
                          ->has_element_in_active_list());
-        EXPECT_FALSE(player_->keyframe_effect()
+        EXPECT_FALSE(animation_->keyframe_effect()
                          ->element_animations()
                          ->has_element_in_pending_list());
         EXPECT_FALSE(animation_host()->NeedsTickAnimations());
         break;
       case 2:
         layer_tree_host()->root_layer()->AddChild(layer_);
-        EXPECT_TRUE(player_->keyframe_effect()
+        EXPECT_TRUE(animation_->keyframe_effect()
                         ->element_animations()
                         ->has_element_in_active_list());
-        EXPECT_FALSE(player_->keyframe_effect()
+        EXPECT_FALSE(animation_->keyframe_effect()
                          ->element_animations()
                          ->has_element_in_pending_list());
         EXPECT_TRUE(animation_host()->NeedsTickAnimations());
@@ -1318,25 +1321,25 @@
   void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
     scoped_refptr<AnimationTimeline> timeline_impl =
         GetImplAnimationHost(host_impl)->GetTimelineById(timeline_id_);
-    scoped_refptr<SingleKeyframeEffectAnimationPlayer> player_impl =
-        static_cast<SingleKeyframeEffectAnimationPlayer*>(
-            timeline_impl->GetPlayerById(player_id_));
+    scoped_refptr<SingleKeyframeEffectAnimation> animation_impl =
+        static_cast<SingleKeyframeEffectAnimation*>(
+            timeline_impl->GetAnimationById(animation_id_));
 
     switch (host_impl->active_tree()->source_frame_number()) {
       case 0:
-        EXPECT_TRUE(player_impl->keyframe_effect()
+        EXPECT_TRUE(animation_impl->keyframe_effect()
                         ->element_animations()
                         ->has_element_in_active_list());
         EXPECT_TRUE(GetImplAnimationHost(host_impl)->NeedsTickAnimations());
         break;
       case 1:
-        EXPECT_FALSE(player_impl->keyframe_effect()
+        EXPECT_FALSE(animation_impl->keyframe_effect()
                          ->element_animations()
                          ->has_element_in_active_list());
         EXPECT_FALSE(GetImplAnimationHost(host_impl)->NeedsTickAnimations());
         break;
       case 2:
-        EXPECT_TRUE(player_impl->keyframe_effect()
+        EXPECT_TRUE(animation_impl->keyframe_effect()
                         ->element_animations()
                         ->has_element_in_active_list());
         EXPECT_TRUE(GetImplAnimationHost(host_impl)->NeedsTickAnimations());
@@ -1363,10 +1366,10 @@
     layer_->SetBounds(gfx::Size(4, 4));
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
 
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    player_child_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    animation_child_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1375,12 +1378,13 @@
     switch (layer_tree_host()->SourceFrameNumber()) {
       case 1:
         // First frame: add an animation to the root layer.
-        AddAnimatedTransformToPlayer(player_.get(), 0.1, 5, 5);
+        AddAnimatedTransformToAnimation(animation_.get(), 0.1, 5, 5);
         break;
       case 2:
         // Second frame: add an animation to the content layer. The root layer
         // animation has caused us to animate already during this frame.
-        AddOpacityTransitionToPlayer(player_child_.get(), 0.1, 5, 5, false);
+        AddOpacityTransitionToAnimation(animation_child_.get(), 0.1, 5, 5,
+                                        false);
         break;
     }
   }
@@ -1403,18 +1407,18 @@
   }
 
   void CheckAnimations(LayerTreeHostImpl* host_impl) {
-    GetImplTimelineAndPlayerByID(*host_impl);
+    GetImplTimelineAndAnimationByID(*host_impl);
 
-    EXPECT_EQ(
-        2u,
-        GetImplAnimationHost(host_impl)->ticking_players_for_testing().size());
+    EXPECT_EQ(2u, GetImplAnimationHost(host_impl)
+                      ->ticking_animations_for_testing()
+                      .size());
 
     KeyframeModel* root_anim =
-        player_impl_->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_impl_->GetKeyframeModel(TargetProperty::TRANSFORM);
     EXPECT_LT(base::TimeTicks(), root_anim->start_time());
 
     KeyframeModel* anim =
-        player_child_impl_->GetKeyframeModel(TargetProperty::OPACITY);
+        animation_child_impl_->GetKeyframeModel(TargetProperty::OPACITY);
     EXPECT_LT(base::TimeTicks(), anim->start_time());
 
     EndTest();
@@ -1439,10 +1443,10 @@
     client_.set_bounds(layer_->bounds());
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
 
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    player_child_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    animation_child_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override {
@@ -1454,12 +1458,12 @@
   void DidCommit() override {
     switch (layer_tree_host()->SourceFrameNumber()) {
       case 1:
-        AddAnimatedTransformToPlayer(player_child_.get(), 1.0, 5, 5);
+        AddAnimatedTransformToAnimation(animation_child_.get(), 1.0, 5, 5);
         break;
       case 2:
         KeyframeModel* keyframe_model =
-            player_child_->GetKeyframeModel(TargetProperty::TRANSFORM);
-        player_child_->RemoveKeyframeModel(keyframe_model->id());
+            animation_child_->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_child_->RemoveKeyframeModel(keyframe_model->id());
         gfx::Transform transform;
         transform.Translate(10.f, 10.f);
         layer_->SetTransform(transform);
@@ -1479,7 +1483,7 @@
   }
 
   void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
-    GetImplTimelineAndPlayerByID(*host_impl);
+    GetImplTimelineAndAnimationByID(*host_impl);
     LayerImpl* child = host_impl->active_tree()->LayerById(layer_->id());
     switch (host_impl->active_tree()->source_frame_number()) {
       case 0:
@@ -1508,7 +1512,7 @@
     if (host_impl->sync_tree()->source_frame_number() >= last_frame_number_) {
       // Check that eventually the animation is removed.
       EXPECT_FALSE(
-          player_child_impl_->keyframe_effect()->has_any_keyframe_model());
+          animation_child_impl_->keyframe_effect()->has_any_keyframe_model());
       EndTest();
     }
   }
@@ -1547,8 +1551,8 @@
     client_.set_bounds(layer_->bounds());
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_->element_id());
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1556,12 +1560,12 @@
   void DidCommit() override {
     switch (layer_tree_host()->SourceFrameNumber()) {
       case 1:
-        AddAnimatedTransformToPlayer(player_.get(), 1.0, 5, 5);
+        AddAnimatedTransformToAnimation(animation_.get(), 1.0, 5, 5);
         break;
       case 2:
         KeyframeModel* keyframe_model =
-            player_->GetKeyframeModel(TargetProperty::TRANSFORM);
-        player_->RemoveKeyframeModel(keyframe_model->id());
+            animation_->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_->RemoveKeyframeModel(keyframe_model->id());
         break;
     }
   }
@@ -1628,17 +1632,17 @@
     client_.set_bounds(layer_->bounds());
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
 
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    player_child_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    animation_child_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
 
   void DidCommit() override {
     if (layer_tree_host()->SourceFrameNumber() == 1)
-      AddAnimatedTransformToPlayer(player_child_.get(), 0.04, 5, 5);
+      AddAnimatedTransformToAnimation(animation_child_.get(), 0.04, 5, 5);
   }
 
   void WillCommit() override {
@@ -1701,17 +1705,17 @@
     client_.set_bounds(layer_->bounds());
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
 
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    player_child_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    animation_child_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
 
   void DidCommit() override {
     if (layer_tree_host()->SourceFrameNumber() == 1)
-      AddAnimatedTransformToPlayer(player_child_.get(), 0.04, 5, 5);
+      AddAnimatedTransformToAnimation(animation_child_.get(), 0.04, 5, 5);
   }
 
   void WillCommit() override {
@@ -1782,13 +1786,13 @@
     client_.set_bounds(picture_->bounds());
     layer_tree_host()->root_layer()->AddChild(picture_);
 
-    AttachPlayersToTimeline();
-    player_->AttachElement(picture_->element_id());
-    player_->set_animation_delegate(this);
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(picture_->element_id());
+    animation_->set_animation_delegate(this);
   }
 
   void BeginTest() override {
-    PostAddLongAnimationToMainThreadPlayer(player_.get());
+    PostAddOpacityAnimationToMainThreadDelayed(animation_.get());
   }
 
   void NotifyAnimationStarted(base::TimeTicks monotonic_time,
@@ -1822,21 +1826,21 @@
     LayerTreeHostAnimationTestNotifyAnimationFinished);
 
 // Check that transform sync happens correctly at commit when we remove and add
-// a different animation player to an element.
-class LayerTreeHostAnimationTestChangeSingleKeyframeEffectAnimationPlayer
+// a different animation animation to an element.
+class LayerTreeHostAnimationTestChangeSingleKeyframeEffectAnimation
     : public LayerTreeHostAnimationTest {
  public:
   void SetupTree() override {
     LayerTreeHostAnimationTest::SetupTree();
-    AttachPlayersToTimeline();
-    timeline_->DetachPlayer(player_child_.get());
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    AttachAnimationsToTimeline();
+    timeline_->DetachAnimation(animation_child_.get());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
 
     TransformOperations start;
     start.AppendTranslate(5.f, 5.f, 0.f);
     TransformOperations end;
     end.AppendTranslate(5.f, 5.f, 0.f);
-    AddAnimatedTransformToPlayer(player_.get(), 1.0, start, end);
+    AddAnimatedTransformToAnimation(animation_.get(), 1.0, start, end);
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1863,15 +1867,15 @@
 
   void WillBeginMainFrame() override {
     if (layer_tree_host()->SourceFrameNumber() == 2) {
-      // Destroy player.
-      timeline_->DetachPlayer(player_.get());
-      player_ = nullptr;
-      timeline_->AttachPlayer(player_child_.get());
-      player_child_->AttachElement(
+      // Destroy animation.
+      timeline_->DetachAnimation(animation_.get());
+      animation_ = nullptr;
+      timeline_->AttachAnimation(animation_child_.get());
+      animation_child_->AttachElement(
           layer_tree_host()->root_layer()->element_id());
-      AddAnimatedTransformToPlayer(player_child_.get(), 1.0, 10, 10);
+      AddAnimatedTransformToAnimation(animation_child_.get(), 1.0, 10, 10);
       KeyframeModel* keyframe_model =
-          player_child_->GetKeyframeModel(TargetProperty::TRANSFORM);
+          animation_child_->GetKeyframeModel(TargetProperty::TRANSFORM);
       keyframe_model->set_start_time(base::TimeTicks::Now() +
                                      base::TimeDelta::FromSecondsD(1000));
       keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
@@ -1882,7 +1886,7 @@
 };
 
 SINGLE_AND_MULTI_THREAD_TEST_F(
-    LayerTreeHostAnimationTestChangeSingleKeyframeEffectAnimationPlayer);
+    LayerTreeHostAnimationTestChangeSingleKeyframeEffectAnimation);
 
 // Check that SetTransformIsPotentiallyAnimatingChanged is called
 // if we destroy ElementAnimations.
@@ -1894,9 +1898,9 @@
     screen_space_transform_animation_stopped_ = false;
 
     LayerTreeHostAnimationTest::SetupTree();
-    AttachPlayersToTimeline();
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    AddAnimatedTransformToPlayer(player_.get(), 1.0, 5, 5);
+    AttachAnimationsToTimeline();
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    AddAnimatedTransformToAnimation(animation_.get(), 1.0, 5, 5);
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1918,9 +1922,9 @@
   void UpdateLayerTreeHost(
       LayerTreeHostClient::VisualStateUpdate requested_update) override {
     if (layer_tree_host()->SourceFrameNumber() == 2) {
-      // Destroy player.
-      timeline_->DetachPlayer(player_.get());
-      player_ = nullptr;
+      // Destroy animation.
+      timeline_->DetachAnimation(animation_.get());
+      animation_ = nullptr;
     }
   }
 
@@ -1968,7 +1972,7 @@
     LayerTreeHostAnimationTestSetPotentiallyAnimatingOnLacDestruction);
 
 // Check that we invalidate property trees on
-// SingleKeyframeEffectAnimationPlayer::SetNeedsCommit.
+// SingleKeyframeEffectAnimation::SetNeedsCommit.
 class LayerTreeHostAnimationTestRebuildPropertyTreesOnAnimationSetNeedsCommit
     : public LayerTreeHostAnimationTest {
  public:
@@ -1979,10 +1983,10 @@
     client_.set_bounds(layer_->bounds());
     layer_tree_host()->root_layer()->AddChild(layer_);
 
-    AttachPlayersToTimeline();
+    AttachAnimationsToTimeline();
 
-    player_->AttachElement(layer_tree_host()->root_layer()->element_id());
-    player_child_->AttachElement(layer_->element_id());
+    animation_->AttachElement(layer_tree_host()->root_layer()->element_id());
+    animation_child_->AttachElement(layer_->element_id());
   }
 
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -1997,7 +2001,7 @@
       LayerTreeHostClient::VisualStateUpdate requested_update) override {
     if (layer_tree_host()->SourceFrameNumber() == 1) {
       EXPECT_FALSE(layer_tree_host()->property_trees()->needs_rebuild);
-      AddAnimatedTransformToPlayer(player_child_.get(), 1.0, 5, 5);
+      AddAnimatedTransformToAnimation(animation_child_.get(), 1.0, 5, 5);
     }
 
     EXPECT_TRUE(layer_tree_host()->property_trees()->needs_rebuild);
diff --git a/cc/trees/layer_tree_mutator.h b/cc/trees/layer_tree_mutator.h
index 053f353..70cf3fc 100644
--- a/cc/trees/layer_tree_mutator.h
+++ b/cc/trees/layer_tree_mutator.h
@@ -22,10 +22,10 @@
 // name and options dictionary are used just for construction.
 struct CC_EXPORT MutatorInputState {
   struct CC_EXPORT AnimationState {
-    int animation_player_id = 0;
-    // Name associated with worklet animation player.
+    int animation_id = 0;
+    // Name associated with worklet animation.
     std::string name;
-    // Worklet animation player's current time, from its associated timeline.
+    // Worklet animation's current time, from its associated timeline.
     double current_time = 0;
   };
 
@@ -37,7 +37,7 @@
 
 struct CC_EXPORT MutatorOutputState {
   struct CC_EXPORT AnimationState {
-    int animation_player_id = 0;
+    int animation_id = 0;
     // The animator effect's local time.
     // TODO(majidvp): This assumes each animator has a single output effect
     // which does not hold once we state support group effects.
diff --git a/chrome/VERSION b/chrome/VERSION
index 4ed2876f7..df55ef6d 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=66
 MINOR=0
-BUILD=3351
+BUILD=3353
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index a8d460cb..00d5095 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -201,6 +201,7 @@
     "//components/autofill/android:autofill_java",
     "//components/background_task_scheduler:background_task_scheduler_java",
     "//components/bookmarks/common/android:bookmarks_java",
+    "//components/content_view:content_view_java",
     "//components/crash/android:java",
     "//components/dom_distiller/content/browser/android:dom_distiller_content_java",
     "//components/dom_distiller/core/android:dom_distiller_core_java",
@@ -770,8 +771,8 @@
       deps += [ "//tools/cygprofile" ]
     }
 
-    # See crbug.com/705088.
-    if (target_cpu == "arm" && is_asan) {
+    # See crbug.com/705088, crbug.com/717815.
+    if (target_cpu == "arm" && (is_asan || use_order_profiling)) {
       ldflags = [ "-Wl,--long-plt" ]
     }
 
diff --git a/chrome/android/android.ensure b/chrome/android/android.ensure
new file mode 100644
index 0000000..dc23627
--- /dev/null
+++ b/chrome/android/android.ensure
@@ -0,0 +1,15 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Chromium-specific dependencies for Android target OS.
+
+# -crX indicates the chromium-specific revision of a package at a given version.
+
+@Subdir chrome/android/profiles
+chromium/afdo/profiles/android version:3309
+
+# Three unchanging lines
+# avoid the horror that is
+# endless merge conflicts
+
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS
index 4eff9de..c14e5c87 100644
--- a/chrome/android/java/DEPS
+++ b/chrome/android/java/DEPS
@@ -2,6 +2,7 @@
   "+components/autofill/android/java/src/org/chromium/components/autofill",
   "+components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler",
   "+components/bookmarks/common/android/java/src/org/chromium/components/bookmarks",
+  "+components/content_view",
   "+components/crash/android/java",
   "+components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content",
   "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core",
@@ -27,7 +28,6 @@
   "!content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java",
   "!content/public/android/java/src/org/chromium/content/browser/ContentVideoViewEmbedder.java",
   "!content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java",
-  "!content/public/android/java/src/org/chromium/content/browser/ContentView.java",
   "!content/public/android/java/src/org/chromium/content/browser/crypto/ByteArrayGenerator.java",
   "!content/public/android/java/src/org/chromium/content/browser/crypto/CipherFactory.java",
   "!content/public/android/java/src/org/chromium/content/browser/DeviceUtils.java",
diff --git a/chrome/android/java/res/layout/location_bar_base.xml b/chrome/android/java/res/layout/location_bar_base.xml
index ca02fe3..6576739 100644
--- a/chrome/android/java/res/layout/location_bar_base.xml
+++ b/chrome/android/java/res/layout/location_bar_base.xml
@@ -55,16 +55,17 @@
         android:nextFocusForward="@+id/tab_switcher_button"
         layout="@layout/url_bar" />
 
-    <FrameLayout android:id="@+id/url_action_container"
-        android:layout_width="@dimen/location_bar_icon_width"
+    <LinearLayout android:id="@+id/url_action_container"
+        android:layout_width="wrap_content"
         android:layout_height="@dimen/toolbar_height_no_shadow"
         android:layout_gravity="end|center_vertical"
+        android:orientation="horizontal"
         android:visibility="gone" >
 
         <org.chromium.chrome.browser.widget.TintedImageButton
             android:id="@+id/delete_button"
             style="@style/LocationBarButton"
-            android:layout_width="match_parent"
+            android:layout_width="@dimen/location_bar_icon_width"
             android:layout_height="match_parent"
             android:scaleType="center"
             android:src="@drawable/btn_delete_24dp"
@@ -74,12 +75,13 @@
         <org.chromium.chrome.browser.widget.TintedImageButton
             android:id="@+id/mic_button"
             style="@style/LocationBarButton"
-            android:layout_width="match_parent"
+            android:layout_width="@dimen/location_bar_icon_width"
             android:layout_height="match_parent"
             android:scaleType="center"
             android:src="@drawable/btn_mic"
             android:visibility="invisible"
             android:contentDescription="@string/accessibility_toolbar_btn_mic" />
 
-    </FrameLayout>
+    </LinearLayout>
+
 </merge>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index a7e6bc78..34a78782 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -18,6 +18,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.StrictMode;
 import android.os.SystemClock;
@@ -130,6 +131,7 @@
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.browser.util.FeatureUtilities;
+import org.chromium.chrome.browser.vr_shell.OnExitVrRequestListener;
 import org.chromium.chrome.browser.vr_shell.VrIntentUtils;
 import org.chromium.chrome.browser.vr_shell.VrShellDelegate;
 import org.chromium.chrome.browser.webapps.AddToHomescreenManager;
@@ -2244,4 +2246,41 @@
         ControlContainer controlContainer = (ControlContainer) findViewById(R.id.control_container);
         controlContainer.getToolbarResourceAdapter().dropCachedBitmap();
     }
+
+    @Override
+    public void startActivity(Intent intent) {
+        startActivity(intent, null);
+    }
+
+    @Override
+    public void startActivity(Intent intent, Bundle options) {
+        if (!VrShellDelegate.isInVr() || VrIntentUtils.isVrIntent(intent)) {
+            super.startActivity(intent, options);
+            return;
+        }
+        VrShellDelegate.requestToExitVr(new OnExitVrRequestListener() {
+            @Override
+            public void onSucceeded() {
+                if (VrShellDelegate.isInVr()) {
+                    throw new IllegalStateException("Still in VR after having exited VR.");
+                }
+                startActivity(intent, options);
+            }
+
+            @Override
+            public void onDenied() {}
+        });
+    }
+
+    @Override
+    public boolean startActivityIfNeeded(Intent intent, int requestCode) {
+        return startActivityIfNeeded(intent, requestCode, null);
+    }
+
+    @Override
+    public boolean startActivityIfNeeded(Intent intent, int requestCode, Bundle options) {
+        // Avoid starting Activities when possible while in VR.
+        if (VrShellDelegate.isInVr() && !VrIntentUtils.isVrIntent(intent)) return false;
+        return super.startActivityIfNeeded(intent, requestCode, options);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
index fbafd8e..1b44b9c3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
@@ -7,6 +7,8 @@
 import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
@@ -33,6 +35,9 @@
 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelSelector;
 import org.chromium.chrome.browser.tabmodel.document.StorageDelegate;
 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
+import org.chromium.chrome.browser.vr_shell.OnExitVrRequestListener;
+import org.chromium.chrome.browser.vr_shell.VrIntentUtils;
+import org.chromium.chrome.browser.vr_shell.VrShellDelegate;
 
 /**
  * Basic application functionality that should be shared among all browser applications that use
@@ -151,4 +156,30 @@
         }
         return mReferencePool;
     }
+
+    @Override
+    public void startActivity(Intent intent) {
+        startActivity(intent, null);
+    }
+
+    @Override
+    public void startActivity(Intent intent, Bundle options) {
+        if (!VrShellDelegate.isInVr() || VrIntentUtils.isVrIntent(intent)) {
+            super.startActivity(intent, options);
+            return;
+        }
+
+        VrShellDelegate.requestToExitVr(new OnExitVrRequestListener() {
+            @Override
+            public void onSucceeded() {
+                if (VrShellDelegate.isInVr()) {
+                    throw new IllegalStateException("Still in VR after having exited VR.");
+                }
+                startActivity(intent, options);
+            }
+
+            @Override
+            public void onDenied() {}
+        });
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index 92ee8710..e38aab5a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -236,6 +236,8 @@
     public static final String OFFLINE_PAGES_DESCRIPTIVE_PENDING_STATUS =
             "OfflinePagesDescriptivePendingStatus";
     public static final String OMNIBOX_SPARE_RENDERER = "OmniboxSpareRenderer";
+    public static final String OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE =
+            "OmniboxVoiceSearchAlwaysVisible";
     public static final String PAY_WITH_GOOGLE_V1 = "PayWithGoogleV1";
     public static final String PASSWORD_SEARCH = "PasswordSearchMobile";
     public static final String PROGRESS_BAR_THROTTLE = "ProgressBarThrottle";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
index c42fe46..075c2c5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
@@ -10,6 +10,7 @@
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
@@ -92,7 +93,12 @@
             if (!TextUtils.equals(mIconDescription, iconDescription)) return false;
 
             if (icon == null ^ mIcon == null) return false;
-            if (mIcon != null && !mIcon.getConstantState().equals(icon.getConstantState())) {
+
+            // On Android O and above, Drawable#getConstantState() always returns a different value,
+            // so it does not make sense to compare it.
+            // TODO(crbug.com/773043): Find a way to compare the icons.
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O && mIcon != null
+                    && !mIcon.getConstantState().equals(icon.getConstantState())) {
                 return false;
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
index 9fbed727..cc5e0f1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -17,11 +17,11 @@
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
 import org.chromium.components.navigation_interception.NavigationParams;
 import org.chromium.components.web_contents_delegate_android.WebContentsDelegateAndroid;
 import org.chromium.content.browser.ContentVideoViewEmbedder;
-import org.chromium.content.browser.ContentView;
 import org.chromium.content_public.browser.ContentViewCore;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PwaAmbientBadgeInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/infobar/PwaAmbientBadgeInfoBar.java
rename to chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
index a31bbb3f..31b4738 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PwaAmbientBadgeInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
@@ -23,13 +23,13 @@
 /**
  * An ambient infobar to tell the user that the current site they are visiting is a PWA.
  */
-public class PwaAmbientBadgeInfoBar extends InfoBar implements View.OnClickListener {
+public class InstallableAmbientBadgeInfoBar extends InfoBar implements View.OnClickListener {
     private boolean mIsHiding;
 
     @CalledByNative
     private static InfoBar show(int enumeratedIconId, Bitmap iconBitmap) {
         int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
-        return new PwaAmbientBadgeInfoBar(drawableId, iconBitmap);
+        return new InstallableAmbientBadgeInfoBar(drawableId, iconBitmap);
     }
 
     @Override
@@ -81,9 +81,9 @@
      * @param iconBitmap        Bitmap of the icon to display in the infobar
      * @param messageText       Message to display in the infobar.
      */
-    private PwaAmbientBadgeInfoBar(int iconDrawableId, Bitmap iconBitmap) {
+    private InstallableAmbientBadgeInfoBar(int iconDrawableId, Bitmap iconBitmap) {
         super(iconDrawableId, iconBitmap, null);
     }
 
-    private native void nativeAddToHomescreen(long nativePwaAmbientBadgeInfoBar);
+    private native void nativeAddToHomescreen(long nativeInstallableAmbientBadgeInfoBar);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/infobar/OWNERS
index 18f8e9d3..9ec990e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/OWNERS
@@ -3,6 +3,6 @@
 
 per-file AppBannerInfoBar*=dominickn@chromium.org
 per-file GeneratedPasswordSavedInfoBar*=rouslan@chromium.org
-per-file PwaAmbientBadgeInfoBar*=dominickn@chromium.org
+per-file InstallableAmbientBadgeInfoBar*=dominickn@chromium.org
 
 # COMPONENT: UI>Browser>Infobars
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
index fe2eb4b0..e75de7d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
@@ -22,7 +22,6 @@
 import org.chromium.chrome.browser.ntp.IncognitoNewTabPageView.IncognitoNewTabPageManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.vr_shell.OnExitVrRequestListener;
-import org.chromium.chrome.browser.vr_shell.UiUnsupportedMode;
 import org.chromium.chrome.browser.vr_shell.VrShellDelegate;
 
 /**
@@ -54,7 +53,7 @@
 
                     @Override
                     public void onDenied() {}
-                }, UiUnsupportedMode.UNHANDLED_CODE_POINT);
+                });
                 return;
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
index 418fd5b..1442dcab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -44,7 +44,6 @@
 import org.chromium.chrome.browser.suggestions.Tile;
 import org.chromium.chrome.browser.suggestions.TileGroup;
 import org.chromium.chrome.browser.suggestions.TileGroupDelegateImpl;
-import org.chromium.chrome.browser.sync.SyncSessionsMetrics;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
@@ -228,8 +227,6 @@
             NewTabPageUma.recordNTPImpression(NewTabPageUma.NTP_IMPRESSION_REGULAR);
             // If not visible when loading completes, wait until onShown is received.
             if (!mTab.isHidden()) recordNTPShown();
-
-            SyncSessionsMetrics.recordYoungestForeignTabAgeOnNTP();
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java
index 5a5221a..35c85d5e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/AllDismissedItem.java
@@ -64,7 +64,7 @@
             super(LayoutInflater.from(root.getContext()).inflate(getLayout(), root, false));
             mBodyTextView = itemView.findViewById(R.id.body_text);
 
-            if (!FeatureUtilities.isChromeHomeEnabled()) {
+            if (!SuggestionsConfig.useModernLayout()) {
                 itemView.findViewById(R.id.action_button).setOnClickListener(v -> {
                     NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_ALL_DISMISSED_REFRESH);
                     sections.restoreDismissedSections();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 040eb71..5687f18 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -374,9 +374,11 @@
         final String tabUrl = tab.getUrl();
         final File offlinePageFile = new File(offlinePage.getFilePath());
         AsyncTask<Void, Void, Uri> task = new AsyncTask<Void, Void, Uri>() {
+            @Override
             protected Uri doInBackground(Void... v) {
                 return ChromeFileProvider.generateUri(activity, offlinePageFile);
             }
+            @Override
             protected void onPostExecute(Uri uri) {
                 ShareParams shareParams = new ShareParams.Builder(activity, tabTitle, tabUrl)
                                                   .setShareDirectly(false)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index f0c308e..5746f0c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -59,6 +59,7 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.NativePage;
 import org.chromium.chrome.browser.UrlConstants;
@@ -241,6 +242,9 @@
 
     private WebContentsObserver mVoiceSearchWebContentsObserver;
 
+    private boolean mOmniboxVoiceSearchAlwaysVisible;
+    protected float mUrlFocusChangePercent;
+
     private static abstract class DeferredOnSelectionRunnable implements Runnable {
         protected final OmniboxSuggestion mSuggestion;
         protected final int mPosition;
@@ -890,6 +894,10 @@
         mDeferredNativeRunnables.clear();
 
         updateVisualsForState();
+
+        mOmniboxVoiceSearchAlwaysVisible =
+                ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE);
+        updateMicButtonVisibility(mUrlFocusChangePercent);
     }
 
     /**
@@ -2525,13 +2533,13 @@
 
     /**
      * Updates the display of the mic button.
-     * @param urlFocusChangePercent The completeion percentage of the URL focus change animation.
+     *
+     * @param urlFocusChangePercent The completion percentage of the URL focus change animation.
      */
     protected void updateMicButtonVisibility(float urlFocusChangePercent) {
-        boolean visible = !shouldShowDeleteButton();
+        boolean visible = mOmniboxVoiceSearchAlwaysVisible || !shouldShowDeleteButton();
         boolean showMicButton = mVoiceSearchEnabled && visible
-                && (mUrlBar.hasFocus() || mUrlFocusChangeInProgress
-                        || urlFocusChangePercent > 0f);
+                && (mUrlBar.hasFocus() || mUrlFocusChangeInProgress || urlFocusChangePercent > 0f);
         mMicButton.setVisibility(showMicButton ? VISIBLE : GONE);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
index 9ec22b0..31e1f006 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarPhone.java
@@ -51,7 +51,7 @@
     private int mIncognitoBadgePadding;
     private int mGoogleGWidth;
     private int mGoogleGMargin;
-    private float mUrlFocusChangePercent;
+
     private Runnable mKeyboardResizeModeTask;
     private ObjectAnimator mOmniboxBackgroundAnimator;
     private boolean mCloseSheetOnBackButton;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
index 0149aee..4bf46df 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
@@ -80,7 +80,6 @@
     private View mLocationBarIcon;
     private View mBookmarkButton;
     private View mSaveOfflineButton;
-    private float mUrlFocusChangePercent;
     private Animator mUrlFocusChangeAnimator;
     private View[] mTargets;
     private final Rect mCachedTargetBounds = new Rect();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java
deleted file mode 100644
index 9832a2c1..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java
+++ /dev/null
@@ -1,23 +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.
-
-package org.chromium.chrome.browser.sync;
-
-/**
- * A bridge to call sync sessions metrics logic.
- */
-public final class SyncSessionsMetrics {
-    private SyncSessionsMetrics() {}
-
-    /*
-     * Records a metric based on the youngest foreign tab. Should be called
-     * exactly once per NTP load.
-     */
-    public static void recordYoungestForeignTabAgeOnNTP() {
-        nativeRecordYoungestForeignTabAgeOnNTP();
-    }
-
-    // Native methods
-    private static native void nativeRecordYoungestForeignTabAgeOnNTP();
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
index f00e01d..48805a135 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -120,4 +120,7 @@
 
     @Override
     public void onInteractabilityChanged(boolean isInteractable) {}
+
+    @Override
+    public void onNavigationEntriesDeleted(Tab tab) {}
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index 53d3f0fb..f73d005 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -96,6 +96,7 @@
 import org.chromium.chrome.browser.vr_shell.VrShellDelegate;
 import org.chromium.chrome.browser.widget.PulseDrawable;
 import org.chromium.chrome.browser.widget.textbubble.TextBubble;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.FeatureConstants;
@@ -103,7 +104,6 @@
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.sync.SyncConstants;
-import org.chromium.content.browser.ContentView;
 import org.chromium.content.browser.crypto.CipherFactory;
 import org.chromium.content_public.browser.ChildProcessImportance;
 import org.chromium.content_public.browser.ContentViewCore;
@@ -2537,6 +2537,14 @@
     }
 
     /**
+     * Called when navigation entries were removed.
+     */
+    void notifyNavigationEntriesDeleted() {
+        mIsTabStateDirty = true;
+        for (TabObserver observer : mObservers) observer.onNavigationEntriesDeleted(this);
+    }
+
+    /**
      * Returns the SnackbarManager for the activity that owns this Tab, if any. May
      * return null.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
index d0521a3..8a8a4c5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -297,4 +297,10 @@
      * @param isInteractable Whether or not the tab is interactable.
      */
     public void onInteractabilityChanged(boolean isInteractable);
+
+    /**
+     * Called when navigation entries of a tab have been deleted.
+     * @param tab The notifying {@link Tab}.
+     */
+    public void onNavigationEntriesDeleted(Tab tab);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
index ac97013..e9b2439c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -283,6 +283,11 @@
     }
 
     @Override
+    public void navigationEntriesDeleted() {
+        mTab.notifyNavigationEntriesDeleted();
+    }
+
+    @Override
     public void destroy() {
         MediaCaptureNotificationService.updateMediaNotificationForTab(
                 mTab.getApplicationContext(), mTab.getId(), 0, mTab.getUrl());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
index ef9d878..4b6aee61 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -195,6 +195,11 @@
                 }
                 mUma.onTabCrashed(tab.getId());
             }
+
+            @Override
+            public void onNavigationEntriesDeleted(Tab tab) {
+                mTabSaver.addTabToSaveQueue(tab);
+            }
         };
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index a20bde0..4e22f33 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -502,6 +502,13 @@
                 }
             }
 
+            @Override
+            public void onNavigationEntriesDeleted(Tab tab) {
+                if (tab == mToolbarModel.getTab()) {
+                    updateButtonStatus();
+                }
+            }
+
             private void handleIPHForSuccessfulPageLoad(final Tab tab) {
                 if (mTextBubble != null) {
                     mTextBubble.dismiss();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java
index 9691cd0..c6b077f2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDialog.java
@@ -43,6 +43,7 @@
      */
     public void initVrDialog() {
         addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+            @Override
             public void onLayoutChange(View v, int left, int top, int right, int bottom,
                     int oldLeft, int oldTop, int oldRight, int oldBottom) {
                 mVrDialogManager.setDialogSize(getWidth(), getHeight());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrExternalNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrExternalNavigationDelegate.java
deleted file mode 100644
index e953a19..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrExternalNavigationDelegate.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.vr_shell;
-
-import android.content.Intent;
-
-import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
-import org.chromium.chrome.browser.tab.Tab;
-
-/**
- * A custom external navigation delegate that show DOFF instead of sending intent to external app.
- */
-public class VrExternalNavigationDelegate extends ExternalNavigationDelegateImpl {
-    public VrExternalNavigationDelegate(Tab tab) {
-        super(tab);
-    }
-
-    @Override
-    public void startActivity(Intent intent, boolean proxy) {
-        VrShellDelegate.showDoffAndExitVr(false);
-    }
-
-    @Override
-    public boolean startActivityIfNeeded(Intent intent, boolean proxy) {
-        return false;
-    }
-
-    @Override
-    public boolean startIncognitoIntent(Intent intent, String referrerUrl, String fallbackUrl,
-            Tab tab, boolean needsToCloseTab, boolean proxy) {
-        VrShellDelegate.showDoffAndExitVr(false);
-        return true;
-    }
-
-    @Override
-    public void startFileIntent(
-            Intent intent, String referrerUrl, Tab tab, boolean needsToCloseTab) {
-        VrShellDelegate.showDoffAndExitVr(false);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
index dd46921d..5e7d09b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
@@ -80,4 +80,9 @@
      *  Triggers VrShell to navigate backward.
      */
     void navigateBack();
+
+    /**
+     * Simulates a user accepting the currently visible DOFF prompt.
+     */
+    void acceptDoffPromptForTesting();
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
index 328324fb..280c921 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -155,6 +155,7 @@
     // Best effort whether or not the system was in VR when Chrome launched.
     private Boolean mInVrAtChromeLaunch;
     private boolean mShowingDaydreamDoff;
+    private boolean mShowingExitVrPrompt;
     private boolean mDoffOptional;
     // Listener to be called once we exited VR due to to an unsupported mode, e.g. the user clicked
     // the URL bar security icon.
@@ -452,16 +453,15 @@
         }
     }
 
-    public static void showDoffAndExitVr(boolean optional) {
-        assert sInstance != null;
-        sInstance.showDoffAndExitVrInternal(optional);
+    public static void requestToExitVr(OnExitVrRequestListener listener) {
+        requestToExitVr(listener, UiUnsupportedMode.GENERIC_UNSUPPORTED_FEATURE);
     }
 
     public static void requestToExitVr(
             OnExitVrRequestListener listener, @UiUnsupportedMode int reason) {
-        assert listener != null;
-        if (sInstance == null) {
-            listener.onDenied();
+        // If we're not in VR, just say that we've successfully exited VR.
+        if (sInstance == null || !sInstance.mInVr) {
+            listener.onSucceeded();
             return;
         }
         sInstance.requestToExitVrInternal(listener, reason);
@@ -1239,12 +1239,13 @@
     private void requestToExitVrInternal(
             OnExitVrRequestListener listener, @UiUnsupportedMode int reason) {
         assert listener != null;
-        // If we are currently processing another request or we are not in VR, deny the request.
-        if (sInstance.mOnExitVrRequestListener != null || !sInstance.mInVr) {
+        // If we are currently processing another request, deny the request.
+        if (mOnExitVrRequestListener != null) {
             listener.onDenied();
             return;
         }
         mOnExitVrRequestListener = listener;
+        mShowingExitVrPrompt = true;
         mVrShell.requestToExitVr(reason);
     }
 
@@ -1456,23 +1457,29 @@
         return true;
     }
 
-    private boolean showDoff(boolean optional) {
+    /**
+     * @return Whether the user is currently seeing the DOFF screen.
+     */
+    /* package */ boolean showDoff(boolean optional) {
+        assert !mShowingDaydreamDoff;
         if (!isDaydreamCurrentViewer()) return false;
-        if (mAutopresentWebVr) {
-            // To avoid taking the user out of VR mode when started for auto-presentation, just
-            // bail to Daydream if we're being asked to show DOFF and exit.
-            mVrDaydreamApi.launchVrHomescreen();
-            return true;
+
+        // To avoid taking the user out of VR mode when started for auto-presentation, never show
+        // DOFF and bail to Daydream if we're forced to leave Chrome.
+        if (!mAutopresentWebVr) {
+            try {
+                if (mVrDaydreamApi.exitFromVr(EXIT_VR_RESULT, new Intent())) {
+                    mShowingDaydreamDoff = true;
+                    mDoffOptional = optional;
+                    return true;
+                }
+            } catch (IllegalArgumentException | SecurityException e) {
+                // DOFF calls can unpredictably throw exceptions if VrCore doesn't think Chrome is
+                // the active component, for example.
+            }
         }
-        try {
-            if (!mVrDaydreamApi.exitFromVr(EXIT_VR_RESULT, new Intent())) return false;
-        } catch (IllegalArgumentException e) {
-            mVrDaydreamApi.launchVrHomescreen();
-            return true;
-        }
-        mShowingDaydreamDoff = true;
-        mDoffOptional = optional;
-        return true;
+        if (!optional) mVrDaydreamApi.launchVrHomescreen();
+        return false;
     }
 
     private void onExitVrResult(boolean success) {
@@ -1483,20 +1490,18 @@
         // real DOFF flow calls us back.
         if (!mShowingDaydreamDoff) return;
 
-        // If Doff is not optional and user backed out, keep trying to exit.
-        if (!mDoffOptional && !success && showDoff(false /* optional */)) return;
+        // If Doff is not optional and user backed out, launch DD home. We can't re-trigger doff
+        // here because we're not yet the active VR component and Daydream will throw a Security
+        // Exception.
+        if (!mDoffOptional && !success) mVrDaydreamApi.launchVrHomescreen();
 
         mShowingDaydreamDoff = false;
         if (success) {
-            // If DOFF didn't succeed(for example, user clicked back button at DOFF screen), we
-            // don't know if user really intends to exit VR or not at this point. So we shouldn't
-            // call callOnExitVrRequestListener to tell the listener that the exit VR request has
-            // succeeded or been denied.
-            callOnExitVrRequestListener(success);
             shutdownVr(true /* disableVrMode */, !mExitingCct /* stayingInChrome */);
             if (mExitingCct) ((CustomTabActivity) mActivity).finishAndClose(false);
         }
         mExitingCct = false;
+        callOnExitVrRequestListener(success);
     }
 
     private boolean isDaydreamCurrentViewer() {
@@ -1570,11 +1575,9 @@
 
         promptForFeedbackIfNeeded(stayingInChrome);
 
-        // Listener may not have been handled yet at this point due to other reasons (e.g back/close
-        // button was pressed while at exit prompt UI in VR), failure should be reported despite
-        // that we are exiting VR.
-        callOnExitVrRequestListener(false);
-        assert mOnExitVrRequestListener == null;
+        // User exited VR (via something like the system back button) while looking at the exit VR
+        // prompt.
+        if (mShowingExitVrPrompt) callOnExitVrRequestListener(true);
 
         for (VrModeObserver observer : sVrModeObservers) observer.onExitVr();
     }
@@ -1590,34 +1593,24 @@
         mOnExitVrRequestListener = null;
     }
 
-    private void showDoffAndExitVrInternal(boolean optional) {
-        if (mShowingDaydreamDoff) return;
-        if (showDoff(optional)) return;
-        shutdownVr(true /* disableVrMode */, true /* stayingInChrome */);
-    }
-
     /* package */ void onExitVrRequestResult(boolean shouldExit) {
         assert mOnExitVrRequestListener != null;
+        mShowingExitVrPrompt = false;
         if (shouldExit) {
             mExitedDueToUnsupportedMode = true;
-            showDoffAndExitVrInternal(true);
+            if (!showDoff(true /* optional */)) callOnExitVrRequestListener(false);
         } else {
             callOnExitVrRequestListener(false);
         }
     }
 
-    /* package */ void exitCct() {
-        if (mShowingDaydreamDoff) return;
+    /* package */ void exitCctFromUi() {
         CustomTabActivity customTabActivity = (CustomTabActivity) mActivity;
-        if (mAutopresentWebVr || (mInVrAtChromeLaunch != null && mInVrAtChromeLaunch)) {
+        if (!isDaydreamCurrentViewer() || (mInVrAtChromeLaunch != null && mInVrAtChromeLaunch)) {
             customTabActivity.finishAndClose(false);
             return;
         }
-        if (showDoff(true /* optional */)) {
-            mExitingCct = true;
-        } else {
-            customTabActivity.finishAndClose(false);
-        }
+        if (showDoff(true /* optional */)) mExitingCct = true;
     }
 
     /**
@@ -1654,7 +1647,7 @@
         if (!mAutopresentWebVr) return false;
         // Should only autopresent CustomTabActivity for now.
         assert mActivity instanceof CustomTabActivity;
-        exitCct();
+        ((CustomTabActivity) mActivity).finishAndClose(false);
         return true;
     }
 
@@ -1859,6 +1852,14 @@
         return mDonSucceeded;
     }
 
+    protected boolean isShowingDoff() {
+        return mShowingDaydreamDoff;
+    }
+
+    protected void acceptDoffPromptForTesting() {
+        mVrShell.acceptDoffPromptForTesting();
+    }
+
     /**
      * @return Pointer to the native VrShellDelegate object.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
index 949d36e..14b232d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -35,7 +35,6 @@
 import org.chromium.chrome.browser.modaldialog.ModalDialogManager;
 import org.chromium.chrome.browser.page_info.PageInfoPopup;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
-import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tab.TabRedirectHandler;
@@ -96,7 +95,6 @@
 
     private boolean mReprojectedRendering;
 
-    private InterceptNavigationDelegateImpl mNonVrInterceptNavigationDelegate;
     private TabRedirectHandler mNonVrTabRedirectHandler;
 
     private TabModelSelector mTabModelSelector;
@@ -390,9 +388,6 @@
 
     private void initializeTabForVR() {
         if (mTab == null) return;
-        mNonVrInterceptNavigationDelegate = mTab.getInterceptNavigationDelegate();
-        mTab.setInterceptNavigationDelegate(
-                new InterceptNavigationDelegateImpl(new VrExternalNavigationDelegate(mTab), mTab));
         // Make sure we are not redirecting to another app, i.e. out of VR mode.
         mNonVrTabRedirectHandler = mTab.getTabRedirectHandler();
         mTab.setTabRedirectHandler(mTabRedirectHandler);
@@ -420,7 +415,6 @@
 
     private void restoreTabFromVR() {
         if (mTab == null) return;
-        mTab.setInterceptNavigationDelegate(mNonVrInterceptNavigationDelegate);
         mTab.setTabRedirectHandler(mNonVrTabRedirectHandler);
         mNonVrTabRedirectHandler = null;
         uninitializeImeForVr();
@@ -453,7 +447,7 @@
     // Exits VR, telling the user to remove their headset, and returning to Chromium.
     @CalledByNative
     public void forceExitVr() {
-        VrShellDelegate.showDoffAndExitVr(false);
+        mDelegate.showDoff(false);
     }
 
     // Called because showing PageInfo isn't supported in VR. This happens when the user clicks on
@@ -504,7 +498,7 @@
     // Exits CCT, returning to the app that opened it.
     @CalledByNative
     public void exitCct() {
-        mDelegate.exitCct();
+        mDelegate.exitCctFromUi();
     }
 
     // Close the current hosted Dialog in VR
@@ -973,6 +967,11 @@
                 mNativeVrShell, selectionStart, selectionEnd, compositionStart, compositionEnd);
     }
 
+    @Override
+    public void acceptDoffPromptForTesting() {
+        nativeAcceptDoffPromptForTesting(mNativeVrShell);
+    }
+
     private native long nativeInit(VrShellDelegate delegate, boolean forWebVR,
             boolean webVrAutopresentationExpected, boolean inCct, boolean browsingDisabled,
             boolean hasOrCanRequestAudioPermission, long gvrApi, boolean reprojectedRendering,
@@ -1010,4 +1009,5 @@
     private native void nativeShowSoftInput(long nativeVrShell, boolean show);
     private native void nativeUpdateWebInputIndices(long nativeVrShell, int selectionStart,
             int selectionEnd, int compositionStart, int compositionEnd);
+    private native void nativeAcceptDoffPromptForTesting(long nativeVrShell);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/keyboard/KeyboardEdit.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/keyboard/KeyboardEdit.java
index 9539bf2..ff37d40 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/keyboard/KeyboardEdit.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/keyboard/KeyboardEdit.java
@@ -32,6 +32,7 @@
         mNewCursorPosition = newCursorPosition;
     }
 
+    @Override
     public String toString() {
         return String.format(Locale.US, "KeyboardEdit {[%d] Text[%s] Cursor[%d]}", mType, mText,
                 mNewCursorPosition);
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index be9e8fc..47a17dae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Тук ще се показват отметките, които сте запазили на другите си устройства.</translation>
 <translation id="1113597929977215864">Показване на опростения изглед</translation>
 <translation id="1121094540300013208">Отчети за употребата и сигнали за сривове</translation>
+<translation id="1129510026454351943">Подробности: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Изтриване на съществуващите данни.</translation>
 <translation id="1146678959555564648">Вход във VR</translation>
 <translation id="116280672541001035">Използвани</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Разрешаване на сайтовете да възпроизвеждат звук (препоръчително)</translation>
 <translation id="1670399744444387456">Основни</translation>
 <translation id="1671236975893690980">Предстои изтегляне…</translation>
+<translation id="1672586136351118594">Да не се показва отново</translation>
 <translation id="1674523662097951983">„Отметки“ ще се премести. Следващия път издърпайте адресната лента нагоре.</translation>
 <translation id="169033420419426091">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради липсваща SD карта.</translation>
 <translation id="1709438864123551175">Икономия на данни</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Остава 1 час</translation>
 <translation id="5127805178023152808">Синхронизирането е изключено</translation>
 <translation id="5129038482087801250">Инстал. на уеб приложението</translation>
+<translation id="5139940364318403933">Научете как да използвате Google Диск</translation>
 <translation id="515227803646670480">Изчистване на съхраняваните данни</translation>
 <translation id="5152843274749979095">Никое от поддържаните приложения не е инсталирано</translation>
 <translation id="5161254044473106830">Изисква се заглавие</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Блокиране за някои сайтове</translation>
 <translation id="7253272406652746122">Добавете профил в Google от страницата „Профили“ в приложението Настройки на устройството ви.</translation>
 <translation id="7274013316676448362">Блокиран сайт</translation>
+<translation id="729975465115245577">На устройството ви няма приложение за съхраняване на файла с паролите.</translation>
 <translation id="7318797029885648322">Докоснете „Още“, за да получите статии</translation>
 <translation id="7333031090786104871">Още се добавя предишният сайт</translation>
 <translation id="7352939065658542140">ВИДЕОКЛИП</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Помощ</translation>
 <translation id="7658239707568436148">Отказ</translation>
 <translation id="7665369617277396874">Добавяне на профил</translation>
+<translation id="7682724950699840886">Изпробвайте следните съвети: Уверете се, че има достатъчно място на устройството ви. Опитайте отново да експортирате.</translation>
 <translation id="7698359219371678927">Създайте имейл в <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Страниците на <ph name="SOURCE_LANGUAGE" /> да се превеждат винаги</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Показване на пълната история</translation>
 <translation id="8428213095426709021">Настройки</translation>
 <translation id="8441146129660941386">Придвижване назад</translation>
+<translation id="8445448999790540984">Паролите не могат да бъдат експортирани</translation>
 <translation id="8447861592752582886">Отмяна на разрешението за достъп до устройството</translation>
 <translation id="8487700953926739672">Налице офлайн</translation>
 <translation id="8489271220582375723">Отваряне на страницата „История“</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 2332a6b..8d79c9c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Les adreces d'interès desades als altres dispositius es mostraran aquí.</translation>
 <translation id="1113597929977215864">Mostra la visualització simplificada</translation>
 <translation id="1121094540300013208">Informes d'ús i d'error</translation>
+<translation id="1129510026454351943">Detalls: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Suprimeix les dades existents.</translation>
 <translation id="1146678959555564648">Activa el mode RV</translation>
 <translation id="116280672541001035">Dades utilitzades</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Permet que els llocs web reprodueixin so (opció recomanada)</translation>
 <translation id="1670399744444387456">Opcions bàsiques</translation>
 <translation id="1671236975893690980">Baixada pendent…</translation>
+<translation id="1672586136351118594">No m'ho tornis a mostrar</translation>
 <translation id="1674523662097951983">L'opció Adreces d'interès canvia de lloc. La propera vegada, fes lliscar la barra d'adreces cap amunt per trobar-la.</translation>
 <translation id="169033420419426091">No s'ha pogut baixar <ph name="FILE_NAME" /> perquè no s'ha trobat la targeta SD.</translation>
 <translation id="1709438864123551175">Economitzador de dades</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Queda 1 hora</translation>
 <translation id="5127805178023152808">Sincronització desactivada</translation>
 <translation id="5129038482087801250">Instal·la l'aplicació web</translation>
+<translation id="5139940364318403933">Obtén informació sobre com pots utilitzar Google Drive</translation>
 <translation id="515227803646670480">Esborrar les dades emmagatzemades</translation>
 <translation id="5152843274749979095">No hi ha cap aplicació admesa instal·lada</translation>
 <translation id="5161254044473106830">Cal indicar un títol</translation>
@@ -680,7 +683,7 @@
 <translation id="7062545763355031412">Accepta i canvia de compte</translation>
 <translation id="7063006564040364415">No s'ha pogut connectar amb el servidor de sincronització.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 element seleccionat}other{# elements seleccionats}}</translation>
-<translation id="7077143737582773186">Targeta SD</translation>
+<translation id="7077143737582773186">Targeta Secure Digital</translation>
 <translation id="7121362699166175603">Esborra l'historial i les complecions automàtiques a la barra d'adreces. A <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />, trobaràs altres maneres d'explorar l'historial del teu compte de Google.</translation>
 <translation id="7128222689758636196">Permet al motor de cerca actual</translation>
 <translation id="7138678301420049075">Altres</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">S'ha bloquejat en alguns llocs web</translation>
 <translation id="7253272406652746122">Afegeix un compte de Google des de la pàgina Comptes de l'aplicació Configuració del dispositiu.</translation>
 <translation id="7274013316676448362">Lloc bloquejat</translation>
+<translation id="729975465115245577">El dispositiu no té cap aplicació per emmagatzemar el fitxer de contrasenyes.</translation>
 <translation id="7318797029885648322">Toca Més per veure els articles</translation>
 <translation id="7333031090786104871">Encara s'hi està afegint el lloc anterior</translation>
 <translation id="7352939065658542140">VÍDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Ajuda</translation>
 <translation id="7658239707568436148">Cancel·la</translation>
 <translation id="7665369617277396874">Afegeix un compte</translation>
+<translation id="7682724950699840886">Segueix aquests consells: comprova que hi hagi prou espai al dispositiu i prova d'exportar les contrasenyes de nou.</translation>
 <translation id="7698359219371678927">Crea una adreça electrònica a <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Tradueix sempre les pàgines en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Mostra l'historial complet</translation>
 <translation id="8428213095426709021">Configuració</translation>
 <translation id="8441146129660941386">Retrocedeix</translation>
+<translation id="8445448999790540984">No es poden exportar les contrasenyes</translation>
 <translation id="8447861592752582886">Revoca el permís d'accés al dispositiu</translation>
 <translation id="8487700953926739672">Disponible sense connexió</translation>
 <translation id="8489271220582375723">Obre la pàgina de l'historial</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 2183251..e5e2fed 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Zde se objeví záložky, které jste si uložili v ostatních zařízeních.</translation>
 <translation id="1113597929977215864">Zapnout zjednodušené zobrazení</translation>
 <translation id="1121094540300013208">Zprávy o využití a selhání</translation>
+<translation id="1129510026454351943">Podrobnosti: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Smazat existující data.</translation>
 <translation id="1146678959555564648">Zapnout VR</translation>
 <translation id="116280672541001035">Využito</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Povolit webům přehrávat zvuky (doporučeno)</translation>
 <translation id="1670399744444387456">Základní</translation>
 <translation id="1671236975893690980">Nevyřízené stahování…</translation>
+<translation id="1672586136351118594">Tuto zprávu již nezobrazovat</translation>
 <translation id="1674523662097951983">Položka Záložky se přesouvá. Příště přejeďte prstem nahoru z adresního řádku.</translation>
 <translation id="169033420419426091">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo, protože není k dispozici SD karta.</translation>
 <translation id="1709438864123551175">Spořič dat</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Zbývá: 1 h</translation>
 <translation id="5127805178023152808">Synchronizace je vypnuta</translation>
 <translation id="5129038482087801250">Instalovat webovou aplikaci</translation>
+<translation id="5139940364318403933">Naučte se používat Disk Google</translation>
 <translation id="515227803646670480">Vymazat uložená data</translation>
 <translation id="5152843274749979095">Nejsou nainstalovány žádné podporované aplikace</translation>
 <translation id="5161254044473106830">Je požadován název</translation>
@@ -572,7 +575,7 @@
 <translation id="6177390657002841081">Zapnutí Spořiče dat</translation>
 <translation id="6181444274883918285">Přidat výjimku pro konkrétní web</translation>
 <translation id="618555311922999635">Je otevřen navigační panel na plnou výšku</translation>
-<translation id="6192333916571137726">Stažení souboru</translation>
+<translation id="6192333916571137726">Stáhnout soubor</translation>
 <translation id="6192792657125177640">Výjimky</translation>
 <translation id="6210748933810148297">Nejste <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Blokováno na všech webech</translation>
 <translation id="7253272406652746122">Přidejte účet Google ze stránky Účty v aplikaci Nastavení svého zařízení.</translation>
 <translation id="7274013316676448362">Blokovaný web</translation>
+<translation id="729975465115245577">V zařízení není žádná aplikace, pomocí které by soubor s hesly bylo možné uložit.</translation>
 <translation id="7318797029885648322">Články načtete klepnutím na Více</translation>
 <translation id="7333031090786104871">Předchozí web se stále přidává</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Nápověda</translation>
 <translation id="7658239707568436148">Zrušit</translation>
 <translation id="7665369617277396874">Přidat účet</translation>
+<translation id="7682724950699840886">Vyzkoušejte tyto tipy: Zajistěte, aby v zařízení byl dostatek místa a zkuste export zopakovat.</translation>
 <translation id="7698359219371678927">Vytvořit e-mail v aplikaci <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Stránky v jazyce <ph name="SOURCE_LANGUAGE" /> vždy překládat</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Zobrazit celou historii</translation>
 <translation id="8428213095426709021">Nastavení</translation>
 <translation id="8441146129660941386">Přetočit dozadu</translation>
+<translation id="8445448999790540984">Hesla se nepodařilo exportovat</translation>
 <translation id="8447861592752582886">Zrušit oprávnění zařízení</translation>
 <translation id="8487700953926739672">Dostupné offline</translation>
 <translation id="8489271220582375723">Otevřít stránku historie</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index ec29423a..e5eceb3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Hier werden die Lesezeichen angezeigt, die auf Ihren anderen Geräten gespeichert sind.</translation>
 <translation id="1113597929977215864">Vereinfachte Ansicht anzeigen</translation>
 <translation id="1121094540300013208">Nutzungs- und Absturzberichte</translation>
+<translation id="1129510026454351943">Details: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Vorhandene Daten löschen</translation>
 <translation id="1146678959555564648">VR aktivieren</translation>
 <translation id="116280672541001035">Genutzt</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Wiedergabe von Ton auf Websites zulassen (empfohlen)</translation>
 <translation id="1670399744444387456">Grundlegend</translation>
 <translation id="1671236975893690980">Download ausstehend...</translation>
+<translation id="1672586136351118594">Nicht mehr anzeigen</translation>
 <translation id="1674523662097951983">"Lesezeichen" wird verschoben. Ziehen Sie beim nächsten Mal die Adressleiste nach oben.</translation>
 <translation id="169033420419426091"><ph name="FILE_NAME" /> konnte nicht heruntergeladen werden, weil keine SD-Karte gefunden wurde.</translation>
 <translation id="1709438864123551175">Datensparmodus</translation>
@@ -443,6 +445,7 @@
 <translation id="510275257476243843">1 Stunde übrig</translation>
 <translation id="5127805178023152808">Synchronisierung ist deaktiviert</translation>
 <translation id="5129038482087801250">Web-App installieren</translation>
+<translation id="5139940364318403933">Informationen dazu, wie Sie Google Drive verwenden</translation>
 <translation id="515227803646670480">Gespeich. Daten löschen</translation>
 <translation id="5152843274749979095">Keine unterstützten Apps installiert</translation>
 <translation id="5161254044473106830">Titel erforderlich</translation>
@@ -696,6 +699,7 @@
 <translation id="7251326866581677552">Auf einigen Websites blockiert</translation>
 <translation id="7253272406652746122">Fügen Sie ein Google-Konto über die Seite "Konten" der App "Einstellungen" Ihres Geräts hinzu.</translation>
 <translation id="7274013316676448362">Blockierte Website</translation>
+<translation id="729975465115245577">Auf Ihrem Gerät befindet sich keine App zum Speichern der Passwortdatei.</translation>
 <translation id="7318797029885648322">Tippen Sie auf "Mehr", damit weitere Artikel angezeigt werden</translation>
 <translation id="7333031090786104871">Vorherige Website wird noch hinzugefügt</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -738,6 +742,7 @@
 <translation id="7649070708921625228">Hilfe</translation>
 <translation id="7658239707568436148">Abbrechen</translation>
 <translation id="7665369617277396874">Konto hinzufügen</translation>
+<translation id="7682724950699840886">Probieren Sie folgende Tipps aus: Sorgen Sie dafür, dass auf Ihrem Gerät ausreichend Speicherplatz vorhanden ist, und wiederholen Sie den Export.</translation>
 <translation id="7698359219371678927">E-Mail in <ph name="APP_NAME" /> erstellen</translation>
 <translation id="773466115871691567">Seiten auf <ph name="SOURCE_LANGUAGE" /> immer übersetzen</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -810,6 +815,7 @@
 <translation id="8413126021676339697">Gesamtverlauf anzeigen</translation>
 <translation id="8428213095426709021">Einstellungen</translation>
 <translation id="8441146129660941386">Zurück navigieren</translation>
+<translation id="8445448999790540984">Passwörter können nicht exportiert werden</translation>
 <translation id="8447861592752582886">Zugriffsberechtigung auf Gerät widerrufen</translation>
 <translation id="8487700953926739672">Offline verfügbar</translation>
 <translation id="8489271220582375723">Verlaufsseite öffnen</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 6965d70..f5b6a7f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -516,9 +516,9 @@
 <translation id="5677928146339483299">Blocked</translation>
 <translation id="5684874026226664614">Oops. This page could not be translated.</translation>
 <translation id="5689516760719285838">Location</translation>
-<translation id="5719837394786370183">Pages that you view in incognito tabs won’t stick around in your browser’s history, cookie store or search history after you've closed all of your incognito tabs. Any files that you download or bookmarks that you create will be kept.
+<translation id="5719837394786370183">Pages that you view in incognito tabs won’t stick around in your browser’s history, cookie store or search history after you’ve closed all of your incognito tabs. Any files that you download or bookmarks that you create will be kept.
 
-However, you aren't invisible. Going incognito doesn't hide your browsing from your employer, your Internet service provider or the websites you visit.</translation>
+However, you aren’t invisible. Going incognito doesn’t hide your browsing from your employer, your Internet service provider or the websites you visit.</translation>
 <translation id="572328651809341494">Recent tabs</translation>
 <translation id="5726692708398506830">Make everything on the page bigger</translation>
 <translation id="5738816946784116349">Chrome Downloads</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 54f62a0..94c8978 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Los favoritos guardados en tus otros dispositivos aparecerán aquí.</translation>
 <translation id="1113597929977215864">Mostrar la vista simplificada</translation>
 <translation id="1121094540300013208">Informes de uso y de fallos</translation>
+<translation id="1129510026454351943">Detalles: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Borra los datos existentes.</translation>
 <translation id="1146678959555564648">Entrar al modo RV</translation>
 <translation id="116280672541001035">Usados</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Permitir que los sitios reproduzcan sonido (recomendado)</translation>
 <translation id="1670399744444387456">Básicas</translation>
 <translation id="1671236975893690980">Descarga pendiente…</translation>
+<translation id="1672586136351118594">No volver a mostrar</translation>
 <translation id="1674523662097951983">Estamos moviendo "Favoritos". La próxima vez, desliza la barra de direcciones hacia arriba.</translation>
 <translation id="169033420419426091"><ph name="FILE_NAME" /> no se pudo descargar porque falta la tarjeta SD.</translation>
 <translation id="1709438864123551175">Ahorro de datos</translation>
@@ -243,7 +245,7 @@
 <translation id="3236059992281584593">1 minuto restante</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Agregar esta página a Favoritos</translation>
-<translation id="3255459706755453214">Bloquea el acceso de lectura al portapapeles para un sitio específico.</translation>
+<translation id="3255459706755453214">Impide el acceso de lectura al portapapeles para un sitio específico.</translation>
 <translation id="3259831549858767975">Achicar todos los elementos de la página</translation>
 <translation id="3269093882174072735">Cargar imagen</translation>
 <translation id="3269956123044984603">Para obtener las pestañas de tus otros dispositivos, activa la opción "Sincronización automática de datos" en la configuración de la cuenta de Android.</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 hora restante</translation>
 <translation id="5127805178023152808">La sincronización está desactivada.</translation>
 <translation id="5129038482087801250">Instalar la aplicación web</translation>
+<translation id="5139940364318403933">Aprender a usar Google Drive</translation>
 <translation id="515227803646670480">Borrar datos almacenados</translation>
 <translation id="5152843274749979095">No hay apps compatibles instaladas</translation>
 <translation id="5161254044473106830">Se requiere un título</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Bloqueados de algunos sitios</translation>
 <translation id="7253272406652746122">Agrega una cuenta de Google desde la página Cuentas en la app de Configuración del dispositivo.</translation>
 <translation id="7274013316676448362">Sitio bloqueado</translation>
+<translation id="729975465115245577">Tu dispositivo no tiene una app que pueda almacenar el archivo de contraseñas.</translation>
 <translation id="7318797029885648322">Presiona Más para obtener artículos</translation>
 <translation id="7333031090786104871">Aún se está agregando el sitio anterior</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7665369617277396874">Agregar cuenta</translation>
+<translation id="7682724950699840886">Intenta las siguientes sugerencias: Antes de intentar exportar las contraseñas nuevamente, asegúrate de que haya espacio suficiente en tu dispositivo.</translation>
 <translation id="7698359219371678927">Crear correo electrónico en <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Traducir siempre las páginas en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Mostrar historial completo</translation>
 <translation id="8428213095426709021">Configuración</translation>
 <translation id="8441146129660941386">Buscar más atrás</translation>
+<translation id="8445448999790540984">No se pueden exportar las contraseñas</translation>
 <translation id="8447861592752582886">Revocar permiso para el dispositivo</translation>
 <translation id="8487700953926739672">Disponible sin conexión</translation>
 <translation id="8489271220582375723">Abrir la página del historial</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 ea5756ef..2817735 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Aquí aparecen los marcadores que hayas guardado en otros dispositivos.</translation>
 <translation id="1113597929977215864">Mostrar vista simplificada</translation>
 <translation id="1121094540300013208">Informes de uso y sobre fallos</translation>
+<translation id="1129510026454351943">Detalles: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Elimina los datos actuales.</translation>
 <translation id="1146678959555564648">Iniciar RV</translation>
 <translation id="116280672541001035">Usados</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Permitir que los sitios web reproduzcan sonidos (recomendado)</translation>
 <translation id="1670399744444387456">Básico</translation>
 <translation id="1671236975893690980">Descarga pendiente…</translation>
+<translation id="1672586136351118594">No volver a mostrar</translation>
 <translation id="1674523662097951983">A partir de ahora, tendrás que deslizar la barra de direcciones hacia arriba para mostrar los marcadores.</translation>
 <translation id="169033420419426091">No se ha podido descargar <ph name="FILE_NAME" /> porque falta la tarjeta SD.</translation>
 <translation id="1709438864123551175">Ahorro de datos</translation>
@@ -146,7 +148,7 @@
 <translation id="2286841657746966508">Dirección de facturación</translation>
 <translation id="230115972905494466">No se han podido encontrar dispositivos compatibles</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados de cliente.</translation>
-<translation id="2321086116217818302">Preparando contraseñas…</translation>
+<translation id="2321086116217818302">Preparando Contraseña…</translation>
 <translation id="2321958826496381788">Arrastra el control deslizante hasta que puedas leer cómodamente. El texto debe tener al menos este tamaño después de tocar un párrafo dos veces.</translation>
 <translation id="2323763861024343754">Almacenamiento del sitio web</translation>
 <translation id="2328985652426384049">No se puede iniciar sesión</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Queda 1 hora</translation>
 <translation id="5127805178023152808">La sincronización está desactivada</translation>
 <translation id="5129038482087801250">Instalar aplicación web</translation>
+<translation id="5139940364318403933">Más información sobre cómo usar Google Drive</translation>
 <translation id="515227803646670480">Borrar datos almacenados</translation>
 <translation id="5152843274749979095">No hay aplicaciones compatibles instaladas</translation>
 <translation id="5161254044473106830">Título obligatorio</translation>
@@ -680,7 +683,7 @@
 <translation id="7062545763355031412">Aceptar y cambiar de cuenta</translation>
 <translation id="7063006564040364415">No se ha podido conectar con el servidor de sincronización.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 seleccionado}other{# seleccionados}}</translation>
-<translation id="7077143737582773186">Tarjeta SD</translation>
+<translation id="7077143737582773186">Secure Digital</translation>
 <translation id="7121362699166175603">Borra el historial y los autocompletados de la barra de direcciones. Es posible que tu cuenta de Google tenga otros tipos de historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128222689758636196">Permitirlo para el motor de búsqueda actual</translation>
 <translation id="7138678301420049075">Otro</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Bloqueados en algunos sitios web</translation>
 <translation id="7253272406652746122">Añade una cuenta de Google desde la sección Cuentas de la aplicación de ajustes de tu dispositivo.</translation>
 <translation id="7274013316676448362">Sitio web bloqueado</translation>
+<translation id="729975465115245577">Tu dispositivo no tiene ninguna aplicación para almacenar el archivo de contraseñas.</translation>
 <translation id="7318797029885648322">Toca Más para acceder a los artículos</translation>
 <translation id="7333031090786104871">Aún se está añadiendo el sitio web anterior</translation>
 <translation id="7352939065658542140">VÍDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7665369617277396874">Añadir cuenta</translation>
+<translation id="7682724950699840886">Prueba los siguientes consejos: deja suficiente espacio en el dispositivo y vuelve a exportar las contraseñas.</translation>
 <translation id="7698359219371678927">Crear correo electrónico en <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Traducir siempre las páginas en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Mostrar historial completo</translation>
 <translation id="8428213095426709021">Configuración</translation>
 <translation id="8441146129660941386">Buscar hacia atrás</translation>
+<translation id="8445448999790540984">No se pueden exportar las contraseñas</translation>
 <translation id="8447861592752582886">Revocar permiso de dispositivo</translation>
 <translation id="8487700953926739672">Disponible sin conexión</translation>
 <translation id="8489271220582375723">Abre la página Historial</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 622ebaf..1b9e18a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Muilla laitteilla tallentamasi kirjanmerkit näytetään täällä.</translation>
 <translation id="1113597929977215864">Näytä yksinkertaistettu näkymä</translation>
 <translation id="1121094540300013208">Käyttö- ja virheraportit</translation>
+<translation id="1129510026454351943">Tiedot: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Poistaa olemassa olevat tiedot.</translation>
 <translation id="1146678959555564648">Siirry VR-tilaan</translation>
 <translation id="116280672541001035">Käytetty</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Salli sivustojen toistaa ääniä (suositus)</translation>
 <translation id="1670399744444387456">Perusvaihtoehdot</translation>
 <translation id="1671236975893690980">Lataus odottaa…</translation>
+<translation id="1672586136351118594">Älä näytä uudelleen</translation>
 <translation id="1674523662097951983">Kirjanmerkit siirtyvät uuteen paikkaan. Ensi kerralla löydät ne vetämällä osoitepalkkia ylöspäin.</translation>
 <translation id="169033420419426091">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui, koska SD-kortti puuttuu.</translation>
 <translation id="1709438864123551175">Data Saver</translation>
@@ -243,7 +245,7 @@
 <translation id="3236059992281584593">1 minuutti jäljellä</translation>
 <translation id="3244271242291266297">KK</translation>
 <translation id="3254409185687681395">Luo kirjanmerkki tälle sivulle</translation>
-<translation id="3255459706755453214">Estä leikepöydän tietyn sivuston lukuoikeus.</translation>
+<translation id="3255459706755453214">Estä tiettyä sivustoa lukemasta leikepöytää.</translation>
 <translation id="3259831549858767975">Pienennä sivun kaikki sisältö</translation>
 <translation id="3269093882174072735">Lataa kuva</translation>
 <translation id="3269956123044984603">Ota tietojen automaattinen synkronointi käyttöön Androidin tiliasetuksissa, niin voit käyttää välilehtiäsi kaikilla laitteilla.</translation>
@@ -255,7 +257,7 @@
 <translation id="3328801116991980348">Tietoja sivustosta</translation>
 <translation id="3341058695485821946">Katso, kuinka paljon dataa olet säästänyt</translation>
 <translation id="3350687908700087792">Sulje kaikki incognito-välilehdet.</translation>
-<translation id="3358632888246345756">Anna leikepöydälle tietyn sivuston lukuoikeus.</translation>
+<translation id="3358632888246345756">Anna tietylle sivustolle leikepöydän lukuoikeus.</translation>
 <translation id="3365671512111106261">Ei käytössä, kun Data Saver on käytössä</translation>
 <translation id="3367813778245106622">Aloita synkronointi kirjautumalla uudelleen sisään.</translation>
 <translation id="3384347053049321195">Jaa kuva</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 tunti jäljellä</translation>
 <translation id="5127805178023152808">Synkronointi ei ole käytössä</translation>
 <translation id="5129038482087801250">Asenna verkkosovellus</translation>
+<translation id="5139940364318403933">Ohjeet Google Driven käyttöön</translation>
 <translation id="515227803646670480">Poista tallennetut tiedot</translation>
 <translation id="5152843274749979095">Ei asennettuja tuettuja sovelluksia</translation>
 <translation id="5161254044473106830">Nimike vaaditaan</translation>
@@ -572,7 +575,7 @@
 <translation id="6177390657002841081">Ota Data Saver käyttöön</translation>
 <translation id="6181444274883918285">Lisää sivustopoikkeus</translation>
 <translation id="618555311922999635">Navigointipalkki avattu koko näytön korkeudelle</translation>
-<translation id="6192333916571137726">Lataa tiedosto</translation>
+<translation id="6192333916571137726">Lataaminen-tiedosto</translation>
 <translation id="6192792657125177640">Poikkeukset</translation>
 <translation id="6210748933810148297">Etkö ole <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534">Vaihtoehdot: <ph name="NAME_OF_LIST_ITEM" /></translation>
@@ -680,7 +683,7 @@
 <translation id="7062545763355031412">Hyväksy ja vaihda tiliä</translation>
 <translation id="7063006564040364415">Synkronointipalvelimeen ei saada yhteyttä.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 valittu}other{# valittu}}</translation>
-<translation id="7077143737582773186">SD-kortti</translation>
+<translation id="7077143737582773186">Secure Digital</translation>
 <translation id="7121362699166175603">Tyhjentää historian ja osoitekentän automaattiset täydennykset. Google-tililläsi voi olla muita selaushistoriatietoja osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128222689758636196">Salli nykyiselle hakukoneelle</translation>
 <translation id="7138678301420049075">Muu</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Joidenkin sivustojen mainokset estetty</translation>
 <translation id="7253272406652746122">Lisää Google-tili laitteen Asetukset-sovelluksen Tilit-sivulla.</translation>
 <translation id="7274013316676448362">Estetty sivusto</translation>
+<translation id="729975465115245577">Laitteella ei ole sovellusta, johon salasanatiedoston voisi tallentaa.</translation>
 <translation id="7318797029885648322">Valitse Lisää, jos haluat nähdä artikkeleita.</translation>
 <translation id="7333031090786104871">Edellisen sivuston lisääminen kesken</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Ohje</translation>
 <translation id="7658239707568436148">Peruuta</translation>
 <translation id="7665369617277396874">Lisää tili</translation>
+<translation id="7682724950699840886">Kokeile seuraavia keinoja: varmista, että laitteellasi on tarpeeksi tilaa, yritä viedä uudelleen.</translation>
 <translation id="7698359219371678927">Luo sähköposti sovelluksessa <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Käännä aina kielellä <ph name="SOURCE_LANGUAGE" /> kirjoitut sivut</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Näytä koko selaushistoria</translation>
 <translation id="8428213095426709021">Asetukset</translation>
 <translation id="8441146129660941386">Kelaa taaksepäin</translation>
+<translation id="8445448999790540984">Salasanojen vienti epäonnistui</translation>
 <translation id="8447861592752582886">Peruuta laitteen käyttöoikeus</translation>
 <translation id="8487700953926739672">Käytettävissä offline-tilassa</translation>
 <translation id="8489271220582375723">Avaa Historia-sivu</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 c27e12c9..d9c586f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Les favoris enregistrés sur vos autres appareils s'affichent ici.</translation>
 <translation id="1113597929977215864">Afficher la vue simplifiée</translation>
 <translation id="1121094540300013208">Statistiques d'utilisation et rapports d'erreur</translation>
+<translation id="1129510026454351943">Détails°: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Supprimer les données existantes.</translation>
 <translation id="1146678959555564648">Activer la réalité virtuelle</translation>
 <translation id="116280672541001035">Utilisées</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Autoriser l'activation du son des sites (recommandé)</translation>
 <translation id="1670399744444387456">Général</translation>
 <translation id="1671236975893690980">Téléchargement en attente…</translation>
+<translation id="1672586136351118594">Ne plus afficher</translation>
 <translation id="1674523662097951983">La section "Favoris" va être déplacée. La prochaine fois, tirez la barre d'adresse vers le haut pour y accéder.</translation>
 <translation id="169033420419426091">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison d'une absence de carte SD.</translation>
 <translation id="1709438864123551175">Économiseur de données</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 heure restante</translation>
 <translation id="5127805178023152808">La synchronisation est désactivée.</translation>
 <translation id="5129038482087801250">Installer l'application Web</translation>
+<translation id="5139940364318403933">Découvrez comment utiliser Google Drive</translation>
 <translation id="515227803646670480">Effacer les données stockées</translation>
 <translation id="5152843274749979095">Aucune application compatible n'est installée</translation>
 <translation id="5161254044473106830">Veuillez saisir un titre.</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Bloqué sur certains sites</translation>
 <translation id="7253272406652746122">Ajoutez un compte Google depuis la page "Comptes" dans l'application "Paramètres" de votre appareil.</translation>
 <translation id="7274013316676448362">Site bloqué</translation>
+<translation id="729975465115245577">Aucune application n'est installée sur votre appareil pour stocker le fichier de mots de passe.</translation>
 <translation id="7318797029885648322">Appuyez sur "Plus" pour afficher des articles</translation>
 <translation id="7333031090786104871">L'ajout du site précédent est toujours en cours</translation>
 <translation id="7352939065658542140">VIDÉO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Aide</translation>
 <translation id="7658239707568436148">Annuler</translation>
 <translation id="7665369617277396874">Ajouter un compte</translation>
+<translation id="7682724950699840886">Essayez l'astuce suivante°: assurez-vous de disposer de suffisamment d'espace sur votre appareil, puis tentez à nouveau d'exporter les mots de passe.</translation>
 <translation id="7698359219371678927">Créer un e-mail dans <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Toujours traduire les pages en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Afficher l'historique complet</translation>
 <translation id="8428213095426709021">Paramètres</translation>
 <translation id="8441146129660941386">Retour rapide</translation>
+<translation id="8445448999790540984">Impossible d'exporter les mots de passe</translation>
 <translation id="8447861592752582886">Révoquer l'autorisation d'accès à l'appareil</translation>
 <translation id="8487700953926739672">Disponible hors connexion</translation>
 <translation id="8489271220582375723">Ouvrir la page "Historique"</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index da3457b..656e6ef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">आपके अन्‍य डिवाइस पर सहेजे गए बुकमार्क यहां दिखाई देंगे.</translation>
 <translation id="1113597929977215864">सरल बनाया गया व्यू दिखाएं</translation>
 <translation id="1121094540300013208">उपयोग और क्रैश रिपोर्ट</translation>
+<translation id="1129510026454351943">विवरण: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">मौजूदा डेटा हटाएं.</translation>
 <translation id="1146678959555564648">VR डालें</translation>
 <translation id="116280672541001035">उपयोग किया गया</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">साइटों को आवाज़ चलाने दें (सुझाया गया)</translation>
 <translation id="1670399744444387456">मूलभूत</translation>
 <translation id="1671236975893690980">डाउनलोड लंबित…</translation>
+<translation id="1672586136351118594">फिर से न दिखाएं</translation>
 <translation id="1674523662097951983">“बुकमार्क” दूसरी जगह पर जा रहा है. अगली बार, पता बार ऊपर की ओर खींचें.</translation>
 <translation id="169033420419426091">अनुपलब्‍ध SD कार्ड के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation>
 <translation id="1709438864123551175">डेटा बचाने का साधन</translation>
@@ -376,7 +378,7 @@
 <translation id="4522570452068850558">विवरण</translation>
 <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation>
 <translation id="4532845899244822526">फ़ोल्डर चुनें</translation>
-<translation id="4544481164434183075">यह पेज <ph name="CREATION_TIME" /> का है और इसके ऑनलाइन वर्शन में अंतर हो सकता है.</translation>
+<translation id="4544481164434183075">यह पेज का है <ph name="CREATION_TIME" /> और इसके ऑनलाइन वर्शन में अंतर हो सकता है.</translation>
 <translation id="4550003330909367850">यहां अपना पासवर्ड देखने या उसे कॉपी करने के लिए, इस डिवाइस पर स्क्रीन लॉक सेट करें.</translation>
 <translation id="4558311620361989323">वेबपेज शॉर्टकट</translation>
 <translation id="4565377596337484307">पासवर्ड छिपाएं</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 घंटा शेष</translation>
 <translation id="5127805178023152808">समन्वयन बंद है</translation>
 <translation id="5129038482087801250">वेब ऐप्लिकेशन इंस्टॉल करें</translation>
+<translation id="5139940364318403933">Google डिस्क के इस्तेमाल का तरीका जानें</translation>
 <translation id="515227803646670480">संग्रहित डेटा साफ़ करें</translation>
 <translation id="5152843274749979095">कोई समर्थित ऐप्लिकेशन इंस्‍टॉल नहीं है</translation>
 <translation id="5161254044473106830">शीर्षक आवश्‍यक</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">कुछ साइटों से ब्लॉक है</translation>
 <translation id="7253272406652746122">अपने डिवाइस के सेटिंग ऐप्लिकेशन में खाते पेज से कोई Google खाता जोड़ें.</translation>
 <translation id="7274013316676448362">अवरोधित साइट</translation>
+<translation id="729975465115245577">आपके डिवाइस में पासवर्ड फ़ाइल को संग्रहित करने वाला कोई ऐप्लिकेशन नहीं है.</translation>
 <translation id="7318797029885648322">लेख पाने के लिए अधिक पर टैप करें</translation>
 <translation id="7333031090786104871">पिछली साइट अभी भी जोड़ी जा रही है</translation>
 <translation id="7352939065658542140">वीडियो</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">सहायता</translation>
 <translation id="7658239707568436148">अभी नहीं</translation>
 <translation id="7665369617277396874">खाता जोड़ें</translation>
+<translation id="7682724950699840886">ये सलाह आज़माएं: पक्का करें कि आपके डिवाइस पर ज़रूरी जगह उपलब्ध है, फिर दोबारा निर्यात करके देखें.</translation>
 <translation id="7698359219371678927"><ph name="APP_NAME" /> में ईमेल बनाएं</translation>
 <translation id="773466115871691567"><ph name="SOURCE_LANGUAGE" /> भाषा के पेज का हमेशा अनुवाद करें</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">संपूर्ण इतिहास दिखाएं</translation>
 <translation id="8428213095426709021">सेटिंग</translation>
 <translation id="8441146129660941386">पीछे जाएं</translation>
+<translation id="8445448999790540984">पासवर्ड निर्यात नहीं कर सकते</translation>
 <translation id="8447861592752582886">डिवाइस अनुमति निरस्त करें</translation>
 <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation>
 <translation id="8489271220582375723">इतिहास पेज खोलें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 48ce914..4fccc95 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">A más eszközökön mentett könyvjelzők itt jelennek meg.</translation>
 <translation id="1113597929977215864">Egyszerűsített nézet megjelenítése</translation>
 <translation id="1121094540300013208">Használati és hibajelentések</translation>
+<translation id="1129510026454351943">Részletek: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Meglévő adatok törlése.</translation>
 <translation id="1146678959555564648">Virtuális valóság – belépés</translation>
 <translation id="116280672541001035">Használt</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">A webhelyek lejátszhatnak hangokat (ajánlott)</translation>
 <translation id="1670399744444387456">Alapvető</translation>
 <translation id="1671236975893690980">Letöltés függőben…</translation>
+<translation id="1672586136351118594">Ne jelenjen meg többé</translation>
 <translation id="1674523662097951983">A „Könyvjelzők” szakasz elköltözik. Legközelebb húzza felfelé a címsávot.</translation>
 <translation id="169033420419426091">A következő fájl letöltése hiányzó SD-kártya miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
 <translation id="1709438864123551175">Adatforgalom-csökkentő</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 óra van hátra</translation>
 <translation id="5127805178023152808">Szinkronizálás kikapcsolva</translation>
 <translation id="5129038482087801250">Webes alkalmazás telepítése</translation>
+<translation id="5139940364318403933">További információ a Google Drive használatáról</translation>
 <translation id="515227803646670480">Tárolt adatok törlése</translation>
 <translation id="5152843274749979095">Nincs telepítve támogatott alkalmazás</translation>
 <translation id="5161254044473106830">Cím megadása kötelező</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Letiltva egyes webhelyeknél</translation>
 <translation id="7253272406652746122">Adjon hozzá Google-fiókot az eszköz Beállítások alkalmazásának Fiókok oldalán.</translation>
 <translation id="7274013316676448362">Letiltott oldal</translation>
+<translation id="729975465115245577">Az eszközön nincs olyan alkalmazás, amely tárolni tudja a jelszavakat tartalmazó fájlt.</translation>
 <translation id="7318797029885648322">Cikkek megjelenítéséhez koppintson a Továbbiak lehetőségre</translation>
 <translation id="7333031090786104871">Az előző webhely hozzáadása még folyamatban van</translation>
 <translation id="7352939065658542140">VIDEÓ</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Súgó</translation>
 <translation id="7658239707568436148">Mégse</translation>
 <translation id="7665369617277396874">Fiók hozzáadása</translation>
+<translation id="7682724950699840886">Próbálkozzon a következő tippekkel: Győződjön meg arról, hogy elegendő tárhely áll rendelkezésre az eszközön, majd próbálja újra az exportálást.</translation>
 <translation id="7698359219371678927">E-mail létrehozása a(z) <ph name="APP_NAME" /> alkalmazásban</translation>
 <translation id="773466115871691567">Mindig fordítsa le a(z) <ph name="SOURCE_LANGUAGE" /> nyelvű oldalakat</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Minden előzmény megjelenítése</translation>
 <translation id="8428213095426709021">Beállítások</translation>
 <translation id="8441146129660941386">Ugrás visszafelé</translation>
+<translation id="8445448999790540984">Nem sikerült a jelszavak exportálása</translation>
 <translation id="8447861592752582886">Eszközengedély visszavonása</translation>
 <translation id="8487700953926739672">Offline elérhető</translation>
 <translation id="8489271220582375723">Az Előzmények oldal megnyitása</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index c8aefa8..19460469 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">I preferiti salvati sugli altri dispositivi verranno visualizzati qui.</translation>
 <translation id="1113597929977215864">Mostra la Visualizzazione semplificata</translation>
 <translation id="1121094540300013208">Rapporti sull'utilizzo e sugli arresti anomali</translation>
+<translation id="1129510026454351943">Dettagli: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Elimina dati esistenti.</translation>
 <translation id="1146678959555564648">Entra nella VR</translation>
 <translation id="116280672541001035">Utilizzati</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Consenti ai siti di riprodurre l'audio (opzione consigliata)</translation>
 <translation id="1670399744444387456">Di base</translation>
 <translation id="1671236975893690980">Download in attesa...</translation>
+<translation id="1672586136351118594">Non visualizzare più</translation>
 <translation id="1674523662097951983">La voce "Preferiti" verrà spostata. La prossima volta dovrai trascinare verso l'alto la barra degli indirizzi.</translation>
 <translation id="169033420419426091">Download di <ph name="FILE_NAME" /> non riuscito a causa dell'assenza di scheda SD.</translation>
 <translation id="1709438864123551175">Risparmio dati</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 ora rimanente</translation>
 <translation id="5127805178023152808">La sincronizzazione è disattivata</translation>
 <translation id="5129038482087801250">Installa app web</translation>
+<translation id="5139940364318403933">Impara a utilizzare Google Drive</translation>
 <translation id="515227803646670480">Cancella dati memorizzati</translation>
 <translation id="5152843274749979095">Nessuna app supportata installata</translation>
 <translation id="5161254044473106830">Titolo obbligatorio</translation>
@@ -680,7 +683,7 @@
 <translation id="7062545763355031412">Accetta e cambia account</translation>
 <translation id="7063006564040364415">Impossibile collegarsi al server di sincronizzazione.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 elemento selezionato}other{# elementi selezionati}}</translation>
-<translation id="7077143737582773186">Scheda SD</translation>
+<translation id="7077143737582773186">Secure Digital</translation>
 <translation id="7121362699166175603">Consente di cancellare la cronologia e i completamenti automatici nella barra degli indirizzi. Il tuo account Google potrebbe avere altri tipi di cronologia di navigazione all'indirizzo <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128222689758636196">Consenti motore di ricerca corrente</translation>
 <translation id="7138678301420049075">Altro</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Bloccati su alcuni siti</translation>
 <translation id="7253272406652746122">Aggiungi un account Google dalla pagina Account nell'app Impostazioni del dispositivo.</translation>
 <translation id="7274013316676448362">Sito bloccato</translation>
+<translation id="729975465115245577">Il tuo dispositivo non ha un'app per archiviare il file di password.</translation>
 <translation id="7318797029885648322">Tocca Altro per ricevere articoli</translation>
 <translation id="7333031090786104871">Aggiunta del sito precedente ancora in corso</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Guida</translation>
 <translation id="7658239707568436148">Annulla</translation>
 <translation id="7665369617277396874">Aggiungi account</translation>
+<translation id="7682724950699840886">Prova i seguenti suggerimenti: assicurati di avere spazio sufficiente sul dispositivo e prova a esportare di nuovo.</translation>
 <translation id="7698359219371678927">Crea email in <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Traduci sempre le pagine in <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Mostra cronologia completa</translation>
 <translation id="8428213095426709021">Impostazioni</translation>
 <translation id="8441146129660941386">Posiziona indietro</translation>
+<translation id="8445448999790540984">Impossibile esportare le password</translation>
 <translation id="8447861592752582886">Revoca autorizzazione dispositivo</translation>
 <translation id="8487700953926739672">Disponibile offline</translation>
 <translation id="8489271220582375723">Apri la pagina Cronologia</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index f38d688..0709aa1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">他の端末に保存されているブックマークがここに表示されます。</translation>
 <translation id="1113597929977215864">簡易表示する</translation>
 <translation id="1121094540300013208">利用状況と障害レポート</translation>
+<translation id="1129510026454351943">詳細: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">既存のデータを削除します。</translation>
 <translation id="1146678959555564648">VR を入力</translation>
 <translation id="116280672541001035">使用量</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">音声の再生をサイトに許可する(推奨)</translation>
 <translation id="1670399744444387456">基本</translation>
 <translation id="1671236975893690980">ダウンロードを待機しています...</translation>
+<translation id="1672586136351118594">次回から表示しない</translation>
 <translation id="1674523662097951983">[ブックマーク] は移動しました。次回からはアドレスバーを上にスワイプしてください。</translation>
 <translation id="169033420419426091">SD カードがないため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
 <translation id="1709438864123551175">データセーバー</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">残り 1 時間</translation>
 <translation id="5127805178023152808">同期は無効です</translation>
 <translation id="5129038482087801250">ウェブアプリをインストール</translation>
+<translation id="5139940364318403933">Google ドライブの使い方を見る</translation>
 <translation id="515227803646670480">保存したデータの消去</translation>
 <translation id="5152843274749979095">サポートされているアプリがインストールされていません</translation>
 <translation id="5161254044473106830">タイトルが必要です</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">一部のサイトでブロックされています</translation>
 <translation id="7253272406652746122">端末の設定アプリのアカウント ページで Google アカウントを追加してください。</translation>
 <translation id="7274013316676448362">ブロック中のサイト</translation>
+<translation id="729975465115245577">お使いの端末にはパスワード ファイルを保存するためのアプリがインストールされていません。</translation>
 <translation id="7318797029885648322">候補を表示するには [もっと見る] をタップしてください</translation>
 <translation id="7333031090786104871">前のサイトを追加中です</translation>
 <translation id="7352939065658542140">動画</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">ヘルプ</translation>
 <translation id="7658239707568436148">キャンセル</translation>
 <translation id="7665369617277396874">アカウントを追加</translation>
+<translation id="7682724950699840886">推奨される対策: 端末に十分な空き容量があることを確認し、再度エクスポートを試します。</translation>
 <translation id="7698359219371678927"><ph name="APP_NAME" /> でメールを作成</translation>
 <translation id="773466115871691567"><ph name="SOURCE_LANGUAGE" />のページを常に翻訳する</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" />(<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">全履歴を表示</translation>
 <translation id="8428213095426709021">設定</translation>
 <translation id="8441146129660941386">後方にシーク再生</translation>
+<translation id="8445448999790540984">パスワードをエクスポートできません</translation>
 <translation id="8447861592752582886">端末の許可を取り消します</translation>
 <translation id="8487700953926739672">オフラインでの利用</translation>
 <translation id="8489271220582375723">履歴ページを開く</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 585199a..c14fc4f7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">다른 기기에서 저장한 북마크가 여기에 표시됩니다.</translation>
 <translation id="1113597929977215864">간단히 보기 표시</translation>
 <translation id="1121094540300013208">사용 및 비정상 종료 보고서</translation>
+<translation id="1129510026454351943">세부정보: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">기존 데이터 삭제</translation>
 <translation id="1146678959555564648">VR 시작</translation>
 <translation id="116280672541001035">사용</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">사이트에서 소리를 재생하도록 허용(권장)</translation>
 <translation id="1670399744444387456">기본</translation>
 <translation id="1671236975893690980">다운로드 대기 중...</translation>
+<translation id="1672586136351118594">다시 표시하지 않음</translation>
 <translation id="1674523662097951983">'북마크'의 위치가 변경됩니다. 다음에는 검색주소창을 위로 당기세요.</translation>
 <translation id="169033420419426091">SD 카드가 없어서 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
 <translation id="1709438864123551175">데이터 절약 모드</translation>
@@ -140,7 +142,7 @@
 <translation id="219985413780390209">위험한 사이트로부터 사용자와 기기 보호</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, 웹 앱. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048"><ph name="USER_FULL_NAME" />(으)로 계속</translation>
-<translation id="2259659629660284697">비밀번호 내보내기…</translation>
+<translation id="2259659629660284697">비밀번호 내보내기...</translation>
 <translation id="2266890032547182881">데이터 사용량 분석</translation>
 <translation id="2268044343513325586">상세검색</translation>
 <translation id="2286841657746966508">결제주소</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1시간 남음</translation>
 <translation id="5127805178023152808">동기화 사용 안함</translation>
 <translation id="5129038482087801250">웹 앱 설치</translation>
+<translation id="5139940364318403933">Google 드라이브 사용 방법 알아보기</translation>
 <translation id="515227803646670480">저장된 데이터 삭제</translation>
 <translation id="5152843274749979095">지원되는 앱이 설치되어 있지 않음</translation>
 <translation id="5161254044473106830">제목이 필요합니다.</translation>
@@ -488,7 +491,7 @@
 <translation id="5517095782334947753"><ph name="FROM_ACCOUNT" />에서 가져온 북마크, 방문 기록, 비밀번호 및 기타 설정이 있습니다.</translation>
 <translation id="5524843473235508879">리디렉션이 차단되었습니다.</translation>
 <translation id="5527082711130173040">기기를 스캔하려면 Chrome에서 위치 정보에 액세스해야 합니다. <ph name="BEGIN_LINK1" />권한을 업데이트<ph name="END_LINK1" />하세요. 또한 <ph name="BEGIN_LINK2" />이 기기에서도 위치 정보 액세스 권한이 사용 중지<ph name="END_LINK2" />되어 있습니다.</translation>
-<translation id="5527111080432883924">사이트에서 클립보드의 텍스트 및 이미지를 읽을 수 있게 허용하기 전에 확인(권장)</translation>
+<translation id="5527111080432883924">사이트가 클립보드의 텍스트 및 이미지에 액세스하도록 허용하기 전에 확인(권장)</translation>
 <translation id="5530766185686772672">시크릿 탭 닫기</translation>
 <translation id="5534640966246046842">사이트 복사됨</translation>
 <translation id="5537099431952529648">나와 부모님이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />에서 Chrome 동기화 및 맞춤설정을 관리할 수 있습니다.</translation>
@@ -657,7 +660,7 @@
 <translation id="6891858906296486776">{OPEN_TABS,plural, =1{%1$d개의 열린 탭}other{%1$d개의 열린 탭}}</translation>
 <translation id="6896758677409633944">복사</translation>
 <translation id="6910211073230771657">삭제됨</translation>
-<translation id="6912998170423641340">사이트에서 클립보드의 텍스트 및 이미지를 읽을 수 없도록 차단</translation>
+<translation id="6912998170423641340">사이트가 클립보드의 텍스트 및 이미지에 액세스하지 못하도록 차단</translation>
 <translation id="6914783257214138813">내보낸 파일을 볼 수 있는 모든 사용자에게 비밀번호가 표시됩니다.</translation>
 <translation id="6945221475159498467">선택</translation>
 <translation id="6963766334940102469">북마크 삭제</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">일부 사이트에서 차단됨</translation>
 <translation id="7253272406652746122">기기 설정 앱의 계정 페이지에서 Google 계정을 추가하세요.</translation>
 <translation id="7274013316676448362">차단된 사이트</translation>
+<translation id="729975465115245577">기기에 비밀번호 파일을 저장할 수 있는 앱이 없습니다.</translation>
 <translation id="7318797029885648322">더보기를 탭하여 도움말 가져오기</translation>
 <translation id="7333031090786104871">아직 이전 사이트 추가 중</translation>
 <translation id="7352939065658542140">동영상</translation>
@@ -705,7 +709,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7403691278183511381">Chrome 첫 실행</translation>
 <translation id="7423098979219808738">우선 확인</translation>
-<translation id="7423538860840206698">클립보드 읽기 차단됨</translation>
+<translation id="7423538860840206698">클립보드 액세스가 차단됨</translation>
 <translation id="7437998757836447326">Chrome에서 로그아웃</translation>
 <translation id="7445411102860286510">사이트에서 음소거된 동영상을 자동재생하도록 허용(권장)</translation>
 <translation id="7453467225369441013">대부분의 사이트에서 로그아웃됩니다. Google 계정에서는 로그아웃되지 않습니다.</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">도움말</translation>
 <translation id="7658239707568436148">취소</translation>
 <translation id="7665369617277396874">계정 추가</translation>
+<translation id="7682724950699840886">다음 방법을 시도해 보세요. 기기 저장용량이 충분한지 확인하고 다시 내보내 봅니다.</translation>
 <translation id="7698359219371678927"><ph name="APP_NAME" />에서 이메일 만들기</translation>
 <translation id="773466115871691567"><ph name="SOURCE_LANGUAGE" />로 된 페이지를 항상 번역</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" />(<ph name="SPACE_OTHER" /> 사용 중)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">방문 기록 전체 보기</translation>
 <translation id="8428213095426709021">설정</translation>
 <translation id="8441146129660941386">뒤로 탐색</translation>
+<translation id="8445448999790540984">비밀번호를 내보낼 수 없음</translation>
 <translation id="8447861592752582886">기기 액세스 권한 취소</translation>
 <translation id="8487700953926739672">오프라인으로 사용 가능</translation>
 <translation id="8489271220582375723">방문 기록 페이지 열기</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index e0ed98e..f578a7c4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Bladwijzers die je op andere apparaten hebt opgeslagen, worden hier weergegeven.</translation>
 <translation id="1113597929977215864">Vereenvoudigde weergave tonen</translation>
 <translation id="1121094540300013208">Gebruiks- en crashrapporten</translation>
+<translation id="1129510026454351943">Details: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Bestaande gegevens verwijderen.</translation>
 <translation id="1146678959555564648">VR activeren</translation>
 <translation id="116280672541001035">Gebruikt</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Toestaan dat sites geluid afspelen (aanbevolen)</translation>
 <translation id="1670399744444387456">Basis</translation>
 <translation id="1671236975893690980">Download in behandeling…</translation>
+<translation id="1672586136351118594">Niet opnieuw weergeven</translation>
 <translation id="1674523662097951983">Het item Bladwijzers wordt verplaatst. Trek de volgende keer de adresbalk omhoog.</translation>
 <translation id="169033420419426091">Downloaden van <ph name="FILE_NAME" /> is mislukt door een ontbrekende SD-kaart.</translation>
 <translation id="1709438864123551175">Databesparing</translation>
@@ -255,7 +257,7 @@
 <translation id="3328801116991980348">Site-informatie</translation>
 <translation id="3341058695485821946">Bekijk hoeveel data je hebt bespaard</translation>
 <translation id="3350687908700087792">Alle incognitotabbladen sluiten</translation>
-<translation id="3358632888246345756">Sta leestoegang voor het klembord voor een specifieke website toe.</translation>
+<translation id="3358632888246345756">Sta leestoegang voor het klembord voor een specifieke site toe.</translation>
 <translation id="3365671512111106261">Niet beschikbaar wanneer Databesparing is ingeschakeld</translation>
 <translation id="3367813778245106622">Log opnieuw in om de synchronisatie te starten</translation>
 <translation id="3384347053049321195">Afbeelding delen</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 uur resterend</translation>
 <translation id="5127805178023152808">Synchronisatie is uitgeschakeld</translation>
 <translation id="5129038482087801250">Web-app installeren</translation>
+<translation id="5139940364318403933">Meer informatie over het gebruik van Google Drive</translation>
 <translation id="515227803646670480">Opgeslagen gegevens wissen</translation>
 <translation id="5152843274749979095">Geen ondersteunde apps geïnstalleerd</translation>
 <translation id="5161254044473106830">Titel is vereist</translation>
@@ -488,7 +491,7 @@
 <translation id="5517095782334947753">Je hebt bladwijzers, geschiedenis, wachtwoorden en andere instellingen van <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Omleiding geblokkeerd.</translation>
 <translation id="5527082711130173040">Chrome heeft locatietoegang nodig om naar apparaten te scannen. <ph name="BEGIN_LINK1" />Rechten updaten<ph name="END_LINK1" />. Locatietoegang is ook <ph name="BEGIN_LINK2" />uitgeschakeld voor dit apparaat<ph name="END_LINK2" />.</translation>
-<translation id="5527111080432883924">Vragen voordat sites toestemming ontvangen om tekst en afbeeldingen vanaf het klembord te lezen (aanbevolen)</translation>
+<translation id="5527111080432883924">Vragen voordat sites toestemming krijgen om tekst en afbeeldingen vanaf het klembord te lezen (aanbevolen)</translation>
 <translation id="5530766185686772672">Incognitotabbladen sluiten</translation>
 <translation id="5534640966246046842">Site gekopieerd</translation>
 <translation id="5537099431952529648">Jij en je ouders kunnen Chrome-synchronisatie en -personalisatie beheren in <ph name="BEGIN_LINK1" />Instellingen<ph name="END_LINK1" /></translation>
@@ -572,7 +575,7 @@
 <translation id="6177390657002841081">Databesparing inschakelen</translation>
 <translation id="6181444274883918285">Site-uitzondering toevoegen</translation>
 <translation id="618555311922999635">Navigatievenster geopend op volledige hoogte</translation>
-<translation id="6192333916571137726">Bestand downloaden</translation>
+<translation id="6192333916571137726">Downloadbestand</translation>
 <translation id="6192792657125177640">Uitzonderingen</translation>
 <translation id="6210748933810148297">Niet <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534">Opties voor <ph name="NAME_OF_LIST_ITEM" /></translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Geblokkeerd voor bepaalde sites</translation>
 <translation id="7253272406652746122">Voeg een Google-account toe via de pagina Accounts in de app Instellingen van je apparaat.</translation>
 <translation id="7274013316676448362">Geblokkeerde site</translation>
+<translation id="729975465115245577">Je apparaat bevat geen app om het wachtwoordbestand in op te slaan.</translation>
 <translation id="7318797029885648322">Tik op Meer om artikelen weer te geven</translation>
 <translation id="7333031090786104871">Nog steeds bezig met toevoegen van vorige site</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Help</translation>
 <translation id="7658239707568436148">Annuleren</translation>
 <translation id="7665369617277396874">Account toevoegen</translation>
+<translation id="7682724950699840886">Probeer de volgende tips: zorg dat er voldoende ruimte op je apparaat beschikbaar is, probeer opnieuw te exporteren.</translation>
 <translation id="7698359219371678927">E-mail in <ph name="APP_NAME" /> maken</translation>
 <translation id="773466115871691567">Pagina's in het <ph name="SOURCE_LANGUAGE" /> altijd vertalen</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Volledige geschiedenis weergeven</translation>
 <translation id="8428213095426709021">Instellingen</translation>
 <translation id="8441146129660941386">Achteruit zoeken</translation>
+<translation id="8445448999790540984">Wachtwoorden kunnen niet worden geëxporteerd</translation>
 <translation id="8447861592752582886">Toegang tot apparaat intrekken</translation>
 <translation id="8487700953926739672">Offline beschikbaar</translation>
 <translation id="8489271220582375723">De pagina Geschiedenis openen</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 4af8614..02e3429 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Bokmerker som er lagret på de andre enhetene dine, vises her.</translation>
 <translation id="1113597929977215864">Vis forenklet visning</translation>
 <translation id="1121094540300013208">Bruks- og programstopprapporter</translation>
+<translation id="1129510026454351943">Detaljer: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Slett eksisterende data.</translation>
 <translation id="1146678959555564648">Slå på VR-modus</translation>
 <translation id="116280672541001035">Brukt</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Tillat nettsteder å spille av lyd (anbefalt)</translation>
 <translation id="1670399744444387456">Enkle</translation>
 <translation id="1671236975893690980">Nedlasting venter</translation>
+<translation id="1672586136351118594">Ikke vis igjen</translation>
 <translation id="1674523662097951983">«Bokmerker» flyttes. Trekk opp adressefeltet neste gang.</translation>
 <translation id="169033420419426091">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt fordi du ikke har noe SD-kort installert.</translation>
 <translation id="1709438864123551175">Datasparing</translation>
@@ -140,13 +142,13 @@
 <translation id="219985413780390209">Beskytt deg selv og enheten din mot farlige nettsteder</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, nettprogram. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">Fortsett som <ph name="USER_FULL_NAME" /></translation>
-<translation id="2259659629660284697">Eksportér passord…</translation>
+<translation id="2259659629660284697">Eksportér passord ...</translation>
 <translation id="2266890032547182881">Oversikt over databruk</translation>
 <translation id="2268044343513325586">Finstem</translation>
 <translation id="2286841657746966508">Faktureringsadresse</translation>
 <translation id="230115972905494466">Fant ingen kompatible enheter</translation>
 <translation id="2315043854645842844">Operativsystemet har ikke støtte for sertifikatvalg på klientsiden.</translation>
-<translation id="2321086116217818302">Forbereder passord …</translation>
+<translation id="2321086116217818302">Forbereder passordene …</translation>
 <translation id="2321958826496381788">Dra glidebryteren til du kan lese dette uten problemer. Når du har dobbelttrykket på et avsnitt, bør teksten være minst like stor som dette.</translation>
 <translation id="2323763861024343754">Nettstedslagring</translation>
 <translation id="2328985652426384049">Kan ikke logge på</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 time igjen</translation>
 <translation id="5127805178023152808">Synkronisering er slått av</translation>
 <translation id="5129038482087801250">Installer nettprogram</translation>
+<translation id="5139940364318403933">Finn ut hvordan du bruker Google Disk</translation>
 <translation id="515227803646670480">Sletting av alle lagrede data</translation>
 <translation id="5152843274749979095">Ingen støttede apper er installert</translation>
 <translation id="5161254044473106830">Du må oppgi en tittel</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Blokkert på noen nettsteder</translation>
 <translation id="7253272406652746122">Legg til en Google-konto på Kontoer-siden i Innstillinger-appen på enheten din.</translation>
 <translation id="7274013316676448362">Blokkert nettsted</translation>
+<translation id="729975465115245577">Enheten din har ingen app som kan lagre passordfilen.</translation>
 <translation id="7318797029885648322">Trykk på Mer for å se flere artikler</translation>
 <translation id="7333031090786104871">Holder fortsatt på å legge til det forrige nettstedet</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Hjelp</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7665369617277396874">Legg til konto</translation>
+<translation id="7682724950699840886">Prøv dette: Sørg for at det er nok plass på enheten, og prøv å eksportere på nytt.</translation>
 <translation id="7698359219371678927">Opprett en e-post i <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Oversett alltid sider på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Vis fullstendig logg</translation>
 <translation id="8428213095426709021">Innstillinger</translation>
 <translation id="8441146129660941386">Spol bakover</translation>
+<translation id="8445448999790540984">Kan ikke eksportere passordene</translation>
 <translation id="8447861592752582886">Opphev tillatelsen til enhetstilgang</translation>
 <translation id="8487700953926739672">Tilgjengelig utenfor nettet</translation>
 <translation id="8489271220582375723">Åpne loggsiden</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 8acb60a3..63398a4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -881,7 +881,7 @@
 <translation id="9050666287014529139">Hasło</translation>
 <translation id="9060538597317784206">Wyświetl aplikację <ph name="APP_NAME" /> w sklepie Play. Ocena: <ph name="APP_RATING" />.</translation>
 <translation id="9063523880881406963">Wyłącz opcję „Wersja na komputer”</translation>
-<translation id="9065203028668620118">Edycja</translation>
+<translation id="9065203028668620118">Edytuj</translation>
 <translation id="9070377983101773829">Rozpocznij wyszukiwanie głosowe</translation>
 <translation id="9071742570345586758">Aby oglądać treści rzeczywistości wirtualnej, zainstaluj Usługi Google VR</translation>
 <translation id="9086455579313502267">Nie można uzyskać dostępu do sieci</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index a3e66ae..fd19649 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Marcajele salvate pe alte dispozitive vor apărea aici.</translation>
 <translation id="1113597929977215864">Arată afișarea simplificată</translation>
 <translation id="1121094540300013208">Statistici de utilizare și rapoarte de blocare</translation>
+<translation id="1129510026454351943">Detalii: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Șterge datele existente.</translation>
 <translation id="1146678959555564648">Intră în RV</translation>
 <translation id="116280672541001035">Utilizate</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Permite site-urilor să redea sunet (recomandat)</translation>
 <translation id="1670399744444387456">De bază</translation>
 <translation id="1671236975893690980">Descărcare în așteptare…</translation>
+<translation id="1672586136351118594">Nu mai afișa</translation>
 <translation id="1674523662097951983">„Marcaje” se mută. Data viitoare, trage în sus bara de adrese.</translation>
 <translation id="169033420419426091">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit, deoarece lipsește cardul SD.</translation>
 <translation id="1709438864123551175">Economizor de date</translation>
@@ -140,7 +142,7 @@
 <translation id="219985413780390209">Protecție împotriva site-urilor periculoase</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicație web. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">Continuă ca <ph name="USER_FULL_NAME" /></translation>
-<translation id="2259659629660284697">Exportă parolele…</translation>
+<translation id="2259659629660284697">Exportă parolele...</translation>
 <translation id="2266890032547182881">Detalii privind utilizarea datelor</translation>
 <translation id="2268044343513325586">Rafinează</translation>
 <translation id="2286841657746966508">Adresa de facturare</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 oră rămasă</translation>
 <translation id="5127805178023152808">Sincronizarea este dezactivată</translation>
 <translation id="5129038482087801250">Instalează aplicația web</translation>
+<translation id="5139940364318403933">Află cum să folosești Google Drive</translation>
 <translation id="515227803646670480">Șterge datele stocate</translation>
 <translation id="5152843274749979095">Nu sunt instalate aplicații acceptate</translation>
 <translation id="5161254044473106830">Titlul este obligatoriu</translation>
@@ -680,7 +683,7 @@
 <translation id="7062545763355031412">Acceptă și comută conturile</translation>
 <translation id="7063006564040364415">Nu s-a putut stabili conexiunea cu serverul de sincronizare.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 selectat}few{# selectate}other{# selectate}}</translation>
-<translation id="7077143737582773186">Card SD</translation>
+<translation id="7077143737582773186">Secure Digital</translation>
 <translation id="7121362699166175603">Șterge istoricul și completările automate din bara de adrese. Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128222689758636196">Permite pentru motorul de căutare actual</translation>
 <translation id="7138678301420049075">Altele</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Blocate pe anumite site-uri</translation>
 <translation id="7253272406652746122">Adaugă un Cont Google din pagina Conturi din aplicația Setări a dispozitivului.</translation>
 <translation id="7274013316676448362">Site blocat</translation>
+<translation id="729975465115245577">Dispozitivul nu are o aplicație pentru stocarea fișierului parolelor.</translation>
 <translation id="7318797029885648322">Atinge Mai multe pentru a obține articole</translation>
 <translation id="7333031090786104871">Încă se adaugă site-ul anterior</translation>
 <translation id="7352939065658542140">VIDEOCLIP</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Ajutor</translation>
 <translation id="7658239707568436148">Anulează</translation>
 <translation id="7665369617277396874">Adăugați un cont</translation>
+<translation id="7682724950699840886">Încearcă următoarele sfaturi: asigură-te că există spațiu suficient pe dispozitiv, încearcă să exporți din nou.</translation>
 <translation id="7698359219371678927">Creează un e-mail în <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Tradu întotdeauna paginile în <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Afișați întregul istoric</translation>
 <translation id="8428213095426709021">Setări</translation>
 <translation id="8441146129660941386">Derulează înapoi</translation>
+<translation id="8445448999790540984">Nu se pot exporta parole</translation>
 <translation id="8447861592752582886">Revocă permisiunea de accesare a dispozitivului</translation>
 <translation id="8487700953926739672">Disponibil offline</translation>
 <translation id="8489271220582375723">Deschide pagina Istoric</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 afc6088..2260065b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Здесь появятся закладки, сохраненные на других устройствах.</translation>
 <translation id="1113597929977215864">Упрощенный просмотр</translation>
 <translation id="1121094540300013208">Отчеты об использовании и сбоях</translation>
+<translation id="1129510026454351943">Сведения об ошибке: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Удалить сохраненные данные.</translation>
 <translation id="1146678959555564648">Войти в режим VR</translation>
 <translation id="116280672541001035">Использовано</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Разрешить сайтам воспроизводить звуки (рекомендуется)</translation>
 <translation id="1670399744444387456">Основные настройки</translation>
 <translation id="1671236975893690980">Ожидание скачивания…</translation>
+<translation id="1672586136351118594">Больше не показывать</translation>
 <translation id="1674523662097951983">Интерфейс меняется. В следующий раз, чтобы увидеть "Закладки", потяните адресную строку вверх.</translation>
 <translation id="169033420419426091">Не удалось скачать файл <ph name="FILE_NAME" />, так как отсутствует SD-карта.</translation>
 <translation id="1709438864123551175">Экономия трафика</translation>
@@ -243,7 +245,7 @@
 <translation id="3236059992281584593">Осталась 1 мин.</translation>
 <translation id="3244271242291266297">ММ</translation>
 <translation id="3254409185687681395">Добавить страницу в закладки</translation>
-<translation id="3255459706755453214">Заблокируйте определенному сайту доступ к буферу обмена.</translation>
+<translation id="3255459706755453214">Заблокировать определенному сайту доступ к буферу обмена.</translation>
 <translation id="3259831549858767975">Уменьшить масштаб страницы</translation>
 <translation id="3269093882174072735">Загрузить изображение</translation>
 <translation id="3269956123044984603">Чтобы получить доступ к вкладкам на всех своих устройствах, включите автосинхронизацию данных в настройках аккаунта на устройстве Android.</translation>
@@ -255,7 +257,7 @@
 <translation id="3328801116991980348">Информация о сайте</translation>
 <translation id="3341058695485821946">Узнайте, сколько трафика вы сэкономили</translation>
 <translation id="3350687908700087792">Закрыть все вкладки инкогнито</translation>
-<translation id="3358632888246345756">Разрешите определенному сайту доступ к буферу обмена.</translation>
+<translation id="3358632888246345756">Разрешить определенному сайту доступ к буферу обмена.</translation>
 <translation id="3365671512111106261">Недоступно, если включена функция "Экономия трафика"</translation>
 <translation id="3367813778245106622">Чтобы начать синхронизацию, снова войдите в аккаунт</translation>
 <translation id="3384347053049321195">Поделиться изображением</translation>
@@ -376,7 +378,7 @@
 <translation id="4522570452068850558">Подробнее</translation>
 <translation id="4526249700380860531">Просматривайте сохраненные пароли и управляйте ими на странице <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4532845899244822526">Выбор папки</translation>
-<translation id="4544481164434183075">Страница сохранена <ph name="CREATION_TIME" /> и может отличаться от онлайн-версии</translation>
+<translation id="4544481164434183075">Страница сохранена <ph name="CREATION_TIME" /> и может отличаться от онлайн-версии.</translation>
 <translation id="4550003330909367850">Чтобы просмотреть или скопировать пароль, включите блокировку экрана на этом устройстве.</translation>
 <translation id="4558311620361989323">Работа с веб-страницами</translation>
 <translation id="4565377596337484307">Скрыть пароль</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Остался 1 час</translation>
 <translation id="5127805178023152808">Синхронизация выключена</translation>
 <translation id="5129038482087801250">Установить веб-приложение</translation>
+<translation id="5139940364318403933">Открыть справочную статью</translation>
 <translation id="515227803646670480">Удаление данных</translation>
 <translation id="5152843274749979095">Нет поддерживаемых приложений</translation>
 <translation id="5161254044473106830">Введите название</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Заблокировано на определенных сайтах</translation>
 <translation id="7253272406652746122">Добавьте аккаунт Google в настройках устройства (раздел "Аккаунты").</translation>
 <translation id="7274013316676448362">Заблокированный сайт</translation>
+<translation id="729975465115245577">На устройстве не установлено приложение для хранения файлов паролей.</translation>
 <translation id="7318797029885648322">Чтобы увидеть другие статьи, нажмите "Ещё"</translation>
 <translation id="7333031090786104871">Предыдущий сайт ещё не добавлен</translation>
 <translation id="7352939065658542140">ВИДЕО</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Справка</translation>
 <translation id="7658239707568436148">Отмена</translation>
 <translation id="7665369617277396874">Добавить аккаунт</translation>
+<translation id="7682724950699840886">Убедитесь, что на вашем устройстве достаточно свободного места. Затем снова попробуйте экспортировать пароли.</translation>
 <translation id="7698359219371678927">Написать письмо в приложении "<ph name="APP_NAME" />"</translation>
 <translation id="773466115871691567">Переводить страницы на этом языке: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -797,7 +802,7 @@
 <translation id="8250920743982581267">Документы</translation>
 <translation id="8260126382462817229">Снова войдите в аккаунт</translation>
 <translation id="8261506727792406068">Удалить</translation>
-<translation id="8266862848225348053">Место для скачивания</translation>
+<translation id="8266862848225348053">Расположение скачиваемых файлов</translation>
 <translation id="8283853025636624853">Синхронизация с аккаунтом <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation>
 <translation id="8310344678080805313">Обычные вкладки</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> и другие сайты</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Показать всю историю</translation>
 <translation id="8428213095426709021">Настройки</translation>
 <translation id="8441146129660941386">Перемотать назад</translation>
+<translation id="8445448999790540984">Не удалось экспортировать пароли</translation>
 <translation id="8447861592752582886">Отключить доступ к устройству</translation>
 <translation id="8487700953926739672">Доступно в автономном режиме</translation>
 <translation id="8489271220582375723">Открыть страницу "История"</translation>
@@ -851,7 +857,7 @@
 <translation id="8820817407110198400">Закладки</translation>
 <translation id="883635517171802338">Блокировать всплывающие окна на сайтах (рекомендуется)</translation>
 <translation id="883806473910249246">При скачивании контента произошла ошибка.</translation>
-<translation id="8840953339110955557">Страница может отличаться от онлайн-версии</translation>
+<translation id="8840953339110955557">Страница может отличаться от онлайн-версии.</translation>
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198">Вкладка "<ph name="TAB_TITLE" />"</translation>
 <translation id="885701979325669005">Хранилище</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index eff9fa9..20f2c5c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Tu bodo prikazani zaznamki, shranjeni v drugih napravah.</translation>
 <translation id="1113597929977215864">Pokaži poenostavljen pogled</translation>
 <translation id="1121094540300013208">Poročila o uporabi in zrušitvah</translation>
+<translation id="1129510026454351943">Podrobnosti: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Izbris obstoječih podatkov.</translation>
 <translation id="1146678959555564648">V navidezno resničnost</translation>
 <translation id="116280672541001035">Porabljeno</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Dovoli spletnim mestom predvajanje zvoka (priporočljivo)</translation>
 <translation id="1670399744444387456">Osnovno</translation>
 <translation id="1671236975893690980">Prenos na čakanju …</translation>
+<translation id="1672586136351118594">Tega ne prikaži več</translation>
 <translation id="1674523662097951983">»Zaznamki« bodo premaknjeni. Naslednjič povlecite naslovno vrstico navzgor.</translation>
 <translation id="169033420419426091">Prenos datoteke <ph name="FILE_NAME" /> ni uspel, ker ni kartice SD.</translation>
 <translation id="1709438864123551175">Varčevanje s podatki</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Še 1 h</translation>
 <translation id="5127805178023152808">Sinhroniziranje je izklopljeno</translation>
 <translation id="5129038482087801250">Namesti spletno aplikacijo</translation>
+<translation id="5139940364318403933">Naučite se uporabljati Google Drive</translation>
 <translation id="515227803646670480">Izbris shranjenih podatkov</translation>
 <translation id="5152843274749979095">Nameščena ni nobena podprta aplikacija</translation>
 <translation id="5161254044473106830">Naslov je obvezen</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Blokirano na nekaterih spletnih mestih</translation>
 <translation id="7253272406652746122">Na strani za račune v aplikaciji Nastavitve dodajte Google Račun.</translation>
 <translation id="7274013316676448362">Blokirano spletno mesto</translation>
+<translation id="729975465115245577">V napravi ni aplikacije za shranjevanje datoteke z gesli.</translation>
 <translation id="7318797029885648322">Če želite prejeti članke, se dotaknite »Več«</translation>
 <translation id="7333031090786104871">Dodajanje prejšnjega spletnega mesta še vedno poteka</translation>
 <translation id="7352939065658542140">VIDEOPOSNETEK</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Pomoč</translation>
 <translation id="7658239707568436148">Prekliči</translation>
 <translation id="7665369617277396874">Dodaj račun</translation>
+<translation id="7682724950699840886">Poskusite ta nasveta: poskrbite, da je v napravi dovolj prostora, ali poskusite znova izvoziti.</translation>
 <translation id="7698359219371678927">Ustvarite e-poštno sporočilo v aplikaciji <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Vedno prevedi strani v jeziku <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Prikaži celotno zgodovino</translation>
 <translation id="8428213095426709021">Nastavitve</translation>
 <translation id="8441146129660941386">Išči nazaj</translation>
+<translation id="8445448999790540984">Gesel ni mogoče izvoziti</translation>
 <translation id="8447861592752582886">Umik dovoljenja za dostop do naprave</translation>
 <translation id="8487700953926739672">Na voljo brez povezave</translation>
 <translation id="8489271220582375723">Odpiranje strani z zgodovino</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index abac9b1..453f68c2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Обележивачи сачувани на другим уређајима ће се приказати овде.</translation>
 <translation id="1113597929977215864">Прикажи поједностављени приказ</translation>
 <translation id="1121094540300013208">Извештаји о коришћењу и отказивању</translation>
+<translation id="1129510026454351943">Детаљи: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Избришите постојеће податке</translation>
 <translation id="1146678959555564648">Уђи у ВР</translation>
 <translation id="116280672541001035">Искоришћено</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Дозволи сајтовима да пуштају звук (препоручено)</translation>
 <translation id="1670399744444387456">Основна</translation>
 <translation id="1671236975893690980">Преузимање је на чекању…</translation>
+<translation id="1672586136351118594">Не приказуј поново</translation>
 <translation id="1674523662097951983">Премештамо „Обележиваче“. Следећи пут повуците траку за адресу нагоре.</translation>
 <translation id="169033420419426091">Преузимање датотеке <ph name="FILE_NAME" /> није успело јер нема SD картице.</translation>
 <translation id="1709438864123551175">Уштеда података</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">Још 1 сат</translation>
 <translation id="5127805178023152808">Синхронизација је искључена</translation>
 <translation id="5129038482087801250">Инсталирај веб-апликацију</translation>
+<translation id="5139940364318403933">Сазнајте како да користите Google disk</translation>
 <translation id="515227803646670480">Обришите сачуване податке</translation>
 <translation id="5152843274749979095">Није инсталирана ниједна подржана апликација</translation>
 <translation id="5161254044473106830">Наслов је обавезан</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Блокирано са неких сајтова</translation>
 <translation id="7253272406652746122">Додајте Google налог са странице Налози у апликацији Подешавања на уређају.</translation>
 <translation id="7274013316676448362">Сајт је блокиран</translation>
+<translation id="729975465115245577">Уређај нема апликацију за чување датотеке са лозинкама.</translation>
 <translation id="7318797029885648322">Додирните Више да бисте видели чланке</translation>
 <translation id="7333031090786104871">Још увек додајемо претходни сајт</translation>
 <translation id="7352939065658542140">ВИДЕО</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Помоћ</translation>
 <translation id="7658239707568436148">Откажи</translation>
 <translation id="7665369617277396874">Додајте налог</translation>
+<translation id="7682724950699840886">Испробајте следеће савете: проверите да ли на уређају има довољно простора, пробајте да поново извезете лозинке.</translation>
 <translation id="7698359219371678927">Напишите имејл у апликацији <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Увек предводи странице на језику <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Прикажи сву историју</translation>
 <translation id="8428213095426709021">Подешавања</translation>
 <translation id="8441146129660941386">Премотај уназад</translation>
+<translation id="8445448999790540984">Извоз лозинки није успео</translation>
 <translation id="8447861592752582886">Опозови дозволу за уређај</translation>
 <translation id="8487700953926739672">Доступно ван мреже</translation>
 <translation id="8489271220582375723">Отварање странице историја</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 a93d351e..dd01707 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Här visas bokmärken som du har sparat på andra enheter.</translation>
 <translation id="1113597929977215864">Använd förenklad visning</translation>
 <translation id="1121094540300013208">Användning och felrapporter</translation>
+<translation id="1129510026454351943">Mer information: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Radera befintlig data.</translation>
 <translation id="1146678959555564648">Kliv in i VR</translation>
 <translation id="116280672541001035">Använd</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Tillåt att ljud spelas upp på webbplatser (rekommenderas)</translation>
 <translation id="1670399744444387456">Grunder</translation>
 <translation id="1671236975893690980">Nedladdning väntar …</translation>
+<translation id="1672586136351118594">Visa inte igen</translation>
 <translation id="1674523662097951983">Bokmärken har flyttat. Dra uppåt på adressfältet nästa gång.</translation>
 <translation id="169033420419426091">Det gick inte att ladda ned <ph name="FILE_NAME" /> eftersom SD-kort saknas.</translation>
 <translation id="1709438864123551175">Databesparing</translation>
@@ -255,7 +257,7 @@
 <translation id="3328801116991980348">Platsinformation</translation>
 <translation id="3341058695485821946">Se hur mycket data du har sparat</translation>
 <translation id="3350687908700087792">Stäng alla inkognitoflikar</translation>
-<translation id="3358632888246345756">Ge läsbehörighet till Urklipp för en enskild webbplats.</translation>
+<translation id="3358632888246345756">Ge en enskild webbplats läsbehörighet till Urklipp.</translation>
 <translation id="3365671512111106261">Inte tillgängligt när Databesparing är aktiverat</translation>
 <translation id="3367813778245106622">Logga in igen om du vill påbörja synkroniseringen</translation>
 <translation id="3384347053049321195">Dela bild</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 timme kvar</translation>
 <translation id="5127805178023152808">Synkronisering är av</translation>
 <translation id="5129038482087801250">Installera webbapp</translation>
+<translation id="5139940364318403933">Lär dig använda Google Drive</translation>
 <translation id="515227803646670480">Ta bort sparad data</translation>
 <translation id="5152843274749979095">Inga appar som stöds finns installerade</translation>
 <translation id="5161254044473106830">Titel krävs</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Blockeras från vissa webbplatser</translation>
 <translation id="7253272406652746122">Lägg till ett Google-konto från kontosidan i appen Inställningar på enheten.</translation>
 <translation id="7274013316676448362">Blockerad webbplats</translation>
+<translation id="729975465115245577">Det finns ingen app som kan spara lösenordsfilen på enheten.</translation>
 <translation id="7318797029885648322">Tryck på Mer om du vill ha artiklar</translation>
 <translation id="7333031090786104871">Processen pågår fortfarande för den förra webbplatsen</translation>
 <translation id="7352939065658542140">VIDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Hjälp</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7665369617277396874">Lägg till konto</translation>
+<translation id="7682724950699840886">Testa följande: kontrollera att det finns tillräckligt mycket utrymme på enheten, gör om exporten.</translation>
 <translation id="7698359219371678927">Skapa ett e-postmeddelande i <ph name="APP_NAME" /></translation>
 <translation id="773466115871691567">Översätt alltid sidor på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Visa fullständig historik</translation>
 <translation id="8428213095426709021">Inställningar</translation>
 <translation id="8441146129660941386">Sök bakåt</translation>
+<translation id="8445448999790540984">Det gick inte att exportera lösenord</translation>
 <translation id="8447861592752582886">Återkalla enhetsbehörighet</translation>
 <translation id="8487700953926739672">Tillgänglig offline</translation>
 <translation id="8489271220582375723">Öppna historiksidan</translation>
@@ -851,7 +857,7 @@
 <translation id="8820817407110198400">Bokmärken</translation>
 <translation id="883635517171802338">Blockera webbplatser från att visa popup-fönster (rekommenderas)</translation>
 <translation id="883806473910249246">Ett fel uppstod när innehållet skulle laddas ned.</translation>
-<translation id="8840953339110955557">Den här sidan kan skilja sig från onlineversionen.</translation>
+<translation id="8840953339110955557">Sidan kan skilja sig från onlineversionen.</translation>
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, flik</translation>
 <translation id="885701979325669005">Lagring</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 e35f414..14f4a32 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">Diğer cihazlarınızda kaydedilmiş yer işaretleri burada görünür.</translation>
 <translation id="1113597929977215864">Basitleştirilmiş görünümü göster</translation>
 <translation id="1121094540300013208">Kullanım ve kilitlenme raporları</translation>
+<translation id="1129510026454351943">Ayrıntılar: <ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">Mevcut verileri silin.</translation>
 <translation id="1146678959555564648">VR'ye Gir</translation>
 <translation id="116280672541001035">Kullanılan</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">Sitelerin ses çalmasına izin ver (önerilir)</translation>
 <translation id="1670399744444387456">Temel</translation>
 <translation id="1671236975893690980">İndirme işlemi beklemede…</translation>
+<translation id="1672586136351118594">Bir daha gösterme</translation>
 <translation id="1674523662097951983">“Yer İşaretleri”nin yeri değişiyor. Bir dahaki sefere adres çubuğunu yukarı çekin.</translation>
 <translation id="169033420419426091">Eksik SD Kart nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
 <translation id="1709438864123551175">Veri Tasarrufu</translation>
@@ -376,7 +378,7 @@
 <translation id="4522570452068850558">Ayrıntılar</translation>
 <translation id="4526249700380860531">Kaydedilmiş şifreleri <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> adresinden görüntüleyin ve yönetin</translation>
 <translation id="4532845899244822526">Klasör seçin</translation>
-<translation id="4544481164434183075">Bu sayfa <ph name="CREATION_TIME" /> tarihli ve internetteki sürümden farklı olabilir.</translation>
+<translation id="4544481164434183075">Bu sayfa <ph name="CREATION_TIME" /> tarihli olup web'deki sürümden farklı olabilir.</translation>
 <translation id="4550003330909367850">Burada şifrenizi görüntülemek veya kopyalamak için bu cihazda ekran kilidini ayarlayın.</translation>
 <translation id="4558311620361989323">Web sayfası kısayolları</translation>
 <translation id="4565377596337484307">Şifreyi gizle</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">1 saat kaldı</translation>
 <translation id="5127805178023152808">Senkronizasyon kapalı</translation>
 <translation id="5129038482087801250">Web uygulamasını yükle</translation>
+<translation id="5139940364318403933">Google Drive'ın nasıl kullanılacağını öğrenin</translation>
 <translation id="515227803646670480">Depolanmış verileri sil</translation>
 <translation id="5152843274749979095">Desteklenen yüklü uygulama yok</translation>
 <translation id="5161254044473106830">Başlık gerekiyor</translation>
@@ -572,7 +575,7 @@
 <translation id="6177390657002841081">Veri Tasarrufu'nu aç</translation>
 <translation id="6181444274883918285">Site istisnası ekle</translation>
 <translation id="618555311922999635">Gezinme paneli tam yükseklikte açıldı</translation>
-<translation id="6192333916571137726">Dosya indirme</translation>
+<translation id="6192333916571137726">İndirme dosyası</translation>
 <translation id="6192792657125177640">İstisnalar</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> değil misiniz?</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçenekleri</translation>
@@ -657,7 +660,7 @@
 <translation id="6891858906296486776">{OPEN_TABS,plural, =1{%1$d açık sekme}other{%1$d açık sekme}}</translation>
 <translation id="6896758677409633944">Kopyala</translation>
 <translation id="6910211073230771657">Silindi</translation>
-<translation id="6912998170423641340">Sitelerin panodaki metni ve resimleri okumasını engelle</translation>
+<translation id="6912998170423641340">Sitelerin panodaki metni ve resimleri okumasını engelleyin</translation>
 <translation id="6914783257214138813">Şifreleriniz, dışa aktarılan dosyayı görebilen herkes tarafından görülebilir.</translation>
 <translation id="6945221475159498467">Seç</translation>
 <translation id="6963766334940102469">Yer işaretlerini silme</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">Bazı sitelerde engellendi</translation>
 <translation id="7253272406652746122">Cihazınızın Ayarlar uygulamasındaki Hesaplar sayfasından bir Google Hesabı ekleyin.</translation>
 <translation id="7274013316676448362">Engellenmiş site</translation>
+<translation id="729975465115245577">Cihazınızda şifreler dosyasını depolayacak bir uygulama yok.</translation>
 <translation id="7318797029885648322">Makaleleri görmek için Diğer'e dokunun</translation>
 <translation id="7333031090786104871">Önceki siteyi ekleme işlemi devam ediyor.</translation>
 <translation id="7352939065658542140">VİDEO</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">Yardım</translation>
 <translation id="7658239707568436148">İptal</translation>
 <translation id="7665369617277396874">Hesap ekle</translation>
+<translation id="7682724950699840886">Şu ipuçlarını deneyin: Cihazınızda yeterli alan bulunduğundan emin olun, daha sonra dışa aktarmayı tekrar deneyin.</translation>
 <translation id="7698359219371678927"><ph name="APP_NAME" /> adlı uygulamada e-posta oluşturun</translation>
 <translation id="773466115871691567"><ph name="SOURCE_LANGUAGE" /> dilindeki sayfaları her zaman çevir</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">Tüm geçmişi göster</translation>
 <translation id="8428213095426709021">Ayarlar</translation>
 <translation id="8441146129660941386">Geriye doğru git</translation>
+<translation id="8445448999790540984">Şifreler dışa aktarılamıyor</translation>
 <translation id="8447861592752582886">Cihaz iznini iptal et</translation>
 <translation id="8487700953926739672">Çevrimdışı kullanılabilir</translation>
 <translation id="8489271220582375723">Geçmiş sayfasını açar</translation>
@@ -851,7 +857,7 @@
 <translation id="8820817407110198400">Favoriler</translation>
 <translation id="883635517171802338">Sitelerin pop-up göstermesini engelle (önerilir)</translation>
 <translation id="883806473910249246">İçerik indirilirken bir hata oluştu.</translation>
-<translation id="8840953339110955557">Bu sayfa, internetteki sürümden farklı olabilir.</translation>
+<translation id="8840953339110955557">Bu sayfa, web'deki sürümden farklı olabilir.</translation>
 <translation id="8847988622838149491">USB</translation>
 <translation id="8853345339104747198"><ph name="TAB_TITLE" />, sekme</translation>
 <translation id="885701979325669005">Depolama</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 34f7141..d4d6ba4 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
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">您在其他设备上保存的书签将列在此处。</translation>
 <translation id="1113597929977215864">显示简化版视图</translation>
 <translation id="1121094540300013208">使用情况统计信息和崩溃报告</translation>
+<translation id="1129510026454351943">错误详情:<ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">删除现有数据。</translation>
 <translation id="1146678959555564648">进入 VR</translation>
 <translation id="116280672541001035">已耗用</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">允许网站播放声音(推荐)</translation>
 <translation id="1670399744444387456">基本</translation>
 <translation id="1671236975893690980">正在等待下载…</translation>
+<translation id="1672586136351118594">不再显示</translation>
 <translation id="1674523662097951983">“书签”的位置即将变更。下次只需上拉地址栏即可查看书签。</translation>
 <translation id="169033420419426091">未能成功下载 <ph name="FILE_NAME" />,因为找不到 SD 卡。</translation>
 <translation id="1709438864123551175">流量节省程序</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">还剩 1 小时</translation>
 <translation id="5127805178023152808">同步功能已关闭</translation>
 <translation id="5129038482087801250">安装网络应用</translation>
+<translation id="5139940364318403933">了解如何使用 Google 云端硬盘</translation>
 <translation id="515227803646670480">清除存储的数据</translation>
 <translation id="5152843274749979095">尚未安装任何受支持的应用</translation>
 <translation id="5161254044473106830">必须提供标题</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">已阻止在部分网站中显示广告</translation>
 <translation id="7253272406652746122">请在设备的“设置”应用中,通过“帐号”页面添加 Google 帐号。</translation>
 <translation id="7274013316676448362">禁止访问的网站</translation>
+<translation id="729975465115245577">您的设备上没有可以存储密码文件的应用。</translation>
 <translation id="7318797029885648322">点按“更多”即可获取相关文章</translation>
 <translation id="7333031090786104871">仍在添加先前的网站</translation>
 <translation id="7352939065658542140">视频</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">帮助</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="7665369617277396874">添加帐号</translation>
+<translation id="7682724950699840886">请尝试按以下提示操作:确保您的设备上有足够的空间,然后重新尝试导出。</translation>
 <translation id="7698359219371678927">在 <ph name="APP_NAME" /> 中创建电子邮件</translation>
 <translation id="773466115871691567">一律翻译<ph name="SOURCE_LANGUAGE" />网页</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" />(<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">显示全部历史记录</translation>
 <translation id="8428213095426709021">设置</translation>
 <translation id="8441146129660941386">后退</translation>
+<translation id="8445448999790540984">无法导出密码</translation>
 <translation id="8447861592752582886">撤消设备权限</translation>
 <translation id="8487700953926739672">可离线使用</translation>
 <translation id="8489271220582375723">打开历史记录页</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 4011a0e..bce7c677 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
@@ -12,6 +12,7 @@
 <translation id="1111673857033749125">儲存在您其他裝置上的書籤會顯示在這裡。</translation>
 <translation id="1113597929977215864">顯示「簡易檢視」模式</translation>
 <translation id="1121094540300013208">使用資料和當機報告</translation>
+<translation id="1129510026454351943">詳細資料:<ph name="ERROR_DESCRIPTION" /></translation>
 <translation id="1145536944570833626">刪除現有資料。</translation>
 <translation id="1146678959555564648">進入 VR</translation>
 <translation id="116280672541001035">使用量</translation>
@@ -80,6 +81,7 @@
 <translation id="1660204651932907780">允許網站播放音訊 (建議)</translation>
 <translation id="1670399744444387456">基本</translation>
 <translation id="1671236975893690980">正在等候下載…</translation>
+<translation id="1672586136351118594">不要再顯示</translation>
 <translation id="1674523662097951983">[書籤] 的位置即將變更,下次直接從網址列往上拉即可。</translation>
 <translation id="169033420419426091">找不到 SD 卡,因此無法下載 <ph name="FILE_NAME" />。</translation>
 <translation id="1709438864123551175">Data Saver</translation>
@@ -140,7 +142,7 @@
 <translation id="219985413780390209">保護您和您的裝置不受危險網站攻擊</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />,網路應用程式。<ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">以<ph name="USER_FULL_NAME" />的身分繼續使用</translation>
-<translation id="2259659629660284697">匯出密碼...</translation>
+<translation id="2259659629660284697">匯出密碼…</translation>
 <translation id="2266890032547182881">數據用量解析</translation>
 <translation id="2268044343513325586">修正搜尋</translation>
 <translation id="2286841657746966508">帳單地址</translation>
@@ -243,7 +245,7 @@
 <translation id="3236059992281584593">還剩 1 分鐘</translation>
 <translation id="3244271242291266297">月</translation>
 <translation id="3254409185687681395">把此頁加入書籤</translation>
-<translation id="3255459706755453214">禁止讀取特定網站的剪貼簿。</translation>
+<translation id="3255459706755453214">禁止特定網站讀取剪貼簿。</translation>
 <translation id="3259831549858767975">縮小網頁上的所有內容</translation>
 <translation id="3269093882174072735">載入圖片</translation>
 <translation id="3269956123044984603">如要存取您在其他裝置上開啟的分頁,請前往 Android 帳戶設定開啟 [自動同步處理資料]。</translation>
@@ -255,7 +257,7 @@
 <translation id="3328801116991980348">網站資訊</translation>
 <translation id="3341058695485821946">查看節省的數據用量</translation>
 <translation id="3350687908700087792">關閉所有無痕式分頁</translation>
-<translation id="3358632888246345756">允許讀取特定網站的剪貼簿。</translation>
+<translation id="3358632888246345756">允許特定網站讀取剪貼簿。</translation>
 <translation id="3365671512111106261">開啟 Data Saver 時無法使用這項設定</translation>
 <translation id="3367813778245106622">如要開始同步處理,請重新登入</translation>
 <translation id="3384347053049321195">分享圖片</translation>
@@ -442,6 +444,7 @@
 <translation id="510275257476243843">還剩 1 小時</translation>
 <translation id="5127805178023152808">同步功能已停用</translation>
 <translation id="5129038482087801250">安裝網路應用程式</translation>
+<translation id="5139940364318403933">瞭解如何使用 Google 雲端硬碟</translation>
 <translation id="515227803646670480">清除儲存的資料</translation>
 <translation id="5152843274749979095">尚未安裝系統支援的應用程式</translation>
 <translation id="5161254044473106830">請輸入標題</translation>
@@ -695,6 +698,7 @@
 <translation id="7251326866581677552">封鎖部分網站的廣告</translation>
 <translation id="7253272406652746122">在裝置的「設定」應用程式中,透過「帳戶」頁面新增 Google 帳戶。</translation>
 <translation id="7274013316676448362">已封鎖網站</translation>
+<translation id="729975465115245577">你的裝置沒有可儲存密碼檔案的應用程式。</translation>
 <translation id="7318797029885648322">輕觸 [更多] 即可取得推薦文章</translation>
 <translation id="7333031090786104871">仍在新增先前的網站</translation>
 <translation id="7352939065658542140">影片</translation>
@@ -737,6 +741,7 @@
 <translation id="7649070708921625228">說明</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="7665369617277396874">新增帳戶</translation>
+<translation id="7682724950699840886">請嘗試按照下列提示操作:確認你的裝置上有足夠空間,然後嘗試重新匯出。</translation>
 <translation id="7698359219371678927">在「<ph name="APP_NAME" />」中建立電子郵件</translation>
 <translation id="773466115871691567">一律翻譯<ph name="SOURCE_LANGUAGE" />網頁</translation>
 <translation id="7735672056998735387"><ph name="SPACE_FREE" /> (<ph name="SPACE_OTHER" />)</translation>
@@ -809,6 +814,7 @@
 <translation id="8413126021676339697">顯示完整記錄</translation>
 <translation id="8428213095426709021">設定</translation>
 <translation id="8441146129660941386">倒轉到特定的播放時間點</translation>
+<translation id="8445448999790540984">無法匯出密碼</translation>
 <translation id="8447861592752582886">撤銷裝置權限</translation>
 <translation id="8487700953926739672">可離線使用</translation>
 <translation id="8489271220582375723">開啟紀錄頁面</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 04923cd..13263cc 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -513,6 +513,7 @@
   "java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarView.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java",
+  "java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBarDelegate.java",
   "java/src/org/chromium/chrome/browser/infobar/IPHBubbleDelegateImpl.java",
@@ -522,7 +523,6 @@
   "java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java",
   "java/src/org/chromium/chrome/browser/infobar/PreviewsInfoBar.java",
-  "java/src/org/chromium/chrome/browser/infobar/PwaAmbientBadgeInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java",
   "java/src/org/chromium/chrome/browser/infobar/SimpleConfirmInfoBarBuilder.java",
@@ -1169,7 +1169,6 @@
   "java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java",
   "java/src/org/chromium/chrome/browser/sync/SyncController.java",
   "java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java",
-  "java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java",
   "java/src/org/chromium/chrome/browser/sync/SyncUserDataWiper.java",
   "java/src/org/chromium/chrome/browser/sync/ui/PassphraseActivity.java",
   "java/src/org/chromium/chrome/browser/sync/ui/PassphraseCreationDialogFragment.java",
@@ -1446,7 +1445,6 @@
   "java/src/org/chromium/chrome/browser/vr_shell/VrCoreInfo.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrDaydreamApiImpl.java",
-  "java/src/org/chromium/chrome/browser/vr_shell/VrExternalNavigationDelegate.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrInputConnection.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java",
   "java/src/org/chromium/chrome/browser/vr_shell/VrWindowAndroid.java",
@@ -1669,6 +1667,7 @@
   "javatests/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java",
   "javatests/src/org/chromium/chrome/browser/omaha/StringSanitizerTest.java",
   "javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java",
+  "javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java",
   "javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java",
   "javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java",
   "javatests/src/org/chromium/chrome/browser/omnibox/SuggestionAnswerTest.java",
diff --git a/chrome/android/javatests/DEPS b/chrome/android/javatests/DEPS
index 9d35a9a2..6f99387 100644
--- a/chrome/android/javatests/DEPS
+++ b/chrome/android/javatests/DEPS
@@ -2,6 +2,7 @@
   "+components/autofill/android/java/src/org/chromium/components/autofill",
   "+components/background_task_scheduler/android/java",
   "+components/bookmarks/common/android/java/src/org/chromium/components/bookmarks",
+  "+components/content_view",
   "+components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement",
   "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core",
   "+components/gcm_driver/android/java/src/org/chromium/components/gcm_driver",
@@ -22,7 +23,6 @@
   "+content/public/android/java/src/org/chromium/content_public",
   "!content/public/android/java/src/org/chromium/content/browser/BindingManager.java",
   "!content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java",
-  "!content/public/android/java/src/org/chromium/content/browser/ContentView.java",
   "!content/public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java",
   "!content/public/android/java/src/org/chromium/content/browser/input/ChromiumBaseInputConnection.java",
   "!content/public/android/java/src/org/chromium/content/common/ContentSwitches.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
index 7832185..cc20a28 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
@@ -22,7 +22,7 @@
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content.browser.ContentView;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
 import org.chromium.content.browser.test.util.DOMUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
index 12cb49d..d77800b2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java
@@ -16,6 +16,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
@@ -206,6 +207,7 @@
     @Feature({"Omaha"})
     @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
     @RetryOnFailure
+    @DisabledTest(message = "crbug.com/814575")
     public void testMenuItemNotShownInOverview() throws Exception {
         checkUpdateMenuItemIsShowing("0.0.0.0", "1.2.3.4");
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
new file mode 100644
index 0000000..36017f4
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -0,0 +1,129 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.omnibox;
+
+import android.support.test.filters.SmallTest;
+import android.view.View;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.widget.TintedImageButton;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
+import org.chromium.ui.test.util.UiRestriction;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Unit tests for {@link LocationBarLayout}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public class LocationBarLayoutTest {
+    @Rule
+    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(ChromeActivity.class);
+
+    @Rule
+    public TestRule mProcessor = new Features.InstrumentationProcessor();
+
+    @Before
+    public void setUp() throws InterruptedException {
+        mActivityTestRule.startMainActivityOnBlankPage();
+    }
+
+    private LocationBarLayout getLocationBar() {
+        return (LocationBarLayout) mActivityTestRule.getActivity().findViewById(R.id.location_bar);
+    }
+
+    private TintedImageButton getDeleteButton() {
+        return (TintedImageButton) mActivityTestRule.getActivity().findViewById(R.id.delete_button);
+    }
+
+    private TintedImageButton getMicButton() {
+        return (TintedImageButton) mActivityTestRule.getActivity().findViewById(R.id.mic_button);
+    }
+
+    private void setUrlBarTextAndFocus(String text)
+            throws ExecutionException, InterruptedException {
+        ThreadUtils.runOnUiThreadBlocking(new Callable<Void>() {
+            @Override
+            public Void call() throws InterruptedException {
+                mActivityTestRule.typeInOmnibox(text, false);
+                getLocationBar().onUrlFocusChange(true);
+                return null;
+            }
+        });
+    }
+
+    @Test
+    @SmallTest
+    @DisableFeatures(ChromeFeatureList.OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE)
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+    @Feature({"OmniboxVoiceSearchAlwaysVisible"})
+    public void testNotShowingVoiceSearchButtonIfUrlBarContainsTextAndFlagIsDisabled()
+            throws ExecutionException, InterruptedException {
+        setUrlBarTextAndFocus("testing");
+
+        Assert.assertEquals(getDeleteButton().getVisibility(), View.VISIBLE);
+        Assert.assertNotEquals(getMicButton().getVisibility(), View.VISIBLE);
+    }
+
+    @Test
+    @SmallTest
+    @DisableFeatures(ChromeFeatureList.OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE)
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+    @Feature({"OmniboxVoiceSearchAlwaysVisible"})
+    public void testShowingVoiceSearchButtonIfUrlBarIsEmptyAndFlagIsDisabled()
+            throws ExecutionException, InterruptedException {
+        setUrlBarTextAndFocus("");
+
+        Assert.assertNotEquals(getDeleteButton().getVisibility(), View.VISIBLE);
+        Assert.assertEquals(getMicButton().getVisibility(), View.VISIBLE);
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ChromeFeatureList.OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE)
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+    @Feature({"OmniboxVoiceSearchAlwaysVisible"})
+    public void testShowingVoiceAndDeleteButtonsShowingIfUrlBarContainsText()
+            throws ExecutionException, InterruptedException {
+        setUrlBarTextAndFocus("testing");
+
+        Assert.assertEquals(getDeleteButton().getVisibility(), View.VISIBLE);
+        Assert.assertEquals(getMicButton().getVisibility(), View.VISIBLE);
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ChromeFeatureList.OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE)
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+    @Feature({"OmniboxVoiceSearchAlwaysVisible"})
+    public void testShowingOnlyVoiceButtonIfUrlBarIsEmpty()
+            throws ExecutionException, InterruptedException {
+        setUrlBarTextAndFocus("");
+
+        Assert.assertNotEquals(getDeleteButton().getVisibility(), View.VISIBLE);
+        Assert.assertEquals(getMicButton().getVisibility(), View.VISIBLE);
+    }
+}
\ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPromoUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPromoUtilsTest.java
index f23f4c02..e19fc13 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPromoUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPromoUtilsTest.java
@@ -22,6 +22,7 @@
 import org.chromium.base.test.util.AdvancedMockContext;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge.AboutVersionStrings;
@@ -56,9 +57,11 @@
     @Test
     @SmallTest
     @UiThreadTest
-    @CommandLineFlags.Add("force-fieldtrials=DataCompressionProxyPromoVisibility/Enabled")
+    @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+            "force-fieldtrials=DataCompressionProxyPromoVisibility/Enabled"})
     @Feature({"DataReduction"})
-    public void testCanShowPromos() throws Throwable {
+    public void
+    testCanShowPromos() throws Throwable {
         if (DataReductionProxySettings.getInstance().isDataReductionProxyManaged()) return;
         Assert.assertFalse(DataReductionProxySettings.getInstance().isDataReductionProxyEnabled());
         Assert.assertTrue(DataReductionPromoUtils.canShowPromos());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/TestVrShellDelegate.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/TestVrShellDelegate.java
index 8436006..f08cff5f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/TestVrShellDelegate.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/TestVrShellDelegate.java
@@ -81,6 +81,16 @@
         return super.isVrEntryComplete();
     }
 
+    @Override
+    public boolean isShowingDoff() {
+        return super.isShowingDoff();
+    }
+
+    @Override
+    public void acceptDoffPromptForTesting() {
+        super.acceptDoffPromptForTesting();
+    }
+
     /**
      * Wait a short period of time before running if we think the DON flow was cancelled.
      *
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
index 4794c9b..19d9a33 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.vr_shell;
 
+import static org.chromium.chrome.browser.vr_shell.TestFramework.POLL_TIMEOUT_LONG_MS;
 import static org.chromium.chrome.browser.vr_shell.VrTestFramework.PAGE_LOAD_TIMEOUT_S;
 import static org.chromium.chrome.browser.vr_shell.VrTestFramework.POLL_CHECK_INTERVAL_SHORT_MS;
 import static org.chromium.chrome.browser.vr_shell.VrTestFramework.POLL_TIMEOUT_LONG_MS;
@@ -13,6 +14,8 @@
 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_VIEWER_DAYDREAM;
 
 import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
@@ -32,6 +35,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
 import org.chromium.chrome.browser.vr_shell.mock.MockVrDaydreamApi;
 import org.chromium.chrome.browser.vr_shell.rules.ChromeTabbedActivityVrTestRule;
 import org.chromium.chrome.browser.vr_shell.util.NfcSimUtils;
@@ -39,6 +45,7 @@
 import org.chromium.chrome.browser.vr_shell.util.VrShellDelegateUtils;
 import org.chromium.chrome.browser.vr_shell.util.VrTransitionUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ActivityUtils;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
 import org.chromium.content.browser.test.util.DOMUtils;
@@ -355,4 +362,100 @@
         Assert.assertFalse(mockApi.getExitFromVrCalled());
         Assert.assertFalse(mockApi.getLaunchVrHomescreenCalled());
     }
+
+    /**
+     * Tests that attempting to start an Activity through the Activity context in VR triggers DOFF.
+     */
+    @Test
+    @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+    @MediumTest
+    public void testStartActivityTriggersDoffChromeActivity()
+            throws InterruptedException, TimeoutException {
+        testStartActivityTriggersDoffImpl(mTestRule.getActivity());
+    }
+
+    /**
+     * Tests that attempting to start an Activity through the Application context in VR triggers
+     * DOFF.
+     */
+    @Test
+    @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+    @MediumTest
+    public void testStartActivityTriggersDoffAppContext()
+            throws InterruptedException, TimeoutException {
+        testStartActivityTriggersDoffImpl(mTestRule.getActivity().getApplicationContext());
+    }
+
+    private void testStartActivityTriggersDoffImpl(Context context)
+            throws InterruptedException, TimeoutException {
+        Assert.assertTrue(TransitionUtils.forceEnterVr());
+        TransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS);
+        Assert.assertTrue(VrShellDelegateUtils.getDelegateInstance().isVrEntryComplete());
+
+        MockVrDaydreamApi mockApi = new MockVrDaydreamApi() {
+            @Override
+            public Boolean isDaydreamCurrentViewer() {
+                return true;
+            }
+        };
+        VrShellDelegateUtils.getDelegateInstance().overrideDaydreamApiForTesting(mockApi);
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            Intent preferencesIntent = PreferencesLauncher.createIntentForSettingsPage(
+                    context, SingleWebsitePreferences.class.getName());
+            context.startActivity(preferencesIntent);
+            VrShellDelegateUtils.getDelegateInstance().acceptDoffPromptForTesting();
+        });
+
+        CriteriaHelper.pollUiThread(() -> { return mockApi.getExitFromVrCalled(); });
+        Assert.assertFalse(mockApi.getLaunchVrHomescreenCalled());
+        MockVrDaydreamApi mockApiWithDoff = new MockVrDaydreamApi() {
+            @Override
+            public boolean exitFromVr(int requestCode, final Intent intent) {
+                return true;
+            }
+
+            @Override
+            public Boolean isDaydreamCurrentViewer() {
+                return true;
+            }
+        };
+
+        VrShellDelegateUtils.getDelegateInstance().overrideDaydreamApiForTesting(mockApiWithDoff);
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            PreferencesLauncher.launchSettingsPage(context, null);
+            VrShellDelegateUtils.getDelegateInstance().acceptDoffPromptForTesting();
+        });
+        CriteriaHelper.pollUiThread(
+                () -> { return VrShellDelegateUtils.getDelegateInstance().isShowingDoff(); });
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mTestRule.getActivity().onActivityResult(
+                    VrShellDelegate.EXIT_VR_RESULT, Activity.RESULT_OK, null);
+        });
+
+        ActivityUtils.waitForActivity(
+                InstrumentationRegistry.getInstrumentation(), Preferences.class);
+    }
+
+    /**
+     * Tests that attempting to start an Activity through the Activity context in VR triggers DOFF.
+     */
+    @Test
+    @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM)
+    @MediumTest
+    public void testStartActivityIfNeeded() throws InterruptedException, TimeoutException {
+        Activity context = mTestRule.getActivity();
+        Assert.assertTrue(TransitionUtils.forceEnterVr());
+        TransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS);
+        Assert.assertTrue(VrShellDelegateUtils.getDelegateInstance().isVrEntryComplete());
+
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                Intent preferencesIntent = PreferencesLauncher.createIntentForSettingsPage(
+                        context, SingleWebsitePreferences.class.getName());
+                Assert.assertFalse(context.startActivityIfNeeded(preferencesIntent, 0));
+            }
+        });
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/mock/MockVrDaydreamApi.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/mock/MockVrDaydreamApi.java
index 580ac6b..6e2acf82 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/mock/MockVrDaydreamApi.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/mock/MockVrDaydreamApi.java
@@ -55,7 +55,7 @@
     @Override
     public boolean exitFromVr(int requestCode, final Intent intent) {
         mExitFromVrCalled = true;
-        return true;
+        return false;
     }
 
     @Override
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 3132fc2..13b0792 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-66.0.3350.0_rc-r1.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-66.0.3352.0_rc-r2.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/bookmarks_strings.grdp b/chrome/app/bookmarks_strings.grdp
index 24bd20a8..774f9a7 100644
--- a/chrome/app/bookmarks_strings.grdp
+++ b/chrome/app/bookmarks_strings.grdp
@@ -188,9 +188,6 @@
     Bookmark added
   </message>
   <message name="IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARK" desc="Title of the bubble when re-clicking on a bookmark">
-    Bookmark
-  </message>
-  <message name="IDS_BOOKMARK_AX_BUBBLE_PAGE_BOOKMARK" desc="Title of the bubble when re-clicking on a bookmark, read by spoken feedback">
     Edit bookmark
   </message>
   <message name="IDS_BOOKMARK_BUBBLE_NAME_LABEL" desc="Text preceding the title of the page that was bookmarked">
@@ -206,16 +203,16 @@
     Bookmark folder
   </message>
   <if expr="not use_titlecase">
-    <message name="IDS_BOOKMARK_BUBBLE_OPTIONS" desc="Title of the button the user can click to edit details of the bookmark">
-      Edit...
+    <message name="IDS_BOOKMARK_BUBBLE_OPTIONS" desc="Title of the button the user can click to go to a more advanced bookmark editor">
+      Advanced
     </message>
     <message name="IDS_BOOKMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER" desc="Text in the combobox allowing the user to choose another folder (by bringing up the editor).">
       Choose another folder...
     </message>
   </if>
   <if expr="use_titlecase">
-    <message name="IDS_BOOKMARK_BUBBLE_OPTIONS" desc="In Title Case: Title of the button the user can click to edit details of the bookmark">
-      Edit...
+    <message name="IDS_BOOKMARK_BUBBLE_OPTIONS" desc="In Title Case: Title of the button the user can click to go to a more advanced bookmark editor">
+      Advanced
     </message>
     <message name="IDS_BOOKMARK_BUBBLE_CHOOSER_ANOTHER_FOLDER" desc="In Title Case: Text in the combobox allowing the user to choose another folder (by bringing up the editor).">
       Choose Another Folder...
diff --git a/chrome/app/chrome_renderer_manifest.json b/chrome/app/chrome_renderer_manifest.json
index 7ea56ad..4d75369 100644
--- a/chrome/app/chrome_renderer_manifest.json
+++ b/chrome/app/chrome_renderer_manifest.json
@@ -5,6 +5,7 @@
     "service_manager:connector": {
       "provides": {
         "browser": [
+          "safe_browsing::mojom::PhishingModelSetter",
           "spellcheck::mojom::SpellChecker"
         ]
       },
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 780f61a74..369a97f 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5104,13 +5104,13 @@
       <message name="IDS_TOOLTIP_BACK" desc="The tooltip for back button">
         Click to go back, hold to see history
       </message>
-      <message name="IDS_ACCNAME_TOOLTIP_BACK" desc="The tooltip for back button suited for non-mouse users">
-        Press to go back, use context menu to see history
+      <message name="IDS_ACCDESCRIPTION_BACK" desc="Help text that explains to keyboard users how to interact with the back button, similar to the tooltip presented to mouse users.">
+        Press to go back, context menu to see history
       </message>
       <message name="IDS_TOOLTIP_FORWARD" desc="The tooltip for forward button">
         Click to go forward, hold to see history
       </message>
-      <message name="IDS_ACCNAME_TOOLTIP_FORWARD" desc="The tooltip for forward button  suited for non-mouse users">
+      <message name="IDS_ACCDESCRIPTION_FORWARD" desc="Help text that explains to keyboard users how to interact with the forward button, similar to the tooltip presented to mouse users.">
         Press to go forward, context menu to see history
       </message>
       <message name="IDS_TOOLTIP_HOME" desc="The tooltip for the home button">
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index 333d096..597e6ce 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -115,6 +115,7 @@
 <translation id="5386450000063123300">Chromium се актуализира (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Налице е нова версия на Chromium.</translation>
 <translation id="5427571867875391349">Задаване на Chromium като браузър по подразбиране</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium бета</translation>
 <translation id="5466153949126434691">Chromium се актуализира автоматично, така че винаги да имате най-новата версия. Когато това изтегляне завърши, Chromium ще се рестартира и ще можете да започнете работа.</translation>
 <translation id="5479196819031988440">Chromium OS не може да отвори тази страница.</translation>
 <translation id="5480860683791598150">Chromium се нуждае от достъп до данните за местоположението ви, за да ги сподели с този сайт</translation>
@@ -185,6 +186,7 @@
 <ph name="BEGIN_LINK_2" />Научете повече<ph name="END_LINK_2" />
 
 За допълнителни инструкции, моля, проверете електронната си поща на адрес <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium се нуждае от разрешение за достъп до камерата ви за този сайт</translation>
 <translation id="7483335560992089831">Не може да се инсталира същата версия на Chromium, която се използва понастоящем. Моля, затворете браузъра и опитайте отново.</translation>
 <translation id="7549178288319965365">Всичко за Chromium OS</translation>
@@ -198,6 +200,7 @@
 <translation id="7756122083761163394">Данните за сърфирането на този човек ще се изтрият от устройството. За да ги възстановите, влезте в Chrome като $2.</translation>
 <translation id="7773960292263897147">Предупреждение: Chromium не може да попречи на разширенията да записват историята ви на сърфиране. За да деактивирате това разширение в режим „инкогнито“, премахнете отметката от тази опция.</translation>
 <translation id="7774736947049807614">Грешка в сертификата за удостоверяване. Моля, влезте отново в Chromium като <ph name="USER_NAME" /> или се свържете с администратора си за повече информация. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium не можа да се актуализира до най-новата версия. Това означава, че пропускате нови функции и корекции за сигурност.</translation>
 <translation id="7937630085815544518">Бяхте влезли в Chromium като <ph name="USER_EMAIL_ADDRESS" />. Моля, използвайте същия профил, за да влезете отново.</translation>
 <translation id="7962572577636132072">Chromium се актуализира автоматично, така че винаги да имате най-новата версия.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb
index a21124a..2f56207 100644
--- a/chrome/app/resources/chromium_strings_bn.xtb
+++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Chromium আপডেট হচ্ছে (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium-এর একটি নতুন সংস্করণ উপলব্ধ আছে৷</translation>
 <translation id="5427571867875391349">Chromium কে আপনার ডিফল্ট ব্রাউজার হিসাবে সেট করুন</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium বিটা</translation>
 <translation id="5466153949126434691">Chromium স্বয়ংক্রিয়ভাবে আপডেট হয় তাই আপনার কাছে সর্বদা নবীনতম সংস্করণটি থাকে৷ এই ডাউনলোডটি সম্পূর্ণ হলে, Chromium আবার চালু হবে এবং আপনি আবার আগের মতো Chrome ব্যবহার করতে পারবেন৷</translation>
 <translation id="5479196819031988440">Chromium OS এই পৃষ্ঠাটি খুলতে পারবে না।</translation>
 <translation id="5480860683791598150">এই সাইটটির সাথে আপনার লোকেশন শেয়ার করার জন্য Chromium কে আপনার লোকেশনের তথ্যে অ্যাক্সেস দিতে হবে</translation>
@@ -189,6 +190,7 @@
 <ph name="BEGIN_LINK_2" />আরও জানুন<ph name="END_LINK_2" />
 
 অতিরিক্ত নির্দেশাবলীর জন্য দয়া করে <ph name="ACCOUNT_EMAIL" /> এ গিয়ে আপনার ইমেল দেখুন।</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">এই সাইটটির জন্য Chromium কে আপনার ক্যামেরায় অ্যাক্সেস দিতে হবে</translation>
 <translation id="7483335560992089831">একই Chromium সংস্করণ যা বর্তমানে চলমান, ইনস্টল করতে পারবেন না৷ দয়া করে Chromium বন্ধ করুন এবং আবার চেষ্টা করুন৷</translation>
 <translation id="7549178288319965365">Chromium OS সম্পর্কে</translation>
@@ -202,6 +204,7 @@
 <translation id="7756122083761163394">এই ডিভাইস থেকে এই ব্যক্তির ব্রাউজিং ডেটা মুছে ফেলা হবে। ডেটা পুনরুদ্ধার করতে Chrome এ $2 হিসাবে সাইন-ইন করুন।</translation>
 <translation id="7773960292263897147">সতর্কতা: Chromium ব্রাউজিং ইতিহাস রেকর্ডিং করা থেকে এক্সটেনশনগুলিতে বাধা দিতে পারেনা। ছদ্মবেশী মোডে এই এক্সটেনশনটি অক্ষম করতে, এই বিকল্পটি নির্বাচন মুক্ত করুন।</translation>
 <translation id="7774736947049807614">প্রমাণীকরণের শংসাপত্রটি কাজ করেনি। অনুগ্রহ করে <ph name="USER_NAME" /> হিসেবে আবার Chromium এ সাইন-ইন করুন বা আরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন। <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium লেটেস্ট ভার্সনে আপডেট করা যাচ্ছে না, তাই আপনি নতুন বৈশিষ্ট্য এবং সুরক্ষা সমাধানগুলি পাচ্ছেন না।</translation>
 <translation id="7937630085815544518">আপনি <ph name="USER_EMAIL_ADDRESS" /> হিসাবে Chromium এ প্রবেশ করেছেন৷ আবার সাইন করতে দয়া করে একই অ্যাকাউন্ট ব্যবহার করুন৷</translation>
 <translation id="7962572577636132072">Chromium স্বয়ংক্রিয়ভাবে আপডেট হয় তাই আপনি সবসময় নবীনতম সংস্করণটি পান৷</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index f70caaa8..2bd68b3 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">S'està actualitzant Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Hi ha disponible una versió nova de Chromium.</translation>
 <translation id="5427571867875391349">Defineix Chromium com a navegador predeterminat</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium s'actualitza automàticament perquè en tingueu sempre la versió més recent. Quan es completi aquesta baixada, Chromium es reiniciarà i ja el podreu utilitzar.</translation>
 <translation id="5479196819031988440">Chromium OS no pot obrir aquesta pàgina.</translation>
 <translation id="5480860683791598150">Chromium necessita accedir a la teva ubicació per compartir-la amb aquest lloc web</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Més informació<ph name="END_LINK_2" />
 
 Per obtenir més instruccions, consulteu el correu electrònic a <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">Per visitar aquest lloc web, Chromium necessita permís per accedir a la càmera</translation>
 <translation id="7483335560992089831">No es pot instal·lar la mateixa versió de Chromium que s'està executant actualment. Tanqueu Chromium i torneu-ho a provar.</translation>
 <translation id="7549178288319965365">About Chromium OS</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Les dades de navegació d'aquesta persona se suprimiran d'aquest dispositiu. Per recuperar-ne les dades, inicia la sessió a Chrome com a $2.</translation>
 <translation id="7773960292263897147">Advertiment: Chromium no pot evitar que les extensions registrin l'historial de navegació. Per desactivar aquesta extensió en mode d'incògnit, desmarca aquesta opció.</translation>
 <translation id="7774736947049807614">El certificat d'autenticació ha fallat. Torna a iniciar la sessió a Chromium com a <ph name="USER_NAME" /> o contacta amb l'administrador per obtenir més informació. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium no s'ha pogut actualitzar a la darrera versió, així que no pots gaudir de les noves funcions ni de les correccions de seguretat.</translation>
 <translation id="7937630085815544518">Teníeu la sessió iniciada a Chromium com a <ph name="USER_EMAIL_ADDRESS" />. Utilitzeu el mateix compte per tornar a iniciar-hi la sessió.</translation>
 <translation id="7962572577636132072">Chromium s'actualitza automàticament perquè en tingueu sempre la versió més recent.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index c0a8b37..920a752 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Aktualizace prohlížeče Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">K dispozici je nová verze prohlížeče Chromium.</translation>
 <translation id="5427571867875391349">Nastavit Chromium jako výchozí prohlížeč</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
 <translation id="5466153949126434691">Prohlížeč Chromium se automaticky aktualizuje, abyste vždy měli k dispozici nejnovější verzi. Až toto stahování skončí, Chromium se restartuje a budete moci pokračovat.</translation>
 <translation id="5479196819031988440">Chromium OS tuto stránku nedokáže otevřít</translation>
 <translation id="5480860683791598150">Prohlížeč Chromium potřebuje přístup k vaší poloze, aby ji mohl sdílet s tímto webem</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />Další informace<ph name="END_LINK_2" />
 
 Další pokyny naleznete v e-mailu ve svém účtu <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium pro tento web potřebuje oprávnění k přístupu k fotoaparátu</translation>
 <translation id="7483335560992089831">Nelze nainstalovat verzi prohlížeče Chromium, která je právě spuštěná. Ukončete prohlížeč Chromium a zkuste to znovu.</translation>
 <translation id="7549178288319965365">O systému Chromium OS</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">Ze zařízení budou smazány údaje této osoby o prohlížení. Chcete-li tyto údaje znovu získat, přihlaste se do Chromu jako $2.</translation>
 <translation id="7773960292263897147">Upozornění: Chromium nemůže rozšířením zabránit v zaznamenávání vaší historie procházení. Chcete-li toto rozšíření v anonymním režimu deaktivovat, zrušte výběr této možnosti.</translation>
 <translation id="7774736947049807614">Ověřovací certifikát selhal. Přihlaste se do prohlížeče Chromium znovu jako uživatel <ph name="USER_NAME" /> nebo svého administrátora požádejte o další informace. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium nebylo možné aktualizovat na nejnovější verzi. Nemáte proto k dispozici nové funkce a opravy zabezpečení.</translation>
 <translation id="7937630085815544518">K prohlížeči Chromium jste byli přihlášeni s účtem <ph name="USER_EMAIL_ADDRESS" />. Přihlaste se prosím znovu pomocí stejného účtu.</translation>
 <translation id="7962572577636132072">Prohlížeč Chromium se automaticky aktualizuje, abyste vždy měli k dispozici nejnovější verzi.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index 3f437d6..2e32c80f 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -117,11 +117,12 @@
 <translation id="5386450000063123300">Chromium wird aktualisiert (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Eine neue Version von Chromium ist verfügbar.</translation>
 <translation id="5427571867875391349">Chromium als Standardbrowser festlegen</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium wird automatisch aktualisiert, sodass Sie immer über die neueste Version verfügen. Nach Abschluss des Downloads wird Chromium neu gestartet und Sie können fortfahren.</translation>
 <translation id="5479196819031988440">Chromium OS kann diese Seite nicht öffnen.</translation>
 <translation id="5480860683791598150">Chromium benötigt Zugriff auf Ihren Standort, um ihn mit dieser Website zu teilen</translation>
 <translation id="549669000822060376">Bitte warten Sie, bis die aktuellen Systemupdates von Chromium installiert wurden.</translation>
-<translation id="5631814766731275228">Chromium-Name und ‑Bild</translation>
+<translation id="5631814766731275228">Chromium-Name und -Bild</translation>
 <translation id="5634636535844844681">Für Chromium ist Windows 7 oder höher erforderlich.</translation>
 <translation id="5680901439334282664">In Chromium anmelden</translation>
 <translation id="5698481217667032250">Chromium in dieser Sprache anzeigen</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Weitere Infos<ph name="END_LINK_2" />
 
 Weitere Informationen wurden per E-Mail an <ph name="ACCOUNT_EMAIL" /> gesendet.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium benötigt für diese Website die Berechtigung, auf Ihre Kamera zuzugreifen</translation>
 <translation id="7483335560992089831">Die Chromium-Version kann nicht installiert werden, da sie aktuell ausgeführt wird. Schließen Sie Chromium bitte und versuchen Sie es erneut.</translation>
 <translation id="7549178288319965365">Über Chromium OS</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Die Browserdaten dieser Person werden von diesem Gerät gelöscht. Um die Daten wiederherzustellen, melden Sie sich als $2 in Chrome an.</translation>
 <translation id="7773960292263897147">Achtung: Chromium kann nicht verhindern, dass Ihr Browserverlauf von Erweiterungen protokolliert wird. Sie können diese Erweiterung für den Inkognitomodus deaktivieren, indem Sie die Auswahl für die entsprechende Option aufheben.</translation>
 <translation id="7774736947049807614">Authentifizierungszertifikat fehlgeschlagen. Bitte melden Sie sich wieder bei Chromium als <ph name="USER_NAME" /> an oder wenden Sie sich an Ihren Administrator, um weitere Informationen zu erhalten. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium konnte nicht auf die neueste Version aktualisiert werden. In Ihrer Version fehlen daher einige neue Funktionen und Sicherheitspatches.</translation>
 <translation id="7937630085815544518">Sie waren in Chromium als <ph name="USER_EMAIL_ADDRESS" /> angemeldet. Melden Sie sich bitte wieder mit demselben Konto an.</translation>
 <translation id="7962572577636132072">Chromium wird automatisch aktualisiert, sodass Sie immer über die neueste Version verfügen.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb
index 2693c46..f2604437 100644
--- a/chrome/app/resources/chromium_strings_es-419.xtb
+++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -115,6 +115,7 @@
 <translation id="5386450000063123300">Actualizando Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Hay una nueva versión de Chromium disponible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como navegador predeterminado</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" />: Versión beta de Chromium</translation>
 <translation id="5466153949126434691">Chromium se actualiza automáticamente para que siempre tengas la versión más reciente. Cuando se complete esta descarga, Chromium se reiniciará y podrás usarlo.</translation>
 <translation id="5479196819031988440">El Sistema operativo Chromium no puede abrir esta página.</translation>
 <translation id="5480860683791598150">Chromium necesita acceder a tu ubicación para compartirla con este sitio</translation>
@@ -185,6 +186,7 @@
 <ph name="BEGIN_LINK_2" />Más información<ph name="END_LINK_2" />
 
 Para obtener más instrucciones, revisa tu correo electrónico en <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" />: Chromium para desarrolladores</translation>
 <translation id="7451052299415159299">Chromium necesita permiso para acceder a tu cámara para este sitio</translation>
 <translation id="7483335560992089831">No es posible instalar la misma versión de Chromium que se está ejecutando. Cierra Chromium y vuelve a intentarlo.</translation>
 <translation id="7549178288319965365">Acerca de Chromium OS</translation>
@@ -198,6 +200,7 @@
 <translation id="7756122083761163394">Los datos de navegación de esta persona se borrarán de este dispositivo. Para recuperarlos, accede a Chrome como $2.</translation>
 <translation id="7773960292263897147">Advertencia: Chromium no puede evitar que las extensiones registren tu historial de búsqueda. Para desactivar esta extensión en modo de navegación incógnito, desmarca la casilla de esta opción.</translation>
 <translation id="7774736947049807614">Se produjo un error en el certificado de autenticación. Vuelve a acceder a tu cuenta en Chromium como <ph name="USER_NAME" /> o comunícate con tu administrador para obtener más información. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" />: Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium no se pudo actualizar a la última versión, por lo que te estás perdiendo las nuevas funciones y correcciones de seguridad.</translation>
 <translation id="7937630085815544518">Accediste a Chromium con <ph name="USER_EMAIL_ADDRESS" />. Usa la misma cuenta para volver a acceder.</translation>
 <translation id="7962572577636132072">Chromium se actualiza automáticamente para que siempre tengas la versión más reciente.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index e30a0938..405cc12 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Actualizando Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Hay una nueva versión de Chromium disponible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como navegador predeterminado</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> ‑ Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium se actualiza automáticamente para que siempre dispongas de la última versión. Cuando se complete la descarga, Chromium se reiniciará automáticamente.</translation>
 <translation id="5479196819031988440">Chromium OS no puede abrir esta página.</translation>
 <translation id="5480860683791598150">Chromium necesita acceder a tu ubicación para compartirla con este sitio web</translation>
@@ -140,7 +141,7 @@
 <translation id="5987687638152509985">Actualiza Chromium para iniciar la sincronización</translation>
 <translation id="6055895534982063517">Hay una nueva versión de Chromium disponible que funciona a una velocidad sin precedentes.</translation>
 <translation id="6063093106622310249">&amp;Abrir en Chromium</translation>
-<translation id="6072279588547424923">"<ph name="EXTENSION_NAME" />" se ha añadido a Chromium</translation>
+<translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> se ha añadido a Chromium</translation>
 <translation id="608189560609172163">Chromium no ha podido sincronizar los datos debido a un error de inicio de sesión.</translation>
 <translation id="6096348254544841612">Personaliza y controla Chromium. Hay una actualización disponible.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> es peligroso, por lo que Chromium lo ha bloqueado.</translation>
@@ -194,6 +195,7 @@
 <ph name="BEGIN_LINK_2" />Más información<ph name="END_LINK_2" />
 
 Consulta tu correo electrónico (<ph name="ACCOUNT_EMAIL" />) para obtener más información.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> ‑ Chromium para desarrolladores</translation>
 <translation id="7451052299415159299">Chromium necesita permiso para acceder a la cámara en este sitio web</translation>
 <translation id="7483335560992089831">No se puede instalar la misma versión de Chromium que se está ejecutando actualmente. Cierra Chromium y vuelve a intentarlo.</translation>
 <translation id="7549178288319965365">Información de Chromium OS</translation>
@@ -207,6 +209,7 @@
 <translation id="7756122083761163394">Los datos de navegación de este usuario se eliminarán de este dispositivo. Para recuperarlos, inicia sesión en Chrome como $2.</translation>
 <translation id="7773960292263897147">Advertencia: Chromium no puede evitar que las extensiones registren el historial de navegación. Para inhabilitar esta extensión en modo incógnito, desactiva esta opción.</translation>
 <translation id="7774736947049807614">No se ha podido autenticar el certificado. Vuelve a iniciar sesión en Chromium como <ph name="USER_NAME" /> o ponte en contacto con tu administrador para obtener más información. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> ‑ Chromium Canary</translation>
 <translation id="7867198900892795913">No se ha podido actualizar Chromium a la versión más reciente, por lo que no disfrutas de las últimas funciones y correcciones de seguridad.</translation>
 <translation id="7937630085815544518">Habías iniciado sesión en Chromium como <ph name="USER_EMAIL_ADDRESS" />. Utiliza la misma cuenta para volver a iniciar sesión.</translation>
 <translation id="7962572577636132072">Chromium se actualiza automáticamente para que siempre dispongas de la última versión.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index fdfbd30..2f3ee89 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Chromiumi värskendamine (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromiumi uus versioon on saadaval.</translation>
 <translation id="5427571867875391349">Määra Chromium vaikebrauseriks</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromiumi beetaversioon</translation>
 <translation id="5466153949126434691">Chromium teeb värskendused automaatselt, nii et kasutate alati uusimat versiooni. Kui allalaadimine on lõppenud, siis Chrome taaskäivitub ja võite alustada kasutamist.</translation>
 <translation id="5479196819031988440">Chromium OS ei saa seda lehte avada.</translation>
 <translation id="5480860683791598150">Chromium vajab juurdepääsu teie asukohale, et seda selle saidiga jagada</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Lisateave<ph name="END_LINK_2" />
 
 Täiendavad juhised leiate aadressilt <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium vajab selle saidi puhul luba, et teie kaamerale juurde pääseda</translation>
 <translation id="7483335560992089831">Ei saa installida sama Chromiumi versiooni, mis praegu töötab. Sulgege Chromium ja proovige uuesti.</translation>
 <translation id="7549178288319965365">Teave Chromium OS-i kohta</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Selle isiku sirvimisandmed kustutatakse seadmest. Andmete taastamiseks logige Chrome'i sisse kasutajana $2.</translation>
 <translation id="7773960292263897147">Hoiatus. Chromium ei saa takistada laiendustel teie sirvimisajalugu salvestada. Kui soovite laienduse inkognito režiimis keelata, siis tühistage see valik.</translation>
 <translation id="7774736947049807614">Autentimissertifikaat ebaõnnestus. Logige Chromiumisse uuesti sisse kasutajana <ph name="USER_NAME" /> või võtke lisateabe saamiseks ühendust administraatoriga. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromiumi ei saanud uusimale versioonile värskendada, mistõttu jääte ilma uutest funktsioonidest ja turvaparandustest.</translation>
 <translation id="7937630085815544518">Olite Chromiumisse sisse logitud kasutajana <ph name="USER_EMAIL_ADDRESS" />. Kasutage uuesti sisselogimiseks sama kontot.</translation>
 <translation id="7962572577636132072">Chromium teeb värskendused automaatselt, nii et kasutate alati uusimat versiooni.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index 3ee566b7..9823bf07 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -117,11 +117,12 @@
 <translation id="5386450000063123300">Päivitetään Chromiumia (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromiumista on saatavilla uusi versio.</translation>
 <translation id="5427571867875391349">Aseta Chromium oletusselaimeksi</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium päivittyy automaattisesti, joten käytössäsi on aina uusin versio. Kun lataus on valmis, Chromium käynnistyy uudelleen ja voit aloittaa käytön.</translation>
 <translation id="5479196819031988440">Chromium-käyttöjärjestelmä ei voi avata tätä sivua.</translation>
 <translation id="5480860683791598150">Chromium tarvitsee oikeuden käyttää sijaintiasi, jotta se voidaan jakaa tämän sivuston kanssa.</translation>
 <translation id="549669000822060376">Odota hetki, Chromium asentaa uusimpia järjestelmäpäivityksiä.</translation>
-<translation id="5631814766731275228">Chromium-nimi ja ‑kuva</translation>
+<translation id="5631814766731275228">Chromiumin nimi ja kuva</translation>
 <translation id="5634636535844844681">Chromium edellyttää Windows 7:ää tai uudempaa versiota.</translation>
 <translation id="5680901439334282664">Kirjaudu sisään Chromiumiin</translation>
 <translation id="5698481217667032250">Näytä Chromium tällä kielellä</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Lisätietoja<ph name="END_LINK_2" />
 
 Lähetimme lisäohjeita sähköpostiisi osoitteeseen <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium tarvitsee oikeuden käyttää kameraasi tällä sivustolla.</translation>
 <translation id="7483335560992089831">Chromiumista ei voi asentaa versiota, joka on tällä hetkellä käynnissä. Sulje Chromium ja yritä uudelleen.</translation>
 <translation id="7549178288319965365">Tietoja Chromium-käyttöjärjestelmästä</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Käyttäjän selaustiedot poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.</translation>
 <translation id="7773960292263897147">Varoitus: Chromium ei voi estää laajennuksia tallentamasta selaushistoriaasi. Poista tämä valinta, jos haluat poistaa tämän laajennuksen käytöstä incognito-tilassa.</translation>
 <translation id="7774736947049807614">Todennusvarmenne epäonnistui. Kirjaudu uudelleen Chromiumiin käyttäjänä <ph name="USER_NAME" /> tai ota yhteyttä järjestelmänvalvojaan. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromiumia ei voitu päivittää uusimpaan versioon, joten sinulta puuttuu joitakin uusia ominaisuuksia ja tietoturvakorjauksia.</translation>
 <translation id="7937630085815544518">Chromiumiin kirjautunut käyttäjä: <ph name="USER_EMAIL_ADDRESS" />. Kirjaudu uudelleen sisään samalla tilillä.</translation>
 <translation id="7962572577636132072">Chromium päivitetään automaattisesti, joten käytössäsi on aina uusin versio.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index fe52b67..b0475f2 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -118,6 +118,7 @@
 <translation id="5386450000063123300">Mise à jour de Chromium (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="5398878173008909840">Une nouvelle version de Chromium est disponible.</translation>
 <translation id="5427571867875391349">Définir Chromium comme navigateur par défaut</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Bêta</translation>
 <translation id="5466153949126434691">Chromium est automatiquement mis à jour pour vous permettre de toujours disposer de la dernière version. Une fois le téléchargement terminé, Chromium redémarre et vous pouvez de nouveau l'utiliser.</translation>
 <translation id="5479196819031988440">Chromium OS ne peut pas ouvrir cette page</translation>
 <translation id="5480860683791598150">Chromium a besoin d'accéder à votre position pour la partager avec ce site</translation>
@@ -192,6 +193,7 @@
 <ph name="BEGIN_LINK_2" />En savoir plus<ph name="END_LINK_2" />
 
 Pour obtenir plus d'informations, veuillez consulter votre compte de messagerie (<ph name="ACCOUNT_EMAIL" />).</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium pour les développeurs</translation>
 <translation id="7451052299415159299">Chromium a besoin de votre autorisation pour accéder à votre appareil photo pour ce site</translation>
 <translation id="7483335560992089831">Impossible d'installer la même version de Chromium que celle qui est en cours d'exécution. Veuillez fermer Chromium, puis réessayer.</translation>
 <translation id="7549178288319965365">À propos de Chromium OS</translation>
@@ -205,6 +207,7 @@
 <translation id="7756122083761163394">Les données de navigation de cet utilisateur vont être supprimées de cet appareil. Pour récupérer les données, connectez-vous à Chrome en tant que $2.</translation>
 <translation id="7773960292263897147">Avertissement : Chromium ne peut pas empêcher les extensions d'enregistrer votre historique de navigation. Pour désactiver cette extension en mode de navigation privée, désélectionnez-la.</translation>
 <translation id="7774736947049807614">Échec du certificat d'authentification. Pour en savoir plus, connectez-vous de nouveau à Chromium en tant que <ph name="USER_NAME" /> ou contactez votre administrateur. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Échec de l'installation de la dernière version de Chromium. Vous ne disposez donc pas des nouvelles fonctionnalités, ni des correctifs de sécurité.</translation>
 <translation id="7937630085815544518">Vous étiez connecté à Chromium en tant que <ph name="USER_EMAIL_ADDRESS" />. Veuillez utiliser le même compte pour vous reconnecter.</translation>
 <translation id="7962572577636132072">Chromium est automatiquement mis à jour pour vous permettre de toujours disposer de la dernière version.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index c4deb3fb..ad3b09f 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -119,11 +119,12 @@
 <translation id="5386450000063123300">Chromium અપડેટ થઈ રહ્યું છે (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium નું નવું સંસ્કરણ ઉપલબ્ધ છે.</translation>
 <translation id="5427571867875391349">Chromium ને તમારા ડિફોલ્ટ બ્રાઉઝર તરીકે સેટ કરો</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium બીટા</translation>
 <translation id="5466153949126434691">Chromium આપમેળે અપડેટ થાય છે જેથી કરીને તમારી પાસે હંમેશા તાજું સંસ્કરણ રહે છે. જ્યારે આ ડાઉનલોડ પૂર્ણ થાય છે, ત્યારે Chromium પુનઃપ્રારંભ થશે અને તમે તમારા માર્ગે હશો.</translation>
 <translation id="5479196819031988440">Chromium OS, આ પૃષ્ઠને ખોલી શકતું નથી.</translation>
 <translation id="5480860683791598150">Chromiumને આ સાઇટ સાથે તમારું સ્થાન શેર કરવા માટે તમારા સ્થાનના ઍક્સેસની જરૂર પડે છે</translation>
 <translation id="549669000822060376">કૃપા કરીને Chromium, નવીનતમ સિસ્ટમ અપડેટ્સ ઇન્સ્ટોલ કરે ત્યાં સુધી રાહ જુઓ.</translation>
-<translation id="5631814766731275228">Chromium નામ અને ચિત્ર</translation>
+<translation id="5631814766731275228">Chromiumમાંનું નામ અને ફોટો</translation>
 <translation id="5634636535844844681">Chromium માટે Windows 7 અથવા તે પછીનું સંસ્કરણ આવશ્યક છે.</translation>
 <translation id="5680901439334282664">Chromium માં સાઇન ઇન કરો</translation>
 <translation id="5698481217667032250">આ ભાષામાં Chromium પ્રદર્શિત કરો</translation>
@@ -140,7 +141,7 @@
 <translation id="5987687638152509985">સમન્વયનને પ્રારંભ કરવા માટે Chromium ને અપડેટ કરો</translation>
 <translation id="6055895534982063517">Chromium નું એક નવું સંસ્કરણ ઉપલબ્ધ છે અને તે પહેલાં કરતાંએ વધુ ઝડપી છે.</translation>
 <translation id="6063093106622310249">અને Chromiumમાં ખોલો</translation>
-<translation id="6072279588547424923"><ph name="EXTENSION_NAME" />ને Chromiumમાં ઉમેરવામાં આવ્યું</translation>
+<translation id="6072279588547424923"><ph name="EXTENSION_NAME" />ને Chromiumમાં ઉમેરવામાં આવ્યું છે</translation>
 <translation id="608189560609172163">સાઇન ઇનમાં ભૂલ આવવાને કારણે Chromium તમારા ડેટાને સમન્વયિત કરી શક્યું નથી.</translation>
 <translation id="6096348254544841612">Chromiumને કસ્ટમાઇઝ અને નિયંત્રિત કરો. અપડેટ ઉપલબ્ધ છે.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> જોખમી છે, તેથી Chromium એ તેને અવરોધિત કરેલ છે.</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />વધુ જાણો<ph name="END_LINK_2" />
 
 વધુ સૂચનો માટે કૃપા કરીને <ph name="ACCOUNT_EMAIL" /> પર તમારી ઇમેઇલને તપાસો.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">Chromiumને આ સાઇટ માટે તમારા કૅમેરાના ઍક્સેસની પરવાનગીની જરૂર પડે છે</translation>
 <translation id="7483335560992089831">હાલમાં ચાલી રહ્યું છે તેના જેવું સમાન Chromium સંસ્કરણ ઇન્સ્ટોલ કરી શકાતું નથી. કૃપા કરીને Chromium ને બંધ કરો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="7549178288319965365">Chromium OS વિશે</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">આ વ્યક્તિનો બ્રાઉઝિંગ ડેટા આ ઉપકરણમાંથી કાઢી નાખવામાં આવશે. આ ડેટા પાછો મેળવવા માટે, Chromeમાં $2 તરીકે સાઇન ઇન કરો.</translation>
 <translation id="7773960292263897147">ચેતવણી: એક્સ્ટેંશનને તમારો બ્રાઉઝિંગ ઇતિહાસ રેકોર્ડ કરવાથી Chromium અટકાવી શકતું નથી. છૂપા મોડમાં આ એક્સ્ટેંશનને બંધ કરવા માટે, આ વિકલ્પની પસંદગી નાપસંદ કરો.</translation>
 <translation id="7774736947049807614">પ્રમાણીકરણ પ્રમાણપત્ર નિષ્ફળ થયું. કૃપા કરીને Chromiumમાં ફરીથી <ph name="USER_NAME" /> તરીકે સાઇન ઇન કરો અથવા વધુ માહિતી માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium નવીનતમ વર્ઝન પર અપડેટ ન થઈ શક્યું, તેથી તમે નવી સુવિધાઓ અને સુરક્ષાના સુધારા ચૂકી રહ્યા છો.</translation>
 <translation id="7937630085815544518">તમે Chromium માં <ph name="USER_EMAIL_ADDRESS" /> તરીકે સાઇન ઇન કર્યું હતું. ફરીથી સાઇન ઇન કરવા માટે કૃપા કરીને એ જ એકાઉન્ટનો ઉપયોગ કરો.</translation>
 <translation id="7962572577636132072">Chromium આપમેળે અપડેટ થાય છે જેથી કરીને તમારી પાસે હંમેશા સૌથી તાજું સંસ્કરણ રહે છે.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 7ced2f0..708227f 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">क्रोमियम अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">क्रोमियम का एक नया वर्शन उपलब्ध है.</translation>
 <translation id="5427571867875391349">क्रोमियम को अपने डिफ़ॉल्ट ब्राउज़र के रूप में सेट करें</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - क्रोमियम बीटा</translation>
 <translation id="5466153949126434691">क्रोमियम अपने आप अपडेट हो जाता है ताकि आपके पास हमेशा सबसे नवीनतम वर्शन रहे. जब यह डाउनलोड पूर्ण हो जाता है, तो क्रोमियम पुन: प्रारंभ होगा और आप आगे बढ़ जाएंगे.</translation>
 <translation id="5479196819031988440">क्रोमियम OS यह पेज नहीं खोल सकता.</translation>
 <translation id="5480860683791598150">इस साइट से आपका स्थान शेयर करने के लिए क्रोमियम को आपके स्थान का एक्सेस चाहिए</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />अधिक जानें<ph name="END_LINK_2" />
 
 कृपया अतिरिक्त निर्देशों के लिए <ph name="ACCOUNT_EMAIL" /> पर अपना ईमेल देखें.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - क्रोमियम डेवपलर</translation>
 <translation id="7451052299415159299">क्रोमियम को इस साइट के लिए आपका कैमरा एक्सेस करने की अनुमति चाहिए</translation>
 <translation id="7483335560992089831">वर्तमान में चल रहे समान क्रोमियम वर्शन को इंस्‍टॉल नहीं कर सकते. कृपया क्रोमियम बंद करें और पुन: प्रयास करें.</translation>
 <translation id="7549178288319965365">क्रोमियम OS के बारे में</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">इस व्यक्ति का ब्राउज़िंग डेटा इस डिवाइस से हटा दिया जाएगा. डेटा वापस पाने के लिए, $2 के रूप में Chrome में प्रवेश करें.</translation>
 <translation id="7773960292263897147">चेतावनी: क्रोमियम आपका ब्राउज़िंग इतिहास रिकॉर्ड करने से एक्‍सटेंशन को नहीं रोक सकता है. गुप्त मोड में इस एक्‍सटेंशन को बंद करने के लिए, इस विकल्‍प का चयन हटाएं.</translation>
 <translation id="7774736947049807614">प्रमाणीकरण प्रमाणपत्र विफल रहा. कृपया क्रोमियम में <ph name="USER_NAME" /> के रूप में फिर से प्रवेश करें या अधिक जानकारी के लिए अपने व्यवस्थापक से संपर्क करें. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - क्रोमियम कैनरी</translation>
 <translation id="7867198900892795913">क्रोमियम सबसे नए वर्शन में अपडेट नहीं कर सका, इसलिए आपको नई सुविधाएं और सुरक्षा सुधार नहीं मिल रहे हैं.</translation>
 <translation id="7937630085815544518">आप क्रोमियम में <ph name="USER_EMAIL_ADDRESS" /> के रूप में प्रवेश थे. पुन: प्रवेश करने के लिए कृपया उसी खाते का उपयोग करें.</translation>
 <translation id="7962572577636132072">क्रोमियम अपने आप अपडेट हो जाता है इसलिए आपके पास हमेशा नवीनतम वर्शन रहता है.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index 3a3a2c17..3cd10f8 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">A Chromium frissítése (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Elérhető a Chromium új verziója.</translation>
 <translation id="5427571867875391349">A Chromium beállítása alapértelmezett böngészőként</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Béta</translation>
 <translation id="5466153949126434691">A Chromium automatikusan frissít, így Ön mindig a legújabb verzióval rendelkezik. A letöltés befejezése után a Chromium újraindul, és máris rendelkezésre áll.</translation>
 <translation id="5479196819031988440">A Chromium OS nem tudja megnyitni ezt az oldalt.</translation>
 <translation id="5480860683791598150">A Chromiumnak a helyadatokhoz való hozzáférésre van szüksége ahhoz, hogy megoszthassa az Ön tartózkodási helyét a webhellyel</translation>
@@ -189,6 +190,7 @@
 <ph name="BEGIN_LINK_2" />További információ<ph name="END_LINK_2" />.
 
 További utasításokat a(z) <ph name="ACCOUNT_EMAIL" /> címére küldött e-mailekben talál.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">A Chromiumnak engedélyre van szüksége ahhoz, hogy hozzáférjen a kamerához ennél a webhelynél</translation>
 <translation id="7483335560992089831">Nem lehet ugyanazt a Chromium-verziót telepíteni, amely jelenleg is fut. Zárja be a Chromiumot, és próbálja újra.</translation>
 <translation id="7549178288319965365">A Chromium OS névjegye</translation>
@@ -202,6 +204,7 @@
 <translation id="7756122083761163394">A személy böngészési adatai törlődnek az eszközről. Az adatok visszaállításához jelentkezzen be a Chrome-ba $2 felhasználóként.</translation>
 <translation id="7773960292263897147">Figyelmeztetés: a Chromium nem tudja megakadályozni, hogy a bővítmények rögzítsék a böngészési előzményeit. A bővítmény inkognitómódban való használatának letiltásához törölje a lehetőség bejelölését.</translation>
 <translation id="7774736947049807614">A hitelesítési tanúsítvány nem használható. Jelentkezzen be újra a Chromiumba a(z) <ph name="USER_NAME" /> felhasználónévvel, vagy kérjen további információt a rendszergazdájától. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Nem sikerült a Chromium frissítése a legújabb verzióra, így Ön lemarad az új funkciókról és biztonsági javításokról.</translation>
 <translation id="7937630085815544518"><ph name="USER_EMAIL_ADDRESS" /> néven volt bejelentkezve a Chromiumba. Kérjük, ugyanazzal a fiókkal jelentkezzen be újra.</translation>
 <translation id="7962572577636132072">A Chromium automatikusan frissít, így Ön mindig a legújabb verzióval rendelkezik.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index a5df13b..b421590 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Aggiornamento di Chromium in corso (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">È disponibile una nuova versione di Chromium.</translation>
 <translation id="5427571867875391349">Imposta Chromium come browser predefinito</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium beta</translation>
 <translation id="5466153949126434691">Chromium si aggiorna automaticamente per consentirti di avere sempre la versione più recente. Al termine del download, Chromium si riavvierà e potrai procedere.</translation>
 <translation id="5479196819031988440">Chromium OS non è in grado di aprire la pagina.</translation>
 <translation id="5480860683791598150">Chromium deve poter accedere alla tua posizione per condividerla con questo sito</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Ulteriori informazioni<ph name="END_LINK_2" />
 
 Per ulteriori informazioni, controlla l'email all'indirizzo <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium per gli sviluppatori</translation>
 <translation id="7451052299415159299">Per questo sito Chromium ha bisogno dell'autorizzazione ad accedere alla fotocamera</translation>
 <translation id="7483335560992089831">Impossibile installare una versione di Chromium uguale a quella in esecuzione. Chiudi Chromium e riprova.</translation>
 <translation id="7549178288319965365">Informazioni su Chromium OS</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">I dati di navigazione di questa persona verranno eliminati dal dispositivo. Per recuperare i dati, accedi a Chrome con il nome utente $2.</translation>
 <translation id="7773960292263897147">Chromium non è in grado di impedire alle estensioni di registrare la tua cronologia di navigazione. Per disattivare questa estensione in modalità di navigazione in incognito, deseleziona questa opzione.</translation>
 <translation id="7774736947049807614">Errore del certificato di autenticazione. Accedi di nuovo a Chromium come <ph name="USER_NAME" /> o contatta il tuo amministratore per avere ulteriori informazioni. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Non è stato possibile aggiornare Chromium alla versione più recente, quindi non potrai utilizzare le nuove funzioni e gli aggiornamenti di sicurezza.</translation>
 <translation id="7937630085815544518">Hai eseguito l'accesso a Chromium come <ph name="USER_EMAIL_ADDRESS" />. Utilizza lo stesso account per eseguire di nuovo l'accesso.</translation>
 <translation id="7962572577636132072">Chromium si aggiorna automaticamente per consentirti di avere sempre la versione più recente.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index f6f03ef..9348203c 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Chromium を更新しています(<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium の最新バージョンをぜひお試しください。</translation>
 <translation id="5427571867875391349">Chromium をデフォルト ブラウザに設定する</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium は自動的に更新されるため、常に最新版をご利用になれます。このダウンロードが完了すると、Chromium が再起動し、すぐにお使いいただけます。</translation>
 <translation id="5479196819031988440">Chromium OS ではこのページを開けません。</translation>
 <translation id="5480860683791598150">このサイトで現在地を共有するには、Chromium で位置情報の使用を許可する必要があります</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />詳細<ph name="END_LINK_2" />
 
 詳しくは、<ph name="ACCOUNT_EMAIL" /> 宛にメールをお送りしましたのでご確認ください。</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">このサイトを利用するには、Chromium でカメラの使用を許可する必要があります</translation>
 <translation id="7483335560992089831">実行中の Chromium と同じバージョンをインストールすることはできません。Chromium を閉じてからもう一度お試しください。</translation>
 <translation id="7549178288319965365">Chromium OS について</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">この操作を行うと、このユーザーの閲覧データがこの端末から削除されます。データを復元するには、$2 として Chrome にログインしてください。</translation>
 <translation id="7773960292263897147">警告: 拡張機能による閲覧履歴の記録を Chromium で停止することはできません。シークレット モードでこの拡張機能を無効にするには、このオプションの選択を解除してください。</translation>
 <translation id="7774736947049807614">認証証明書でエラーが発生しました。<ph name="USER_NAME" /> として Chromium にログインし直すか、管理者に詳細をお問い合わせください。<ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium を最新版に更新できませんでした。新しい機能とセキュリティ修正は適用されていません。</translation>
 <translation id="7937630085815544518">Chromium に <ph name="USER_EMAIL_ADDRESS" /> としてログインしていました。再度ログインするには同じアカウントを使用してください。</translation>
 <translation id="7962572577636132072">Chromium は自動的に更新されるため、常に最新版をご利用になれます。</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index cacf0be7..7900f5a5 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Chromium 업데이트 중(<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium의 새 버전이 출시되었습니다.</translation>
 <translation id="5427571867875391349">Chromium을 기본 브라우저로 설정</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 베타</translation>
 <translation id="5466153949126434691">Chromium이 자동으로 업데이트되므로 항상 최신 버전을 사용할 수 있습니다. 이 다운로드가 완료되면 Chromium이 다시 시작되며 계속 작업할 수 있습니다.</translation>
 <translation id="5479196819031988440">Chromium OS에서 이 페이지를 열 수 없음</translation>
 <translation id="5480860683791598150">이 사이트와 위치를 공유하려면 Chromium에 내 위치 액세스 권한이 있어야 합니다</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />자세히 알아보기<ph name="END_LINK_2" />
 
 자세한 안내를 보려면 <ph name="ACCOUNT_EMAIL" />에서 이메일을 확인하세요.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - 개발자용 Chromium</translation>
 <translation id="7451052299415159299">이 사이트에서 카메라에 액세스하려면 Chromium에 권한이 필요합니다</translation>
 <translation id="7483335560992089831">이미 실행 중인 Chromium과 동일한 버전을 설치할 수 없습니다. Chromium을 종료한 뒤 다시 시도하세요.</translation>
 <translation id="7549178288319965365">Chromium OS 정보</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">선택한 사용자의 인터넷 사용 기록이 이 기기에서 삭제됩니다. 데이터를 복원하려면 $2(으)로 Chrome에 로그인하세요.</translation>
 <translation id="7773960292263897147">경고: Chromium은 확장 프로그램이 인터넷 방문 기록을 저장하지 못하도록 할 수 없습니다. 시크릿 모드에서 이 확장 프로그램을 사용 중지하려면 옵션을 선택 취소하세요.</translation>
 <translation id="7774736947049807614">인증서가 실패했습니다. Chromium에 <ph name="USER_NAME" />(으)로 다시 로그인하거나 관리자에게 문의하여 자세히 알아보세요. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium을 최신 버전으로 업데이트하지 못했기 때문에 새로운 기능과 보안 수정 사항이 적용되지 않았습니다.</translation>
 <translation id="7937630085815544518"><ph name="USER_EMAIL_ADDRESS" />(으)로 Chromium에 로그인되어 있습니다. 같은 계정으로 다시 로그인해 주세요.</translation>
 <translation id="7962572577636132072">Chromium은 자동으로 업데이트되므로 항상 최신 버전을 사용할 수 있습니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 22f6510f..be039b9 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Chromium അപ്‌ഡേറ്റുചെയ്യുന്നു, (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium-ത്തിന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.</translation>
 <translation id="5427571867875391349">നിങ്ങളുടെ സ്ഥിര ബ്രൗസറായി Chromium സജ്ജമാക്കുക</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium ബീറ്റ</translation>
 <translation id="5466153949126434691">Chromium സ്വയമേവ അപ്‌ഡേറ്റുചെയ്യുന്നതിനാൽ, നിങ്ങളുടേത് എല്ലായ്പ്പോഴും ഏറ്റവും പുതിയ പതിപ്പായിരിക്കും. ഈ ഡൗൺലോഡ് പൂർത്തിയാകുമ്പോൾ Chromium പുനരാരംഭിക്കും, അതിനുശേഷം നിങ്ങൾക്ക് തുടരാം.</translation>
 <translation id="5479196819031988440">Chromium OS-ന് ഈ പേജ് തുറക്കാനാവില്ല.</translation>
 <translation id="5480860683791598150">Chromium-ത്തിന് ഈ സൈറ്റുമായി ലൊക്കേഷൻ പങ്കിടുന്നതിന് നിങ്ങളുടെ ലൊക്കേഷനിലേക്കുള്ള ആക്‌സസ് ആവശ്യമാണ്</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />കൂടുതലറിയുക<ph name="END_LINK_2" />
 
 കൂടുതൽ നിർദ്ദേശങ്ങൾക്ക് <ph name="ACCOUNT_EMAIL" /> എന്നതിൽ നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">ഈ സൈറ്റിനായി, Chromium-ത്തിന് നിങ്ങളുടെ ക്യാമറ ആക്‌സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation>
 <translation id="7483335560992089831">നിലവിൽ പ്രവർത്തിച്ചു കൊണ്ടിരിക്കുന്ന Chromium-ത്തിന്റെ സമാന പതിപ്പ് ഇൻസ്റ്റാളുചെയ്യാൻ കഴിയില്ല. Chromium അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="7549178288319965365">Chromium OS-നെക്കുറിച്ച്</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">ഈ ഉപകരണത്തിൽ നിന്ന് ഈ വ്യക്‌തിയുടെ ‌ബ്രൗസിംഗ് ഡാറ്റ ഇല്ലാതാക്കും. ഡാറ്റ ‌വീണ്ടെടുക്കാൻ, $2 എന്നതായി Chrome-ൽ സൈൻ ഇൻ ‌ചെയ്യുക.</translation>
 <translation id="7773960292263897147">മുന്നറിയിപ്പ്: നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം റെക്കോർഡ് ചെയ്യുന്നതിൽ നിന്ന് വിപുലീകരണങ്ങളെ തടയാൻ Chromium-ത്തിന് കഴിയില്ല. ആൾമാറാട്ട മോഡിൽ ഈ വിപുലീകരണം പ്രവർത്തനരഹിതമാക്കാൻ, ഈ ഓപ്‌ഷൻ തിരഞ്ഞെടുത്തത് മാറ്റുക.</translation>
 <translation id="7774736947049807614">സർട്ടിഫിക്കറ്റ് പരിശോധിച്ചുറപ്പിക്കൽ പരാജയപ്പെട്ടു. Google Chromium-ത്തിൽ <ph name="USER_NAME" /> ആയി വീണ്ടും സൈൻ ഇൻ ചെയ്യുക അല്ലെങ്കിൽ കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് Chromium അപ്‌ഡേറ്റ് ചെയ്യാനായില്ല, അതിനാൽ പുതിയ ഫീച്ചറുകളും സുരക്ഷാ പരിഹാരങ്ങളും നിങ്ങൾക്ക് ലഭിക്കുന്നില്ല.</translation>
 <translation id="7937630085815544518">Chromium-ത്തിൽ നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്‌തു. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നതിന് സമാന അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation>
 <translation id="7962572577636132072">Chromium സ്വയമേവ അപ്‌ഡേറ്റുചെയ്യുന്നതിനാൽ, നിങ്ങളുടേത് എല്ലായ്പ്പോഴും ഏറ്റവും പുതിയ പതിപ്പായിരിക്കും.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 79774633..4471a16 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -118,11 +118,12 @@
 <translation id="5386450000063123300">Chromium अपडेट करीत आहे (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium ची नवीन आवृत्ती उपलब्ध आहे.</translation>
 <translation id="5427571867875391349">आपला डीफॉल्ट ब्राउझर म्हणून Chromium सेट करा</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium बीटा</translation>
 <translation id="5466153949126434691">Chromium स्वयंचलितपणे अपडेट होते जेणेकरून आपल्याकडे नेहमी सर्वात नवीन आवृत्ती असते. जेव्हा हे डाउनलोड पूर्ण होते, तेव्हा Chromium रीस्टार्ट होईल आणि आपण आपल्या मार्गावर असाल.</translation>
 <translation id="5479196819031988440">Chromium OS हे पृष्ठ उघडू शकत नाही.</translation>
 <translation id="5480860683791598150">या साइटसोबत तुमचे स्थान शेअर करण्यासाठी Chromium ला तुमच्या स्थानाचा अॅक्सेस हवा आहे</translation>
 <translation id="549669000822060376">कृपया Chromium नवीनतम सिस्टम अपडेट इंस्टॉल करेपर्यंत प्रतीक्षा करा.</translation>
-<translation id="5631814766731275228">Chromium नाव आणि चित्र</translation>
+<translation id="5631814766731275228">Chromium नाव आणि फोटो</translation>
 <translation id="5634636535844844681">Chromium साठी Windows 7 किंवा नंतरची आवृत्ती आवश्यक आहे.</translation>
 <translation id="5680901439334282664">Chromium वर साइन इन करा</translation>
 <translation id="5698481217667032250">Chromium या भाषेत प्रदर्शि‍त करा</translation>
@@ -139,7 +140,7 @@
 <translation id="5987687638152509985">संकालित करण्यासाठी Chromium अपडेट करा</translation>
 <translation id="6055895534982063517">Chromium ची नवीन आवृत्ती उपलब्ध आहे आणि ही नेहमीपेक्षा जलद आहे.</translation>
 <translation id="6063093106622310249">आणि Chromium मध्ये उघडा</translation>
-<translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> हे Chromium मध्‍ये जोडण्यात आले आहे</translation>
+<translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> Chromium मध्‍ये जोडण्यात आले आहे</translation>
 <translation id="608189560609172163">साइन इन करण्यात एरर आल्यामुळे Chromium आपला डेटा संकालित करू शकले नाही.</translation>
 <translation id="6096348254544841612">Chromium कस्टमाइझ करा आणि नियंत्रित करा. अपडेट उपलब्ध आहे.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> धोकादायक आहे, त्यामुळे Chromium ने ते अवरोधित केले आहे.</translation>
@@ -191,6 +192,7 @@
 <ph name="NEW_PROFILE_NAME" /> ला आपल्या खात्यात प्रवेश करण्‍यापासून प्रतिबंधित करण्यासाठी, आपण Chromium वापरत नसता तेव्हा आपण आपले प्रोफाइल लॉक करता याची खात्री करा. हे करण्‍यासाठी, ब्राउझरच्या वरील उजव्या कोपर्‍यातील आपले प्रोफाइल नाव क्लिक करा आणि "बाहेर पडा आणि मुलांचा लॉक" निवडा. <ph name="BEGIN_LINK_2" />अधिक जाणून घ्या<ph name="END_LINK_2" />
 
 कृपया पुढील सूचनांसाठी आपले ईमेल <ph name="ACCOUNT_EMAIL" /> वर तपासा.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium डेव्हलपर</translation>
 <translation id="7451052299415159299">या साइटसाठी Chromium ला तुमचा कॅमेरा अॅक्सेस करण्याची परवानगी हवी आहे</translation>
 <translation id="7483335560992089831">सध्‍या चालू असलेल्‍या सारख्याच Chromium आवृत्तीची स्‍थापना होऊ शकत नाही. कृपया Chromium बंद करा आणि पुन्‍हा प्रयत्‍न करा.</translation>
 <translation id="7549178288319965365">Chromium OS बद्दल</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">या व्यक्तीचा ब्राउझिंग डेटा या डिव्हाइसवरून हटवला जाईल. डेटा पुन्हा मिळवण्यासाठी, Chrome वर $2 म्हणून साइन इन करा.</translation>
 <translation id="7773960292263897147">चेतावणी: Chromium हे एक्सटेंशनना तुमचा ब्राउझिंग इतिहास रेकॉर्ड करून ठेवण्यापासून रोखू शकत नाही. हे एक्सटेंशन बंद करण्यासाठी गुप्त मोडमधील या पर्यायाची निवड रद्द करा.</translation>
 <translation id="7774736947049807614">प्रमाणीकरण प्रमाणपत्र अयशस्वी झाले. कृपया Chromium मध्ये <ph name="USER_NAME" /> म्हणून पुन्हा साइन इन करा किंवा आणखी माहितीसाठी तुमच्या प्रशासकाशी संपर्क साधा. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium नवीनतम आवृत्तीवर अपडेट होऊ शकले नाही, त्यामुळे तुम्ही नवीन वैशिष्ट्ये आणि सुरक्षितता निराकरणे गमावत आहात.</translation>
 <translation id="7937630085815544518">आपण <ph name="USER_EMAIL_ADDRESS" /> या रुपात Chromium मध्ये साइन इन केले होते. कृपया पुन्हा साइन इन करण्यासाठी समान खाते वापरा.</translation>
 <translation id="7962572577636132072">Chromium स्वयंचलितपणे अपडेट होते जेणेकरून आपल्याकडे नेहमी सर्वात नवीन आवृत्ती असते.</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 3895907..52d8e11 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Chromium updaten (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Er is een nieuwe versie van Chromium beschikbaar.</translation>
 <translation id="5427571867875391349">Chromium instellen als je standaardbrowser</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Bèta</translation>
 <translation id="5466153949126434691">Chromium wordt automatisch bijgewerkt, zodat je altijd beschikt over de nieuwste versie. Wanneer deze download is voltooid, wordt Chromium opnieuw gestart en kun je doorgaan.</translation>
 <translation id="5479196819031988440">Chromium OS kan deze pagina niet openen.</translation>
 <translation id="5480860683791598150">Chromium heeft toegang tot je locatie nodig om je locatie met deze site te delen</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />Meer informatie<ph name="END_LINK_2" />
 
 Controleer je e-mail op <ph name="ACCOUNT_EMAIL" /> voor verdere instructies.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium heeft toegangsrechten voor je camera nodig voor deze site</translation>
 <translation id="7483335560992089831">Kan niet dezelfde Chromium-versie installeren, omdat deze versie nu actief is. Sluit Chromium en probeer het opnieuw.</translation>
 <translation id="7549178288319965365">Over Chromium OS</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">De browsegegevens van deze persoon worden verwijderd van dit apparaat. Als je de gegevens wilt herstellen, log je in bij Chrome als $2.</translation>
 <translation id="7773960292263897147">Waarschuwing: Chromium kan niet voorkomen dat extensies je browsergeschiedenis vastleggen. Als je deze extensie in de incognitomodus wilt uitschakelen, verwijder je het vinkje bij deze optie.</translation>
 <translation id="7774736947049807614">Verificatiecertificaat mislukt. Log opnieuw in bij Chromium als <ph name="USER_NAME" /> of neem contact op met je beheerder voor meer informatie. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium kan niet worden geüpdatet naar de nieuwste versie, dus je loopt nieuwe functies en beveiligingsoplossingen mis.</translation>
 <translation id="7937630085815544518">Je bent ingelogd bij Chromium als <ph name="USER_EMAIL_ADDRESS" />. Gebruik hetzelfde account om opnieuw in te loggen.</translation>
 <translation id="7962572577636132072">Chromium wordt automatisch bijgewerkt, zodat je altijd beschikt over de nieuwste versie.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 60638032..eecffeb 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Oppdaterer Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">En nyere versjon av Chromium er tilgjengelig.</translation>
 <translation id="5427571867875391349">Bruk Chromium som standard nettleser</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium oppdateres automatisk, sånn at du alltid har den nyeste versjonen. Når denne nedlastingen er fullført, kommer Chromium til å starte på nytt, og du er i gang.</translation>
 <translation id="5479196819031988440">Chromium OS kan ikke åpne denne siden.</translation>
 <translation id="5480860683791598150">Chromium trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Finn ut mer<ph name="END_LINK_2" />
 
 Vi har sendt deg (<ph name="ACCOUNT_EMAIL" />) en e-post med nærmere instruksjoner.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium trenger tilgang til kameraet ditt for dette nettstedet</translation>
 <translation id="7483335560992089831">Kan ikke installere den samme Chromium-versjonen som kjører. Lukk Chromium og prøv på nytt.</translation>
 <translation id="7549178288319965365">Om Chromium OS</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Denne personens nettlesingsdata slettes fra denne enheten. For å gjenopprette dataene, logg på Chrome som $2.</translation>
 <translation id="7773960292263897147">Advarsel: Chromium kan ikke hindre utvidelser fra å spille inn nettlesingsloggen. For å slå av denne utvidelsen i inkognitomodus, fjern avmerkingen for dette alternativet.</translation>
 <translation id="7774736947049807614">Autentiseringssertifikatet mislyktes. Logg på Chromium på nytt som <ph name="USER_NAME" />, eller kontakt administratoren din for å få mer informasjon. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium kunne ikke oppdateres til den nyeste versjonen, så du går glipp av nye funksjoner og sikkerhetsforbedringer.</translation>
 <translation id="7937630085815544518">Du ble logget på Chromium som <ph name="USER_EMAIL_ADDRESS" />. Du må logge deg på igjen med samme konto.</translation>
 <translation id="7962572577636132072">Chromium oppdateres automatisk, sånn at du alltid har den nyeste versjonen.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index d5c4440..643f766 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Chromium se actualizează (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Este disponibilă o nouă versiune Chromium.</translation>
 <translation id="5427571867875391349">Setați Chromium ca browser prestabilit</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Beta</translation>
 <translation id="5466153949126434691">Chromium se actualizează automat, deci ai întotdeauna cea mai recentă versiune. După această descărcare, Chromium va reporni și va fi gata de utilizare.</translation>
 <translation id="5479196819031988440">Sistemul de operare Chromium nu poate deschide pagina.</translation>
 <translation id="5480860683791598150">Chromium are nevoie de acces la locația ta ca să permită accesul la locație pentru acest site</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />Află mai multe<ph name="END_LINK_2" />
 
 Verifică e-mailul la <ph name="ACCOUNT_EMAIL" /> pentru instrucțiuni suplimentare.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium pentru dezvoltatori</translation>
 <translation id="7451052299415159299">Chromium are nevoie de permisiune ca să acceseze camera foto pentru acest site</translation>
 <translation id="7483335560992089831">Nu se poate instala aceeași versiune de Chromium care rulează în prezent. Închideți Chromium și încercați din nou.</translation>
 <translation id="7549178288319965365">Despre sistemul de operare Chromium</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">Datele de navigare ale acestei persoane vor fi șterse de pe acest dispozitiv. Pentru a recupera datele, conectează-te la Chrome ca $2.</translation>
 <translation id="7773960292263897147">Avertisment: Chromium nu poate împiedica extensiile să înregistreze istoricul de navigare. Pentru a dezactiva această extensie în modul incognito, debifează această opțiune.</translation>
 <translation id="7774736947049807614">Eroare privind certificatul de autentificare. Conectează-te la Chromium din nou ca <ph name="USER_NAME" /> sau contactează administratorul pentru mai multe informații. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium nu s-a putut actualiza la cea mai recentă versiune. Astfel, pierzi noi funcții și remedieri de securitate.</translation>
 <translation id="7937630085815544518">Ați fost conectat(ă) la Chromium ca <ph name="USER_EMAIL_ADDRESS" />. Utilizați același cont pentru a vă conecta din nou.</translation>
 <translation id="7962572577636132072">Chromium se actualizează automat, deci vei avea întotdeauna cea mai recentă versiune.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index 918f497..65c8abd 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -115,6 +115,7 @@
 <translation id="5386450000063123300">Обновление Chromium (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="5398878173008909840">Доступна новая версия Chromium.</translation>
 <translation id="5427571867875391349">Сделать Chromium браузером по умолчанию</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium (бета-версия)</translation>
 <translation id="5466153949126434691">Chromium обновляется автоматически, поэтому у вас всегда будет установлена последняя версия. После завершения скачивания и перезагрузки вы сможете продолжить работу.</translation>
 <translation id="5479196819031988440">Chromium OS не может открыть эту страницу</translation>
 <translation id="5480860683791598150">Для этого сайта Chromium запрашивает доступ к данным о вашем местоположении.</translation>
@@ -187,6 +188,7 @@
 <ph name="BEGIN_LINK_2" />Подробнее…<ph name="END_LINK_2" />
 
 Дальнейшие инструкции отправлены на адрес <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium для разработчиков</translation>
 <translation id="7451052299415159299">Для этого сайта Chromium запрашивает доступ к камере.</translation>
 <translation id="7483335560992089831">Невозможно установить ту же версию Chromium, которая уже присутствует в системе. Закройте Chromium и повторите попытку.</translation>
 <translation id="7549178288319965365">О Chromium OS</translation>
@@ -200,6 +202,7 @@
 <translation id="7756122083761163394">Данные этого пользователя о работе в браузере будут удалены с устройства. Чтобы восстановить их, войдите в Chrome как $2.</translation>
 <translation id="7773960292263897147">Внимание! Chromium не может запретить расширениям записывать историю просмотров. Чтобы отключить данное расширение в режиме инкогнито, снимите этот флажок.</translation>
 <translation id="7774736947049807614">Ошибка сертификата аутентификации. Войдите в Chromium как <ph name="USER_NAME" /> ещё раз или обратитесь за информацией к администратору. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Не удалось установить последнюю версию Chromium, в которой добавлены новые функции и обновления системы безопасности.</translation>
 <translation id="7937630085815544518">Ранее вы входили в Chromium как <ph name="USER_EMAIL_ADDRESS" />. Войдите снова, используя тот же аккаунт.</translation>
 <translation id="7962572577636132072">Chromium обновляется автоматически, поэтому у вас всегда будет установлена последняя версия.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index df5cef179..162f73c 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -120,6 +120,7 @@
 <translation id="5386450000063123300">Posodabljanje Chromiuma (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Na voljo je nova različica Chromiuma.</translation>
 <translation id="5427571867875391349">Nastavitev Chromiuma za privzeti brskalnik</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – različica beta Chromiuma</translation>
 <translation id="5466153949126434691">Chromium se samodejno posodablja, zato boste vedno imeli najnovejšo različico. Ko bo ta prenos končan, se bo Chromium znova zagnal in lahko boste nadaljevali z delom.</translation>
 <translation id="5479196819031988440">OS Chromium ne more odpreti te strani.</translation>
 <translation id="5480860683791598150">Chromium potrebuje dostop do vaše lokacije, da jo bo lahko delil s tem spletnim mestom</translation>
@@ -194,6 +195,7 @@
 <ph name="BEGIN_LINK_2" />Več o tem<ph name="END_LINK_2" />
 
 Nadaljnja navodila preberite v e-poštnem sporočilu, ki ste ga prejeli na <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – različica Chromiuma za razvijalce</translation>
 <translation id="7451052299415159299">Chromium potrebuje dovoljenje za dostop do fotoaparata za to spletno mesto</translation>
 <translation id="7483335560992089831">Ni mogoče namestiti iste različice Chromiuma, ki se trenutno izvaja. Zaprite Chromium in poskusite znova.</translation>
 <translation id="7549178288319965365">O sistemu Chromium OS</translation>
@@ -207,6 +209,7 @@
 <translation id="7756122083761163394">Podatki brskanja te osebe bodo izbrisani iz naprave. Če želite podatke obnoviti, se prijavite v Chrome kot $2.</translation>
 <translation id="7773960292263897147">Opozorilo: Chromium razširitvam ne more preprečiti beleženja zgodovine brskanja. Če želite onemogočiti to razširitev v načinu brez beleženja zgodovine, počistite to možnost.</translation>
 <translation id="7774736947049807614">Napaka potrdila za preverjanje pristnosti. Znova se prijavite v Chromium kot <ph name="USER_NAME" /> ali se obrnite na skrbnika, če želite več informacij. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – delovna različica Chromiuma</translation>
 <translation id="7867198900892795913">Chromiuma ni bilo mogoče posodobiti na najnovejšo različico, zato nimate novih funkcij in varnostnih popravkov.</translation>
 <translation id="7937630085815544518">V Chromium ste bili prijavljeni kot <ph name="USER_EMAIL_ADDRESS" />. Pri vnovični prijavi uporabite isti račun.</translation>
 <translation id="7962572577636132072">Chromium se samodejno posodablja, zato boste vedno imeli najnovejšo različico.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index 33905735..7d99131 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Ажурирање Chromium-а (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Доступна је нова верзија Chromium-а.</translation>
 <translation id="5427571867875391349">Подеси Chromium као подразумевани прегледач</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium бета</translation>
 <translation id="5466153949126434691">Chromium се аутоматски ажурира, па увек имате најновију верзију. Када ово преузимање буде довршено, Chromium ће се поново покренути и бићете спремни.</translation>
 <translation id="5479196819031988440">Chromium ОС не може да отвори ову страницу.</translation>
 <translation id="5480860683791598150">Chromium тражи приступ вашој локацији да бисте је делили са овим сајтом</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />Сазнајте више<ph name="END_LINK_2" />
 
 Потражите даља упутства у имејлу на <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Програмерска верзија Chromium-а</translation>
 <translation id="7451052299415159299">Chromium тражи дозволу да приступи камери за овај сајт</translation>
 <translation id="7483335560992089831">Није могуће инсталирати исту верзију Chromium-а која се тренутно користи. Затворите Chromium и покушајте поново.</translation>
 <translation id="7549178288319965365">О Chromium ОС-у</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">Подаци прегледања ове особе ће бити избрисани са овог уређаја. Да бисте вратили податке, пријавите се у Chrome као $2.</translation>
 <translation id="7773960292263897147">Упозорење: Chromium не може да спречи додатке да чувају историју прегледања. Да бисте онемогућили овај додатак у режиму без архивирања, опозовите избор ове опције.</translation>
 <translation id="7774736947049807614">Није успела потврда идентитета помоћу овог сертификата. Поново се пријавите у Chromium као <ph name="USER_NAME" /> или контактирајте администратора за више информација. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium није успео да се ажурира на најновију верзију, па пропуштате нове функције и безбедносне исправке.</translation>
 <translation id="7937630085815544518">Били сте пријављени на Chromium као <ph name="USER_EMAIL_ADDRESS" />. Користите исти налог да бисте се поново пријавили.</translation>
 <translation id="7962572577636132072">Chromium се аутоматски ажурира, па увек имате најновију верзију.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index 8ac33f40..919cfe4 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -119,6 +119,7 @@
 <translation id="5386450000063123300">Chromium uppdateras (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Det finns en ny version av Chromium.</translation>
 <translation id="5427571867875391349">Använd Chromium som standardwebbläsare</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium uppdateras automatiskt så att du alltid har den senaste versionen. När den här nedladdningen är klar startas Chromium om och sedan är du igång.</translation>
 <translation id="5479196819031988440">Det går inte att öppna den här sidan i Chromium OS.</translation>
 <translation id="5480860683791598150">Du behöver ge Chromium åtkomst till din plats om den ska kunna delas med webbplatsen</translation>
@@ -193,6 +194,7 @@
 <ph name="BEGIN_LINK_2" />Läs mer<ph name="END_LINK_2" />
 
 Ytterligare anvisningar har skickats med e-post till dig på <ph name="ACCOUNT_EMAIL" />.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation>
 <translation id="7451052299415159299">Du behöver ge Chromium behörighet att använda kameran på webbplatsen</translation>
 <translation id="7483335560992089831">Det går inte att installera samma version av Chromium som den som redan körs. Stäng Chromium och försök igen.</translation>
 <translation id="7549178288319965365">Om Chromium OS</translation>
@@ -206,6 +208,7 @@
 <translation id="7756122083761163394">Den här personens webbinformation raderas från enheten. Om du vill återställa informationen loggar du in i Chrome som $2.</translation>
 <translation id="7773960292263897147">Varning! Chromium kan inte förhindra att tillägg registrerar din webbhistorik. Om du vill inaktivera det här tillägget i inkognitoläge avmarkerar du det här alternativet.</translation>
 <translation id="7774736947049807614">Autentiseringscertifikatet fungerade inte. Logga in i Chromium igen som <ph name="USER_NAME" /> eller kontakta administratören. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> – Chromium Canary</translation>
 <translation id="7867198900892795913">Det gick inte att uppdatera Chromium till den senaste versionen. Därför går du miste om nya funktioner och säkerhetskorrigeringar.</translation>
 <translation id="7937630085815544518">Du var inloggad i Chromium som <ph name="USER_EMAIL_ADDRESS" />. Använd samma konto när du loggar in igen.</translation>
 <translation id="7962572577636132072">Chromium uppdateras automatiskt så att du alltid har den senaste versionen.</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index a5c330a5..c09bfc1 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">Chromiumஐப் புதுப்பிக்கிறது (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium இன் புதிய பதிப்பு கிடைக்கிறது.</translation>
 <translation id="5427571867875391349">உங்கள் இயல்புநிலை உலாவியாக Chromium ஐ அமை</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium பீட்டா</translation>
 <translation id="5466153949126434691">Chromium தானாகவே புதுப்பித்துக்கொள்வதால், எப்போதுமே புதிய பதிப்பைப் பெறுவீர்கள். இந்தப் பதிவிறக்கம் முடியும்போது, Chromium மறுதொடக்கம் செய்யும், பிறகு உங்கள் பணியைத் தொடரலாம்.</translation>
 <translation id="5479196819031988440">Chromium OS ஆல் இந்தப் பக்கத்தைத் திறக்க முடியாது.</translation>
 <translation id="5480860683791598150">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர, Chromiumக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />மேலும் அறிக<ph name="END_LINK_2" />
 
 தொடர்ச்சியான வழிமுறைகளுக்கு, <ph name="ACCOUNT_EMAIL" /> இல் உங்கள் மின்னஞ்சலைப் பார்க்கவும்.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - டெவெலப்பர்களுக்கான Chromium</translation>
 <translation id="7451052299415159299">இந்தத் தளத்திற்காகக் கேமராவை அணுக, Chromiumக்கு அனுமதி தேவை</translation>
 <translation id="7483335560992089831">தற்போது இயக்கத்தில் உள்ள அதே பதிப்புள்ள Chromium ஐ நிறுவ முடியாது. Chromium ஐ மூடி, பின்னர் முயலவும்.</translation>
 <translation id="7549178288319965365">Chromium OS அறிமுகம்</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">இவரின் உலாவல் தரவு சாதனத்திலிருந்து நீக்கப்படும். தரவை மீட்டெடுக்க, Chrome இல் $2 ஆக உள்நுழையவும்.</translation>
 <translation id="7773960292263897147">எச்சரிக்கை: நீட்டிப்புகள் உங்கள் உலாவல் வரலாற்றைப் பதிவுசெய்வதை Chromium ஆல் தடுக்க முடியவில்லை. மறைநிலையில் இந்த நீட்டிப்பை முடக்க, இந்த விருப்பத்தைத் தேர்வுநீக்கவும்.</translation>
 <translation id="7774736947049807614">அங்கீகாரச் சான்றிதழ் தோல்வி. மீண்டும் Chromium இல் <ph name="USER_NAME" /> ஆக உள்நுழையவும் அல்லது நிர்வாகியைத் தொடர்புகொண்டு, கூடுதல் தகவலைப் பெறவும். <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium சமீபத்திய பதிப்பிற்குப் புதுப்பிக்கப்படவில்லை என்பதால், புதிய அம்சங்களையும் பாதுகாப்புத் திருத்தங்களையும் தவறவிடுகிறீர்கள்.</translation>
 <translation id="7937630085815544518">Chromium இல் <ph name="USER_EMAIL_ADDRESS" /> ஆக உள்நுழைந்திருந்தீர்கள். மீண்டும் உள்நுழைய அதே கணக்கைப் பயன்படுத்தவும்.</translation>
 <translation id="7962572577636132072">Chromium தானாகவே புதுப்பித்துக்கொள்வதால், எப்போதுமே புதிய பதிப்பைப் பெறுவீர்கள்.</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index 11ab5de5..cc2ea41 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -115,6 +115,7 @@
 <translation id="5386450000063123300">Chromium నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">క్రొత్త Chromium సంస్కరణ అందుబాటులో ఉంది.</translation>
 <translation id="5427571867875391349">Chromiumను మీ డిఫాల్ట్ బ్రౌజర్‌గా సెట్ చేయండి</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium బీటా</translation>
 <translation id="5466153949126434691">Chromium స్వయంచాలకంగా నవీకరించబడుతుంది కనుక మీరు ఎల్లప్పుడూ తాజా సంస్కరణని కలిగి ఉంటారు. ఈ డౌన్‌లోడ్ పూర్తయినప్పుడు, Chromium పునఃప్రారంభించబడుతుంది మరియు మీరు మీ పనిని కొనసాగించవచ్చు.</translation>
 <translation id="5479196819031988440">Chromium OS ఈ పేజీని తెరవలేదు.</translation>
 <translation id="5480860683791598150">ఈ సైట్‌తో మీ స్థానాన్ని షేర్ చేయడానికి Chromiumకు మీ స్థాన యాక్సెస్ అవసరం</translation>
@@ -187,6 +188,7 @@
 <ph name="BEGIN_LINK_2" />మరింత తెలుసుకోండి<ph name="END_LINK_2" />
 
 దయచేసి తదుపరి సూచనల కోసం <ph name="ACCOUNT_EMAIL" />లో మీ ఇమెయిల్‌ను చూడండి.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">ఈ సైట్ కోసం మీ కెమెరాని యాక్సెస్ చేయడానికి Chromiumకు అనుమతి అవసరం</translation>
 <translation id="7483335560992089831">ప్రస్తుతం అమలు చేయబడుతున్న అదే Chromium సంస్కరణని ఇన్‌స్టాల్ చేయలేరు. దయచేసి Chromiumని మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="7549178288319965365">Chromium OS గురించి</translation>
@@ -200,6 +202,7 @@
 <translation id="7756122083761163394">ఈ వ్యక్తి యొక్క బ్రౌజింగ్ డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. డేటాను పునరుద్ధరించడానికి, $2 వలె Chromeకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="7773960292263897147">హెచ్చరిక:Chromium మీ బ్రౌజింగ్ చరిత్రను రికార్డ్ చేయడం నుండి పొడిగింపును నిరోధించలేదు. ఈ పొడిగింపును అజ్ఞాత మోడ్‌లో ఆపివేయడానికి, ఈ ఎంపికను రద్దు చేయండి.</translation>
 <translation id="7774736947049807614">ప్రమాణీకరణ ప్రమాణపత్రం విఫలమైంది. దయచేసి Chromiumలో <ph name="USER_NAME" />గా మళ్లీ సైన్ ఇన్ చేయండి లేదా మరింత సమాచారం కోసం మీ నిర్వాహకులను సంప్రదించండి. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromiumని తాజా వెర్షన్‌కు అప్‌డేట్ చేయడం సాధ్యం కాలేదు, కనుక మీరు కొత్త ఫీచర్‌లు మరియు భద్రతా పరిష్కారాలను పొందలేరు.</translation>
 <translation id="7937630085815544518">మీరు <ph name="USER_EMAIL_ADDRESS" />గా Chromiumకు సైన్ ఇన్ చేసారు. దయచేసి మళ్లీ సైన్ ఇన్ చేయడానికి ఇదే ఖాతాను ఉపయోగించండి.</translation>
 <translation id="7962572577636132072">Chromium స్వయంచాలకంగా నవీకరించబడుతుంది కనుక మీరు ఎల్లప్పుడూ తాజా సంస్కరణను కలిగి ఉంటారు.</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index f4925ebf..cfeaa0d 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -7,7 +7,7 @@
 <translation id="1170115874949214249">Chromium'u telefonunuza yükleyin. Hesap kurtarma telefon numaranıza SMS göndereceğiz.</translation>
 <translation id="1174473354587728743">Bilgisayarı paylaşıyor musunuz? Artık Chromium'u tam olarak istediğiniz gibi kurabilirsiniz.</translation>
 <translation id="1185134272377778587">Chromium hakkında</translation>
-<translation id="1298199220304005244">Chromium OS'u kullanma konusunda yardım alın</translation>
+<translation id="1298199220304005244">Chromium OS'i kullanma konusunda yardım alın</translation>
 <translation id="1396446129537741364">Chromium, şifreleri göstermeye çalışıyor.</translation>
 <translation id="1414495520565016063">Chromium'da oturum açtınız!</translation>
 <translation id="1444754455097148408">Chromium açık kaynak lisansları</translation>
@@ -69,7 +69,7 @@
 <translation id="3479552764303398839">Şimdi değil</translation>
 <translation id="3509308970982693815">Lütfen tüm Chromium pencerelerini kapatıp tekrar deneyin.</translation>
 <translation id="352783484088404971">Chromium'dan Kaldır...</translation>
-<translation id="3549345495227188780">Chromium OS'yi Kullanmaya Başlayın</translation>
+<translation id="3549345495227188780">Chromium OS'i Kullanmaya Başlayın</translation>
 <translation id="3582788516608077514">Chromium güncelleniyor...</translation>
 <translation id="358997566136285270">Chromium logosu</translation>
 <translation id="3713809861844741608">Bağlantıyı yeni Chromium &amp;sekmesinde aç</translation>
@@ -115,6 +115,7 @@
 <translation id="5386450000063123300">Chromium güncelleniyor (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium'un yeni bir sürümü çıktı.</translation>
 <translation id="5427571867875391349">Chromium'u varsayılan tarayıcım olarak ayarla</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
 <translation id="5466153949126434691">Chromium otomatik olarak güncellenerek her zaman en yeni sürüme sahip olmanızı sağlar. Bu indirme işlemi tamamlandığında Chromium yeniden başlatılacak ve yolunuza devam edeceksiniz.</translation>
 <translation id="5479196819031988440">Chromium OS bu sayfayı açamıyor.</translation>
 <translation id="5480860683791598150">Konumunuzu bu siteyle paylaşabilmek için Chromium'un konum bilgilerinize erişmesi gerekiyor</translation>
@@ -174,7 +175,7 @@
 <translation id="7205698830395646142">Chromium Menüsünde Gizle</translation>
 <translation id="7223968959479464213">Görev Yöneticisi - Chromium</translation>
 <translation id="722928257909516027">Chromium menüsünü göster</translation>
-<translation id="731644333568559921">&amp;Chromium OS'u güncelle</translation>
+<translation id="731644333568559921">&amp;Chromium OS'i güncelle</translation>
 <translation id="731795002583552498">Chromium güncelleniyor</translation>
 <translation id="7318036098707714271">Tercihler dosyanız bozuk veya geçersiz.
 
@@ -189,6 +190,7 @@
 <ph name="BEGIN_LINK_2" />Daha fazla bilgi edinin<ph name="END_LINK_2" />
 
 Daha fazla talimat için lütfen e-postanızı (<ph name="ACCOUNT_EMAIL" />) kontrol edin.</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">Chromium'un bu sitede kameranıza erişmesi için izin gerekiyor</translation>
 <translation id="7483335560992089831">Şu anda çalışan aynı Chromium sürümünü yükleyemezsiniz. Lütfen Chromium'u kapatın ve yeniden deneyin.</translation>
 <translation id="7549178288319965365">Chromium OS hakkında</translation>
@@ -202,6 +204,7 @@
 <translation id="7756122083761163394">Bu kullanıcının göz atma verileri bu cihazdan silinecektir. Verileri kurtarmak için Chrome'da $2 olarak oturum açın.</translation>
 <translation id="7773960292263897147">Uyarı: Chromium, uzantıların tarama geçmişinizi kaydetmesini engelleyemez. Gizli modda bu uzantıyı devre dışı bırakmak için bu seçeneğin onay işaretini kaldırın.</translation>
 <translation id="7774736947049807614">Kimlik doğrulama sertifikası çalışmadı. Lütfen <ph name="USER_NAME" /> olarak Chromium'da tekrar oturum açın veya daha fazla bilgi edinmek için yöneticinizle iletişime geçin. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium en son sürüme güncellenemediği için yeni özellikler ve güvenlik düzeltmeleri cihazınızda bulunmuyor.</translation>
 <translation id="7937630085815544518">Chromium'da <ph name="USER_EMAIL_ADDRESS" /> olarak oturum açtınız. Tekrar oturum açmak için lütfen aynı hesabı kullanın.</translation>
 <translation id="7962572577636132072">Chromium otomatik olarak güncellenir, böylece her zaman en yeni sürüme sahip olursunuz.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index c5c1007f..0804a4d 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">正在更新 Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">Chromium 现已推出新版本。</translation>
 <translation id="5427571867875391349">将Chromium设为默认浏览器</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 测试版</translation>
 <translation id="5466153949126434691">Chromium会自动更新,因此您使用的始终都是最新版本。更新内容下载完毕后,Chromium会重新启动,然后您就可以开始使用了。</translation>
 <translation id="5479196819031988440">Chromium 操作系统无法打开此网页。</translation>
 <translation id="5480860683791598150">Chromium 需要获得位置权限,才能将您的位置信息共享给此网站</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />了解详情<ph name="END_LINK_2" />
 
 有关详细说明,请查看 <ph name="ACCOUNT_EMAIL" /> 中的电子邮件。</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium 开发者版</translation>
 <translation id="7451052299415159299">Chromium 需要获得相应权限,才能允许此网站使用您的摄像头</translation>
 <translation id="7483335560992089831">无法安装与当前运行的版本相同的 Chromium。请关闭 Chromium 并重试。</translation>
 <translation id="7549178288319965365">关于 Chromium 操作系统</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">系统将会从此设备上删除该用户的浏览数据。要想恢复这些数据,请以“$2”的身份登录 Chrome。</translation>
 <translation id="7773960292263897147">警告:Chromium 无法阻止扩展程序记录您的浏览活动。要在无痕模式下停用该扩展程序,请取消选中此选项。</translation>
 <translation id="7774736947049807614">身份验证失败。请以“<ph name="USER_NAME" />”的身份重新登录 Chromium,或者与您的管理员联系以了解详情。<ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
 <translation id="7867198900892795913">Chromium 无法更新至最新版本,因此您未能获得最新的功能和安全修复程序。</translation>
 <translation id="7937630085815544518">您之前登录 Chromium 时使用的帐号为 <ph name="USER_EMAIL_ADDRESS" />,请使用同一帐号再次登录。</translation>
 <translation id="7962572577636132072">Chromium会自动更新,因此您使用的始终都是最新版本。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 6fdbb2ef..f798ff32 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -117,6 +117,7 @@
 <translation id="5386450000063123300">正在更新 Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="5398878173008909840">新版 Chromium 現已推出。</translation>
 <translation id="5427571867875391349">將 Chromium 設為預設瀏覽器</translation>
+<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 測試版</translation>
 <translation id="5466153949126434691">Chromium 會自動更新,隨時讓你使用最新版本。完成這項下載作業後,Chromium 會重新啟動,自動為你進行更新。</translation>
 <translation id="5479196819031988440">Chromium 作業系統無法開啟這個網頁。</translation>
 <translation id="5480860683791598150">Chromium 需要位置資訊存取權,才能與這個網站分享你的位置資訊</translation>
@@ -191,6 +192,7 @@
 <ph name="BEGIN_LINK_2" />瞭解詳情<ph name="END_LINK_2" />
 
 如需進一步的操作說明,請登入您的 <ph name="ACCOUNT_EMAIL" /> 帳戶,查看系統寄給您的電子郵件。</translation>
+<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium 開發人員版</translation>
 <translation id="7451052299415159299">Chromium 需要相關權限,才能讓這個網站使用你的攝影機</translation>
 <translation id="7483335560992089831">無法安裝這個版本的 Chromium,因為目前正在執行相同版本。請關閉 Chromium,然後再試一次。</translation>
 <translation id="7549178288319965365">關於 Chromium 作業系統</translation>
@@ -204,6 +206,7 @@
 <translation id="7756122083761163394">這位使用者的瀏覽資料將從這個裝置上刪除。如要還原資料,請以「$2」的身分登入 Chrome。</translation>
 <translation id="7773960292263897147">警告:Chromium 無法禁止擴充功能記錄你的瀏覽活動。如要在無痕模式中停用這個擴充功能,請取消選取這個選項。</translation>
 <translation id="7774736947049807614">驗證憑證無效,請以<ph name="USER_NAME" />身分重新登入 Chromium 或向你的管理員洽詢詳情。<ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary 版</translation>
 <translation id="7867198900892795913">Chromium 無法更新至最新版本,因此你並未取得最新功能和安全性問題修正。</translation>
 <translation id="7937630085815544518">你使用了 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入 Chromium,請使用相同帳戶重新登入。</translation>
 <translation id="7962572577636132072">Chromium 會自動更新,隨時讓你使用最新版本。</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 9dd6867..aecd5a4 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">አንድ ድረ-ገጽ ላይ Tabን መጫን አገናኞችንና እንዲሁም የቅጽ መስኮችን ያደምቃል።</translation>
 <translation id="2916745397441987255">በቅጥያዎች ውስጥ ይፈልጉ</translation>
 <translation id="2921081876747860777">እባክዎ አካባቢያዊ ውሂብዎን ለመጠበቅ የይለፍ ቃል ይፍጠሩ</translation>
-<translation id="2924395203970765374">ከ<ph name="FULL_NAME" /> ጋር ሰምሯል</translation>
 <translation id="2925966894897775835">ሉሆች</translation>
 <translation id="2927017729816812676">የመሸጎጫ ማከማቻ</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (የህጻናት መለያ)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">እንኳን ደስ አለዎት</translation>
 <translation id="3349933790966648062">የማህደረ ትውስታ</translation>
 <translation id="3353984535370177728">የሚሰቅሉትን አቃፊ ይምረጡ</translation>
-<translation id="335581015389089642">ንግግር</translation>
 <translation id="3355936511340229503">የግንኙነት ስህተት</translation>
 <translation id="3356797067524893661">ወደ Hangouts Meet ለመቀጠል ሙሉ በሙሉ ተዘጋጅተዋል</translation>
 <translation id="3358935496594837302">የእርስዎን ስልክ ማግኘት አልተቻለም። የበራ እና በቅርብ ርቀት የሚገኝ ተኳሃኝ የሆነ የAndroid ስልክ እየተጠቀሙ መሆንዎን ያረጋግጡ። &lt;a&gt;የበለጠ ለመረዳት&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;አዲስ ትር ውስጥ ክፈት</translation>
 <translation id="3616113530831147358">ድምጽ</translation>
 <translation id="3616741288025931835">&amp;የአሰሳ ውሂብ አጽዳ…</translation>
-<translation id="3618849550573277856">«<ph name="LOOKUP_STRING" />»ን ፈልግ</translation>
 <translation id="3620292326130836921">ሁሉም በምትኬ ተቀምጧል!</translation>
 <translation id="3623574769078102674">ይህ ክትትል የሚደረግበት ተጠቃሚ በ<ph name="MANAGER_EMAIL" /> ነው የሚተዳደረው።</translation>
 <translation id="3625258641415618104">ቅጽበታዊ-ገጽ እይታዎች ተሰናክለዋል</translation>
@@ -2143,7 +2140,6 @@
 <translation id="428565720843367874">የጸረ-ቫይረስ ሶፍትዌር ይህንን ፋይል እየቃኘ ሳለ ድንገት አልተሳካም።</translation>
 <translation id="428608937826130504">የመደርደሪያ ንጥል 8</translation>
 <translation id="4287502004382794929">ይህን መሣሪያ ለመመዝገብ በቂ የሆኑ የሶፍትዌር ፍቃዶች የለዎትም። ተጨማሪ ለመመዝገብ እባክዎ ሽያጭን ያግኙ። ይህን መልዕክት የሚያዩት በስህተት ነው ብለው ካመኑ እባክዎ ድጋፍን ያግኙ።</translation>
-<translation id="4289300219472526559">መናገር ይጀምሩ</translation>
 <translation id="4289540628985791613">ማጠቃለያ</translation>
 <translation id="4296575653627536209">ክትትል የሚደረግበት ተጠቃሚ አክል</translation>
 <translation id="4297322094678649474">ቋንቋዎችን ይቀይሩ</translation>
@@ -2439,7 +2435,6 @@
 <translation id="4813512666221746211">የአውታረ መረብ ስህተት</translation>
 <translation id="4816492930507672669">ገጹን አመጣጥን</translation>
 <translation id="4820334425169212497">አይ፣ አይታየኝም</translation>
-<translation id="4821725298388681253">ይህ ገና የመጀመሪያ ልቀት ነው። እንደ ፍለጋ እና የጽሑፍ ግቤት ያሉ አንዳንድ ባህሪያት እስካሁን ሊገኙ የሚችሉ አይደሉም።</translation>
 <translation id="4821935166599369261">&amp;መገለጫ መስራት ነቅቷል</translation>
 <translation id="4823484602432206655">የተጠቃሚ እና የመሣሪያ ቅንብሮችን ያንብቡ እና ይለውጡ</translation>
 <translation id="4823651846660089135">መሣሪያው ተነባቢ-ብቻ ነው</translation>
@@ -3449,7 +3444,6 @@
 <translation id="6388771388956873507">በመሣሪያዎ ላይ ያለውን የጣት አሻራ ዳሳሽ ያግኙትና በጣትዎ ይንኩት</translation>
 <translation id="6390799748543157332">በዚህ መስኮት ውስጥ የሚመለከቷቸውን ገጾች በአሰሳ ታሪክዎ ላይ የማይታዩ ሲሆን ሁሉንም የተከፈቱ የእንግዳ መስኮቶችን ከዘጉ በኋላ እንደ ኩኪዎች ያሉ ሌሎች መከታተያዎች በእርስዎ ኮምፒውተር ላይ አይተዉም። ይሁንና ማንኛውም የሚያወርዷቸው ፋይሎች ይቀመጣሉ።</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />የስርዓት መረጃ<ph name="END_LINK1" /> እና <ph name="BEGIN_LINK2" />ልኬቶች<ph name="END_LINK2" /> ይላኩ</translation>
-<translation id="6397363302884558537">መናገር አቁም</translation>
 <translation id="6397592254427394018">&amp;ሁሉንም እልባቶች ማንነትን በስውር መስኮት ክፈት</translation>
 <translation id="6398715114293939307">Google Play መደብርን አስወግድ</translation>
 <translation id="6398765197997659313">ከሙሉ ማሳያ መስኮት ይውጡ</translation>
@@ -5024,7 +5018,6 @@
 <translation id="8912793549644936705">ወጥር</translation>
 <translation id="8915370057835397490">የጥቆማ አስተያየት በመጫን ላይ</translation>
 <translation id="8916476537757519021">ማንነት የማያሳውቅ ንዑስ ክፈፍ፦ <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">ከ<ph name="ACCOUNT_FULL_NAME" /> ጋር አስምር</translation>
 <translation id="8922013791253848639">ሁልጊዜ በዚህ ጣቢያ ላይ ማስታወቂያዎችን አሳይ</translation>
 <translation id="8925458182817574960">&amp;ቅንብሮች</translation>
 <translation id="8926389886865778422">ደግመው አይጠይቁ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 807589a8..e69670e 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">يؤدي الضغط على علامة تبويب في صفحة الويب إلى إبراز الروابط وكذلك حقول النماذج</translation>
 <translation id="2916745397441987255">بحث في الإضافات</translation>
 <translation id="2921081876747860777">يُرجى إنشاء كلمة مرور لحماية بياناتك المحلية.</translation>
-<translation id="2924395203970765374">تمت المزامنة مع <ph name="FULL_NAME" />.</translation>
 <translation id="2925966894897775835">جداول البيانات</translation>
 <translation id="2927017729816812676">السعة التخزينية لذاكرة التخزين المؤقت</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (حساب للأطفال)</translation>
@@ -1552,7 +1551,6 @@
 <translation id="3348459612390503954">تهانينا</translation>
 <translation id="3349933790966648062">الذاكرة المستخدَمة</translation>
 <translation id="3353984535370177728">حدد مجلدًا لتحميله</translation>
-<translation id="335581015389089642">الحديث</translation>
 <translation id="3355936511340229503">خطأ الاتصال</translation>
 <translation id="3356797067524893661">‏الآن أنت جاهز تمامًا للمتابعة إلى Hangouts Meet</translation>
 <translation id="3358935496594837302">‏تعذّر العثور على هاتفك. تأكد من أنك تستخدم هاتف Android متوافقًا وأنه قيد التشغيل وفي متناول يديك. &lt;a&gt;مزيد من المعلومات&lt;/a&gt;</translation>
@@ -1729,7 +1727,6 @@
 <translation id="3613422051106148727">&amp;فتح في علامة تبويب جديدة</translation>
 <translation id="3616113530831147358">الصوت</translation>
 <translation id="3616741288025931835">&amp;محو بيانات التصفح...</translation>
-<translation id="3618849550573277856">البحث عن "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">تم نسخ جميع العناصر احتياطيًا</translation>
 <translation id="3623574769078102674">هذا المستخدم الذي يخضع للإشراف ستتم إدارته عن طريق <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">تم تعطيل لقطات الشاشة</translation>
@@ -2141,7 +2138,6 @@
 <translation id="428565720843367874">تعذّر برنامج مكافحة الفيروسات بشكل غير متوقع أثناء فحص هذا الملف.</translation>
 <translation id="428608937826130504">عنصر الرف 8</translation>
 <translation id="4287502004382794929">ليست لديك تراخيص برامج كافية لتسجيل هذا الجهاز. يُرجى الاتصال بالمبيعات لشراء المزيد. إذا كنت تعتقد أن هذه الرسالة ظهرت عن طريق الخطأ، فيُرجى الاتصال بالدعم.</translation>
-<translation id="4289300219472526559">بدء التحدث</translation>
 <translation id="4289540628985791613">نظرة عامة</translation>
 <translation id="4296575653627536209">إضافة مستخدم تحت الإشراف</translation>
 <translation id="4297322094678649474">تغيير اللغات</translation>
@@ -2437,7 +2433,6 @@
 <translation id="4813512666221746211">حدث خطأ في الشبكة</translation>
 <translation id="4816492930507672669">احتواء ضمن الصفحة</translation>
 <translation id="4820334425169212497">لا، أنا لا أراه.</translation>
-<translation id="4821725298388681253">يُعد ذلك إصدارًا أوليًا. ستكون بعض الميزات، مثل إدخال النص والبحث غير متاحة بعد.</translation>
 <translation id="4821935166599369261">&amp;التوصيف مفعّل</translation>
 <translation id="4823484602432206655">قراءة إعدادات المستخدم والجهاز وتغييرها</translation>
 <translation id="4823651846660089135">الجهاز للقراءة فقط</translation>
@@ -3448,7 +3443,6 @@
 <translation id="6388771388956873507">ابحث عن مستشعر بصمات الإصبع على جهازك والمسه بإصبعك</translation>
 <translation id="6390799748543157332">لن تُظهر الصفحات التي تعرضها في هذه النافذة في سجل المتصفح، ولن تترك أي آثار أخرى، مثل ملفات تعريف الارتباط، في الكمبيوتر بعد إغلاق جميع النوافذ المفتوحة بالضيف. ومع هذا سيتم الاحتفاظ بأي ملفات يتم تنزيلها.</translation>
 <translation id="6395423953133416962">إرسال <ph name="BEGIN_LINK1" />معلومات النظام<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />المقاييس<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">إيقاف التحدث</translation>
 <translation id="6397592254427394018">فتح جميع الإشارات المرجعية في ن&amp;افذة التصفح المتخفي</translation>
 <translation id="6398715114293939307">‏إزالة متجر Google Play</translation>
 <translation id="6398765197997659313">إنهاء وضع ملء الشاشة</translation>
@@ -5018,7 +5012,6 @@
 <translation id="8912793549644936705">تمدد</translation>
 <translation id="8915370057835397490">جارٍ تحميل الاقتراح</translation>
 <translation id="8916476537757519021">الإطار الفرعي للتصفح المتخفي: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">مزامنة مع <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">السماح دائمًا بالإعلانات على هذا الموقع</translation>
 <translation id="8925458182817574960">&amp;الإعدادات</translation>
 <translation id="8926389886865778422">عدم السؤال مرة أخرى</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 7c342e0..a1bce7e8 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Инструменти“.</translation>
 <translation id="2359808026110333948">Напред</translation>
 <translation id="236141728043665931">Достъпът до микрофона да се блокира винаги</translation>
+<translation id="2365507699358342471">Този сайт може да преглежда текста и изображенията, копирани в буферната памет.</translation>
 <translation id="2367972762794486313">Показване на приложенията</translation>
 <translation id="2371076942591664043">Отваряне &amp;след изтегляне</translation>
 <translation id="2377319039870049694">Превключване към списъчен изглед</translation>
@@ -1266,7 +1267,6 @@
 <translation id="2916073183900451334">При натискането на клавиша „Tab“ върху уеб страница се открояват връзките, както и полетата на формулярите</translation>
 <translation id="2916745397441987255">Търсете в разширенията</translation>
 <translation id="2921081876747860777">Моля, създайте парола, за да защитите локалните си данни.</translation>
-<translation id="2924395203970765374">Синхронизирано със: <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Електронни таблици</translation>
 <translation id="2927017729816812676">Хранилище за кеш</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (профил за деца)</translation>
@@ -1549,7 +1549,6 @@
 <translation id="3348459612390503954">Поздравления</translation>
 <translation id="3349933790966648062">Използвана памет</translation>
 <translation id="3353984535370177728">Избиране на папка за качване</translation>
-<translation id="335581015389089642">Speech</translation>
 <translation id="3355936511340229503">Грешка във връзката</translation>
 <translation id="3356797067524893661">Готови сте да продължите към Hangouts Meet</translation>
 <translation id="3358935496594837302">Телефонът ви не може да бъде намерен. Уверете се, че използвате съвместим телефон с Android, който е включен и е подръка. &lt;a&gt;Научете повече&lt;/a&gt;</translation>
@@ -1726,7 +1725,6 @@
 <translation id="3613422051106148727">&amp;Отваряне в нов раздел</translation>
 <translation id="3616113530831147358">Аудио</translation>
 <translation id="3616741288025931835">&amp;Изчистване на данните за сърфирането...</translation>
-<translation id="3618849550573277856">Търсене на „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="3620292326130836921">На всичко бе създадено резервно копие!</translation>
 <translation id="3623574769078102674">Този контролиран потребител ще се управлява от <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Екранните снимки са деактивирани</translation>
@@ -2141,7 +2139,6 @@
 <translation id="428565720843367874">Неочаквано сканирането на този файл от антивирусния софтуер не бе успешно.</translation>
 <translation id="428608937826130504">Елемент 8 в лавицата</translation>
 <translation id="4287502004382794929">Нямате достатъчно лицензи за софтуер, за да запишете това устройство. Моля, свържете се с екипа за продажби, за да купите още. Ако смятате, че виждате това съобщение по погрешка, моля, обърнете се към екипа за поддръжка.</translation>
-<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4289540628985791613">Общ преглед</translation>
 <translation id="4296575653627536209">Добавяне на контролиран потребител</translation>
 <translation id="4297322094678649474">Промяна на езиците</translation>
@@ -2402,6 +2399,7 @@
 <translation id="4748762018725435655">Изисква се разширение от уеб магазина на Chrome</translation>
 <translation id="4750394297954878236">Предложения</translation>
 <translation id="475088594373173692">Първи потребител</translation>
+<translation id="4751476147751820511">Сензори за движение или светлина</translation>
 <translation id="4756378406049221019">Спиране/презареждане</translation>
 <translation id="4756388243121344051">&amp;История</translation>
 <translation id="4759238208242260848">Изтегляния</translation>
@@ -2436,7 +2434,6 @@
 <translation id="4813512666221746211">Грешка в мрежата</translation>
 <translation id="4816492930507672669">Да се побере в страницата</translation>
 <translation id="4820334425169212497">Не, не го виждам</translation>
-<translation id="4821725298388681253">Това е ранна версия. Някои функции, като например тези за въвеждане на текст и търсене, още не са налице.</translation>
 <translation id="4821935166599369261">&amp;Профилирането е активирано</translation>
 <translation id="4823484602432206655">Четене и промяна на настройките на потребителите и устройството</translation>
 <translation id="4823651846660089135">Устройството е само за четене</translation>
@@ -3448,7 +3445,6 @@
 <translation id="6388771388956873507">Намерете сензора за отпечатъци на устройството си и го докоснете с пръст</translation>
 <translation id="6390799748543157332">Преглежданите от вас страници в този прозорец няма да се показват в историята на браузъра и няма да оставят на компютъра други следи, като „бисквитки“, след като затворите всички прозорци в режим като гост. Изтеглените от вас файлове обаче ще бъдат запазени.</translation>
 <translation id="6395423953133416962">Изпращане на <ph name="BEGIN_LINK1" />системна информация<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />показатели<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6397592254427394018">Отваряне на всички отметки в прозорец в режим „&amp;инкогнито“</translation>
 <translation id="6398715114293939307">Премахване на Google Play Магазин</translation>
 <translation id="6398765197997659313">Изход от цял екран</translation>
@@ -4021,6 +4017,7 @@
 <translation id="7297443947353982503">Потребителското име или паролата са неправилни или удостоверяването през EAP не бе успешно</translation>
 <translation id="729761647156315797">Избиране на език и клавиатура</translation>
 <translation id="7299337219131431707">Активиране на сърфирането като гост</translation>
+<translation id="7303900363563182677">Този сайт няма право да преглежда текста и изображенията, копирани в буферната памет</translation>
 <translation id="730515362922783851">Обмен на данни с всяко устройство в локалната мрежа или интернет</translation>
 <translation id="7308002049209013926">Използвайте стартовия панел, за да стигате бързо до новите приложения и активности. За да го отворите от клавиатурата, натиснете Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Показване на &amp;контролите</translation>
@@ -4402,6 +4399,7 @@
 <translation id="7909969815743704077">Изтеглено в режим „инкогнито“</translation>
 <translation id="7910768399700579500">&amp;Нова папка</translation>
 <translation id="7912080627461681647">Паролата ви е променена в сървъра. Моля, излезте от профила си и влезте отново в него.</translation>
+<translation id="7912883689016444961">Конфигуриране на мобилната мрежа</translation>
 <translation id="7915471803647590281">Моля, кажете ни какво става, преди да изпратите отзивите.</translation>
 <translation id="7925247922861151263">Проверката за AAA не бе успешна</translation>
 <translation id="7925285046818567682">Изчаква се отговор от <ph name="HOST_NAME" />...</translation>
@@ -4913,6 +4911,7 @@
 <translation id="8736288397686080465">Този сайт бе актуализиран на заден план.</translation>
 <translation id="8737685506611670901">Да отваря връзки от типа „<ph name="PROTOCOL" />“ вместо <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Картина в картината</translation>
 <translation id="8743864605301774756">Актуализирано преди 1 ч</translation>
 <translation id="8749863574775030885">Достъп до USB устройства от неизвестен доставчик</translation>
 <translation id="8754200782896249056">&lt;p&gt;Когато изпълнявате <ph name="PRODUCT_NAME" /> в поддържана среда на компютър, ще се използват системните настройки за прокси сървър. Но системата ви или не се поддържа, или е възникнал проблем при стартирането на системната конфигурация.&lt;/p&gt;
@@ -5015,7 +5014,6 @@
 <translation id="8912793549644936705">Разтегляне</translation>
 <translation id="8915370057835397490">Предложението се зарежда</translation>
 <translation id="8916476537757519021">Подрамка в режим „инкогнито“: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Синхронизиране с/ъс <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Рекламите на този сайт да са разрешени винаги</translation>
 <translation id="8925458182817574960">&amp;Настройки</translation>
 <translation id="8926389886865778422">Без повторно питане</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index d14a15d..dfe29e15 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -353,7 +353,7 @@
 <translation id="152234381334907219">কখনও সংরক্ষিত হয়নি</translation>
 <translation id="1524430321211440688">কীবোর্ড</translation>
 <translation id="1524563461097350801">না থাক</translation>
-<translation id="1525740877599838384">লোকেশন নির্ধারণ করতে ওয়াই-ফাই ব্যবহার করুন</translation>
+<translation id="1525740877599838384">লোকেশন নির্ধারণ করার জন্য ওয়াই-ফাই ব্যবহার করুন</translation>
 <translation id="1526560967942511387">শিরোনামহীন ডকুমেন্ট</translation>
 <translation id="1526925867532626635">সিঙ্ক সেটিংস নিশ্চিত করুন</translation>
 <translation id="1529116897397289129">সংরক্ষিত কার্ড এখানে দেখা যাবে</translation>
@@ -436,7 +436,7 @@
 <translation id="164814987133974965">আপনার নির্দেশনার মাধ্যমে একজন ব্যবহারকারী ওয়েবে এক্সপ্লোর করতে পারেন৷ একজন তত্ত্বাবধানে থাকা ব্যবহারকারীর পরিচালক হিসাবে আপনি,
     বিশেষ ওয়েবসাইটগুলি <ph name="BEGIN_BOLD" />মুঞ্জুরি বা নিষিদ্ধ<ph name="END_BOLD" /> করতে পারেন,
     তত্ত্বাবধানে থাকা ব্যবহারকারীর দ্বারা ঘুরে দেখা ওয়েবসাইটগুলি <ph name="BEGIN_BOLD" />পর্যালোচনা<ph name="END_BOLD" /> করতে পারেন, এবং অন্য সেটিংস <ph name="BEGIN_BOLD" />পরিচালনা করতে পারেন<ph name="END_BOLD" />৷</translation>
-<translation id="1648528859488547844">লোকেশন নির্ধারণ করতে ওয়াই-ফাই বা মোবাইল নেটওয়ার্ক ব্যবহার করুন</translation>
+<translation id="1648528859488547844">লোকেশন নির্ধারণ করার জন্য ওয়াই-ফাই অথবা মোবাইল নেটওয়ার্ক ব্যবহার করুন</translation>
 <translation id="1648943974594387137">সাইন-ইনের বিবরণ পুরানো হয়ে গেছে</translation>
 <translation id="1650371550981945235">ইনপুট বিকল্পগুলি দেখান</translation>
 <translation id="1650709179466243265">www. এবং .com যুক্ত করুন এবং ঠিকানা খুলুন</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">সরঞ্জাম মেনুতে এক্সটেনশান ক্লিক করে আপনার এক্সটেনশানগুলি পরিচালনা করুন৷</translation>
 <translation id="2359808026110333948">অবিরত</translation>
 <translation id="236141728043665931">মাইক্রোফোনের অ্যাক্সেস সর্বদা অবরুদ্ধ রাখুন</translation>
+<translation id="2365507699358342471">এই সাইটটি ক্লিপবোর্ডে কপি করা টেক্সট এবং ছবি দেখতে পায়।</translation>
 <translation id="2367972762794486313">অ্যাপ্লিকেশানগুলি দেখান</translation>
 <translation id="2371076942591664043">&amp;সম্পন্ন হলে খুলুন</translation>
 <translation id="2377319039870049694">তালিকা দৃশ্যে যান</translation>
@@ -1271,7 +1272,6 @@
 <translation id="2916073183900451334">কোনও ওয়েবপৃষ্ঠায় লিঙ্কগুলি হাইলাইট করে ট্যাব টেপা পাশাপাশি ফর্ম ক্ষেত্রগুলি</translation>
 <translation id="2916745397441987255">এক্সটেনশানগুলি খুঁজুন</translation>
 <translation id="2921081876747860777">আপনার স্থানীয় ডেটা রক্ষা করার জন্য দয়া করে একটি পাসওয়ার্ড তৈরি করুন।</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> এ সিঙ্ক করা হয়েছে</translation>
 <translation id="2925966894897775835">পত্রকগুলি</translation>
 <translation id="2927017729816812676">ক্যাশে সঞ্চয় স্থান</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (শিশুদের জন্য অ্যাকাউন্ট)</translation>
@@ -1550,7 +1550,6 @@
 <translation id="3348459612390503954">অভিনন্দন</translation>
 <translation id="3349933790966648062">মেমরি ফুটপ্রিন্ট</translation>
 <translation id="3353984535370177728">আপলোড করতে একটি ফোল্ডার বেছে নিন</translation>
-<translation id="335581015389089642">স্পিচ</translation>
 <translation id="3355936511340229503">সংযোগ ত্রুটি</translation>
 <translation id="3356797067524893661">Hangouts Meet ব্যবহার চালিয়ে যেতে আপনি প্রস্তুত</translation>
 <translation id="3358935496594837302">আপনার ফোন খুঁজে পাওয়া যায়নি৷ নিশ্চিত করুন আপনার একটি উপযুক্ত Android ফোন আছে যেটি চালু রয়েছে এবং সহজে ব্যবহার করা যায়।&lt;a&gt;আরও জানুন/a&gt;</translation>
@@ -1586,7 +1585,7 @@
 <translation id="3414952576877147120">মাপ:</translation>
 <translation id="3420980393175304359">ব্যক্তি পরিবর্তন করুন</translation>
 <translation id="3421387094817716717">এলিপ্টিক কার্ভ সর্বজনীন কী</translation>
-<translation id="3423463006624419153">আপনার '<ph name="PHONE_NAME_1" />' এবং '<ph name="PHONE_NAME_2" />' এ।</translation>
+<translation id="3423463006624419153">আপনার '<ph name="PHONE_NAME_1" />' এবং '<ph name="PHONE_NAME_2" />' এ:</translation>
 <translation id="342383653005737728">এই ডিভাইসের জন্য মালিক Google কে ডায়গনস্টিক এবং ব্যবহারের ডেটা পাঠানোর বিষয়টি চয়ন করতে পারেন। আপনি এই <ph name="BEGIN_LINK1" />সেটিংটি<ph name="END_LINK1" /> এখানে দেখতে পারেন। <ph name="BEGIN_LINK2" />আরও জানুন<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918">দয়া করে <ph name="PRODUCT_NAME" />-কে পুনঃলঞ্চ করুন</translation>
 <translation id="3424969259347320884">ট্যাবটি ক্র্যাশ হওয়ার সময় আপনি কি করছিলেন তা বর্ণনা করুন</translation>
@@ -1727,7 +1726,6 @@
 <translation id="3613422051106148727">&amp;নতুন ট্যাবে খুলুন</translation>
 <translation id="3616113530831147358">অডিও</translation>
 <translation id="3616741288025931835">ব্রাউজ করা ডেটা &amp;সাফ করুন...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” খুঁজে দেখুন</translation>
 <translation id="3620292326130836921">সব ব্যাকআপ নেওয়া হয়ে গেছে!</translation>
 <translation id="3623574769078102674">তত্ত্বাবধানে থাকা এই ব্যবহারকারী <ph name="MANAGER_EMAIL" /> এর দ্বারা পরিচালিত হবে৷</translation>
 <translation id="3625258641415618104">স্ক্রীনশট অক্ষম হয়েছে</translation>
@@ -1839,7 +1837,7 @@
 <translation id="378312418865624974">এই কম্পিউটারের জন্য একটি অনন্য শনাক্তকারী পড়ুন</translation>
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">অ্যাপ্লিকেশানগুলির শর্টকাট দেখান</translation>
-<translation id="3785727820640310185">এই সাইটের পাসওয়ার্ড সেভ করা হয়েছে</translation>
+<translation id="3785727820640310185">এই সাইটের জন্য সেভ করা পাসওয়ার্ড</translation>
 <translation id="3785852283863272759">ইমেল পৃষ্ঠার অবস্থান</translation>
 <translation id="3786301125658655746">আপনি অফলাইন আছেন</translation>
 <translation id="3788401245189148511">এটা হতে পারে:</translation>
@@ -2141,7 +2139,6 @@
 <translation id="428565720843367874">এই ফাইলটি স্ক্যান করার সময় এন্টি ভাইরাস সফ্টওয়্যার অপ্রত্যাশিতভাবে ব্যর্থ হয়েছে৷</translation>
 <translation id="428608937826130504">তাকের আইটেম নম্বর ৮</translation>
 <translation id="4287502004382794929">এই ডিভাইসটি নথিভুক্ত করার জন্য আপনার পর্যাপ্ত সফ্টওয়্যার লাইসেন্স নেই৷ আরও কেনার জন্য দয়া করে বিক্রয় এ যোগাযোগ করুন৷ আপনি যদি মনে করেন যে কোনো ত্রুটির ফলে আপনি এই বার্তাটি দেখতে পাচ্ছেন, তাহলে দয়া করে সমর্থনে যোগাযোগ করুন৷</translation>
-<translation id="4289300219472526559">কথা বলা শুরু করুন</translation>
 <translation id="4289540628985791613">ওভারভিউ</translation>
 <translation id="4296575653627536209">তত্ত্বাবধানে থাকা ব্যবহারকারীকে যোগ করুন</translation>
 <translation id="4297322094678649474">ভাষাগুলি পরিবর্তন করুন</translation>
@@ -2402,6 +2399,7 @@
 <translation id="4748762018725435655">Chrome ওয়েব স্টোর থেকে এক্সটেনশানের প্রয়োজন</translation>
 <translation id="4750394297954878236">প্রস্তাবনা</translation>
 <translation id="475088594373173692">প্রথম ব্যবহারকারী</translation>
+<translation id="4751476147751820511">মোশন বা হালকা সেন্সর</translation>
 <translation id="4756378406049221019">থামান/রিলোড করুন</translation>
 <translation id="4756388243121344051">&amp;ইতিহাস</translation>
 <translation id="4759238208242260848">ডাউনলোডগুলি</translation>
@@ -2436,7 +2434,6 @@
 <translation id="4813512666221746211">নেটওয়ার্ক  ত্রুটি</translation>
 <translation id="4816492930507672669">পৃষ্ঠাতে মানানসই</translation>
 <translation id="4820334425169212497">না, আমি এটা দেখিনি</translation>
-<translation id="4821725298388681253">এটি একটি আগাম রিলিজ। সার্চ এবং টেক্সট ইনপুটের মতো বৈশিষ্ট্যগুলি এখনও চালু হয়নি।</translation>
 <translation id="4821935166599369261">&amp;প্রোফাইলিং সক্ষমিত</translation>
 <translation id="4823484602432206655">ব্যবহারকারী এবং ডিভাইস সেটিংস পড়ুন ও পরিবর্তন করুন</translation>
 <translation id="4823651846660089135">ডিভাইস শুধুমাত্র পঠনযোগ্য</translation>
@@ -2652,7 +2649,7 @@
 <translation id="5143374789336132547">আপনি হোম বোতাম ক্লিক করলে কোন পৃষ্ঠা দেখানো হবে তা <ph name="EXTENSION_NAME" /> এক্সটেনশানটি পরিবর্তন করেছে।</translation>
 <translation id="5143712164865402236">পূর্ণ স্ক্রিনে প্রবেশ করুন</translation>
 <translation id="5145331109270917438">পরিবর্তনের তারিখ</translation>
-<translation id="514575469079499857">লোকেশন নির্ধারণ করার জন্য আপনার আইপি অ্যাড্রেস ব্যবহার করুন</translation>
+<translation id="514575469079499857">লোকেশন নির্ধারণ করার জন্য আপনার আইপি অ্যাড্রেস ব্যবহার করুন (ডিফল্ট)</translation>
 <translation id="5150254825601720210">Netscape শংসাপত্র SSL সার্ভার নাম</translation>
 <translation id="5151354047782775295">ডিস্কের জায়গা খালি করুন, নাহলে নির্বাচিত তথ্য স্বয়ংক্রিয়ভাবে মুছে ফেলা হতে পারে</translation>
 <translation id="5153297660536091054">পিন দিয়ে আনলক করার বৈশিষ্ট্য</translation>
@@ -2818,7 +2815,7 @@
 <translation id="5398772614898833570">বিজ্ঞাপন ব্লক করা হয়েছে</translation>
 <translation id="5402815541704507626">মোবাইল ডেটা ব্যবহার করে আপডেটটি ডাউনলোড করুন</translation>
 <translation id="540296380408672091"><ph name="HOST" /> এ সর্বদা কুকিজ অবরুদ্ধ করুন</translation>
-<translation id="5405146885510277940">সেটিংস আবার সেট করুন</translation>
+<translation id="5405146885510277940">সেটিংস রিসেট করুন</translation>
 <translation id="5408750356094797285">জুম করুন: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">আমাকে অবাক করুন</translation>
 <translation id="5411472733320185105">এই হোস্টগুলি এবং ডোমেনগুলির জন্য প্রক্সি সেটিংস ব্যবহার করবেন না:</translation>
@@ -3447,7 +3444,6 @@
 <translation id="6388771388956873507">আপনার ডিভাইসে আঙ্গুলের ছাপ নেওয়ার সেন্সরটি খুঁজে নিয়ে সেটিকে আপনার আঙুল দিয়ে স্পর্শ করুন</translation>
 <translation id="6390799748543157332">এই উইন্ডোতে আপনি যে পৃষ্ঠাগুলি দেখেন তা ব্রাউজারের ইতিহাসে উপস্থিত হবে না, এবং আপনি সমস্ত খোলা অতিথি উইন্ডো বন্ধ করার পরে এগুলি কম্পিউটারটিতে কুকিজের মতো অন্যান্য ট্রেসগুলিও রেখে যাবে না৷ যদিও আপনার ডাউনলোড করা যেকোনো ফাইল সংরক্ষিত করা হবে৷</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />সিস্টেমের তথ্য<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />মেট্রিক্স<ph name="END_LINK2" /> পাঠান</translation>
-<translation id="6397363302884558537">কথা বলা বন্ধ করুন</translation>
 <translation id="6397592254427394018">ছ্দ্মবেশী উইন্ডোতে &amp;সকল বুকমার্ক খুলুন</translation>
 <translation id="6398715114293939307">Google Play স্টোর সরান</translation>
 <translation id="6398765197997659313">পূর্ণ স্ক্রীণ বন্ধ করুন</translation>
@@ -4005,7 +4001,7 @@
 <translation id="7279701417129455881">কুকি ব্লক করা পরিচালনা করুন...</translation>
 <translation id="7280041992884344566">ক্ষতিকর সফ্টওয়্যার খোঁজার সময় Chrome এ কোনও সমস্যা হয়েছে</translation>
 <translation id="7280877790564589615">অনুমতির জন্য অনুরোধ করা হয়েছে</translation>
-<translation id="7282992757463864530">তথ্যবার</translation>
+<translation id="7282992757463864530">তথ্য দেখানোর জায়গা</translation>
 <translation id="7283041136720745563">আপনার Google ড্রাইভের কোটা যথেষ্ট নয়।</translation>
 <translation id="7287143125007575591">অ্যাক্সেস অস্বীকার করা হয়েছে।</translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
@@ -4019,6 +4015,7 @@
 <translation id="7297443947353982503">ইউজারনেম/পাসওয়ার্ড ভুল অথবা EAP-প্রমাণীকরণ ব্যর্থ হয়েছে</translation>
 <translation id="729761647156315797">আপনার ভাষা ও কীবোর্ড বেছে নিন</translation>
 <translation id="7299337219131431707">অতিথি ব্রাউজিং সক্ষম করুন</translation>
+<translation id="7303900363563182677">ক্লিপবোর্ডে কপি করা টেক্সট এবং ছবি দেখা থেকে এই সাইটটিকে ব্লক করা হয়েছে</translation>
 <translation id="730515362922783851">স্থানীয় নেটওয়ার্ক বা ইন্টারনেটে যে কোনো ডিভাইসের সাথে ডেটা বিনিময় করুন</translation>
 <translation id="7308002049209013926">নতুন অ্যাপ এবং কার্যকলাপগুলি দ্রুত চালু করতে লঞ্চার ব্যবহার করুন। কীবোর্ডের সাহায্যে এখানে পেতে Alt + Shift + L বোতামটি টিপুন।</translation>
 <translation id="7309257895202129721">&amp;নিয়ন্ত্রণগুলি দেখান</translation>
@@ -4247,7 +4244,7 @@
 <translation id="7690378713476594306">তালিকা থেকে বেছে নিন</translation>
 <translation id="7690853182226561458">ফোল্ডার যুক্ত &amp;করুন...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (ইতিমধ্যে এই ডিভাইসে রয়েছে)</translation>
-<translation id="7696063401938172191">আপনার '<ph name="PHONE_NAME" />' এ।</translation>
+<translation id="7696063401938172191">আপনার '<ph name="PHONE_NAME" />' এ:</translation>
 <translation id="7698408911093959127">{COUNT,plural, =1{বুকমার্ক তালিকাতে ১টি আইটেম আছে}one{বুকমার্ক তালিকাতে #টি আইটেম আছে}other{বুকমার্ক তালিকাতে #টি আইটেম আছে}}</translation>
 <translation id="7701040980221191251">কিছুই নয়</translation>
 <translation id="7701869757853594372">ব্যবহারকারীর হ্যান্ডলগুলি</translation>
@@ -4398,6 +4395,7 @@
 <translation id="7909969815743704077">ছদ্মবেশী ভাবে ডাউনলোড হয়েছে</translation>
 <translation id="7910768399700579500">&amp;নতুন ফোল্ডার</translation>
 <translation id="7912080627461681647">সার্ভারে আপনার পাসওয়ার্ড পাল্টানো হয়েছে। অনুগ্রহ করে সাইন-আউট করে আবার সাইন-ইন করুন।</translation>
+<translation id="7912883689016444961">মোবাইল নেটওয়ার্ক কনফিগার করুন</translation>
 <translation id="7915471803647590281">প্রতিক্রিয়াটি প্রেরণের আগে কী ঘটছে তা দয়া করে আমাদের জানান৷ </translation>
 <translation id="7925247922861151263">AAA যাচাই ব্যর্থ</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" />-এর জন্য অপেক্ষা করা হচ্ছে...</translation>
@@ -4604,7 +4602,7 @@
 <translation id="8234795456569844941">এই সমস্যাটির সমাধান করতে আমাদের ইঞ্জিনিয়ারদের সাহায্য করুন। আমাদের জানান, ঠিক কি ঘটার পরে এই প্রোফাইল ত্রুটির মেসেজটি দেখেছিলেন:</translation>
 <translation id="8234989666557591529">আপনার <ph name="DEVICE_TYPE" /> আনলক করার জন্য একটি ফোন নম্বর বেছে নিন।</translation>
 <translation id="8238649969398088015">সহায়তা  টিপ</translation>
-<translation id="8239020549147958415"><ph name="FULL_NAME" /> এ সিঙ্ক করুন</translation>
+<translation id="8239020549147958415"><ph name="FULL_NAME" /> হিসেবে সিঙ্ক করুন</translation>
 <translation id="8240697550402899963">ক্লাসিক থিম ব্যবহার করুন</translation>
 <translation id="8241040075392580210">ছায়াদায়ক</translation>
 <translation id="8241806945692107836">ডিভাইস কনফিগারেশন নির্ধারণ করা হচ্ছে...</translation>
@@ -4741,7 +4739,7 @@
 <translation id="8465444703385715657"><ph name="PLUGIN_NAME" /> চালানোর জন্য আপনার অনুমতি প্রয়োজন</translation>
 <translation id="8466234950814670489">Tar আর্কাইভ</translation>
 <translation id="8468750959626135884">আপনার Android ফোন দিয়ে আপনার <ph name="DEVICE_TYPE" /> আনলক করুন।</translation>
-<translation id="8470513973197838199"><ph name="ORIGIN" /> এর পাসওয়ার্ড সেভ করুন</translation>
+<translation id="8470513973197838199"><ph name="ORIGIN" /> এর জন্য সেভ করা পাসওয়ার্ডগুলি</translation>
 <translation id="8472623782143987204">hardware-backed</translation>
 <translation id="8475313423285172237">আপনার কম্পিউটারের অন্য একটি প্রোগ্রাম একটি এক্সটেনশন জুড়েছে যা Chrome এর কাজ করার পদ্ধতিকে পাল্টে দিতে পারে৷</translation>
 <translation id="8475647382427415476">Google ড্রাইভ এই মুহূর্তে "<ph name="FILENAME" />" সিঙ্ক করতে পারেনি। Google ড্রাইভ পরে আবার চেষ্টা করবে।</translation>
@@ -4910,6 +4908,7 @@
 <translation id="8736288397686080465">পটভূমিতে এই সাইটটি আপডেট করা হয়েছে৷</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />-এর পরিবর্তে <ph name="PROTOCOL" /> লিঙ্কসমূহ খুলুন</translation>
 <translation id="8737709691285775803">শিল</translation>
+<translation id="8741316211671074806">ছবির-মধ্যে-ছবি</translation>
 <translation id="8743864605301774756">১ঘণ্টা আগে আপডেট করা হয়েছে</translation>
 <translation id="8749863574775030885">একটি অজানা বিক্রেতা থেকে USB ডিভাইস অ্যাক্সেস করুন</translation>
 <translation id="8754200782896249056">&lt;p&gt;কোন সমর্থিত ডেস্কটপ পরিবেশে <ph name="PRODUCT_NAME" /> চলার সময়, সিস্টেম প্রক্সি সেটিংস ব্যবহার করা হবে৷ যদিও, আপনার সিস্টেম সমর্থিত নয় অথবা আপনার সিস্টেম কনফিগারেশান প্রবর্তন করার সময় একটি সমস্যা হয়েছে৷&lt;/p&gt;
@@ -5012,7 +5011,6 @@
 <translation id="8912793549644936705">বিস্তার</translation>
 <translation id="8915370057835397490">লোড করার প্রস্তাব</translation>
 <translation id="8916476537757519021">ছদ্মবেশী সাবফ্রেম: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> এ সিঙ্ক করুন</translation>
 <translation id="8922013791253848639">এই সাইটে সবসময় বিজ্ঞাপন দেখানোর অনুমতি দিন</translation>
 <translation id="8925458182817574960">&amp;সেটিংস</translation>
 <translation id="8926389886865778422">আর জিজ্ঞাসা করবেন না</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 57010b2..f6a66b7 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Per gestionar les extensions, feu clic a Extensions al menú Eines.</translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="236141728043665931">Bloqueja sempre l'accés al micròfon</translation>
+<translation id="2365507699358342471">Aquest lloc web pot veure el text i les imatges copiats al porta-retalls.</translation>
 <translation id="2367972762794486313">Mostra les aplicacions</translation>
 <translation id="2371076942591664043">Obre quan &amp;acabi</translation>
 <translation id="2377319039870049694">Canvia a la visualització de llista</translation>
@@ -1101,7 +1102,7 @@
 <translation id="270358213449696159">Contingut de les Condicions de Google Chrome OS</translation>
 <translation id="2704184184447774363">Signatura de documents de Microsoft</translation>
 <translation id="270516211545221798">Velocitat del ratolí tàctil</translation>
-<translation id="2705736684557713153">Desplaça't fins a la part inferior de la pantalla i activa l'opció Compartició de xarxa instantània, si la veus. Si no la veus, vol dir que ho tens tot a punt.</translation>
+<translation id="2705736684557713153">Desplaça't fins a la part inferior de la pantalla i activa l'opció Compartició de xarxa instantània, si es mostra. Si no, vol dir que ho tens tot a punt.</translation>
 <translation id="2706892089432507937">Dispositius USB</translation>
 <translation id="2706954854267016964">El dispositiu Google Cloud Print seleccionat ja no és compatible. Prova de configurar la impressora a la configuració del sistema de l'ordinador.</translation>
 <translation id="2707024448553392710">S'està baixant el component.</translation>
@@ -1268,7 +1269,6 @@
 <translation id="2916073183900451334">En prémer la tecla de tabulació en una pàgina web, es ressalten els enllaços i els camps de formulari</translation>
 <translation id="2916745397441987255">Cerca extensions</translation>
 <translation id="2921081876747860777">Crea una contrasenya per protegir les teves dades locals.</translation>
-<translation id="2924395203970765374">Sincronitzat amb <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Fulls</translation>
 <translation id="2927017729816812676">Emmagatzematge a la memòria cau</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (compte infantil)</translation>
@@ -1550,7 +1550,6 @@
 <translation id="3348459612390503954">Enhorabona</translation>
 <translation id="3349933790966648062">Ús de la memòria</translation>
 <translation id="3353984535370177728">Seleccioneu una carpeta per penjar</translation>
-<translation id="335581015389089642">Veu</translation>
 <translation id="3355936511340229503">Error de connexió</translation>
 <translation id="3356797067524893661">Ja estàs a punt per accedir a Hangouts Meet</translation>
 <translation id="3358935496594837302">No es troba el telèfon. Comprova que estiguis utilitzant un telèfon Android compatible, que estigui encès i que sigui a prop. &lt;a&gt;Més informació&lt;/a&gt;</translation>
@@ -1727,7 +1726,6 @@
 <translation id="3613422051106148727">&amp;Obre en una pestanya nova</translation>
 <translation id="3616113530831147358">Àudio</translation>
 <translation id="3616741288025931835">&amp;Elimina les dades de navegació...</translation>
-<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Tots els elements tenen una còpia de seguretat.</translation>
 <translation id="3623574769078102674"><ph name="MANAGER_EMAIL" /> gestionarà aquest usuari supervisat.</translation>
 <translation id="3625258641415618104">Captures de pantalla desactivades</translation>
@@ -2141,7 +2139,6 @@
 <translation id="428565720843367874">S'ha produït un error inesperat en el programari antivirus mentre s'escanejava aquest fitxer.</translation>
 <translation id="428608937826130504">Objecte de prestatge 8</translation>
 <translation id="4287502004382794929">No teniu prou llicències de programari per registrar aquest dispositiu. Contacteu amb l'equip de vendes per comprar-ne més. Si creieu que veieu aquest missatge per error, poseu-vos en contacte amb el servei d'assistència.</translation>
-<translation id="4289300219472526559">Comença a parlar</translation>
 <translation id="4289540628985791613">Descripció general</translation>
 <translation id="4296575653627536209">Afegeix un usuari supervisat</translation>
 <translation id="4297322094678649474">Canvia els idiomes</translation>
@@ -2403,6 +2400,7 @@
 <translation id="4748762018725435655">Requereix una extensió de Chrome Web Store</translation>
 <translation id="4750394297954878236">Suggeriments</translation>
 <translation id="475088594373173692">Primer usuari</translation>
+<translation id="4751476147751820511">Sensors de moviment o de llum</translation>
 <translation id="4756378406049221019">Atura/Torna a carregar</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4759238208242260848">Baixades</translation>
@@ -2437,7 +2435,6 @@
 <translation id="4813512666221746211">Error de xarxa</translation>
 <translation id="4816492930507672669">Ajusta a la mida de la pàgina</translation>
 <translation id="4820334425169212497">No, no el veig</translation>
-<translation id="4821725298388681253">Això és una versió inicial. Algunes de les funcions, com ara la cerca i la introducció de text, encara no estan disponibles.</translation>
 <translation id="4821935166599369261">Creació de &amp;perfils activada</translation>
 <translation id="4823484602432206655">Llegir i canviar la configuració d'usuari i del dispositiu</translation>
 <translation id="4823651846660089135">El dispositiu és només de lectura</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">Localitza el sensor d'empremtes digitals al dispositiu i toca'l amb el dit</translation>
 <translation id="6390799748543157332">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar totes les finestres obertes de la sessió de convidat. No obstant això, es conservaran tots els fitxers que baixeu.</translation>
 <translation id="6395423953133416962">Envia les <ph name="BEGIN_LINK2" />mètriques<ph name="END_LINK2" /> i la <ph name="BEGIN_LINK1" />informació del sistema<ph name="END_LINK1" /></translation>
-<translation id="6397363302884558537">Deixa de parlar</translation>
 <translation id="6397592254427394018">Obre totes les adreces d'interès en una &amp;finestra d'incògnit</translation>
 <translation id="6398715114293939307">Suprimeix Google Play Store</translation>
 <translation id="6398765197997659313">Surt del mode de pantalla completa</translation>
@@ -4022,6 +4018,7 @@
 <translation id="7297443947353982503">El nom d'usuari o la contrasenya és incorrecte o no s'ha pogut realitzar l'autorització d'EAP.</translation>
 <translation id="729761647156315797">Tria l'idioma i el teclat</translation>
 <translation id="7299337219131431707">Activa la navegació com a convidat</translation>
+<translation id="7303900363563182677">No es permet que aquest lloc web vegi el text ni les imatges copiats al porta-retalls</translation>
 <translation id="730515362922783851">Intercanviar dades amb un altre dispositiu de la xarxa local o d'Internet</translation>
 <translation id="7308002049209013926">Utilitza el menú d'aplicacions per accedir ràpidament a aplicacions i activitats noves. Per accedir-hi amb el teclat, prem Alt+Maj+L.</translation>
 <translation id="7309257895202129721">Mostra els &amp;controls</translation>
@@ -4395,6 +4392,7 @@
 <translation id="7909969815743704077">S'ha baixat en mode d'incògnit</translation>
 <translation id="7910768399700579500">Carpeta &amp;nova</translation>
 <translation id="7912080627461681647">La contrasenya s'ha canviat al servidor. Tanca la sessió i torna-la a iniciar.</translation>
+<translation id="7912883689016444961">Configura la xarxa mòbil</translation>
 <translation id="7915471803647590281">Indica'ns el problema abans d'enviar els comentaris.</translation>
 <translation id="7925247922861151263">Error en la comprovació d'AAA</translation>
 <translation id="7925285046818567682">Esperant <ph name="HOST_NAME" />...</translation>
@@ -4906,6 +4904,7 @@
 <translation id="8736288397686080465">El lloc s'ha actualitzat en segon pla.</translation>
 <translation id="8737685506611670901">Obrir els enllaços del protocol <ph name="PROTOCOL" /> en lloc del gestor <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Pantalla en pantalla</translation>
 <translation id="8743864605301774756">S'ha actualitzat fa 1 hora</translation>
 <translation id="8749863574775030885">Accedir a dispositius USB d'un proveïdor desconegut</translation>
 <translation id="8754200782896249056">&lt;p&gt;Quan <ph name="PRODUCT_NAME" /> s'executa en un entorn d'escriptori compatible, s'utilitza la configuració del servidor intermediari del sistema. No obstant això, o bé el vostre sistema no és compatible o bé s'ha produït un problema en iniciar la configuració del sistema.&lt;/p&gt;
@@ -5008,7 +5007,6 @@
 <translation id="8912793549644936705">Amplia</translation>
 <translation id="8915370057835397490">S'estan carregant els suggeriments</translation>
 <translation id="8916476537757519021">Submarc d'incògnit: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronitza amb <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Permet sempre els anuncis en aquest lloc web</translation>
 <translation id="8925458182817574960">&amp;Configuració</translation>
 <translation id="8926389886865778422">No m'ho tornis a preguntar</translation>
@@ -5098,7 +5096,7 @@
 <translation id="9056810968620647706">No s'ha trobat cap coincidència.</translation>
 <translation id="9057119625587205566">No hi ha cap impressora a prop</translation>
 <translation id="9059868303873565140">Menú d'estat</translation>
-<translation id="9063208415146866933">Error entre les línies <ph name="ERROR_LINE_START" /> i <ph name="ERROR_LINE_END" /></translation>
+<translation id="9063208415146866933">Error des de la línia <ph name="ERROR_LINE_START" /> fins a la <ph name="ERROR_LINE_END" /></translation>
 <translation id="9064142312330104323">Foto del perfil de Google (s'està carregant)</translation>
 <translation id="9064275926664971810">Activa Emplenament automàtic per emplenar els formularis amb un sol clic</translation>
 <translation id="9064939804718829769">S'està transferint...</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index d732bd3..66d8c2b8 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -883,6 +883,7 @@
 <translation id="2359345697448000899">Chcete-li spravovat rozšíření, klikněte v nabídce Nástroje na příkaz Rozšíření.</translation>
 <translation id="2359808026110333948">Pokračovat</translation>
 <translation id="236141728043665931">Vždy blokovat přístup k mikrofonu</translation>
+<translation id="2365507699358342471">Tato stránka má přístup k textu a obrázkům zkopírovaným do schránky.</translation>
 <translation id="2367972762794486313">Zobrazit aplikace</translation>
 <translation id="2371076942591664043">Po dokončení otevřít</translation>
 <translation id="2377319039870049694">Přepnout na zobrazení seznamu</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">Stiskem klávesy Tab zvýrazníte na webové stránce odkazy a pole formulářů</translation>
 <translation id="2916745397441987255">Hledat rozšíření</translation>
 <translation id="2921081876747860777">Ochraňte svá místní data pomocí hesla.</translation>
-<translation id="2924395203970765374">Synchronizováno s účtem <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Tabulky</translation>
 <translation id="2927017729816812676">Cache Storage</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (účet pro děti)</translation>
@@ -1551,7 +1551,6 @@
 <translation id="3348459612390503954">Gratulujeme</translation>
 <translation id="3349933790966648062">Obsazená paměť</translation>
 <translation id="3353984535370177728">Vyberte složku pro nahrání</translation>
-<translation id="335581015389089642">Řeč</translation>
 <translation id="3355936511340229503">Chyba připojení</translation>
 <translation id="3356797067524893661">Jste připraveni pokračovat do služby Hangouts Meet</translation>
 <translation id="3358935496594837302">Telefon nebyl nalezen. Zkontrolujte, zda používáte kompatibilní telefon Android, který je zapnutý a který máte u sebe. &lt;a&gt;Další informace&lt;/a&gt;</translation>
@@ -1728,7 +1727,6 @@
 <translation id="3613422051106148727">&amp;Otevřít v nové kartě</translation>
 <translation id="3616113530831147358">Zvuk</translation>
 <translation id="3616741288025931835">&amp;Smazat údaje o prohlížení...</translation>
-<translation id="3618849550573277856">Vyhledat „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="3620292326130836921">Vše je zálohováno</translation>
 <translation id="3623574769078102674">Tento dozorovaný uživatel bude spravován uživatelem <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Snímky obrazovky zakázány</translation>
@@ -2142,7 +2140,6 @@
 <translation id="428565720843367874">Při kontrole tohoto souboru došlo k neočekávané chybě antivirového softwaru.</translation>
 <translation id="428608937826130504">Položka č. 8 v poličce</translation>
 <translation id="4287502004382794929">Nemáte dostatečný počet softwarových licencí k registraci tohoto zařízení. Kontaktujte obchodní oddělení a kupte si další. Pokud se domníváte, že se jedná o chybu, kontaktujte podporu.</translation>
-<translation id="4289300219472526559">Začít mluvit</translation>
 <translation id="4289540628985791613">Přehled</translation>
 <translation id="4296575653627536209">Přidat dozorovaného uživatele</translation>
 <translation id="4297322094678649474">Změnit jazyky</translation>
@@ -2386,7 +2383,7 @@
 <translation id="4722920479021006856"><ph name="APP_NAME" /> sdílí vaši obrazovku.</translation>
 <translation id="4724450788351008910">Přidružení změněno</translation>
 <translation id="4724850507808590449">Počet zálohovaných fotek: <ph name="FILE_COUNT" /></translation>
-<translation id="4726710629007580002">Při pokusu o instalaci rozšíření se spustila varování:</translation>
+<translation id="4726710629007580002">Při pokusu o instalaci rozšíření se spustila upozornění:</translation>
 <translation id="4728558894243024398">Platforma</translation>
 <translation id="4731422630970790516">Položka č. 3 v poličce</translation>
 <translation id="4732760563705710320">Je nám líto, ale vaše zařízení Cast toto video nepodporuje.</translation>
@@ -2403,6 +2400,7 @@
 <translation id="4748762018725435655">Vyžaduje rozšíření z Internetového obchodu Chrome</translation>
 <translation id="4750394297954878236">Návrhy</translation>
 <translation id="475088594373173692">První uživatel</translation>
+<translation id="4751476147751820511">Senzory pohybu nebo světla</translation>
 <translation id="4756378406049221019">Zastavit / načíst znovu</translation>
 <translation id="4756388243121344051">Historie</translation>
 <translation id="4759238208242260848">Stažené soubory</translation>
@@ -2437,7 +2435,6 @@
 <translation id="4813512666221746211">Chyba sítě</translation>
 <translation id="4816492930507672669">Přizpůsobit na stránku</translation>
 <translation id="4820334425169212497">Ne, nevidím jej</translation>
-<translation id="4821725298388681253">Jedná se o ranou verzi. Některé funkce, např. vyhledávání a zadávání textu, zatím nejsou k dispozici.</translation>
 <translation id="4821935166599369261">&amp;Profilování povoleno</translation>
 <translation id="4823484602432206655">Čtení a změna nastavení zařízení a uživatele</translation>
 <translation id="4823651846660089135">Zařízení je pouze pro čtení</translation>
@@ -3447,7 +3444,6 @@
 <translation id="6388771388956873507">Vyhledejte senzor otisků prstů na zařízení a dotkněte se ho prstem</translation>
 <translation id="6390799748543157332">Stránky, které otevřete v tomto okně, nebudou uvedeny v historii prohlížeče a nezanechají v počítači po zavření všech oken hosta žádné stopy, např. soubory cookie. Všechny stažené soubory však budou zachovány.</translation>
 <translation id="6395423953133416962">Odesílat <ph name="BEGIN_LINK1" />informace o systému<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />metriky<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Přestat mluvit</translation>
 <translation id="6397592254427394018">Otevřít všechny záložky v &amp;anonymním okně</translation>
 <translation id="6398715114293939307">Odstranit Obchod Google Play</translation>
 <translation id="6398765197997659313">Ukončit režim celé obrazovky</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">Neplatné uživatelské jméno/heslo nebo neúspěšná autorizace EAP</translation>
 <translation id="729761647156315797">Výběr jazyka a klávesnice</translation>
 <translation id="7299337219131431707">Povolit prohlížení v roli hosta</translation>
+<translation id="7303900363563182677">Tomuto webu byl zablokován přístup k textu a obrázkům zkopírovaným do schránky</translation>
 <translation id="730515362922783851">Výměna dat s libovolným zařízením v lokální síti nebo internetu</translation>
 <translation id="7308002049209013926">Pomocí Spouštěče se rychle dostanete k novým aplikacím a činnostem. Chcete-li se sem dostat pomocí klávesnice, stiskněte Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Zobrazit &amp;ovládací prvky</translation>
@@ -4166,7 +4163,7 @@
 <translation id="7543104066686362383">Aktivovat v tomto zařízení <ph name="IDS_SHORT_PRODUCT_NAME" /> funkce ladění</translation>
 <translation id="7544853251252956727">Přehrávat náhodně</translation>
 <translation id="7545415673537747415">Způsob, jakým Google používá vaši historii procházení k přizpůsobení Vyhledávání, reklam a dalších služeb Google, můžete ovládat pomocí <ph name="BEGIN_LINK" />Ovládacích prvků aktivity Google<ph name="END_LINK" />.</translation>
-<translation id="7547317915858803630">Varování: Vaše nastavení aplikace <ph name="PRODUCT_NAME" /> jsou uložena na síťovém disku. To může vést ke zpomalení, chybám nebo ztrátě dat.</translation>
+<translation id="7547317915858803630">Upozornění: Vaše nastavení aplikace <ph name="PRODUCT_NAME" /> jsou uložena na síťovém disku. To může vést ke zpomalení, chybám nebo ztrátě dat.</translation>
 <translation id="7548856833046333824">Limonáda</translation>
 <translation id="7550830279652415241">záložky_<ph name="DATESTAMP" />.html</translation>
 <translation id="7551059576287086432">Stažení souboru <ph name="FILE_NAME" /> bylo úspěšné</translation>
@@ -4245,7 +4242,7 @@
 <translation id="7690378713476594306">Vybrat ze seznamu</translation>
 <translation id="7690853182226561458">Přidat &amp;složku...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (již v tomto zařízení je)</translation>
-<translation id="7696063401938172191">V telefonu <ph name="PHONE_NAME" />:</translation>
+<translation id="7696063401938172191">Na telefonu <ph name="PHONE_NAME" />:</translation>
 <translation id="7698408911093959127">{COUNT,plural, =1{1 položka v seznamu záložek}few{# položky v seznamu záložek}many{# položky v seznamu záložek}other{# položek v seznamu záložek}}</translation>
 <translation id="7701040980221191251">Žádné</translation>
 <translation id="7701869757853594372">Popisovače – UŽIVATEL</translation>
@@ -4298,7 +4295,7 @@
 <translation id="7782102568078991263">Žádné další návrhy z Googlu</translation>
 <translation id="778330624322499012">Nelze načíst plugin <ph name="PLUGIN_NAME" /></translation>
 <translation id="7784067724422331729">Tento soubor byl zablokován nastavením zabezpečení vašeho počítače.</translation>
-<translation id="778480864305029524">Chcete-li používat Dynamický tethering, zapněte oznámení Služeb Google Play.</translation>
+<translation id="778480864305029524">Chcete-li používat dynamický tethering, zapněte oznámení Služeb Google Play.</translation>
 <translation id="7786207843293321886">Odhlásit hosta</translation>
 <translation id="7786889348652477777">Znovu načíst &amp;aplikaci</translation>
 <translation id="7787129790495067395">Momentálně používáte heslovou frázi. Pokud jste ji zapomněli, můžete synchronizaci resetovat a vymazat data ze serverů společnosti Google pomocí Hlavního panelu Google.</translation>
@@ -4397,6 +4394,7 @@
 <translation id="7909969815743704077">Staženo v anonymním režimu</translation>
 <translation id="7910768399700579500">Nová složka</translation>
 <translation id="7912080627461681647">Vaše heslo bylo na serveru změněno. Odhlaste se a poté se znovu přihlaste.</translation>
+<translation id="7912883689016444961">Nakonfigurovat mobilní síť</translation>
 <translation id="7915471803647590281">Než nám odešlete zpětnou vazbu, sdělte nám prosím, co se děje.</translation>
 <translation id="7925247922861151263">Selhala bezpečnostní kontrola AAA</translation>
 <translation id="7925285046818567682">Čekání na <ph name="HOST_NAME" />...</translation>
@@ -4518,7 +4516,7 @@
 <translation id="8077684120002777443">Uživatelské jméno (např. uzivatel@example.com)</translation>
 <translation id="8077816382010018681">Sem patří nadpis oznámení funkce rychlého odemknutí</translation>
 <translation id="8079530767338315840">Opakovat</translation>
-<translation id="8079938625609335826">Chcete-li mít rozšíření ve všech zařízeních, zapněte synchronizaci.</translation>
+<translation id="8079938625609335826">Chcete-li mít rozšíření na všech svých zařízeních, zapněte synchronizaci.</translation>
 <translation id="8083739373364455075">Získejte zdarma 100 GB na Disku Google</translation>
 <translation id="8086015605808120405">Probíhá konfigurace tiskárny <ph name="PRINTER_NAME" />...</translation>
 <translation id="8090234456044969073">Může číst seznam nejčastěji navštěvovaných webů</translation>
@@ -4908,6 +4906,7 @@
 <translation id="8736288397686080465">Tento web byl na pozadí aktualizován.</translation>
 <translation id="8737685506611670901">Otevírat odkazy <ph name="PROTOCOL" /> namísto aplikace <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Obraz v obraze</translation>
 <translation id="8743864605301774756">Aktualizováno před 1 h</translation>
 <translation id="8749863574775030885">Přístup k zařízením USB od neznámého dodavatele</translation>
 <translation id="8754200782896249056">&lt;p&gt;Při spuštění aplikace <ph name="PRODUCT_NAME" /> v podporovaném počítačovém prostředí se použijí systémová nastavení proxy serveru. Váš systém však buď není podporován, nebo došlo k problému se spuštěním konfigurace systému.&lt;/p&gt;
@@ -5010,7 +5009,6 @@
 <translation id="8912793549644936705">Roztáhnout</translation>
 <translation id="8915370057835397490">Načítá se návrh</translation>
 <translation id="8916476537757519021">Anonymní podrámec: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synchronizovat do účtu <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Na tomto webu reklamy vždy povolovat</translation>
 <translation id="8925458182817574960">&amp;Nastavení</translation>
 <translation id="8926389886865778422">Dotaz již nezobrazovat</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 557dd00..9bf7e54a 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1268,7 +1268,6 @@
 <translation id="2916073183900451334">Tryk på Tab på en webside fremhæver links og felter i formularer</translation>
 <translation id="2916745397441987255">Søg efter udvidelser</translation>
 <translation id="2921081876747860777">Opret en adgangskode for at beskytte dine lokale data.</translation>
-<translation id="2924395203970765374">Synkroniseret med <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Sheets</translation>
 <translation id="2927017729816812676">Cachelagring</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (børnekonto)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Tillykke</translation>
 <translation id="3349933790966648062">Hukommelsesforbrug</translation>
 <translation id="3353984535370177728">Vælg en mappe, der skal uploades</translation>
-<translation id="335581015389089642">Tale</translation>
 <translation id="3355936511340229503">Forbindelsesfejl</translation>
 <translation id="3356797067524893661">Du kan nu fortsætte til Hangouts Meet</translation>
 <translation id="3358935496594837302">Din telefon blev ikke fundet. Sørg for, at du bruger en kompatibel Android-telefon, der er tændt og befinder sig i nærheden. &lt;a&gt;Få flere oplysninger&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Åbn på ny fane</translation>
 <translation id="3616113530831147358">Lyd</translation>
 <translation id="3616741288025931835">&amp;Slet browserdata...</translation>
-<translation id="3618849550573277856">Slå "<ph name="LOOKUP_STRING" />" op</translation>
 <translation id="3620292326130836921">Alt er sikkerhedskopieret.</translation>
 <translation id="3623574769078102674">Denne administrerede bruger administreres af <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Screenshots er deaktiveret</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Antivirussoftwaren mislykkedes uventet under scanning af denne fil.</translation>
 <translation id="428608937826130504">Hyldeelement 8</translation>
 <translation id="4287502004382794929">Du har ikke nok softwarelicenser til at tilmelde denne enhed. Kontakt salgsafdelingen for at købe flere. Hvis du mener, at du får vist denne meddelelse ved en fejl, bedes du kontakte support.</translation>
-<translation id="4289300219472526559">Start indtaling</translation>
 <translation id="4289540628985791613">Oversigt</translation>
 <translation id="4296575653627536209">Tilføj en administreret bruger</translation>
 <translation id="4297322094678649474">Skift sprog</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Netværksfejl</translation>
 <translation id="4816492930507672669">Tilpas til siden</translation>
 <translation id="4820334425169212497">Nej, jeg kan ikke se den</translation>
-<translation id="4821725298388681253">Dette er en tidlig udgivelse. Nogle funktioner såsom søgning og indtastning af tekst er ikke tilgængelige endnu.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktiveret</translation>
 <translation id="4823484602432206655">Læs og rediger bruger- og enhedsindstillinger</translation>
 <translation id="4823651846660089135">Enheden er skrivebeskyttet</translation>
@@ -3453,7 +3448,6 @@
 <translation id="6388771388956873507">Find fingeraftrykslæseren på din enhed, og tryk på den med fingeren</translation>
 <translation id="6390799748543157332">De sider, du ser i dette vindue, vises ikke i browserhistorikken, og de efterlader ikke andre spor som f.eks. cookies på computeren, når du lukker alle åbne vinduer i gæstesessionen. Alle de filer, du downloader, vil dog blive gemt.</translation>
 <translation id="6395423953133416962">Send <ph name="BEGIN_LINK1" />systemoplysninger<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />metrics<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop indtaling</translation>
 <translation id="6397592254427394018">Åbn alle bogmærker i &amp;inkognitovindue</translation>
 <translation id="6398715114293939307">Fjern Google Play Butik</translation>
 <translation id="6398765197997659313">Afslut fuld skærm</translation>
@@ -5023,7 +5017,6 @@
 <translation id="8912793549644936705">Stræk</translation>
 <translation id="8915370057835397490">Indlæser forslag</translation>
 <translation id="8916476537757519021">Underramme for inkognitotilstand: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synkroniser med <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Tillad altid annoncer på dette website</translation>
 <translation id="8925458182817574960">&amp;Indstillinger</translation>
 <translation id="8926389886865778422">Spørg ikke igen</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 0127b95..55349612 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -31,7 +31,7 @@
 <translation id="1039337018183941703">Ungültige oder beschädigte Datei</translation>
 <translation id="1042174272890264476">Auch die RLZ-Bibliothek von <ph name="SHORT_PRODUCT_NAME" /> ist auf Ihrem Computer vorinstalliert. RLZ sorgt für die Zuweisung von Tags, anhand derer gemessen wird, wie sich einzelne Werbekampagnen auf die Suchanfragen und die Nutzung von <ph name="SHORT_PRODUCT_NAME" /> auswirken. Die Tags sind weder eindeutig, noch personenbezogen und kommen manchmal in Google-Suchanfragen in <ph name="PRODUCT_NAME" /> vor.</translation>
 <translation id="1046059554679513793">Dieser Name wird bereits verwendet.</translation>
-<translation id="1046286965898806214">Soll <ph name="PASSWORD_MANAGER_BRAND" /> Ihr Passwort für diese Website speichern?</translation>
+<translation id="1046286965898806214">Soll <ph name="PASSWORD_MANAGER_BRAND" /> Ihr Konto für diese Website speichern?</translation>
 <translation id="1047431265488717055">Linkte&amp;xt kopieren</translation>
 <translation id="1047726139967079566">Lesezeichen für diese Seite erstellen</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> Elemente werden gelöscht...</translation>
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">Klicken Sie zum Verwalten Ihrer Erweiterungen im Menü "Tools" auf "Erweiterungen".</translation>
 <translation id="2359808026110333948">Weiter</translation>
 <translation id="236141728043665931">Zugriff auf das Mikrofon immer blockieren</translation>
+<translation id="2365507699358342471">Diese Website kann Texte und Bilder aus der Zwischenablage abrufen.</translation>
 <translation id="2367972762794486313">Apps anzeigen</translation>
 <translation id="2371076942591664043">Nach &amp;Download öffnen</translation>
 <translation id="2377319039870049694">Zur Listenansicht wechseln</translation>
@@ -1265,7 +1266,6 @@
 <translation id="2916073183900451334">Durch Drücken der Tab-Taste auf einer Webseite werden Links sowie Formularfelder markiert.</translation>
 <translation id="2916745397441987255">In Erweiterungen suchen</translation>
 <translation id="2921081876747860777">Erstellen Sie ein Passwort, um Ihre lokalen Daten zu schützen.</translation>
-<translation id="2924395203970765374">Mit <ph name="FULL_NAME" /> synchronisiert</translation>
 <translation id="2925966894897775835">Tabellen</translation>
 <translation id="2927017729816812676">Cache-Speicher</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Konto für Kinder)</translation>
@@ -1548,7 +1548,6 @@
 <translation id="3348459612390503954">Glückwunsch</translation>
 <translation id="3349933790966648062">Speicherbedarf</translation>
 <translation id="3353984535370177728">Ordner zum Hochladen auswählen</translation>
-<translation id="335581015389089642">Sprachausgabe</translation>
 <translation id="3355936511340229503">Verbindungsfehler</translation>
 <translation id="3356797067524893661">Hangouts Meet-Einrichtung abgeschlossen</translation>
 <translation id="3358935496594837302">Smartphone wurde nicht gefunden. Ihr Smartphone muss ein kompatibles Android-Smartphone sein, das eingeschaltet ist und sich in Reichweite befindet. &lt;a&gt;Weitere Informationen&lt;/a&gt;</translation>
@@ -1725,7 +1724,6 @@
 <translation id="3613422051106148727">In &amp;neuem Tab öffnen</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Browserdaten löschen...</translation>
-<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" nachschlagen</translation>
 <translation id="3620292326130836921">Alle Daten gesichert</translation>
 <translation id="3623574769078102674">Dieser betreute Nutzer wird von <ph name="MANAGER_EMAIL" /> verwaltet.</translation>
 <translation id="3625258641415618104">Screenshot-Funktion deaktiviert</translation>
@@ -1797,7 +1795,7 @@
 <translation id="3727148787322499904">Änderungen dieser Einstellung wirken sich auf alle freigegebenen Netzwerke aus</translation>
 <translation id="3727187387656390258">Pop-up prüfen</translation>
 <translation id="3728067901555601989">OTP:</translation>
-<translation id="3732078975418297900">Fehler in Zeile "<ph name="ERROR_LINE" />"</translation>
+<translation id="3732078975418297900">Fehler in Zeile <ph name="ERROR_LINE" /></translation>
 <translation id="3733127536501031542">SSL-Server mit Step-up</translation>
 <translation id="3737536731758327622">Hier werden Ihre Downloads angezeigt</translation>
 <translation id="3738924763801731196"><ph name="OID" />:</translation>
@@ -2140,7 +2138,6 @@
 <translation id="428565720843367874">Beim Scannen dieser Datei durch die Antivirensoftware ist ein unerwarteter Fehler aufgetreten.</translation>
 <translation id="428608937826130504">Ablageartikel 8</translation>
 <translation id="4287502004382794929">Sie haben nicht genügend Softwarelizenzen zum Anmelden dieses Geräts. Weitere Lizenzen können Sie beim Vertrieb erwerben. Wenn Sie glauben, dass Sie diese Meldung fälschlicherweise erhalten, kontaktieren Sie den Support.</translation>
-<translation id="4289300219472526559">Sprachausgabe starten</translation>
 <translation id="4289540628985791613">Übersicht</translation>
 <translation id="4296575653627536209">Betreuten Nutzer hinzufügen</translation>
 <translation id="4297322094678649474">Sprachen ändern</translation>
@@ -2401,6 +2398,7 @@
 <translation id="4748762018725435655">Erweiterung aus dem Chrome Web Store erforderlich</translation>
 <translation id="4750394297954878236">Vorschläge</translation>
 <translation id="475088594373173692">Erster Nutzer</translation>
+<translation id="4751476147751820511">Bewegungs- oder Lichtsensoren</translation>
 <translation id="4756378406049221019">Stopp/Neu laden</translation>
 <translation id="4756388243121344051">&amp;Verlauf</translation>
 <translation id="4759238208242260848">Downloads</translation>
@@ -2435,7 +2433,6 @@
 <translation id="4813512666221746211">Netzwerkfehler</translation>
 <translation id="4816492930507672669">An Seite anpassen</translation>
 <translation id="4820334425169212497">Nein, dieser Code wird nicht angezeigt.</translation>
-<translation id="4821725298388681253">Dies ist eine Vorabversion. Einige Funktionen, beispielsweise die Suche und die Texteingabe, sind noch nicht verfügbar.</translation>
 <translation id="4821935166599369261">&amp;Profilerstellung aktiviert</translation>
 <translation id="4823484602432206655">Nutzer- und Geräteeinstellungen lesen und ändern</translation>
 <translation id="4823651846660089135">Gerät ist schreibgeschützt</translation>
@@ -2928,7 +2925,7 @@
 <translation id="5556206011531515970">Klicken Sie auf "Weiter", um Ihren Standardbrowser zu wählen.</translation>
 <translation id="5556459405103347317">Neu laden</translation>
 <translation id="555746285996217175">Sperren oder ein-/ausschalten</translation>
-<translation id="5557579359142031072">Identifizierungsinformationen zu Ihrem Sicherheitsschlüssel ansehen</translation>
+<translation id="5557579359142031072">Identifizierungsinformationen zu Ihrem Sicherheitsschlüssel abrufen</translation>
 <translation id="5557991081552967863">WLAN im Ruhemodus aktiviert lassen</translation>
 <translation id="5558129378926964177">Ver&amp;größern</translation>
 <translation id="55601339223879446">Desktopbegrenzungen auf dem Bildschirm anpassen</translation>
@@ -3446,7 +3443,6 @@
 <translation id="6388771388956873507">Suchen Sie den Fingerabdrucksensor Ihres Geräts und berühren Sie ihn mit dem Finger</translation>
 <translation id="6390799748543157332">In diesem Fenster aufgerufene Seiten erscheinen nicht im Browserverlauf und hinterlassen auch keine anderweitigen Spuren wie Cookies auf dem Computer, nachdem Sie alle geöffneten Gastmodus-Fenster geschlossen haben. Heruntergeladene Dateien bleiben jedoch erhalten.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Systeminformationen<ph name="END_LINK1" /> und <ph name="BEGIN_LINK2" />Messwerte<ph name="END_LINK2" /> senden</translation>
-<translation id="6397363302884558537">Sprachausgabe stoppen</translation>
 <translation id="6397592254427394018">Alle Lesezeichen in &amp;Inkognito-Fenster öffnen</translation>
 <translation id="6398715114293939307">Google Play Store entfernen</translation>
 <translation id="6398765197997659313">Vollbildmodus beenden</translation>
@@ -4019,6 +4015,7 @@
 <translation id="7297443947353982503">Nutzername/Passwort falsch oder Fehler bei EAP-Authentifizierung</translation>
 <translation id="729761647156315797">Sprache und Tastatur wählen</translation>
 <translation id="7299337219131431707">Gastmodus aktivieren</translation>
+<translation id="7303900363563182677">Diese Website wurde daran gehindert, Texte und Bilder aus der Zwischenablage abzurufen</translation>
 <translation id="730515362922783851">Daten mit einem beliebigen Gerät im lokalen Netzwerk oder Internet austauschen</translation>
 <translation id="7308002049209013926">Über den Launcher gelangen Sie schnell zu neuen Apps und Aktivitäten. Zum Öffnen über die Tastatur drücken Sie Alt + Shift + L.</translation>
 <translation id="7309257895202129721">&amp;Steuerelemente anzeigen</translation>
@@ -4403,6 +4400,7 @@
 <translation id="7909969815743704077">Im Inkognitomodus heruntergeladen</translation>
 <translation id="7910768399700579500">&amp;Neuer Ordner</translation>
 <translation id="7912080627461681647">Ihr Passwort wurde auf dem Server geändert. Bitte melden Sie sich ab und dann wieder an.</translation>
+<translation id="7912883689016444961">Mobilfunknetz konfigurieren</translation>
 <translation id="7915471803647590281">Bitte beschreiben Sie das Problem, bevor Sie das Feedback abschicken.</translation>
 <translation id="7925247922861151263">AAA-Prüfung fehlgeschlagen</translation>
 <translation id="7925285046818567682">Warten auf <ph name="HOST_NAME" />...</translation>
@@ -4915,6 +4913,7 @@
 <translation id="8736288397686080465">Diese Website wurde im Hintergrund aktualisiert.</translation>
 <translation id="8737685506611670901"><ph name="PROTOCOL" />-Links anstelle von <ph name="REPLACED_HANDLER_TITLE" /> öffnen</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Bild im Bild</translation>
 <translation id="8743864605301774756">Vor einer Stunde aktualisiert</translation>
 <translation id="8749863574775030885">Auf USB-Geräte von einem unbekannten Anbieter zugreifen</translation>
 <translation id="8754200782896249056">&lt;p&gt;Bei der Ausführung von <ph name="PRODUCT_NAME" /> in einer unterstützten Desktop-Umgebung werden die Proxy-Einstellungen des Systems verwendet. Allerdings wird entweder Ihr System nicht unterstützt oder Ihre Systemkonfiguration konnte nicht gestartet werden.&lt;/p&gt;
@@ -5017,7 +5016,6 @@
 <translation id="8912793549644936705">Strecken</translation>
 <translation id="8915370057835397490">Vorschläge werden geladen</translation>
 <translation id="8916476537757519021">Inkognito-Subframe: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synchronisieren mit <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Werbung auf dieser Website immer zulassen</translation>
 <translation id="8925458182817574960">&amp;Einstellungen</translation>
 <translation id="8926389886865778422">Nicht mehr fragen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 44cc4ad..808e401 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1271,7 +1271,6 @@
 <translation id="2916073183900451334">Εάν πατήσετε το πλήκτρο Tab σε μια ιστοσελίδα, επισημαίνονται οι σύνδεσμοι, καθώς και τα πεδία φόρμας</translation>
 <translation id="2916745397441987255">Αναζήτηση επεκτάσεων</translation>
 <translation id="2921081876747860777">Δημιουργήστε έναν κωδικό πρόσβασης για να προστατεύσετε τα τοπικά δεδομένα σας.</translation>
-<translation id="2924395203970765374">Συγχρονισμένο με <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Υπολογιστικά φύλλα</translation>
 <translation id="2927017729816812676">Αποθηκευτικός χώρος κρυφής μνήμης</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (λογαριασμός για παιδιά)</translation>
@@ -1554,7 +1553,6 @@
 <translation id="3348459612390503954">Συγχαρητήρια</translation>
 <translation id="3349933790966648062">Αποτύπωμα μνήμης</translation>
 <translation id="3353984535370177728">Επιλέξτε έναν φάκελο για μεταφόρτωση</translation>
-<translation id="335581015389089642">Ομιλία</translation>
 <translation id="3355936511340229503">Σφάλμα σύνδεσης</translation>
 <translation id="3356797067524893661">Είστε έτοιμοι να συνεχίσετε στο Hangouts Meet</translation>
 <translation id="3358935496594837302">Δεν είναι δυνατή η εύρεση του τηλεφώνου σας. Βεβαιωθείτε ότι χρησιμοποιείτε συμβατό τηλέφωνο Android που είναι ενεργοποιημένο και διαθέσιμο. &lt;a&gt;Μάθετε περισσότερα&lt;/a&gt;</translation>
@@ -1731,7 +1729,6 @@
 <translation id="3613422051106148727">Άνοιγμα σε νέα καρτέ&amp;λα</translation>
 <translation id="3616113530831147358">Ήχος</translation>
 <translation id="3616741288025931835">&amp;Διαγραφή δεδομένων περιήγησης...</translation>
-<translation id="3618849550573277856">Αναζήτηση "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Δημιουργήθηκαν αντίγραφα ασφαλείας για όλα τα αρχεία!</translation>
 <translation id="3623574769078102674">Η διαχείριση αυτού του εποπτευόμενου χρήστη θα γίνεται από το χρήστη <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Τα στιγμιότυπα οθόνης απενεργοποιήθηκαν</translation>
@@ -2146,7 +2143,6 @@
 <translation id="428565720843367874">Η λειτουργία του λογισμικού προστασίας από ιούς απέτυχε μη αναμενόμενα κατά τη σάρωση αυτού του αρχείου.</translation>
 <translation id="428608937826130504">Στοιχείο ραφιού 8</translation>
 <translation id="4287502004382794929">Δεν διαθέτετε αρκετές άδειες λογισμικού για την εγγραφή αυτής της συσκευής. Επικοινωνήστε με το τμήμα πωλήσεων για να αγοράσετε περισσότερες. Εάν πιστεύετε ότι αυτό το μήνυμα εμφανίζεται κατά λάθος, επικοινωνήστε με την υποστήριξη πελατών.</translation>
-<translation id="4289300219472526559">Έναρξη ομιλίας</translation>
 <translation id="4289540628985791613">Επισκόπηση</translation>
 <translation id="4296575653627536209">Προσθήκη εποπτευόμενου χρήστη</translation>
 <translation id="4297322094678649474">Αλλαγή γλωσσών</translation>
@@ -2442,7 +2438,6 @@
 <translation id="4813512666221746211">Σφάλμα δικτύου</translation>
 <translation id="4816492930507672669">Προσαρμογή στη σελίδα</translation>
 <translation id="4820334425169212497">Όχι, δεν το βλέπω</translation>
-<translation id="4821725298388681253">Αυτή είναι μια πρόωρη κυκλοφορία. Ορισμένες λειτουργίες, όπως η αναζήτηση και η εισαγωγή κειμένου, δεν είναι ακόμη διαθέσιμες.</translation>
 <translation id="4821935166599369261">Ενεργοποιημένη &amp;δυνατότητα δημιουργίας προφίλ</translation>
 <translation id="4823484602432206655">Ανάγνωση και αλλαγή των ρυθμίσεων χρήστη και συσκευής</translation>
 <translation id="4823651846660089135">Η συσκευή είναι μόνο για ανάγνωση</translation>
@@ -3454,7 +3449,6 @@
 <translation id="6388771388956873507">Βρείτε τον αισθητήρα δακτυλικών αποτυπωμάτων στη συσκευή σας και αγγίξτε τον με το δάχτυλό σας</translation>
 <translation id="6390799748543157332">Οι σελίδες που βλέπετε σε αυτό το παράθυρο δεν θα εμφανίζεται στο ιστορικό του προγράμματος περιήγησης και δεν θα αφήνουν άλλα ίχνη, όπως cookie, στον υπολογιστή αφού κλείσετε όλα τα ανοιχτά παράθυρα Επισκέπτη. Ωστόσο, τυχόν αρχεία τα οποία έχετε κατεβάσει θα διατηρηθούν.</translation>
 <translation id="6395423953133416962">Αποστολή <ph name="BEGIN_LINK1" />πληροφοριών συστήματος<ph name="END_LINK1" /> και <ph name="BEGIN_LINK2" />μετρήσεων<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Διακοπή ομιλίας</translation>
 <translation id="6397592254427394018">Άνοιγμα όλων των σελιδοδεικτών σε παράθυρο για &amp;ανώνυμη περιήγηση</translation>
 <translation id="6398715114293939307">Κατάργηση Google Play Store</translation>
 <translation id="6398765197997659313">Έξοδος από πλήρη οθόνη</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Επέκταση</translation>
 <translation id="8915370057835397490">Φόρτωση πρότασης</translation>
 <translation id="8916476537757519021">Υποπλαίσιο ανώνυμης περιήγησης: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Συγχρονισμός με τον λογαριασμό <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Να επιτρέπονται πάντα οι διαφημίσεις σε αυτόν τον ιστότοπο</translation>
 <translation id="8925458182817574960">&amp;Ρυθμίσεις</translation>
 <translation id="8926389886865778422">Να μην ερωτηθώ ξανά</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index c715250..65b560e2 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Pressing Tab on a web page highlights links, as well as form fields</translation>
 <translation id="2916745397441987255">Search extensions</translation>
 <translation id="2921081876747860777">Please create a password to protect your local data.</translation>
-<translation id="2924395203970765374">Synced to <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Sheets</translation>
 <translation id="2927017729816812676">Cache Storage</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Account for kids)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Congratulations</translation>
 <translation id="3349933790966648062">Memory footprint</translation>
 <translation id="3353984535370177728">Select a folder to upload</translation>
-<translation id="335581015389089642">Speech</translation>
 <translation id="3355936511340229503">Connection error</translation>
 <translation id="3356797067524893661">You're all set to continue on to Hangouts Meet</translation>
 <translation id="3358935496594837302">Can’t find your phone. Make sure that you’re using a compatible Android phone that’s turned on and handy. &lt;a&gt;Learn more&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Open in new tab</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Clear Browsing Data...</translation>
-<translation id="3618849550573277856">Look Up “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">All backed up!</translation>
 <translation id="3623574769078102674">This supervised user will be managed by <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Screenshots disabled</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Anti-virus software failed unexpectedly while scanning this file.</translation>
 <translation id="428608937826130504">Shelf item 8</translation>
 <translation id="4287502004382794929">You do not have enough software licenses to enrol this device. Please contact sales to purchase more. If you believe you're seeing this message in error, please contact support.</translation>
-<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4289540628985791613">Overview</translation>
 <translation id="4296575653627536209">Add Supervised User</translation>
 <translation id="4297322094678649474">Change Languages</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Network error</translation>
 <translation id="4816492930507672669">Fit to page</translation>
 <translation id="4820334425169212497">No, I don't see it</translation>
-<translation id="4821725298388681253">This is an early release. Some features, like search and text entry, are not yet available.</translation>
 <translation id="4821935166599369261">&amp;Profiling Enabled</translation>
 <translation id="4823484602432206655">Read and change user and device settings</translation>
 <translation id="4823651846660089135">Device is read-only</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Find the fingerprint sensor on your device and touch it with your finger</translation>
 <translation id="6390799748543157332">Pages that you view in this window won’t appear in the browser history and they won’t leave other traces, like cookies, on the computer after you close all open Guest windows. Any files that you download, however, will be preserved.</translation>
 <translation id="6395423953133416962">Send <ph name="BEGIN_LINK1" />system information<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />metrics<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6397592254427394018">Open all bookmarks in &amp;Incognito window</translation>
 <translation id="6398715114293939307">Remove Google Play Store</translation>
 <translation id="6398765197997659313">Exit full screen</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Stretch</translation>
 <translation id="8915370057835397490">Loading suggestion</translation>
 <translation id="8916476537757519021">Incognito Subframe: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sync to <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Always allow ads on this site</translation>
 <translation id="8925458182817574960">&amp;Settings</translation>
 <translation id="8926389886865778422">Don't ask again</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index ca46e39..549f4b93 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -6,7 +6,7 @@
 <translation id="1005274289863221750">Usar tu micrófono y tu cámara</translation>
 <translation id="1007408791287232274">No se pueden cargar los dispositivos.</translation>
 <translation id="1008186147501209563">Exportar favoritos</translation>
-<translation id="1009147628737158130"><ph name="URL" /> quiere ver información de identificación sobre tu llave de seguridad</translation>
+<translation id="1009147628737158130"><ph name="URL" /> quiere ver la información de identificación sobre tu llave de seguridad</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{La página no responde.}other{Las páginas no responden.}}</translation>
 <translation id="1012794136286421601">Se están sincronizando tus archivos de Documentos de Google, Google Spreadsheets, Diapositivas de Google y Dibujos de Google. Abre la aplicación de Google Drive para acceder a ellos en línea o sin conexión.</translation>
 <translation id="1013707859758800957">Se permitió que un complemento no incluido en la zona de pruebas se ejecutara en la página.</translation>
@@ -546,7 +546,7 @@
 <translation id="1817310072033858383">Configurar Smart Lock para tu dispositivo <ph name="DEVICE_TYPE" /></translation>
 <translation id="1817871734039893258">Recuperación de archivos de Microsoft</translation>
 <translation id="1818007989243628752">Borrar la contraseña para <ph name="USERNAME" /></translation>
-<translation id="1819721979226826163">Presiona las notificaciones de apps &gt; Servicios de Google Play.</translation>
+<translation id="1819721979226826163">Presiona Notificaciones de apps &gt; Servicios de Google Play.</translation>
 <translation id="1826516787628120939">Comprobando</translation>
 <translation id="1828149253358786390"><ph name="SITE" /> quiere enviarte notificaciones.</translation>
 <translation id="1828378091493947763">Este complemento no es compatible con este dispositivo</translation>
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">Para administrar tus extensiones, haz clic en la opción Extensiones en el menú Herramientas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="236141728043665931">Bloquear siempre el acceso al micrófono</translation>
+<translation id="2365507699358342471">Este sitio puede ver el texto y las imágenes copiados en el portapapeles.</translation>
 <translation id="2367972762794486313">Mostrar aplicaciones</translation>
 <translation id="2371076942591664043">Abrir al &amp;finalizar</translation>
 <translation id="2377319039870049694">Cambiar a la vista de lista</translation>
@@ -1266,7 +1267,6 @@
 <translation id="2916073183900451334">Si presionas el tabulador en una página web, se resaltan los vínculos y los campos de formularios</translation>
 <translation id="2916745397441987255">Buscar extensiones</translation>
 <translation id="2921081876747860777">Crea una contraseña para proteger tus datos locales.</translation>
-<translation id="2924395203970765374">Se sincronizó con <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Hojas de cálculo de Google</translation>
 <translation id="2927017729816812676">Almacenamiento en caché</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (cuenta para niños)</translation>
@@ -1549,7 +1549,6 @@
 <translation id="3348459612390503954">Felicitaciones</translation>
 <translation id="3349933790966648062">Espacio en memoria</translation>
 <translation id="3353984535370177728">Seleccionar una carpeta para cargar</translation>
-<translation id="335581015389089642">Voz</translation>
 <translation id="3355936511340229503">Error de conexión</translation>
 <translation id="3356797067524893661">Todo listo para utilizar Meet de Hangouts</translation>
 <translation id="3358935496594837302">No se puede encontrar el teléfono. Asegúrate de que tienes un teléfono Android compatible, y que esté encendido y cerca. &lt;a&gt;Más información&lt;/a&gt;</translation>
@@ -1726,7 +1725,6 @@
 <translation id="3613422051106148727">&amp;Abrir en una pestaña nueva</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">Eliminar datos de navega&amp;ción...</translation>
-<translation id="3618849550573277856">Buscar "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Todos los archivos están guardados en una copia de seguridad.</translation>
 <translation id="3623574769078102674">Este usuario supervisado será administrado por <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Capturas de pantalla inhabilitadas</translation>
@@ -2141,7 +2139,6 @@
 <translation id="428565720843367874">Se produjo un error inesperado con el software antivirus al examinar este archivo.</translation>
 <translation id="428608937826130504">Elemento 8 de la biblioteca</translation>
 <translation id="4287502004382794929">No tienes suficientes licencias de software para inscribir este dispositivo. Comunícate con el departamento de ventas para adquirir más licencias. Si crees que este mensaje apareció por error, comunícate con un el servicio de ayuda.</translation>
-<translation id="4289300219472526559">Empezar a hablar</translation>
 <translation id="4289540628985791613">Descripción general</translation>
 <translation id="4296575653627536209">Agregar usuario supervisado</translation>
 <translation id="4297322094678649474">Cambiar idiomas</translation>
@@ -2402,6 +2399,7 @@
 <translation id="4748762018725435655">Requiere una extensión de Chrome Web Store</translation>
 <translation id="4750394297954878236">Sugerencias</translation>
 <translation id="475088594373173692">Primer usuario</translation>
+<translation id="4751476147751820511">Sensores de luz o movimiento</translation>
 <translation id="4756378406049221019">Detener/volver a cargar</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4759238208242260848">Descargas</translation>
@@ -2436,7 +2434,6 @@
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4816492930507672669">Ajustar a la página</translation>
 <translation id="4820334425169212497">No lo veo</translation>
-<translation id="4821725298388681253">Esta es una liberación anticipada. Algunas funciones, como la búsqueda y la entrada de texto, todavía no están disponibles.</translation>
 <translation id="4821935166599369261">&amp;Perfiles activados</translation>
 <translation id="4823484602432206655">Leer y cambiar la configuración del dispositivo y del usuario</translation>
 <translation id="4823651846660089135">El dispositivo es de solo lectura</translation>
@@ -3447,7 +3444,6 @@
 <translation id="6388771388956873507">Busca el sensor de huellas digitales en tu dispositivo y tócalo con el dedo</translation>
 <translation id="6390799748543157332">Las páginas a las que accedas desde esta ventana no aparecerán en el historial del navegador ni dejarán rastros (por ejemplo, cookies) en la computadora después de cerrar todas las ventanas abiertas de la sesión de invitado. Los archivos descargados permanecerán intactos.</translation>
 <translation id="6395423953133416962">Enviar <ph name="BEGIN_LINK1" />información del sistema<ph name="END_LINK1" /> y <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Dejar de hablar</translation>
 <translation id="6397592254427394018">Abrir todos los favoritos en una ventana de &amp;incógnito</translation>
 <translation id="6398715114293939307">Quitar Google Play Store</translation>
 <translation id="6398765197997659313">Salir de pantalla completa</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">Nombre de usuario o contraseña incorrectos o error de autenticación EAP</translation>
 <translation id="729761647156315797">Seleccionar tu idioma y teclado</translation>
 <translation id="7299337219131431707">Habilitar navegación para invitados</translation>
+<translation id="7303900363563182677">No se permite que este sitio vea el texto ni las imágenes copiados en el portapapeles</translation>
 <translation id="730515362922783851">Intercambiar datos con cualquier dispositivo de la red local o Internet</translation>
 <translation id="7308002049209013926">Usa Launcher para acceder a actividades y apps nuevas rápidamente. Presiona Alt + mayúscula + L para acceder.</translation>
 <translation id="7309257895202129721">Mostrar &amp;controles</translation>
@@ -4401,6 +4398,7 @@
 <translation id="7909969815743704077">Descargado en el modo de navegación de incógnito</translation>
 <translation id="7910768399700579500">&amp;Nueva carpeta</translation>
 <translation id="7912080627461681647">Se cambió la contraseña en el servidor. Sal de la cuenta y vuelve a acceder.</translation>
+<translation id="7912883689016444961">Configurar red móvil</translation>
 <translation id="7915471803647590281">Comunícanos lo que está pasando antes de enviarnos tus comentarios</translation>
 <translation id="7925247922861151263">Falló la verificación de AAA</translation>
 <translation id="7925285046818567682">Esperando <ph name="HOST_NAME" />...</translation>
@@ -4913,6 +4911,7 @@
 <translation id="8736288397686080465">Este sitio se actualizó en segundo plano.</translation>
 <translation id="8737685506611670901">Abrir vínculos de <ph name="PROTOCOL" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Pantalla en pantalla</translation>
 <translation id="8743864605301774756">Se actualizó hace 1 h</translation>
 <translation id="8749863574775030885">Acceder a dispositivos USB de un proveedor desconocido</translation>
 <translation id="8754200782896249056">&lt;p&gt;Al ejecutar <ph name="PRODUCT_NAME" /> en un entorno admitido de escritorio, se utiliza la configuración proxy del sistema. Sin embargo, o bien el sistema no es admitido, o hubo un problema al lanzar la configuración del sistema.&lt;/p&gt;
@@ -5015,7 +5014,6 @@
 <translation id="8912793549644936705">Expandir</translation>
 <translation id="8915370057835397490">Cargando sugerencia</translation>
 <translation id="8916476537757519021">Submarco incógnito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizar con <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Permite mostrar anuncios en este sitio</translation>
 <translation id="8925458182817574960">&amp;Configuración</translation>
 <translation id="8926389886865778422">No volver a preguntar</translation>
@@ -5044,7 +5042,7 @@
 <translation id="8962083179518285172">Ocultar detalles</translation>
 <translation id="8965037249707889821">Ingresa la contraseña anterior.</translation>
 <translation id="8965697826696209160">No hay suficiente espacio.</translation>
-<translation id="8967866634928501045">Presionar Alt+mayúscula+A para mostrar</translation>
+<translation id="8967866634928501045">Presiona Alt+mayúscula+A para mostrar</translation>
 <translation id="8970203673128054105">Ver la lista de modos de transmisión</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8973557916016709913">Quitar el nivel de zoom</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index abb794b..15d8cefa 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -549,7 +549,7 @@
 <translation id="1817310072033858383">Configurar Smart Lock para tu <ph name="DEVICE_TYPE" /></translation>
 <translation id="1817871734039893258">Recuperación de archivos de Microsoft</translation>
 <translation id="1818007989243628752">Eliminar la contraseña de <ph name="USERNAME" /></translation>
-<translation id="1819721979226826163">Toca Notificaciones de aplicaciones &gt; Servicios de Google Play</translation>
+<translation id="1819721979226826163">Toca Notificaciones de aplicaciones &gt; Servicios de Google Play.</translation>
 <translation id="1826516787628120939">Comprobando</translation>
 <translation id="1828149253358786390"><ph name="SITE" /> quiere enviarte notificaciones.</translation>
 <translation id="1828378091493947763">Este complemento no se admite en este dispositivo</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Para administrar tus extensiones, haz clic en la opción Extensiones del menú Herramientas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="236141728043665931">Bloquear siempre el acceso al micrófono</translation>
+<translation id="2365507699358342471">Este sitio web puede ver el texto y las imágenes que se hayan copiado en el portapapeles.</translation>
 <translation id="2367972762794486313">Mostrar aplicaciones</translation>
 <translation id="2371076942591664043">Abrir al &amp;finalizar</translation>
 <translation id="2377319039870049694">Cambiar a vista de lista</translation>
@@ -1271,7 +1272,6 @@
 <translation id="2916073183900451334">El tabulador permite destacar los enlaces de una página web, así como los campos de formulario.</translation>
 <translation id="2916745397441987255">Buscar extensiones</translation>
 <translation id="2921081876747860777">Crea una contraseña para proteger tus datos locales</translation>
-<translation id="2924395203970765374">Sincronizado con <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Hojas de cálculo de Google</translation>
 <translation id="2927017729816812676">Almacenamiento en caché</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (cuenta infantil)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">¡Enhorabuena!</translation>
 <translation id="3349933790966648062">Uso de memoria</translation>
 <translation id="3353984535370177728">Seleccionar una carpeta para subirla</translation>
-<translation id="335581015389089642">Voz</translation>
 <translation id="3355936511340229503">Error de conexión</translation>
 <translation id="3356797067524893661">Ya puedes utilizar Hangouts Meet</translation>
 <translation id="3358935496594837302">No se encuentra tu teléfono. Asegúrate de que estás utilizando un teléfono Android compatible que esté encendido y que tengas cerca. &lt;a&gt;Más información&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Abrir en una pestaña nueva</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Borrar datos de navegación...</translation>
-<translation id="3618849550573277856">Buscar <ph name="LOOKUP_STRING" /></translation>
 <translation id="3620292326130836921">Se ha realizado la copia de seguridad de todos los archivos</translation>
 <translation id="3623574769078102674">Este usuario supervisado será administrado por <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Capturas de pantalla inhabilitadas</translation>
@@ -2138,12 +2136,11 @@
 <translation id="4281844954008187215">Condiciones del servicio</translation>
 <translation id="4282196459431406533">Smart Lock está activado</translation>
 <translation id="4284105660453474798">¿Seguro que quieres eliminar "$1"?</translation>
-<translation id="4285418559658561636">Actualizar contraseña</translation>
+<translation id="4285418559658561636">Actualizar Contraseña</translation>
 <translation id="4285498937028063278">No fijar</translation>
 <translation id="428565720843367874">Se ha producido un error inesperado del programa antivirus al analizar este archivo.</translation>
 <translation id="428608937826130504">Elemento 8 de la estantería</translation>
 <translation id="4287502004382794929">No tienes las licencias de software necesarias para registrar este dispositivo. Ponte en contacto con el departamento de ventas para comprar más licencias. Si crees que este mensaje ha aparecido por error, ponte en contacto con el servicio de asistencia.</translation>
-<translation id="4289300219472526559">Empezar a hablar</translation>
 <translation id="4289540628985791613">Descripción general</translation>
 <translation id="4296575653627536209">Añadir usuario supervisado</translation>
 <translation id="4297322094678649474">Cambiar idiomas</translation>
@@ -2404,6 +2401,7 @@
 <translation id="4748762018725435655">Se necesita una extensión de Chrome Web Store</translation>
 <translation id="4750394297954878236">Sugerencias</translation>
 <translation id="475088594373173692">Primer usuario</translation>
+<translation id="4751476147751820511">Sensores de luz o movimiento</translation>
 <translation id="4756378406049221019">Detener/Volver a cargar</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4759238208242260848">Descargas</translation>
@@ -2438,7 +2436,6 @@
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4816492930507672669">Ajustar a página</translation>
 <translation id="4820334425169212497">No, no lo veo</translation>
-<translation id="4821725298388681253">Esta es una primera versión. Algunas funciones, como la búsqueda y la entrada de texto, aún no están disponibles.</translation>
 <translation id="4821935166599369261">Perfiles &amp;habilitados</translation>
 <translation id="4823484602432206655">Leer y cambiar la configuración del dispositivo y del usuario</translation>
 <translation id="4823651846660089135">El dispositivo es de solo lectura</translation>
@@ -3448,7 +3445,6 @@
 <translation id="6388771388956873507">Busca el sensor de huellas digitales del dispositivo y tócalo con el dedo</translation>
 <translation id="6390799748543157332">Las páginas que aparezcan en esta ventana no se mostrarán en el historial del navegador y no dejarán otros rastros como cookies en el ordenador después de cerrar todas las ventanas abiertas de la sesión de invitado. No obstante, se conservará cualquier archivo que descargues.</translation>
 <translation id="6395423953133416962">Enviar <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /> e <ph name="BEGIN_LINK1" />información del sistema<ph name="END_LINK1" /></translation>
-<translation id="6397363302884558537">Dejar de hablar</translation>
 <translation id="6397592254427394018">Abrir todos los marcadores en una ventana de &amp;incógnito</translation>
 <translation id="6398715114293939307">Quitar Google Play Store</translation>
 <translation id="6398765197997659313">Salir del modo de pantalla completa</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">Nombre de usuario o contraseña incorrectos o error de autenticación EAP</translation>
 <translation id="729761647156315797">Seleccionar idioma y teclado</translation>
 <translation id="7299337219131431707">Habilitar navegación como invitado</translation>
+<translation id="7303900363563182677">No se permite que este sitio web vea el texto y las imágenes que se hayan copiado en el portapapeles</translation>
 <translation id="730515362922783851">Intercambiar datos con cualquier dispositivo en la red local o Internet</translation>
 <translation id="7308002049209013926">Utiliza el menú de aplicaciones para acceder rápidamente a aplicaciones y actividades nuevas. Para acceder al menú con el teclado, pulsa Alt + Mayús + L.</translation>
 <translation id="7309257895202129721">Mostrar &amp;controles</translation>
@@ -4400,6 +4397,7 @@
 <translation id="7909969815743704077">Se ha descargado en modo incógnito</translation>
 <translation id="7910768399700579500">&amp;Nueva carpeta</translation>
 <translation id="7912080627461681647">Tu contraseña se ha cambiado en el servidor. Cierra la sesión y vuelve a iniciarla.</translation>
+<translation id="7912883689016444961">Configurar red móvil</translation>
 <translation id="7915471803647590281">Debes describir el error.</translation>
 <translation id="7925247922861151263">Error de comprobación de AAA</translation>
 <translation id="7925285046818567682">Esperando a <ph name="HOST_NAME" />...</translation>
@@ -4911,6 +4909,7 @@
 <translation id="8736288397686080465">Este sitio se ha actualizado en segundo plano.</translation>
 <translation id="8737685506611670901">Abrir enlaces de <ph name="PROTOCOL" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8743864605301774756">Actualizada hace 1 hora</translation>
 <translation id="8749863574775030885">Acceder a dispositivos USB desde un proveedor desconocido</translation>
 <translation id="8754200782896249056">&lt;p&gt;Al ejecutar <ph name="PRODUCT_NAME" /> en un entorno de escritorio compatible, se utilizará la configuración de proxy del sistema. Sin embargo, tu sistema no es compatible o ha habido algún problema al iniciar la configuración del sistema.&lt;/p&gt;
@@ -5013,7 +5012,6 @@
 <translation id="8912793549644936705">Expandir</translation>
 <translation id="8915370057835397490">Cargando sugerencia</translation>
 <translation id="8916476537757519021">Submarco incógnito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizar con <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Permite los anuncios siempre en este sitio web</translation>
 <translation id="8925458182817574960">&amp;Configuración</translation>
 <translation id="8926389886865778422">No preguntar de nuevo</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 3829ed0..dbeefb56 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -436,7 +436,7 @@
     <ph name="BEGIN_BOLD" />lubada või keelata<ph name="END_BOLD" /> teatud veebisaidid;
     <ph name="BEGIN_BOLD" />vaadata üle<ph name="END_BOLD" />, mida jälgitav kasutaja on külastanud ja
     <ph name="BEGIN_BOLD" />hallata<ph name="END_BOLD" /> muid seadeid.</translation>
-<translation id="1648528859488547844">Asukoha määramine WiFi- või mobiilsidevõrgu kaudu</translation>
+<translation id="1648528859488547844">Asukoha määramine WiFi- või mobiilsidevõrgu abil</translation>
 <translation id="1648943974594387137">Sisselogimisandmed on aegunud</translation>
 <translation id="1650371550981945235">Kuva sisestusvalikud</translation>
 <translation id="1650709179466243265">Lisab www. ja .com-i ning avab aadressi</translation>
@@ -783,7 +783,7 @@
 <translation id="2215277870964745766">Tere tulemast! Määrake kasutatav keel ja võrk</translation>
 <translation id="2217501013957346740">Nime loomine –</translation>
 <translation id="2218019600945559112">Hiir ja puuteplaat</translation>
-<translation id="2218320521449013367">Chrome'is ilmnes ohtliku tarkvara eemaldamisel viga.</translation>
+<translation id="2218320521449013367">Chrome'is ilmnes ohtliku tarkvara eemaldamisel viga</translation>
 <translation id="2218515861914035131">Kleebib lihttekstina</translation>
 <translation id="221872881068107022">Tagurpidi kerimine</translation>
 <translation id="2218947405056773815">Neetud! <ph name="API_NAME" /> komistas probleemi otsa.</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Laienduste haldamiseks klõpsake menüüs Tööriistad valikul Laiendused.</translation>
 <translation id="2359808026110333948">Jätka</translation>
 <translation id="236141728043665931">Blokeeri alati juurdepääs mikrofonile</translation>
+<translation id="2365507699358342471">See sait näeb lõikelauale kopeeritud teksti ja kujutisi.</translation>
 <translation id="2367972762794486313">Rakenduste kuvamine</translation>
 <translation id="2371076942591664043">Ava, kui on &amp;valmis</translation>
 <translation id="2377319039870049694">Lülita loendivaatele</translation>
@@ -1234,7 +1235,7 @@
 <translation id="2871813825302180988">Konto on selles seadmes juba kasutusel.</translation>
 <translation id="2872353916818027657">Peamise kuvari vahetamine</translation>
 <translation id="287286579981869940">Lisa <ph name="PROVIDER_NAME" />...</translation>
-<translation id="2874343608108773609">Selleks et hankida seaded kõikidesse oma seadmetesse, logige Chrome'i sisse.</translation>
+<translation id="2874343608108773609">Selleks et hankida paroolid kõikidesse oma seadmetesse, logige Chrome'i sisse.</translation>
 <translation id="2875698561019555027">(Chrome'i vealehed)</translation>
 <translation id="288042212351694283">Juurdepääs teie Universal 2nd Factori seadmetele</translation>
 <translation id="2881966438216424900">Viimati kasutatud:</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">Veebilehel tabeldusklahvi vajutades tõstetakse esile lingid ja ka vormiväljad</translation>
 <translation id="2916745397441987255">Otsige laiendusi</translation>
 <translation id="2921081876747860777">Looge parool, et oma kohalikke andmeid kaitsta.</translation>
-<translation id="2924395203970765374">Sünkroonitud kasutajaga <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Arvutustabelid</translation>
 <translation id="2927017729816812676">Vahemälu</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (lastekonto)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">Õnnitleme!</translation>
 <translation id="3349933790966648062">Mälu jalajälg</translation>
 <translation id="3353984535370177728">Valige kaust üleslaadimiseks</translation>
-<translation id="335581015389089642">Kõne</translation>
 <translation id="3355936511340229503">Ühenduse viga</translation>
 <translation id="3356797067524893661">Teil on rakendusega Hangouts Meet jätkamiseks kõik valmis</translation>
 <translation id="3358935496594837302">Teie telefoni ei õnnestu leida. Veenduge, et kasutaksite ühilduvat Android-telefoni, mis on sisse lülitatud ja käepärast. &lt;a&gt;Lisateave&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Ava uuel vahelehel</translation>
 <translation id="3616113530831147358">Heli</translation>
 <translation id="3616741288025931835">Kustuta sirvi&amp;mise andmed...</translation>
-<translation id="3618849550573277856">Otsi terminit „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Kõik on varundatud.</translation>
 <translation id="3623574769078102674">Seda valvatavat kasutajat haldab <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Ekraanipildid on keelatud</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">Viirusetõrjetarkvara ebaõnnestus selle faili skannimisel ootamatult.</translation>
 <translation id="428608937826130504">Riiuliüksus 8</translation>
 <translation id="4287502004382794929">Teil ei ole piisavalt tarkvaralitsentse selle seadme registreerimiseks. Täiendavate ostmiseks võtke ühendust müügiosakonnaga. Kui arvate, et saite selle teate ekslikult, võtke ühendust toega.</translation>
-<translation id="4289300219472526559">Alusta rääkimist</translation>
 <translation id="4289540628985791613">Ülevaade</translation>
 <translation id="4296575653627536209">Jälgitava kasutaja lisamine</translation>
 <translation id="4297322094678649474">Keelte vahetamine</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Vaja on Chrome'i veebipoest pärinevat laiendust</translation>
 <translation id="4750394297954878236">Soovitused</translation>
 <translation id="475088594373173692">Esimene kasutaja</translation>
+<translation id="4751476147751820511">Liikumis- või valgusandurid</translation>
 <translation id="4756378406049221019">Peata / laadi uuesti</translation>
 <translation id="4756388243121344051">&amp;Ajalugu</translation>
 <translation id="4759238208242260848">Allalaadimised</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Võrgu viga</translation>
 <translation id="4816492930507672669">Sobita lehele</translation>
 <translation id="4820334425169212497">Ei, ma ei näe seda</translation>
-<translation id="4821725298388681253">See on varajane versioon. Mõned funktsioonid, nt otsing või teksti sisestamine, pole veel saadaval.</translation>
 <translation id="4821935166599369261">&amp;Profileerimine lubatud</translation>
 <translation id="4823484602432206655">Loe ja muuda kasutaja ja seadme seadeid</translation>
 <translation id="4823651846660089135">Seade on kirjutuskaitstud</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">Leidke seadmel olev sõrmejäljeandur ja puudutage seda sõrmega</translation>
 <translation id="6390799748543157332">Lehti, mida vaatate selles aknas, ei lisata teie brauseri ajalukku ja pärast kõikide avatud külalise režiimi akende sulgemist ei jää neist arvutisse ka muid jälgi (nt küpsiseid). Kõik allalaaditud failid siiski säilitatakse.</translation>
 <translation id="6395423953133416962">Saada <ph name="BEGIN_LINK1" />süsteemiteave<ph name="END_LINK1" /> ja <ph name="BEGIN_LINK2" />mõõdikud<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Lõpeta rääkimine</translation>
 <translation id="6397592254427394018">Ava kõik järjehoidjad &amp;inkognito aknas</translation>
 <translation id="6398715114293939307">Google Play poe eemaldamine</translation>
 <translation id="6398765197997659313">Välju täisekraanilt</translation>
@@ -4023,6 +4019,7 @@
 <translation id="7297443947353982503">Kasutajanimi/parool on vale või EAP-autentimine ebaõnnestus</translation>
 <translation id="729761647156315797">Keele ja klaviatuuri valimine</translation>
 <translation id="7299337219131431707">Luba külalisena sirvimine</translation>
+<translation id="7303900363563182677">Selle saidi jaoks blokeeriti lõikelauale kopeeritud teksti ja kujutiste nägemine</translation>
 <translation id="730515362922783851">Vaheta andmeid mis tahes seadmega kohalikus võrgus või Internetis</translation>
 <translation id="7308002049209013926">Kasutage käivitusprogrammi, et kiirelt uute rakenduste ja tegevuste juurde liikuda. Klaviatuuri abil siia liikumiseks vajutage klahvikombinatsiooni Alt + Tõstuklahv + L.</translation>
 <translation id="7309257895202129721">Kuva &amp;juhtelemendid</translation>
@@ -4404,6 +4401,7 @@
 <translation id="7909969815743704077">Alla laaditud inkognito režiimis</translation>
 <translation id="7910768399700579500">&amp;Uus kaust</translation>
 <translation id="7912080627461681647">Teie parool serveris on muutunud. Logige välja ja seejärel uuesti sisse.</translation>
+<translation id="7912883689016444961">Seadista mobiilsidevõrk</translation>
 <translation id="7915471803647590281">Teatage meile enne tagasiside saatmist, mis toimub.</translation>
 <translation id="7925247922861151263">AAA kontrollimine nurjus</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> vastuse ootel...</translation>
@@ -4470,7 +4468,7 @@
 <translation id="8005600846065423578">Luba hostil <ph name="HOST" /> alati lõikelauda näha</translation>
 <translation id="8008356846765065031">Interneti-ühendus puudub. Kontrollige Interneti-ühendust.</translation>
 <translation id="8008818777654712271">Saada automaatselt teatud süsteemiteavet ja lehesisu Google'ile, et aidata tuvastada ohtlikke rakendusi ning saite</translation>
-<translation id="8009225694047762179">Paroolide haldamine</translation>
+<translation id="8009225694047762179">Halda paroole</translation>
 <translation id="8012382203418782830">See leht on tõlgitud.</translation>
 <translation id="8014154204619229810">Värskendaja töötab praegu. Värskendage uuesti kontrollimiseks minuti pärast.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> ei saa varem installitud versiooni ennistada. Proovige uuesti, rakendades oma seadmele funktsiooni Powerwash.</translation>
@@ -4916,6 +4914,7 @@
 <translation id="8736288397686080465">Saiti värskendati taustal.</translation>
 <translation id="8737685506611670901">Ava protokolli <ph name="PROTOCOL" /> lingid teenuse <ph name="REPLACED_HANDLER_TITLE" /> asemel</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Pilt pildis</translation>
 <translation id="8743864605301774756">Värskendatud 1 tund tagasi</translation>
 <translation id="8749863574775030885">Juurdepääs tundmatu müüja USB-seadmetele</translation>
 <translation id="8754200782896249056">&lt;p&gt;Kui toodet <ph name="PRODUCT_NAME" /> käitatakse toetatud töölaua keskkonnas, kasutatakse süsteemi puhverserveri seadeid. Kuid teie süsteemi ei toetata või tekkis probleem süsteemi konfiguratsiooni käivitamisel.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Venitatud</translation>
 <translation id="8915370057835397490">Soovituste laadimine</translation>
 <translation id="8916476537757519021">Inkognito alamraam: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sünkrooni kontoga <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Luba sellel saidil alati reklaamid</translation>
 <translation id="8925458182817574960">&amp;Seaded</translation>
 <translation id="8926389886865778422">Ära enam küsi</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index b01e362..ad722eb 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1266,7 +1266,6 @@
 <translation id="2916073183900451334">‏فشار دادن Tab در صفحهٔ وب، پیوندها و قسمت‌های فرم را برجسته می‌کند</translation>
 <translation id="2916745397441987255">جستجوی افزونه‌ها</translation>
 <translation id="2921081876747860777">لطفاً برای محافظت از داده محلی گذرواژه‌ای ایجاد کنید.</translation>
-<translation id="2924395203970765374">با <ph name="FULL_NAME" /> همگام‌سازی شد</translation>
 <translation id="2925966894897775835">صفحات</translation>
 <translation id="2927017729816812676">فضای حافظه پنهان</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (حسابی مخصوص بچه‌ها)</translation>
@@ -1549,7 +1548,6 @@
 <translation id="3348459612390503954">تبریک می‌گوییم</translation>
 <translation id="3349933790966648062">مصرف حافظه</translation>
 <translation id="3353984535370177728">انتخاب یک پوشه برای بارگذاری</translation>
-<translation id="335581015389089642">صدا</translation>
 <translation id="3355936511340229503">خطای اتصال</translation>
 <translation id="3356797067524893661">‏برای ادامه و رفتن به Hangouts Meet آماده‌اید</translation>
 <translation id="3358935496594837302">‏تلفنتان پیدا نمی‌شود. مطمئن شوید از تلفن Android سازگاری استفاده می‌کنید که روشن و در دسترس است. &lt;a&gt;بیشتر بدانید&lt;/a&gt;</translation>
@@ -1726,7 +1724,6 @@
 <translation id="3613422051106148727">باز &amp;کردن در برگهٔ جدید</translation>
 <translation id="3616113530831147358">صوتی</translation>
 <translation id="3616741288025931835">&amp;پاک کردن داده‌های مرور...</translation>
-<translation id="3618849550573277856">جستجوی «<ph name="LOOKUP_STRING" />»</translation>
 <translation id="3620292326130836921">همه پشتیبان‌گیری شدند.</translation>
 <translation id="3623574769078102674"><ph name="MANAGER_EMAIL" />، این کاربر نظارت‌شده را مدیریت خواهد کرد.</translation>
 <translation id="3625258641415618104">عکس از صفحه‌نمایش غیرفعال است</translation>
@@ -2141,7 +2138,6 @@
 <translation id="428565720843367874">نرم‌افزار آنتی‌ویروس به‌طور غیرمنتظره‌ای در هنگام اسکن کردن این فایل متوقف شد.</translation>
 <translation id="428608937826130504">مورد ۸ قفسه</translation>
 <translation id="4287502004382794929">به اندازه‌ کافی مجوز نرم‌افزار برای ثبت‌نام این دستگاه ندارید. لطفاً با مرکز فروش برای خرید بیشتر تماس بگیرید. اگر اعتقاد دارید که این پیام به اشتباه برای شما نشان داده شده است، لطفاً با مرکز پشتیبانی تماس بگیرید.</translation>
-<translation id="4289300219472526559">شروع صحبت</translation>
 <translation id="4289540628985791613">مرور کلی</translation>
 <translation id="4296575653627536209">افزودن کاربر تحت نظارت</translation>
 <translation id="4297322094678649474">تغییر زبان‌ها</translation>
@@ -2437,7 +2433,6 @@
 <translation id="4813512666221746211">خطای شبکه</translation>
 <translation id="4816492930507672669">متناسب با صفحه</translation>
 <translation id="4820334425169212497">نه، آن را نمی‌بینم</translation>
-<translation id="4821725298388681253">این یک نسخه اولیه است. بعضی از قابلیت‌ها (مانند جستجو و ورود متن) هنوز دردسترس نیستند.</translation>
 <translation id="4821935166599369261">&amp;ایجاد نمایه فعال شد</translation>
 <translation id="4823484602432206655">تغییر و خواندن تنظیمات کاربر و دستگاه</translation>
 <translation id="4823651846660089135">دستگاه فقط خواندنی است</translation>
@@ -3448,7 +3443,6 @@
 <translation id="6388771388956873507">حسگر اثر انگشت را در دستگاهتان پیدا کنید و آن را با انگشتتان لمس کنید</translation>
 <translation id="6390799748543157332">صفحاتی که در این پنجره مشاهده می‌کنید در سابقه مرورگر نشان داده نمی‌شوند و بعد از بسته شدن همه پنجره‌های مهمان باز، هیچ رد دیگری (مانند کوکی) در رایانه از خود به جای نمی‌گذارند. با این وجود، فایل‌هایی که بارگیری می‌کنید، حفظ می‌شوند.</translation>
 <translation id="6395423953133416962">ارسال <ph name="BEGIN_LINK1" />اطلاعات سیستم<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />معیارها<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">توقف صحبت</translation>
 <translation id="6397592254427394018">باز کردن همه نشانک‌ها در پنجره &amp;ناشناس</translation>
 <translation id="6398715114293939307">‏برداشتن «فروشگاه Google Play»</translation>
 <translation id="6398765197997659313">خروج از حالت تمام صفحه</translation>
@@ -5019,7 +5013,6 @@
 <translation id="8912793549644936705">گسترده کردن</translation>
 <translation id="8915370057835397490">در حال بارگیری پیشنهادات</translation>
 <translation id="8916476537757519021">قاب فرعی ناشناس: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">همگام‌سازی با <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">آگهی‌ها همیشه در این سایت مجاز باشند</translation>
 <translation id="8925458182817574960">&amp;تنظیمات</translation>
 <translation id="8926389886865778422">دوباره سؤال نشود</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 4b97889..74cef421 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -588,7 +588,7 @@
 <translation id="1878524442024357078">Älä anna sivustojen käyttää tietokonettasi laajennuksen avulla</translation>
 <translation id="1879449842763884566">Asenna Sovellukset-kansioon…</translation>
 <translation id="1880905663253319515">Poistetaanko varmenne <ph name="CERTIFICATE_NAME" />?</translation>
-<translation id="188190999506226223">Haluatko, että <ph name="PASSWORD_MANAGER_BRAND" /> tallentaa salasanasi sivustolle <ph name="ORIGIN" />?</translation>
+<translation id="188190999506226223">Haluatko, että <ph name="PASSWORD_MANAGER_BRAND" /> tallentaa <ph name="ORIGIN" />-salasanasi?</translation>
 <translation id="1886996562706621347">Anna sivustojen ehdottaa protokollien oletuskäsittelypalveluiden määrittämistä (suositus)</translation>
 <translation id="1887442540531652736">Sisäänkirjautumisvirhe</translation>
 <translation id="1887850431809612466">Laitteistoversio</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Hallinnoi laajennuksiasi valitsemalla Työkalut-valikosta Laajennukset.</translation>
 <translation id="2359808026110333948">Jatka</translation>
 <translation id="236141728043665931">Estä aina mikrofonin käyttö</translation>
+<translation id="2365507699358342471">Tämä sivu näkee leikepöydälle kopioidun tekstin ja kuvat.</translation>
 <translation id="2367972762794486313">Näytä sovellukset</translation>
 <translation id="2371076942591664043">Avaa, kun val&amp;mis</translation>
 <translation id="2377319039870049694">Vaihda luettelonäkymään</translation>
@@ -1149,7 +1150,7 @@
 <translation id="2762441749940182211">Kamera estetty</translation>
 <translation id="2765217105034171413">Pieni</translation>
 <translation id="2766006623206032690">&amp;Liitä ja avaa</translation>
-<translation id="2767084307624729667">Kohteen <ph name="ORIGIN" /> tallennetut salasanat</translation>
+<translation id="2767084307624729667">Tallennetut salasanat: <ph name="ORIGIN" /></translation>
 <translation id="276969039800130567">Kirjautunut osoitteella <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="2770465223704140727">Poista luettelosta</translation>
 <translation id="2770690685823456775">Vie salasanasi toiseen kansioon</translation>
@@ -1235,7 +1236,7 @@
 <translation id="2871813825302180988">Tämä tili on jo käytössä tässä laitteessa.</translation>
 <translation id="2872353916818027657">Vaihda ensisijainen näyttö</translation>
 <translation id="287286579981869940">Lisää <ph name="PROVIDER_NAME" />…</translation>
-<translation id="2874343608108773609">Kirjaudu sisään Chromeen, niin voit käyttää salasanojasi kaikilla laitteillasi.</translation>
+<translation id="2874343608108773609">Kirjaudu sisään Chromeen, niin voit käyttää salasanojasi kaikilla laitteilla.</translation>
 <translation id="2875698561019555027">(Chromen virhesivut)</translation>
 <translation id="288042212351694283">Käytä Universal 2nd Factor -laitteita</translation>
 <translation id="2881966438216424900">Viimeksi käytetty:</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">Sarkaimen painaminen verkkosivulla korostaa linkit ja lomakekentät</translation>
 <translation id="2916745397441987255">Hae laajennuksia</translation>
 <translation id="2921081876747860777">Suojaa paikalliset tiedot luomalla salasana</translation>
-<translation id="2924395203970765374">Synkronoitu tiliin <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Taulukot</translation>
 <translation id="2927017729816812676">Välimuistin tallennustila</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (lapsen tili)</translation>
@@ -1439,7 +1439,7 @@
 <translation id="316307797510303346">Hallinnoi ja tarkastele tämän henkilön verkkosivustovierailuja osoitteesta <ph name="CUSTODIAN_EMAIL" />.
   Tilisi kirjautumistiedot ovat vanhentuneet.</translation>
 <translation id="3165390001037658081">Jotkin operaattorit saattavat estää tämän ominaisuuden.</translation>
-<translation id="316854673539778496">Kirjaudu sisään ja ota synkronointi käyttöön, niin voit käyttää laajennuksiasi kaikilla laitteillasi.</translation>
+<translation id="316854673539778496">Kirjaudu sisään ja ota synkronointi käyttöön, niin voit käyttää laajennuksiasi kaikilla laitteilla.</translation>
 <translation id="3170072451822350649">Voit myös ohittaa sisäänkirjautumisen ja <ph name="LINK_START" />selata vierailijana<ph name="LINK_END" />.</translation>
 <translation id="3177048931975664371">Piilota salasana klikkaamalla</translation>
 <translation id="3177857336576585529"><ph name="SITE_NAME" /> pyytää käyttöoikeutta.</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">Onnittelut</translation>
 <translation id="3349933790966648062">Käytetty muisti</translation>
 <translation id="3353984535370177728">Valitse lähetettävä kansio</translation>
-<translation id="335581015389089642">Puhe</translation>
 <translation id="3355936511340229503">Yhteysvirhe</translation>
 <translation id="3356797067524893661">Olet valmis jatkamaan Hangouts Meetiin</translation>
 <translation id="3358935496594837302">Puhelintasi ei löydy. Varmista, että käytät yhteensopivaa Android-laitetta ja että se on käden ulottuvilla. &lt;a&gt;Lisätietoja&lt;/a&gt;</translation>
@@ -1578,7 +1577,7 @@
 <translation id="3396331542604645348">Valittu tulostin ei ole käytettävissä tai oikein asennettu. Varmista, että tulostin on kunnossa, tai valitse toinen tulostin.</translation>
 <translation id="3399432415385675819">Ilmoitukset poistetaan käytöstä.</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
-<translation id="3404065873681873169">Tälle sivustolle ei ole tallennettu salasanoja</translation>
+<translation id="3404065873681873169">Tämän sivuston salasanoja ei ole tallennettu</translation>
 <translation id="340485819826776184">Käytä ennakointipalvelua hakujen täydentämiseen ja URL-osoitteiden kirjoittamiseen osoitepalkkiin</translation>
 <translation id="3405664148539009465">Muokkaa kirjasimia</translation>
 <translation id="3405763860805964263">…</translation>
@@ -1589,7 +1588,7 @@
 <translation id="3414952576877147120">Koko:</translation>
 <translation id="3420980393175304359">Vaihda henkilö</translation>
 <translation id="3421387094817716717">Julkinen avain: elliptinen käyrä</translation>
-<translation id="3423463006624419153">Kohteessa <ph name="PHONE_NAME_1" /> ja <ph name="PHONE_NAME_2" />:</translation>
+<translation id="3423463006624419153"><ph name="PHONE_NAME_1" /> ja <ph name="PHONE_NAME_2" />:</translation>
 <translation id="342383653005737728">Omistaja voi lähettää tätä laitetta koskevia diagnostiikka- ja käyttötietoja Googlelle. Voit tarkastella tätä <ph name="BEGIN_LINK1" />asetusta<ph name="END_LINK1" /> täällä. <ph name="BEGIN_LINK2" />Lisätietoja<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918">Käynnistä <ph name="PRODUCT_NAME" /> uudelleen</translation>
 <translation id="3424969259347320884">Kerro, mitä olit tekemässä juuri ennen kaatumista</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">Avaa uudessa välilehdessä</translation>
 <translation id="3616113530831147358">Ääni</translation>
 <translation id="3616741288025931835">&amp;Poista selaustiedot...</translation>
-<translation id="3618849550573277856">Hae ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Kaikki on varmuuskopioitu!</translation>
 <translation id="3623574769078102674">Tätä valvottua käyttäjää hallinnoi <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Kuvakaappaukset poissa käytöstä</translation>
@@ -1765,7 +1763,7 @@
 <translation id="3665842570601375360">Turvallisuus:</translation>
 <translation id="3668570675727296296">Kieliasetukset</translation>
 <translation id="3668823961463113931">Käsittelypalvelut</translation>
-<translation id="3669030672519623291">Tälle sivustolle ei ole tallennettu salasanoja</translation>
+<translation id="3669030672519623291">Tämän sivuston salasanoja ei ole tallennettu</translation>
 <translation id="3670229581627177274">Ota Bluetooth käyttöön</translation>
 <translation id="3672681487849735243">Tehdasvirhe on havaittu</translation>
 <translation id="367645871420407123">Jätä tyhjäksi, jos haluat asettaa pääkäyttäjän salasanaksi oletustestikuvan arvon.</translation>
@@ -2137,12 +2135,11 @@
 <translation id="4281844954008187215">Käyttöehdot</translation>
 <translation id="4282196459431406533">Smart Lock on käytössä.</translation>
 <translation id="4284105660453474798">Haluatko varmasti poistaa kohteen $1?</translation>
-<translation id="4285418559658561636">Päivitä salasana</translation>
+<translation id="4285418559658561636">Päivitä Salasana</translation>
 <translation id="4285498937028063278">Irrota</translation>
 <translation id="428565720843367874">Viruksentorjuntaohjelma ei pystynyt tarkistamaan tätä tiedostoa.</translation>
 <translation id="428608937826130504">Hyllyn kohde 8</translation>
 <translation id="4287502004382794929">Sinulla ei ole tarpeeksi ohjelmistokäyttölupia ottaaksesi tämän laitteen käyttöön. Osta lisää käyttölupia ottamalla yhteyttä myyntiin. Jos uskot, että sinun ei pitäisi nähdä tätä viestiä, ota yhteyttä tukeen.</translation>
-<translation id="4289300219472526559">Aloita puhuminen</translation>
 <translation id="4289540628985791613">Yleiskatsaus</translation>
 <translation id="4296575653627536209">Lisää valvottu käyttäjä</translation>
 <translation id="4297322094678649474">Vaihda kieltä</translation>
@@ -2239,7 +2236,7 @@
 <translation id="4478664379124702289">Tallenna lin&amp;kki nimellä...</translation>
 <translation id="4479424953165245642">Hallinnoi kioskisovelluksia</translation>
 <translation id="4479639480957787382">Ethernet</translation>
-<translation id="4480590691557335796">Chrome voi etsiä haitallisia ohjelmia tietokoneestasi ja poistaa ne</translation>
+<translation id="4480590691557335796">Chrome etsii haitallisia ohjelmia tietokoneestasi ja voi poistaa ne</translation>
 <translation id="4481249487722541506">Lataa laajennus...</translation>
 <translation id="4481530544597605423">Laitteet ilman paria</translation>
 <translation id="4482194545587547824">Google voi muokata hakua ja muita Googlen palveluita selaushistoriasi perusteella.</translation>
@@ -2403,6 +2400,7 @@
 <translation id="4748762018725435655">Edellyttää laajennuksen lataamista Chrome Web Storesta.</translation>
 <translation id="4750394297954878236">Ehdotukset</translation>
 <translation id="475088594373173692">Ensimmäinen käyttäjä</translation>
+<translation id="4751476147751820511">Liike- tai valotunnistimet</translation>
 <translation id="4756378406049221019">Pysäytä/päivitä</translation>
 <translation id="4756388243121344051">&amp;Historia</translation>
 <translation id="4759238208242260848">Lataukset</translation>
@@ -2437,7 +2435,6 @@
 <translation id="4813512666221746211">Verkkovirhe</translation>
 <translation id="4816492930507672669">Sovita sivulle</translation>
 <translation id="4820334425169212497">Ei, en näe sitä</translation>
-<translation id="4821725298388681253">Tämä on ennakkoversio. Haku, tekstinsyöttö ja jotkin muut ominaisuudet eivät ole vielä käytössä.</translation>
 <translation id="4821935166599369261">&amp;Profilointi on käytössä</translation>
 <translation id="4823484602432206655">Lukea ja muokata käyttäjän ja laitteen asetuksia.</translation>
 <translation id="4823651846660089135">Laite on vain luku ‑tilassa.</translation>
@@ -3144,7 +3141,7 @@
 <translation id="5882919346125742463">Tunnetut verkot</translation>
 <translation id="5884474295213649357">Tämä välilehti on yhdistetty USB-laitteeseen.</translation>
 <translation id="5885324376209859881">Media-asetusten hallinta…</translation>
-<translation id="5887341066363321040">Sivustolle <ph name="ORIGIN" /> ei ole tallennettu salasanoja</translation>
+<translation id="5887341066363321040">Sivustolla <ph name="ORIGIN" /> ei ole tallennettuja salasanoja</translation>
 <translation id="5889282057229379085">Keskitason varmenteiden myöntäjien enimmäismäärä: <ph name="NUM_INTERMEDIATE_CA" /></translation>
 <translation id="5895138241574237353">Käynnistä uudelleen</translation>
 <translation id="5895187275912066135">Myöntämispäivämäärä</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">Etsi laitteen sormenjälkitunnistin ja kosketa sitä sormellasi.</translation>
 <translation id="6390799748543157332">Tässä ikkunassa katselemasi sivut eivät näy selaushistoriassa, eikä niistä jää tietokoneelle muita jälkiä, kuten evästeitä, suljettuasi kaikki vierailijaikkunat. Kaikki lataamasi tiedostot kuitenkin säilytetään.</translation>
 <translation id="6395423953133416962">Lähetä <ph name="BEGIN_LINK1" />järjestelmän tiedot<ph name="END_LINK1" /> ja <ph name="BEGIN_LINK2" />tilastot<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Lopeta puhuminen</translation>
 <translation id="6397592254427394018">Avaa kaikki kirjanmerkit incognito-ikkunassa</translation>
 <translation id="6398715114293939307">Poista Google Play Kauppa</translation>
 <translation id="6398765197997659313">Poistu koko näytön tilasta</translation>
@@ -3952,10 +3948,10 @@
 <translation id="7180865173735832675">Muokkaa</translation>
 <translation id="7186088072322679094">Pidä yläpalkissa</translation>
 <translation id="7187428571767585875">Poistettavat tai muutettavat rekisteritiedot:</translation>
-<translation id="7189234443051076392">Varmista, että laitteellasi on tarpeeksi tilaa</translation>
+<translation id="7189234443051076392">Varmista, että laitteellasi on tarpeeksi tilaa.</translation>
 <translation id="7191159667348037">Tuntematon tulostin (USB)</translation>
 <translation id="7191454237977785534">Tallenna tiedosto nimellä</translation>
-<translation id="7193374945610105795">Sivustolle <ph name="ORIGIN" /> ei ole tallennettu salasanoja</translation>
+<translation id="7193374945610105795">Sivustolla <ph name="ORIGIN" /> ei ole tallennettuja salasanoja</translation>
 <translation id="7196835305346730603">Etsitään lähellä olevia Chromeboxeja…</translation>
 <translation id="7199158086730159431">Pyydä ohj&amp;eita</translation>
 <translation id="720110658997053098">Pidä tämä laite pysyvästi kioskitilassa</translation>
@@ -4007,7 +4003,7 @@
 <translation id="7278870042769914968">Käytä GTK+ -teemaa</translation>
 <translation id="727952162645687754">Latausvirhe</translation>
 <translation id="7279701417129455881">Hallinnoi evästeiden estoa...</translation>
-<translation id="7280041992884344566">Chromen etsiessä haittaohjelmia tapahtui virhe</translation>
+<translation id="7280041992884344566">Chromen etsiessä haittaohjelmia tapahtui virhe.</translation>
 <translation id="7280877790564589615">Käyttölupapyyntö</translation>
 <translation id="7282992757463864530">Tietopalkki</translation>
 <translation id="7283041136720745563">Google Drive ‑kiintiösi ei riitä.</translation>
@@ -4016,13 +4012,14 @@
 <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="7292324470889366655">Sijainnin muutos valmis</translation>
+<translation id="7292324470889366655">Viimeistele sijainnin muutos</translation>
 <translation id="729459249680637905">Yrityksiä jäljellä: $1</translation>
 <translation id="7295662345261934369">Jaa muiden kanssa</translation>
 <translation id="7296774163727375165">Verkkotunnuksen <ph name="DOMAIN" /> käyttöehdot</translation>
 <translation id="7297443947353982503">Käyttäjätunnus/salasana on virheellinen tai EAP-todennus epäonnistui</translation>
 <translation id="729761647156315797">Valitse näppäimistö ja kieli</translation>
 <translation id="7299337219131431707">Ota vierailijakäyttö käyttöön</translation>
+<translation id="7303900363563182677">Tämä sivu ei saa nähdä leikepöydälle kopioitua tekstiä tai kuvia.</translation>
 <translation id="730515362922783851">Vaihtaa tietoja minkä tahansa paikallisverkossa tai internetissä olevan laitteen kanssa.</translation>
 <translation id="7308002049209013926">Siirry uusiin sovelluksiin ja toimintoihin nopeasti käynnistysohjelmalla. Avaa se näppäimistöllä painamalla Alt + vaihto + L.</translation>
 <translation id="7309257895202129721">Näytä &amp;painikkeet</translation>
@@ -4242,7 +4239,7 @@
 <translation id="7664620655576155379">Tukematon Bluetooth-laite: <ph name="DEVICE_NAME" />.</translation>
 <translation id="7665369617277396874">Lisää tili</translation>
 <translation id="7671130400130574146">Käytä järjestelmän otsikkoriviä ja reunoja</translation>
-<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> kohteessa <ph name="PAGE_TITLE" /></translation>
+<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> (<ph name="PAGE_TITLE" />)</translation>
 <translation id="7683373461016844951">Jos haluat jatkaa, valitse OK, Lisää henkilö ja luo sähköpostiosoitteellasi (<ph name="DOMAIN" />) uusi profiili.</translation>
 <translation id="7684212569183643648">Järjestelmänvalvojasi asentama</translation>
 <translation id="7684559058815332124">Siirry captive portal -kirjautumissivulle</translation>
@@ -4251,7 +4248,7 @@
 <translation id="7690378713476594306">Valitse luettelosta</translation>
 <translation id="7690853182226561458">Lisää kansio...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (on jo tällä laitteella)</translation>
-<translation id="7696063401938172191">Kohteessa <ph name="PHONE_NAME" />:</translation>
+<translation id="7696063401938172191"><ph name="PHONE_NAME" />:</translation>
 <translation id="7698408911093959127">{COUNT,plural, =1{1 kohde kirjanmerkkiluettelossa}other{# kohdetta kirjanmerkkiluettelossa}}</translation>
 <translation id="7701040980221191251">Ei mitään</translation>
 <translation id="7701869757853594372">KÄYTTÄJÄ-tunnukset</translation>
@@ -4402,6 +4399,7 @@
 <translation id="7909969815743704077">Ladattiin incognito-tilassa</translation>
 <translation id="7910768399700579500">&amp;Uusi kansio</translation>
 <translation id="7912080627461681647">Salasana vaihdettiin palvelimella. Kirjaudu ulos ja sitten uudelleen sisään.</translation>
+<translation id="7912883689016444961">Mobiiliverkon määritys</translation>
 <translation id="7915471803647590281">Kerro meille tapahtumista ennen kun lähetät palautteen.</translation>
 <translation id="7925247922861151263">AAA-testi epäonnistui</translation>
 <translation id="7925285046818567682">Odotetaan palvelinta osoitteessa <ph name="HOST_NAME" />...</translation>
@@ -4468,7 +4466,7 @@
 <translation id="8005600846065423578"><ph name="HOST" /> saa aina nähdä leikepöydän sisällön</translation>
 <translation id="8008356846765065031">Internetyhteys katkaistu. Tarkista internetyhteytesi.</translation>
 <translation id="8008818777654712271">Lähetä automaattisesti joitain järjestelmän tietoja ja sivujen sisältöjä Googlelle auttaaksesi sitä havaitsemaan vaarallisia sovelluksia ja sivustoja.</translation>
-<translation id="8009225694047762179">Hallinnoi salasanoja</translation>
+<translation id="8009225694047762179">Salasanojen hallinta</translation>
 <translation id="8012382203418782830">Tämä sivu on käännetty.</translation>
 <translation id="8014154204619229810">Päivitysohjelma on käynnissä. Lataa sivu hetken kuluttua uudelleen ja tarkista tilanne.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> ei voi palautua aiemmin asennettuun versioon. Suorita laitteellesi Powerwash uudelleen.</translation>
@@ -4523,7 +4521,7 @@
 <translation id="8077684120002777443">Käyttäjänimi (esim. käyttäjä@example.com)</translation>
 <translation id="8077816382010018681">Lukituksen pika-avaamista koskevan ilmoituksen otsikko</translation>
 <translation id="8079530767338315840">Toista</translation>
-<translation id="8079938625609335826">Ota synkronointi käyttöön, niin voit käyttää laajennuksiasi kaikilla laitteillasi.</translation>
+<translation id="8079938625609335826">Ota synkronointi käyttöön, niin voit käyttää laajennuksiasi kaikilla laitteilla.</translation>
 <translation id="8083739373364455075">Saa 100 Gt ilmaista tallennustilaa Google Drivessa</translation>
 <translation id="8086015605808120405">Määritetään tulostinta <ph name="PRINTER_NAME" />…</translation>
 <translation id="8090234456044969073">Lukea useimmin käyttämiesi verkkosivustojen luettelo</translation>
@@ -4744,7 +4742,7 @@
 <translation id="8465444703385715657"><ph name="PLUGIN_NAME" /> tarvitsee suoritusluvan.</translation>
 <translation id="8466234950814670489">Tar-arkisto</translation>
 <translation id="8468750959626135884">Avaa <ph name="DEVICE_TYPE" /> Android-puhelimellasi.</translation>
-<translation id="8470513973197838199">Kohteen <ph name="ORIGIN" /> tallennetut salasanat</translation>
+<translation id="8470513973197838199">Tallennetut salasanat: <ph name="ORIGIN" /></translation>
 <translation id="8472623782143987204">laitteiston tukema</translation>
 <translation id="8475313423285172237">Toinen tietokoneellasi oleva ohjelma lisäsi laajennuksen, joka voi muuttaa Chromen toimintaa.</translation>
 <translation id="8475647382427415476">Google Drive ei onnistunut synkronoimaan tiedostoa <ph name="FILENAME" />. Google Drive yrittää myöhemmin uudelleen.</translation>
@@ -4796,7 +4794,7 @@
 <translation id="8569682776816196752">Kohteita ei löytynyt</translation>
 <translation id="8569764466147087991">Valitse avattava tiedosto</translation>
 <translation id="8571213806525832805">Viimeiset neljä viikkoa</translation>
-<translation id="8571613743082299268">Uudelleenohjaus estetty sivustolle</translation>
+<translation id="8571613743082299268">Uudelleenohjaus estetty:</translation>
 <translation id="8574990355410201600"><ph name="HOST" /> saa aina toistaa ääntä</translation>
 <translation id="8578639784464423491">Enimmäispituus 99 kirjainta</translation>
 <translation id="8579285237314169903">Synkronoidaan <ph name="NUMBER_OF_FILES" /> kohdetta…</translation>
@@ -4913,6 +4911,7 @@
 <translation id="8736288397686080465">Tämä sivusto on päivitetty taustalla.</translation>
 <translation id="8737685506611670901">Avata <ph name="PROTOCOL" />-linkit palvelun <ph name="REPLACED_HANDLER_TITLE" /> sijaan.</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Kuva kuvassa</translation>
 <translation id="8743864605301774756">Päivitetty 1 t sitten</translation>
 <translation id="8749863574775030885">Käyttää tuntemattoman myyjän USB-laitteita.</translation>
 <translation id="8754200782896249056">&lt;p&gt;Kun tuotetta <ph name="PRODUCT_NAME" /> käytetään tuetussa työpöytäympäristössä, järjestelmän välityspalvelinasetukset ovat käytössä. Joko järjestelmäsi ei ole tuettu tai järjestelmän määrityksiä käynnistettäessä tapahtui virhe.&lt;/p&gt;
@@ -5015,7 +5014,6 @@
 <translation id="8912793549644936705">Venytä</translation>
 <translation id="8915370057835397490">Ladataan ehdotusta</translation>
 <translation id="8916476537757519021">Incognito-alakehys: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synkronoi tilille <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Salli aina mainokset tällä sivustolla.</translation>
 <translation id="8925458182817574960">A&amp;setukset</translation>
 <translation id="8926389886865778422">Älä kysy uudestaan</translation>
@@ -5044,7 +5042,7 @@
 <translation id="8962083179518285172">Piilota tiedot</translation>
 <translation id="8965037249707889821">Syötä vanha salasana</translation>
 <translation id="8965697826696209160">Tallennustila ei riitä.</translation>
-<translation id="8967866634928501045">Näytä painamalla Alt Shift A</translation>
+<translation id="8967866634928501045">Näytä painamalla Alt Vaihto A</translation>
 <translation id="8970203673128054105">Näytä Cast-tilaluettelo</translation>
 <translation id="89720367119469899">Escape</translation>
 <translation id="8973557916016709913">Poista zoomaustaso</translation>
@@ -5196,7 +5194,7 @@
 <translation id="932327136139879170">Etusivu</translation>
 <translation id="932508678520956232">Tulostuksen käynnistäminen ei onnistunut.</translation>
 <translation id="93393615658292258">Vain salasana</translation>
-<translation id="934503638756687833">Myös tämän luettelon ulkopuolisia kohteita poistetaan tarvittaessa. Lue lisää &lt;a href="<ph name="URL" />"&gt;ei-toivotuilta ohjelmilta suojautumisesta&lt;/a&gt; Chromen tietosuojaraportista.</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="936801553271523408">Järjestelmän diagnostiikkatiedot</translation>
 <translation id="93766956588638423">Korjaa laajennus</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 5fdeeec..6c58b38 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Ang pagpindot sa Tab sa isang webpage ay nagha-highlight ng mga link, pati na rin ang mga field ng form</translation>
 <translation id="2916745397441987255">Maghanap sa mga extension</translation>
 <translation id="2921081876747860777">Mangyaring gumawa ng password upang protektahan ang iyong lokal na data.</translation>
-<translation id="2924395203970765374">Na-sync kay <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Sheets</translation>
 <translation id="2927017729816812676">Storage ng Cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Account para sa mga bata)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Binabati ka namin</translation>
 <translation id="3349933790966648062">Footprint ng Memory</translation>
 <translation id="3353984535370177728">Pumili ng folder na i-a-upload</translation>
-<translation id="335581015389089642">Pananalita</translation>
 <translation id="3355936511340229503">Error sa koneksyon</translation>
 <translation id="3356797067524893661">Handa ka nang magpatuloy sa Hangouts Meet</translation>
 <translation id="3358935496594837302">Hindi mahanap ang iyong telepono. Siguraduhing gumagamit ka ng tugmang Android phone na naka-on at malapit. &lt;a&gt;Matuto pa&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Buksan sa bagong tab</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;I-clear ang Data ng Pag-browse...</translation>
-<translation id="3618849550573277856">Hanapin ang “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Naka-back up na ang lahat!</translation>
 <translation id="3623574769078102674">Pamamahalaan ang pinangangasiwaang user na ito ng <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Naka-disable ang mga screenshot</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Hindi inaasahang nabigo ang software ng anti-virus habang ini-scan ang file na ito.</translation>
 <translation id="428608937826130504">Item 8 sa shelf</translation>
 <translation id="4287502004382794929">Wala kang sapat na mga lisensya ng software upang ipatala ang device na ito. Mangyaring makipag-ugnay sa sales upang bumili nang higit pa. Kung naniniwala ka na nakikita mo ang mensaheng ito dahil sa error, mangyaring makipag-ugnay sa suporta.</translation>
-<translation id="4289300219472526559">Simulan ang Pagsasalita</translation>
 <translation id="4289540628985791613">Pangkalahatang-ideya</translation>
 <translation id="4296575653627536209">Magdagdag ng Pinapangasiwaang User</translation>
 <translation id="4297322094678649474">Palitan ang Mga Wika</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Error sa network</translation>
 <translation id="4816492930507672669">Pagkasyahin sa pahina</translation>
 <translation id="4820334425169212497">Hindi, hindi ko ito nakikita</translation>
-<translation id="4821725298388681253">Ito ay isang maagang release. Hindi pa available ang ilang feature, tulad ng paghahanap at paglalagay ng text.</translation>
 <translation id="4821935166599369261">&amp;Pinagana ang Pag-profile</translation>
 <translation id="4823484602432206655">Basahin at baguhin ang mga setting ng user at device</translation>
 <translation id="4823651846660089135">Read-only ang device</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Hanapin ang sensor para sa fingerprint sa iyong device at pindutin ito gamit ang iyong daliri</translation>
 <translation id="6390799748543157332">Hindi lalabas sa iyong history ng browser ang mga page na tiningnan mo sa window na ito at hindi mag-iiwan ang mga ito ng iba pang mga palatandaan, tulad ng cookies, sa computer pagkatapos mong isara ang lahat ng nakabukas na mga window ng Bisita. Gayunpaman, papanatilihin ang anumang mga file na na-download mo.</translation>
 <translation id="6395423953133416962">Ipadala ang <ph name="BEGIN_LINK1" />impormasyon ng system<ph name="END_LINK1" /> at <ph name="BEGIN_LINK2" />mga sukatan<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Ihinto ang Pagsasalita</translation>
 <translation id="6397592254427394018">Buksan ang lahat ng bookmark sa &amp;incognito window</translation>
 <translation id="6398715114293939307">Alisin ang Google Play Store</translation>
 <translation id="6398765197997659313">Lumabas sa buong screen</translation>
@@ -5025,7 +5019,6 @@
 <translation id="8912793549644936705">Naka-stretch</translation>
 <translation id="8915370057835397490">Nilo-load ang suhestiyon</translation>
 <translation id="8916476537757519021">Incognito na Subframe: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">I-sync sa <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Palaging payagan ang mga ad sa site na ito</translation>
 <translation id="8925458182817574960">&amp;Mga Setting</translation>
 <translation id="8926389886865778422">Huwag nang itanong ulit</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 16b35fe1..a828b24 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Pour gérer les extensions, cliquer sur "Extensions" dans le menu "Outils"</translation>
 <translation id="2359808026110333948">Continuer</translation>
 <translation id="236141728043665931">Toujours bloquer l'accès au micro</translation>
+<translation id="2365507699358342471">Ce site peut voir le texte et les images copiés dans le presse-papiers.</translation>
 <translation id="2367972762794486313">Afficher les applications</translation>
 <translation id="2371076942591664043">Ouvrir une fois le téléchargement &amp;terminé</translation>
 <translation id="2377319039870049694">Passer en mode Liste</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">La touche TAB permet de sélectionner des liens et d'accéder à des champs de formulaire sur une page Web.</translation>
 <translation id="2916745397441987255">Rechercher dans les extensions</translation>
 <translation id="2921081876747860777">Veuillez créer un mot de passe pour protéger vos données locales</translation>
-<translation id="2924395203970765374">Synchronisé avec le compte <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Feuilles de calcul</translation>
 <translation id="2927017729816812676">Espace de stockage du cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (compte pour enfants)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">Félicitations</translation>
 <translation id="3349933790966648062">Espace mémoire utilisé</translation>
 <translation id="3353984535370177728">Sélectionner le dossier d'importation</translation>
-<translation id="335581015389089642">Voix</translation>
 <translation id="3355936511340229503">Erreur de connexion</translation>
 <translation id="3356797067524893661">Vous pouvez accéder à Hangouts Meet</translation>
 <translation id="3358935496594837302">Impossible de trouver votre téléphone. Assurez-vous qu'il s'agit bien d'un téléphone Android compatible, qu'il est allumé et qu'il se trouve à proximité. &lt;a&gt;En savoir plus&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Ouvrir dans un nouvel onglet</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Effacer les données de navigation...</translation>
-<translation id="3618849550573277856">Rechercher "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Tout le contenu a été sauvegardé</translation>
 <translation id="3623574769078102674">Cet utilisateur supervisé va être géré par <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Captures d'écran désactivées</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">Le logiciel antivirus a rencontré une erreur inattendue pendant l'analyse de ce fichier.</translation>
 <translation id="428608937826130504">Élément d'étagère 8</translation>
 <translation id="4287502004382794929">Vous n'avez pas suffisamment de licences logicielles pour enregistrer cet appareil. Veuillez contacter le service commercial pour en acheter d'autres. Si vous pensez que ce message s'affiche par erreur, veuillez contacter l'assistance technique.</translation>
-<translation id="4289300219472526559">Commencer à parler</translation>
 <translation id="4289540628985791613">Présentation</translation>
 <translation id="4296575653627536209">Ajouter un utilisateur supervisé</translation>
 <translation id="4297322094678649474">Modifier les langues</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Nécessite une extension du Chrome Web Store.</translation>
 <translation id="4750394297954878236">Suggestions</translation>
 <translation id="475088594373173692">Premier utilisateur</translation>
+<translation id="4751476147751820511">Capteurs de mouvement ou de lumière</translation>
 <translation id="4756378406049221019">Arrêter/Actualiser</translation>
 <translation id="4756388243121344051">&amp;Historique</translation>
 <translation id="4759238208242260848">Téléchargements</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Erreur réseau.</translation>
 <translation id="4816492930507672669">Ajuster à la page</translation>
 <translation id="4820334425169212497">Non, je ne le vois pas</translation>
-<translation id="4821725298388681253">Ceci est une version préliminaire. Certaines fonctionnalités, comme la recherche et la saisie de texte, ne sont pas encore disponibles.</translation>
 <translation id="4821935166599369261">&amp;Profilage activé</translation>
 <translation id="4823484602432206655">Consulter et modifier les paramètres d'utilisateur et d'appareil</translation>
 <translation id="4823651846660089135">Appareil en lecture seule</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">Localisez le lecteur d'empreinte digitale de votre appareil, puis posez le doigt dessus</translation>
 <translation id="6390799748543157332">Les pages que vous consultez dans cette fenêtre ne sont pas consignées dans l'historique du navigateur et ne laissent aucune autre trace sur votre ordinateur (des cookies, par exemple), une fois que vous avez fermé toutes les fenêtres Invité ouvertes. Tous les fichiers téléchargés sont toutefois conservés.</translation>
 <translation id="6395423953133416962">Envoyer les <ph name="BEGIN_LINK1" />informations système<ph name="END_LINK1" /> et les <ph name="BEGIN_LINK2" />statistiques<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Arrêter de parler</translation>
 <translation id="6397592254427394018">Ouvrir tous les favoris dans une fenêtre de &amp;navigation privée</translation>
 <translation id="6398715114293939307">Supprimer le Google Play Store</translation>
 <translation id="6398765197997659313">Quitter le mode plein écran</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">Nom d'utilisateur/mot de passe incorrect ou échec de l'authentification EAP.</translation>
 <translation id="729761647156315797">Sélectionner votre langue et votre clavier</translation>
 <translation id="7299337219131431707">Activer la navigation en tant qu'invité</translation>
+<translation id="7303900363563182677">Ce site ne pourra pas voir le texte et les images copiés dans le presse-papiers</translation>
 <translation id="730515362922783851">Échanger des données avec n'importe quel appareil sur le réseau local ou sur Internet</translation>
 <translation id="7308002049209013926">Utilisez le lanceur d'applications pour accéder rapidement à vos nouvelles applications et activités. Pour y accéder depuis le clavier, appuyez sur Alt+Maj+L.</translation>
 <translation id="7309257895202129721">Afficher les &amp;commandes</translation>
@@ -4405,6 +4402,7 @@
 <translation id="7909969815743704077">Téléchargé en mode navigation privée</translation>
 <translation id="7910768399700579500">&amp;Nouveau dossier</translation>
 <translation id="7912080627461681647">Votre mot de passe a été modifié sur le serveur. Veuillez vous déconnecter, puis vous reconnecter.</translation>
+<translation id="7912883689016444961">Configurer le réseau mobile</translation>
 <translation id="7915471803647590281">Veuillez nous indiquer ce qu'il se passe avant d'envoyer votre rapport.</translation>
 <translation id="7925247922861151263">Échec de la vérification AAA</translation>
 <translation id="7925285046818567682">En attente de <ph name="HOST_NAME" />...</translation>
@@ -4916,6 +4914,7 @@
 <translation id="8736288397686080465">Ce site a été mis à jour en arrière-plan.</translation>
 <translation id="8737685506611670901">Ouvrir les liens "<ph name="PROTOCOL" />" à la place de "<ph name="REPLACED_HANDLER_TITLE" />"</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Picture in Picture</translation>
 <translation id="8743864605301774756">Mise à jour il y a 1 heure</translation>
 <translation id="8749863574775030885">Accéder à des appareils USB d'un fournisseur inconnu</translation>
 <translation id="8754200782896249056">&lt;p&gt;Lorsque vous exécutez <ph name="PRODUCT_NAME" /> dans un environnement de bureau compatible, les paramètres proxy du système sont utilisés. Cependant, soit votre système n'est pas compatible, soit un problème est survenu lors du lancement de votre configuration système.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Étirer</translation>
 <translation id="8915370057835397490">Chargement des suggestions en cours…</translation>
 <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synchroniser avec le compte <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Toujours autoriser les annonces sur ce site</translation>
 <translation id="8925458182817574960">&amp;Paramètres</translation>
 <translation id="8926389886865778422">Ne plus afficher ce message</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 980bc408..81d93cf 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -721,7 +721,7 @@
 <translation id="2128691215891724419">સમન્વયન ભૂલ: સમન્વયન પાસફ્રેઝને અપડેટ કરો...</translation>
 <translation id="2129825002735785149">પ્લગ-ઇન અપડેટ કરો</translation>
 <translation id="2129904043921227933">સમન્વયન ભૂલ: સમન્વયન પાસફ્રેઝને અપડેટ કરો...</translation>
-<translation id="2130949041518253417">તમારા બધા ઉપકરણો પર વ્યક્તિગત બ્રાઉઝિંગ અનુભવ માટે સિંક કરો</translation>
+<translation id="2130949041518253417">તમારા બધા ઉપકરણો પર મનગમતા બ્રાઉઝિંગ અનુભવ માટે સિંક કરો</translation>
 <translation id="2131077480075264">"<ph name="APP_NAME" />" ને ઇન્સ્ટોલ કરવામાં અસમર્થ કારણ કે "<ph name="IMPORT_NAME" />" દ્વારા તેની મંજૂરી નથી</translation>
 <translation id="2135787500304447609">&amp;ફરી શરૂ કરો</translation>
 <translation id="2136372518715274136">નવો પાસવર્ડ દાખલ કરો</translation>
@@ -878,6 +878,7 @@
 <translation id="2359345697448000899">ટૂલ્સ મેનૂમાં એક્સટેંશનને ક્લિક કરીને તમારા એક્સ્ટેંશન્સને મેનેજ કરો.</translation>
 <translation id="2359808026110333948">ચાલુ રાખો</translation>
 <translation id="236141728043665931">માઇક્રોફોનની ઍક્સેસને હંમેશા અવરોધિત કરો</translation>
+<translation id="2365507699358342471">આ સાઇટ ક્લિપબોર્ડ પર કૉપિ કરેલ ટેક્સ્ટ અને છબીઓ જોઈ શકે છે.</translation>
 <translation id="2367972762794486313">ઍપ્લિકેશનો બતાવો</translation>
 <translation id="2371076942591664043">&amp;પૂર્ણ થાય ત્યારે ખોલો</translation>
 <translation id="2377319039870049694">સૂચિ દૃશ્ય પર સ્વિચ કરો</translation>
@@ -953,7 +954,7 @@
 <translation id="249819058197909513">આ ઍપ્લિકેશન માટે ફરીથી ચેતવણી આપશો નહીં</translation>
 <translation id="2498539833203011245">નાનું કરો</translation>
 <translation id="2498765460639677199">વિશાળ</translation>
-<translation id="2499747912851752301">બધા પાસવર્ડનો નિકાસ કરી રહ્યાં છીએ…</translation>
+<translation id="2499747912851752301">બધા પાસવર્ડની નિકાસ કરી રહ્યાં છીએ…</translation>
 <translation id="2500471369733289700">તમારી ગોપનીયતા સુરક્ષિત રાખવા માટે અવરોધિત કરી છે</translation>
 <translation id="2501173422421700905">પ્રમાણપત્ર હોલ્ડ પર છે</translation>
 <translation id="2501278716633472235">પાછા જાઓ</translation>
@@ -1147,7 +1148,7 @@
 <translation id="2767084307624729667"><ph name="ORIGIN" /> માટે સાચવેલા પાસવર્ડ</translation>
 <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" /> તરીકે સાઇન ઇન કરો.</translation>
 <translation id="2770465223704140727">સૂચિમાંથી દૂર કરો</translation>
-<translation id="2770690685823456775">એક બીજા ફોલ્ડરમાં તમારા પાસવર્ડનો નિકાસ કરો</translation>
+<translation id="2770690685823456775">એક બીજા ફોલ્ડરમાં તમારા બધા પાસવર્ડની નિકાસ કરો</translation>
 <translation id="2771268254788431918">મોબાઇલ ડેટા ચાલુ કર્યો</translation>
 <translation id="2772936498786524345">સ્નીકી</translation>
 <translation id="2773802008104670137">આ પ્રકારની ફાઇલ તમારા કમ્પ્યુટરને નુકસાન પહોંચાડી શકે છે.</translation>
@@ -1265,7 +1266,6 @@
 <translation id="2916073183900451334">વેબપેજ પર ટૅબને દબાવવાથી લિંક્સની સાથે સાથે ફોર્મ ફીલ્ડ્સ હાઇલાઇટ્સ થાય છે</translation>
 <translation id="2916745397441987255">એક્સ્ટેન્શન્સ શોધો</translation>
 <translation id="2921081876747860777">તમારો સ્થાનિક ડેટા સુરક્ષિત કરવા માટે કૃપા કરીને એક પાસવર્ડ બનાવો.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> સાથે સિંક કર્યું</translation>
 <translation id="2925966894897775835">શીટ્સ</translation>
 <translation id="2927017729816812676">કેશ સ્ટોરેજ</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (બાળકો માટેનું એકાઉન્ટ)</translation>
@@ -1353,7 +1353,7 @@
 <translation id="3038612606416062604">પ્રિન્ટરને મેન્યુઅલી ઉમેરો</translation>
 <translation id="3038675903128704560">તમારા કમ્પ્યુટરને ઍક્સેસ કરવા માટે કોઈપણ સાઇટને પ્લગ-ઇનનો ઉપયોગ કરવાની મંજૂરી આપશો નહીં</translation>
 <translation id="3039828483675273919">$1 આઇટમ્સ ખસેડી રહ્યું છે...</translation>
-<translation id="3045447014237878114">આ સાઇટે એક થી વધુ ફાઇલો આપમેળે ડાઉનલોડ કરી છે</translation>
+<translation id="3045447014237878114">આ સાઇટે એકથી વધુ ફાઇલો આપમેળે ડાઉનલોડ કરી છે</translation>
 <translation id="304567287000691532">સ્ક્રીન શેર કરી રહ્યાં છીએ</translation>
 <translation id="3046910703532196514">વેબપૃષ્ઠ, પૂર્ણ</translation>
 <translation id="304826556400666995">ટૅબ્સને અનમ્યૂટ કરો</translation>
@@ -1548,7 +1548,6 @@
 <translation id="3348459612390503954">અભિનંદન</translation>
 <translation id="3349933790966648062">મેમરી ફૂટપ્રિન્ટ</translation>
 <translation id="3353984535370177728">અપલોડ કરવા માટે એક ફોલ્ડર પસંદ કરો</translation>
-<translation id="335581015389089642">ભાષા</translation>
 <translation id="3355936511340229503">કનેક્શન ભૂલ</translation>
 <translation id="3356797067524893661">તમે Hangouts Meet પર ચાલુ રાખવા માટે તૈયાર છો</translation>
 <translation id="3358935496594837302">તમારો ફોન શોધી શકાતો નથી. ખાતરી કરો કે તમે સુસંગત Android ફોનનો ઉપયોગ કરી રહ્યા છો જે ચાલુ છે અને હાથવગો છે. &lt;a&gt;વધુ જાણો&lt;/a&gt;</translation>
@@ -1573,7 +1572,7 @@
 <translation id="3396331542604645348">પસંદ કરેલું પ્રિંટર ઉપલબ્ધ નથી અથવા ઠીકથી ઇન્સ્ટોલ કરેલું નથી. તમારા પ્રિંટરને તપાસો અથવા બીજા પ્રિંટરને પસંદ કરી જુઓ.</translation>
 <translation id="3399432415385675819">સૂચનાઓ અક્ષમ કરવામાં આવશે</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
-<translation id="3404065873681873169">આ સાઇટ માટે કોઈ પાસવર્ડ સાચવેલ નથી</translation>
+<translation id="3404065873681873169">આ સાઇટ માટે કોઈ પાસવર્ડ સાચવેલા નથી</translation>
 <translation id="340485819826776184">સરનામાં બારમાં લખેલા URL અને શોધોને પૂર્ણ કરવામાં સહાય માટે અનુમાન સેવાનો ઉપયોગ કરો</translation>
 <translation id="3405664148539009465">ફોન્ટ્સ કસ્ટમાઇઝ કરો </translation>
 <translation id="3405763860805964263">...</translation>
@@ -1725,7 +1724,6 @@
 <translation id="3613422051106148727">નવા ટૅબમાં &amp;ખોલો</translation>
 <translation id="3616113530831147358">ઑડિઓ</translation>
 <translation id="3616741288025931835">બ્રાઉઝિંગ ડેટા &amp;સાફ કરો...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” શોધો</translation>
 <translation id="3620292326130836921">તમામનો બેક અપ લેવાયો!</translation>
 <translation id="3623574769078102674">આ નિરીક્ષણ કરેલ વપરાશકર્તાનું સંચાલન <ph name="MANAGER_EMAIL" /> દ્વારા કરવામાં આવશે.</translation>
 <translation id="3625258641415618104">સ્ક્રીનશોટ્સ અક્ષમ કર્યા</translation>
@@ -1760,7 +1758,7 @@
 <translation id="3665842570601375360">સુરક્ષા:</translation>
 <translation id="3668570675727296296">ભાષા સેટિંગ્સ</translation>
 <translation id="3668823961463113931">હેન્ડલર્સ</translation>
-<translation id="3669030672519623291">આ સાઇટ માટે કોઈ પાસવર્ડ સાચવેલ નથી</translation>
+<translation id="3669030672519623291">આ સાઇટ માટે કોઈ પાસવર્ડ સાચવેલા નથી</translation>
 <translation id="3670229581627177274">Bluetooth ચાલુ કરો</translation>
 <translation id="3672681487849735243">એક ફેક્ટરી ભૂલ શોધવામાં આવી છે</translation>
 <translation id="367645871420407123">જો તમે રૂટ પાસવર્ડને ડિફૉલ્ટ પરીક્ષણ છબી મૂલ્ય પર સેટ કરવા માંગતા હો તો ખાલી છોડો</translation>
@@ -2140,7 +2138,6 @@
 <translation id="428565720843367874">એન્ટી-વાયરસ સૉફ્ટવેર આ ફાઇલ સ્કેન કરતી વખતે અનપેક્ષિત રીતે નિષ્ફળ થયું.</translation>
 <translation id="428608937826130504">શેલ્ફ આઇટમ 8</translation>
 <translation id="4287502004382794929">તમારી પાસે આ ઉપકરણની નોંધણી કરવા માટે પર્યાપ્ત સૉફ્ટવેર લાઇસન્સ નથી. કૃપા કરીને વધુ ખરીદવા માટે વેચાણનો સંપર્ક કરો. જો તમે માનતા હો કે આ સંદેશ તમને ભૂલથી દેખાઈ રહ્યો છે, તો કૃપા કરીને સપોર્ટનો સંપર્ક કરો.</translation>
-<translation id="4289300219472526559">બોલવાનું પ્રારંભ કરો</translation>
 <translation id="4289540628985791613">વિહંગાવલોકન</translation>
 <translation id="4296575653627536209">નિરીક્ષિત વપરાશકર્તા ઉમેરો</translation>
 <translation id="4297322094678649474">ભાષાઓ બદલો</translation>
@@ -2401,6 +2398,7 @@
 <translation id="4748762018725435655">Chrome વેબ દુકાનમાંથી એક્સ્ટેન્શન આવશ્યક છે</translation>
 <translation id="4750394297954878236">સૂચનો</translation>
 <translation id="475088594373173692">પ્રથમ વપરાશકર્તા</translation>
+<translation id="4751476147751820511">મોશન અથવા લાઇટ સેન્સર</translation>
 <translation id="4756378406049221019">રોકો/ફરીથી લોડ કરો</translation>
 <translation id="4756388243121344051">&amp;ઇતિહાસ</translation>
 <translation id="4759238208242260848">ડાઉનલોડ્સ</translation>
@@ -2435,7 +2433,6 @@
 <translation id="4813512666221746211">નેટવર્ક ભૂલ</translation>
 <translation id="4816492930507672669">પૃષ્ઠ પર ફિટ</translation>
 <translation id="4820334425169212497">નહીં, મને તે દેખાતો નથી</translation>
-<translation id="4821725298388681253">આ પ્રારંભિક રિલીઝ છે. અમુક સુવિધાઓ, જેમ કે શોધ અને ટેક્સ્ટ ઍન્ટ્રી હજુ સુધી ઉપલબ્ધ નથી.</translation>
 <translation id="4821935166599369261">&amp;પ્રોફાઇલિંગ સક્ષમ</translation>
 <translation id="4823484602432206655">વપરાશકર્તા અને ઉપકરણ સેટિંગ્સ વાંચો અને બદલો</translation>
 <translation id="4823651846660089135">ઉપકરણ ફક્ત વાંચવા માટે છે</translation>
@@ -2945,7 +2942,7 @@
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
 <translation id="5582839680698949063">મુખ્ય મેનૂ</translation>
 <translation id="5583640892426849032">Backspace</translation>
-<translation id="5583726250980167172">આ સાઇટ માટે સાચવેલા બધા પાસવર્ડ</translation>
+<translation id="5583726250980167172">આ સાઇટ માટે પાસવર્ડ સાચવેલા છે</translation>
 <translation id="5585118885427931890">બુકમાર્ક ફોલ્ડર બનાવી શકાયું નથી. </translation>
 <translation id="558563010977877295">કોઈ ચોક્કસ પૃષ્ઠ અથવા પૃષ્ઠોનો સેટ ખોલો</translation>
 <translation id="5585912436068747822">ફોર્મેટિંગ નિષ્ફળ થયું</translation>
@@ -3447,7 +3444,6 @@
 <translation id="6388771388956873507">તમારા ઉપકરણ પર ફિંગરપ્રિન્ટ સેન્સર શોધો અને તેને તમારી આંગળી વડે ટચ કરો</translation>
 <translation id="6390799748543157332">આ વિંડોમાં તમે જે પૃષ્ઠો જોઈ રહ્યાં છો તે બ્રાઉઝર ઇતિહાસમાં દેખાશે નહીં અને તે તમે બધી ખુલેલી અતિથિ વિંડોઝ બંધ કરી દો તે પછી તમારા કમ્પ્યુટર પર કૂકીઝ જેવા કોઈ અન્ય નિશાન છોડશે નહીં. જો કે, તમે ડાઉનલોડ કરેલી કોઈપણ ફાઇલો જાળવવામાં આવશે.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />સિસ્ટમ માહિતી<ph name="END_LINK1" /> અને <ph name="BEGIN_LINK2" />મેટ્રિક્સ<ph name="END_LINK2" /> મોકલો</translation>
-<translation id="6397363302884558537">બોલવાનું રોકો</translation>
 <translation id="6397592254427394018">બધા બુકમાર્ક્સને &amp;છુપી વિંડોમાં ખોલો</translation>
 <translation id="6398715114293939307">Google Play સ્ટોર દૂર કરો</translation>
 <translation id="6398765197997659313">પૂર્ણ સ્ક્રીનથી બહાર નીકળો</translation>
@@ -3949,7 +3945,7 @@
 <translation id="7180865173735832675">કસ્ટમાઇઝ કરો</translation>
 <translation id="7186088072322679094">ટુલબારમાં રાખો</translation>
 <translation id="7187428571767585875">કાઢી નાખવા અથવા બદલવા માટેની રજિસ્ટ્રી એન્ટ્રી:</translation>
-<translation id="7189234443051076392">ખાતરી કરો કે ઉપકરણ પર પૂરતી સ્પેસ છે</translation>
+<translation id="7189234443051076392">ખાતરી કરો કે તમારા ઉપકરણ પર પૂરતી સ્પેસ છે</translation>
 <translation id="7191159667348037">અજાણ્યું પ્રિન્ટર (USB)</translation>
 <translation id="7191454237977785534">ફાઇલના રૂપમાં સાચવો</translation>
 <translation id="7193374945610105795"><ph name="ORIGIN" /> માટે કોઈ પાસવર્ડ સાચવેલા નથી</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">વપરાશકર્તાનામ/પાસવર્ડ ખોટો છે અથવા EAP-auth નિષ્ફળ થયું</translation>
 <translation id="729761647156315797">તમારી ભાષા અને કીબોર્ડ પસંદ કરો</translation>
 <translation id="7299337219131431707">અતિથિ બ્રાઉઝિંગ સક્ષમ કરો</translation>
+<translation id="7303900363563182677">આ સાઇટ ક્લિપબોર્ડ પર કૉપિ કરેલ ટેક્સ્ટ અને છબીઓ જોવાથી બ્લૉક કરેલ છે</translation>
 <translation id="730515362922783851">સ્થાનિક નેટવર્ક અથવા ઈન્ટરનેટ પર કોઈપણ ઉપકરણ સાથે ડેટા વિનિમય કરો</translation>
 <translation id="7308002049209013926">નવી ઍપ અને પ્રવૃત્તિઓ પર ઝડપથી પહોંચવા માટે લૉન્ચરનો ઉપયોગ કરો. અહીં કીબોર્ડ વડે પહોંચવા માટે, Alt + Shift + L દબાવો.</translation>
 <translation id="7309257895202129721">&amp;નિયંત્રણો બતાવો</translation>
@@ -4400,6 +4397,7 @@
 <translation id="7909969815743704077">છૂપા મોડમાં ડાઉનલોડ કર્યું</translation>
 <translation id="7910768399700579500">&amp;નવું ફોલ્ડર</translation>
 <translation id="7912080627461681647">સર્વર પર તમારો પાસવર્ડ બદલાઈ ગયો છે. કૃપા કરી સાઇન આઉટ કરો પછી ફરીથી સાઇન ઇન કરો.</translation>
+<translation id="7912883689016444961">મોબાઇલ નેટવર્કને ગોઠવો</translation>
 <translation id="7915471803647590281">કૃપા કરીને પ્રતિસાદ મોકલતા પહેલા શું થઈ રહ્યું છે તે અમને કહો.</translation>
 <translation id="7925247922861151263">AAA તપાસ નિષ્ફળ</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> ની પ્રતીક્ષા કરે છે...</translation>
@@ -4789,7 +4787,7 @@
 <translation id="8569682776816196752">કોઈ ગંતવ્યો મળ્યાં નથી</translation>
 <translation id="8569764466147087991">ખોલવા માટે એક ફાઇલ પસંદ કરો</translation>
 <translation id="8571213806525832805">છેલ્લા 4 અઠવાડિયા</translation>
-<translation id="8571613743082299268">સાઇટ પર રીડાયરેક્ટ કરવાનું બ્લૉક કર્યું</translation>
+<translation id="8571613743082299268">આ સાઇટ પર રીડાયરેક્ટ કરવાનું બ્લૉક કર્યું</translation>
 <translation id="8574990355410201600"><ph name="HOST" /> પર હંમેશાં અવાજને મંજૂરી આપો</translation>
 <translation id="8578639784464423491">99 અક્ષરો કરતાં વધુ હોઈ શકતો નથી</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> આઇટમ્સ સમન્વયિત કરી રહ્યાં છે...</translation>
@@ -4906,6 +4904,7 @@
 <translation id="8736288397686080465">પૃષ્ઠભૂમિમાં આ સાઇટ અપડેટ કરવામાં આવી છે.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> ને બદલે <ph name="PROTOCOL" /> લિંક્સ ખોલો</translation>
 <translation id="8737709691285775803">શિલ</translation>
+<translation id="8741316211671074806">ચિત્ર-માં-ચિત્ર</translation>
 <translation id="8743864605301774756">1 કલાક પહેલા અપડેટ કર્યું</translation>
 <translation id="8749863574775030885">અજાણ્યા વિક્રેતા પાસેથી USB ઉપકરણો ઍક્સેસ કરો</translation>
 <translation id="8754200782896249056">&lt;p&gt;જ્યારે સમર્થિત ડેસ્કટૉપ વાતાવરણની અંતર્ગત <ph name="PRODUCT_NAME" /> ચલાવી રહ્યા હોય, ત્યારે સિસ્ટમ પ્રોક્સી સેટિંગ્સ ઉપયોગમાં લેવાશે. તેમ છતાં, ક્યાં તો તમારી સિસ્ટમ સમર્થિત નથી અથવા તમારી સિસ્ટમ ગોઠવણીને લોંચ કરવામાં કોઈ સમસ્યા છે.&lt;/p&gt;
@@ -5008,7 +5007,6 @@
 <translation id="8912793549644936705">ખેંચો</translation>
 <translation id="8915370057835397490">સૂચનને લોડ કરી રહ્યું છે</translation>
 <translation id="8916476537757519021">છુપો મોડ સબફ્રેમ: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> સાથે સિંક કરો</translation>
 <translation id="8922013791253848639">આ સાઇટ પર જાહેરાતો માટે હંમેશાં પરવાનગી આપે છે</translation>
 <translation id="8925458182817574960">&amp;સેટિંગ્સ</translation>
 <translation id="8926389886865778422">ફરિથી પુછશો નહીં</translation>
@@ -5203,7 +5201,7 @@
 <translation id="942954117721265519">આ ડાયરેક્ટરીમાં છબીઓ નથી.</translation>
 <translation id="945522503751344254">પ્રતિસાદ મોકલો</translation>
 <translation id="952992212772159698">સક્રિય કરેલું નથી</translation>
-<translation id="957960681186851048">આ સાઇટે એક થી વધુ ફાઇલોને આપમેળે ડાઉનલોડ કરવાનો પ્રયાસ કર્યો</translation>
+<translation id="957960681186851048">આ સાઇટે એકથી વધુ ફાઇલોને આપમેળે ડાઉનલોડ કરવાનો પ્રયાસ કર્યો</translation>
 <translation id="9580706199804957">Google સેવાઓ સાથે કનેક્ટ ન કરી શક્યાં</translation>
 <translation id="958515377357646513">આગળ જવા માટે ટચ કરો.</translation>
 <translation id="960719561871045870">ઓપરેટર કોડ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 976b554..a17d13b 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -6,7 +6,7 @@
 <translation id="1005274289863221750">अपना माइक्रोफ़ोन और कैमरा उपयोग करें</translation>
 <translation id="1007408791287232274">डिवाइस को लोड नहीं किया जा सका.</translation>
 <translation id="1008186147501209563">बुकमार्क निर्यात करें</translation>
-<translation id="1009147628737158130"><ph name="URL" /> आपकी सुरक्षा चाबी के बारे में पहचान करने लायक जानकारी देखना चाहता है</translation>
+<translation id="1009147628737158130"><ph name="URL" /> को आपकी सुरक्षा चाबी के बारे में पहचान करने लायक जानकारी देखनी है</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{पेज प्रतिसाद नहीं दे रहा है}one{पेज प्रतिसाद नहीं दे रहे हैं}other{पेज प्रतिसाद नहीं दे रहे हैं}}</translation>
 <translation id="1012794136286421601">आपकी दस्तावेज़, पत्रक, स्लाइड, और ड्रॉइंग फ़ाइलें समन्वयित की जा रही हैं. उन्हें ऑनलाइन या ऑफ़लाइन एक्सेस करने के लिए Google डिस्क ऐप्स खोलें.</translation>
 <translation id="1013707859758800957">एक सैंडबॉक्‍स नहीं किए गए प्‍लग इन को इस पृष्‍ठ पर चलने दिया गया था.</translation>
@@ -588,7 +588,7 @@
 <translation id="1878524442024357078">किसी भी साइट को आपका कंप्यूटर एक्सेस करने के लिए प्लग इन का उपयोग ना करने दें</translation>
 <translation id="1879449842763884566">Applications में इंस्टॉल करें...</translation>
 <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" हटाएं?</translation>
-<translation id="188190999506226223">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" /> <ph name="ORIGIN" /> के लिए आपका पासवर्ड सेव करे?</translation>
+<translation id="188190999506226223">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" />, <ph name="ORIGIN" /> के लिए आपका पासवर्ड सेव करे?</translation>
 <translation id="1886996562706621347">साइटों को प्रोटोकॉल के लिए डिफ़ॉल्‍ट हैंडलर बनने के लिए पूछने देने की अनुमति दें (सुझाव)</translation>
 <translation id="1887442540531652736">साइन-इन गड़बड़ी</translation>
 <translation id="1887850431809612466">हार्डवेयर पुनरीक्षण</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">टूल मेनू में एक्सटेंशन क्लिक करके अपने एक्सटेंशन प्रबंधित करें.</translation>
 <translation id="2359808026110333948">जारी रखें</translation>
 <translation id="236141728043665931">माइक्रोफ़ोन एक्सेस हमेशा अवरुद्ध करें</translation>
+<translation id="2365507699358342471">यह साइट क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज देख सकती है</translation>
 <translation id="2367972762794486313">ऐप्स  दिखाएं</translation>
 <translation id="2371076942591664043">&amp;पू्र्ण होने पर खोलें</translation>
 <translation id="2377319039870049694">'सूची की तरह देखें' पर स्विच करें</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">किसी वेबपेज पर टैब दबाने से लिंक के साथ-साथ फ़ॉर्म भी हाइलाइट होते हैं</translation>
 <translation id="2916745397441987255">एक्सटेंशन खोजें</translation>
 <translation id="2921081876747860777">कृपया अपने स्थानीय डेटा की सुरक्षा करने के लिए एक पासवर्ड बनाएं.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> में सिंक किया गया</translation>
 <translation id="2925966894897775835">पत्रक</translation>
 <translation id="2927017729816812676">संचय मेमोरी</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (बच्‍चों का खाता)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">बधाई</translation>
 <translation id="3349933790966648062">मेमोरी फ़ुटप्रिंट</translation>
 <translation id="3353984535370177728">अपलोड करने के लिए फ़ोल्डर चुनें</translation>
-<translation id="335581015389089642">बोली</translation>
 <translation id="3355936511340229503">कनेक्शन गड़बड़ी</translation>
 <translation id="3356797067524893661">Hangouts Meet पर जारी रखने के लिए आप बिल्कुल तैयार हैं</translation>
 <translation id="3358935496594837302">आपका फ़ोन नहीं मिल पा रहा है. पक्का करें कि आप ऐसे संगत Android फ़ोन का उपयोग कर रहे हैं जो चालू है और पहुंच में है. &lt;a&gt;अधिक जानें&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">नए टैब में &amp;खोलें</translation>
 <translation id="3616113530831147358">ऑडियो</translation>
 <translation id="3616741288025931835">ब्राउज़िंग डेटा &amp;साफ़ करें...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” को खोजें</translation>
 <translation id="3620292326130836921">सभी का बैक अप लिया गया!</translation>
 <translation id="3623574769078102674">यह निगरानी में रखा गया उपयोगकर्ता <ph name="MANAGER_EMAIL" /> द्वारा प्रबंधित किया जाएगा.</translation>
 <translation id="3625258641415618104">स्क्रीनशॉट अक्षम हैं</translation>
@@ -2143,7 +2141,6 @@
 <translation id="428565720843367874">इस फ़ाइल को स्कैन करते समय एंटी-वायरस साफ़्टवेयर अनपेक्षित रूप से विफल रहा.</translation>
 <translation id="428608937826130504">अलमारी आइटम 8</translation>
 <translation id="4287502004382794929">इस डिवाइस का नामांकन करने के लिए आपके पास पर्याप्त सॉफ़्टवेयर लाइसेंस नहीं हैं. कृपया और अधिक खरीदने के लिए विक्रय विभाग से संपर्क करें. यदि आपको लगता है कि आपको यह संदेश त्रुटिवश दिखाई दे रहा है, तो कृपया सहायता से संपर्क करें.</translation>
-<translation id="4289300219472526559">बोलना प्रारंभ करें</translation>
 <translation id="4289540628985791613">संक्षिप्त विवरण</translation>
 <translation id="4296575653627536209">निगरानी में रखा गया उपयोगकर्ता जोड़ें</translation>
 <translation id="4297322094678649474">भाषाएं बदलें</translation>
@@ -2404,6 +2401,7 @@
 <translation id="4748762018725435655">Chrome वेब स्टोर से एक्सटेंशन की आवश्यकता है</translation>
 <translation id="4750394297954878236">सुझाव</translation>
 <translation id="475088594373173692">प्रथम उपयोगकर्ता</translation>
+<translation id="4751476147751820511">गति या लाइट सेंसर</translation>
 <translation id="4756378406049221019">बंद करें/फिर से लोड करें</translation>
 <translation id="4756388243121344051">&amp;इतिहास</translation>
 <translation id="4759238208242260848">डाउनलोड</translation>
@@ -2438,7 +2436,6 @@
 <translation id="4813512666221746211">नेटवर्क गड़बड़ी</translation>
 <translation id="4816492930507672669">पेज में फ़िट करें</translation>
 <translation id="4820334425169212497">नहीं, मुझे वह दिखाई नहीं दे रहा</translation>
-<translation id="4821725298388681253">यह एक शुरुआती रिलीज़ है. खोज और लेख प्रविष्टि जैसी कुछ सुविधाएं अभी उपलब्ध नहीं हैं.</translation>
 <translation id="4821935166599369261">&amp;प्रोफ़ाइलिंग सक्षम</translation>
 <translation id="4823484602432206655">उपयोगकर्ता और डिवाइस सेटिंग पढ़ें और बदलें</translation>
 <translation id="4823651846660089135">डिवाइस केवल-पढ़ने के लिए है</translation>
@@ -2465,7 +2462,7 @@
 <translation id="4850669014075537160">स्क्रॉल करना</translation>
 <translation id="4850886885716139402">देखें</translation>
 <translation id="4853020600495124913">&amp;नई विंडो में खोलें</translation>
-<translation id="4853882474657327078">क्या आप चाहते हैं कि <ph name="ORIGIN" /> के लिए <ph name="PASSWORD_MANAGER_BRAND" /> आपका पासवर्ड अपडेट करे?</translation>
+<translation id="4853882474657327078">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" />, <ph name="ORIGIN" /> के लिए आपका पासवर्ड अपडेट करे?</translation>
 <translation id="4856478137399998590">आपकी मोबाइल डेटा सेवा सक्रिय कर दी गई है और उपयोग के लिए तैयार है</translation>
 <translation id="4857506433977877623">{COUNT,plural, =0{सभी को &amp;गुप्त विंडो में खोलें}=1{&amp;गुप्त विंडों में खोलें}one{सभी (#) को &amp;गुप्त विंडो में खोलें}other{सभी (#) को &amp;गुप्त विंडो में खोलें}}</translation>
 <translation id="4858913220355269194">फ्रिट्ज़</translation>
@@ -3449,7 +3446,6 @@
 <translation id="6388771388956873507">अपने डिवाइस पर फ़िंगरप्रिंट सेंसर ढूंढें और उस पर अपनी अंगुली से स्पर्श करें</translation>
 <translation id="6390799748543157332">इस विंडो में आपके द्वारा देखे जाने वाले पेज ब्राउज़र इतिहास में दिखाई नहीं देंगे और वे आपके द्वारा खोली गईं सभी अतिथि विंडो बंद करने के बाद कंप्यूटर पर कुकी जैसे अन्य चिह्न नहीं छोड़ेंगे. हालांकि, आपके द्वारा डाउनलोड की जाने वाली सभी फ़ाइलें संरक्षित कर ली जाएंगी.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />सिस्टम की जानकारी<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />मेट्रिक्स<ph name="END_LINK2" /> भेजें</translation>
-<translation id="6397363302884558537">बोलना रोकें</translation>
 <translation id="6397592254427394018">सभी बुकमार्क &amp;गुप्त विंडो में खोलें</translation>
 <translation id="6398715114293939307">Google Play स्टोर निकालें</translation>
 <translation id="6398765197997659313">पूर्ण स्क्रीन से बाहर निकलें</translation>
@@ -4022,6 +4018,7 @@
 <translation id="7297443947353982503">उपयोगकर्ता नाम/पासवर्ड गलत या EAP-प्रमाणीकरण विफल रहा</translation>
 <translation id="729761647156315797">अपनी भाषा और कीबोर्ड चुनें</translation>
 <translation id="7299337219131431707">मेहमान उपयोग सक्षम करें</translation>
+<translation id="7303900363563182677">इस साइट को क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज देखने से ब्लॉक कर दिया गया है</translation>
 <translation id="730515362922783851">स्‍थानीय नेटवर्क या इंटरनेट पर किसी भी डिवाइस से डेटा का अादान-प्रदान करें</translation>
 <translation id="7308002049209013926">नए ऐप और गतिविधियों तक तेज़ी से पहुंचने के लिए लॉन्चर का इस्तेमाल करें. कीबोर्ड से यहां पहुंचने के लिए, Alt + Shift + L दबाएं.</translation>
 <translation id="7309257895202129721">&amp;नियंत्रण दिखाएं</translation>
@@ -4403,6 +4400,7 @@
 <translation id="7909969815743704077">गुप्त मोड में डाउनलोड किया गया</translation>
 <translation id="7910768399700579500">&amp;नया फ़ोल्डर</translation>
 <translation id="7912080627461681647">सर्वर पर आपका पासवर्ड बदल दिया गया है. कृपया साइन आउट करें उसके बाद फिर से प्रवेश करें.</translation>
+<translation id="7912883689016444961">मोबाइल नेटवर्क कॉन्फ़िगर करें</translation>
 <translation id="7915471803647590281">कृपया फ़ीडबैक भेजने से पहले हमें बताएं कि क्‍या हो रहा है.</translation>
 <translation id="7925247922861151263">AAA जाँच विफल</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> की प्रतीक्षा कर रहा है...</translation>
@@ -4797,7 +4795,7 @@
 <translation id="8569682776816196752">कोई गंतव्य नहीं मिला</translation>
 <translation id="8569764466147087991">खोलने के लिए फ़ाइल को चुनें</translation>
 <translation id="8571213806525832805">पिछले 4 सप्ताह</translation>
-<translation id="8571613743082299268">इस साइट पर रीडायरेक्ट ब्लॉक किया गया है</translation>
+<translation id="8571613743082299268">इस साइट पर रीडायरेक्ट ब्लॉक किया हुआ है</translation>
 <translation id="8574990355410201600"><ph name="HOST" /> पर आवाज़ हमेशा चालू रखें</translation>
 <translation id="8578639784464423491">99 से ज़्यादा अक्षर नहीं हो सकते</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> आइटम समन्‍वयित कर रहा है...</translation>
@@ -4914,6 +4912,7 @@
 <translation id="8736288397686080465">इस साइट को पृष्‍ठभूमि में अपडेट किया गया है.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> के बजाय <ph name="PROTOCOL" /> लिंक खोलें</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">पिक्चर में पिक्चर</translation>
 <translation id="8743864605301774756">1 घंटे पहले अपडेट किया गया</translation>
 <translation id="8749863574775030885">किसी अज्ञात विक्रेता के USB डिवाइस ऐक्‍सेस करें</translation>
 <translation id="8754200782896249056">&lt;p&gt;किसी समर्थित डेस्कटॉप वातावरण के अंतर्गत <ph name="PRODUCT_NAME" /> चलाते समय, सिस्टम प्रॉक्सी सेटिंग का उपयोग किया जाएगा.  हालांकि, या तो आपका सिस्टम समर्थित नहीं है या आपके सिस्टम कॉन्फ़िगरेशन को लॉन्च करने में कोई समस्या थी.&lt;/p&gt;
@@ -5016,7 +5015,6 @@
 <translation id="8912793549644936705">खींचें</translation>
 <translation id="8915370057835397490">सुझाव लोड हो रहे हैं</translation>
 <translation id="8916476537757519021">गुप्त सबफ़्रेम: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> से सिंक करें</translation>
 <translation id="8922013791253848639">इस साइट पर विज्ञापनों की हमेशा अनुमति दें</translation>
 <translation id="8925458182817574960">&amp;सेटिंग</translation>
 <translation id="8926389886865778422">दोबारा न पूछें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 882d7d58..b7c197f 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Pritiskom na Tab na web-stranici ističu se veze, isto kao i iz polja</translation>
 <translation id="2916745397441987255">Pretražite proširenja</translation>
 <translation id="2921081876747860777">Napravite zaporku da biste zaštitili lokalne podatke.</translation>
-<translation id="2924395203970765374">Sinkronizirano s računom <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Tablice</translation>
 <translation id="2927017729816812676">Pohrana predmemorije</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (račun za djecu)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Čestitamo</translation>
 <translation id="3349933790966648062">Upotreba memorije</translation>
 <translation id="3353984535370177728">Odaberite mapu za prijenos</translation>
-<translation id="335581015389089642">Govor</translation>
 <translation id="3355936511340229503">Pogreška veze</translation>
 <translation id="3356797067524893661">Spremni ste za nastavak na Hangouts Meet</translation>
 <translation id="3358935496594837302">Telefon nije moguće pronaći. Provjerite je li vaš Android telefon kompatibilan i pri ruci. &lt;a&gt;Saznajte više&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Otvori u novoj kartici</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Obriši podatke o pregledavanju...</translation>
-<translation id="3618849550573277856">Potraži "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Sve je sigurnosno kopirano!</translation>
 <translation id="3623574769078102674">Tim nadziranim korisnikom upravljat će <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Snimke zaslona onemogućene su</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Antivirusni softver neočekivano je prekinuo s radom tijekom pretraživanja ove datoteke.</translation>
 <translation id="428608937826130504">Stavka police 8</translation>
 <translation id="4287502004382794929">Nemate dovoljno softverskih licenci za prijavu ovog uređaja. Obratite se prodaji da biste kupili više. Ako smatrate da vam se ova poruka prikazuje pogreškom, obratite se podršci.</translation>
-<translation id="4289300219472526559">Počni govoriti</translation>
 <translation id="4289540628985791613">Pregled</translation>
 <translation id="4296575653627536209">Dodaj nadziranog korisnika</translation>
 <translation id="4297322094678649474">Promijeni jezike</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Pogreška mreže</translation>
 <translation id="4816492930507672669">Prilagodi stranici</translation>
 <translation id="4820334425169212497">Ne, ne vidim</translation>
-<translation id="4821725298388681253">Ovo je rano izdanje. Neke značajke, primjerice pretraživanje i unos teksta, još nisu dostupne.</translation>
 <translation id="4821935166599369261">&amp;Profiliranje omogućeno</translation>
 <translation id="4823484602432206655">čitati i mijenjati korisničke postavke i postavke uređaja</translation>
 <translation id="4823651846660089135">Uređaj je samo za čitanje</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Pronađite senzor otiska prsta na uređaju i dodirnite ga prstom</translation>
 <translation id="6390799748543157332">Stranice koje gledate u ovom prozoru neće se pojaviti u povijesti preglednika niti će ostaviti druge tragove, poput kolačića, na računalu nakon što zatvorite sve otvorene gostujuće prozore. Međutim, datoteke koje preuzmete sačuvat će se.</translation>
 <translation id="6395423953133416962">Šalji <ph name="BEGIN_LINK1" />informacije o sustavu<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />mjerne podatke<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Prestani govoriti</translation>
 <translation id="6397592254427394018">Otvaranje svih oznaka u anonimnom prozoru</translation>
 <translation id="6398715114293939307">Ukloni Trgovinu Google Play</translation>
 <translation id="6398765197997659313">Izađi iz cijelog zaslona</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Rastegni</translation>
 <translation id="8915370057835397490">Učitavanje prijedloga</translation>
 <translation id="8916476537757519021">Anonimni podokvir: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sinkroniziraj s računom <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Uvijek dopusti oglase na ovoj web-lokaciji</translation>
 <translation id="8925458182817574960">&amp;Postavke</translation>
 <translation id="8926389886865778422">Više me ne pitaj</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 0e0c0e3..e02d70b 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -31,7 +31,7 @@
 <translation id="1039337018183941703">Érvénytelen vagy sérült fájl</translation>
 <translation id="1042174272890264476">Számítógépe a <ph name="SHORT_PRODUCT_NAME" /> RLZ-könyvtárát is tartalmazza beépítve. Az RLZ egy nem egyedi, személy szerinti azonosításra nem alkalmas címkét rendel hozzá a keresések és a <ph name="SHORT_PRODUCT_NAME" /> használatának egy adott promóciós kampány keretein belüli felméréséhez. Ezek a címkék időnként a <ph name="PRODUCT_NAME" /> Google-keresési lekérdezéseiben is feltűnnek.</translation>
 <translation id="1046059554679513793">Hoppá, ez a név már foglalt!</translation>
-<translation id="1046286965898806214">Szeretné, hogy a(z) <ph name="PASSWORD_MANAGER_BRAND" /> mentse a fiókot ehhez a webhelyhez?</translation>
+<translation id="1046286965898806214">Szeretné, hogy a(z) <ph name="PASSWORD_MANAGER_BRAND" /> mentse a webhelyhez tartozó fiókot?</translation>
 <translation id="1047431265488717055">Link szövegének má&amp;solása</translation>
 <translation id="1047726139967079566">Könyvjelző hozzáadása ehhez az oldalhoz...</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> elem törlése...</translation>
@@ -352,7 +352,7 @@
 <translation id="152234381334907219">Soha nem került mentésre</translation>
 <translation id="1524430321211440688">Billentyűzet</translation>
 <translation id="1524563461097350801">Köszönöm, nem</translation>
-<translation id="1525740877599838384">Csak Wi-Fi használata a tartózkodási hely megállapításához</translation>
+<translation id="1525740877599838384">Csak a Wi-Fi használata a tartózkodási hely megállapításához</translation>
 <translation id="1526560967942511387">Név nélküli dokumentum</translation>
 <translation id="1526925867532626635">Szinkronizálás beállításainak megerősítése</translation>
 <translation id="1529116897397289129">A mentett kártyák itt jelennek meg</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Bővítményeit az Eszközök menü Bővítmények elemére kattintva kezelheti.</translation>
 <translation id="2359808026110333948">Folytatás</translation>
 <translation id="236141728043665931">Mikrofon elérésének állandó tiltása</translation>
+<translation id="2365507699358342471">Ez a webhely megtekintheti a vágólapra másolt szövegeket és képeket.</translation>
 <translation id="2367972762794486313">Alkalmazások megjelenítése</translation>
 <translation id="2371076942591664043">Megnyitás, amikor &amp;kész</translation>
 <translation id="2377319039870049694">Váltás listanézetre</translation>
@@ -1149,10 +1150,10 @@
 <translation id="2762441749940182211">Kamera letiltva</translation>
 <translation id="2765217105034171413">Kicsi</translation>
 <translation id="2766006623206032690">Beille&amp;sztés és ugrás</translation>
-<translation id="2767084307624729667"><ph name="ORIGIN" /> mentett jelszavai</translation>
+<translation id="2767084307624729667">A(z) <ph name="ORIGIN" /> mentett jelszavai</translation>
 <translation id="276969039800130567">Bejelentkezve a következőként: <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="2770465223704140727">Eltávolítás a listából</translation>
-<translation id="2770690685823456775">Exportálja a jelszavakat valamelyik másik mappába</translation>
+<translation id="2770690685823456775">Exportálja a jelszavakat egy másik mappába</translation>
 <translation id="2771268254788431918">Mobiladat-forgalom aktiválva</translation>
 <translation id="2772936498786524345">Ninja</translation>
 <translation id="2773802008104670137">Ez a fájltípus árthat a számítógépnek.</translation>
@@ -1235,7 +1236,7 @@
 <translation id="2871813825302180988">Ez a fiók már használatban van ezen az eszközön.</translation>
 <translation id="2872353916818027657">Elsődleges monitor felcserélése</translation>
 <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> hozzáadása...</translation>
-<translation id="2874343608108773609">Ha az összes eszközén szeretné elérni jelszavait, jelentkezzen be a Chrome-ba.</translation>
+<translation id="2874343608108773609">Ha az összes eszközén szeretné elérni könyvjelzőit, jelentkezzen be a Chrome-ba.</translation>
 <translation id="2875698561019555027">(Chrome-hibaoldalak)</translation>
 <translation id="288042212351694283">U2F (Universal 2nd Factor) eszközökhöz való hozzáférés</translation>
 <translation id="2881966438216424900">Utolsó hozzáférés ideje:</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">A Tab billentyű megnyomása a weboldalakon kiemeli a linkeket és a beviteli mezőket</translation>
 <translation id="2916745397441987255">Bővítmények keresése</translation>
 <translation id="2921081876747860777">Hozzon létre jelszót a helyi adatok védelme érdekében.</translation>
-<translation id="2924395203970765374">Szinkronizálva a következő fiókkal: <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Táblázatok</translation>
 <translation id="2927017729816812676">Gyorsítótár</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Gyermekeknek készített fiók)</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">Gratulálunk</translation>
 <translation id="3349933790966648062">Memóriamennyiség</translation>
 <translation id="3353984535370177728">Válassza ki a feltölteni kívánt mappát</translation>
-<translation id="335581015389089642">Beszéd</translation>
 <translation id="3355936511340229503">Kapcsolódási hiba</translation>
 <translation id="3356797067524893661">Készen áll a Hangouts Meet használatára</translation>
 <translation id="3358935496594837302">A telefon nem található. Győződjön meg arról, hogy kompatibilis, bekapcsolt Android-telefonja kéznél van. &lt;a&gt;További információ&lt;/a&gt;.</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">&amp;Megnyitás új lapon</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Böngészés adatainak törlése...</translation>
-<translation id="3618849550573277856">A(z) „<ph name="LOOKUP_STRING" />” keresése</translation>
 <translation id="3620292326130836921">Mindenről készült biztonsági másolat!</translation>
 <translation id="3623574769078102674">A felügyelt felhasználó felettese <ph name="MANAGER_EMAIL" /> lesz.</translation>
 <translation id="3625258641415618104">Képernyőképek letiltva</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">A fájl vizsgálata közben a víruskereső program váratlanul leállt.</translation>
 <translation id="428608937826130504">8. polcelem</translation>
 <translation id="4287502004382794929">Ön nem rendelkezik elegendő szoftverlicenccel az eszköz regisztrálásához. Kérjük, vegye fel a kapcsolatot az értékesítéssel továbbiak vásárlásához. Ha úgy gondolja, ezt az üzenetet hibásan kapta meg, kérjük, forduljon az ügyfélszolgálathoz.</translation>
-<translation id="4289300219472526559">Beszéd megkezdése</translation>
 <translation id="4289540628985791613">Áttekintés</translation>
 <translation id="4296575653627536209">Felügyelt felhasználók hozzáadása</translation>
 <translation id="4297322094678649474">Nyelvek módosítása</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Bővítményre van szüksége a Chrome Internetes áruházból</translation>
 <translation id="4750394297954878236">Javaslatok</translation>
 <translation id="475088594373173692">Első felhasználó</translation>
+<translation id="4751476147751820511">Mozgás- és fényérzékelők</translation>
 <translation id="4756378406049221019">Leállítás/Újratöltés</translation>
 <translation id="4756388243121344051">&amp;Előzmények</translation>
 <translation id="4759238208242260848">Letöltések</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Hálózati hiba</translation>
 <translation id="4816492930507672669">Igazítás az oldalmérethez</translation>
 <translation id="4820334425169212497">Nem látom</translation>
-<translation id="4821725298388681253">Ez egy korai kiadás. Egyes funkciók, mint például a keresés és a szövegbevitel még nem állnak rendelkezésre.</translation>
 <translation id="4821935166599369261">&amp;Profilozás bekapcsolva</translation>
 <translation id="4823484602432206655">A felhasználó és az eszköz beállításainak olvasása és módosítása</translation>
 <translation id="4823651846660089135">Az eszköz csak olvasható</translation>
@@ -3452,7 +3449,6 @@
 <translation id="6388771388956873507">Keresse meg az eszköz ujjlenyomat-érzékelőjét, és érintse meg ujjával</translation>
 <translation id="6390799748543157332">Az ebben az ablakban megtekintett oldalak a vendégmódban megnyitott ablakok bezárását követően nem fognak megjelenni a böngészési előzmények között, és nem hagynak egyéb nyomokat, például cookie-kat a számítógépen. Azonban az Ön által letöltött fájlokat a rendszer megőrzi.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Rendszer-információk<ph name="END_LINK1" /> és <ph name="BEGIN_LINK2" />mutatószámok<ph name="END_LINK2" /> küldése</translation>
-<translation id="6397363302884558537">Beszéd leállítása</translation>
 <translation id="6397592254427394018">Az összes könyvjelző megnyitása &amp;inkognitóablakban</translation>
 <translation id="6398715114293939307">A Google Play Áruház eltávolítása</translation>
 <translation id="6398765197997659313">Kilépés a teljes képernyős módból</translation>
@@ -3633,7 +3629,7 @@
 <translation id="6659594942844771486">Lap</translation>
 <translation id="6664237456442406323">Sajnos számítógépe nem megfelelő formátumú hardverazonosítóval van konfigurálva. Emiatt a Chrome OS nem tud frissülni a legújabb biztonsági javításokkal, és számítógépét <ph name="BEGIN_BOLD" />rosszindulatú támadások érhetik<ph name="END_BOLD" />.</translation>
 <translation id="6664774537677393800">Hiba történt a profil megnyitása során. Jelentkezzen ki, majd jelentkezzen be újra.</translation>
-<translation id="6669827579181361875">Szeretné, hogy a(z) <ph name="PASSWORD_MANAGER_BRAND" /> mentse a jelszót ehhez a webhelyhez?</translation>
+<translation id="6669827579181361875">Szeretné, hogy a(z) <ph name="PASSWORD_MANAGER_BRAND" /> mentse a webhelyhez tartozó jelszót?</translation>
 <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation>
 <translation id="667517062706956822">Szeretné, hogy a Google lefordítsa az oldalt <ph name="SOURCE_LANGUAGE" /> nyelvről <ph name="TARGET_LANGUAGE" /> nyelvre?</translation>
 <translation id="6675665718701918026">Mutatóeszköz csatlakoztatva</translation>
@@ -4011,7 +4007,7 @@
 <translation id="7279701417129455881">Cookie-k letiltásának kezelése...</translation>
 <translation id="7280041992884344566">Hiba történt, miközben a Chrome kártékony szoftvereket keresett</translation>
 <translation id="7280877790564589615">Engedély kérelmezve</translation>
-<translation id="7282992757463864530">Infósáv</translation>
+<translation id="7282992757463864530">Információs sáv</translation>
 <translation id="7283041136720745563">Nem elegendő az Ön Google Drive-kvótája.</translation>
 <translation id="7287143125007575591">Hozzáférés megtagadva.</translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" /> × <ph name="VERTICAL_DPI" /> dpi</translation>
@@ -4025,6 +4021,7 @@
 <translation id="7297443947353982503">Helytelen a felhasználónév vagy a jelszó, vagy nem sikerült az EAP-hitelesítés</translation>
 <translation id="729761647156315797">Nyelv és billentyűzet kiválasztása</translation>
 <translation id="7299337219131431707">Vendégként való böngészés engedélyezése</translation>
+<translation id="7303900363563182677">Ennél a webhelynél le van tiltva a vágólapra másolt szövegek és képek megtekintése</translation>
 <translation id="730515362922783851">Adatok cseréje bármilyen eszközzel a helyi hálózaton vagy az interneten</translation>
 <translation id="7308002049209013926">Az Indító használatával gyorsabban juthat el az új alkalmazásokhoz és tevékenységekhez. Ha a billentyűzet segítségével szeretne ide eljutni, használja az Alt+Shift+l billentyűparancsot.</translation>
 <translation id="7309257895202129721">&amp;Vezérlők megjelenítése</translation>
@@ -4406,6 +4403,7 @@
 <translation id="7909969815743704077">Letöltve inkognitó módban</translation>
 <translation id="7910768399700579500">&amp;Új mappa</translation>
 <translation id="7912080627461681647">A jelszó megváltozott a szerveren. Jelentkezzen ki, majd jelentkezzen be újra.</translation>
+<translation id="7912883689016444961">Mobilhálózat beállítása</translation>
 <translation id="7915471803647590281">Kérjük, mondja el, mi történik, mielőtt elküldené a visszajelzést.</translation>
 <translation id="7925247922861151263">AAA-ellenőrzés sikertelen</translation>
 <translation id="7925285046818567682">Várakozás a szerverre: <ph name="HOST_NAME" />...</translation>
@@ -4748,7 +4746,7 @@
 <translation id="8465444703385715657">A(z) <ph name="PLUGIN_NAME" /> futtatásához az Ön engedélyére van szükség</translation>
 <translation id="8466234950814670489">Tar-archívum</translation>
 <translation id="8468750959626135884">Oldja fel <ph name="DEVICE_TYPE" /> eszközét androidos telefonjával.</translation>
-<translation id="8470513973197838199"><ph name="ORIGIN" /> mentett jelszavai</translation>
+<translation id="8470513973197838199">A(z) <ph name="ORIGIN" /> mentett jelszavai</translation>
 <translation id="8472623782143987204">hardvertámogatott</translation>
 <translation id="8475313423285172237">A számítógépen lévő egyik program olyan bővítményt adott hozzá, amely módosíthatja a Chrome működését.</translation>
 <translation id="8475647382427415476">A Google Drive most nem tudta szinkronizálni a következőt: „<ph name="FILENAME" />”, de később ismét megpróbálja.</translation>
@@ -4917,6 +4915,7 @@
 <translation id="8736288397686080465">Ez a webhely frissült a háttérben.</translation>
 <translation id="8737685506611670901"><ph name="PROTOCOL" /> linkek megnyitása a(z) <ph name="REPLACED_HANDLER_TITLE" /> helyett</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Kép a képben</translation>
 <translation id="8743864605301774756">Frissítve: 1 órával ezelőtt</translation>
 <translation id="8749863574775030885">Ismeretlen szolgáltatótól származó USB-eszközök elérése</translation>
 <translation id="8754200782896249056">&lt;p&gt;Ha a <ph name="PRODUCT_NAME" /> támogatott asztali környezetben fut, akkor a rendszer proxybeállításait használja. Most azonban vagy a rendszer nem támogatott, vagy gond volt a rendszerkonfiguráció elindításával.&lt;/p&gt;
@@ -5019,7 +5018,6 @@
 <translation id="8912793549644936705">Nyújtva</translation>
 <translation id="8915370057835397490">Javaslatok betöltése</translation>
 <translation id="8916476537757519021">Inkognitó subframe: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Szinkronizálás a következő fiókkal: <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Mindig engedélyezi a hirdetéseket ezen a webhelyen</translation>
 <translation id="8925458182817574960">&amp;Beállítások</translation>
 <translation id="8926389886865778422">Többször ne figyelmeztessen</translation>
@@ -5048,7 +5046,7 @@
 <translation id="8962083179518285172">Részletek elrejtése</translation>
 <translation id="8965037249707889821">Adja meg a régi jelszót</translation>
 <translation id="8965697826696209160">Nincs elég tárhely.</translation>
-<translation id="8967866634928501045">A megjelenítéshez nyomja le az Alt Shift A billentyűparancsot</translation>
+<translation id="8967866634928501045">A megjelenítéshez nyomja le az Alt+Shift+A billentyűparancsot</translation>
 <translation id="8970203673128054105">Átküldési módok listájának megtekintése</translation>
 <translation id="89720367119469899">Vezérlő</translation>
 <translation id="8973557916016709913">Nagyítási szint eltávolítása</translation>
@@ -5200,7 +5198,7 @@
 <translation id="932327136139879170">Főoldal</translation>
 <translation id="932508678520956232">Nem sikerült előkészíteni a nyomtatást.</translation>
 <translation id="93393615658292258">Csak jelszó</translation>
-<translation id="934503638756687833">Szükség esetén a listán nem szereplő elemek is el lesznek távolítva. A &lt;a href="<ph name="URL" />"&gt;nem kívánt szoftverek elleni védelemről&lt;/a&gt; a Chrome adatvédelemmel foglalkozó útmutatójában talál további információt.</translation>
+<translation id="934503638756687833">A listán nem szereplő elemeket szükség szerint el is lehet távolítani. A &lt;a href="<ph name="URL" />"&gt;nem kívánt szoftverek elleni védelemről&lt;/a&gt; a Chrome adatvédelemmel foglalkozó útmutatójában talál további információt.</translation>
 <translation id="935490618240037774">A böngésző szinkronizálni fogja a könyvjelzőket, az előzményeket, a jelszavakat és az egyéb beállításokat Google-fiókjával, hogy bármelyik eszközén hozzájuk férjen.</translation>
 <translation id="936801553271523408">Rendszerdiagnosztikai adatok</translation>
 <translation id="93766956588638423">Bővítmény javítása</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 2abaf97..e4f6a48 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Menekan Tab pada halaman web akan menyorot link, juga bidang formulir</translation>
 <translation id="2916745397441987255">Telusuri ekstensi</translation>
 <translation id="2921081876747860777">Buat sandi untuk melindungi data lokal Anda.</translation>
-<translation id="2924395203970765374">Disinkronkan ke <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Spreadsheet</translation>
 <translation id="2927017729816812676">Penyimpanan Cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Akun untuk anak)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Selamat</translation>
 <translation id="3349933790966648062">Jejak Memori</translation>
 <translation id="3353984535370177728">Pilih folder untuk diunggah</translation>
-<translation id="335581015389089642">Ucapan</translation>
 <translation id="3355936511340229503">Kesalahan sambungan</translation>
 <translation id="3356797067524893661">Anda siap untuk melanjutkan ke Hangouts Meet</translation>
 <translation id="3358935496594837302">Ponsel tidak dapat ditemukan. Pastikan Anda menggunakan ponsel Android yang kompatibel yang aktif dan ada dalam jangkauan. &lt;a&gt;Pelajari lebih lanjut&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Buka di tab baru</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Hapus Data browsing...</translation>
-<translation id="3618849550573277856">Cari "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Semua dicadangkan!</translation>
 <translation id="3623574769078102674">Pengguna yang diawasi ini akan dikelola oleh <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Screenshot dinonaktifkan</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Software antivirus gagal secara tak terduga saat memindai file ini.</translation>
 <translation id="428608937826130504">Item rak 8</translation>
 <translation id="4287502004382794929">Anda tidak memiliki cukup lisensi software untuk mendaftarkan perangkat ini. Hubungi pihak penjualan untuk membeli yang lainnya. Jika Anda yakin Anda tidak seharusnya mendapatkan pesan ini, hubungi dukungan.</translation>
-<translation id="4289300219472526559">Mulai Berbicara</translation>
 <translation id="4289540628985791613">Ikhtisar</translation>
 <translation id="4296575653627536209">Tambahkan Pengguna yang Dilindungi</translation>
 <translation id="4297322094678649474">Ubah Bahasa</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Kesalahan jaringan</translation>
 <translation id="4816492930507672669">Paskan dengan halaman</translation>
 <translation id="4820334425169212497">Tidak, saya tidak melihatnya</translation>
-<translation id="4821725298388681253">Ini adalah rilis awal. Beberapa fitur, seperti penelusuran dan entri teks, belum tersedia.</translation>
 <translation id="4821935166599369261">&amp;Penyidikan Diaktifkan</translation>
 <translation id="4823484602432206655">Membaca dan mengubah setelan perangkat dan pengguna</translation>
 <translation id="4823651846660089135">Perangkat berstatus hanya-baca</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Temukan sensor sidik jari di perangkat dan sentuh sensor tersebut dengan jari Anda</translation>
 <translation id="6390799748543157332">Halaman yang Anda lihat di jendela ini tidak akan muncul dalam histori browser dan tidak meninggalkan jejak lain, seperti cookie, di komputer setelah Anda menutup semua jendela Tamu yang terbuka. Namun, file apa pun yang Anda download akan tersimpan.</translation>
 <translation id="6395423953133416962">Kirim <ph name="BEGIN_LINK1" />informasi sistem<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />metrik<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Berhenti Berbicara</translation>
 <translation id="6397592254427394018">Buka semua bookmark di &amp;jendela penyamaran</translation>
 <translation id="6398715114293939307">Hapus Google Play Store</translation>
 <translation id="6398765197997659313">Keluar dari tampilan layar penuh</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Meregang</translation>
 <translation id="8915370057835397490">Memuat saran</translation>
 <translation id="8916476537757519021">Subkerangka Mode Penyamaran: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sinkronkan ke <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Selalu izinkan iklan di situs ini</translation>
 <translation id="8925458182817574960">&amp;Setelan</translation>
 <translation id="8926389886865778422">Jangan tanya lagi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 1961ab2..d3c1cc84 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -725,7 +725,7 @@
 <translation id="2128691215891724419">Errore di sincronizzazione. Aggiorna la passphrase di sincronizzazione...</translation>
 <translation id="2129825002735785149">Aggiorna il plug-in</translation>
 <translation id="2129904043921227933">Errore di sincronizzazione. Aggiorna la passphrase di sincronizzazione...</translation>
-<translation id="2130949041518253417">Attiva la sincronizzazione per avere un'esperienza di navigazione personalizzata sui tuoi dispositivi</translation>
+<translation id="2130949041518253417">Sincronizza per un'esperienza di navigazione personalizzata, attraverso i tuoi dispositivi</translation>
 <translation id="2131077480075264">Impossibile installare "<ph name="APP_NAME" />" perché non è consentita da "<ph name="IMPORT_NAME" />"</translation>
 <translation id="2135787500304447609">&amp;Riprendi</translation>
 <translation id="2136372518715274136">Inserisci la nuova password</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Gestisci le tue estensioni facendo clic su Estensioni nel menu Strumenti.</translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="236141728043665931">Impedisci sempre l'accesso al microfono</translation>
+<translation id="2365507699358342471">Questo sito può leggere testo e immagini copiati negli appunti</translation>
 <translation id="2367972762794486313">Mostra app</translation>
 <translation id="2371076942591664043">Apri al &amp;termine</translation>
 <translation id="2377319039870049694">Passa alla visualizzazione elenco</translation>
@@ -1268,7 +1269,6 @@
 <translation id="2916073183900451334">Se premi Tab in una pagina web vengono evidenziati i link, così come i campi dei moduli</translation>
 <translation id="2916745397441987255">Cerca tra le estensioni</translation>
 <translation id="2921081876747860777">Crea una password per proteggere i tuoi dati locali.</translation>
-<translation id="2924395203970765374">Sincronizzato con <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Fogli</translation>
 <translation id="2927017729816812676">Spazio di archiviazione cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (account di minori)</translation>
@@ -1549,7 +1549,6 @@
 <translation id="3348459612390503954">Complimenti</translation>
 <translation id="3349933790966648062">Footprint di memoria</translation>
 <translation id="3353984535370177728">Seleziona una cartella da caricare</translation>
-<translation id="335581015389089642">Voce</translation>
 <translation id="3355936511340229503">Errore di connessione</translation>
 <translation id="3356797067524893661">Sei pronto per continuare su Hangouts Meet</translation>
 <translation id="3358935496594837302">Impossibile trovare il telefono. Assicurati di usare un telefono Android compatibile che sia acceso e a portata di mano. &lt;a&gt;Ulteriori informazioni&lt;/a&gt;</translation>
@@ -1726,7 +1725,6 @@
 <translation id="3613422051106148727">&amp;Apri in un'altra scheda</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Cancella dati di navigazione...</translation>
-<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Backup di tutti i contenuti completato.</translation>
 <translation id="3623574769078102674">Questo utente supervisionato verrà gestito da <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Screenshot disabilitati</translation>
@@ -2136,12 +2134,11 @@
 <translation id="4281844954008187215">Termini di servizio</translation>
 <translation id="4282196459431406533">Funzione Smart Lock attiva</translation>
 <translation id="4284105660453474798">Eliminare "$1"?</translation>
-<translation id="4285418559658561636">Aggiorna password</translation>
+<translation id="4285418559658561636">Aggiorna Password</translation>
 <translation id="4285498937028063278">Sblocca</translation>
 <translation id="428565720843367874">La scansione del software antivirus non è inaspettatamente riuscita durante la scansione di questo file.</translation>
 <translation id="428608937826130504">Elemento 8 della shelf</translation>
 <translation id="4287502004382794929">Non disponi di licenze software sufficienti per registrare questo dispositivo. Contatta l'ufficio vendite per acquistarne altre. Se ritieni che questo messaggio sia stato visualizzato per sbaglio, contatta l'assistenza.</translation>
-<translation id="4289300219472526559">Avvia comandi vocali</translation>
 <translation id="4289540628985791613">Panoramica</translation>
 <translation id="4296575653627536209">Aggiungi utente supervisionato</translation>
 <translation id="4297322094678649474">Cambia le lingue</translation>
@@ -2402,6 +2399,7 @@
 <translation id="4748762018725435655">Richiede estensione dal Chrome Web Store</translation>
 <translation id="4750394297954878236">Suggerimenti</translation>
 <translation id="475088594373173692">Primo utente</translation>
+<translation id="4751476147751820511">Sensori di movimento o della luce</translation>
 <translation id="4756378406049221019">Interrompi/Ricarica</translation>
 <translation id="4756388243121344051">&amp;Cronologia</translation>
 <translation id="4759238208242260848">Download</translation>
@@ -2436,7 +2434,6 @@
 <translation id="4813512666221746211">Errore di rete</translation>
 <translation id="4816492930507672669">Adatta alla pagina</translation>
 <translation id="4820334425169212497">No, non lo vedo</translation>
-<translation id="4821725298388681253">Si tratta di una versione in anteprima. Alcune funzioni, ad esempio la ricerca e l'immissione di testo, non sono ancora disponibili.</translation>
 <translation id="4821935166599369261">&amp;Profiling attivato</translation>
 <translation id="4823484602432206655">Lettura e modifica delle impostazioni utente e dispositivo</translation>
 <translation id="4823651846660089135">Il dispositivo è in sola lettura</translation>
@@ -2819,7 +2816,7 @@
 <translation id="5398772614898833570">Annunci bloccati</translation>
 <translation id="5402815541704507626">Scarica l'aggiornamento usando i dati mobili</translation>
 <translation id="540296380408672091">Blocca sempre i cookie su <ph name="HOST" /></translation>
-<translation id="5405146885510277940">Reimposta impostazioni</translation>
+<translation id="5405146885510277940">Reimposta</translation>
 <translation id="5408750356094797285">Zoom: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">Sorprendimi</translation>
 <translation id="5411472733320185105">Non utilizzare le impostazioni proxy per i seguenti host e domini:</translation>
@@ -3446,7 +3443,6 @@
 <translation id="6388771388956873507">Individua il sensore di impronte digitali sul dispositivo e toccalo con il dito</translation>
 <translation id="6390799748543157332">Le pagine visualizzate in questa finestra non verranno memorizzate nella cronologia del browser e non lasceranno altre tracce, ad esempio cookie, sul computer dopo la chiusura di tutte le finestre Ospite aperte. Tutti i file scaricati verranno comunque conservati.</translation>
 <translation id="6395423953133416962">Invia <ph name="BEGIN_LINK1" />informazioni di sistema<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />metriche<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Interrompi comandi vocali</translation>
 <translation id="6397592254427394018">Apri tutti i Preferiti nella finestra di navigazione in &amp;incognito</translation>
 <translation id="6398715114293939307">Rimuovi il Google Play Store</translation>
 <translation id="6398765197997659313">Esci da schermo intero</translation>
@@ -4019,6 +4015,7 @@
 <translation id="7297443947353982503">Nome utente/password errati o autenticazione EAP non riuscita</translation>
 <translation id="729761647156315797">Scegli la lingua e la tastiera</translation>
 <translation id="7299337219131431707">Attiva navigazione come ospite</translation>
+<translation id="7303900363563182677">A questo sito è stato impedito di leggere testo e immagini copiati negli appunti</translation>
 <translation id="730515362922783851">Scambiare dati con qualsiasi dispositivo sulla rete locale o su Internet</translation>
 <translation id="7308002049209013926">Usa Avvio applicazioni per accedere rapidamente a nuove app e attività. Per accedere usando la tastiera, premi ALT + MAIUSC + L.</translation>
 <translation id="7309257895202129721">Visualizza &amp;comandi</translation>
@@ -4391,6 +4388,7 @@
 <translation id="7909969815743704077">Scaricato in modalità in incognito</translation>
 <translation id="7910768399700579500">&amp;Nuova cartella</translation>
 <translation id="7912080627461681647">La password è stata modificata sul server. Esci e accedi nuovamente.</translation>
+<translation id="7912883689016444961">Configura la rete mobile</translation>
 <translation id="7915471803647590281">Comunicaci cosa sta accadendo prima di inviare il feedback.</translation>
 <translation id="7925247922861151263">Controllo AAA non riuscito</translation>
 <translation id="7925285046818567682">In attesa di risposta da <ph name="HOST_NAME" />...</translation>
@@ -4785,7 +4783,7 @@
 <translation id="8569682776816196752">Nessuna destinazione trovata</translation>
 <translation id="8569764466147087991">Seleziona un file da aprire</translation>
 <translation id="8571213806525832805">Ultime 4 settimane</translation>
-<translation id="8571613743082299268">Reindirizzamento bloccato al seguente sito:</translation>
+<translation id="8571613743082299268">Reindirizzamento bloccato al seguente sito</translation>
 <translation id="8574990355410201600">Consenti sempre l'audio su <ph name="HOST" /></translation>
 <translation id="8578639784464423491">Non può superare le 99 lettere</translation>
 <translation id="8579285237314169903">Sincronizzazione di <ph name="NUMBER_OF_FILES" /> elementi...</translation>
@@ -4902,6 +4900,7 @@
 <translation id="8736288397686080465">Il sito è stato aggiornato in background.</translation>
 <translation id="8737685506611670901">Aprire link <ph name="PROTOCOL" /> anziché <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8743864605301774756">Aggiornata 1 ora fa</translation>
 <translation id="8749863574775030885">Accedi a dispositivi USB di fornitori sconosciuti</translation>
 <translation id="8754200782896249056">&lt;p&gt;Quando esegui <ph name="PRODUCT_NAME" /> in un ambiente desktop supportato, vengono utilizzate le impostazioni proxy del sistema. Tuttavia, il tuo sistema non è supportato o si è verificato un problema durante l'avvio della tua configurazione di sistema.&lt;/p&gt;
@@ -5004,7 +5003,6 @@
 <translation id="8912793549644936705">Allunga</translation>
 <translation id="8915370057835397490">Caricamento suggerimento</translation>
 <translation id="8916476537757519021">Frame secondario modalità di navigazione in incognito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizza con <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Consenti sempre gli annunci su questo sito</translation>
 <translation id="8925458182817574960">&amp;Impostazioni</translation>
 <translation id="8926389886865778422">Non visualizzare più questo avviso</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 50b8e701..45be0e3 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1266,7 +1266,6 @@
 <translation id="2916073183900451334">‏לחיצה על המקש Tab תדגיש קישורים בדף וכן שדות של טפסים</translation>
 <translation id="2916745397441987255">חפש תוספים</translation>
 <translation id="2921081876747860777">יצירת סיסמה להגנה על הנתונים המקומיים שלך.</translation>
-<translation id="2924395203970765374">מסונכרן עם <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">גיליונות אלקטרוניים</translation>
 <translation id="2927017729816812676">אחסון קובצי מטמון</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (חשבון בשביל ילדים)</translation>
@@ -1548,7 +1547,6 @@
 <translation id="3348459612390503954">ברכותינו</translation>
 <translation id="3349933790966648062">הזיכרון שבשימוש</translation>
 <translation id="3353984535370177728">בחר תיקיה להעלאה</translation>
-<translation id="335581015389089642">דיבור</translation>
 <translation id="3355936511340229503">שגיאת חיבור</translation>
 <translation id="3356797067524893661">‏הכול מוכן ואפשר להמשיך אל Hangouts Meet</translation>
 <translation id="3358935496594837302">‏לא ניתן למצוא את הטלפון שלך. יש לוודא שימוש בטלפון Android תואם ושהוא מופעל ונמצא בקרבתך. &lt;a&gt;למידע נוסף&lt;/a&gt;</translation>
@@ -1725,7 +1723,6 @@
 <translation id="3613422051106148727">&amp;פתח בכרטיסייה חדשה</translation>
 <translation id="3616113530831147358">אודיו</translation>
 <translation id="3616741288025931835">&amp;נקה נתוני גלישה...</translation>
-<translation id="3618849550573277856">חפש “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">הכל מגובה!</translation>
 <translation id="3623574769078102674">משתמש בפיקוח זה ינוהל על ידי <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">צילומי מסך מושבתים</translation>
@@ -2140,7 +2137,6 @@
 <translation id="428565720843367874">תוכנת האנטי-וירוס נכשלה באופן בלתי צפוי בעת סריקת קובץ זה.</translation>
 <translation id="428608937826130504">פריט מדף 8</translation>
 <translation id="4287502004382794929">אין ברשותך מספיק רשיונות תוכנה כדי לרשום מכשיר זה. פנה למחלקת המכירות כדי לרכוש עוד רשיונות. אם אתה סבור שהודעה זו מופיעה בטעות, צור קשר עם מחלקת התמיכה.</translation>
-<translation id="4289300219472526559">התחל לדבר</translation>
 <translation id="4289540628985791613">סקירה כללית</translation>
 <translation id="4296575653627536209">הוסף משתמש בפיקוח</translation>
 <translation id="4297322094678649474">החלפת שפות</translation>
@@ -2435,7 +2431,6 @@
 <translation id="4813512666221746211">שגיאת רשת</translation>
 <translation id="4816492930507672669">התאמה לדף</translation>
 <translation id="4820334425169212497">לא, אני לא רואה אותו</translation>
-<translation id="4821725298388681253">זוהי הפצה מוקדמת. חלק מהתכונות, כמו חיפוש והזנת טקסט, עדיין לא זמינות.</translation>
 <translation id="4821935166599369261">&amp;יצירת פרופילים מופעלת</translation>
 <translation id="4823484602432206655">קריאה ושינוי של הגדרות המשתמש והמכשיר</translation>
 <translation id="4823651846660089135">המכשיר מוגדר לקריאה בלבד</translation>
@@ -3447,7 +3442,6 @@
 <translation id="6388771388956873507">מצא את חיישן טביעות האצבע במכשיר וגע בו עם האצבע</translation>
 <translation id="6390799748543157332">‏הדפים שאתה מציג בחלון זה לא יופיעו בהיסטוריית הדפדפן, ולאחר שתסגור את כל חלונות האורח הפתוחים, לא יותירו במחשב עקבות, כמו קובצי Cookie. עם זאת, כל הקבצים שאתה מוריד יישמרו.</translation>
 <translation id="6395423953133416962">שלח <ph name="BEGIN_LINK1" />פרטי מערכת<ph name="END_LINK1" /> ו<ph name="BEGIN_LINK2" />ערכים<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">הפסק לדבר</translation>
 <translation id="6397592254427394018">פתח את כל הסימניות בחלון &amp;גלישה בסתר</translation>
 <translation id="6398715114293939307">‏הסרה של חנות Google Play</translation>
 <translation id="6398765197997659313">צא ממסך מלא</translation>
@@ -5005,7 +4999,6 @@
 <translation id="8912793549644936705">מתח</translation>
 <translation id="8915370057835397490">טוען הצעה...</translation>
 <translation id="8916476537757519021">תת-מסגרת לגלישה בסתר: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">סנכרון עם <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">התר תמיד מודעות באתר הזה</translation>
 <translation id="8925458182817574960">&amp;הגדרות</translation>
 <translation id="8926389886865778422">אל תשאל שוב</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index ebf47b1..f8302358 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -883,6 +883,7 @@
 <translation id="2359345697448000899">[ツール] メニューの [拡張機能] をクリックして拡張機能を管理できます。</translation>
 <translation id="2359808026110333948">続行</translation>
 <translation id="236141728043665931">マイクのアクセスを常にブロックする</translation>
+<translation id="2365507699358342471">このサイトでは、クリップボードにコピーされているテキストや画像へのアクセスが許可されています。</translation>
 <translation id="2367972762794486313">アプリを表示</translation>
 <translation id="2371076942591664043">ダウンロードしたら開く(&amp;D)</translation>
 <translation id="2377319039870049694">リスト表示に切り替え</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">ウェブページで Tab キーを押すと、リンクやフォーム欄がハイライト表示されます</translation>
 <translation id="2916745397441987255">拡張機能を検索</translation>
 <translation id="2921081876747860777">ローカルデータを保護するパスワードを作成してください。</translation>
-<translation id="2924395203970765374">「<ph name="FULL_NAME" />」に同期されています</translation>
 <translation id="2925966894897775835">スプレッドシート</translation>
 <translation id="2927017729816812676">キャッシュ ストレージ</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" />(子供向けのアカウント)</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">設定完了</translation>
 <translation id="3349933790966648062">メモリ使用量</translation>
 <translation id="3353984535370177728">アップロードするフォルダを選択</translation>
-<translation id="335581015389089642">スピーチ</translation>
 <translation id="3355936511340229503">接続エラー</translation>
 <translation id="3356797067524893661">設定が完了しました。ハングアウト Meet を使用できます</translation>
 <translation id="3358935496594837302">スマートフォンが見つかりません。使用している Android スマートフォンが対応機種で、電源が入っており、手の届く範囲にあることを確認してください。&lt;a&gt;詳細&lt;/a&gt;</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">新しいタブで開く(&amp;O)</translation>
 <translation id="3616113530831147358">音声</translation>
 <translation id="3616741288025931835">閲覧履歴を消去(&amp;C)...</translation>
-<translation id="3618849550573277856">「<ph name="LOOKUP_STRING" />」を検索</translation>
 <translation id="3620292326130836921">すべてバックアップ済みです。</translation>
 <translation id="3623574769078102674">この監視対象ユーザーは <ph name="MANAGER_EMAIL" /> によって管理されます。</translation>
 <translation id="3625258641415618104">スクリーンショットが無効</translation>
@@ -2145,7 +2143,6 @@
 <translation id="428565720843367874">このファイルのスキャン中にウイルス対策ソフトウェアで予期しないエラーが発生しました。</translation>
 <translation id="428608937826130504">シェルフ アイテム 8</translation>
 <translation id="4287502004382794929">このデバイスを登録するソフトウェア ライセンスを持っていません。さらに購入するには、販売担当者にお問い合わせください。このメッセージが間違って表示されていると思われる場合は、サポートにお問い合わせください。</translation>
-<translation id="4289300219472526559">読み上げを開始</translation>
 <translation id="4289540628985791613">概要</translation>
 <translation id="4296575653627536209">監視対象ユーザーを追加</translation>
 <translation id="4297322094678649474">言語を変更</translation>
@@ -2242,7 +2239,7 @@
 <translation id="4478664379124702289">リンク先を別名で保存(&amp;K)...</translation>
 <translation id="4479424953165245642">キオスク アプリケーションを管理</translation>
 <translation id="4479639480957787382">イーサネット</translation>
-<translation id="4480590691557335796">Chrome で、パソコン上の有害なソフトウェアを探して削除することができます。</translation>
+<translation id="4480590691557335796">Chrome で、パソコン上の有害なソフトウェアを探して削除することができます</translation>
 <translation id="4481249487722541506">パッケージ化されていない拡張機能を読み込む...</translation>
 <translation id="4481530544597605423">ペア設定されていないデバイス</translation>
 <translation id="4482194545587547824">検索やその他の Google サービスをカスタマイズする目的で、Google が閲覧履歴を使用することがあります</translation>
@@ -2406,6 +2403,7 @@
 <translation id="4748762018725435655">Chrome ウェブストアから拡張機能を取得する必要があります</translation>
 <translation id="4750394297954878236">候補</translation>
 <translation id="475088594373173692">最初のユーザー</translation>
+<translation id="4751476147751820511">モーション センサーまたは光センサー</translation>
 <translation id="4756378406049221019">停止 / 再読み込み</translation>
 <translation id="4756388243121344051">履歴(&amp;H)</translation>
 <translation id="4759238208242260848">ダウンロード</translation>
@@ -2440,7 +2438,6 @@
 <translation id="4813512666221746211">ネットワーク エラー</translation>
 <translation id="4816492930507672669">ページサイズに合わせる</translation>
 <translation id="4820334425169212497">いいえ、表示されていません</translation>
-<translation id="4821725298388681253">これは早期リリースです。検索、テキスト入力といった一部の機能はまだご利用いただけません。</translation>
 <translation id="4821935166599369261">プロファイル記録の開始(&amp;P)</translation>
 <translation id="4823484602432206655">ユーザー設定とデバイス設定の読み取りと変更</translation>
 <translation id="4823651846660089135">デバイスは読み取り専用です</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">端末の指紋認証センサーに指を置きます</translation>
 <translation id="6390799748543157332">このウィンドウで開いたページはブラウザの履歴に記録されません。また、開いているゲスト ウィンドウをすべて閉じると、Cookie などのデータはパソコンから消去されます。ただし、ダウンロードしたファイルは保持されます。</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />システム情報<ph name="END_LINK1" />と<ph name="BEGIN_LINK2" />指標データ<ph name="END_LINK2" />を送信する</translation>
-<translation id="6397363302884558537">読み上げを停止</translation>
 <translation id="6397592254427394018">すべてのブックマークをシークレット ウィンドウで開く(&amp;I)</translation>
 <translation id="6398715114293939307">Google Play ストアを削除</translation>
 <translation id="6398765197997659313">全画面表示を終了</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">ユーザー名/パスワードが正しくないか、EAP 認証に失敗しました</translation>
 <translation id="729761647156315797">言語とキーボードの選択</translation>
 <translation id="7299337219131431707">ゲストのブラウジングを許可する</translation>
+<translation id="7303900363563182677">このサイトでは、クリップボードにコピーされているテキストや画像へのアクセスがブロックされています</translation>
 <translation id="730515362922783851">ローカル ネットワークまたはインターネット上のデバイスとのデータ交換</translation>
 <translation id="7308002049209013926">ランチャーを使うと、新しいアプリやアクティビティにすばやく移動できます。キーボードからランチャーを表示するには、Alt+Shift+L キーを押します。</translation>
 <translation id="7309257895202129721">コントロールを表示(&amp;C)</translation>
@@ -4407,6 +4404,7 @@
 <translation id="7909969815743704077">シークレット モードでダウンロード</translation>
 <translation id="7910768399700579500">新しいフォルダ(&amp;N)</translation>
 <translation id="7912080627461681647">サーバーでパスワードが変更されました。いったんログアウトして再度ログインしてください。</translation>
+<translation id="7912883689016444961">モバイル ネットワークを設定</translation>
 <translation id="7915471803647590281">フィードバックを送信する前に、問題の詳細を入力してください。</translation>
 <translation id="7925247922861151263">AAA を確認できませんでした</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> を待機しています...</translation>
@@ -4918,6 +4916,7 @@
 <translation id="8736288397686080465">このサイトはバックグラウンドで更新されました。</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> の代わりに「<ph name="PROTOCOL" />」リンクを開く</translation>
 <translation id="8737709691285775803">サクラ</translation>
+<translation id="8741316211671074806">ピクチャー イン ピクチャー</translation>
 <translation id="8743864605301774756">1 時間前に更新されました</translation>
 <translation id="8749863574775030885">不明なベンダーの USB デバイスへのアクセス</translation>
 <translation id="8754200782896249056">&lt;p&gt;<ph name="PRODUCT_NAME" /> をサポート対象のデスクトップ環境で実行するとシステムのプロキシ設定が使用されますが、お使いのシステムがサポートされていないか、システム設定の適用で問題が発生した可能性があります。&lt;/p&gt;
@@ -5020,7 +5019,6 @@
 <translation id="8912793549644936705">拡大</translation>
 <translation id="8915370057835397490">候補を読み込んでいます</translation>
 <translation id="8916476537757519021">シークレット サブフレーム: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> に同期</translation>
 <translation id="8922013791253848639">このサイトで常に広告を許可します</translation>
 <translation id="8925458182817574960">設定(&amp;S)</translation>
 <translation id="8926389886865778422">再表示させない</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 9d6b385..5b298ed7 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1264,7 +1264,6 @@
 <translation id="2916073183900451334">ಫಾರ್ಮ್ ಕ್ಷೇತ್ರಗಳಂತೆ ವೆಬ್‌ಪುಟದಲ್ಲಿನ ಹೈಲೈಟ್ ಲಿಂಕ್‌ಗಳ ಟ್ಯಾಬ್ ಒತ್ತಿರಿ</translation>
 <translation id="2916745397441987255">ವಿಸ್ತರಣೆಗಳನ್ನು ಹುಡುಕಿ</translation>
 <translation id="2921081876747860777">ನಿಮ್ಮ ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ರಕ್ಷಿಸಲು ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ರಚಿಸಿ.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> ಜೊತೆ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="2925966894897775835">ಶೀಟ್‌ಗಳು</translation>
 <translation id="2927017729816812676">ಕ್ಯಾಶ್ ಸಂಗ್ರಹಣೆ</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (ಮಕ್ಕಳಿಗೆ ಖಾತೆ)</translation>
@@ -1547,7 +1546,6 @@
 <translation id="3348459612390503954">ಅಭಿನಂದನೆಗಳು</translation>
 <translation id="3349933790966648062">ಮೆಮೊರಿ ಬಳಕೆಯ ಪ್ರಮಾಣ</translation>
 <translation id="3353984535370177728">ಅಪ್‌ಲೋಡ್‌ ಮಾಡಲು ಫೋಲ್ಡರ್‌ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
-<translation id="335581015389089642">ಧ್ವನಿ</translation>
 <translation id="3355936511340229503">ಸಂಪರ್ಕ ದೋಷ</translation>
 <translation id="3356797067524893661">Hangouts ಸಭೆಯನ್ನು ಮುಂದುವರಿಸಲು ನೀವು ಸಿದ್ಧರಾಗಿರುವಿರಿ</translation>
 <translation id="3358935496594837302">ನಿಮ್ಮ ಫೋನ್ ಪತ್ತೆಮಾಡಲಾಗಲಿಲ್ಲ. ನೀವು ಆನ್ ಮಾಡಿರುವಂತಹ ಮತ್ತು ಸುಲಭವಾಗಿ ಲಭ್ಯ ಇರುವ ಹೊಂದಾಣಿಕೆಯ Android ಫೋನ್ ಬಳಸಲು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. &lt;a&gt;ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ&lt;/a&gt;</translation>
@@ -1724,7 +1722,6 @@
 <translation id="3613422051106148727">ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ &amp;ತೆರೆಯಿರಿ</translation>
 <translation id="3616113530831147358">ಆಡಿಯೋ</translation>
 <translation id="3616741288025931835">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು &amp;ತೆರವುಗೊಳಿಸಿ...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” ನೋಡಿ</translation>
 <translation id="3620292326130836921">ಎಲ್ಲವನ್ನೂ ಬ್ಯಾಕಪ್ ಮಾಡಲಾಗಿದೆ!</translation>
 <translation id="3623574769078102674">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು <ph name="MANAGER_EMAIL" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="3625258641415618104">ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
@@ -2138,7 +2135,6 @@
 <translation id="428565720843367874">ಈ ಫೈಲ್ ಸ್ಕ್ಯಾನ್ ಮಾಡುವಾಗ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಆಂಟಿ ವೈರಸ್ ಸಾಫ್ಟ್‌‌ವೇರ್ ವಿಫಲಗೊಂಡಿದೆ.</translation>
 <translation id="428608937826130504">ಶೆಲ್ಫ್ ಐಟಂ 8</translation>
 <translation id="4287502004382794929">ಈ ಸಾಧನವನ್ನು ದಾಖಲಿಸಲು ನೀವು ಸಾಕಷ್ಟು ಸಾಫ್ಟ್‌ವೇರ್ ಪರವಾನಗಿಗಳನ್ನು ಹೊಂದಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನಷ್ಟು ಖರೀದಿಸಲು ಮಾರಾಟವನ್ನು ಸಂಪರ್ಕಿಸಿ. ಈ ಸಂದೇಶವನ್ನು ದೋಷದಲ್ಲಿ ನೀವು ನೋಡುತ್ತಿರುವಿರಿ ಎಂದು ನೀವು ಭಾವಿಸುವುದಾದರೆ, ದಯವಿಟ್ಟು ಸಂಪರ್ಕವನ್ನು ಬೆಂಬಲಿಸಿ.</translation>
-<translation id="4289300219472526559">ಮಾತನಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="4289540628985791613">ಅವಲೋಕನ</translation>
 <translation id="4296575653627536209">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="4297322094678649474">ಭಾಷೆಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation>
@@ -2433,7 +2429,6 @@
 <translation id="4813512666221746211">ನೆಟ್‌ವರ್ಕ್  ದೋಷ</translation>
 <translation id="4816492930507672669">ಪುಟಕ್ಕೆ ಹೊಂದಿಸು</translation>
 <translation id="4820334425169212497">ಇಲ್ಲ, ನಾನು ಅದನ್ನು ನೋಡಿಲ್ಲ</translation>
-<translation id="4821725298388681253">ಇದು ಪ್ರಾರಂಭಿಕ ಬಿಡುಗಡೆಯಾಗಿದೆ. ಹಾಗಾಗಿ ಇದರಲ್ಲಿ ಹುಡುಕಾಟ ಮತ್ತು ಪಠ್ಯ ನಮೂದಿಸುವಿಕೆ ಸೇರಿದಂತೆ ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳು ಇನ್ನೂ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="4821935166599369261">&amp;ಪ್ರೊಫೈಲಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ
 </translation>
 <translation id="4823484602432206655">ಬಳಕೆದಾರ ಮತ್ತು ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಓದಿ ಹಾಗೂ ಬದಲಾಯಿಸಿ</translation>
@@ -3446,7 +3441,6 @@
 <translation id="6388771388956873507">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌ ಅನ್ನು ಹುಡುಕಿ ಮತ್ತು ಅದನ್ನು ಬೆರಳಿನಿಂದ ಸ್ಪರ್ಶಿಸಿ</translation>
 <translation id="6390799748543157332">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ತೆರೆದಿರುವ ಎಲ್ಲ ಅತಿಥಿ ವಿಂಡೊಗಳನ್ನು ಮುಚ್ಚಿದ ನಂತರ ಈ ವಿಂಡೊದಲ್ಲಿ ನೀವು ವೀಕ್ಷಿಸುವ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ ಮತ್ತು ಅವುಗಳು ಕುಕೀಗಳಂತಹ ಇತರ ಗುರುತುಗಳನ್ನು ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಬಿಡುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನೀವು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಯಾವುದೇ ಫೈಲ್‌ಗಳನ್ನು ರಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />ಸಿಸ್ಟಂ‌ ಮಾಹಿತಿ<ph name="END_LINK1" /> ಮತ್ತು <ph name="BEGIN_LINK2" />ಮೆಟ್ರಿಕ್‌ಗಳನ್ನು<ph name="END_LINK2" /> ಕಳುಹಿಸಿ</translation>
-<translation id="6397363302884558537">ಮಾತನಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation>
 <translation id="6397592254427394018">&amp;ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ಎಲ್ಲ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="6398715114293939307">Google Play ಸ್ಟೋರ್ ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="6398765197997659313">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
@@ -5008,7 +5002,6 @@
 <translation id="8912793549644936705">ಎಳೆದಿರುವುದು</translation>
 <translation id="8915370057835397490">ಸಲಹೆಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="8916476537757519021">ಅದೃಶ್ಯ ಉಪಫ್ರೇಮ್: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> ಗೆ ಸಿಂಕ್ ಮಾಡಿ</translation>
 <translation id="8922013791253848639">ಈ ಸೈಟ್‌ನಲ್ಲಿ ಯಾವಾಗಲೂ ಜಾಹೀರಾತುಗಳನ್ನು ಅನುಮತಿಸಿ</translation>
 <translation id="8925458182817574960">&amp;ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="8926389886865778422">ಮತ್ತೆ ಕೇಳಬೇಡಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 45cd623..78d7e6f 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -31,7 +31,7 @@
 <translation id="1039337018183941703">잘못되었거나 손상된 파일입니다.</translation>
 <translation id="1042174272890264476">또한 컴퓨터에는 <ph name="SHORT_PRODUCT_NAME" /> RLZ 라이브러리가 내장되어 있습니다. RLZ는 고유하지 않고 개인 식별이 불가능한 태그를 할당하여 특정 홍보 캠페인을 통한 검색 및 <ph name="SHORT_PRODUCT_NAME" /> 사용 실태를 측정합니다. 이러한 라벨은 <ph name="PRODUCT_NAME" />의 Google 검색어에 표시되기도 합니다.</translation>
 <translation id="1046059554679513793">이미 사용 중인 이름입니다.</translation>
-<translation id="1046286965898806214"><ph name="PASSWORD_MANAGER_BRAND" />에서 이 사이트의 계정을 저장하도록 하시겠습니까?</translation>
+<translation id="1046286965898806214"><ph name="PASSWORD_MANAGER_BRAND" />에 이 사이트의 계정을 저장하시겠습니까?</translation>
 <translation id="1047431265488717055">링크 텍스트 복사(&amp;X)</translation>
 <translation id="1047726139967079566">현재 페이지를 북마크에 추가...</translation>
 <translation id="1047956942837015229"><ph name="COUNT" />개 항목 삭제 중...</translation>
@@ -353,7 +353,7 @@
 <translation id="152234381334907219">저장되지 않음</translation>
 <translation id="1524430321211440688">키보드</translation>
 <translation id="1524563461097350801">아니요</translation>
-<translation id="1525740877599838384">Wi-Fi만 사용하여 위치 파악</translation>
+<translation id="1525740877599838384">위치 파악에 Wi-Fi만 사용</translation>
 <translation id="1526560967942511387">제목 없는 문서</translation>
 <translation id="1526925867532626635">동기화 설정 확인</translation>
 <translation id="1529116897397289129">저장한 카드가 여기에 표시됩니다.</translation>
@@ -437,7 +437,7 @@
     특정 웹사이트 <ph name="BEGIN_BOLD" />허용 또는 금지<ph name="END_BOLD" />
     관리 대상 사용자가 방문한 웹사이트 <ph name="BEGIN_BOLD" />검토<ph name="END_BOLD" />
     기타 설정 <ph name="BEGIN_BOLD" />관리<ph name="END_BOLD" /></translation>
-<translation id="1648528859488547844">Wi‑Fi 또는 모바일 네트워크를 사용하여 위치 파악</translation>
+<translation id="1648528859488547844">위치 파악에 Wi‑Fi 또는 모바일 네트워크 사용</translation>
 <translation id="1648943974594387137">로그인 세부정보의 유효기간이 만료되었습니다.</translation>
 <translation id="1650371550981945235">입력 옵션 표시</translation>
 <translation id="1650709179466243265">www.와 .com을 추가하여 주소 열기</translation>
@@ -589,7 +589,7 @@
 <translation id="1878524442024357078">사이트에서 플러그인을 사용하여 내 컴퓨터에 액세스하도록 허용하지 않음</translation>
 <translation id="1879449842763884566">응용 프로그램에 설치...</translation>
 <translation id="1880905663253319515">인증서 '<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation>
-<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" />에서 <ph name="ORIGIN" />의 비밀번호를 저장하도록 하시겠습니까?</translation>
+<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" />에 <ph name="ORIGIN" />의 비밀번호를 저장하시겠습니까?</translation>
 <translation id="1886996562706621347">사이트에서 프로토콜 기본 핸들러로 사용할지 여부를 묻도록 허용(권장)</translation>
 <translation id="1887442540531652736">로그인 오류</translation>
 <translation id="1887850431809612466">하드웨어 버전</translation>
@@ -883,6 +883,7 @@
 <translation id="2359345697448000899">도구 메뉴에서 확장 프로그램을 클릭하여 확장 프로그램을 관리할 수 있습니다.</translation>
 <translation id="2359808026110333948">계속</translation>
 <translation id="236141728043665931">마이크 액세스 항상 차단</translation>
+<translation id="2365507699358342471">이 사이트는 클립보드에 복사된 텍스트와 이미지에 액세스할 수 있습니다.</translation>
 <translation id="2367972762794486313">앱 표시</translation>
 <translation id="2371076942591664043">완료되면 열기(&amp;D)</translation>
 <translation id="2377319039870049694">목록 보기로 전환</translation>
@@ -958,7 +959,7 @@
 <translation id="249819058197909513">이 앱에 대해 다시 경고하지 않음</translation>
 <translation id="2498539833203011245">최소화</translation>
 <translation id="2498765460639677199">크게</translation>
-<translation id="2499747912851752301">비밀번호 내보내는 중...</translation>
+<translation id="2499747912851752301">비밀번호를 내보내는 중...</translation>
 <translation id="2500471369733289700">개인정보 보호를 위해 차단됨</translation>
 <translation id="2501173422421700905">인증서 보류</translation>
 <translation id="2501278716633472235">뒤로 이동</translation>
@@ -1029,7 +1030,7 @@
 <translation id="2603115962224169880">컴퓨터 정리</translation>
 <translation id="2603463522847370204">시크릿 창에서 열기(&amp;I)</translation>
 <translation id="2604255671529671813">네트워크 연결 오류</translation>
-<translation id="2606246518223360146">데이터 연결</translation>
+<translation id="2606246518223360146">자료 연결</translation>
 <translation id="2607101320794533334">대상 공개 키 정보</translation>
 <translation id="2607459012323956820">관리자가 이 관리 대상 사용자의 설정 및 인터넷 사용 기록을 <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />에서 계속 볼 수 있습니다.</translation>
 <translation id="2608770217409477136">기본 설정 사용</translation>
@@ -1103,7 +1104,7 @@
 <translation id="270358213449696159">Google Chrome OS 이용약관 내용</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
 <translation id="270516211545221798">터치패드 속도</translation>
-<translation id="2705736684557713153">화면 하단으로 스크롤하여 인스턴트 테더링이 표시되면 사용 설정합니다. 표시되지 않으면 완료된 것입니다.</translation>
+<translation id="2705736684557713153">화면 하단으로 스크롤하여 인스턴트 테더링이 표시되면 사용 설정합니다. 표시되지 않으면 설정이 완료된 것입니다.</translation>
 <translation id="2706892089432507937">USB 기기</translation>
 <translation id="2706954854267016964">선택한 Google 클라우드 프린트 기기는 더 이상 지원되지 않습니다. 컴퓨터의 시스템 설정에서 프린터를 설정해 보세요.</translation>
 <translation id="2707024448553392710">구성요소 다운로드 중</translation>
@@ -1149,10 +1150,10 @@
 <translation id="2762441749940182211">카메라 차단됨</translation>
 <translation id="2765217105034171413">작게</translation>
 <translation id="2766006623206032690">붙여넣어 바로가기(&amp;S)</translation>
-<translation id="2767084307624729667"><ph name="ORIGIN" />에 저장된 비밀번호</translation>
+<translation id="2767084307624729667"><ph name="ORIGIN" />의 저장된 비밀번호</translation>
 <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" />(으)로 로그인되었습니다.</translation>
 <translation id="2770465223704140727">목록에서 삭제</translation>
-<translation id="2770690685823456775">다른 폴더로 비밀번호 내보내기</translation>
+<translation id="2770690685823456775">비밀번호를 다른 폴더로 내보냅니다.</translation>
 <translation id="2771268254788431918">모바일 데이터 활성화됨</translation>
 <translation id="2772936498786524345">닌자</translation>
 <translation id="2773802008104670137">컴퓨터에 유해할 수 있는 파일 유형입니다.</translation>
@@ -1270,14 +1271,13 @@
 <translation id="2916073183900451334">웹페이지에서 Tab 키를 누르면 링크뿐 아니라 양식 입력란도 강조표시됩니다.</translation>
 <translation id="2916745397441987255">확장 프로그램 검색</translation>
 <translation id="2921081876747860777">비밀번호를 만들어 로컬 데이터 보호</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" />에 동기화됨</translation>
 <translation id="2925966894897775835">스프레드시트</translation>
 <translation id="2927017729816812676">캐시 저장 공간</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" />(어린이용 계정)</translation>
 <translation id="2932483646085333864">동기화를 시작하려면 로그아웃한 후 다시 로그인하세요.</translation>
 <translation id="2932883381142163287">악용사례 신고</translation>
 <translation id="2938225289965773019"><ph name="PROTOCOL" /> 링크 열기</translation>
-<translation id="2938335670027321024">컨트롤러를 움직여 위치를 변경하세요. 끝내려면 클릭하세요.</translation>
+<translation id="2938335670027321024">컨트롤러를 움직여 위치를 변경한 다음, 클릭하여 완료하세요.</translation>
 <translation id="2939938020978911855">사용 가능한 블루투스 기기 표시</translation>
 <translation id="2941112035454246133">낮음</translation>
 <translation id="2942560570858569904">대기 중...</translation>
@@ -1358,7 +1358,7 @@
 <translation id="3038612606416062604">수동으로 프린터 추가</translation>
 <translation id="3038675903128704560">사이트에서 플러그인을 사용하여 내 컴퓨터에 액세스하도록 허용하지 않음</translation>
 <translation id="3039828483675273919">$1개 항목 이동 중...</translation>
-<translation id="3045447014237878114">이 사이트에서 여러 파일을 자동으로 다운로드함</translation>
+<translation id="3045447014237878114">이 사이트에서 여러 파일을 자동으로 다운로드했습니다</translation>
 <translation id="304567287000691532">화면 공유 중</translation>
 <translation id="3046910703532196514">웹페이지, 전부</translation>
 <translation id="304826556400666995">탭 음소거 해제</translation>
@@ -1439,7 +1439,7 @@
 <translation id="316307797510303346">이 사용자가 방문하는 웹사이트를 <ph name="CUSTODIAN_EMAIL" />에서 제어하고 조회합니다.
     계정 로그인 세부정보가 오래되었습니다.</translation>
 <translation id="3165390001037658081">일부 이동통신사는 이 기능을 차단할 수도 있습니다.</translation>
-<translation id="316854673539778496">어느 기기에서나 내 확장 프로그램을 사용하려면 로그인하고 동기화를 사용 설정하세요.</translation>
+<translation id="316854673539778496">어느 기기에서나 내 확장 프로그램을 모두 사용하려면 로그인하여 동기화를 사용 설정하세요.</translation>
 <translation id="3170072451822350649">로그인을 건너뛰고 <ph name="LINK_START" />손님으로 로그인<ph name="LINK_END" />할 수도 있습니다.</translation>
 <translation id="3177048931975664371">비밀번호를 숨기려면 클릭하세요.</translation>
 <translation id="3177857336576585529"><ph name="SITE_NAME" />에서 권한을 요청하고 있습니다.</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">축하합니다.</translation>
 <translation id="3349933790966648062">메모리 사용량</translation>
 <translation id="3353984535370177728">업로드할 폴더 선택</translation>
-<translation id="335581015389089642">음성</translation>
 <translation id="3355936511340229503">연결 오류</translation>
 <translation id="3356797067524893661">행아웃 Meet 사용 준비 완료</translation>
 <translation id="3358935496594837302">휴대전화를 찾을 수 없습니다. 호환 가능한 Android 휴대전화를 사용 중인지, 휴대전화의 전원이 켜져 있고 가까이 있는지 확인하세요. &lt;a&gt;자세히 알아보기e&lt;/a&gt;</translation>
@@ -1578,7 +1577,7 @@
 <translation id="3396331542604645348">선택한 프린터가 사용할 수 없거나 올바르게 설치되어 있지 않습니다. 프린터를 확인하거나 다른 프린터를 선택해 보세요.</translation>
 <translation id="3399432415385675819">알림이 사용 중지됩니다.</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
-<translation id="3404065873681873169">이 사이트에 저장된 비밀번호가 없음</translation>
+<translation id="3404065873681873169">이 사이트의 비밀번호가 저장되지 않음</translation>
 <translation id="340485819826776184">예상 검색어 서비스를 사용하여 검색주소창에 입력되는 검색어 및 URL 완성</translation>
 <translation id="3405664148539009465">글꼴 맞춤설정</translation>
 <translation id="3405763860805964263">...</translation>
@@ -1589,7 +1588,7 @@
 <translation id="3414952576877147120">크기:</translation>
 <translation id="3420980393175304359">사용자 전환</translation>
 <translation id="3421387094817716717">타원 곡선 공개 키</translation>
-<translation id="3423463006624419153">'<ph name="PHONE_NAME_1" />' 및 '<ph name="PHONE_NAME_2" />'</translation>
+<translation id="3423463006624419153">'<ph name="PHONE_NAME_1" />' 및 '<ph name="PHONE_NAME_2" />'에서 다음과 같이 설정하세요.</translation>
 <translation id="342383653005737728">소유자는 이 기기의 진단 및 사용 데이터를 Google에 전송하도록 선택할 수 있습니다. 여기에서 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />을 확인할 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918"><ph name="PRODUCT_NAME" />을(를) 다시 시작하세요.</translation>
 <translation id="3424969259347320884">탭이 다운되었을 때 무엇을 하고 계셨는지 설명해 주세요.</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">새 탭에서 열기(&amp;O)</translation>
 <translation id="3616113530831147358">오디오</translation>
 <translation id="3616741288025931835">인터넷 사용 기록 삭제(&amp;C)...</translation>
-<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' 찾기</translation>
 <translation id="3620292326130836921">백업되지 않은 파일이 없습니다.</translation>
 <translation id="3623574769078102674">이 관리 대상 사용자는 <ph name="MANAGER_EMAIL" />에서 관리합니다.</translation>
 <translation id="3625258641415618104">스크린샷 캡쳐 사용 중지됨</translation>
@@ -1765,7 +1763,7 @@
 <translation id="3665842570601375360">보안:</translation>
 <translation id="3668570675727296296">언어 설정</translation>
 <translation id="3668823961463113931">핸들러</translation>
-<translation id="3669030672519623291">이 사이트에 저장된 비밀번호가 없음</translation>
+<translation id="3669030672519623291">이 사이트의 비밀번호가 저장되지 않음</translation>
 <translation id="3670229581627177274">블루투스 켜기</translation>
 <translation id="3672681487849735243">하드웨어에서 문제가 발견되었습니다.</translation>
 <translation id="367645871420407123">루트 비밀번호를 기본 테스트 이미지 값으로 설정하려면 비워두세요.</translation>
@@ -1802,7 +1800,7 @@
 <translation id="3727148787322499904">이 설정을 변경하면 공유한 모든 네트워크에 영향을 줍니다.</translation>
 <translation id="3727187387656390258">팝업 검사</translation>
 <translation id="3728067901555601989">OTP:</translation>
-<translation id="3732078975418297900"><ph name="ERROR_LINE" /> 줄에 오류</translation>
+<translation id="3732078975418297900"><ph name="ERROR_LINE" />행에 오류가 있음</translation>
 <translation id="3733127536501031542">SSL 서버(Step-up 사용)</translation>
 <translation id="3737536731758327622">다운로드 항목이 여기에 표시됩니다.</translation>
 <translation id="3738924763801731196"><ph name="OID" />:</translation>
@@ -2139,12 +2137,11 @@
 <translation id="4281844954008187215">서비스 약관</translation>
 <translation id="4282196459431406533">Smart Lock이 사용 설정됨</translation>
 <translation id="4284105660453474798">'$1'을(를) 삭제하시겠습니까?</translation>
-<translation id="4285418559658561636">비밀번호 업데이트</translation>
+<translation id="4285418559658561636">암호 업데이트</translation>
 <translation id="4285498937028063278">고정 해제</translation>
 <translation id="428565720843367874">파일을 검사하는 동안 바이러스 백신 소프트웨어에 예기치 않은 오류가 발생했습니다.</translation>
 <translation id="428608937826130504">서가 항목 8</translation>
 <translation id="4287502004382794929">이 기기를 등록하기 위한 충분한 소프트웨어 라이선스를 갖고 있지 않습니다. 판매처에 문의하여 더 구입하시기 바랍니다. 이 메시지가 오류라고 판단되는 경우 지원팀에 문의하세요.</translation>
-<translation id="4289300219472526559">말하기 시작</translation>
 <translation id="4289540628985791613">개요</translation>
 <translation id="4296575653627536209">관리 대상 사용자 추가</translation>
 <translation id="4297322094678649474">언어 변경</translation>
@@ -2241,7 +2238,7 @@
 <translation id="4478664379124702289">다른 이름으로 링크 저장(&amp;K)...</translation>
 <translation id="4479424953165245642">키오스크 애플리케이션 관리</translation>
 <translation id="4479639480957787382">이더넷</translation>
-<translation id="4480590691557335796">Chrome에서는 컴퓨터에서 유해한 소프트웨어를 찾아 삭제할 수 있습니다.</translation>
+<translation id="4480590691557335796">Chrome이 컴퓨터에서 유해한 소프트웨어를 찾아 삭제할 수 있습니다.</translation>
 <translation id="4481249487722541506">압축해제된 확장 프로그램 로드...</translation>
 <translation id="4481530544597605423">페어링 해제된 기기</translation>
 <translation id="4482194545587547824">검색 및 다른 Google 서비스를 맞춤설정하기 위하여 Google에서 인터넷 사용 기록을 사용할 수 있습니다.</translation>
@@ -2360,7 +2357,7 @@
 <translation id="4677585247300749148"><ph name="URL" />에서 접근성 이벤트에 응답하려고 합니다</translation>
 <translation id="4677692029604506169">보안을 위해 <ph name="DEVICE_TYPE" />을(를) 잠금 해제하는 데 사용한 휴대전화에 화면 잠금 기능이 필요합니다. 일반적으로 PIN, 패턴 또는 비밀번호로 화면을 잠급니다. 이미 화면 잠금 기능이 있나요? 다시 확인을 선택하여 확인하고 설정을 계속하세요.</translation>
 <translation id="4677772697204437347">GPU 메모리</translation>
-<translation id="4680105648806843642">이 페이지에서 소리가 음소거되었습니다.</translation>
+<translation id="4680105648806843642">이 페이지에서 소리가 음소거됨</translation>
 <translation id="4681930562518940301">새 탭에서 원본 이미지 열기</translation>
 <translation id="4682551433947286597">로그인 화면에 배경화면이 표시됩니다.</translation>
 <translation id="4684427112815847243">모두 동기화</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Chrome 웹 스토어의 확장 프로그램 필요</translation>
 <translation id="4750394297954878236">추천</translation>
 <translation id="475088594373173692">첫 번째 사용자</translation>
+<translation id="4751476147751820511">모션 또는 조도 센서</translation>
 <translation id="4756378406049221019">중지/새로고침</translation>
 <translation id="4756388243121344051">방문 기록(&amp;H)</translation>
 <translation id="4759238208242260848">다운로드</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">네트워크 오류</translation>
 <translation id="4816492930507672669">페이지 맞춤</translation>
 <translation id="4820334425169212497">아니요, 표시되지 않습니다.</translation>
-<translation id="4821725298388681253">조기 배포 버전이므로 검색 및 텍스트 입력 등의 일부 기능은 아직 사용할 수 없습니다.</translation>
 <translation id="4821935166599369261">프로파일링 사용(&amp;P)</translation>
 <translation id="4823484602432206655">사용자와 기기 설정 확인 및 변경</translation>
 <translation id="4823651846660089135">읽기 전용 기기</translation>
@@ -2466,7 +2463,7 @@
 <translation id="4850669014075537160">스크롤</translation>
 <translation id="4850886885716139402">보기</translation>
 <translation id="4853020600495124913">새 창에서 열기(&amp;N)</translation>
-<translation id="4853882474657327078"><ph name="PASSWORD_MANAGER_BRAND" />이(가) <ph name="ORIGIN" />의 비밀번호를 업데이트하도록 하시겠습니까?</translation>
+<translation id="4853882474657327078"><ph name="PASSWORD_MANAGER_BRAND" />에 저장된 <ph name="ORIGIN" />의 비밀번호를 업데이트하시겠습니까?</translation>
 <translation id="4856478137399998590">모바일 데이터 서비스가 활성화되었으며 사용할 준비가 되었습니다.</translation>
 <translation id="4857506433977877623">{COUNT,plural, =0{시크릿 창에서 모두 열기(I)}=1{시크릿 창에서 열기(I)}other{시크릿 창에서 #개 모두 열기(I)}}</translation>
 <translation id="4858913220355269194">축구왕</translation>
@@ -2656,7 +2653,7 @@
 <translation id="5143374789336132547">홈 버튼을 클릭하면 표시되는 페이지가 '<ph name="EXTENSION_NAME" />' 확장 프로그램으로 인해 변경되었습니다.</translation>
 <translation id="5143712164865402236">전체화면 열기</translation>
 <translation id="5145331109270917438">수정된 날짜</translation>
-<translation id="514575469079499857">IP 주소를 사용하여 위치 파악(기본값)</translation>
+<translation id="514575469079499857">위치 파악에 IP 주소 사용(기본값)</translation>
 <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation>
 <translation id="5151354047782775295">디스크 저장 공간을 확보하지 않으면 일부 데이터가 자동으로 삭제됩니다.</translation>
 <translation id="5153297660536091054">PIN 잠금 해제 기능</translation>
@@ -2932,7 +2929,7 @@
 <translation id="5556206011531515970">다음을 클릭하여 기본 브라우저를 선택하세요.</translation>
 <translation id="5556459405103347317">새로고침</translation>
 <translation id="555746285996217175">잠금/전원</translation>
-<translation id="5557579359142031072">보안 키 식별 정보를 확인합니다.</translation>
+<translation id="5557579359142031072">보안 키 식별 정보 확인</translation>
 <translation id="5557991081552967863">절전 모드 중에 Wi-Fi 계속 사용</translation>
 <translation id="5558129378926964177">확대(&amp;I)</translation>
 <translation id="55601339223879446">디스플레이에서 바탕화면 경계를 조정합니다.</translation>
@@ -2961,7 +2958,7 @@
 <translation id="5596627076506792578">옵션 더보기</translation>
 <translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" />MB의 모바일 데이터를 사용하여 업데이트를 다운로드합니다. 계속하시겠습니까?</translation>
 <translation id="5601503069213153581">PIN</translation>
-<translation id="5605057818926354551"><ph name="PASSWORD_MANAGER_BRAND" />에서 이 사이트의 비밀번호를 업데이트하도록 하시겠습니까?</translation>
+<translation id="5605057818926354551"><ph name="PASSWORD_MANAGER_BRAND" />에 저장된 이 사이트의 비밀번호를 업데이트하시겠습니까?</translation>
 <translation id="5605623530403479164">기타 검색엔진</translation>
 <translation id="5608580678041221894">다음 키를 탭하여 자르기 영역을 조정하거나 이동하세요.</translation>
 <translation id="5609231933459083978">애플리케이션이 잘못된 것 같습니다.</translation>
@@ -3146,7 +3143,7 @@
 <translation id="5882919346125742463">알려진 네트워크</translation>
 <translation id="5884474295213649357">이 탭이 USB 기기에 연결되었습니다.</translation>
 <translation id="5885324376209859881">미디어 설정 관리...</translation>
-<translation id="5887341066363321040"><ph name="ORIGIN" />에 저장된 비밀번호 없음</translation>
+<translation id="5887341066363321040"><ph name="ORIGIN" />의 비밀번호가 저장되지 않음</translation>
 <translation id="5889282057229379085">중간 인증기관(CA)의 최대 개수: <ph name="NUM_INTERMEDIATE_CA" />개</translation>
 <translation id="5895138241574237353">다시 시작</translation>
 <translation id="5895187275912066135">발급 날짜</translation>
@@ -3404,7 +3401,7 @@
 <translation id="6307990684951724544">시스템 사용 중</translation>
 <translation id="6308937455967653460">다른 이름으로 링크 저장(&amp;K)...</translation>
 <translation id="6311220991371174222">프로필을 여는 동안 문제가 발생했기 때문에 Chrome을 시작할 수 없습니다. Chrome을 다시 시작해 보세요.</translation>
-<translation id="6312400084708441752">유해한 소프트웨어, 시스템 설정, 컴퓨터에서 사용 중인 프로세스에 관한 정보를 포함합니다.</translation>
+<translation id="6312400084708441752">유해한 소프트웨어, 시스템 설정, 컴퓨터에서 실행 중인 프로세스에 관한 정보가 포함됩니다.</translation>
 <translation id="6312403991423642364">알려지지 않은 네트워크 오류</translation>
 <translation id="6313641880021325787">VR 종료</translation>
 <translation id="6314819609899340042">이 <ph name="IDS_SHORT_PRODUCT_NAME" /> 기기에서 디버깅 기능을 사용 설정했습니다.</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">기기에서 지문 센서를 찾아 손가락으로 터치합니다.</translation>
 <translation id="6390799748543157332">이 창에서 보는 페이지는 브라우저 기록에 나타나지 않으며 열려 있는 모든 손님 창을 닫은 후에도 컴퓨터에 쿠키와 같은 다른 흔적을 남기지 않습니다. 하지만 다운로드한 파일은 모두 저장됩니다.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />시스템 정보<ph name="END_LINK1" /> 및 <ph name="BEGIN_LINK2" />통계<ph name="END_LINK2" /> 전송</translation>
-<translation id="6397363302884558537">말하기 중지</translation>
 <translation id="6397592254427394018">모든 북마크를 시크릿 창에서 열기(&amp;I)</translation>
 <translation id="6398715114293939307">Google Play 스토어 삭제</translation>
 <translation id="6398765197997659313">전체화면 닫기</translation>
@@ -3600,7 +3596,7 @@
 <translation id="6613452264606394692">이 페이지를 북마크에 추가하여 빠르게 다시 방문하세요.</translation>
 <translation id="6615455863669487791">표시</translation>
 <translation id="661719348160586794">저장한 비밀번호가 여기에 표시됩니다.</translation>
-<translation id="6618097958368085618">계속 다운로드</translation>
+<translation id="6618097958368085618">보관</translation>
 <translation id="6619058681307408113">라인 프린터 데몬(LPD)</translation>
 <translation id="6619801788773578757">키오스크 애플리케이션 추가</translation>
 <translation id="6619990499523117484">PIN 확인</translation>
@@ -3631,7 +3627,7 @@
 <translation id="6659594942844771486">탭</translation>
 <translation id="6664237456442406323">컴퓨터가 잘못된 형식의 하드웨어 ID로 구성되어 있습니다. 이렇게 하면 Chrome OS가 최신 보안 수정사항을 업데이트할 수 없으며 컴퓨터가<ph name="BEGIN_BOLD" />악의적인 공격에 취약해 집니다<ph name="END_BOLD" />.</translation>
 <translation id="6664774537677393800">프로필을 여는 동안 문제가 발생했습니다. 로그아웃했다가 다시 로그인하세요.</translation>
-<translation id="6669827579181361875"><ph name="PASSWORD_MANAGER_BRAND" />이(가) 이 사이트에서 비밀번호를 저장하도록 하시겠습니까?</translation>
+<translation id="6669827579181361875"><ph name="PASSWORD_MANAGER_BRAND" />에 이 사이트의 비밀번호를 저장하시겠습니까?</translation>
 <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" />(USB)</translation>
 <translation id="667517062706956822">Google에서 이 페이지를 <ph name="SOURCE_LANGUAGE" />에서 <ph name="TARGET_LANGUAGE" />로 번역할까요?</translation>
 <translation id="6675665718701918026">포인팅 기기 연결됨</translation>
@@ -3828,7 +3824,7 @@
 <translation id="6990778048354947307">다크 테마</translation>
 <translation id="6991665348624301627">대상 선택</translation>
 <translation id="699220179437400583">발생 가능성이 있는 보안 문제의 세부정보를 자동으로 Google에 신고합니다.</translation>
-<translation id="6997707937646349884">내 기기:</translation>
+<translation id="6997707937646349884">기기에서 다음과 같이 설정하세요.</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" />개의 폴더가 선택됨</translation>
 <translation id="6998793565256476099">화상회의용 기기 등록</translation>
 <translation id="7000347579424117903">Ctrl, Alt, 검색 키가 포함되어야 합니다</translation>
@@ -3952,10 +3948,10 @@
 <translation id="7180865173735832675">맞춤설정</translation>
 <translation id="7186088072322679094">툴바에 보관</translation>
 <translation id="7187428571767585875">삭제 또는 변경할 레지스트리 항목:</translation>
-<translation id="7189234443051076392">기기 저장용량이 충분한지 확인하세요.</translation>
+<translation id="7189234443051076392">기기 저장용량이 충분한지 확인합니다.</translation>
 <translation id="7191159667348037">알 수 없는 프린터(USB)</translation>
 <translation id="7191454237977785534">다른 이름으로 저장</translation>
-<translation id="7193374945610105795"><ph name="ORIGIN" />에 저장된 비밀번호 없음</translation>
+<translation id="7193374945610105795"><ph name="ORIGIN" />의 비밀번호가 저장되지 않음</translation>
 <translation id="7196835305346730603">근처의 Chromebox를 검색하는 중...</translation>
 <translation id="7199158086730159431">도움말 보기</translation>
 <translation id="720110658997053098">이 기기를 키오스크 모드로 영구 고정</translation>
@@ -4023,6 +4019,7 @@
 <translation id="7297443947353982503">사용자 이름 또는 비밀번호가 잘못되었거나 EAP 인증에 실패했습니다.</translation>
 <translation id="729761647156315797">언어 및 키보드 선택</translation>
 <translation id="7299337219131431707">게스트로 로그인 허용</translation>
+<translation id="7303900363563182677">이 사이트는 클립보드에 복사된 텍스트 및 이미지에 액세스할 수 없습니다.</translation>
 <translation id="730515362922783851">로컬 네트워크 또는 인터넷의 모든 기기와 데이터 교환</translation>
 <translation id="7308002049209013926">런처를 사용하여 새로운 앱과 활동으로 빠르게 이동하세요. 키보드를 사용하여 이동하려면 Alt + Shift + L을 누르면 됩니다.</translation>
 <translation id="7309257895202129721">컨트롤 표시(&amp;C)</translation>
@@ -4243,7 +4240,7 @@
 <translation id="7664620655576155379">지원되지 않는 블루투스 기기(<ph name="DEVICE_NAME" />)입니다.</translation>
 <translation id="7665369617277396874">계정 추가</translation>
 <translation id="7671130400130574146">시스템 제목 표시줄 및 테두리 사용</translation>
-<translation id="7672520070349703697"><ph name="PAGE_TITLE" />의 <ph name="HUNG_IFRAME_URL" /></translation>
+<translation id="7672520070349703697"><ph name="PAGE_TITLE" />에 포함된 <ph name="HUNG_IFRAME_URL" /></translation>
 <translation id="7683373461016844951">계속하려면 확인을 클릭한 다음 사용자 추가를 클릭하여 <ph name="DOMAIN" /> 이메일 주소로 새로운 프로필을 만드세요.</translation>
 <translation id="7684212569183643648">관리자가 설치함</translation>
 <translation id="7684559058815332124">캡티브 포털 로그인 페이지로 이동</translation>
@@ -4252,7 +4249,7 @@
 <translation id="7690378713476594306">목록에서 선택</translation>
 <translation id="7690853182226561458">폴더 추가(&amp;F)...</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" />(이 기기에 이미 있음)</translation>
-<translation id="7696063401938172191">'<ph name="PHONE_NAME" />':</translation>
+<translation id="7696063401938172191">'<ph name="PHONE_NAME" />'에서 다음과 같이 설정하세요.</translation>
 <translation id="7698408911093959127">{COUNT,plural, =1{북마크 목록에 1개 항목이 있음}other{북마크 목록에 #개 항목이 있음}}</translation>
 <translation id="7701040980221191251">없음</translation>
 <translation id="7701869757853594372">사용자 처리</translation>
@@ -4305,7 +4302,7 @@
 <translation id="7782102568078991263">Google의 추천 단어 없음</translation>
 <translation id="778330624322499012"><ph name="PLUGIN_NAME" />을 로드하지 못함</translation>
 <translation id="7784067724422331729">컴퓨터의 보안 설정에 의해 파일이 차단되었습니다.</translation>
-<translation id="778480864305029524">인스턴트 테더링을 사용하려면 Google Play 서비스 알림을 사용 설정하세요</translation>
+<translation id="778480864305029524">인스턴트 테더링을 사용하려면 Google Play 서비스의 알림을 사용 설정하세요</translation>
 <translation id="7786207843293321886">게스트 세션 종료</translation>
 <translation id="7786889348652477777">앱 새로고침(&amp;R)</translation>
 <translation id="7787129790495067395">현재 암호를 사용하고 있습니다. 암호를 잊은 경우 Google 대시보드를 사용하여 동기화를 재설정함으로써 Google 서버에서 데이터를 삭제할 수 있습니다.</translation>
@@ -4404,6 +4401,7 @@
 <translation id="7909969815743704077">시크릿 모드에서 다운로드됨</translation>
 <translation id="7910768399700579500">새 폴더(&amp;N)</translation>
 <translation id="7912080627461681647">서버에서 비밀번호가 변경되었습니다. 로그아웃한 다음 다시 로그인해 주세요.</translation>
+<translation id="7912883689016444961">모바일 네트워크 설정</translation>
 <translation id="7915471803647590281">의견을 보내기 전에 현재 상황을 입력해 주세요.</translation>
 <translation id="7925247922861151263">AAA 확인 실패</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" />의 응답을 기다리는 중...</translation>
@@ -4525,7 +4523,7 @@
 <translation id="8077684120002777443">사용자 이름(예: user@example.com)</translation>
 <translation id="8077816382010018681">QU 기능 알림 제목이 여기 표시됨</translation>
 <translation id="8079530767338315840">반복</translation>
-<translation id="8079938625609335826">어느 기기에서나 모든 확장 프로그램을 사용하려면 동기화를 사용 설정하세요.</translation>
+<translation id="8079938625609335826">어느 기기에서나 내 확장 프로그램을 모두 사용하려면 동기화를 사용 설정하세요.</translation>
 <translation id="8083739373364455075">Google 드라이브에서 100GB의 공간을 무료로 사용하세요.</translation>
 <translation id="8086015605808120405"><ph name="PRINTER_NAME" /> 구성 중...</translation>
 <translation id="8090234456044969073">가장 자주 방문한 웹사이트 목록 보기</translation>
@@ -4610,7 +4608,7 @@
 <translation id="8234795456569844941">Google 엔지니어가 이 문제를 해결하도록 도와주세요. 프로필 오류 메시지가 표시되기 직전에 무슨 일이 있었는지 알려 주시기 바랍니다.</translation>
 <translation id="8234989666557591529"><ph name="DEVICE_TYPE" />을(를) 잠금 해제할 휴대전화 선택</translation>
 <translation id="8238649969398088015">도움말</translation>
-<translation id="8239020549147958415"><ph name="FULL_NAME" />(으)로 동기화</translation>
+<translation id="8239020549147958415"><ph name="FULL_NAME" /> 계정과 동기화</translation>
 <translation id="8240697550402899963">기본 테마 사용</translation>
 <translation id="8241040075392580210">해와 구름</translation>
 <translation id="8241806945692107836">기기 설정을 확인하는 중...</translation>
@@ -4746,7 +4744,7 @@
 <translation id="8465444703385715657"><ph name="PLUGIN_NAME" />에 실행 권한이 필요합니다.</translation>
 <translation id="8466234950814670489">Tar 압축 파일</translation>
 <translation id="8468750959626135884">Android 휴대전화로 <ph name="DEVICE_TYPE" />을(를) 잠금 해제하세요.</translation>
-<translation id="8470513973197838199"><ph name="ORIGIN" />에 저장된 비밀번호</translation>
+<translation id="8470513973197838199"><ph name="ORIGIN" />의 저장된 비밀번호</translation>
 <translation id="8472623782143987204">하드웨어 지원</translation>
 <translation id="8475313423285172237">컴퓨터의 다른 프로그램에서 Chrome 작동에 영향을 줄 수 있는 확장 프로그램을 추가했습니다.</translation>
 <translation id="8475647382427415476">Google 드라이브에서 '<ph name="FILENAME" />'을(를) 동기화하지 못했습니다. Google 드라이브에서 나중에 다시 시도합니다.</translation>
@@ -4798,7 +4796,7 @@
 <translation id="8569682776816196752">목적지를 찾을 수 없음</translation>
 <translation id="8569764466147087991">열려는 파일 선택</translation>
 <translation id="8571213806525832805">지난 4주</translation>
-<translation id="8571613743082299268">사이트로의 리디렉션이 차단되었습니다.</translation>
+<translation id="8571613743082299268">다음 사이트로의 리디렉션이 차단되었습니다.</translation>
 <translation id="8574990355410201600"><ph name="HOST" />에서 소리 항상 허용</translation>
 <translation id="8578639784464423491">99자를 초과할 수 없습니다.</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />개 항목 동기화 중...</translation>
@@ -4915,6 +4913,7 @@
 <translation id="8736288397686080465">이 사이트는 백그라운드에서 업데이트되었습니다.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> 대신 <ph name="PROTOCOL" /> 링크 열기</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">PIP 모드</translation>
 <translation id="8743864605301774756">1시간 전에 업데이트되었습니다.</translation>
 <translation id="8749863574775030885">알 수 없는 공급업체의 USB 기기에 액세스</translation>
 <translation id="8754200782896249056">&lt;p&gt;지원되는 데스크톱 환경에서 <ph name="PRODUCT_NAME" />을(를) 실행하는 경우 시스템 프록시 설정이 사용됩니다.  하지만 시스템이 지원되지 않거나 시스템 설정을 실행하는 데 문제가 있었습니다.&lt;/p&gt;
@@ -5017,7 +5016,6 @@
 <translation id="8912793549644936705">늘이기</translation>
 <translation id="8915370057835397490">추천 단어 로드 중...</translation>
 <translation id="8916476537757519021">시크릿 모드 서브프레임: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" />에 동기화</translation>
 <translation id="8922013791253848639">이 사이트의 광고 항상 허용</translation>
 <translation id="8925458182817574960">설정(&amp;S)</translation>
 <translation id="8926389886865778422">이 메시지 그만 보기</translation>
@@ -5046,7 +5044,7 @@
 <translation id="8962083179518285172">세부정보 숨기기</translation>
 <translation id="8965037249707889821">이전 비밀번호 입력</translation>
 <translation id="8965697826696209160">저장 공간이 부족합니다.</translation>
-<translation id="8967866634928501045">표시하려면 Alt+Shift+A를 누르세요.</translation>
+<translation id="8967866634928501045">표시하려면 Alt Shift A를 누르세요</translation>
 <translation id="8970203673128054105">전송 모드 목록 보기</translation>
 <translation id="89720367119469899">Esc</translation>
 <translation id="8973557916016709913">확대/축소 레벨 삭제</translation>
@@ -5107,7 +5105,7 @@
 <translation id="9056810968620647706">일치하는 항목이 없습니다.</translation>
 <translation id="9057119625587205566">주변에 프린터 없음</translation>
 <translation id="9059868303873565140">상태 메뉴</translation>
-<translation id="9063208415146866933"><ph name="ERROR_LINE_START" />~<ph name="ERROR_LINE_END" /> 줄에 오류 있음</translation>
+<translation id="9063208415146866933"><ph name="ERROR_LINE_START" />행부터 <ph name="ERROR_LINE_END" />행까지에 오류가 있음</translation>
 <translation id="9064142312330104323">Google 프로필 사진(로드 중)</translation>
 <translation id="9064275926664971810">클릭 한 번으로 양식을 작성하는 자동완성 사용</translation>
 <translation id="9064939804718829769">이전 중...</translation>
@@ -5198,7 +5196,7 @@
 <translation id="932327136139879170">홈</translation>
 <translation id="932508678520956232">인쇄를 시작할 수 없습니다.</translation>
 <translation id="93393615658292258">비밀번호만</translation>
-<translation id="934503638756687833">필요하다면 여기에 표시되지 않은 항목도 삭제할 수 있습니다. Chrome 개인정보 보호 백서에서 &lt;a href="<ph name="URL" />"&gt;원치 않는 소프트웨어 보호&lt;/a&gt;에 관해 자세히 알아보세요.</translation>
+<translation id="934503638756687833">필요한 경우 여기에 표시되지 않은 항목도 삭제됩니다. Chrome 개인정보 보호 백서에서 &lt;a href="<ph name="URL" />"&gt;원치 않는 소프트웨어 보호&lt;/a&gt;에 관해 자세히 알아보세요.</translation>
 <translation id="935490618240037774">북마크, 방문 기록, 비밀번호, 기타 설정이 Google 계정에 동기화되므로 모든 기기에서 사용할 수 있습니다.</translation>
 <translation id="936801553271523408">시스템 진단 데이터</translation>
 <translation id="93766956588638423">확장 프로그램 복구</translation>
@@ -5212,7 +5210,7 @@
 <translation id="942954117721265519">이 디렉토리에 이미지가 없습니다.</translation>
 <translation id="945522503751344254">의견 보내기</translation>
 <translation id="952992212772159698">활성화되지 않음</translation>
-<translation id="957960681186851048">이 사이트에서 여러 파일을 자동으로 다운로드하려고 함</translation>
+<translation id="957960681186851048">이 사이트에서 여러 파일을 자동으로 다운로드하려고 합니다</translation>
 <translation id="9580706199804957">Google 서비스에 연결할 수 없음</translation>
 <translation id="958515377357646513">앞으로 이동하려면 터치하세요.</translation>
 <translation id="960719561871045870">운영자 코드</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 368aca4..fb2d126 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Paspaudus tinklalapio skirtuką paryškinamos nuorodos ir formos laukai</translation>
 <translation id="2916745397441987255">Ieškoti plėtinių</translation>
 <translation id="2921081876747860777">Sukurkite slaptažodį, kad apsaugotumėte vietinius duomenis.</translation>
-<translation id="2924395203970765374">Sinchronizuota su <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Skaičiuoklės</translation>
 <translation id="2927017729816812676">Talpyklos saugykla</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (vaikų paskyra)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Sveikiname</translation>
 <translation id="3349933790966648062">Atminties naudojimas</translation>
 <translation id="3353984535370177728">Pasirinkite norimą įkelti aplanką</translation>
-<translation id="335581015389089642">Kalba</translation>
 <translation id="3355936511340229503">Ryšio klaida</translation>
 <translation id="3356797067524893661">Viskas nustatyta – galite eiti į „Hangout Meet“</translation>
 <translation id="3358935496594837302">Nepavyksta rasti jūsų telefono. Įsitikinkite, kad naudojate suderinamą „Android“ telefoną, kuris įjungtas ir yra netoliese. &lt;a&gt;Sužinokite daugiau&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Atidaryti naujo skirtuko lape</translation>
 <translation id="3616113530831147358">Garsas</translation>
 <translation id="3616741288025931835">&amp;Išvalyti naršymo duomenis...</translation>
-<translation id="3618849550573277856">Ieškoti „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="3620292326130836921">Atsarginis kopijavimas baigtas!</translation>
 <translation id="3623574769078102674">Šį prižiūrimą naudotoją tvarkys <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Ekrano kopijos išjungtos</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Tikrinant šį failą netikėtai įvyko antivirusinės programinės įrangos klaida.</translation>
 <translation id="428608937826130504">8 lentynos elementas</translation>
 <translation id="4287502004382794929">Neturite pakankamai programinės įrangos licencijų, kad galėtumėte priregistruoti šį įrenginį. Susisiekite su pardavimo skyriumi, kad įsigytumėte daugiau. Jei manote, kad šį pranešimą gavote per klaidą, susisiekite su palaikymo tarnyba.</translation>
-<translation id="4289300219472526559">Pradėti kalbėti</translation>
 <translation id="4289540628985791613">Apžvalga</translation>
 <translation id="4296575653627536209">Pridėti prižiūrimą naudotoją</translation>
 <translation id="4297322094678649474">Keisti kalbas</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Tinklo klaida</translation>
 <translation id="4816492930507672669">Pritaikyti pagal puslapį</translation>
 <translation id="4820334425169212497">Ne, nematau</translation>
-<translation id="4821725298388681253">Tai yra iš anksto išleista versija. Kai kurios funkcijos, pvz., paieška ir teksto įvedimas, dar neveikia.</translation>
 <translation id="4821935166599369261">&amp;Profiliavimas įgalintas</translation>
 <translation id="4823484602432206655">Skaityti ir keisti naudotojo bei įrenginio nustatymus</translation>
 <translation id="4823651846660089135">Įrenginys yra tik skaitomas</translation>
@@ -3453,7 +3448,6 @@
 <translation id="6388771388956873507">Raskite įrenginio kontrolinio kodo jutiklį ir palieskite jį pirštu</translation>
 <translation id="6390799748543157332">Puslapiai, kuriuos peržiūrite šiame lange, nerodomi naršyklės istorijoje. Kai uždarysite visus svečio langus, kompiuteryje neliks ir kitų jų pėdsakų, pvz., slapukų, tačiau atsisiųsti failai bus išsaugoti.</translation>
 <translation id="6395423953133416962">Siųsti <ph name="BEGIN_LINK1" />sistemos informaciją<ph name="END_LINK1" /> ir <ph name="BEGIN_LINK2" />metriką<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Baigti kalbėti</translation>
 <translation id="6397592254427394018">Atidaryti visas žymes &amp;inkognito lange</translation>
 <translation id="6398715114293939307">Pašalinti „Google Play“ parduotuvę</translation>
 <translation id="6398765197997659313">Išeiti iš viso ekrano režimo</translation>
@@ -5023,7 +5017,6 @@
 <translation id="8912793549644936705">Ištemptas</translation>
 <translation id="8915370057835397490">Įkeliamas pasiūlymas</translation>
 <translation id="8916476537757519021">Inkognito antrinis kadras: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sinchronizuoti <ph name="ACCOUNT_FULL_NAME" /> paskyroje</translation>
 <translation id="8922013791253848639">Visada leisti skelbimus šioje svetainėje</translation>
 <translation id="8925458182817574960">&amp;Nustatymai</translation>
 <translation id="8926389886865778422">Neklauskite dar kartą</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index fe00f99a..d36e78a4d 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Tabulēšanas taustiņa piespiešana tīmekļa lapā izgaismo saites, kā arī veidlapu laukus</translation>
 <translation id="2916745397441987255">Meklēt paplašinājumus</translation>
 <translation id="2921081876747860777">Paroles izveide lokālo datu aizsardzībai</translation>
-<translation id="2924395203970765374">Sinhronizēts ar kontu <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Izklājlapas</translation>
 <translation id="2927017729816812676">Kešatmiņas krātuve</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (bērniem paredzēts konts)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Apsveicam!</translation>
 <translation id="3349933790966648062">Atmiņas pēdas nospiedums</translation>
 <translation id="3353984535370177728">Atlasīt augšupielādējamo mapi</translation>
-<translation id="335581015389089642">Runa</translation>
 <translation id="3355936511340229503">Savienojuma kļūda</translation>
 <translation id="3356797067524893661">Jūs esat gatavs izmantot pakalpojumu Hangouts Meet</translation>
 <translation id="3358935496594837302">Nevar atrast tālruni. Jums ir jāizmanto saderīgs Android tālrunis, kurš ir ieslēgts un atrodas rokas stiepiena attālumā. &lt;a&gt;Uzziniet vairāk&lt;/a&gt;.</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Atvērt jaunā cilnē</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Dzēst pārlūkošanas datus...</translation>
-<translation id="3618849550573277856">Meklēt “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Visi faili ir dublēti.</translation>
 <translation id="3623574769078102674">Šo uzraudzīto lietotāju pārvaldīs <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Ekrānuzņēmumi atspējoti</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Šī faila pārbaudes laikā radās neparedzēta pretvīrusu programmatūras kļūda.</translation>
 <translation id="428608937826130504">8. plaukta vienums</translation>
 <translation id="4287502004382794929">Jums nav pietiekami daudz programmatūras licenču, lai reģistrētu šo ierīci. Lūdzu, sazinieties ar tirdzniecības nodaļu, lai iegādātos vairāk licenču. Ja uzskatāt, ka šis ziņojums tiek parādīts kļūdas dēļ, lūdzu, sazinieties ar atbalsta dienestu.</translation>
-<translation id="4289300219472526559">Sākt runāt</translation>
 <translation id="4289540628985791613">Kopsavilkums</translation>
 <translation id="4296575653627536209">Pievienot uzraudzītu lietotāju</translation>
 <translation id="4297322094678649474">Mainīt valodas</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Tīkla kļūda</translation>
 <translation id="4816492930507672669">Ietilpināt lapā</translation>
 <translation id="4820334425169212497">Nē, es to neredzu</translation>
-<translation id="4821725298388681253">Šis ir agrīnais laidiens. Dažas funkcijas, piemēram, meklēšana un teksta ievade, vēl nav pieejamas.</translation>
 <translation id="4821935166599369261">%Profilēšana iespējota</translation>
 <translation id="4823484602432206655">Lasīt un mainīt lietotāja un ierīces iestatījumus</translation>
 <translation id="4823651846660089135">Ierīce ir tikai lasāma.</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Ar pirkstu pieskarieties savas ierīces pirkstu nospiedumu sensoram.</translation>
 <translation id="6390799748543157332">Lapas, ko skatāt šajā logā, nebūs redzamas pārlūka vēsturē, un, kad aizvērsiet visus viesa režīmā atvērtos logus, datorā nepaliks nekādi vienumi, piemēram, sīkfaili. Tomēr visi lejupielādētie faili tiks saglabāti.</translation>
 <translation id="6395423953133416962">Sūtīt <ph name="BEGIN_LINK1" />sistēmas informāciju<ph name="END_LINK1" /> un <ph name="BEGIN_LINK2" />datus<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Pārtraukt runāt</translation>
 <translation id="6397592254427394018">Atvērt visas grāmatzīmes &amp;inkognito režīma logā</translation>
 <translation id="6398715114293939307">Noņemt Google Play veikalu</translation>
 <translation id="6398765197997659313">Iziet no pilnekrāna režīma</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Izstiept</translation>
 <translation id="8915370057835397490">Notiek ieteikumu ielāde...</translation>
 <translation id="8916476537757519021">Inkognito apakšrāmis: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sinhronizēt ar kontu <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Vienmēr atļaut reklāmu rādīšanu šajā vietnē</translation>
 <translation id="8925458182817574960">&amp;Iestatījumi</translation>
 <translation id="8926389886865778422">Nejautāt atkārtoti</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index d6f7636d..fae47fa 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -6,7 +6,7 @@
 <translation id="1005274289863221750">നിങ്ങളുടെ മൈക്രോഫോണും ക്യാമറയും ഉപയോഗിക്കുക</translation>
 <translation id="1007408791287232274">ഉപകരണങ്ങൾ ലോഡുചെയ്യാനായില്ല.</translation>
 <translation id="1008186147501209563">ബുക്ക്‌മാർക്കുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യുക</translation>
-<translation id="1009147628737158130">നിങ്ങളുടെ സുരക്ഷാ കീയെക്കുറിച്ചുള്ള തിരിച്ചറിയൽ വിവരങ്ങൾ കാണാൻ <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation>
+<translation id="1009147628737158130">നിങ്ങളുടെ സുരക്ഷാ കീയെക്കുറിച്ചുള്ള തിരിച്ചറിയൽ വിവരങ്ങൾ കാണാൻ <ph name="URL" /> താൽപ്പര്യപ്പെടുന്നു</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{പേജ് പ്രതികരിക്കുന്നില്ല}other{പേജുകൾ പ്രതികരിക്കുന്നില്ല}}</translation>
 <translation id="1012794136286421601">നിങ്ങളുടെ ഡോക്‌സ്, ഷീറ്റുകൾ, സ്ലൈഡുകൾ, ഡ്രോയിംഗ് ഫയലുകൾ എന്നിവ സമന്വയിപ്പിക്കുന്നു. അവ ഓൺലൈനിലോ ഓഫ്‌ലൈനിലോ ആക്‌സസ്സുചെയ്യുന്നതിന് Google ഡ്രൈവ് അപ്ലിക്കേഷൻ തുറക്കുക.</translation>
 <translation id="1013707859758800957">ഈ പേജിൽ പ്രവർത്തിക്കാൻ സാൻഡ്‌ബോക്‌സുചെയ്യാത്ത പ്ലഗിൻ അനുവദിച്ചിരിക്കുന്നു.</translation>
@@ -586,7 +586,7 @@
 <translation id="1878524442024357078">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ആക്‌സസ്സ് ചെയ്യാൻ പ്ലഗിൻ ഉപയോഗിക്കുന്നതിന് ഒരു സൈറ്റുകളെയും അനുവദിക്കരുത്</translation>
 <translation id="1879449842763884566">അപ്ലിക്കേഷനുകളിലേക്ക് ഇൻസ്‌റ്റാൾ ചെയ്യുക...</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" സര്‍ട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കണോ?</translation>
-<translation id="188190999506226223"><ph name="ORIGIN" />-നായി നിങ്ങളുടെ പാസ്‌വേഡ് <ph name="PASSWORD_MANAGER_BRAND" /> സംരക്ഷിക്കണോ?</translation>
+<translation id="188190999506226223"><ph name="ORIGIN" />-നായി <ph name="PASSWORD_MANAGER_BRAND" /> നിങ്ങളുടെ പാസ്‌വേഡ് സംരക്ഷിക്കണോ?</translation>
 <translation id="1886996562706621347">പ്രോട്ടോകോളുകള്‍ക്കായി സ്ഥിരസ്ഥിതി ഹാന്‍ഡ്‌ലറുകള്‍ ആകുന്നത് ആവശ്യപ്പെടാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു (ശുപാർശിതം)</translation>
 <translation id="1887442540531652736">സൈൻ-ഇൻ പിശക്</translation>
 <translation id="1887850431809612466">ഹാർഡ്‌വെയർ അവലോകനം</translation>
@@ -880,6 +880,7 @@
 <translation id="2359345697448000899">ഉപകരണങ്ങൾ മെനുവിലെ വിപുലീകരണങ്ങളിൽ ക്ലിക്കുചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ വിപുലീകരണങ്ങൾ നിയന്ത്രിക്കുക.</translation>
 <translation id="2359808026110333948">തുടരൂ</translation>
 <translation id="236141728043665931">എല്ലായ്‌പ്പോഴും മൈക്രോഫോൺ ആക്‌സസ്സ് തടയുക</translation>
+<translation id="2365507699358342471">ക്ലിപ്പ്‌ബോർഡിലേക്ക് പകർത്തിയിട്ടുള്ള ടെക്‌സ്‌റ്റും ചിത്രങ്ങളും ഈ സൈറ്റിന് കാണാനാകും.</translation>
 <translation id="2367972762794486313">അപ്ലിക്കേഷനുകൾ കാണിക്കുക</translation>
 <translation id="2371076942591664043">ചെയ്തുകഴിയുമ്പോള്‍ &amp;തുറക്കുക</translation>
 <translation id="2377319039870049694">ലിസ്റ്റ് കാഴ്‌ചയിലേക്ക് മാറുക</translation>
@@ -1100,7 +1101,7 @@
 <translation id="270358213449696159">Google Chrome OS നിബന്ധനകളുടെ ഉള്ളടക്കം</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
 <translation id="270516211545221798">ടച്ച്പാഡിന്റെ വേഗത</translation>
-<translation id="2705736684557713153">സ്‌ക്രീനിന്റെ താഴേയ്ക്ക് സ്‍ക്രോള്‍ ചെയ്യുകയും, തൽക്ഷണ ടെതറിംഗ് ദൃശ്യമാകുന്നെങ്കിൽ അത് ഓണാക്കുകയും ചെയ്യുക. അത് ദൃശ്യമാകുന്നില്ലെങ്കിൽ, നിങ്ങൾ സജ്ജമായി.</translation>
+<translation id="2705736684557713153">സ്‌ക്രീനിന്റെ താഴേക്ക് സ്‍ക്രോള്‍ ചെയ്യുകയും, തൽക്ഷണ ടെതറിംഗ് ദൃശ്യമാകുന്നെങ്കിൽ അത് ഓണാക്കുകയും ചെയ്യുക. അത് ദൃശ്യമാകുന്നില്ലെങ്കിൽ, നിങ്ങൾ സജ്ജമായി.</translation>
 <translation id="2706892089432507937">USB ഉപകരണങ്ങൾ</translation>
 <translation id="2706954854267016964">തിരഞ്ഞെടുത്ത Google ക്ലൗഡ് പ്രിന്‍റർ ഉപകരണത്തിന് ഇനിയങ്ങോട്ട് പിന്തുണയില്ല. നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്‍റെ സിസ്റ്റം ക്രമീകരണത്തിൽ പ്രിന്‍റർ സജ്ജമാക്കിക്കൊണ്ട് ശ്രമിക്കുക.</translation>
 <translation id="2707024448553392710">ഘടക ഭാഗം ഡൗൺലോഡുചെയ്യുന്നു</translation>
@@ -1232,7 +1233,7 @@
 <translation id="2871813825302180988">ഈ ഉപകരണത്തിൽ ഈ അക്കൗണ്ട് ഇതിനകം ഉപയോഗിക്കുന്നുണ്ട്.</translation>
 <translation id="2872353916818027657">പ്രാഥമിക മോണിറ്റർ സ്വാപ്പുചെയ്യുക</translation>
 <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> ചേർക്കുക...</translation>
-<translation id="2874343608108773609">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും പാസ്‍വേഡുകൾ ലഭിക്കാൻ, Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
+<translation id="2874343608108773609">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും പാസ്‍വേഡുകൾ ലഭിക്കാൻ, Chrome-ത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="2875698561019555027">(Chrome പിശക് പേജുകൾ)</translation>
 <translation id="288042212351694283">നിങ്ങളുടെ യൂണിവേഴ്‌സൽ സെക്കൻഡ് ഫാക്‌റ്റർ ഉപകരണങ്ങൾ ആക്‌സസ്സുചെയ്യുക</translation>
 <translation id="2881966438216424900">അവസാനം ആക്‌സസുചെയ്‌തത്:</translation>
@@ -1267,7 +1268,6 @@
 <translation id="2916073183900451334">വെബ്‌പേജിലെ ടാബില്‍‌ അമര്‍‌ത്തുന്നത് ലിങ്കുകളെയും ഫോം ഫീല്‍‌ഡുകളെയും പ്രമുഖമാക്കി കാണിക്കുന്നു</translation>
 <translation id="2916745397441987255">വിപുലീകരണങ്ങൾ തിരയുക</translation>
 <translation id="2921081876747860777">നിങ്ങളുടെ ലോക്കൽ ഡാറ്റ സംരക്ഷിക്കുന്നതിന് ഒരു പാസ്‌വേഡ് സൃഷ്‌ടിക്കുക.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" />-ലേക്ക് സമന്വയിപ്പിച്ചു</translation>
 <translation id="2925966894897775835">ഷീറ്റുകൾ</translation>
 <translation id="2927017729816812676">കാഷെ സ്‌റ്റോറേജ്</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (കുട്ടികൾക്കായുള്ള അക്കൗണ്ട്)</translation>
@@ -1436,7 +1436,7 @@
 <translation id="316307797510303346"><ph name="CUSTODIAN_EMAIL" /> എന്നതിൽ നിന്നും ഈ വ്യക്തി സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകൾ നിയന്ത്രിക്കുക, കാണുക.
     നിങ്ങളുടെ അക്കൗണ്ട് സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടു.</translation>
 <translation id="3165390001037658081">ചില സേവനദായകർ ഈ ഫീച്ചർ ബ്ലോക്കുചെയ്‌തേക്കും.</translation>
-<translation id="316854673539778496">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ എല്ലാ ഉപകരണങ്ങളിലും ലഭിക്കാൻ, സൈൻ ഇൻ ചെയ്‌ത്, 'സമന്വയിപ്പിക്കുക' ഓണാക്കുക.</translation>
+<translation id="316854673539778496">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ എല്ലാ ഉപകരണങ്ങളിലും ലഭിക്കാൻ, സൈൻ ഇൻ ചെയ്‌ത്, 'സമന്വയിപ്പിക്കൽ' ഓണാക്കുക.</translation>
 <translation id="3170072451822350649">നിങ്ങൾക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് ഒഴിവാക്കി <ph name="LINK_START" />അതിഥിയായി ബ്രൗസുചെയ്യാനുമാകും<ph name="LINK_END" />.</translation>
 <translation id="3177048931975664371">പാസ്‌വേഡ് മറയ്ക്കുന്നതിനായി ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="3177857336576585529"><ph name="SITE_NAME" /> എന്ന സൈറ്റിനൊരു അനുമതി അഭ്യർത്ഥനയുണ്ട്.</translation>
@@ -1550,7 +1550,6 @@
 <translation id="3348459612390503954">അഭിനന്ദനങ്ങൾ</translation>
 <translation id="3349933790966648062">മെമ്മറി ഫൂട്ട് പ്രിന്‍റ്</translation>
 <translation id="3353984535370177728">അപ്‌ലോഡുചെയ്യുന്നതിന് ഒരു ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
-<translation id="335581015389089642">സംഭാഷണം</translation>
 <translation id="3355936511340229503">കണക്ഷന്‍ പിശക്.</translation>
 <translation id="3356797067524893661">Hangouts Meet-ൽ തുടരുന്നതിന് നിങ്ങൾ സജ്ജമാണ്</translation>
 <translation id="3358935496594837302">നിങ്ങളുടെ ഫോൺ കണ്ടെത്താനാകുന്നില്ല. അനുയോജ്യമായ Android ഫോൺ ആണ് ഉപയോഗിക്കുന്നതെന്നും അത് ഓണാണെന്നും കൈയ്യിലുണ്ടെന്നും ഉറപ്പാക്കുക. &lt;a&gt;കൂടുതലറിയുക&lt;/a&gt;</translation>
@@ -1727,7 +1726,6 @@
 <translation id="3613422051106148727">പുതിയ ടാബിൽ &amp;തുറക്കുക</translation>
 <translation id="3616113530831147358">ഓഡിയോ</translation>
 <translation id="3616741288025931835">&amp;ബ്രൌസിംഗ് ഡാറ്റ ഇല്ലാതാക്കുക...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” തിരയുക</translation>
 <translation id="3620292326130836921">എല്ലാം ബാക്കപ്പുചെയ്‌തു!</translation>
 <translation id="3623574769078102674">സൂപ്പർവൈസ് ചെയ്‌ത ഈ ഉപയോക്താവിനെ <ph name="MANAGER_EMAIL" /> നിയന്ത്രിക്കും.</translation>
 <translation id="3625258641415618104">സ്‌ക്രീൻഷോട്ടുകൾ പ്രവർത്തനരഹിതമാക്കി</translation>
@@ -1799,7 +1797,7 @@
 <translation id="3727148787322499904">ഈ ക്രമീകരണം മാറ്റുന്നത് എല്ലാ പങ്കിട്ട നെറ്റ്‌വർക്കുകളെയും ബാധിക്കാനിടയാക്കും</translation>
 <translation id="3727187387656390258">പോപ്പ്‌അപ്പ് പരിശോധിക്കുക</translation>
 <translation id="3728067901555601989">OTP:</translation>
-<translation id="3732078975418297900"><ph name="ERROR_LINE" />-മത്തെ ലൈനിൽ പിശക്</translation>
+<translation id="3732078975418297900"><ph name="ERROR_LINE" />-മത്തെ വരിയിൽ പിശക്</translation>
 <translation id="3733127536501031542">സ്റ്റെപ്പ്-അപ്പ് ഉള്ള SSL സെര്‍വര്‍ </translation>
 <translation id="3737536731758327622">നിങ്ങളുടെ ഡൗൺലോഡുകൾ ഇവിടെ ദൃശ്യമാകും</translation>
 <translation id="3738924763801731196"><ph name="OID" />:</translation>
@@ -2141,7 +2139,6 @@
 <translation id="428565720843367874">ഈ ഫയൽ സ്‌കാൻ ചെയ്യുന്നതിൽ ആന്റി വൈറസ് സോഫ്റ്റ്‌വെയർ അപ്രതീക്ഷിതമായി പരാജയപ്പെട്ടു.</translation>
 <translation id="428608937826130504">ഷെൽഫ് ഇനം 8</translation>
 <translation id="4287502004382794929">നിങ്ങൾക്ക് ഈ ഉപകരണം ചേർക്കുന്നതിനാവശ്യമായ സോഫ്റ്റ്‌വെയർ ലൈസൻസ് ഇല്ല. കൂടുതൽ വാങ്ങുന്നതിന് വിൽപ്പനയുമായി ബന്ധപ്പെടുക. ഈ സന്ദേശം പിശക് കാരണമാണെന്ന് നിങ്ങൾ കരുതുന്നുവെങ്കിൽ പിന്തുണയുമായി ബന്ധപ്പെടുക.</translation>
-<translation id="4289300219472526559">സംഭാഷണം ആരംഭിക്കുക</translation>
 <translation id="4289540628985791613">അവലോകനം</translation>
 <translation id="4296575653627536209">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ ചേർക്കുക</translation>
 <translation id="4297322094678649474">ഭാഷകൾ മാറ്റുക</translation>
@@ -2402,6 +2399,7 @@
 <translation id="4748762018725435655">Chrome വെബ് സ്റ്റോറിൽ നിന്നുള്ള വിപുലീകരണം ആവശ്യമാണ്</translation>
 <translation id="4750394297954878236">നിർദ്ദേശങ്ങൾ</translation>
 <translation id="475088594373173692">ആദ്യ ഉപയോക്താവ്</translation>
+<translation id="4751476147751820511">ചലന അല്ലെങ്കിൽ വെളിച്ച സെൻസറുകൾ</translation>
 <translation id="4756378406049221019">നിർത്തുക/റീലോഡുചെയ്യുക</translation>
 <translation id="4756388243121344051">&amp;ചരിത്രം</translation>
 <translation id="4759238208242260848">ഡൌണ്‍ലോഡുകള്‍</translation>
@@ -2436,7 +2434,6 @@
 <translation id="4813512666221746211">നെറ്റ്‌വര്‍ക്ക് പിശക്</translation>
 <translation id="4816492930507672669">പേജിന് യുക്തമാക്കുക</translation>
 <translation id="4820334425169212497">ഇല്ല, ഞാനത് കണ്ടില്ല</translation>
-<translation id="4821725298388681253">ഇത് നേരത്തേയുള്ള റിലീസാണ്. തിരയൽ, ടെക്‌സ്‌റ്റ് എൻട്രി പോലുള്ള ചില ഫീച്ചറുകൾ ഇനിയും ലഭ്യമായിട്ടില്ല.</translation>
 <translation id="4821935166599369261">&amp;പ്രൊഫൈലിംഗ് പ്രാപ്തമാക്കി</translation>
 <translation id="4823484602432206655">ഉപയോക്തൃ, ഉപകരണ ക്രമീകരണങ്ങൾ റീഡുചെയ്‌ത് മാറ്റുക</translation>
 <translation id="4823651846660089135">ഉപകരണം വായിക്കാൻ മാത്രമുള്ള മോഡിലാണ്</translation>
@@ -2463,7 +2460,7 @@
 <translation id="4850669014075537160">സ്‌ക്രോൾ ചെയ്യൽ</translation>
 <translation id="4850886885716139402">കാണുക</translation>
 <translation id="4853020600495124913">&amp;പുതിയ വിന്‍‌ഡോയില്‍‌ തുറക്കുക</translation>
-<translation id="4853882474657327078"><ph name="ORIGIN" />-നായി നിങ്ങളുടെ പാസ്‌വേഡ് <ph name="PASSWORD_MANAGER_BRAND" /> അപ്‌ഡേറ്റ് ചെയ്യണോ?</translation>
+<translation id="4853882474657327078"><ph name="ORIGIN" />-നായി <ph name="PASSWORD_MANAGER_BRAND" /> നിങ്ങളുടെ പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യണോ?</translation>
 <translation id="4856478137399998590">നിങ്ങളുടെ ഡാറ്റ സേവനം സജീവമാക്കി ഒപ്പം ഉപയോഗക്ഷമവുമായി</translation>
 <translation id="4857506433977877623">{COUNT,plural, =0{എല്ലാം &amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}=1{&amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}other{എല്ലാം (#) &amp;അദൃശ്യ വിൻഡോയിൽ തുറക്കുക}}</translation>
 <translation id="4858913220355269194">ഫ്രിറ്റ്‌സ്</translation>
@@ -3447,7 +3444,6 @@
 <translation id="6388771388956873507">നിങ്ങളുടെ ഉപകരണത്തിലെ വിരലടയാള സെൻസർ കണ്ടെത്തി, അത് വിരൽ കൊണ്ട് സ്‌പർശിക്കുക</translation>
 <translation id="6390799748543157332">തുറന്നിരിക്കുന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ചുകഴിഞ്ഞാൽ, ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ നിങ്ങളുടെ ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും, നിങ്ങൾ ഡൗൺലോഡുചെയ്യുന്ന എല്ലാ ഫയലുകളും സൂക്ഷിക്കും.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്‌സും<ph name="END_LINK2" /> അയയ്‌ക്കുക</translation>
-<translation id="6397363302884558537">സംഭാഷണം നിർത്തുക</translation>
 <translation id="6397592254427394018">&amp;വേഷ പ്രച്ഛന്ന വിന്‍ഡോയിലെ എല്ലാ ബുക്ക്മാര്‍ക്കുകളും തുറക്കുക</translation>
 <translation id="6398715114293939307">Google Play സ്‌റ്റോർ നീക്കംചെയ്യുക</translation>
 <translation id="6398765197997659313">പൂര്‍ണ്ണ സ്ക്രീനില്‍ നിന്ന് പുറത്തുകടക്കുക</translation>
@@ -3629,7 +3625,7 @@
 <translation id="6659594942844771486">ടാബ്</translation>
 <translation id="6664237456442406323">നിർഭാഗ്യവശാൽ, കേടായ ഒരു ഹാർഡ്‌വെയർ ID ഉപയോഗിച്ചാണ് നിങ്ങളുടെ കമ്പ്യൂട്ടർ കോൺഫിഗർ ചെയ്‌തിരിക്കുന്നത്. ഇത് ഏറ്റവും പുതിയ സുരക്ഷാ പരിഹാരങ്ങൾ അപ്‌ഡേറ്റുചെയ്യുന്നതിൽ നിന്നും Chrome OS-നെ തടയുന്നു, ഒപ്പം നിങ്ങളുടെ കമ്പ്യൂട്ടർ <ph name="BEGIN_BOLD" />ക്ഷുദ്രകരമായ ആക്രമണങ്ങളാൽ കേടാകാനുമിടയുണ്ട്<ph name="END_BOLD" />.</translation>
 <translation id="6664774537677393800">നിങ്ങളുടെ പ്രൊഫൈൽ തുറക്കുമ്പോൾ എന്തോ കുഴപ്പമുണ്ടായി. സൈൻ ഔട്ട് ചെയ്‌ത്, വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.</translation>
-<translation id="6669827579181361875">ഈ സൈറ്റിനായി നിങ്ങളുടെ പാസ്‌വേഡ് <ph name="PASSWORD_MANAGER_BRAND" /> സംരക്ഷിക്കണോ?</translation>
+<translation id="6669827579181361875">ഈ സൈറ്റിനായി <ph name="PASSWORD_MANAGER_BRAND" /> നിങ്ങളുടെ പാസ്‌വേഡ് സംരക്ഷിക്കണോ?</translation>
 <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation>
 <translation id="667517062706956822">Google ഈ പേജ്, <ph name="SOURCE_LANGUAGE" /> ഭാഷയിൽ നിന്ന് <ph name="TARGET_LANGUAGE" /> ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യണോ?</translation>
 <translation id="6675665718701918026">പോയിന്റുചെയ്യുന്ന ഉപകരണം കണക്റ്റുചെയ്‌തു</translation>
@@ -4021,6 +4017,7 @@
 <translation id="7297443947353982503">ഉപയോക്തൃനാമം/പാസ്‌വേഡ് ശരിയല്ല അല്ലെങ്കിൽ EAP-പ്രാമാണീകരണം പരാജയപ്പെട്ടു</translation>
 <translation id="729761647156315797">നിങ്ങളുടെ ഭാഷയും കീബോർഡും തിരഞ്ഞെടുക്കുക</translation>
 <translation id="7299337219131431707">അതിഥി ബ്രൗസിംഗ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
+<translation id="7303900363563182677">ക്ലിപ്പ്‌ബോർഡിലേക്ക് പകർത്തിയ ടെക്‌സ്‌റ്റും ചിത്രങ്ങളും കാണുന്നതിൽ നിന്ന് ഈ സൈറ്റിനെ ബ്ലോക്ക് ചെയ്തു</translation>
 <translation id="730515362922783851">ഏതു ഉപകരണം ഉപയോഗിച്ചും പ്രാദേശിക നെറ്റ്‌വർക്കിലോ ഇന്റർനെറ്റിലോ ഡാറ്റ എക്‌സ്‌ചേഞ്ച് ചെയ്യുക</translation>
 <translation id="7308002049209013926">പുതിയ ആപ്പുകളും ആക്റ്റിവിറ്റികളും വേഗത്തിൽ ലഭിക്കാൻ ലോഞ്ചർ ഉപയോഗിക്കുക. കീബോർഡ് ഉപയോഗിച്ച് ഇവിടെ ലഭ്യമാക്കാൻ, Alt + Shift + L അമർത്തുക.</translation>
 <translation id="7309257895202129721">&amp;നിയന്ത്രണങ്ങള്‍‌ കാണിക്കുക</translation>
@@ -4402,6 +4399,7 @@
 <translation id="7909969815743704077">ആൾമാറാട്ട മോഡിൽ ഡൗൺലോഡുചെയ്‌തു</translation>
 <translation id="7910768399700579500">&amp;പുതിയ ഫോള്‍ഡര്‍</translation>
 <translation id="7912080627461681647">സെർവറിൽ നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റിയിരിക്കുന്നു. സൈൻ ഔട്ട് ചെയ്യുക, തുടർന്ന് വീണ്ടും സൈൻ ഇൻ ചെയ്യുക.</translation>
+<translation id="7912883689016444961">മൊബൈൽ നെറ്റ്‌വർക്ക് കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="7915471803647590281">ഫീഡ്ബാക്ക് അയയ്ക്കുന്നതിന് മുമ്പ് എന്തുസംഭവിക്കുന്നുവെന്ന് ഞങ്ങളോട് ദയവായി പറയുക.</translation>
 <translation id="7925247922861151263">AAA പരിശോധന പരാജയപ്പെട്ടു</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> നായി കാത്തിരിക്കുന്നു...</translation>
@@ -4523,7 +4521,7 @@
 <translation id="8077684120002777443">ഉപയോക്തൃനാമം (ഉദാ. user@example.com)</translation>
 <translation id="8077816382010018681">QU ഫീച്ചർ അറിയിപ്പ് പേര് ഇവിടെയുണ്ട്</translation>
 <translation id="8079530767338315840">ആവർത്തിക്കുക</translation>
-<translation id="8079938625609335826">എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ലഭിക്കാൻ, 'സമന്വയിപ്പിക്കുക' ഓണാക്കുക.</translation>
+<translation id="8079938625609335826">എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ലഭിക്കാൻ, 'സമന്വയിപ്പിക്കൽ' ഓണാക്കുക.</translation>
 <translation id="8083739373364455075">Google ഡ്രൈവിൽ 100 GB സൗജന്യമായി നേടൂ</translation>
 <translation id="8086015605808120405"><ph name="PRINTER_NAME" /> കോൺഫിഗർ ചെയ്യുന്നു ...</translation>
 <translation id="8090234456044969073">നിങ്ങൾ ഏറ്റവും കൂടുതൽ സന്ദർശിച്ച വെബ്‌സൈറ്റുകളുടെ ലിസ്‌റ്റ് വായിക്കുക.</translation>
@@ -4913,6 +4911,7 @@
 <translation id="8736288397686080465">ഈ സൈറ്റ് പശ്‌ചാത്തലത്തിൽ അപ്‌ഡേറ്റുചെയ്‌തു.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> എന്നതിന് പകരം <ph name="PROTOCOL" /> ലിങ്കുകൾ തുറക്കുക</translation>
 <translation id="8737709691285775803">ഷിൽ</translation>
+<translation id="8741316211671074806">ചിത്രത്തിനുള്ളിലെ ചിത്രം</translation>
 <translation id="8743864605301774756">1 മണിക്കൂർ മുമ്പ് അപ്‌ഡേറ്റുചെയ്തു</translation>
 <translation id="8749863574775030885">ഒരു അജ്ഞാത വെണ്ടറിൽ നിന്നും USB ഉപകരണങ്ങൾ ആക്‌സസ്സുചെയ്യുക</translation>
 <translation id="8754200782896249056">&lt;p&gt; ഒരു പിന്തുണ ഡെസ്ക്ടോപ്പ് പരിതസ്ഥിതിയ്‌ക്ക് കീഴിൽ <ph name="PRODUCT_NAME" /> പ്രവർത്തിക്കുമ്പോൾ, സിസ്‌റ്റം പ്രോക്‌സി ക്രമീകരണം ഉപയോഗിക്കും. നിങ്ങളുടെ സിസ്‌റ്റം പിന്തുണച്ചില്ല അല്ലെങ്കിൽ നിങ്ങളുടെ സിസ്‌റ്റം കോൺഫിഗറേഷൻ സമാരംഭിക്കുന്നതിൽ ഒരു പ്രശ്നമുണ്ടായി.&lt;/p&gt;
@@ -5014,7 +5013,6 @@
 <translation id="8912793549644936705">വലിച്ചുനീട്ടുക</translation>
 <translation id="8915370057835397490">നിർദ്ദേശം ലോഡുചെയ്യുന്നു</translation>
 <translation id="8916476537757519021">ആൾമാറാട്ട സബ്‌ഫ്രെയിം: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> എന്നതിലേക്ക് സമന്വയിപ്പിക്കുക</translation>
 <translation id="8922013791253848639">ഈ സൈറ്റിൽ എല്ലായ്‌പ്പോഴും പരസ്യങ്ങൾ അനുവദിക്കുക</translation>
 <translation id="8925458182817574960">&amp;ക്രമീകരണങ്ങള്‍</translation>
 <translation id="8926389886865778422">എന്നോട് വീണ്ടും ചോദിക്കരുത്</translation>
@@ -5104,7 +5102,7 @@
 <translation id="9056810968620647706">പൊരുത്തങ്ങളൊന്നും കണ്ടെത്തിയില്ല.</translation>
 <translation id="9057119625587205566">സമീപത്ത് പ്രിന്ററുകളില്ല</translation>
 <translation id="9059868303873565140">സ്റ്റാറ്റസ് മെനു</translation>
-<translation id="9063208415146866933">ലൈൻ <ph name="ERROR_LINE_START" />-ൽ നിന്ന് <ph name="ERROR_LINE_END" /> വരെ പിശക്</translation>
+<translation id="9063208415146866933"><ph name="ERROR_LINE_START" />-മത്തെ വരി മുതൽ <ph name="ERROR_LINE_END" /> വരെ പിശക്</translation>
 <translation id="9064142312330104323">Google പ്രൊഫൈൽ ഫോട്ടോ (ലോഡുചെയ്യുന്നു)</translation>
 <translation id="9064275926664971810">ഒരൊറ്റ ക്ലിക്കിലൂടെ ഫോമുകള്‍ പൂരിപ്പിക്കുന്നതിന്, ഓട്ടോഫിൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="9064939804718829769">കൈമാറുന്നു...</translation>
@@ -5195,7 +5193,7 @@
 <translation id="932327136139879170">ഹോം</translation>
 <translation id="932508678520956232">അച്ചടിക്കല്‍ ആരംഭിക്കാന്‍ കഴിഞ്ഞില്ല.</translation>
 <translation id="93393615658292258">പാസ്‌വേഡ് മാത്രം</translation>
-<translation id="934503638756687833">ആവശ്യമെങ്കിൽ, ഇവിടെ ലിസ്‌റ്റ് ചെയ്യപ്പെടാത്ത ഇനങ്ങളും നീക്കം ചെയ്യപ്പെടും. &lt;a href="<ph name="URL" />"&gt;അനാവശ്യ സോഫ്‌റ്റ്‌വെയർ പരിരക്ഷയെ&lt;/a&gt; കുറിച്ച് Chrome സ്വകാര്യതാ വൈറ്റ് പേപ്പറിൽ കൂടുതൽ അറിയുക.</translation>
+<translation id="934503638756687833">ആവശ്യമെങ്കിൽ, ഇവിടെ ലിസ്‌റ്റ് ചെയ്യപ്പെടാത്ത ഇനങ്ങളും നീക്കം ചെയ്യപ്പെടും. &lt;a href="<ph name="URL" />"&gt;അനാവശ്യ സോഫ്‌റ്റ്‌വെയർ പരിരക്ഷയെ&lt;/a&gt; കുറിച്ച് Chrome സ്വകാര്യതാ വൈറ്റ് പേപ്പറിൽ കൂടുതലറിയുക.</translation>
 <translation id="935490618240037774">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിന് ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, പാസ്‌വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നതാണ്.</translation>
 <translation id="936801553271523408">സിസ്റ്റം ഡയഗണോസ്റ്റിക് ഡാറ്റ</translation>
 <translation id="93766956588638423">വിപുലീകരണം റിപ്പയർ ചെയ്യുക</translation>
@@ -5209,13 +5207,13 @@
 <translation id="942954117721265519">ഈ ഡയറക്‌ടറിയിൽ ചിത്രങ്ങളൊന്നുമില്ല.</translation>
 <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
 <translation id="952992212772159698">സജീവമാക്കിയില്ല</translation>
-<translation id="957960681186851048">ഈ സൈറ്റ് ഒന്നിലധികം ഫയലുകൾ സ്വമേധയാ ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിച്ചു.</translation>
+<translation id="957960681186851048">ഈ സൈറ്റ് ഒന്നിലധികം ഫയലുകൾ സ്വമേധയാ ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിച്ചു</translation>
 <translation id="9580706199804957">Google സേവനങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാനായില്ല</translation>
 <translation id="958515377357646513">മുന്നോട്ട് പോകാൻ സ്‌പർശിക്കുക.</translation>
 <translation id="960719561871045870">ഓപ്പറേറ്റർ കോഡ്</translation>
 <translation id="960987915827980018">ഏകദേശം 1 മണിക്കൂർ ശേഷിക്കുന്നു</translation>
 <translation id="962802172452141067">ഫോൾഡർ ട്രീ ബുക്ക്‌മാർക്ക് ചെയ്യുക</translation>
-<translation id="968000525894980488">Google Play സേവനങ്ങൾ ഓണാക്കുക.</translation>
+<translation id="968000525894980488">Google Play സേവനങ്ങൾ ഓണാക്കുക</translation>
 <translation id="968174221497644223">അപ്ലിക്കേഷന്‍ കാഷെ</translation>
 <translation id="969096075394517431">ഭാഷകൾ മാറ്റുക</translation>
 <translation id="970047733946999531">{NUM_TABS,plural, =1{ഒരു ടാബ്}other{# ടാബുകൾ}}</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index d3f5ead0..2b14379 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -6,7 +6,7 @@
 <translation id="1005274289863221750">आपला मायक्रोफोन आणि कॅमेरा वापरा</translation>
 <translation id="1007408791287232274">डिव्हाइसेस लोड करू शकलो नाही.</translation>
 <translation id="1008186147501209563">बुकमार्क निर्यात करा</translation>
-<translation id="1009147628737158130"><ph name="URL" /> ला तुमच्या सिक्युरिटी कीची ओळख माहिती पाहायची आहे</translation>
+<translation id="1009147628737158130"><ph name="URL" /> ला तुमच्या सिक्युरिटी की ओळखण्याची माहिती पाहायची आहे</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{अप्रतिसादात्मक पृष्‍ठ}one{अप्रतिसादात्मक पृष्‍ठ}other{अप्रतिसादात्मक पृष्‍ठे}}</translation>
 <translation id="1012794136286421601">आपले दस्तऐवज, पत्रके, स्लाइड्स आणि रेखाचित्र फायली संकालित केल्या जात आहेत. त्यावर ऑनलाइन किंवा ऑफलाइन प्रवेश करण्यासाठी Google ड्राइव्ह अॅप उघडा.</translation>
 <translation id="1013707859758800957">या पृष्ठावर चालण्यासाठी सॅन्डबॉक्स न केलेल्या प्लगिनला अनुमती देण्यात आली.</translation>
@@ -435,7 +435,7 @@
     <ph name="BEGIN_BOLD" />अनुमत किंवा प्रतिबंधित<ph name="END_BOLD" /> करू शकता,
     पर्यवेक्षी वापरकर्त्याने भेट दिलेल्या वेबसाइटचे <ph name="BEGIN_BOLD" />पुनरावलोकन<ph name="END_BOLD" /> करू शकता आणि अन्य सेटिंग्ज
     <ph name="BEGIN_BOLD" />व्यवस्थापित<ph name="END_BOLD" /> करू शकता.</translation>
-<translation id="1648528859488547844">स्थान निर्धारित करण्‍यासाठी वाय‑फाय किंवा मोबाइल नेटवर्क वापरा</translation>
+<translation id="1648528859488547844">स्थान निर्धारित करण्‍यासाठी वाय‑फाय, ब्लूटूथ किंवा मोबाइल नेटवर्क वापरा</translation>
 <translation id="1648943974594387137">साइन-इन तपशील कालबाह्य झाले</translation>
 <translation id="1650371550981945235">इनपुट पर्याय दर्शवा</translation>
 <translation id="1650709179466243265">www. आणि .com जोडा आणि पत्ता उघडा</translation>
@@ -587,7 +587,7 @@
 <translation id="1878524442024357078">आपल्या संगणकावर प्रवेश करण्यासाठी कोणत्याही साइटना प्लगिन वापरण्याची अनुमती देऊ नका</translation>
 <translation id="1879449842763884566">अ‍ॅप्लिकेशनवर इंस्टॉल करा...</translation>
 <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation>
-<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" /> ने <ph name="ORIGIN" /> साठी तुमचा पासवर्ड सेव्ह करावा असे तुम्हाला वाटते का?</translation>
+<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" /> नी <ph name="ORIGIN" /> साठी तुमचा पासवर्ड सेव्ह करावा असे तुम्हाला वाटते?</translation>
 <translation id="1886996562706621347">प्रोटोकॉलकरिता डीफॉल्ट हँडलर होण्यासाठी साइटना विचारण्याची अनुमती द्या</translation>
 <translation id="1887442540531652736">साइन-इन एरर</translation>
 <translation id="1887850431809612466">हार्डवेअर पुनरावृत्ती</translation>
@@ -782,7 +782,7 @@
 <translation id="2215277870964745766">सुस्वागतम्! आपली भाषा आणि नेटवर्क सेट करा</translation>
 <translation id="2217501013957346740">एक नाव तयार करा -</translation>
 <translation id="2218019600945559112">माऊस आणि टचपॅड</translation>
-<translation id="2218320521449013367">Chrome हानिकारक सॉफ्टवेअर काढत असताना एरर आली</translation>
+<translation id="2218320521449013367">Chrome ला हानिकारक सॉफ्टवेअर काढत असताना एरर आली</translation>
 <translation id="2218515861914035131">साधा मजकूर म्हणून पेस्ट करा</translation>
 <translation id="221872881068107022">स्क्रोलिंग उलट करा</translation>
 <translation id="2218947405056773815">संकट! <ph name="API_NAME" /> ला एक अडचण आली.</translation>
@@ -881,6 +881,7 @@
 <translation id="2359345697448000899">टूल मेनूमध्‍ये विस्तारांवर क्लिक करुन आपले विस्तार व्यवस्थापित करा.</translation>
 <translation id="2359808026110333948">सुरू ठेवा</translation>
 <translation id="236141728043665931">मायक्रोफोन प्रवेश नेहमी अवरोधित करा</translation>
+<translation id="2365507699358342471">या पेजवर क्लिपबोर्डवर कॉपी केलेला मजकूर आणि इमेज दिसू शकतात.</translation>
 <translation id="2367972762794486313">अ‍ॅप्स दर्शवा</translation>
 <translation id="2371076942591664043">&amp;पूर्ण झाल्यानंतर उघडा</translation>
 <translation id="2377319039870049694">सूची व्‍ह्यूवर स्विच करा</translation>
@@ -1101,7 +1102,7 @@
 <translation id="270358213449696159">Google Chrome OS अटी सामग्री</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
 <translation id="270516211545221798">टचपॅड गती</translation>
-<translation id="2705736684557713153">ते दिसल्यास, स्क्रीनच्या तळाशी स्क्रोल करा आणि झटपट टेदरिंग चालू करा. ते न दिसल्यास, तुम्ही पूर्ण सेट केले आहे.</translation>
+<translation id="2705736684557713153">ते दिसल्यास, स्क्रीनच्या तळाशी स्क्रोल करा आणि झटपट टेदरिंग चालू करा. ते न दिसल्यास, तुम्ही तयार आहात.</translation>
 <translation id="2706892089432507937">USB डिव्हाइसेस</translation>
 <translation id="2706954854267016964">निवडलेल्या Google क्लाउड प्रिंट डिव्हाइसला यापुढे सपोर्ट असणार नाही. तुमच्या कॉंप्युटरच्या सिस्टम सेटिंग्जमध्ये प्रिंटर सेट करण्याचा प्रयत्न करा.</translation>
 <translation id="2707024448553392710">घटक डाउनलोड करत आहे</translation>
@@ -1147,7 +1148,7 @@
 <translation id="2762441749940182211">कॅमेरा ब्लॉक केला आहे</translation>
 <translation id="2765217105034171413">लहान</translation>
 <translation id="2766006623206032690">पे&amp;स्ट करा आणि जा</translation>
-<translation id="2767084307624729667"><ph name="ORIGIN" /> चे सेव्ह केलेले पासवर्ड</translation>
+<translation id="2767084307624729667"><ph name="ORIGIN" /> साठी सेव्ह केलेले पासवर्ड</translation>
 <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" /> म्हणून साइन इन केले</translation>
 <translation id="2770465223704140727">सूचीमधून काढा</translation>
 <translation id="2770690685823456775">तुमचे पासवर्ड दुसर्‍या फोल्डरमध्ये निर्यात करा</translation>
@@ -1233,7 +1234,7 @@
 <translation id="2871813825302180988">हे खाते या डिव्‍हाइसवर आधीपासूनच वापरले जात आहे.</translation>
 <translation id="2872353916818027657">प्राथमिक मॉनिटर स्वॅप करा</translation>
 <translation id="287286579981869940"><ph name="PROVIDER_NAME" /> जोडा...</translation>
-<translation id="2874343608108773609">तुमच्या सर्व डिव्हाइसवर तुमचे पासवर्ड मिळवण्यासाठी, Chrome मध्ये साइन इन करा.</translation>
+<translation id="2874343608108773609">तुमच्या सर्व डिव्हाइसवर तुमच्या सेटिंग्ज मिळवण्यासाठी, Chrome मध्ये साइन इन करा.</translation>
 <translation id="2875698561019555027">(Chrome एरर पृष्ठे)</translation>
 <translation id="288042212351694283">आपल्या सर्वंकष 2 रा घटक डिव्हाइसेसवर प्रवेश करा</translation>
 <translation id="2881966438216424900"> अखेरचा प्रवेशः</translation>
@@ -1268,7 +1269,6 @@
 <translation id="2916073183900451334">वेबपृष्ठावर टॅब दाबल्याने दुवे हायलाइट होतात, तसेच फील्ड तयार होतात</translation>
 <translation id="2916745397441987255">शोध विस्तार</translation>
 <translation id="2921081876747860777">कृपया आपला स्थानिक डेटा संरक्षित करण्‍यासाठी एक पासवर्ड तयार करा.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> वर सिंक केले</translation>
 <translation id="2925966894897775835">पत्रके</translation>
 <translation id="2927017729816812676">कॅश   संचय</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (मुलांसाठी खाते)</translation>
@@ -1433,7 +1433,7 @@
 <translation id="316307797510303346">ही व्यक्ती <ph name="CUSTODIAN_EMAIL" /> वरून भेट देते त्या वेबसाइट नियंत्रित करा आणि पहा
     आपले खाते साइन इन तपशील कालबाह्य आहेत.</translation>
 <translation id="3165390001037658081">काही वाहक हे वैशिष्ट्य अवरोधित शकतात.</translation>
-<translation id="316854673539778496">तुमच्या सर्व डिव्हाइसवर तुमचे सर्व एक्स्टेंशन मिळवण्यासाठी, साइन इन करा आणि सिंंक चालू करा.</translation>
+<translation id="316854673539778496">तुमच्या सर्व डिव्हाइसवर तुमचे सर्व एक्स्टेंशन मिळवण्यासाठी, साइन इन करा आणि सिंंक करणे चालू करा.</translation>
 <translation id="3170072451822350649">आपण साइन इन वगळुन <ph name="LINK_START" />अतिथी म्हणून ब्राउझ<ph name="LINK_END" /> देखील करू शकता.</translation>
 <translation id="3177048931975664371">पासवर्ड लपविण्यासाठी क्लिक करा</translation>
 <translation id="3177857336576585529"><ph name="SITE_NAME" /> कडे परवानगी विनंती आहे.</translation>
@@ -1548,7 +1548,6 @@
 <translation id="3348459612390503954">अभिनंदन</translation>
 <translation id="3349933790966648062">मेमरी फुटप्रिंट</translation>
 <translation id="3353984535370177728">अपलोड करण्यासाठी एक फोल्डर निवडा</translation>
-<translation id="335581015389089642">भाषण</translation>
 <translation id="3355936511340229503">कनेक्शन एरर</translation>
 <translation id="3356797067524893661">Hangouts Meetवर सुरू ठेवण्यासाठी तुम्ही पूर्ण सज्ज आहात</translation>
 <translation id="3358935496594837302">तुमचा फोन आढळला नाही. तुम्ही सुसंगत Android फोन वापरत असल्याची आणि तो चालू व सोयीस्कर असल्याची खात्री करा. &lt;a&gt;आणखी जाणून घ्या&lt;/a&gt;</translation>
@@ -1573,7 +1572,7 @@
 <translation id="3396331542604645348">निवडलेले प्रिंटर उपलब्ध नाही किंवा योग्यरितीने इंस्टॉल केले नाही. आपला प्रिंटर तपासा किंवा दुसरा प्रिंटर निवडून पहा.</translation>
 <translation id="3399432415385675819">सूचना बंद केल्या जातील</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
-<translation id="3404065873681873169">या साइटचा पासवर्ड सेव्ह केलेला नाही</translation>
+<translation id="3404065873681873169">या साइटचे कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation>
 <translation id="340485819826776184">अ‍ॅड्रेस बारमध्ये टाइप केलेले शोध आणि URL पूर्ण करण्याकरिता मदतीसाठी पूर्वानुमान सेवा वापरा</translation>
 <translation id="3405664148539009465">फॉन्ट सानुकूलित करा</translation>
 <translation id="3405763860805964263">...</translation>
@@ -1584,7 +1583,7 @@
 <translation id="3414952576877147120">आकार:</translation>
 <translation id="3420980393175304359">व्यक्ती स्विच करा</translation>
 <translation id="3421387094817716717">एल्लिपटिक कर्व्ह सार्वजनिक की</translation>
-<translation id="3423463006624419153">तुमच्या <ph name="PHONE_NAME_1" />' आणि '<ph name="PHONE_NAME_2" />' वर:</translation>
+<translation id="3423463006624419153">तुमच्या '<ph name="PHONE_NAME_1" />' आणि '<ph name="PHONE_NAME_2" />' वर:</translation>
 <translation id="342383653005737728">मालक या डिव्हाइससाठी निदान आणि वापर डेटा Google कडे पाठविणे निवडू शकतो. आपण येथे हे <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> पाहू शकता. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918">कृपया <ph name="PRODUCT_NAME" /> पुन्हा लाँच करा</translation>
 <translation id="3424969259347320884">टॅब क्रॅश झाला तेव्हा तुम्ही नेमके काय करत होता ते सांगा</translation>
@@ -1725,7 +1724,6 @@
 <translation id="3613422051106148727">&amp;नवीन टॅबमध्ये उघडा</translation>
 <translation id="3616113530831147358">ऑडिओ</translation>
 <translation id="3616741288025931835">ब्राउझिंग डेटा &amp;साफ करा...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” पहा</translation>
 <translation id="3620292326130836921">सर्व बॅकअप घेतला!</translation>
 <translation id="3623574769078102674">हा पर्यवेक्षी वापरकर्ता <ph name="MANAGER_EMAIL" /> द्वारे व्यवस्थापित केला जाईल.</translation>
 <translation id="3625258641415618104">स्क्रीनशॉट अक्षम केले</translation>
@@ -1759,7 +1757,7 @@
 <translation id="3665842570601375360">सुरक्षितता:</translation>
 <translation id="3668570675727296296">भाषा सेटिंग्ज</translation>
 <translation id="3668823961463113931">हँडलर</translation>
-<translation id="3669030672519623291">या साइटचा पासवर्ड सेव्ह केलेला नाही</translation>
+<translation id="3669030672519623291">या साइटचे कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation>
 <translation id="3670229581627177274">Bluetooth चालू करा</translation>
 <translation id="3672681487849735243">एक फॅक्टरी एरर शोधली गेली</translation>
 <translation id="367645871420407123">आपण डीफॉल्ट चाचणी प्रतिमा मूल्यामध्ये मूळ पासवर्ड सेट करू इच्छित असल्यास रिक्त सोडा</translation>
@@ -1836,7 +1834,7 @@
 <translation id="378312418865624974">या संगणकासाठी एक अद्वितीय अभिज्ञापक वाचा</translation>
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">अ‍ॅप्स शॉर्टकट दर्शवा</translation>
-<translation id="3785727820640310185">या साइटचे सेव्ह केलेले पासवर्ड</translation>
+<translation id="3785727820640310185">या साइटसाठी सेव्ह केलेले पासवर्ड</translation>
 <translation id="3785852283863272759">ईमेल पृष्ठ स्थान</translation>
 <translation id="3786301125658655746">आपण ऑफलाइन आहात</translation>
 <translation id="3788401245189148511">ते करू शकले असते:</translation>
@@ -2138,7 +2136,6 @@
 <translation id="428565720843367874">या फाईलचे स्कॅनिंग करताना अँटी-व्हायरस सॉफ्टवेअर अनपेक्षितपणे अयशस्वी झाले.</translation>
 <translation id="428608937826130504">शेल्फ आयटम 8</translation>
 <translation id="4287502004382794929">आपल्याकडे या डिव्हाइसची नोंदणी करण्यासाठी पुरेसा सॉफ्टवेअर परवाना नाही. कृपया आणखी खरेदी करण्यासाठी विक्रीशी संपर्क साधावा. आपल्याला हा संदेश त्रुटीमुळे दिसत असल्याचा आपल्याला विश्वास असल्यास, कृपया समर्थनाशी संपर्क साधा.</translation>
-<translation id="4289300219472526559">बोलणे प्रारंभ करा</translation>
 <translation id="4289540628985791613">विहंगावलोकन</translation>
 <translation id="4296575653627536209">पर्यवेक्षी वापरकर्ता जोडा</translation>
 <translation id="4297322094678649474">भाषा बदला</translation>
@@ -2235,7 +2232,7 @@
 <translation id="4478664379124702289">म्हणून दु&amp;वा सेव्ह करा...</translation>
 <translation id="4479424953165245642">कियोस्क अॅप्लिकेशन व्यवस्थापित करा</translation>
 <translation id="4479639480957787382">इथरनेट</translation>
-<translation id="4480590691557335796">Chrome तुमच्या काँप्युटरवर हानिकारक सॉफ्टवेअर शोधू शकते आणि ते काढून टाकू शकते</translation>
+<translation id="4480590691557335796">Chrome तुमच्या काँप्युटरवर हानिकारक सॉफ्टवेअर शोधू शकते आणि ते काढू शकते</translation>
 <translation id="4481249487722541506">अनपॅक केलेला विस्तार लोड करा...</translation>
 <translation id="4481530544597605423">जोडणी वेगळी केलेली डिव्हाइस</translation>
 <translation id="4482194545587547824">शोध आणि इतर Google सेवा वैयक्तीकृत करण्यासाठी Google आपल्या ब्राउझिंग इतिहासाचा वापर करू शकते</translation>
@@ -2354,7 +2351,7 @@
 <translation id="4677585247300749148"><ph name="URL" /> ला अॅक्सेसिबिलिटी इव्‍हेंटना प्रतिसाद द्यायचा आहे</translation>
 <translation id="4677692029604506169">तुमचे <ph name="DEVICE_TYPE" /> अनलॉक करण्यासाठी तुम्ही वापरलेल्या फोनला सुरक्षिततेसाठी स्क्रीन लॉकची आवश्यकता आहे. साधारणपणे तो पिन, पॅटर्न किंवा पासवर्ड असतो. आधीपासून स्क्रीन लॉक आहे का? पडताळणी करण्यासाठी आणि सेट अप करणे सुरू ठेवण्यासाठी पुन्हा तपासून पहा निवडा.</translation>
 <translation id="4677772697204437347">GPU मेमरी</translation>
-<translation id="4680105648806843642">या पेजवर आवाज म्युट केलेला आहे</translation>
+<translation id="4680105648806843642">या पेजवर आवाज म्युट केला होता</translation>
 <translation id="4681930562518940301">नवीन टॅबमध्‍ये मूळ &amp;प्रतिमा उघडा</translation>
 <translation id="4682551433947286597">साइन-इन स्क्रीनवर दिसणारे वॉलपेपर.</translation>
 <translation id="4684427112815847243">सर्वकाही संंकालित करा</translation>
@@ -2399,6 +2396,7 @@
 <translation id="4748762018725435655">Chrome वेब स्टोअर वरून विस्तार आवश्यक आहे</translation>
 <translation id="4750394297954878236">सूचना</translation>
 <translation id="475088594373173692">प्रथम वापरकर्ता</translation>
+<translation id="4751476147751820511">मोशन किंवा प्रकाश सेन्सर</translation>
 <translation id="4756378406049221019">थांबा/पुन्हा लोड करा</translation>
 <translation id="4756388243121344051">&amp;इतिहास</translation>
 <translation id="4759238208242260848">डाउनलोड</translation>
@@ -2433,7 +2431,6 @@
 <translation id="4813512666221746211">नेटवर्क एरर</translation>
 <translation id="4816492930507672669">पृष्‍ठानुरुप करा</translation>
 <translation id="4820334425169212497">नाही, मला ते दिसत नाही</translation>
-<translation id="4821725298388681253">हे आधीच रीलीझ केले आहे. काही वैशिष्ट्ये, जसे की शोध आणि मजकूर टाकणे, अजून उपलब्ध नाहीत.</translation>
 <translation id="4821935166599369261">&amp;प्रोफाइलिंग सक्षम</translation>
 <translation id="4823484602432206655">वापरकर्ता आणि डिव्हाइस सेटिंग्ज वाचा आणि बदला</translation>
 <translation id="4823651846660089135">डिव्हाइस केवळ वाचनीय आहे</translation>
@@ -2460,7 +2457,7 @@
 <translation id="4850669014075537160">स्क्रोलिंग</translation>
 <translation id="4850886885716139402">पहा</translation>
 <translation id="4853020600495124913">&amp;नवीन विंडोमध्ये उघडा</translation>
-<translation id="4853882474657327078"><ph name="PASSWORD_MANAGER_BRAND" /> ने <ph name="ORIGIN" /> वरील तुमचा पासवर्ड अपडेट करावा असे तुम्हाला वाटते का?</translation>
+<translation id="4853882474657327078"><ph name="PASSWORD_MANAGER_BRAND" /> ने <ph name="ORIGIN" /> साठी तुमचा पासवर्ड अपडेट करावा असे तुम्हाला वाटते?</translation>
 <translation id="4856478137399998590">आपली मोबाइल सेवा सक्रिय झाली आणि वापरण्यासाठी तयार आहे</translation>
 <translation id="4857506433977877623">{COUNT,plural, =0{सर्व गुप्त विंडोमध्ये उघडा}=1{गुप्त विंडोमध्ये उघडा}one{सर्व (#) गुप्त विंडोमध्ये उघडा}other{सर्व (#) गुप्त विंडोमध्ये उघडा}}</translation>
 <translation id="4858913220355269194">फ्रिटझ</translation>
@@ -2651,7 +2648,7 @@
 <translation id="5143374789336132547">आपण होम बटण क्लिक करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे "<ph name="EXTENSION_NAME" />" विस्ताराने बदलले आहे.</translation>
 <translation id="5143712164865402236">पूर्ण स्क्रीनमध्ये जा</translation>
 <translation id="5145331109270917438">सुधारणा तारीख</translation>
-<translation id="514575469079499857">स्थान निर्धारित करण्यासाठी तुमचा आयपी अॅड्रेस वापरा (डीफॉल्ट)</translation>
+<translation id="514575469079499857">स्थान निर्धारित करण्यासाठी तुमचा आयपी अॅड्रेस वापरा (डिफॉल्ट)</translation>
 <translation id="5150254825601720210">Netscape प्रमाणपत्र SSL सर्व्हर नाव</translation>
 <translation id="5151354047782775295">डिस्क स्थान मोकळे करा किंवा निवडलेला डेटा स्वयंचलितपणे हटविला जाऊ शकतो</translation>
 <translation id="5153297660536091054">पिन अनलॉक वैशिष्ट्य</translation>
@@ -2944,7 +2941,7 @@
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
 <translation id="5582839680698949063">मुख्य मेनू</translation>
 <translation id="5583640892426849032">Backspace</translation>
-<translation id="5583726250980167172">या साइटसाठी सेव्ह केलेले पासवर्ड</translation>
+<translation id="5583726250980167172">या साइटसाठी पासवर्ड सेव्ह केले</translation>
 <translation id="5585118885427931890">बुकमार्क फोल्डर तयार करणे शक्य नव्हते.</translation>
 <translation id="558563010977877295">एक विशिष्‍ट पृष्‍ठ किंवा पृष्‍ठांचा संच उघडा</translation>
 <translation id="5585912436068747822">स्वरुपन अयशस्वी</translation>
@@ -3141,7 +3138,7 @@
 <translation id="5882919346125742463">ज्ञात नेटवर्क</translation>
 <translation id="5884474295213649357">हा टॅब USB डिव्हाइसशी कनेक्ट केला आहे.</translation>
 <translation id="5885324376209859881">माध्यम सेटिंग्ज व्यवस्थापित करा...</translation>
-<translation id="5887341066363321040"><ph name="ORIGIN" /> साठी कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation>
+<translation id="5887341066363321040"><ph name="ORIGIN" /> चे कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation>
 <translation id="5889282057229379085">कमाल इंटरमिजिएट CA संख्या: <ph name="NUM_INTERMEDIATE_CA" /></translation>
 <translation id="5895138241574237353">रीस्टार्ट करा</translation>
 <translation id="5895187275912066135">रोजी जारी केले</translation>
@@ -3291,7 +3288,7 @@
 <translation id="6136285399872347291">backspace</translation>
 <translation id="6137767437444130246">वापरकर्ता प्रमाणपत्र</translation>
 <translation id="6138680304137685902">SHA-384 सह X9.62 ECDSA स्वाक्षरी</translation>
-<translation id="6141988275892716286">डाउनलोड निश्चित करा</translation>
+<translation id="6141988275892716286">डाउनलोड करण्याचे निश्चित करा</translation>
 <translation id="6143186082490678276">मदत मिळवा</translation>
 <translation id="6144938890088808325">Chromebooks सुधारण्यात आम्हाला मदत करा</translation>
 <translation id="6146563240635539929">व्हिडिओ</translation>
@@ -3445,7 +3442,6 @@
 <translation id="6388771388956873507">आपल्या डिव्हाइस वरील फिंगरप्रिंट सेन्सर शोधा आणि आपल्या बोटाने त्यास स्पर्श करा</translation>
 <translation id="6390799748543157332">या विंडोमध्ये आपण पाहत असलेली पृष्ठे ब्राउझर इतिहासात दिसणार नाहीत आणि आपण सर्व उघड्या अतिथी विंडो बंद केल्यानंतर संगणकावरील, कुकीज सारखे, अन्य ट्रेस ते सोडणार नाहीत. असे असले तरीही, आपण डाउनलोड करता त्या कोणत्याही फायली संरक्षित केल्या जातील.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />सिस्टम माहिती<ph name="END_LINK1" /> आणि <ph name="BEGIN_LINK2" />मेट्रिक्स<ph name="END_LINK2" /> पाठवा</translation>
-<translation id="6397363302884558537">बोलणे थांबवा</translation>
 <translation id="6397592254427394018">सर्व बुकमार्क्स &amp;गुप्त विंडो मध्ये उघडा</translation>
 <translation id="6398715114293939307">Google Play स्टोअर काढा</translation>
 <translation id="6398765197997659313">पूर्ण स्क्रीनमधून निर्गमन करा</translation>
@@ -4019,6 +4015,7 @@
 <translation id="7297443947353982503">वापरकर्तानाव/पासवर्ड चुकीचा किंवा EAP-प्रमाणीकरण अयशस्वी</translation>
 <translation id="729761647156315797">आपली भाषा आणि कीबोर्ड निवडा</translation>
 <translation id="7299337219131431707">अतिथी ब्राउझिंग सक्षम करा</translation>
+<translation id="7303900363563182677">या साइटला क्लिपबोर्डवर कॉपी केलेला मजकूर आणि इमेज पाहण्यापासून ब्लॉक केले आहे</translation>
 <translation id="730515362922783851">स्थानिक नेटवर्क किंवा इंटरनेटवरील कोणत्याही डिव्हाइससह डेटा अदलाबदल करा</translation>
 <translation id="7308002049209013926">नवीन अ‍ॅप्स आणि आक्टिव्हीटींवर त्वरित जाण्यासाठी लाँचर वापरा. येथे कीबोर्डने येण्यासाठी, Alt + Shift + L दाबा.</translation>
 <translation id="7309257895202129721">नियंत्रणे &amp;दर्शवा</translation>
@@ -4239,7 +4236,7 @@
 <translation id="7664620655576155379">असमर्थित Bluetooth डिव्हाइस: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">खाते जोडा</translation>
 <translation id="7671130400130574146">सिस्टम शीर्षक बार आणि किनारी वापरा</translation>
-<translation id="7672520070349703697"><ph name="PAGE_TITLE" /> मध्ये <ph name="HUNG_IFRAME_URL" /></translation>
+<translation id="7672520070349703697"><ph name="PAGE_TITLE" /> मध्ये <ph name="HUNG_IFRAME_URL" />.</translation>
 <translation id="7683373461016844951">पुढे सुरू ठेवण्यासाठी, ठीक आहे वर क्लिक करा, नंतर तुमच्या <ph name="DOMAIN" /> ईमेल पत्त्यासाठी नवीन प्रोफाइल तयार करण्याकरता व्यक्तीला जोडावर क्लिक करा.</translation>
 <translation id="7684212569183643648">आपल्‍या प्रशासकाद्वारे इंस्टॉल केले</translation>
 <translation id="7684559058815332124">कॅप्टिव्ह लॉग इन पृष्ठास भेट द्या</translation>
@@ -4398,6 +4395,7 @@
 <translation id="7909969815743704077">गुप्त मध्ये डाउनलोड केले</translation>
 <translation id="7910768399700579500">&amp;नवीन फोल्‍डर</translation>
 <translation id="7912080627461681647">तुमचा पासवर्ड सर्व्हरवर बदलला आहे. कृपया साइन आऊट करा आणि पुन्हा साइन इन करा.</translation>
+<translation id="7912883689016444961">मोबाईल नेटवर्क कॉन्फिगर करा</translation>
 <translation id="7915471803647590281">कृपया अभिप्राय पाठविण्यापूर्वी काय होत आहे ते आम्हाला सांगा.</translation>
 <translation id="7925247922861151263">AAA तपास अयशस्वी</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> साठी प्रतीक्षा करीत आहे...</translation>
@@ -4909,6 +4907,7 @@
 <translation id="8736288397686080465">ही साइट पार्श्वभूमीमध्ये अपडेट केली गेली आहे.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> ऐवजी <ph name="PROTOCOL" /> दुवे उघडा</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">चित्रात-चित्र</translation>
 <translation id="8743864605301774756">1 तासापूर्वी अपडेट करण्यात आले</translation>
 <translation id="8749863574775030885">अज्ञात विक्रेत्याकडील USB डिव्हाइसेसवर प्रवेश करा</translation>
 <translation id="8754200782896249056">&lt;p&gt;समर्थित डेस्कटॉप परिस्थिती अंतर्गत <ph name="PRODUCT_NAME" /> चालविताना, सिस्टम प्रॉक्सी सेटिंग्ज वापरल्या जातील. तथापि, एकतर आपली सिस्टम समर्थित नसते किंवा आपले सिस्टम कॉन्फिगरेशन लाँच करताना समस्या आली.&lt;/p&gt;
@@ -5012,7 +5011,6 @@
 <translation id="8912793549644936705">पसरवा</translation>
 <translation id="8915370057835397490">सूचना लोड करीत आहे</translation>
 <translation id="8916476537757519021">गुप्त सबफ्रेम: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> शी सिंक करा</translation>
 <translation id="8922013791253848639">या साइटवर कायम जाहिरातींना परवानगी द्या</translation>
 <translation id="8925458182817574960">&amp;सेटिंग्ज</translation>
 <translation id="8926389886865778422">पुन्हा विचारू नका</translation>
@@ -5193,7 +5191,7 @@
 <translation id="932327136139879170">मुख्यपृष्ठ</translation>
 <translation id="932508678520956232">प्रिंट आरंभ करणे शक्य नव्हते.</translation>
 <translation id="93393615658292258">फक्त पासवर्ड</translation>
-<translation id="934503638756687833">आवश्‍यक असल्‍यास, येथे सूचीमध्ये नसलेले आयटम देखील काढून टाकले जातील. Chrome गोपनीयता व्‍हाइट पेपरमध्‍ये &lt;a href="<ph name="URL" />"&gt;आवश्यक नसलेल्या सॉफ्टवेअरचे संरक्षण&lt;/a&gt; बद्दल अधिक जाणून घ्‍या.</translation>
+<translation id="934503638756687833">आवश्‍यक असल्‍यास, येथे सूचीत नसलेले आयटम देखील काढून टाकले जातील. Chrome गोपनीयता व्‍हाइट पेपरमध्‍ये &lt;a href="<ph name="URL" />"&gt;अनैच्छिक सॉफ्टवेअर संरक्षण&lt;/a&gt; बद्दल अधिक जाणून घ्‍या.</translation>
 <translation id="935490618240037774">आपले बुकमार्क, इतिहास, पासवर्ड आणि इतर सेटिंग्ज आपल्या Google खात्यात संकालित केल्या जातील जेणेकरून आपण आपल्या सर्व डिव्हाइसेसवर त्यांचा वापर करू शकता.</translation>
 <translation id="936801553271523408">सिस्टम निदान डेटा</translation>
 <translation id="93766956588638423">विस्तार दुरुस्त करा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index b4cdb8c7..7df1989 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1271,7 +1271,6 @@
 <translation id="2916073183900451334">Menekan Tab pada pautan serlahan halaman web, dan juga medan borang</translation>
 <translation id="2916745397441987255">Cari sambungan</translation>
 <translation id="2921081876747860777">Sila buat kata laluan untuk melindungi data setempat anda.</translation>
-<translation id="2924395203970765374">Disegerakkan ke <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Helaian</translation>
 <translation id="2927017729816812676">Storan Cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Akaun untuk kanak-kanak)</translation>
@@ -1554,7 +1553,6 @@
 <translation id="3348459612390503954">Tahniah!</translation>
 <translation id="3349933790966648062">Jejak Memori</translation>
 <translation id="3353984535370177728">Pilih folder untuk dimuat naik</translation>
-<translation id="335581015389089642">Pertuturan</translation>
 <translation id="3355936511340229503">Ralat sambungan</translation>
 <translation id="3356797067524893661">Anda telah sedia untuk terus ke Hangout Meet</translation>
 <translation id="3358935496594837302">Tidak dapat mencari telefon anda. Pastikan anda menggunakan telefon Android serasi yang dihidupkan dan telefon tersebut ada bersama anda. &lt;a&gt;Ketahui lebih lanjut&lt;/a&gt;</translation>
@@ -1731,7 +1729,6 @@
 <translation id="3613422051106148727">&amp;Buka dalam tab baharu</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Kosongkan Data Menyemak Imbas...</translation>
-<translation id="3618849550573277856">Cari “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Semua disandarkan!</translation>
 <translation id="3623574769078102674">Pengguna diselia ini akan diuruskan oleh <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Tangkapan skrin dilumpuhkan</translation>
@@ -2146,7 +2143,6 @@
 <translation id="428565720843367874">Perisian anti-virus gagal tanpa dijangka semasa mengimbas fail ini.</translation>
 <translation id="428608937826130504">Item rak 8</translation>
 <translation id="4287502004382794929">Anda tidak mempunyai lesen perisian yang cukup untuk mendaftarkan peranti ini. Sila hubungi bahagian jualan untuk membeli lagi. Jika anda percaya anda melihat mesej yang salah, sila hubungi sokongan.</translation>
-<translation id="4289300219472526559">Mula Bercakap</translation>
 <translation id="4289540628985791613">Gambaran keseluruhan</translation>
 <translation id="4296575653627536209">Tambahkan Pengguna di Bawah Seliaan</translation>
 <translation id="4297322094678649474">Tukar Bahasa</translation>
@@ -2442,7 +2438,6 @@
 <translation id="4813512666221746211">Ralat rangkaian</translation>
 <translation id="4816492930507672669">Muat halaman</translation>
 <translation id="4820334425169212497">Tidak, saya tidak melihatnya</translation>
-<translation id="4821725298388681253">Ini ialah keluaran awal. Sesetengah ciri seperti carian dan masukan teks belum tersedia lagi.</translation>
 <translation id="4821935166599369261">&amp;Pemprofilan Didayakan</translation>
 <translation id="4823484602432206655">Baca dan tukar pengguna dan tetapan peranti</translation>
 <translation id="4823651846660089135">Peranti dalam mod baca sahaja</translation>
@@ -3453,7 +3448,6 @@
 <translation id="6388771388956873507">Cari penderia cap jari pada peranti anda dan sentuh penderia itu menggunakan jari anda</translation>
 <translation id="6390799748543157332">Halaman yang anda lihat dalam tetingkap ini tidak akan dipaparkan dalam sejarah penyemak imbas dan halaman ini tidak akan meninggalkan kesan lain, seperti kuki, pada komputer selepas anda menutup semua tetingkap Tetamu yang terbuka. Walau bagaimanapun, sebarang fail yang anda muat turun akan disimpan.</translation>
 <translation id="6395423953133416962">Hantar <ph name="BEGIN_LINK1" />maklumat sistem<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />metrik<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Berhenti Bercakap</translation>
 <translation id="6397592254427394018">Buka semua penanda halaman dalam tetingkap &amp;inkognito</translation>
 <translation id="6398715114293939307">Alih keluar Gedung Google Play</translation>
 <translation id="6398765197997659313">Keluar daripada skrin penuh</translation>
@@ -5023,7 +5017,6 @@
 <translation id="8912793549644936705">Regang</translation>
 <translation id="8915370057835397490">Memuatkan cadangan</translation>
 <translation id="8916476537757519021">Subbingkai Inkognito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Segerakkan ke <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Sentiasa benarkan iklan di tapak ini</translation>
 <translation id="8925458182817574960">&amp;Tetapan</translation>
 <translation id="8926389886865778422">Jangan tanya lagi</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 394cc75..3eb2ee2 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -783,7 +783,7 @@
 <translation id="2215277870964745766">Welkom! Stel je taal en netwerk in</translation>
 <translation id="2217501013957346740">Maak een naam -</translation>
 <translation id="2218019600945559112">Muis en touchpad</translation>
-<translation id="2218320521449013367">Er is een fout opgetreden tijdens het verwijderen van schadelijke software door Chrome</translation>
+<translation id="2218320521449013367">Er is een fout opgetreden tijdens de verwijdering van schadelijke software door Chrome</translation>
 <translation id="2218515861914035131">Plakken als tekst zonder opmaak</translation>
 <translation id="221872881068107022">Omgekeerd scrollen</translation>
 <translation id="2218947405056773815">Er is een fout opgetreden in <ph name="API_NAME" />.</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Je kunt je extensies beheren door in het gereedschapsmenu te klikken op 'Extensies'.</translation>
 <translation id="2359808026110333948">Doorgaan</translation>
 <translation id="236141728043665931">Microfoontoegang altijd blokkeren</translation>
+<translation id="2365507699358342471">Deze site kan tekst en afbeeldingen bekijken die naar het klembord zijn gekopieerd.</translation>
 <translation id="2367972762794486313">Apps weergeven</translation>
 <translation id="2371076942591664043">Openen wanneer geree&amp;d</translation>
 <translation id="2377319039870049694">Overschakelen naar lijstweergave</translation>
@@ -1102,7 +1103,7 @@
 <translation id="270358213449696159">Inhoud van Voorwaarden van Google Chrome OS</translation>
 <translation id="2704184184447774363">Microsoft-documentondertekening</translation>
 <translation id="270516211545221798">Snelheid touchpad</translation>
-<translation id="2705736684557713153">Scroll naar beneden op het scherm en schakel instant-tethering in als deze optie wordt weergegeven. Als de optie niet wordt weergegeven, ben je helemaal klaar.</translation>
+<translation id="2705736684557713153">Scroll naar de onderkant van het scherm en schakel instant-tethering in als deze optie wordt weergegeven. Als de optie niet wordt weergegeven, ben je helemaal klaar.</translation>
 <translation id="2706892089432507937">USB-apparaten</translation>
 <translation id="2706954854267016964">Het geselecteerde Google Cloudprinter-apparaat wordt niet meer ondersteund. Stel de printer in via de systeeminstellingen van je computer.</translation>
 <translation id="2707024448553392710">Component downloaden</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">Als je op een webpagina op Tab drukt, worden links en velden in formulieren gemarkeerd</translation>
 <translation id="2916745397441987255">Extensies zoeken</translation>
 <translation id="2921081876747860777">Stel een wachtwoord in om je lokale gegevens te beschermen.</translation>
-<translation id="2924395203970765374">Gesynchroniseerd met <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Bladen</translation>
 <translation id="2927017729816812676">Cache-opslag</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Account voor kinderen)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">Gefeliciteerd</translation>
 <translation id="3349933790966648062">Geheugenvoetafdruk</translation>
 <translation id="3353984535370177728">Een map voor uploaden selecteren</translation>
-<translation id="335581015389089642">Spraak</translation>
 <translation id="3355936511340229503">Verbindingsfout</translation>
 <translation id="3356797067524893661">Je bent gereed om door te gaan met Hangouts Meet</translation>
 <translation id="3358935496594837302">Kan je telefoon niet vinden. Zorg ervoor dat je een geschikte Android-telefoon gebruikt die is ingeschakeld en zich in de buurt bevindt. &lt;a&gt;Meer informatie&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Openen op nieuw tabblad</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Browsegegevens wissen...</translation>
-<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' opzoeken</translation>
 <translation id="3620292326130836921">Er is een back-up van alles gemaakt</translation>
 <translation id="3623574769078102674">Deze gebruiker met beperkte rechten wordt beheerd door <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Screenshots uitgeschakeld</translation>
@@ -2053,7 +2051,7 @@
 <translation id="4107048419833779140">Opslagapparaten identificeren en verwijderen</translation>
 <translation id="4109135793348361820">Venster verplaatsen naar <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110559665646603267">Focus op plank</translation>
-<translation id="4110895898888439383">Surf op internet in de modus voor hoog contrast</translation>
+<translation id="4110895898888439383">Browse op het web in de modus voor hoog contrast</translation>
 <translation id="4114360727879906392">Vorig venster</translation>
 <translation id="4115002065223188701">Netwerk buiten bereik</translation>
 <translation id="4115080753528843955">Sommige contentservices gebruiken unieke ID's om de toegang tot beveiligde content te autoriseren</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">Tijdens het scannen van dit bestand met antivirussoftware is er een onverwachte fout opgetreden.</translation>
 <translation id="428608937826130504">Plankartikel 8</translation>
 <translation id="4287502004382794929">Je hebt niet voldoende softwarelicenties om dit apparaat te registreren. Neem contact op met de salesafdeling om meer licenties te kopen. Als je denkt dat dit bericht ten onrechte wordt weergegeven, neem je contact op met de ondersteuning.</translation>
-<translation id="4289300219472526559">Inspreken starten</translation>
 <translation id="4289540628985791613">Overzicht</translation>
 <translation id="4296575653627536209">Gebruiker met beperkte rechten toevoegen</translation>
 <translation id="4297322094678649474">Talen wijzigen</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Vereist een extensie uit de Chrome Web Store</translation>
 <translation id="4750394297954878236">Suggesties</translation>
 <translation id="475088594373173692">Eerste gebruiker</translation>
+<translation id="4751476147751820511">Bewegings- of lichtsensoren</translation>
 <translation id="4756378406049221019">Stoppen/opnieuw laden</translation>
 <translation id="4756388243121344051">Gesc&amp;hiedenis</translation>
 <translation id="4759238208242260848">Downloads</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Netwerkfout</translation>
 <translation id="4816492930507672669">Aanpassen aan pagina</translation>
 <translation id="4820334425169212497">Nee, ik zie het niet</translation>
-<translation id="4821725298388681253">Dit is een vroege release. Sommige functies (zoals zoeken en tekst invoeren) zijn nog niet beschikbaar.</translation>
 <translation id="4821935166599369261">&amp;Profiling ingeschakeld</translation>
 <translation id="4823484602432206655">Gebruikers- en apparaatinstellingen lezen en wijzigen</translation>
 <translation id="4823651846660089135">Apparaat is alleen-lezen</translation>
@@ -2824,7 +2821,7 @@
 <translation id="5398772614898833570">Advertenties geblokkeerd</translation>
 <translation id="5402815541704507626">Update downloaden via mobiele data</translation>
 <translation id="540296380408672091">Cookies op <ph name="HOST" /> altijd blokkeren</translation>
-<translation id="5405146885510277940">Instellingen opnieuw instellen</translation>
+<translation id="5405146885510277940">Instellingen resetten</translation>
 <translation id="5408750356094797285">Zoom: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">Verras me</translation>
 <translation id="5411472733320185105">De proxyinstellingen niet gebruiken voor deze hosts en domeinen:</translation>
@@ -3297,7 +3294,7 @@
 <translation id="6136285399872347291">Backspace</translation>
 <translation id="6137767437444130246">Gebruikerscertificaat</translation>
 <translation id="6138680304137685902">X9.62 ECDSA-handtekening met SHA-384</translation>
-<translation id="6141988275892716286">Downloaden bevestigen</translation>
+<translation id="6141988275892716286">Download bevestigen</translation>
 <translation id="6143186082490678276">Hulp nodig?</translation>
 <translation id="6144938890088808325">Help ons Chromebooks te verbeteren</translation>
 <translation id="6146563240635539929">Video's</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">Zoek de vingerafdruksensor op je apparaat en raak deze aan met je vinger</translation>
 <translation id="6390799748543157332">De pagina's die je in dit venster bekijkt, worden niet in de browsergeschiedenis weergegeven en laten geen sporen op de computer achter (zoals cookies) nadat je alle geopende gastvensters hebt gesloten. Bestanden die je downloadt, blijven echter wel behouden.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Systeeminformatie<ph name="END_LINK1" /> en <ph name="BEGIN_LINK2" />statistische gegevens<ph name="END_LINK2" /> verzenden</translation>
-<translation id="6397363302884558537">Inspreken stoppen</translation>
 <translation id="6397592254427394018">Alle bladwijzers openen in &amp;incognitovenster</translation>
 <translation id="6398715114293939307">Google Play Store verwijderen</translation>
 <translation id="6398765197997659313">Volledig scherm sluiten</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">Gebruikersnaam/wachtwoord onjuist of EAP-verificatie mislukt</translation>
 <translation id="729761647156315797">Kies je taal en toetsenbord</translation>
 <translation id="7299337219131431707">Gebruiken als gast toestaan</translation>
+<translation id="7303900363563182677">Deze site kan geen tekst en afbeeldingen bekijken die naar het klembord zijn gekopieerd</translation>
 <translation id="730515362922783851">Gegevens uitwisselen met elk apparaat op het lokale netwerk of internet</translation>
 <translation id="7308002049209013926">Gebruik de Launcher om snel naar nieuwe apps en activiteiten te gaan. Druk op Alt + Shift + L om via het toetsenbord daarnaartoe te gaan.</translation>
 <translation id="7309257895202129721">Besturingselementen &amp;weergeven</translation>
@@ -4306,7 +4303,7 @@
 <translation id="7782102568078991263">Geen verdere suggesties van Google</translation>
 <translation id="778330624322499012">Kan <ph name="PLUGIN_NAME" /> niet laden</translation>
 <translation id="7784067724422331729">Beveiligingsinstellingen op je computer hebben dit bestand geblokkeerd.</translation>
-<translation id="778480864305029524">Schakel meldingen voor Google Play-services in om instant-tethering te gebruiken</translation>
+<translation id="778480864305029524">Schakel meldingen voor Google Play-services in om instant-tethering te gebruiken.</translation>
 <translation id="7786207843293321886">Gastsessie sluiten</translation>
 <translation id="7786889348652477777">App opnieuw &amp;laden</translation>
 <translation id="7787129790495067395">Je gebruikt momenteel een wachtwoordzin. Als je je wachtwoordzin bent vergeten, kun je de synchronisatie opnieuw instellen, zodat je je gegevens van de servers van Google kunt verwijderen met Google Dashboard.</translation>
@@ -4404,6 +4401,7 @@
 <translation id="7909969815743704077">Gedownload in incognitomodus</translation>
 <translation id="7910768399700579500">&amp;Nieuwe map</translation>
 <translation id="7912080627461681647">Je wachtwoord is gewijzigd op de server. Log uit en weer in.</translation>
+<translation id="7912883689016444961">Mobiel netwerk configureren</translation>
 <translation id="7915471803647590281">Vertel ons wat er aan de hand is voordat je de feedback verzendt.</translation>
 <translation id="7925247922861151263">AAA-controle mislukt</translation>
 <translation id="7925285046818567682">Wachten op <ph name="HOST_NAME" />...</translation>
@@ -4470,7 +4468,7 @@
 <translation id="8005600846065423578"><ph name="HOST" /> altijd toestaan om het klembord te bekijken</translation>
 <translation id="8008356846765065031">Verbinding met internet verbroken. Controleer je internetverbinding.</translation>
 <translation id="8008818777654712271">Bepaalde systeeminformatie en paginacontent automatisch verzenden naar Google om te helpen bij de detectie van gevaarlijke apps en sites</translation>
-<translation id="8009225694047762179">Wachtwoord beheren</translation>
+<translation id="8009225694047762179">Wachtwoorden beheren</translation>
 <translation id="8012382203418782830">Deze pagina is vertaald.</translation>
 <translation id="8014154204619229810">De updater wordt momenteel uitgevoerd. Klik op Vernieuwen om opnieuw te controleren.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> kan niet worden teruggezet naar de voorgaande versie. Probeer Powerwash opnieuw op je apparaat.</translation>
@@ -4915,6 +4913,7 @@
 <translation id="8736288397686080465">Deze site is geüpdatet op de achtergrond.</translation>
 <translation id="8737685506611670901">Links voor <ph name="PROTOCOL" /> openen in plaats van <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Scherm-in-scherm</translation>
 <translation id="8743864605301774756">1 uur geleden geüpdatet</translation>
 <translation id="8749863574775030885">Toegang verkrijgen tot USB-apparaten van een onbekende leverancier</translation>
 <translation id="8754200782896249056">&lt;p&gt;Wanneer je <ph name="PRODUCT_NAME" /> uitvoert in een ondersteunde desktopomgeving, worden de proxyinstellingen van het systeem gebruikt. Je systeem wordt echter niet ondersteund of er is een probleem opgetreden met het lanceren van je systeemconfiguratie.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Uitrekken</translation>
 <translation id="8915370057835397490">Suggestie wordt geladen</translation>
 <translation id="8916476537757519021">Incognito-subframe: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synchroniseren met <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Altijd advertenties op deze site toestaan</translation>
 <translation id="8925458182817574960">&amp;Instellingen</translation>
 <translation id="8926389886865778422">Niet meer vragen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index b552042..42e5b88 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -546,7 +546,7 @@
 <translation id="1817310072033858383">Konfigurer Smart Lock for <ph name="DEVICE_TYPE" />-enheten</translation>
 <translation id="1817871734039893258">Microsoft-filgjenoppretting</translation>
 <translation id="1818007989243628752">Slett passordet for <ph name="USERNAME" /></translation>
-<translation id="1819721979226826163">Trykk på Appvarsler &gt; Google Play Tjenester</translation>
+<translation id="1819721979226826163">Trykk på Appvarsler &gt; Google Play Tjenester.</translation>
 <translation id="1826516787628120939">Kontrollerer</translation>
 <translation id="1828149253358786390"><ph name="SITE" /> vil sende deg varsler.</translation>
 <translation id="1828378091493947763">Dette programtillegget støttes ikke på denne enheten</translation>
@@ -585,7 +585,7 @@
 <translation id="1878524442024357078">Ikke la noen nettsteder bruke programtillegg for å få tilgang til datamaskinen din</translation>
 <translation id="1879449842763884566">Installer i Programmer</translation>
 <translation id="1880905663253319515">Vil du slette sertifikatet «<ph name="CERTIFICATE_NAME" />»?</translation>
-<translation id="188190999506226223">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal lagre passordet for <ph name="ORIGIN" />?</translation>
+<translation id="188190999506226223">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal lagre passordet ditt for <ph name="ORIGIN" />?</translation>
 <translation id="1886996562706621347">Tillat at nettsteder kan be om å bli standardbehandlere for protokoller (anbefalt)</translation>
 <translation id="1887442540531652736">Påloggingsfeil</translation>
 <translation id="1887850431809612466">Maskinvareversjon</translation>
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">Du kan administrere utvidelsene dine ved å klikke på Utvidelser i verktøymenyen.</translation>
 <translation id="2359808026110333948">Fortsett</translation>
 <translation id="236141728043665931">Blokkér alltid bruk av mikrofonen</translation>
+<translation id="2365507699358342471">Dette nettstedet kan se tekst og bilder som er kopiert til utklippstavlen.</translation>
 <translation id="2367972762794486313">Vis apper</translation>
 <translation id="2371076942591664043">Åpne når ne&amp;dlastingen er ferdig</translation>
 <translation id="2377319039870049694">Bytt til listevisning</translation>
@@ -1265,7 +1266,6 @@
 <translation id="2916073183900451334">Trykk på Tab på en nettside for å utheve linker og skjemafelter</translation>
 <translation id="2916745397441987255">Søk i utvidelser</translation>
 <translation id="2921081876747860777">Opprett et passord for å beskytte de lokale dataene dine.</translation>
-<translation id="2924395203970765374">Synkronisert med <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Regneark</translation>
 <translation id="2927017729816812676">Bufferlagring</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Konto for barn)</translation>
@@ -1547,7 +1547,6 @@
 <translation id="3348459612390503954">Gratulerer</translation>
 <translation id="3349933790966648062">Minnebruk</translation>
 <translation id="3353984535370177728">Velg mappen du vil laste opp</translation>
-<translation id="335581015389089642">Tale</translation>
 <translation id="3355936511340229503">Tilkoblingsfeil</translation>
 <translation id="3356797067524893661">Du er klar for å fortsette til Hangouts Meet</translation>
 <translation id="3358935496594837302">Finner ikke telefonen. Sørg for at du bruker en kompatibel Android-telefon som er slått på og i nærheten. &lt;a&gt;Finn ut mer&lt;/a&gt;</translation>
@@ -1724,7 +1723,6 @@
 <translation id="3613422051106148727">&amp;Åpne i ny fane</translation>
 <translation id="3616113530831147358">Lyd</translation>
 <translation id="3616741288025931835">&amp;Fjern nettlesingsdata</translation>
-<translation id="3618849550573277856">Slå opp «<ph name="LOOKUP_STRING" />»</translation>
 <translation id="3620292326130836921">Alt er sikkerhetskopiert!</translation>
 <translation id="3623574769078102674">Denne administrerte brukeren blir administrert av <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Skjermdumper er deaktivert</translation>
@@ -2137,7 +2135,6 @@
 <translation id="428565720843367874">Anti-virusprogramvare avsluttet uventet under skanning denne filen.</translation>
 <translation id="428608937826130504">Hylleelement 8</translation>
 <translation id="4287502004382794929">Du har ikke tilstrekkelige programvarelisenser for å registrere denne enheten. Ta kontakt med salgsavdelingen for å kjøpe flere. Hvis du tror dette er en feil, kan du ta kontakt med brukerstøtten.</translation>
-<translation id="4289300219472526559">Begynn å snakke</translation>
 <translation id="4289540628985791613">Oversikt</translation>
 <translation id="4296575653627536209">Legg til en administrert bruker</translation>
 <translation id="4297322094678649474">Endre språk</translation>
@@ -2398,6 +2395,7 @@
 <translation id="4748762018725435655">Krever utvidelse fra Chrome Nettmarked</translation>
 <translation id="4750394297954878236">Forslag</translation>
 <translation id="475088594373173692">Første bruker</translation>
+<translation id="4751476147751820511">Bevegelses- eller lyssensorer</translation>
 <translation id="4756378406049221019">Stopp / last inn på nytt</translation>
 <translation id="4756388243121344051">&amp;Logg</translation>
 <translation id="4759238208242260848">Nedlastinger</translation>
@@ -2432,7 +2430,6 @@
 <translation id="4813512666221746211">Nettverksfeil</translation>
 <translation id="4816492930507672669">Tilpass til siden</translation>
 <translation id="4820334425169212497">Nei, jeg ser den ikke</translation>
-<translation id="4821725298388681253">Dette er en tidlig utgave. Enkelte funksjoner – for eksempel søk og tekstinndata – er ikke tilgjengelige ennå.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktivert</translation>
 <translation id="4823484602432206655">lese og endre bruker- og enhetsinnstillinger</translation>
 <translation id="4823651846660089135">Enheten er skrivebeskyttet</translation>
@@ -2459,7 +2456,7 @@
 <translation id="4850669014075537160">Rulling</translation>
 <translation id="4850886885716139402">Visning</translation>
 <translation id="4853020600495124913">Åpne i &amp;nytt vindu</translation>
-<translation id="4853882474657327078">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal oppdatere passordet ditt for <ph name="ORIGIN" />?</translation>
+<translation id="4853882474657327078">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal lagre passordet ditt for <ph name="ORIGIN" />?</translation>
 <translation id="4856478137399998590">Mobildatatjenesten er aktivert og klar til bruk</translation>
 <translation id="4857506433977877623">{COUNT,plural, =0{Åpne alle i &amp;inkognitovinduer}=1{Åpne i et &amp;inkognitovindu}other{Åpne alle (#) i &amp;inkognitovinduer}}</translation>
 <translation id="4858913220355269194">Drible</translation>
@@ -3138,7 +3135,7 @@
 <translation id="5882919346125742463">Kjente nettverk</translation>
 <translation id="5884474295213649357">Denne fanen er koblet til en USB-enhet.</translation>
 <translation id="5885324376209859881">Administrer medieinnstillingene</translation>
-<translation id="5887341066363321040">Ingen lagrede passord for <ph name="ORIGIN" /></translation>
+<translation id="5887341066363321040">Ingen passord er lagret for <ph name="ORIGIN" /></translation>
 <translation id="5889282057229379085">Maksimalt antall mellomliggende sertifiseringsinstanser: <ph name="NUM_INTERMEDIATE_CA" /></translation>
 <translation id="5895138241574237353">Start på nytt</translation>
 <translation id="5895187275912066135">Utstedt</translation>
@@ -3442,7 +3439,6 @@
 <translation id="6388771388956873507">Finn frem til fingeravtrykkssensoren på enheten din, og legg en finger på den</translation>
 <translation id="6390799748543157332">Sider du åpner i dette vinduet, vises ikke i nettloggen og de etterlater ingen andre spor (f.eks. informasjonskapsler) på datamaskinen etter at du har lukket alle åpne gjestevinduer. Filer du laster ned, blir imidlertid lagret.</translation>
 <translation id="6395423953133416962">Send <ph name="BEGIN_LINK1" />systeminformasjon<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />-målinger<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stopp å snakke</translation>
 <translation id="6397592254427394018">Åpne alle bokmerker i &amp;inkognitovindu</translation>
 <translation id="6398715114293939307">Fjern Google Play-butikken</translation>
 <translation id="6398765197997659313">Avslutt fullskjerm</translation>
@@ -3591,7 +3587,7 @@
 <translation id="6613452264606394692">Kom raskt tilbake hit ved å sette denne siden som bokmerke</translation>
 <translation id="6615455863669487791">Vis meg</translation>
 <translation id="661719348160586794">Dine lagrede passord vises her.</translation>
-<translation id="6618097958368085618">Behold likevel</translation>
+<translation id="6618097958368085618">Behold uansett</translation>
 <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation>
 <translation id="6619801788773578757">Legg til kioskapp</translation>
 <translation id="6619990499523117484">Bekreft PIN-koden din</translation>
@@ -4014,6 +4010,7 @@
 <translation id="7297443947353982503">Brukernavn/passord er galt, eller så mislyktes EAP-autorisasjonen</translation>
 <translation id="729761647156315797">Velg språket og tastaturet ditt</translation>
 <translation id="7299337219131431707">Slå på gjestesurfing</translation>
+<translation id="7303900363563182677">Dette nettstedet er blokkert fra å se tekst og bilder som er kopiert til utklippstavlen</translation>
 <translation id="730515362922783851">utveksle data med en hvilken som helst enhet på det lokale nettverket eller Internett.</translation>
 <translation id="7308002049209013926">Bruk appoversikten for å få rask tilgang til nye apper og aktiviteter. For å komme hit kan du også bruke tastekombinasjonen Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Vis &amp;kontroller</translation>
@@ -4149,7 +4146,7 @@
 <translation id="7526413953848747421">Få nyttige Google-tjenester som stavekontroll og trykk for å søke i Chrome</translation>
 <translation id="7529411698175791732">Sjekk Internett-tilkoblingen din. Hvis problemet vedvarer, bør du prøve å logge av og så logge på igjen.</translation>
 <translation id="7530016656428373557">Utladningshastighet i watt</translation>
-<translation id="7531779363494549572">Gå til Innstillinger &gt; Apper og varsler &gt; Varsler</translation>
+<translation id="7531779363494549572">Gå til Innstillinger &gt; Apper og varsler &gt; Varsler.</translation>
 <translation id="7536709149194614609">Start enheten på nytt, og prøv igjen senere.</translation>
 <translation id="7537601449003285327">Fest til oppgavelinjen</translation>
 <translation id="7540972813190816353">Det oppsto en feil under søk etter oppdateringer: <ph name="ERROR" /></translation>
@@ -4288,7 +4285,7 @@
 <translation id="7782102568078991263">Google har ikke flere forslag</translation>
 <translation id="778330624322499012"><ph name="PLUGIN_NAME" /> kunne ikke lastes inn</translation>
 <translation id="7784067724422331729">Sikkerhetsinnstillingene på datamaskinen din blokkerte denne filen.</translation>
-<translation id="778480864305029524">For å bruke umiddelbar internettdeling, slå på Google Play Tjenester.</translation>
+<translation id="778480864305029524">For å bruke umiddelbar internettdeling, slå på varsler for Google Play Tjenester.</translation>
 <translation id="7786207843293321886">Avslutt gjesteøkten</translation>
 <translation id="7786889348652477777">&amp;Last inn appen på nytt</translation>
 <translation id="7787129790495067395">Du bruker en passordfrase for øyeblikket. Hvis du har glemt passordfrasen din, kan du tilbakestille synkroniseringen for å slette dataene dine fra Googles tjenere gjennom Google-oversikten.</translation>
@@ -4387,6 +4384,7 @@
 <translation id="7909969815743704077">Lastet ned i inkognitomodus</translation>
 <translation id="7910768399700579500">&amp;Ny mappe</translation>
 <translation id="7912080627461681647">Passordet ditt er endret på tjeneren. Logg av og på igjen.</translation>
+<translation id="7912883689016444961">Konfigurer mobilnettverk</translation>
 <translation id="7915471803647590281">Fortell oss hva som skjer før du sender tilbakemeldingen.</translation>
 <translation id="7925247922861151263">AAA-kontroll mislyktes</translation>
 <translation id="7925285046818567682">Venter på <ph name="HOST_NAME" />...</translation>
@@ -4898,6 +4896,7 @@
 <translation id="8736288397686080465">Dette nettstedet har blitt oppdatert i bakgrunnen.</translation>
 <translation id="8737685506611670901">åpne linker til <ph name="PROTOCOL" /> i stedet for <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Bilde-i-bilde</translation>
 <translation id="8743864605301774756">Oppdatert for 1 t siden</translation>
 <translation id="8749863574775030885">Les USB-enheter fra en ukjent leverandør</translation>
 <translation id="8754200782896249056">&lt;p&gt;Når <ph name="PRODUCT_NAME" /> kjører i et støttet skrivebordsmiljø, brukes systemets mellomtjenerinnstillinger. Men enten støttes ikke systemet, eller så oppsto det et problem under oppstart av systemkonfigurasjonen.&lt;/p&gt;
@@ -5000,7 +4999,6 @@
 <translation id="8912793549644936705">Strekk ut</translation>
 <translation id="8915370057835397490">Laster inn forslag …</translation>
 <translation id="8916476537757519021">Inkognito-underramme: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synkroniser til <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Tillat alltid annonser på dette nettstedet</translation>
 <translation id="8925458182817574960">&amp;Innstillinger</translation>
 <translation id="8926389886865778422">Ikke spør igjen</translation>
@@ -5181,7 +5179,7 @@
 <translation id="932327136139879170">Gå til startsiden</translation>
 <translation id="932508678520956232">Kan ikke starte utskrift.</translation>
 <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 Google Chrome.</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 åpne infodokumentet 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="936801553271523408">Systemdiagnostikkdata</translation>
 <translation id="93766956588638423">Reparer utvidelsen</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index a5115f1..55d3ea4f 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Naciśnięcie klawisza Tab na stronie internetowej powoduje podświetlenie linków, a także pól formularza</translation>
 <translation id="2916745397441987255">Szukaj w rozszerzeniach</translation>
 <translation id="2921081876747860777">Utwórz hasło, by chronić swoje dane lokalne.</translation>
-<translation id="2924395203970765374">Zsynchronizowano z kontem użytkownika <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Arkusze</translation>
 <translation id="2927017729816812676">Pamięć podręczna</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (konto dla dzieci)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Gratulacje</translation>
 <translation id="3349933790966648062">Wykorzystanie pamięci</translation>
 <translation id="3353984535370177728">Wybierz folder do przesłania</translation>
-<translation id="335581015389089642">Mowa</translation>
 <translation id="3355936511340229503">Błąd połączenia</translation>
 <translation id="3356797067524893661">Wszystko gotowe do korzystania z Hangouts Meet</translation>
 <translation id="3358935496594837302">Nie można znaleźć telefonu. Upewnij się, że używasz zgodnego telefonu z Androidem oraz że jest on włączony i znajduje się w zasięgu ręki. &lt;a&gt;Więcej informacji&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Otwórz w nowej karcie</translation>
 <translation id="3616113530831147358">Dźwięk</translation>
 <translation id="3616741288025931835">&amp;Wyczyść dane przeglądania...</translation>
-<translation id="3618849550573277856">Sprawdź słowo „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Wszystko ma już kopię zapasową.</translation>
 <translation id="3623574769078102674">Tym użytkownikiem nadzorowanym będzie zarządzać <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Zrzuty ekranu wyłączone</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Podczas skanowania tego pliku w oprogramowaniu antywirusowym wystąpił nieoczekiwany błąd.</translation>
 <translation id="428608937826130504">8 element na półce</translation>
 <translation id="4287502004382794929">Nie masz wystarczającej liczby licencji na oprogramowanie, by zarejestrować to urządzenie. Aby dokupić licencje, skontaktuj się z działem sprzedaży. Jeśli uważasz, że widzisz tę wiadomość z powodu błędu, skontaktuj się z obsługą klienta.</translation>
-<translation id="4289300219472526559">Zacznij mówić</translation>
 <translation id="4289540628985791613">Przegląd</translation>
 <translation id="4296575653627536209">Dodaj nadzorowanego użytkownika</translation>
 <translation id="4297322094678649474">Zmień języki</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Błąd sieci</translation>
 <translation id="4816492930507672669">Dopasuj do strony</translation>
 <translation id="4820334425169212497">Nie, nie widzę</translation>
-<translation id="4821725298388681253">To jest wczesna wersja. Niektóre funkcje, takie jak wyszukiwanie i wpisywanie tekstu, nie są jeszcze dostępne.</translation>
 <translation id="4821935166599369261">&amp;Profilowanie włączone</translation>
 <translation id="4823484602432206655">Odczyt i zmiana ustawień użytkownika oraz urządzenia</translation>
 <translation id="4823651846660089135">Urządzenie tylko do odczytu</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Znajdź na urządzeniu czytnik linii papilarnych i dotknij go palcem</translation>
 <translation id="6390799748543157332">Strony wyświetlane w tym oknie nie pojawią się w historii przeglądarki. Po zamknięciu wszystkich okien otwartych w trybie gościa nie zostanie po nich na komputerze żaden ślad (np. w postaci plików cookie). Pobrane pliki zostaną jednak zachowane.</translation>
 <translation id="6395423953133416962">Przesyłaj <ph name="BEGIN_LINK1" />informacje o systemie<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dane<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Przestań mówić</translation>
 <translation id="6397592254427394018">Otwórz wszystkie zakładki w oknie &amp;incognito</translation>
 <translation id="6398715114293939307">Usuń Sklep Google Play</translation>
 <translation id="6398765197997659313">Zamknij pełny ekran</translation>
@@ -5016,7 +5010,6 @@
 <translation id="8912793549644936705">Rozciągnij</translation>
 <translation id="8915370057835397490">Ładuję sugestie</translation>
 <translation id="8916476537757519021">Ramka podrzędna incognito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Zsynchronizuj z: <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Zawsze zezwalaj na wyświetlanie reklam na tej stronie</translation>
 <translation id="8925458182817574960">&amp;Ustawienia</translation>
 <translation id="8926389886865778422">Nie pytaj ponownie</translation>
@@ -5110,7 +5103,7 @@
 <translation id="9064142312330104323">Zdjęcie z profilu Google (ładowanie)</translation>
 <translation id="9064275926664971810">Włącz autouzupełnianie, by jednym kliknięciem wypełniać formularze</translation>
 <translation id="9064939804718829769">Przetwarzam...</translation>
-<translation id="9065203028668620118">Edycja</translation>
+<translation id="9065203028668620118">Edytuj</translation>
 <translation id="9066782832737749352">Zamiana tekstu na mowę</translation>
 <translation id="9070219033670098627">Przełącz osobę</translation>
 <translation id="907148966137935206">Nie zezwalaj na wyskakujące okienka w żadnej witrynie (zalecane)</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 9ef8f729..aa599519 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Ao pressionar Tab em uma página da Web, os links e os campos de formulário são destacados</translation>
 <translation id="2916745397441987255">Pesquisar extensões</translation>
 <translation id="2921081876747860777">Crie uma senha para proteger seus dados locais.</translation>
-<translation id="2924395203970765374">Sincronizado com <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Planilhas</translation>
 <translation id="2927017729816812676">Armazenamento de cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Conta para crianças)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Parabéns</translation>
 <translation id="3349933790966648062">Ocupação da memória</translation>
 <translation id="3353984535370177728">Selecionar uma pasta para upload</translation>
-<translation id="335581015389089642">Voz</translation>
 <translation id="3355936511340229503">Erro de conexão</translation>
 <translation id="3356797067524893661">Está tudo pronto para usar o Hangouts Meet</translation>
 <translation id="3358935496594837302">Não foi possível localizar seu smartphone. Certifique-se de que você esteja usando um smartphone compatível com Android ativado e acessível. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Abrir em nova guia</translation>
 <translation id="3616113530831147358">Áudio</translation>
 <translation id="3616741288025931835">&amp;Limpar dados de navegação...</translation>
-<translation id="3618849550573277856">Pesquisar “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Backup completo.</translation>
 <translation id="3623574769078102674">Este usuário supervisionado será gerenciado por <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Capturas de tela desativadas</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">O software antivírus falhou inesperadamente ao verificar este arquivo.</translation>
 <translation id="428608937826130504">Item 8 da estante</translation>
 <translation id="4287502004382794929">Você não tem licenças de software suficientes para inscrever este dispositivo. Entre em contato com o departamento de vendas para adquirir mais. Se acredita que esta mensagem está aparecendo por engano, entre em contato com o suporte.</translation>
-<translation id="4289300219472526559">Comece a falar</translation>
 <translation id="4289540628985791613">Visão geral</translation>
 <translation id="4296575653627536209">Adicionar usuário supervisionado</translation>
 <translation id="4297322094678649474">Alterar idiomas</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Erro na rede</translation>
 <translation id="4816492930507672669">Ajustar à página</translation>
 <translation id="4820334425169212497">Não, não estou vendo</translation>
-<translation id="4821725298388681253">Esta é uma versão inicial. Alguns recursos, como a pesquisa e a entrada de texto, ainda não estão disponíveis.</translation>
 <translation id="4821935166599369261">&amp;Criação de perfil ativada</translation>
 <translation id="4823484602432206655">Ler e alterar as configurações do dispositivo e usuário</translation>
 <translation id="4823651846660089135">O dispositivo é somente leitura</translation>
@@ -3454,7 +3449,6 @@
 <translation id="6388771388956873507">Encontre o sensor de impressão digital no dispositivo e toque nele com seu dedo</translation>
 <translation id="6390799748543157332">As páginas que você visualiza nesta janela não aparecem no histórico do navegador e não deixam outros rastros, como cookies, no computador depois que todas as janelas abertas no modo de visitante são fechadas. No entanto, todos os arquivos baixados serão preservados.</translation>
 <translation id="6395423953133416962">Enviar <ph name="BEGIN_LINK1" />informações<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />métricas do sistema<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Pare de falar</translation>
 <translation id="6397592254427394018">Abrir todos os favoritos em &amp;janela  anônima</translation>
 <translation id="6398715114293939307">Remover Google Play Store</translation>
 <translation id="6398765197997659313">Sair do modo tela cheia</translation>
@@ -5026,7 +5020,6 @@
 <translation id="8912793549644936705">Esticar</translation>
 <translation id="8915370057835397490">Carregando sugestão</translation>
 <translation id="8916476537757519021">Subquadro anônimo: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizar com <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Sempre permitir anúncios neste site</translation>
 <translation id="8925458182817574960">&amp;Configurações</translation>
 <translation id="8926389886865778422">Não perguntar novamente</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index e6ace351..1935881 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1271,7 +1271,6 @@
 <translation id="2916073183900451334">Premir Separador numa página Web realça links e campos de formulários</translation>
 <translation id="2916745397441987255">Pesquisar extensões</translation>
 <translation id="2921081876747860777">Crie uma palavra-passe para proteger os seus dados locais.</translation>
-<translation id="2924395203970765374">Sincronizado com <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Folhas</translation>
 <translation id="2927017729816812676">Armazenamento de cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Conta para crianças)</translation>
@@ -1555,7 +1554,6 @@
 <translation id="3348459612390503954">Parabéns</translation>
 <translation id="3349933790966648062">Utilização da memória</translation>
 <translation id="3353984535370177728">Selecionar uma pasta a carregar</translation>
-<translation id="335581015389089642">Voz</translation>
 <translation id="3355936511340229503">Erro de ligação</translation>
 <translation id="3356797067524893661">Está preparado para continuar para o Hangouts Meet</translation>
 <translation id="3358935496594837302">Não é possível localizar o telemóvel. Certifique-se de que está a utilizar um telemóvel Android compatível que está ligado e próximo. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
@@ -1732,7 +1730,6 @@
 <translation id="3613422051106148727">&amp;Abrir num novo separador</translation>
 <translation id="3616113530831147358">Áudio</translation>
 <translation id="3616741288025931835">&amp;Limpar Dados de Navegação...</translation>
-<translation id="3618849550573277856">Procurar "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Foi feita uma cópia de segurança de todos os ficheiros!</translation>
 <translation id="3623574769078102674">Este utilizador supervisionado será gerido por <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Capturas de ecrã desativadas</translation>
@@ -2147,7 +2144,6 @@
 <translation id="428565720843367874">O software antivírus falhou inesperadamente enquanto analisava este ficheiro.</translation>
 <translation id="428608937826130504">Artigo de prateleira 8</translation>
 <translation id="4287502004382794929">Não tem licenças de software suficientes para inscrever este dispositivo. Entre em contacto com as vendas para comprar mais. Se considera que recebeu esta mensagem por engano, contacte o suporte.</translation>
-<translation id="4289300219472526559">Comece a Falar</translation>
 <translation id="4289540628985791613">Vista geral</translation>
 <translation id="4296575653627536209">Adicionar utilizador supervisionado</translation>
 <translation id="4297322094678649474">Alterar idiomas</translation>
@@ -2443,7 +2439,6 @@
 <translation id="4813512666221746211">Erro de rede</translation>
 <translation id="4816492930507672669">Ajustar à página</translation>
 <translation id="4820334425169212497">Não, não estou a ver</translation>
-<translation id="4821725298388681253">Trata-se de uma versão de lançamento antecipado. Algumas funcionalidades, como a pesquisa e a introdução de texto, ainda não estão disponíveis.</translation>
 <translation id="4821935166599369261">Criação de &amp;perfis ativada</translation>
 <translation id="4823484602432206655">Ler e alterar definições do utilizador e do dispositivo</translation>
 <translation id="4823651846660089135">O dispositivo é apenas de leitura</translation>
@@ -3455,7 +3450,6 @@
 <translation id="6388771388956873507">Localize o sensor de impressões digitais no dispositivo e toque nele com o dedo</translation>
 <translation id="6390799748543157332">As páginas visualizadas nesta janela não serão apresentadas no histórico do navegador e não deixarão outros vestígios, como cookies, no computador depois de fechar todas as janelas de Convidado abertas. No entanto, todos os ficheiros transferidos serão preservados.</translation>
 <translation id="6395423953133416962">Enviar <ph name="BEGIN_LINK1" />informações do sistema<ph name="END_LINK1" /> e <ph name="BEGIN_LINK2" />métricas<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Pare de Falar</translation>
 <translation id="6397592254427394018">Abrir todos os marcadores na janela de &amp;navegação anónima</translation>
 <translation id="6398715114293939307">Remover a Google Play Store</translation>
 <translation id="6398765197997659313">Sair do modo de ecrã inteiro</translation>
@@ -5025,7 +5019,6 @@
 <translation id="8912793549644936705">Esticar</translation>
 <translation id="8915370057835397490">A carregar sugestão</translation>
 <translation id="8916476537757519021">Subestrutura da navegação anónima: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizar com <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Permitir sempre anúncios neste site</translation>
 <translation id="8925458182817574960">&amp;Definições</translation>
 <translation id="8926389886865778422">Não voltar a perguntar</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index d15789f..20b55fd11 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Gestionați extensiile făcând clic pe Extensii în meniul Instrumente.</translation>
 <translation id="2359808026110333948">Continuă</translation>
 <translation id="236141728043665931">Blocați întotdeauna accesul la microfon</translation>
+<translation id="2365507699358342471">Acest site poate să vadă textul și imaginile copiate în clipboard.</translation>
 <translation id="2367972762794486313">Afișați aplicații</translation>
 <translation id="2371076942591664043">Deschide când s-a &amp;descărcat</translation>
 <translation id="2377319039870049694">Comută la afișarea listă</translation>
@@ -1148,7 +1149,7 @@
 <translation id="2762441749940182211">Camera foto este blocată</translation>
 <translation id="2765217105034171413">Mic</translation>
 <translation id="2766006623206032690">In&amp;serează și accesează</translation>
-<translation id="2767084307624729667">Parole salvate pentru <ph name="ORIGIN" />:</translation>
+<translation id="2767084307624729667">Parole salvate pentru <ph name="ORIGIN" /></translation>
 <translation id="276969039800130567">Conectat(ă) ca <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="2770465223704140727">Elimină din listă</translation>
 <translation id="2770690685823456775">Exportă parolele într-un alt dosar</translation>
@@ -1234,7 +1235,7 @@
 <translation id="2871813825302180988">Acest cont este deja utilizat pe acest dispozitiv.</translation>
 <translation id="2872353916818027657">Schimbați monitorul principal</translation>
 <translation id="287286579981869940">Adaugă <ph name="PROVIDER_NAME" />...</translation>
-<translation id="2874343608108773609">Pentru a accesa parolele pe toate dispozitivele, conectează-te la Chrome.</translation>
+<translation id="2874343608108773609">Pentru a accesa marcajele pe toate dispozitivele, conectează-te la Chrome.</translation>
 <translation id="2875698561019555027">(pagini de erori Chrome)</translation>
 <translation id="288042212351694283">Accesează dispozitivele Universal 2nd Factor</translation>
 <translation id="2881966438216424900">Ultima accesare:</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">Dacă apeși Tab când ești pe o pagină, se evidențiază linkurile și câmpurile formularelor</translation>
 <translation id="2916745397441987255">Caută extensii</translation>
 <translation id="2921081876747860777">Creează o parolă ca să protejezi datele locale.</translation>
-<translation id="2924395203970765374">Sincronizat cu <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Foi de calcul</translation>
 <translation id="2927017729816812676">Stocarea pentru memoria cache</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (cont pentru copii)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">Felicitări</translation>
 <translation id="3349933790966648062">Memorie utilizată</translation>
 <translation id="3353984535370177728">Selectați un dosar de încărcat</translation>
-<translation id="335581015389089642">Voce</translation>
 <translation id="3355936511340229503">Eroare de conexiune</translation>
 <translation id="3356797067524893661">Ești gata să accesezi Hangouts Meet</translation>
 <translation id="3358935496594837302">Telefonul nu poate fi găsit. Asigură-te că folosești un telefon Android compatibil care este pornit și la îndemână. &lt;a&gt;Află mai multe&lt;/a&gt;</translation>
@@ -1588,7 +1587,7 @@
 <translation id="3414952576877147120">Dimensiune:</translation>
 <translation id="3420980393175304359">Comută la altă persoană</translation>
 <translation id="3421387094817716717">Cheia publică a curburii eliptice</translation>
-<translation id="3423463006624419153">Pe „<ph name="PHONE_NAME_1" />” și pe „<ph name="PHONE_NAME_2" />”:</translation>
+<translation id="3423463006624419153">Pe „<ph name="PHONE_NAME_1" />” și „<ph name="PHONE_NAME_2" />”:</translation>
 <translation id="342383653005737728">Proprietarul poate alege să trimită la Google date de diagnosticare și privind utilizarea pentru acest dispozitiv. Poți vedea această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> aici. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918">Repornește <ph name="PRODUCT_NAME" /></translation>
 <translation id="3424969259347320884">Descrie ce făceai când s-a blocat fila</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Deschideți într-o filă nouă</translation>
 <translation id="3616113530831147358">Audio</translation>
 <translation id="3616741288025931835">&amp;Șterge datele de navigare...</translation>
-<translation id="3618849550573277856">Caută „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">S-a făcut backup pentru tot!</translation>
 <translation id="3623574769078102674">Acest utilizator va fi monitorizat de <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Capturile de ecran sunt dezactivate</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">Software-ul antivirus a generat o eroare neașteptată la scanarea acestui fișier.</translation>
 <translation id="428608937826130504">Elementul 8 din raft</translation>
 <translation id="4287502004382794929">Nu dețineți suficiente licențe de software pentru a înscrie acest dispozitiv. Contactați departamentul de vânzări pentru a achiziționa licențe suplimentare. În cazul în care considerați că acest mesaj este afișat din greșeală, contactați serviciul de asistență.</translation>
-<translation id="4289300219472526559">Începeți să vorbiți</translation>
 <translation id="4289540628985791613">Prezentare generală</translation>
 <translation id="4296575653627536209">Adaugă un utilizator monitorizat</translation>
 <translation id="4297322094678649474">Schimbă limbile</translation>
@@ -2241,7 +2238,7 @@
 <translation id="4478664379124702289">Salvează lin&amp;kul ca...</translation>
 <translation id="4479424953165245642">Gestionați aplicațiile de tip chioșc</translation>
 <translation id="4479639480957787382">Ethernet</translation>
-<translation id="4480590691557335796">Chrome poate să găsească software dăunător pe computer și să-l elimine</translation>
+<translation id="4480590691557335796">Chrome poate să găsească software dăunător pe computer și să îl elimine</translation>
 <translation id="4481249487722541506">Încarcă extensia neîmpachetată...</translation>
 <translation id="4481530544597605423">Dispozitive neasociate</translation>
 <translation id="4482194545587547824">Google poate folosi istoricul de navigare pentru a personaliza Căutarea și alte servicii Google</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Necesită o extensie din Magazinul web Chrome</translation>
 <translation id="4750394297954878236">Sugestii</translation>
 <translation id="475088594373173692">Primul utilizator</translation>
+<translation id="4751476147751820511">Senzori de mișcare sau de lumină</translation>
 <translation id="4756378406049221019">Oprește/Reîncarcă</translation>
 <translation id="4756388243121344051">&amp;Istoric</translation>
 <translation id="4759238208242260848">Descărcări</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Eroare de rețea</translation>
 <translation id="4816492930507672669">Încadrați în pagină</translation>
 <translation id="4820334425169212497">Nu, nu îl vad</translation>
-<translation id="4821725298388681253">Aceasta este o versiune în dezvoltare. Unele funcții, cum ar fi căutarea și introducerea textului nu sunt încă disponibile.</translation>
 <translation id="4821935166599369261">&amp;Analizare activată</translation>
 <translation id="4823484602432206655">Citește și modifică setările pentru dispozitiv și pentru utilizator</translation>
 <translation id="4823651846660089135">Dispozitivul este numai în citire</translation>
@@ -2656,7 +2653,7 @@
 <translation id="5143374789336132547">Extensia „<ph name="EXTENSION_NAME" />” a modificat ce pagină se afișează când dai clic pe butonul Pagină de pornire.</translation>
 <translation id="5143712164865402236">Deschide în ecran complet</translation>
 <translation id="5145331109270917438">Data modificării</translation>
-<translation id="514575469079499857">Folosește adresa IP pentru a detecta locația (prestabilit)</translation>
+<translation id="514575469079499857">Folosește adresa IP pentru a detecta locația</translation>
 <translation id="5150254825601720210">Nume de server SSL pentru certificat Netscape</translation>
 <translation id="5151354047782775295">Eliberează spațiu pe hard disk sau este posibil ca anumite date să fie șterse automat</translation>
 <translation id="5153297660536091054">Funcția Deblocare prin cod PIN</translation>
@@ -2823,7 +2820,7 @@
 <translation id="5398772614898833570">Anunțurile au fost blocate</translation>
 <translation id="5402815541704507626">Descarcă actualizarea folosind datele mobile</translation>
 <translation id="540296380408672091">Blochează întotdeauna cookie-urile pe <ph name="HOST" /></translation>
-<translation id="5405146885510277940">Resetează browserul</translation>
+<translation id="5405146885510277940">Resetează setările</translation>
 <translation id="5408750356094797285">Zoom: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">Surpriză</translation>
 <translation id="5411472733320185105">Nu utiliza setările proxy pentru următoarele gazde și domenii:</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">Găsește senzorul de amprentă de pe dispozitiv și atinge-l cu degetul</translation>
 <translation id="6390799748543157332">Paginile pe care le accesați în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de ex., cookie-uri) după ce închideți toate ferestrele deschise în modul Invitat. Cu toate acestea, fișierele pe care le descărcați vor fi păstrate.</translation>
 <translation id="6395423953133416962">Trimiteți <ph name="BEGIN_LINK2" />valori<ph name="END_LINK2" /> și <ph name="BEGIN_LINK1" />informații de sistem<ph name="END_LINK1" /></translation>
-<translation id="6397363302884558537">Opriți-vă din vorbit</translation>
 <translation id="6397592254427394018">Deschideți toate marcajele într-o &amp;fereastră incognito</translation>
 <translation id="6398715114293939307">Elimină Magazinul Google Play</translation>
 <translation id="6398765197997659313">Ieși din ecranul complet</translation>
@@ -4023,6 +4019,7 @@
 <translation id="7297443947353982503">Numele de utilizator sau parola sunt incorecte sau autentificarea EAP nu a reușit</translation>
 <translation id="729761647156315797">Alege limba și tastatura</translation>
 <translation id="7299337219131431707">Activați navigarea ca invitat</translation>
+<translation id="7303900363563182677">Accesarea textului și imaginilor copiate în clipboard de către această pagină a fost blocată</translation>
 <translation id="730515362922783851">Fă schimb de date cu orice dispozitiv din rețeaua locală sau de pe internet</translation>
 <translation id="7308002049209013926">Folosește Lansatorul pentru a accesa rapid noi aplicații și activități. Pentru a le accesa folosind tastatura, apasă Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Afișați &amp;comenzile</translation>
@@ -4243,7 +4240,7 @@
 <translation id="7664620655576155379">Dispozitiv Bluetooth neacceptat: „<ph name="DEVICE_NAME" />”.</translation>
 <translation id="7665369617277396874">Adăugați un cont</translation>
 <translation id="7671130400130574146">Folosește bara de titlu și chenarele definite în sistem</translation>
-<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, de pe <ph name="PAGE_TITLE" />.</translation>
+<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, în <ph name="PAGE_TITLE" />.</translation>
 <translation id="7683373461016844951">Pentru a continua, dă clic pe OK, apoi pe Adaugă o persoană pentru a crea un profil nou pentru adresa de e-mail <ph name="DOMAIN" />.</translation>
 <translation id="7684212569183643648">Instalată de administrator</translation>
 <translation id="7684559058815332124">Accesează pagina de conectare a portalului captiv</translation>
@@ -4404,6 +4401,7 @@
 <translation id="7909969815743704077">Descărcat în modul incognito</translation>
 <translation id="7910768399700579500">Dosar &amp;nou</translation>
 <translation id="7912080627461681647">Parola a fost modificată pe server. Deconectează-te, apoi conectează-te din nou.</translation>
+<translation id="7912883689016444961">Configurează rețeaua mobilă</translation>
 <translation id="7915471803647590281">Spune-ne ce se întâmplă înainte de a trimite feedback.</translation>
 <translation id="7925247922861151263">Verificarea AAA nu a reușit</translation>
 <translation id="7925285046818567682">Se așteaptă <ph name="HOST_NAME" />...</translation>
@@ -4915,6 +4913,7 @@
 <translation id="8736288397686080465">Acest site a fost actualizat în fundal.</translation>
 <translation id="8737685506611670901">Deschide linkurile <ph name="PROTOCOL" /> și nu <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8743864605301774756">Actualizată acum o oră</translation>
 <translation id="8749863574775030885">Accesează dispozitive USB de la un producător necunoscut</translation>
 <translation id="8754200782896249056">&lt;p&gt;Când rulezi <ph name="PRODUCT_NAME" /> într-un mediu de desktop acceptat, vor fi utilizate setările de proxy ale sistemului. Cu toate acestea, fie sistemul nu este acceptat, fie a existat o problemă la lansarea configurației sistemului.&lt;/p&gt;
@@ -5017,7 +5016,6 @@
 <translation id="8912793549644936705">Extins</translation>
 <translation id="8915370057835397490">Se încarcă sugestiile</translation>
 <translation id="8916476537757519021">Subcadru incognito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sincronizează cu <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Permite întotdeauna anunțurile pe acest site</translation>
 <translation id="8925458182817574960">&amp;Setări</translation>
 <translation id="8926389886865778422">Nu mai întreba</translation>
@@ -5198,7 +5196,7 @@
 <translation id="932327136139879170">Pagina de pornire</translation>
 <translation id="932508678520956232">Printarea nu a putut fi inițiată.</translation>
 <translation id="93393615658292258">Numai parola</translation>
-<translation id="934503638756687833">Articolele care nu au fost afișate aici vor fi, de asemenea, șterse, dacă este cazul. Află mai multe despre &lt;a href="<ph name="URL" />"&gt;protecția împotriva software-ului nedorit&lt;/a&gt; din cartea albă privind confidențialitatea Chrome.</translation>
+<translation id="934503638756687833">Articolele care nu au fost afișate aici pot fi, de asemenea, șterse. Află mai multe despre &lt;a href="<ph name="URL" />"&gt;protecția împotriva software-ului nedorit&lt;/a&gt; din cartea albă privind confidențialitatea Chrome.</translation>
 <translation id="935490618240037774">Marcajele, istoricul, parolele și alte setări vor fi sincronizate cu Contul Google, pentru a le putea folosi pe toate dispozitivele.</translation>
 <translation id="936801553271523408">Date de diagnosticare a sistemului</translation>
 <translation id="93766956588638423">Repară extensia</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 4389135..1d5a9f1 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -6,7 +6,7 @@
 <translation id="1005274289863221750">Использование микрофона и камеры</translation>
 <translation id="1007408791287232274">Не удалось загрузить список устройств.</translation>
 <translation id="1008186147501209563">Экспорт закладок</translation>
-<translation id="1009147628737158130">Сайт <ph name="URL" /> запрашивает идентификационную информацию о вашем электронном ключе.</translation>
+<translation id="1009147628737158130">Сайт <ph name="URL" /> запрашивает разрешение на просмотр идентификационной информации о вашем электронном ключе.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Страница не отвечает}one{Страницы не отвечают}few{Страницы не отвечают}many{Страницы не отвечают}other{Страницы не отвечают}}</translation>
 <translation id="1012794136286421601">Ваши документы, таблицы, презентации и рисунки синхронизируются. Запустите приложение "Google Диск", чтобы получить к ним доступ в режиме онлайн или офлайн.</translation>
 <translation id="1013707859758800957">На этой странице был запущен плагин, работающий вне тестовой среды.</translation>
@@ -435,7 +435,7 @@
     <ph name="BEGIN_BOLD" />разрешать или запрещать<ph name="END_BOLD" /> доступ к определенным сайтам;
     <ph name="BEGIN_BOLD" />просматривать<ph name="END_BOLD" /> список сайтов, которые посещал пользователь;
     <ph name="BEGIN_BOLD" />изменять<ph name="END_BOLD" /> другие настройки.</translation>
-<translation id="1648528859488547844">Использовать для определения местоположения Wi‑Fi, Bluetooth и мобильные сети</translation>
+<translation id="1648528859488547844">Использовать для определения местоположения Wi‑Fi или мобильные сети</translation>
 <translation id="1648943974594387137">Данные для входа в аккаунт устарели</translation>
 <translation id="1650371550981945235">Показывать параметры ввода</translation>
 <translation id="1650709179466243265">Добавить www. и .com и перейти по ссылке</translation>
@@ -462,7 +462,7 @@
 <translation id="1688935057616748272">Необходимо добавить букву</translation>
 <translation id="168991973552362966">Добавление доступного принтера</translation>
 <translation id="1689945336726856614">Скопировать &amp;URL</translation>
-<translation id="1692115862433274081">Другой аккаунт</translation>
+<translation id="1692115862433274081">Использовать другой аккаунт</translation>
 <translation id="1692602667007917253">Ошибка</translation>
 <translation id="1692799361700686467">Файлы cookie с различных сайтов разрешены.</translation>
 <translation id="169515659049020177">Shift</translation>
@@ -724,7 +724,7 @@
 <translation id="2128691215891724419">Ошибка синхронизации. Обновите кодовую фразу.</translation>
 <translation id="2129825002735785149">Обновить плагин</translation>
 <translation id="2129904043921227933">Ошибка синхронизации. Обновите кодовую фразу.</translation>
-<translation id="2130949041518253417">Синхронизируйте данные браузера на всех ваших устройствах.</translation>
+<translation id="2130949041518253417">Синхронизируйте данные браузера на всех своих устройствах.</translation>
 <translation id="2131077480075264">Невозможно установить <ph name="APP_NAME" />: нет разрешения от <ph name="IMPORT_NAME" /></translation>
 <translation id="2135787500304447609">Возобновить</translation>
 <translation id="2136372518715274136">Введите новый пароль</translation>
@@ -881,6 +881,7 @@
 <translation id="2359345697448000899">Управлять расширениями можно на вкладке "Расширения" в меню "Инструменты".</translation>
 <translation id="2359808026110333948">Далее</translation>
 <translation id="236141728043665931">Всегда блокировать доступ к микрофону</translation>
+<translation id="2365507699358342471">У этого сайта есть доступ к тексту и изображениям, скопированным в буфер обмена</translation>
 <translation id="2367972762794486313">Показать сервисы</translation>
 <translation id="2371076942591664043">Открыть по &amp;завершении</translation>
 <translation id="2377319039870049694">Показать в виде списка</translation>
@@ -1029,7 +1030,7 @@
 <translation id="2603115962224169880">Удалить вредоносное ПО с компьютера</translation>
 <translation id="2603463522847370204">Открыть в режиме &amp;инкогнито</translation>
 <translation id="2604255671529671813">Ошибка подключения к сети</translation>
-<translation id="2606246518223360146">Связать аккаунты</translation>
+<translation id="2606246518223360146">Связать данные</translation>
 <translation id="2607101320794533334">Информация об открытом ключе субъекта</translation>
 <translation id="2607459012323956820">Менеджер может просматривать настройки и историю этого контролируемого профиля на странице <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />.</translation>
 <translation id="2608770217409477136">Использовать настройки по умолчанию</translation>
@@ -1103,7 +1104,7 @@
 <translation id="270358213449696159">Полный текст Условий использования Google Chrome OS</translation>
 <translation id="2704184184447774363">Подпись документов Microsoft</translation>
 <translation id="270516211545221798">Скорость указателя (для сенсорной панели)</translation>
-<translation id="2705736684557713153">Прокрутите страницу вниз и включите мгновенную точку доступа, если появится эта опция. Если ее нет, значит функция настроена.</translation>
+<translation id="2705736684557713153">Прокрутите экран вниз и включите мгновенную точку доступа. Если этой функции нет, значит она настроена.</translation>
 <translation id="2706892089432507937">USB-устройства</translation>
 <translation id="2706954854267016964">Этот виртуальный принтер Google больше не поддерживается. Подключите новый в системных настройках компьютера.</translation>
 <translation id="2707024448553392710">Компонент скачивается</translation>
@@ -1235,7 +1236,7 @@
 <translation id="2871813825302180988">Аккаунт уже используется на этом мобильном устройстве.</translation>
 <translation id="2872353916818027657">Переключить основной монитор</translation>
 <translation id="287286579981869940">Добавить сеть <ph name="PROVIDER_NAME" />...</translation>
-<translation id="2874343608108773609">Чтобы получить доступ к паролям на всех своих устройствах, войдите в Chrome</translation>
+<translation id="2874343608108773609">Чтобы получить доступ к паролям на всех своих устройствах, войдите в Chrome.</translation>
 <translation id="2875698561019555027">(страницы ошибок в Chrome)</translation>
 <translation id="288042212351694283">С доступом к устройствам Universal 2nd Factor</translation>
 <translation id="2881966438216424900">Последнее время доступа:</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">Нажатие клавиши Tab на веб-странице приводит к выделению ссылок, а также полей формы</translation>
 <translation id="2916745397441987255">Поиск по расширениям</translation>
 <translation id="2921081876747860777">Введите пароль, чтобы защитить свои локальные данные</translation>
-<translation id="2924395203970765374">Профиль синхронизирован с аккаунтом пользователя <ph name="FULL_NAME" />.</translation>
 <translation id="2925966894897775835">Таблицы</translation>
 <translation id="2927017729816812676">CacheStorage</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (детский аккаунт)</translation>
@@ -1358,7 +1358,7 @@
 <translation id="3038612606416062604">Добавление принтера вручную</translation>
 <translation id="3038675903128704560">Запретить сайтам использовать плагин для доступа к компьютеру</translation>
 <translation id="3039828483675273919">Перемещение элементов ($1)…</translation>
-<translation id="3045447014237878114">Этот сайт автоматически скачал несколько файлов.</translation>
+<translation id="3045447014237878114">Этот сайт автоматически скачал несколько файлов</translation>
 <translation id="304567287000691532">Совместный доступ к экрану</translation>
 <translation id="3046910703532196514">Веб-страница полностью</translation>
 <translation id="304826556400666995">Включить звук на вкладках</translation>
@@ -1439,7 +1439,7 @@
 <translation id="316307797510303346">Просматривать сайты, открытые этим пользователем, и контролировать его действия через аккаунт <ph name="CUSTODIAN_EMAIL" />.
     Данные для входа в аккаунт устарели.</translation>
 <translation id="3165390001037658081">Некоторые операторы могут блокировать эту функцию.</translation>
-<translation id="316854673539778496">Чтобы получить доступ к расширениям на всех ваших устройствах, войдите в аккаунт и включите синхронизацию.</translation>
+<translation id="316854673539778496">Чтобы получить доступ к расширениям на всех своих устройствах, войдите в аккаунт и включите синхронизацию.</translation>
 <translation id="3170072451822350649">Можно пропустить это действие и начать <ph name="LINK_START" />гостевой сеанс<ph name="LINK_END" />.</translation>
 <translation id="3177048931975664371">Нажмите, чтобы скрыть пароль</translation>
 <translation id="3177857336576585529">Сайт <ph name="SITE_NAME" /> запрашивает разрешение.</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">Поздравляем!</translation>
 <translation id="3349933790966648062">Объем потребляемой памяти</translation>
 <translation id="3353984535370177728">Выберите папку для загрузки</translation>
-<translation id="335581015389089642">Озвучить</translation>
 <translation id="3355936511340229503">Ошибка подключения</translation>
 <translation id="3356797067524893661">Все готово! Можно возвращаться в Hangouts Meet.</translation>
 <translation id="3358935496594837302">Телефон не обнаружен. Убедитесь, что вы используете совместимое устройство Android, которое включено и находится поблизости. &lt;a&gt;Подробнее…&lt;/a&gt;</translation>
@@ -1589,7 +1588,7 @@
 <translation id="3414952576877147120">Размер:</translation>
 <translation id="3420980393175304359">Сменить пользователя</translation>
 <translation id="3421387094817716717">Открытый ключ на эллиптических кривых</translation>
-<translation id="3423463006624419153">На <ph name="PHONE_NAME_1" /> и <ph name="PHONE_NAME_2" />:</translation>
+<translation id="3423463006624419153">На устройствах <ph name="PHONE_NAME_1" /> и <ph name="PHONE_NAME_2" />:</translation>
 <translation id="342383653005737728">Возможно, владелец разрешил автоматическую отправку в Google данных об использовании и диагностике устройства. Проверьте эту <ph name="BEGIN_LINK1" />настройку<ph name="END_LINK1" /> здесь. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="3423858849633684918">Перезапустите <ph name="PRODUCT_NAME" /></translation>
 <translation id="3424969259347320884">Опишите, что вы делали, когда произошел сбой</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">&amp;Открыть в новой вкладке</translation>
 <translation id="3616113530831147358">Аудио</translation>
 <translation id="3616741288025931835">Очистить данные просмотров...</translation>
-<translation id="3618849550573277856">Найти "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Данные сохранены!</translation>
 <translation id="3623574769078102674">Менеджер этого контролируемого профиля: <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Скриншоты отключены</translation>
@@ -2145,7 +2143,6 @@
 <translation id="428565720843367874">При сканировании этого файла произошел сбой антивирусного ПО.</translation>
 <translation id="428608937826130504">8-й объект на панели запуска</translation>
 <translation id="4287502004382794929">Недостаточно программных лицензий для регистрации устройства. Чтобы решить эту проблему, свяжитесь с отделом продаж. Если вы считаете, что произошла ошибка, обратитесь в службу поддержки.</translation>
-<translation id="4289300219472526559">Начать голосовой ввод</translation>
 <translation id="4289540628985791613">Обзор</translation>
 <translation id="4296575653627536209">Создать контролируемый профиль</translation>
 <translation id="4297322094678649474">Настройки перевода</translation>
@@ -2406,6 +2403,7 @@
 <translation id="4748762018725435655">Требуется расширение из Интернет-магазина Chrome</translation>
 <translation id="4750394297954878236">Предложения</translation>
 <translation id="475088594373173692">Первый пользователь</translation>
+<translation id="4751476147751820511">Датчики движения и освещенности</translation>
 <translation id="4756378406049221019">Остановить/Перезапустить</translation>
 <translation id="4756388243121344051">&amp;История</translation>
 <translation id="4759238208242260848">Скачанные файлы</translation>
@@ -2440,7 +2438,6 @@
 <translation id="4813512666221746211">Ошибка сети</translation>
 <translation id="4816492930507672669">По размеру страницы</translation>
 <translation id="4820334425169212497">Нет</translation>
-<translation id="4821725298388681253">Это предварительная версия. Некоторые функции, например ввод текста и поиск, пока недоступны.</translation>
 <translation id="4821935166599369261">&amp;Сбор данных включен</translation>
 <translation id="4823484602432206655">Просмотр и изменение настроек для пользователей и устройств</translation>
 <translation id="4823651846660089135">Устройство доступно только для чтения</translation>
@@ -2657,7 +2654,7 @@
 <translation id="5143374789336132547">Расширение "<ph name="EXTENSION_NAME" />" изменило страницу, которая отображается при нажатии кнопки "Главная страница".</translation>
 <translation id="5143712164865402236">Перейти в полноэкранный режим</translation>
 <translation id="5145331109270917438">Дата изменения</translation>
-<translation id="514575469079499857">Использовать для определения местоположения IP-адрес</translation>
+<translation id="514575469079499857">Использовать для определения местоположения IP-адрес (по умолчанию)</translation>
 <translation id="5150254825601720210">Имя сервера SSL-сертификатов Netscape</translation>
 <translation id="5151354047782775295">Освободите пространство или выберите данные для автоматического удаления.</translation>
 <translation id="5153297660536091054">Разблокировка по PIN-коду</translation>
@@ -2933,7 +2930,7 @@
 <translation id="5556206011531515970">Чтобы выбрать браузер по умолчанию, нажмите "Далее".</translation>
 <translation id="5556459405103347317">Перезагрузить</translation>
 <translation id="555746285996217175">Включение/отключение блокировки</translation>
-<translation id="5557579359142031072">Просматривать идентификационную информацию о вашем электронном ключе.</translation>
+<translation id="5557579359142031072">Просмотр идентификационной информации о вашем электронном ключе.</translation>
 <translation id="5557991081552967863">Сохранять подключение к Wi-Fi в спящем режиме</translation>
 <translation id="5558129378926964177">&amp;Увеличить</translation>
 <translation id="55601339223879446">Подогнать границы рабочего стола под размер экрана</translation>
@@ -3405,7 +3402,7 @@
 <translation id="6307990684951724544">Система перегружена</translation>
 <translation id="6308937455967653460">Сохранить ссыл&amp;ку как...</translation>
 <translation id="6311220991371174222">Не удалось открыть профиль. Перезапустите Chrome.</translation>
-<translation id="6312400084708441752">Содержит информацию о вредоносных программах, системных настройках и процессах в вашем компьютере.</translation>
+<translation id="6312400084708441752">Содержат информацию о вредоносном ПО, системных настройках и процессах на вашем компьютере.</translation>
 <translation id="6312403991423642364">Неизвестная ошибка сети</translation>
 <translation id="6313641880021325787">ВЫЙТИ ИЗ VR</translation>
 <translation id="6314819609899340042">Функции отладки на устройстве <ph name="IDS_SHORT_PRODUCT_NAME" /> включены.</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">Приложите палец к сканеру отпечатков пальцев на устройстве</translation>
 <translation id="6390799748543157332">Страницы, открытые в гостевом режиме, не сохранятся в истории браузера и не оставят на компьютере следов, таких как файлы cookie. После того как вы их закроете, будут сохранены только скачанные вами файлы.</translation>
 <translation id="6395423953133416962">Отправлять <ph name="BEGIN_LINK1" />сведения о системе<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />значения показателей<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Прекратить голосовой ввод</translation>
 <translation id="6397592254427394018">Открыть все закладки в режиме &amp;инкогнито</translation>
 <translation id="6398715114293939307">Удалить Google Play Маркет</translation>
 <translation id="6398765197997659313">Обычный режим</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">Либо вы ввели неверное имя пользователя или пароль, либо не удалось выполнить аутентификацию по протоколу EAP</translation>
 <translation id="729761647156315797">Выберите язык и клавиатуру</translation>
 <translation id="7299337219131431707">Разрешить просмотр в гостевом режиме</translation>
+<translation id="7303900363563182677">У этого сайта нет доступа к тексту и изображениям, скопированным в буфер обмена</translation>
 <translation id="730515362922783851">Обмен данными с любыми устройствами в локальной сети и Интернете</translation>
 <translation id="7308002049209013926">Используйте панель запуска для быстрого перехода к приложениям и действиям. Для этого нажмите Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Показать &amp;элементы управления</translation>
@@ -4165,7 +4162,7 @@
 <translation id="7526413953848747421">Дополните Chrome удобнейшими функциями Google, например проверкой правописания и быстрым поиском.</translation>
 <translation id="7529411698175791732">Проверьте подключение к Интернету. Если оно установлено, попробуйте выйти из аккаунта и войти снова.</translation>
 <translation id="7530016656428373557">Скорость разрядки в ваттах</translation>
-<translation id="7531779363494549572">Нажмите "Настройки &gt; Уведомления приложений &gt; Сервисы Google Play".</translation>
+<translation id="7531779363494549572">Откройте настройки устройства и выберите "Приложения и уведомления &gt; Уведомления".</translation>
 <translation id="7536709149194614609">Перезапустите устройство и повторите попытку позже.</translation>
 <translation id="7537601449003285327">Закрепить на панели задач</translation>
 <translation id="7540972813190816353">При проверке обновлений произошла ошибка: <ph name="ERROR" /></translation>
@@ -4253,7 +4250,7 @@
 <translation id="7690378713476594306">Выбрать из списка</translation>
 <translation id="7690853182226561458">Добавить &amp;папку</translation>
 <translation id="769569204874261517"><ph name="USER_DISPLAY_NAME" /> (уже есть на этом устройстве)</translation>
-<translation id="7696063401938172191">На <ph name="PHONE_NAME" />:</translation>
+<translation id="7696063401938172191">На устройстве <ph name="PHONE_NAME" />:</translation>
 <translation id="7698408911093959127">{COUNT,plural, =1{1 объект в списке закладок}one{# объект в списке закладок}few{# объекта в списке закладок}many{# объектов в списке закладок}other{# объекта в списке закладок}}</translation>
 <translation id="7701040980221191251">Нет</translation>
 <translation id="7701869757853594372">USER-дескрипторы</translation>
@@ -4306,7 +4303,7 @@
 <translation id="7782102568078991263">Подсказок от Google больше нет</translation>
 <translation id="778330624322499012">Не удалось загрузить <ph name="PLUGIN_NAME" /></translation>
 <translation id="7784067724422331729">Этот файл заблокирован согласно настройкам безопасности компьютера.</translation>
-<translation id="778480864305029524">Чтобы найти мгновенную точку доступа, включите уведомления от сервисов Google Play</translation>
+<translation id="778480864305029524">Чтобы использовать мгновенную точку доступа, включите уведомления от сервисов Google Play</translation>
 <translation id="7786207843293321886">Выйти из гостевого режима</translation>
 <translation id="7786889348652477777">Пере&amp;загрузить приложение</translation>
 <translation id="7787129790495067395">В данный момент вы используете кодовую фразу. Если вы забыли ее, вы можете сбросить синхронизацию в личном кабинете Google и тем самым удалить свои данные с серверов Google.</translation>
@@ -4405,6 +4402,7 @@
 <translation id="7909969815743704077">Скачано в режиме инкогнито</translation>
 <translation id="7910768399700579500">&amp;Новая папка</translation>
 <translation id="7912080627461681647">Пароль был изменен на сервере. Выйдите из аккаунта и войдите снова.</translation>
+<translation id="7912883689016444961">Настроить мобильную сеть</translation>
 <translation id="7915471803647590281">Введите текст отзыва.</translation>
 <translation id="7925247922861151263">Сбой при проверке AAA</translation>
 <translation id="7925285046818567682">Ожидание <ph name="HOST_NAME" />...</translation>
@@ -4526,7 +4524,7 @@
 <translation id="8077684120002777443">Имя пользователя (например, user@example.com)</translation>
 <translation id="8077816382010018681">Быстрая разблокировка</translation>
 <translation id="8079530767338315840">Повторить</translation>
-<translation id="8079938625609335826">Чтобы установить расширения на всех ваших устройствах, включите синхронизацию.</translation>
+<translation id="8079938625609335826">Чтобы получить доступ к расширениям на всех своих устройствах, включите синхронизацию.</translation>
 <translation id="8083739373364455075">100 ГБ на Диске Google бесплатно!</translation>
 <translation id="8086015605808120405">Настройка принтера "<ph name="PRINTER_NAME" />"...</translation>
 <translation id="8090234456044969073">Список самых посещаемых сайтов</translation>
@@ -4916,6 +4914,7 @@
 <translation id="8736288397686080465">Этот сайт был обновлен в фоновом режиме</translation>
 <translation id="8737685506611670901">обработку всех ссылок типа "<ph name="PROTOCOL" />" вместо сервиса <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Картинка в картинке</translation>
 <translation id="8743864605301774756">Обновлено 1 час назад</translation>
 <translation id="8749863574775030885">Доступ к USB-устройствам от неизвестного поставщика</translation>
 <translation id="8754200782896249056">&lt;p&gt;При работе <ph name="PRODUCT_NAME" /> в поддерживаемой среде на компьютере используются системные настройки прокси-сервера. Однако либо ваша система не поддерживается, либо возникли неполадки при запуске системной конфигурации.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Растянуть</translation>
 <translation id="8915370057835397490">Загрузка подсказки</translation>
 <translation id="8916476537757519021">Субфрейм в режиме инкогнито: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Синхронизировать с аккаунтом <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Всегда разрешать рекламу на этом сайте</translation>
 <translation id="8925458182817574960">&amp;Настройки</translation>
 <translation id="8926389886865778422">Больше не спрашивать</translation>
@@ -5047,7 +5045,7 @@
 <translation id="8962083179518285172">Скрыть детали</translation>
 <translation id="8965037249707889821">Введите старый пароль</translation>
 <translation id="8965697826696209160">Недостаточно свободного места.</translation>
-<translation id="8967866634928501045">Чтобы показать, нажмите Alt + Shift + A</translation>
+<translation id="8967866634928501045">Чтобы показать, нажмите Alt + Shift + A</translation>
 <translation id="8970203673128054105">Просмотреть список режимов трансляции</translation>
 <translation id="89720367119469899">Отключить</translation>
 <translation id="8973557916016709913">Сбросить масштаб</translation>
@@ -5199,7 +5197,7 @@
 <translation id="932327136139879170">Главная страница</translation>
 <translation id="932508678520956232">Не удалось начать печать.</translation>
 <translation id="93393615658292258">Только пароль</translation>
-<translation id="934503638756687833">Файлы, не перечисленные здесь, также будут удалены при необходимости. Подробнее &lt;a href="<ph name="URL" />"&gt;о защите от нежелательного ПО&lt;/a&gt;…</translation>
+<translation id="934503638756687833">Объекты, не перечисленные здесь, также будут удалены при необходимости. Подробнее &lt;a href="<ph name="URL" />"&gt;о защите от нежелательного ПО&lt;/a&gt;…</translation>
 <translation id="935490618240037774">Пароли, закладки, история и другие параметры будут синхронизированы с аккаунтом Google, чтобы у вас был доступ к ним на любом устройстве.</translation>
 <translation id="936801553271523408">Диагностические данные системы</translation>
 <translation id="93766956588638423">Восстановить расширение</translation>
@@ -5213,7 +5211,7 @@
 <translation id="942954117721265519">В этом каталоге нет изображений.</translation>
 <translation id="945522503751344254">Отправить отзыв</translation>
 <translation id="952992212772159698">Не активировано</translation>
-<translation id="957960681186851048">Этот сайт попытался автоматически скачать несколько файлов.</translation>
+<translation id="957960681186851048">Этот сайт попытался автоматически скачать несколько файлов</translation>
 <translation id="9580706199804957">Не удалось подключиться к сервисам Google</translation>
 <translation id="958515377357646513">Нажмите, чтобы перейти вперед</translation>
 <translation id="960719561871045870">Код оператора</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index c224944..c899278 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Zvýrazňovať odkazy a polia formulárov na webovej stránke po stlačení klávesu Tab</translation>
 <translation id="2916745397441987255">Hľadať rozšírenia</translation>
 <translation id="2921081876747860777">Vytvorte si heslo na ochranu miestnych dát.</translation>
-<translation id="2924395203970765374">Synchronizované s profilom <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Tabuľky</translation>
 <translation id="2927017729816812676">Úložisko vyrovnávacej pamäte</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (detský účet)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Blahoželáme</translation>
 <translation id="3349933790966648062">Množstvo využívanej pamäte</translation>
 <translation id="3353984535370177728">Vyberte priečinok na nahranie</translation>
-<translation id="335581015389089642">Reč</translation>
 <translation id="3355936511340229503">Chyba pripojenia</translation>
 <translation id="3356797067524893661">Nastavenie je dokončené, môžete pokračovať do služby Hangouts Meet</translation>
 <translation id="3358935496594837302">Telefón sa nedarí nájsť. Skontrolujte, či používate kompatibilný telefón s Androidom, ktorý je zapnutý a v dosahu. &lt;a&gt;Ďalšie informácie&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Otvoriť na novej karte</translation>
 <translation id="3616113530831147358">Zvuk</translation>
 <translation id="3616741288025931835">&amp;Vymazať dáta prehliadania…</translation>
-<translation id="3618849550573277856">Vyhľadať „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="3620292326130836921">Všetko je zálohované!</translation>
 <translation id="3623574769078102674">Tento kontrolovaný používateľ bude spravovaný účtom <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Snímky obrazovky sú zakázané</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Antivírusový softvér pri skenovaní tohto súboru neočakávane zlyhal.</translation>
 <translation id="428608937826130504">8. položka na poličke</translation>
 <translation id="4287502004382794929">Nemáte dostatočný počet softvérových licencií na registráciu tohto zariadenia. Kontaktujte obchodné oddelenie a kúpte si ďalšie. Ak sa domnievate, že ide o chybu, kontaktujte podporu.</translation>
-<translation id="4289300219472526559">Začať hovoriť</translation>
 <translation id="4289540628985791613">Prehľad</translation>
 <translation id="4296575653627536209">Pridať kontrolovaného používateľa</translation>
 <translation id="4297322094678649474">Zmeniť jazyky</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Chyba siete</translation>
 <translation id="4816492930507672669">Prispôsobiť stránke</translation>
 <translation id="4820334425169212497">Nie, nevidím ho</translation>
-<translation id="4821725298388681253">Ide o rané vydanie. Niektoré funkcie, napríklad vyhľadávanie a zadávanie textu, zatiaľ nie sú k dispozícii.</translation>
 <translation id="4821935166599369261">&amp;Profilovanie povolené</translation>
 <translation id="4823484602432206655">Čítať a meniť nastavenia používateľa a zariadenia</translation>
 <translation id="4823651846660089135">Zariadenie je len na čítanie</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Nájdite senzor odtlačkov prstov na zariadení a dotknite sa ho prstom</translation>
 <translation id="6390799748543157332">Stránky otvorené v tomto okne sa nezobrazia v histórii prehliadača. Po zavretí všetkých otvorených okien režimu hosťa nezanechajú na počítači žiadne ďalšie stopy, ako napríklad súbory cookie. Všetky stiahnuté súbory však zostanú zachované.</translation>
 <translation id="6395423953133416962">Odosielať <ph name="BEGIN_LINK1" />informácie o systéme<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />metriky<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Prestať hovoriť</translation>
 <translation id="6397592254427394018">Otvoriť všetky záložky v &amp;okne inkognito</translation>
 <translation id="6398715114293939307">Odstrániť Obchod Google Play</translation>
 <translation id="6398765197997659313">Ukončiť zobrazenie na celú obrazovku</translation>
@@ -5020,7 +5014,6 @@
 <translation id="8912793549644936705">Roztiahnuť</translation>
 <translation id="8915370057835397490">Načítavajú sa návrhy</translation>
 <translation id="8916476537757519021">Podrámec inkognito: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synchronizovať do účtu <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Vždy povoliť reklamy na tomto webe</translation>
 <translation id="8925458182817574960">&amp;Nastavenia</translation>
 <translation id="8926389886865778422">Túto otázku už nezobrazovať</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 29c06fb..5c67768 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -437,7 +437,7 @@
     <ph name="BEGIN_BOLD" />omogočanje ali prepoved dostopa do<ph name="END_BOLD" /> nekaterih spletnih mest,
     <ph name="BEGIN_BOLD" />pregled<ph name="END_BOLD" /> spletnih mest, ki jih je obiskal zaščiteni  uporabnik, in
     <ph name="BEGIN_BOLD" />upravljanje<ph name="END_BOLD" /> drugih nastavitev.</translation>
-<translation id="1648528859488547844">Uporaba Wi-Fi-ja ali mobilnih omrežij za določanje lokacije</translation>
+<translation id="1648528859488547844">Uporaba Wi-Fi-ja, Bluetootha in mobilnih omrežij za določanje lokacije</translation>
 <translation id="1648943974594387137">Podatki za prijavo so zastareli</translation>
 <translation id="1650371550981945235">Pokaži možnosti vnosa</translation>
 <translation id="1650709179466243265">Doda www. in .com in odpre naslov</translation>
@@ -883,6 +883,7 @@
 <translation id="2359345697448000899">Razširitve lahko upravljate tako, da v meniju z orodji kliknete »Razširitve«.</translation>
 <translation id="2359808026110333948">Nadaljuj</translation>
 <translation id="236141728043665931">Vedno prepreči dostop do mikrofona</translation>
+<translation id="2365507699358342471">To spletno mesto si ne more ogledati besedila in slik, kopiranih v odložišče.</translation>
 <translation id="2367972762794486313">Pokaži aplikacije</translation>
 <translation id="2371076942591664043">Odpri, ko je &amp;dokončano</translation>
 <translation id="2377319039870049694">Preklop na pogled seznama</translation>
@@ -1235,7 +1236,7 @@
 <translation id="2871813825302180988">Ta račun se že uporablja v tej napravi.</translation>
 <translation id="2872353916818027657">Zamenjava primarnega monitorja</translation>
 <translation id="287286579981869940">Dodajanje <ph name="PROVIDER_NAME" /> ...</translation>
-<translation id="2874343608108773609">Če želite dostopati do gesel v vseh napravah, se prijavite v Chrome.</translation>
+<translation id="2874343608108773609">Če želite dostopati do nastavitev v vseh napravah, se prijavite v Chrome.</translation>
 <translation id="2875698561019555027">(Chromove strani z napakami)</translation>
 <translation id="288042212351694283">Dostop do naprav z univerzalnim drugim dejavnikom</translation>
 <translation id="2881966438216424900">Zadnji dostop:</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">S pritiskom tabulatorke na spletni strani označite povezavo in tudi polja obrazcev</translation>
 <translation id="2916745397441987255">Iskanje razširitev</translation>
 <translation id="2921081876747860777">Ustvarite geslo za zaščito lokalnih podatkov.</translation>
-<translation id="2924395203970765374">Sinhronizirano s profilom <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Preglednice</translation>
 <translation id="2927017729816812676">Shramba predpomnilnika</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Račun za otroke)</translation>
@@ -1553,7 +1553,6 @@
 <translation id="3348459612390503954">Čestitamo</translation>
 <translation id="3349933790966648062">Količina uporabljenega pomnilnika</translation>
 <translation id="3353984535370177728">Izberite mapo za prenos</translation>
-<translation id="335581015389089642">Speech</translation>
 <translation id="3355936511340229503">Napaka povezave</translation>
 <translation id="3356797067524893661">Pripravljeni ste za nadaljevanje v Hangouts Meet</translation>
 <translation id="3358935496594837302">Vašega telefona ni mogoče najti. Uporabljati morate združljiv telefon Android, ki je vklopljen in pri roki. &lt;a&gt;Več o tem&lt;/a&gt;</translation>
@@ -1730,7 +1729,6 @@
 <translation id="3613422051106148727">&amp;Odpri na novem zavihku</translation>
 <translation id="3616113530831147358">Zvok</translation>
 <translation id="3616741288025931835">&amp;Izbriši podatke brskanja ...</translation>
-<translation id="3618849550573277856">Poišči »<ph name="LOOKUP_STRING" />«</translation>
 <translation id="3620292326130836921">Vse je varnostno kopirano!</translation>
 <translation id="3623574769078102674">Tega zaščitenega uporabnika bo upravljal <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Posnetki zaslona so onemogočeni</translation>
@@ -2145,7 +2143,6 @@
 <translation id="428565720843367874">Protivirusna programska oprema je pri pregledu datoteke nepričakovano odpovedala.</translation>
 <translation id="428608937826130504">Element na polici 8</translation>
 <translation id="4287502004382794929">Nimate dovolj licenc za programsko opremo za včlanitev te naprave. Obrnite se na prodajni oddelek za nakup dodatnih. Če menite, da ste to sporočilo prejeli pomotoma, se obrnite na podporo.</translation>
-<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4289540628985791613">Pregled</translation>
 <translation id="4296575653627536209">Dodajanje zaščitenega uporabnika</translation>
 <translation id="4297322094678649474">Spreminjanje jezikov</translation>
@@ -2406,6 +2403,7 @@
 <translation id="4748762018725435655">Zahteva razširitev iz Spletne trgovine Chrome</translation>
 <translation id="4750394297954878236">Predlogi</translation>
 <translation id="475088594373173692">Prvi uporabnik</translation>
+<translation id="4751476147751820511">Tipala za gibanje in svetlobo</translation>
 <translation id="4756378406049221019">Ustavi/znova naloži</translation>
 <translation id="4756388243121344051">&amp;Zgodovina</translation>
 <translation id="4759238208242260848">Prenosi</translation>
@@ -2440,7 +2438,6 @@
 <translation id="4813512666221746211">Napaka v omrežju</translation>
 <translation id="4816492930507672669">Prilagodi strani</translation>
 <translation id="4820334425169212497">Ne, ne vidim je</translation>
-<translation id="4821725298388681253">To je zgodnja izdaja. Nekatere funkcije, kot sta iskanje in vnos besedila, morda še niso na voljo.</translation>
 <translation id="4821935166599369261">&amp;Profiliranje je omogočeno</translation>
 <translation id="4823484602432206655">Branje in spreminjanje nastavitev funkcij za ljudi s posebnimi potrebami</translation>
 <translation id="4823651846660089135">Naprava je samo za branje</translation>
@@ -3298,7 +3295,7 @@
 <translation id="6136285399872347291">vračalka</translation>
 <translation id="6137767437444130246">Uporabniško potrdilo</translation>
 <translation id="6138680304137685902">Podpis X9.62 ECDSA z algoritmom SHA-384</translation>
-<translation id="6141988275892716286">Potrditev prenosa</translation>
+<translation id="6141988275892716286">Potrdi prenos</translation>
 <translation id="6143186082490678276">Poiščite pomoč</translation>
 <translation id="6144938890088808325">Pomagajte nam izboljšati Chromebooke</translation>
 <translation id="6146563240635539929">Videoposnetki</translation>
@@ -3452,7 +3449,6 @@
 <translation id="6388771388956873507">Poiščite tipalo prstnih odtisov na napravi in se ga dotaknite s prstom</translation>
 <translation id="6390799748543157332">Strani, ki si jih ogledujete v tem oknu, ne bodo prikazane v zgodovini brskalnika in v računalniku ne bodo pustile drugih sledi, na primer piškotkov, ko boste zaprli vsa odprta okna gostujočih sej. Datoteke, ki jih prenesete, se bodo ohranile.</translation>
 <translation id="6395423953133416962">Pošlji <ph name="BEGIN_LINK1" />podatke o sistemu<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />meritve<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6397592254427394018">Vse zaznamke odpri v &amp;oknu brez beleženja zgodovine</translation>
 <translation id="6398715114293939307">Odstranitev Trgovine Google Play</translation>
 <translation id="6398765197997659313">Izhod iz celozaslonskega načina</translation>
@@ -3479,7 +3475,7 @@
 <translation id="642282551015776456">Tega imena ne morete uporabiti kot ime za datoteko ali mapo</translation>
 <translation id="6423239382391657905">OpenVPN</translation>
 <translation id="6426200009596957090">Odpri nastavitve ChromeVoxa</translation>
-<translation id="6429384232893414837">Napaka posodobitve</translation>
+<translation id="6429384232893414837">Napaka glede posodobitve</translation>
 <translation id="6430814529589430811">Base64 kodiran ASCII, enojno potrdilo</translation>
 <translation id="6431217872648827691">Vsi podatki so bili šifrirani z vašim geslom za Google od <ph name="TIME" />.</translation>
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> nastavi samodejne posodobitve za vse uporabnike tega računalnika.</translation>
@@ -3601,7 +3597,7 @@
 <translation id="6613452264606394692">Hitro se vrnite na to stran tako, da jo dodate med zaznamke</translation>
 <translation id="6615455863669487791">Pokaži mi</translation>
 <translation id="661719348160586794">Shranjena gesla bodo prikazana tukaj.</translation>
-<translation id="6618097958368085618">Vseeno ohrani</translation>
+<translation id="6618097958368085618">Vseeno obdrži</translation>
 <translation id="6619058681307408113">Line Printer Daemon (LPD)</translation>
 <translation id="6619801788773578757">Dodaj aplikacijo za kiosk</translation>
 <translation id="6619990499523117484">Potrdite kodo PIN</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">Napačno uporabniško ime/geslo ali preverjanje pristnosti EAP ni uspelo</translation>
 <translation id="729761647156315797">Izbira jezika in tipkovnice</translation>
 <translation id="7299337219131431707">Omogoči brskanje za goste</translation>
+<translation id="7303900363563182677">Temu spletnemu mestu je preprečen ogled besedila in slik, shranjenih v odložišče</translation>
 <translation id="730515362922783851">Izmenjava podatkov s poljubno napravo v lokalnem omrežju ali internetu</translation>
 <translation id="7308002049209013926">Zaganjalnik omogoča hiter dostop do novih aplikacij in dejavnosti. Če želite dostopati s tipkovnico, pritisnite Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Pokaži &amp;kontrolnike</translation>
@@ -4405,6 +4402,7 @@
 <translation id="7909969815743704077">Preneseno v načinu brez beleženja zgodovine</translation>
 <translation id="7910768399700579500">&amp;Nova mapa</translation>
 <translation id="7912080627461681647">Geslo je bilo spremenjeno v strežniku. Odjavite se in se nato znova prijavite.</translation>
+<translation id="7912883689016444961">Konfiguriraj mobilno omrežje</translation>
 <translation id="7915471803647590281">Povejte nam, kaj se dogaja, preden nam pošljete povratne informacije.</translation>
 <translation id="7925247922861151263">Preverjanje AAA ni uspelo</translation>
 <translation id="7925285046818567682">Čakam <ph name="HOST_NAME" /> ...</translation>
@@ -4799,7 +4797,7 @@
 <translation id="8569682776816196752">Najti ni bilo mogoče nobenega cilja</translation>
 <translation id="8569764466147087991">Izberite datoteko, ki jo želite odpreti</translation>
 <translation id="8571213806525832805">Zadnji 4 tedni</translation>
-<translation id="8571613743082299268">Preusmeritev na spletno mesto je blokirana</translation>
+<translation id="8571613743082299268">Blokirana je preusmeritev na spletno mesto</translation>
 <translation id="8574990355410201600">Vedno dovoli zvok na spletnem mestu <ph name="HOST" /></translation>
 <translation id="8578639784464423491">Ne sme presegati 99 črk</translation>
 <translation id="8579285237314169903">Sinhroniziranje datotek (<ph name="NUMBER_OF_FILES" />) ...</translation>
@@ -4916,6 +4914,7 @@
 <translation id="8736288397686080465">To spletno mesto je bilo posodobljeno v ozadju.</translation>
 <translation id="8737685506611670901">Odpiranje povezav za <ph name="PROTOCOL" /> namesto <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Slika v sliki</translation>
 <translation id="8743864605301774756">Posodobljeno pred 1 uro</translation>
 <translation id="8749863574775030885">Dostop do naprav USB neznanega prodajalca</translation>
 <translation id="8754200782896249056">&lt;p&gt;Ko se <ph name="PRODUCT_NAME" /> izvaja v podprtem namiznem okolju, se uporabijo sistemske nastavitve strežnika proxy. Morda vaš sistem ni podprt ali pa je med zagonom sistemske konfiguracije prišlo do težave.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Raztegni</translation>
 <translation id="8915370057835397490">Nalaganje predloga</translation>
 <translation id="8916476537757519021">Podokvir za način brez beleženja zgodovine: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sinhroniziraj z računom <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Vedno dovoli oglase na tem spletnem mestu</translation>
 <translation id="8925458182817574960">&amp;Nastavitve</translation>
 <translation id="8926389886865778422">Ne sprašuj več</translation>
@@ -5199,7 +5197,7 @@
 <translation id="932327136139879170">Domov</translation>
 <translation id="932508678520956232">Tiskanja ni bilo mogoče začeti.</translation>
 <translation id="93393615658292258">Samo geslo</translation>
-<translation id="934503638756687833">Elementi, ki niso navedeni tukaj, bodo po potrebi tudi odstranjeni. Preberite več o &lt;a href="<ph name="URL" />"&gt;zaščiti pred neželeno programsko opremo&lt;/a&gt; v beli knjigi o zasebnosti za Chrome.</translation>
+<translation id="934503638756687833">Elementi, ki niso navedeni tukaj, bodo po potrebi morda tudi odstranjeni. Preberite več o &lt;a href="<ph name="URL" />"&gt;zaščiti pred neželeno programsko opremo&lt;/a&gt; v beli knjigi o zasebnosti za Chrome.</translation>
 <translation id="935490618240037774">Vaši zaznamki, zgodovina, gesla in druge nastavitve bodo sinhronizirani z Google Računom, tako da jih boste lahko uporabljali v vseh svojih napravah.</translation>
 <translation id="936801553271523408">Sistemski diagnostični podatki</translation>
 <translation id="93766956588638423">Popravi razširitev</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index e990abb..1e877c7 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -460,7 +460,7 @@
 <translation id="1688935057616748272">Унесите неко слово</translation>
 <translation id="168991973552362966">Додајте штампач у близини</translation>
 <translation id="1689945336726856614">Копирај &amp;URL</translation>
-<translation id="1692115862433274081">Користите други налог</translation>
+<translation id="1692115862433274081">Користи други налог</translation>
 <translation id="1692602667007917253">Упс, нешто није у реду</translation>
 <translation id="1692799361700686467">Колачићи са више сајтова су дозвољени.</translation>
 <translation id="169515659049020177">Shift</translation>
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">Управљајте додацима кликом на ставку Додаци у менију Алатке.</translation>
 <translation id="2359808026110333948">Настави</translation>
 <translation id="236141728043665931">Увек блокирај приступ микрофону</translation>
+<translation id="2365507699358342471">Овај сајт може да види текст и слике који су копирани у привремену меморију.</translation>
 <translation id="2367972762794486313">Прикажите апликације</translation>
 <translation id="2371076942591664043">Отвори кад буде &amp;довршено</translation>
 <translation id="2377319039870049694">Пређи на приказ листе</translation>
@@ -917,7 +918,7 @@
 Мислим да овај сајт не треба да буде блокиран!</translation>
 <translation id="2440604414813129000">Прикажи и&amp;звор</translation>
 <translation id="2445081178310039857">Основни директоријум додатка је обавезан.</translation>
-<translation id="2445484935443597917">Направи нови профил</translation>
+<translation id="2445484935443597917">Направи нов профил</translation>
 <translation id="2448312741937722512">Тип</translation>
 <translation id="2450223707519584812">Нећете моћи да додајете кориснике зато што недостају шифре за Google API. Потражите детаље на <ph name="DETAILS_URL" />.</translation>
 <translation id="2450849356604136918">Нема активних приказа</translation>
@@ -1265,7 +1266,6 @@
 <translation id="2916073183900451334">Притиском на Tab на веб страници биће истакнуте везе, као и поља у обрасцу</translation>
 <translation id="2916745397441987255">Претражите додатке</translation>
 <translation id="2921081876747860777">Направите лозинку да бисте заштитили локалне податке.</translation>
-<translation id="2924395203970765374">Синхронизовано са налогом <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Табеле</translation>
 <translation id="2927017729816812676">Меморијски простор кеша</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (налог за децу)</translation>
@@ -1548,7 +1548,6 @@
 <translation id="3348459612390503954">Честитамо</translation>
 <translation id="3349933790966648062">Меморијски простор у употреби</translation>
 <translation id="3353984535370177728">Избор директоријума за отпремање</translation>
-<translation id="335581015389089642">Говор</translation>
 <translation id="3355936511340229503">Грешка при повезивању</translation>
 <translation id="3356797067524893661">Спремни сте да наставите на Hangouts Meet</translation>
 <translation id="3358935496594837302">Не можемо да пронађемо телефон. Проверите да ли користите компатибилни и укључени Android телефон који је у близини. &lt;a&gt;Сазнајте више&lt;/a&gt;</translation>
@@ -1725,7 +1724,6 @@
 <translation id="3613422051106148727">&amp;Отвори на новој картици</translation>
 <translation id="3616113530831147358">Аудио</translation>
 <translation id="3616741288025931835">&amp;Обриши податке прегледања...</translation>
-<translation id="3618849550573277856">Потражи „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="3620292326130836921">Направљене су резервне копије свих датотека!</translation>
 <translation id="3623574769078102674">Овим корисником под надзором ће управљати <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Снимци екрана су онемогућени</translation>
@@ -2140,7 +2138,6 @@
 <translation id="428565720843367874">Дошло је до неочекиване грешке са антивирусним софтвером при скенирању ове датотеке.</translation>
 <translation id="428608937826130504">8. ставка на полици</translation>
 <translation id="4287502004382794929">Немате довољно лиценци за софтвер да бисте регистровали овај уређај. Контактирајте сектор продаје да бисте купили још лиценци. Ако сматрате да се ова порука приказује грешком, контактирајте подршку.</translation>
-<translation id="4289300219472526559">Почните да говорите</translation>
 <translation id="4289540628985791613">Преглед</translation>
 <translation id="4296575653627536209">Додај корисника под надзором</translation>
 <translation id="4297322094678649474">Промените језике</translation>
@@ -2401,6 +2398,7 @@
 <translation id="4748762018725435655">Захтева додатак из Chrome веб-продавнице</translation>
 <translation id="4750394297954878236">Предлози</translation>
 <translation id="475088594373173692">Први корисник</translation>
+<translation id="4751476147751820511">Сензори за покрет или светло</translation>
 <translation id="4756378406049221019">Заустави/поново учитај</translation>
 <translation id="4756388243121344051">&amp;Историја</translation>
 <translation id="4759238208242260848">Преузимања</translation>
@@ -2435,7 +2433,6 @@
 <translation id="4813512666221746211">Грешка на мрежи</translation>
 <translation id="4816492930507672669">Уклопи у страницу</translation>
 <translation id="4820334425169212497">Не, не видим га</translation>
-<translation id="4821725298388681253">Ово је прелиминарна верзија. Неке функције, попут претраге и уноса текста, још нису доступне.</translation>
 <translation id="4821935166599369261">&amp;Профилисање је омогућено</translation>
 <translation id="4823484602432206655">Читање и мењање подешавања корисника и уређаја</translation>
 <translation id="4823651846660089135">Уређај је само за читање</translation>
@@ -2819,7 +2816,7 @@
 <translation id="5398772614898833570">Огласи су блокирани</translation>
 <translation id="5402815541704507626">Преузмите ажурирање помоћу мобилних података</translation>
 <translation id="540296380408672091">Увек блокирај колачиће на <ph name="HOST" /></translation>
-<translation id="5405146885510277940">Ресетуј подешавања</translation>
+<translation id="5405146885510277940">Ресетујте подешавања</translation>
 <translation id="5408750356094797285">Зумирајте: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">Изненади ме</translation>
 <translation id="5411472733320185105">Не користи подешавања проксија за ове хостове и домене:</translation>
@@ -3402,7 +3399,7 @@
 <translation id="6307990684951724544">Систем је заузет</translation>
 <translation id="6308937455967653460">Сачувај ве&amp;зу као...</translation>
 <translation id="6311220991371174222">Не можемо да покренемо Chrome јер је дошло до проблема при отварању профила. Пробајте поново да покренете Chrome.</translation>
-<translation id="6312400084708441752">Садржи информације о штетном софтверу, системским подешавањима и процесима на рачунару</translation>
+<translation id="6312400084708441752">Садрже информације о штетном софтверу, системским подешавањима и процесима на рачунару</translation>
 <translation id="6312403991423642364">Непозната грешка на мрежи</translation>
 <translation id="6313641880021325787">ИЗАЂИ ИЗ ВР-А</translation>
 <translation id="6314819609899340042">Омогућили сте функције за отклањање грешака на овом <ph name="IDS_SHORT_PRODUCT_NAME" /> уређају.</translation>
@@ -3448,7 +3445,6 @@
 <translation id="6388771388956873507">Пронађите сензор за отисак прста на уређају и додирните га прстом</translation>
 <translation id="6390799748543157332">Странице које видите у овом прозору се неће појављивати у историји прегледача и неће остављати друге трагове, попут колачића, на рачунару када затворите све отворене прозоре режима госта. Међутим, све датотеке које преузмете ће бити сачуване.</translation>
 <translation id="6395423953133416962">Шаљи <ph name="BEGIN_LINK1" />информације<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />показатеље<ph name="END_LINK2" /> о систему</translation>
-<translation id="6397363302884558537">Престаните да говорите</translation>
 <translation id="6397592254427394018">Отвори све обележиваче у &amp;прозору без архивирања</translation>
 <translation id="6398715114293939307">Уклоните Google Play продавницу</translation>
 <translation id="6398765197997659313">Изађи из режима целог екрана</translation>
@@ -4006,7 +4002,7 @@
 <translation id="7279701417129455881">Управљај блокирањем колачића...</translation>
 <translation id="7280041992884344566">Дошло је до грешке док је Chrome тражио штетан софтвер</translation>
 <translation id="7280877790564589615">Тражи се дозвола</translation>
-<translation id="7282992757463864530">Трака са информацијама</translation>
+<translation id="7282992757463864530">Infobar</translation>
 <translation id="7283041136720745563">Квота за Google диск није довољно велика.</translation>
 <translation id="7287143125007575591">Приступ је одбијен.</translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />×<ph name="VERTICAL_DPI" /> dpi</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">Корисничко име/лозинка је нетачна или EAP потврда аутентичности није успела</translation>
 <translation id="729761647156315797">Изаберите језик и тастатуру</translation>
 <translation id="7299337219131431707">Омогући режим госта</translation>
+<translation id="7303900363563182677">Овом сајту је блокиран увид у текст и слике који су копирани у привремену меморију</translation>
 <translation id="730515362922783851">Размена података са било којим уређајем на локалној мрежи или интернету</translation>
 <translation id="7308002049209013926">Користите Покретач да бисте брзо приступали новим апликацијама и активностима. Да бисте дошли овде помоћу тастатуре, притисните Alt + Shift + L.</translation>
 <translation id="7309257895202129721">Прикажи &amp;контроле</translation>
@@ -4395,6 +4392,7 @@
 <translation id="7909969815743704077">Преузето је у режиму без архивирања</translation>
 <translation id="7910768399700579500">&amp;Нови директоријум</translation>
 <translation id="7912080627461681647">Лозинка је промењена на серверу. Одјавите се, па се поново пријавите.</translation>
+<translation id="7912883689016444961">Кофигуриши мобилну мрежу</translation>
 <translation id="7915471803647590281">Реците нам шта се дешава пре него што пошаљете повратне информације.</translation>
 <translation id="7925247922861151263">Провера потврде идентитета, овлашћења и приступа није успела</translation>
 <translation id="7925285046818567682">Чека се <ph name="HOST_NAME" />...</translation>
@@ -4789,7 +4787,7 @@
 <translation id="8569682776816196752">Нема пронађених одредишта</translation>
 <translation id="8569764466147087991">Избор датотеке за отварање</translation>
 <translation id="8571213806525832805">Последње 4 недеље</translation>
-<translation id="8571613743082299268">Блокирано је преусмеравање на сајт</translation>
+<translation id="8571613743082299268">Блокирано је преусмеравање на овај сајт</translation>
 <translation id="8574990355410201600">Увек дозволи звук на <ph name="HOST" /></translation>
 <translation id="8578639784464423491">Дозвољено је највише 99 знакова</translation>
 <translation id="8579285237314169903">Синхронизују се ставке (<ph name="NUMBER_OF_FILES" />)...</translation>
@@ -4906,6 +4904,7 @@
 <translation id="8736288397686080465">Овај сајт је ажуриран у позадини.</translation>
 <translation id="8737685506611670901">отвори линкове за <ph name="PROTOCOL" /> уместо <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Слика у слици</translation>
 <translation id="8743864605301774756">Ажурирано пре 1 сата</translation>
 <translation id="8749863574775030885">Приступ USB уређајима непознатог продавца</translation>
 <translation id="8754200782896249056">&lt;p&gt;Када користите <ph name="PRODUCT_NAME" /> у подржаном рачунарском окружењу, користиће се подешавања проксија система. Међутим, или систем није подржан или је дошло до проблема при покретању конфигурације система.&lt;/p&gt;
@@ -5008,7 +5007,6 @@
 <translation id="8912793549644936705">Растегни</translation>
 <translation id="8915370057835397490">Учитавање предлога</translation>
 <translation id="8916476537757519021">Подоквир Без архивирања: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Синхронизујте са налогом <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Увек дозвољавај огласе на овом сајту</translation>
 <translation id="8925458182817574960">&amp;Подешавања</translation>
 <translation id="8926389886865778422">Не питај ме поново</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 676c6b8..2043d80 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -881,6 +881,7 @@
 <translation id="2359345697448000899">Hantera tillägg genom att klicka på Tillägg på menyn Verktyg.</translation>
 <translation id="2359808026110333948">Fortsätt</translation>
 <translation id="236141728043665931">Blockera alltid mikrofonåtkomsten</translation>
+<translation id="2365507699358342471">Den här webbplatsen får tillgång till text och bilder som kopierats till Urklipp.</translation>
 <translation id="2367972762794486313">Visa appar</translation>
 <translation id="2371076942591664043">Öppna när nedladdning är &amp;klar</translation>
 <translation id="2377319039870049694">Byt till listvy</translation>
@@ -1027,7 +1028,7 @@
 <translation id="2603115962224169880">Rensa upp på datorn</translation>
 <translation id="2603463522847370204">Öppna i &amp;inkognitofönster</translation>
 <translation id="2604255671529671813">Fel vid nätverksanslutning</translation>
-<translation id="2606246518223360146">Länka data</translation>
+<translation id="2606246518223360146">Länka Data</translation>
 <translation id="2607101320794533334">Information om mottagarens publika nyckel</translation>
 <translation id="2607459012323956820">Den som hanterar användaren kan fortfarande se vilka webbplatser som har besökts och användarens inställningar på <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />.</translation>
 <translation id="2608770217409477136">Använd standardinställningar</translation>
@@ -1147,7 +1148,7 @@
 <translation id="2762441749940182211">Kamera är blockerad</translation>
 <translation id="2765217105034171413">Liten</translation>
 <translation id="2766006623206032690">Kl&amp;istra in och öppna</translation>
-<translation id="2767084307624729667">Lösenord har sparats för <ph name="ORIGIN" /></translation>
+<translation id="2767084307624729667">Sparade lösenord för <ph name="ORIGIN" /></translation>
 <translation id="276969039800130567">Inloggad som <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="2770465223704140727">Ta bort från listan</translation>
 <translation id="2770690685823456775">Exportera lösenorden till en annan mapp</translation>
@@ -1268,7 +1269,6 @@
 <translation id="2916073183900451334">Om du trycker på Tabb på en webbsida markeras länkar och formulärfält</translation>
 <translation id="2916745397441987255">Sök efter tillägg</translation>
 <translation id="2921081876747860777">Skapa ett lösenord för att skydda lokal data</translation>
-<translation id="2924395203970765374">Synkroniseras med <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Kalkylark</translation>
 <translation id="2927017729816812676">Cachelagring</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (barnkonto)</translation>
@@ -1551,7 +1551,6 @@
 <translation id="3348459612390503954">Grattis</translation>
 <translation id="3349933790966648062">Minnesanvändning</translation>
 <translation id="3353984535370177728">Välj en mapp för uppladdning</translation>
-<translation id="335581015389089642">Tal</translation>
 <translation id="3355936511340229503">Anslutningsfel</translation>
 <translation id="3356797067524893661">Klart att fortsätta med Hangouts Meet</translation>
 <translation id="3358935496594837302">Mobilen hittades inte. Använd en kompatibel Android-mobil som är på och finns till hands. &lt;a&gt;Läs mer&lt;/a&gt;</translation>
@@ -1728,7 +1727,6 @@
 <translation id="3613422051106148727">&amp;Öppna i ny flik</translation>
 <translation id="3616113530831147358">Ljud</translation>
 <translation id="3616741288025931835">&amp;Rensa webbinformation...</translation>
-<translation id="3618849550573277856">Sök efter ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Allt har säkerhetskopierats!</translation>
 <translation id="3623574769078102674">Denna kontrollerade användare kommer att hanteras av <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Skärmdumpar har inaktiverats</translation>
@@ -1840,7 +1838,7 @@
 <translation id="378312418865624974">Läsa en unik identifierare för den här datorn</translation>
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">Visa genväg för appar</translation>
-<translation id="3785727820640310185">Lösenord har sparats för den här webbplatsen</translation>
+<translation id="3785727820640310185">Sparade lösenord för den här webbplatsen</translation>
 <translation id="3785852283863272759">Skicka sidadress i e-post</translation>
 <translation id="3786301125658655746">Du är offline</translation>
 <translation id="3788401245189148511">Appen eller tillägget skulle kunna:</translation>
@@ -2143,7 +2141,6 @@
 <translation id="428565720843367874">Ett oväntat fel uppstod i antivirusprogrammet när filen skulle genomsökas.</translation>
 <translation id="428608937826130504">Hyllobjekt 8</translation>
 <translation id="4287502004382794929">Du har inte tillräckligt med licenser för att registrera enheten. Kontakta säljavdelningen om du vill köpa fler. Om du anser att detta meddelande visas på felaktig grund kontaktar du supporten.</translation>
-<translation id="4289300219472526559">Börja tala</translation>
 <translation id="4289540628985791613">Översikt</translation>
 <translation id="4296575653627536209">Lägg till kontrollerad användare</translation>
 <translation id="4297322094678649474">Ändra språk</translation>
@@ -2404,6 +2401,7 @@
 <translation id="4748762018725435655">Ett tillägg från Chrome Web Store krävs</translation>
 <translation id="4750394297954878236">Förslag</translation>
 <translation id="475088594373173692">Första användare</translation>
+<translation id="4751476147751820511">Rörelse- eller ljussensorer</translation>
 <translation id="4756378406049221019">Stoppa inläsningen/läs in igen</translation>
 <translation id="4756388243121344051">&amp;Historik</translation>
 <translation id="4759238208242260848">Nedladdningar</translation>
@@ -2438,7 +2436,6 @@
 <translation id="4813512666221746211">Nätverksfel</translation>
 <translation id="4816492930507672669">Anpassa till sida</translation>
 <translation id="4820334425169212497">Nej, jag ser den inte</translation>
-<translation id="4821725298388681253">Det här är en tidig version. Vissa funktioner, till exempel sökning och textinmatning, är inte tillgängliga än.</translation>
 <translation id="4821935166599369261">&amp;Profilering aktiverad</translation>
 <translation id="4823484602432206655">Läsa och ändra användarinställningar och enhetsinställningar</translation>
 <translation id="4823651846660089135">Enheten är skrivskyddad</translation>
@@ -2948,7 +2945,7 @@
 <translation id="558170650521898289">Microsofts Verifiera Windows-maskinvarudrivrutin</translation>
 <translation id="5582839680698949063">Huvudmeny</translation>
 <translation id="5583640892426849032">Backsteg</translation>
-<translation id="5583726250980167172">Lösenord har sparats för den här webbplatsen</translation>
+<translation id="5583726250980167172">Sparade lösenord för den här webbplatsen</translation>
 <translation id="5585118885427931890">Det gick inte att skapa bokmärkesmappen.</translation>
 <translation id="558563010977877295">Öppna en viss sida eller en grupp med sidor</translation>
 <translation id="5585912436068747822">Formateringen misslyckades</translation>
@@ -3449,7 +3446,6 @@
 <translation id="6388771388956873507">Sätt fingret på enhetens fingeravtryckssensor</translation>
 <translation id="6390799748543157332">Sidorna du visar i den här fliken visas inte i webbläsarhistoriken och lämnar inga andra spår, till exempel cookies, på datorn när du har stängt alla öppna gästfönster. Filer som du laddar ned kommer dock att sparas.</translation>
 <translation id="6395423953133416962">Skicka <ph name="BEGIN_LINK1" />systeminformation<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />statistik<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Sluta tala</translation>
 <translation id="6397592254427394018">Öppna alla bokmärken i ett &amp;inkognitofönster</translation>
 <translation id="6398715114293939307">Ta bort Google Play Butik</translation>
 <translation id="6398765197997659313">Avsluta helskärmsläge</translation>
@@ -3476,7 +3472,7 @@
 <translation id="642282551015776456">Det här namnet får inte användas som namn på en fil eller mapp</translation>
 <translation id="6423239382391657905">Öppen VPN</translation>
 <translation id="6426200009596957090">Öppna ChromeVox-inställningarna</translation>
-<translation id="6429384232893414837">Fel vid uppdatering</translation>
+<translation id="6429384232893414837">Uppdateringsfel</translation>
 <translation id="6430814529589430811">Base64-kodad ASCII, enstaka certifikat</translation>
 <translation id="6431217872648827691">Alla data krypterades med ditt Google-lösenord den
         <ph name="TIME" /></translation>
@@ -4022,6 +4018,7 @@
 <translation id="7297443947353982503">Användarnamnet eller lösenordet är felaktigt, eller så misslyckades EAP-auktoriseringen</translation>
 <translation id="729761647156315797">Välj språk och tangentbord</translation>
 <translation id="7299337219131431707">Aktivera gästsurfning</translation>
+<translation id="7303900363563182677">Tillgången till text och bilder som kopierats till Urklipp har blockerats för den här webbplatsen.</translation>
 <translation id="730515362922783851">Utväxla data med enheter i det lokala nätverket eller via internet</translation>
 <translation id="7308002049209013926">Öppna nya appar och aktiviteter snabbt med översikten. Tryck på Alt + Skift + L om du vill öppna översikten.</translation>
 <translation id="7309257895202129721">Visa &amp;kontroller</translation>
@@ -4402,6 +4399,7 @@
 <translation id="7909969815743704077">Laddades ned i inkognitoläge</translation>
 <translation id="7910768399700579500">&amp;Ny mapp</translation>
 <translation id="7912080627461681647">Lösenordet har ändrats på servern. Logga ut och logga sedan in igen.</translation>
+<translation id="7912883689016444961">Konfigurera mobilnätverk</translation>
 <translation id="7915471803647590281">Berätta för oss vad som händer innan du skickar feedback.</translation>
 <translation id="7925247922861151263">Kontroll med AAA misslyckades</translation>
 <translation id="7925285046818567682">Väntar på <ph name="HOST_NAME" />...</translation>
@@ -4744,7 +4742,7 @@
 <translation id="8465444703385715657">Du måste godkänna att <ph name="PLUGIN_NAME" /> körs</translation>
 <translation id="8466234950814670489">Tar-arkiv</translation>
 <translation id="8468750959626135884">Lås upp <ph name="DEVICE_TYPE" /> med Android-mobilen.</translation>
-<translation id="8470513973197838199">Lösenord har sparats för <ph name="ORIGIN" /></translation>
+<translation id="8470513973197838199">Sparade lösenord för <ph name="ORIGIN" /></translation>
 <translation id="8472623782143987204">maskinvarustödd</translation>
 <translation id="8475313423285172237">Ett annat program i datorn har lagt till ett tillägg som kan ändra hur Chrome fungerar.</translation>
 <translation id="8475647382427415476">Det gick inte att synkronisera <ph name="FILENAME" /> med Google Drive just nu. Ett nytt försök görs senare.</translation>
@@ -4913,6 +4911,7 @@
 <translation id="8736288397686080465">Den här webbplatsen har uppdaterats i bakgrunden.</translation>
 <translation id="8737685506611670901">Öppna <ph name="PROTOCOL" />-länkar i stället för <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Bild i bild</translation>
 <translation id="8743864605301774756">Uppdaterad för en timme sedan</translation>
 <translation id="8749863574775030885">Komma åt USB-enheter från en okänd leverantör</translation>
 <translation id="8754200782896249056">&lt;p&gt;När <ph name="PRODUCT_NAME" /> körs i en skrivbordsmiljö som stöds används datorns proxyinställningar. Det kan hända att din dator inte stöds eller att det uppstod ett problem vid start av systemkonfigurationen.&lt;/p&gt;
@@ -5015,7 +5014,6 @@
 <translation id="8912793549644936705">Förläng</translation>
 <translation id="8915370057835397490">Läser in förslag</translation>
 <translation id="8916476537757519021">Underram i inkognitoläge: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Synkronisera till <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Tillåt alltid annonser på den här webbplatsen</translation>
 <translation id="8925458182817574960">&amp;Inställningar</translation>
 <translation id="8926389886865778422">Fråga inte igen.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index b37bc36..46c8278 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -114,7 +114,7 @@
 <translation id="1164899421101904659">Weka Ufunguo wa Kufungua PIN</translation>
 <translation id="1165039591588034296">Hitilafu</translation>
 <translation id="1166212789817575481">Funga Vichupo vilivyo Upande wa Kulia</translation>
-<translation id="1168020859489941584">Inafungua katika <ph name="TIME_REMAINING" />...</translation>
+<translation id="1168020859489941584">Inafungua baada ya <ph name="TIME_REMAINING" />...</translation>
 <translation id="1168100932582989117">Seva za jina la Google</translation>
 <translation id="1171135284592304528">Angazia kipengee kilicholengwa kwa kibodi kinapobadilika</translation>
 <translation id="1173894706177603556">Ipe jina jipya</translation>
@@ -1267,7 +1267,6 @@
 <translation id="2916073183900451334">Kichupo cha Kubonyeza kwenye ukurasa wavuti kinaangazia viungo, pamoja na nyuga za fomu</translation>
 <translation id="2916745397441987255">Tafuta katika viendelezi</translation>
 <translation id="2921081876747860777">Tafadhali unda nenosiri la kulinda data yako kwenye kifaa.</translation>
-<translation id="2924395203970765374">Imesawazishwa kwenye <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Majedwali</translation>
 <translation id="2927017729816812676">Hifadhi ya Akiba</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Akaunti ya watoto)</translation>
@@ -1547,7 +1546,6 @@
 <translation id="3348459612390503954">Hongera</translation>
 <translation id="3349933790966648062">Kiasi cha Hifadhi Iliyotumiwa na Programu</translation>
 <translation id="3353984535370177728">Chagua folda ya kupakia</translation>
-<translation id="335581015389089642">Usemi</translation>
 <translation id="3355936511340229503">Hitilafu ya muunganisho</translation>
 <translation id="3356797067524893661">Uko tayari kwenda kwenye Hangouts Meet</translation>
 <translation id="3358935496594837302">Imeshindwa kupata simu yako. Hakikisha kuwa unatumia simu ya Android inayooana, ambayo imewashwa na unayoweza kufikia. &lt;a&gt;Pata maelezo zaidi&lt;/a&gt;</translation>
@@ -1724,7 +1722,6 @@
 <translation id="3613422051106148727">&amp;Fungua katika kichupo kipya</translation>
 <translation id="3616113530831147358">Sauti</translation>
 <translation id="3616741288025931835">&amp;Futa Data ya Kuvinjari</translation>
-<translation id="3618849550573277856">Angalia “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Zote zimehifadhiwa nakala!</translation>
 <translation id="3623574769078102674">Mtumiaji huyu anayesimamiwa atadhibitiwa na <ph name="MANAGER_EMAIL" /> .</translation>
 <translation id="3625258641415618104">Picha za skrini zimezimwa</translation>
@@ -2137,7 +2134,6 @@
 <translation id="428565720843367874">Programu ya kinga virusi ilishindwa bila kutarajiwa wakati wa kutambaza faili hii.</translation>
 <translation id="428608937826130504">Kipengee cha kabati cha 8</translation>
 <translation id="4287502004382794929">Huna leseni za kutosha za programu ili kusajili kifaa hiki. Tafadhali wasilina na wauzaji ili kununua zaidi. Ikiwa unaamini unaona ujumbe huu kama hitilafu, tafadhali wasiliana na msaada kwa wateja.</translation>
-<translation id="4289300219472526559">Anza Kuzungumza</translation>
 <translation id="4289540628985791613">Muhtasari</translation>
 <translation id="4296575653627536209">Ongeza Mtumiaji Anayesimamiwa</translation>
 <translation id="4297322094678649474">Badilisha Lugha</translation>
@@ -2433,7 +2429,6 @@
 <translation id="4813512666221746211">Hitilafu ya mtandao</translation>
 <translation id="4816492930507672669">Sawazisha kwenye ukurasa</translation>
 <translation id="4820334425169212497">Hapana, Siioni</translation>
-<translation id="4821725298388681253">Toleo hili ni la awali. Baadhi ya vipengele kama vile utafutaji na uandikaji havipatikani.</translation>
 <translation id="4821935166599369261">&amp;Uwekaji Wasifu Umewezeshwa</translation>
 <translation id="4823484602432206655">Soma na ubadilishe mipangilio ya mtumiaji na kifaa</translation>
 <translation id="4823651846660089135">Kifaa ni cha kusoma tu</translation>
@@ -3444,7 +3439,6 @@
 <translation id="6388771388956873507">Pata kitambua alama ya kidole kwenye kifaa chako na ukiguse kwa kidole chako</translation>
 <translation id="6390799748543157332">Kurasa unazoangalia katika dirisha hili hazitaonekana katika historia ya kivinjari na hazitaacha alama nyingine, kama vile vidakuzi, kwenye kompyuta baada ya wewe kufunga madirisha yote Geni yaliyo wazi. Hata hivyo, faili zozote unazopakua zitahifadhiwa.</translation>
 <translation id="6395423953133416962">Tuma <ph name="BEGIN_LINK1" />maelezo ya mfumo<ph name="END_LINK1" /> na <ph name="BEGIN_LINK2" />hesabu<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Koma Kuongea</translation>
 <translation id="6397592254427394018">Fungua alamisho zote katika dirisha fiche</translation>
 <translation id="6398715114293939307">Ondoa Duka la Google Play</translation>
 <translation id="6398765197997659313">Ondoka kwenye Skrini nzima</translation>
@@ -5016,7 +5010,6 @@
 <translation id="8912793549644936705">Panua</translation>
 <translation id="8915370057835397490">Inapakia pendekezo</translation>
 <translation id="8916476537757519021">Fremu ndogo ya Hali Fiche: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Sawazisha katika <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Ruhusu matangazo kwenye tovuti hii wakati wote</translation>
 <translation id="8925458182817574960">&amp;Mipangilio</translation>
 <translation id="8926389886865778422">Nisiulizwe tena</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 482df842..c5ea82d5 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">கருவிகள் மெனுவில் நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation>
 <translation id="2359808026110333948">தொடர்க</translation>
 <translation id="236141728043665931">மைக்ரோஃபோன் அணுகலை எப்போதும் தடு</translation>
+<translation id="2365507699358342471">கிளிப்போர்டுக்கு நகலெடுத்த உரையையும் படங்களையும், இந்தத் தளத்தால் பார்க்க முடியும்.</translation>
 <translation id="2367972762794486313">பயன்பாடுகளைக் காட்டு</translation>
 <translation id="2371076942591664043">&amp;முடிந்ததும் திற</translation>
 <translation id="2377319039870049694">பட்டியல் காட்சிக்கு மாறு</translation>
@@ -920,7 +921,7 @@
 இந்தத் தளம் தடைசெய்யப்பட வேண்டும் என நான் நினைக்கவில்லை!</translation>
 <translation id="2440604414813129000">ஆ&amp;தாரத்தைக் காண்பி</translation>
 <translation id="2445081178310039857">நீட்டிப்பு மூல கோப்பகம் தேவை.</translation>
-<translation id="2445484935443597917">புதிய சுயவிவரத்தை உருவாக்கு</translation>
+<translation id="2445484935443597917">ஒரு புதிய சுயவிவரத்தை உருவாக்கு</translation>
 <translation id="2448312741937722512">வகை</translation>
 <translation id="2450223707519584812">Google API விசைகள் இல்லாததால் உங்களால் பயனர்களைச் சேர்க்க முடியாது. விவரங்களுக்கு <ph name="DETAILS_URL" /> இல் பார்க்கவும்.</translation>
 <translation id="2450849356604136918">செயலிலுள்ள காட்சிகள் எதுவுமில்லை</translation>
@@ -1270,7 +1271,6 @@
 <translation id="2916073183900451334">ஒரு வலைப்பக்கத்தில் Tab விசையை அழுத்துவதால், இணைப்புகளும், படிவப்புலங்களும் தனிப்படுத்தி காண்பிக்கப்படுகின்றன</translation>
 <translation id="2916745397441987255">நீட்டிப்புகளைத் தேடுக</translation>
 <translation id="2921081876747860777">அகத் தரவைப் பாதுகாக்க, கடவுச்சொல்லை உருவாக்கவும்.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> உடன் ஒத்திசைக்கப்பட்டது</translation>
 <translation id="2925966894897775835">தாள்கள்</translation>
 <translation id="2927017729816812676">தற்காலிகச் சேமிப்பிடம்</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (குழந்தைகளுக்கான கணக்குகள்)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">வாழ்த்துகள்</translation>
 <translation id="3349933790966648062">நினைவகப் பயன்பாடு</translation>
 <translation id="3353984535370177728">பதிவேற்ற கோப்புறையைத் தேர்வுசெய்யவும்</translation>
-<translation id="335581015389089642">பேச்சு</translation>
 <translation id="3355936511340229503">இணைப்புப் பிழை</translation>
 <translation id="3356797067524893661">Hangouts Meetஐப் பயன்படுத்துவதற்குத் தேவையான அனைத்தையும் அமைத்துவிட்டீர்கள்</translation>
 <translation id="3358935496594837302">மொபைலைக் கண்டறிய முடியவில்லை. இணங்கும் Android ஃபோனைப் பயன்படுத்துவதையும், அது இயக்கப்பட்டு அருகில் உள்ளதையும் உறுதிப்படுத்திக்கொள்ளவும். &lt;a&gt;மேலும் அறிக&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">புதிய தாவலில் &amp;திற</translation>
 <translation id="3616113530831147358">ஆடியோ</translation>
 <translation id="3616741288025931835">உலாவல் தரவை &amp;சுத்தமாக்கு...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” எனத் தேடு</translation>
 <translation id="3620292326130836921">எல்லாம் காப்புப் பிரதி எடுக்கப்பட்டன!</translation>
 <translation id="3623574769078102674">இந்தக் கண்காணிக்கப்படும் பயனர் <ph name="MANAGER_EMAIL" /> ஆல் நிர்வகிக்கப்படுவார்.</translation>
 <translation id="3625258641415618104">ஸ்கிரீன்ஷாட்கள் முடக்கப்பட்டன</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">இந்தக் கோப்பை ஸ்கேன் செய்யும்போது எதிர்பாராதவிதமாக வைரஸ் தடுப்பு மென்பொருள் தோல்வியடைந்தது.</translation>
 <translation id="428608937826130504">ஷெல்ஃப் உருப்படி 8</translation>
 <translation id="4287502004382794929">இந்தச் சாதனத்தைப் பதிவுசெய்வதற்கு போதுமான மென்பொருள் உரிமங்கள் உங்களிடம் இல்லை. மேலும் வாங்க, விற்பனையைத் தொடர்புகொள்ளவும். பிழை காரணமாக இந்தச் செய்தியைப் பார்க்கிறீர்கள் என நினைத்தால், ஆதரவைத் தொடர்புகொள்ளவும்.</translation>
-<translation id="4289300219472526559">பேச்சைத் தொடங்கு</translation>
 <translation id="4289540628985791613">மேலோட்டம்</translation>
 <translation id="4296575653627536209">கண்காணிக்கப்படும் பயனரைச் சேர்</translation>
 <translation id="4297322094678649474">மொழிகளை மாற்று</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Chrome இணைய அங்காடியிலிருந்து நீட்டிப்பை நிறுவ வேண்டும்</translation>
 <translation id="4750394297954878236">பரிந்துரைகள்</translation>
 <translation id="475088594373173692">முதல் பயனர்</translation>
+<translation id="4751476147751820511">நகர்வு அல்லது ஒளி உணர்விகள்</translation>
 <translation id="4756378406049221019">நிறுத்து/மீண்டும் ஏற்று</translation>
 <translation id="4756388243121344051">&amp;வரலாறு</translation>
 <translation id="4759238208242260848">பதிவிறக்கங்கள்</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">பிணைய பிழை</translation>
 <translation id="4816492930507672669">பக்கத்தில் பொருத்து</translation>
 <translation id="4820334425169212497">இல்லை, குறியீடு தெரியவில்லை</translation>
-<translation id="4821725298388681253">இது முன்கூட்டிய வெளியீடாகும். தேடல், உரை உள்ளீடு போன்ற சில அம்சங்கள் இப்போது கிடைக்காது.</translation>
 <translation id="4821935166599369261">&amp;சுயவிவரமாக்கம் இயக்கப்பட்டது</translation>
 <translation id="4823484602432206655">பயணர் மற்றும் சாதன அமைப்புகளைப் படிக்கும் மற்றும் மாற்றும்</translation>
 <translation id="4823651846660089135">படிப்பதற்கு மட்டுமேயான சாதனம்</translation>
@@ -2656,7 +2653,7 @@
 <translation id="5143374789336132547">முகப்புப் பொத்தானைக் கிளிக் செய்யும் போது காண்பிக்கப்படும் பக்கத்தை, "<ph name="EXTENSION_NAME" />" நீட்டிப்பு மாற்றியுள்ளது.</translation>
 <translation id="5143712164865402236">முழுத்திரைக்குச் செல்</translation>
 <translation id="5145331109270917438">மாற்றிய தேதி</translation>
-<translation id="514575469079499857">இருப்பிடத்தைத் கண்டறிய, எனது IP முகவரியைப் பயன்படுத்தவும் (இயல்பு)</translation>
+<translation id="514575469079499857">இருப்பிடத்தைத் கண்டறிய, எனது IP முகவரியைப் பயன்படுத்து (இயல்பு)</translation>
 <translation id="5150254825601720210">Netscape சான்றிதழ் SSL சேவையகப் பெயர்</translation>
 <translation id="5151354047782775295">சாதனத்தில் காலி இடத்தை உருவாக்கவும் அல்லது குறிப்பிட்ட தரவு தானாகவே நீக்கப்படலாம்</translation>
 <translation id="5153297660536091054">பின் மூலம் திறக்கும் அம்சம்</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">உங்கள் சாதனத்தில் கைரேகை உணர்வியைக் கண்டறிந்து, விரலால் தொடவும்</translation>
 <translation id="6390799748543157332">இந்தச் சாளரத்தில் பார்க்கும் பக்கங்கள் உங்களின் உலாவி வரலாற்றில் தோன்றாது, மேலும் திறக்கப்பட்டிருக்கும் எல்லா விருந்தினர் சாளரங்களையும் மூடிய பிறகு, பிற தடங்களான குக்கீகள் போன்றவற்றைக் கணினியில் விட்டுச் செல்லாது. எனினும், நீங்கள் பதிவிறக்கிய எல்லா கோப்புகளும் பாதுகாக்கப்படும்.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />கணினியின் தகவல்<ph name="END_LINK1" /> மற்றும் <ph name="BEGIN_LINK2" />அளவீடுகளை<ph name="END_LINK2" /> அனுப்பு</translation>
-<translation id="6397363302884558537">பேச்சை நிறுத்து</translation>
 <translation id="6397592254427394018">&amp;மறைநிலை சாளரத்தில் எல்லா புக்மார்க்ஸையும் திற</translation>
 <translation id="6398715114293939307">Google Play ஸ்டோரை அகற்று</translation>
 <translation id="6398765197997659313">முழுத்திரையிலிருந்து வெளியேறு</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">பயனர்பெயர்/கடவுச்சொல் தவறானது அல்லது EAP-அங்கீகாரம் தோல்வி</translation>
 <translation id="729761647156315797">மொழி &amp; விசைப்பலகையைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="7299337219131431707">விருந்தினர் உலாவலை இயக்கு</translation>
+<translation id="7303900363563182677">கிளிப்போர்டுக்கு நகலெடுத்த உரையையும் படங்களையும் பார்ப்பதிலிருந்து, இந்தத் தளம் தடைசெய்யப்பட்டுள்ளது</translation>
 <translation id="730515362922783851">அக நெட்வொர்க் அல்லது இணையத்தில் உள்ள எந்த சாதனத்துடனும் தரவைப் பரிமாறவும்</translation>
 <translation id="7308002049209013926">புதிய பயன்பாடுகளுக்கும் செயல்பாடுகளுக்கும் விரைவாகச் செல்ல, தொடக்கியைப் பயன்படுத்தவும். விசைப்பலகை மூலம் இங்கே வர, Alt, Shift, L ஆகிய விசைகளை ஒன்றாக அழுத்தவும்.</translation>
 <translation id="7309257895202129721">&amp;கட்டுப்பாடுகளைக் காண்பி</translation>
@@ -4397,6 +4394,7 @@
 <translation id="7909969815743704077">மறைநிலையில் பதிவிறக்கப்பட்டது</translation>
 <translation id="7910768399700579500">&amp;புதிய கோப்புறை</translation>
 <translation id="7912080627461681647">சேவையகத்தில் உங்கள் கடவுச்சொல் மாற்றப்பட்டது. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation>
+<translation id="7912883689016444961">மொபைல் நெட்வொர்க்கை உள்ளமை</translation>
 <translation id="7915471803647590281">மறுமொழி அனுப்புவதற்கு முன், என்ன நடந்துகொண்டிருக்கிறது என்பதை எங்களிடம் தெரியப்படுத்துங்கள்.</translation>
 <translation id="7925247922861151263">AAA சோதனை தோல்வியுற்றது</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> க்காக காத்திருக்கிறது...</translation>
@@ -4908,6 +4906,7 @@
 <translation id="8736288397686080465">இந்தத் தளம் பின்புலத்தில் புதுப்பிக்கப்படும்.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />க்குப் பதிலாக <ph name="PROTOCOL" /> இணைப்புகளைத் திறக்கும்</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">பிக்ச்சர்-இன்-பிக்ச்சர்</translation>
 <translation id="8743864605301774756">புதுப்பித்தது: 1ம முன்பு</translation>
 <translation id="8749863574775030885">அறியப்படாத விற்பனையாளரிடமிருந்து USB சாதனங்களை அணுகு</translation>
 <translation id="8754200782896249056">&lt;p&gt;ஆதரிக்கப்பட்ட டெஸ்க்டாப் சூழலில் <ph name="PRODUCT_NAME" /> இயங்கும்போது, கணினி ப்ராக்ஸி அமைப்புகள் பயன்படுத்தப்படும். எனினும், உங்கள் கணினி ஆதரிக்கப்படாமல் இருக்கலாம் அல்லது உங்கள் கணினி உள்ளமைவை தொடங்குவதில் சிக்கல் இருக்கலாம்.&lt;/p&gt;
@@ -5010,7 +5009,6 @@
 <translation id="8912793549644936705">விரிவாக்கு</translation>
 <translation id="8915370057835397490">பரிந்துரைகளை ஏற்றுகிறது</translation>
 <translation id="8916476537757519021">மறைநிலை துணைச்சட்டகம்: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" />க்கு ஒத்திசை</translation>
 <translation id="8922013791253848639">இந்தத் தளத்தில் எப்போதும் விளம்பரங்களை அனுமதி</translation>
 <translation id="8925458182817574960">&amp;அமைப்புகள்</translation>
 <translation id="8926389886865778422">மீண்டும் கேட்கவேண்டாம்</translation>
@@ -5191,7 +5189,7 @@
 <translation id="932327136139879170">முகப்பு</translation>
 <translation id="932508678520956232">அச்சிடலைத் தொடங்க முடியவில்லை.</translation>
 <translation id="93393615658292258">கடவுச்சொல் மட்டும்</translation>
-<translation id="934503638756687833">தேவைப்பட்டால், இங்கே பட்டியலிடப்படாத உருப்படிகளும் அகற்றப்படும். Chrome தனியுரிமை தகவல் கையேட்டில் &lt;a href="<ph name="URL" />"&gt;தேவையற்ற மென்பொருளிலிருந்து பாதுகாப்பு&lt;/a&gt; பற்றி மேலும் அறிக.</translation>
+<translation id="934503638756687833">தேவைப்பட்டால், இங்கே பட்டியலிடப்படாத உருப்படிகளும் அகற்றப்படும். Chrome தனியுரிமைத் தகவல் கையேட்டில் &lt;a href="<ph name="URL" />"&gt;தேவையற்ற மென்பொருளிலிருந்து பாதுகாப்பு&lt;/a&gt; பற்றி மேலும் அறிக.</translation>
 <translation id="935490618240037774">புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகள் உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படும் என்பதால் அவற்றை எல்லா சாதனங்களிலும் பயன்படுத்தலாம்.</translation>
 <translation id="936801553271523408">முறைமை பகுப்பாய்வு தரவு</translation>
 <translation id="93766956588638423">நீட்டிப்பைப் பழுதுநீக்கு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index f55fe64..4b6036d1 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -352,7 +352,7 @@
 <translation id="152234381334907219">ఎప్పటికి సేవ్ చెయ్యబడవు</translation>
 <translation id="1524430321211440688">కీబోర్డ్</translation>
 <translation id="1524563461097350801">వద్దు, ధన్యవాదాలు</translation>
-<translation id="1525740877599838384">స్థానాన్ని గుర్తించడం కోసం Wi-Fiని మాత్రమే ఉపయోగిస్తుంది</translation>
+<translation id="1525740877599838384">స్థానాన్ని గుర్తించడానికి మాత్రమే Wi-Fiని ఉపయోగించండి</translation>
 <translation id="1526560967942511387">శీర్షికలేని పత్రం</translation>
 <translation id="1526925867532626635">సమకాలీకరణ సెట్టింగ్‌లను నిర్ధారించండి</translation>
 <translation id="1529116897397289129">సేవ్ చేసిన కార్డ్‌లు ఇక్కడ కనిపిస్తాయి</translation>
@@ -436,7 +436,7 @@
     నిర్దిష్ట వెబ్‌సైట్‌లను <ph name="BEGIN_BOLD" />అనుమతించడం లేదా నిషేధించడం<ph name="END_BOLD" />,
     పర్యవేక్షించబడే వినియోగదారు సందర్శించిన వెబ్‌సైట్‌లను <ph name="BEGIN_BOLD" />సమీక్షించడం<ph name="END_BOLD" /> మరియు
     ఇతర సెట్టింగ్‌లను <ph name="BEGIN_BOLD" />నిర్వహించడం<ph name="END_BOLD" />.</translation>
-<translation id="1648528859488547844">స్థానాన్ని గుర్తించడానికి Wi‑Fi లేదా మొబైల్ నెట్‌వర్క్‌లను ఉపయోగిస్తుంది</translation>
+<translation id="1648528859488547844">స్థానాన్ని గుర్తించడానికి Wi‑Fi లేదా మొబైల్ నెట్‌వర్క్‌లను ఉపయోగించండి</translation>
 <translation id="1648943974594387137">సైన్-ఇన్ వివరాలు పాతవి</translation>
 <translation id="1650371550981945235">ఇన్‌పుట్ ఎంపికలను చూపు</translation>
 <translation id="1650709179466243265">www. మరియు .comని జోడించి, చిరునామాను తెరవండి</translation>
@@ -588,9 +588,9 @@
 <translation id="1878524442024357078">మీ కంప్యూటర్‌ను ప్రాప్యత చేయడం కోసం ప్లగిన్‌ను ఉపయోగించడానికి సైట్‌లు ఏవీ అనుమతించవద్దు</translation>
 <translation id="1879449842763884566">అప్లికేషన్‌లకు ఇన్‌స్టాల్ చేయి...</translation>
 <translation id="1880905663253319515">ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />"ని తొలగించాలా?</translation>
-<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" /> మీ <ph name="ORIGIN" /> పాస్‌వర్డ్‌ను సేవ్ చేయాలని మీరు కోరుకుంటున్నారా?</translation>
+<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" /> కోసం మీ <ph name="ORIGIN" /> పాస్‌వర్డ్‌ను సేవ్ చేయాలని మీరు కోరుకుంటున్నారా?</translation>
 <translation id="1886996562706621347">ప్రోటోకాల్స్‌కు డిఫాల్ట్ హ్యాండ్లర్‌లుగా కావడం కోసం అడగటానికి సైట్‌లను అనుమతించండి (సిఫార్సు చేయబడింది)</translation>
-<translation id="1887442540531652736">సైన్-ఇన్ ఎర్రర్</translation>
+<translation id="1887442540531652736">సైన్ ఇన్ ఎర్రర్</translation>
 <translation id="1887850431809612466">హార్డ్‌వేర్ పునర్విమర్శ</translation>
 <translation id="1889984860246851556">ప్రాక్సీ సెట్టింగ్‌లని తెరవండి</translation>
 <translation id="1890674179660343635">&lt;span&gt;ID: &lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
@@ -783,7 +783,7 @@
 <translation id="2215277870964745766">స్వాగతం! మీ భాష మరియు నెట్‌వర్క్‌ను సెట్ చేయండి</translation>
 <translation id="2217501013957346740">పేరును సృష్టించండి -</translation>
 <translation id="2218019600945559112">మౌస్ మరియు టచ్‌ప్యాడ్</translation>
-<translation id="2218320521449013367">హానికరమైన సాఫ్ట్‌వేర్‌ని Chrome తీసివేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది</translation>
+<translation id="2218320521449013367">Chrome హానికరమైన సాఫ్ట్‌వేర్‌ని తీసివేస్తున్నప్పుడు ఎర్రర్ సంభవించింది</translation>
 <translation id="2218515861914035131">సాధారణ వచనం వలె అతికించండి</translation>
 <translation id="221872881068107022">రివర్స్ స్క్రోలింగ్</translation>
 <translation id="2218947405056773815">అయ్యో! <ph name="API_NAME" /> సమస్యను ఎదుర్కొంది</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">సాధనాలు మెనులోని పొడిగింపులను క్లిక్ చేయడం ద్వారా మీ పొడిగింపులను నిర్వహించండి.</translation>
 <translation id="2359808026110333948">కొనసాగు</translation>
 <translation id="236141728043665931">ఎల్లప్పుడూ మైక్రోఫోన్ ప్రాప్యతను బ్లాక్ చేయి</translation>
+<translation id="2365507699358342471">క్లిప్‌బోర్డ్‌కు కాపీ చేసిన వచనం మరియు చిత్రాలను ఈ సైట్ చూడగలదు.</translation>
 <translation id="2367972762794486313">అనువర్తనాలను చూపు</translation>
 <translation id="2371076942591664043">&amp;పూర్తవగానే తెరువు</translation>
 <translation id="2377319039870049694">జాబితా వీక్షణకు మార్చు</translation>
@@ -1148,7 +1149,7 @@
 <translation id="2762441749940182211">కెమెరా బ్లాక్ చేయబడింది</translation>
 <translation id="2765217105034171413">చిన్నది</translation>
 <translation id="2766006623206032690">పే&amp;స్ట్ చేసి ముందుకు వెళ్ళండి</translation>
-<translation id="2767084307624729667"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌లు సేవ్ చేయబడ్డాయి</translation>
+<translation id="2767084307624729667"><ph name="ORIGIN" /> కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
 <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు.</translation>
 <translation id="2770465223704140727">జాబితాను నుండి తొలగించు</translation>
 <translation id="2770690685823456775">మీ పాస్‌వర్డ్‌లను మరో ఫోల్డర్‌కు ఎగుమతి చేయండి</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">ఫారమ్ ఫీల్డ్‌ల వలె వెబ్‌పేజీ హైలైట్‌ల లింక్‌లపై ట్యాబ్‌ను నొక్కడం</translation>
 <translation id="2916745397441987255">పొడిగింపులను శోధించండి</translation>
 <translation id="2921081876747860777">దయచేసి మీ స్థానిక డేటాను రక్షించడానికి పాస్‌వర్డ్‌ను సృష్టించండి.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" />కు సమకాలీకరించబడింది</translation>
 <translation id="2925966894897775835">షీట్‌లు</translation>
 <translation id="2927017729816812676">కాష్ నిల్వ</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (పిల్లల ఖాతా)</translation>
@@ -1357,7 +1357,7 @@
 <translation id="3038612606416062604">ఒక ప్రింటర్‌ను మాన్యువల్‌గా జోడించండి</translation>
 <translation id="3038675903128704560">మీ కంప్యూటర్‌ను ప్రాప్యత చేయడం కోసం ప్లగిన్‌ను ఉపయోగించడానికి ఏ సైట్‌నూ అనుమతించవద్దు</translation>
 <translation id="3039828483675273919">$1 అంశాలను తరలిస్తోంది...</translation>
-<translation id="3045447014237878114">ఈ సైట్ పలు ఫైల్‌లను స్వయంచాలకంగా డౌన్‌లోడ్ చేసింది</translation>
+<translation id="3045447014237878114">ఈ సైట్ పలు ఫైల్‌లను ఆటోమేటిక్‌గా డౌన్‌లోడ్ చేసింది</translation>
 <translation id="304567287000691532">స్క్రీన్‌ని షేర్ చేస్తోంది</translation>
 <translation id="3046910703532196514">వెబ్‌పేజీ, సంపూర్ణం</translation>
 <translation id="304826556400666995">ట్యాబ్‌లను అన్‌మ్యూట్ చేయండి</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">అభినందనలు</translation>
 <translation id="3349933790966648062">మెమరీ ఫుట్‌ప్రింట్</translation>
 <translation id="3353984535370177728">అప్‌లోడ్ చేయడానికి ఫోల్టర్‌ను ఎంచుకోండి</translation>
-<translation id="335581015389089642">ప్రసంగం</translation>
 <translation id="3355936511340229503">కనెక్షన్ లోపం</translation>
 <translation id="3356797067524893661">మీరు Hangouts సమావేశానికి కొనసాగడానికి అంతా పూర్తి చేశారు</translation>
 <translation id="3358935496594837302">మీ ఫోన్‌ను కనుగొనలేము. మీరు ఆన్ చేసి ఉన్న అనుకూల Android ఫోన్‌ని ఉపయోగిస్తున్నారని మరియు అది చేతికి అందేంత దగ్గర్లో ఉందని నిర్ధారించుకోండి. &lt;a&gt;మరింత తెలుసుకోండి&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;క్రొత్త ట్యాబ్‌లో తెరువు</translation>
 <translation id="3616113530831147358">ఆడియో</translation>
 <translation id="3616741288025931835">బ్రౌజింగ్ డేటాను &amp;క్లియర్ చెయ్యి...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />”ని వెతకండి</translation>
 <translation id="3620292326130836921">అన్నీ బ్యాకప్ చేయబడ్డాయి!</translation>
 <translation id="3623574769078102674">ఈ పర్యవేక్షించబడే వినియోగదారు <ph name="MANAGER_EMAIL" /> ద్వారా నిర్వహించబడతారు.</translation>
 <translation id="3625258641415618104">స్క్రీన్‌షాట్‌లు నిలిపివేయబడ్డాయి</translation>
@@ -1841,7 +1839,7 @@
 <translation id="378312418865624974">ఈ కంప్యూటర్ కోసం ప్రత్యేక ఐడెంటిఫైయర్‌ని చదవడం</translation>
 <translation id="3783640748446814672">alt</translation>
 <translation id="3785308913036335955">అనువర్తనాల సత్వరమార్గాన్ని చూపు</translation>
-<translation id="3785727820640310185">ఈ సైట్ కోసం పాస్‌వర్డ్‌లు సేవ్ చేయబడ్డాయి</translation>
+<translation id="3785727820640310185">ఈ సైట్ కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
 <translation id="3785852283863272759">పేజీ స్థానాన్ని ఇమెయిల్ చేయి</translation>
 <translation id="3786301125658655746">మీరు ఆఫ్‌లైన్‌లో ఉన్నారు</translation>
 <translation id="3788401245189148511">ఇది వీటిని చేయాలనుకుంటోంది:</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">ఈ ఫైల్‌ను స్కాన్ చేస్తున్నప్పుడు ఊహించని విధంగా యాంటీ-వైరస్ సాఫ్ట్‌వేర్ విఫలమైంది.</translation>
 <translation id="428608937826130504">అర అంశం 8</translation>
 <translation id="4287502004382794929">ఈ పరికరాన్ని నమోదు చేయడానికి మీకు తగిన సాఫ్ట్‌వేర్ లైసెన్స్‌లు లేవు. దయచేసి మరిన్నింటిని కొనుగోలు చేయడానికి విక్రయ కేంద్రాన్ని సంప్రదించండి. మీరు ఈ సందేశాన్ని పొరపాటున చూస్తున్నారని విశ్వసిస్తే, దయచేసి మద్దతు కేంద్రాన్ని సంప్రదించండి.</translation>
-<translation id="4289300219472526559">మాట్లాడటాన్ని ప్రారంభించు</translation>
 <translation id="4289540628985791613">స్థూలదృష్టి</translation>
 <translation id="4296575653627536209">పర్యవేక్షించబడే వినియోగదారును జోడించు</translation>
 <translation id="4297322094678649474">భాషలను మార్చు</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Chrome వెబ్ స్టోర్‌ నుండి పొడిగింపు అవసరం</translation>
 <translation id="4750394297954878236">సూచనలు</translation>
 <translation id="475088594373173692">మొదటి వినియోగదారు</translation>
+<translation id="4751476147751820511">చలనం లేదా కాంతి సర్దుబాటు సెన్సార్‌లు</translation>
 <translation id="4756378406049221019">ఆపండి/మళ్లీ లోడ్ చేయండి</translation>
 <translation id="4756388243121344051">&amp;చరిత్ర</translation>
 <translation id="4759238208242260848">డౌన్‌లోడ్‌లు</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">నెట్‌వర్క్ లోపం</translation>
 <translation id="4816492930507672669">పేజీకి తగినట్లు అమర్చు</translation>
 <translation id="4820334425169212497">లేదు, నాకు కనిపించలేదు</translation>
-<translation id="4821725298388681253">ఇది ముందస్తు విడుదల. శోధన మరియు వచన నమోదు వంటి కొన్ని ఫీచర్‌లు ఇంకా అందుబాటులోకి రాలేదు.</translation>
 <translation id="4821935166599369261">&amp;ప్రొఫైలింగ్ అనుమతించబడింది</translation>
 <translation id="4823484602432206655">వినియోగదారు మరియు పరికర సెట్టింగ్‌లను చదవడానికి మరియు మార్చడానికి అనుమతి</translation>
 <translation id="4823651846660089135">పరికరం చదవడానికి మాత్రమే</translation>
@@ -2656,7 +2653,7 @@
 <translation id="5143374789336132547">"<ph name="EXTENSION_NAME" />" పొడిగింపు మీరు హోమ్ బటన్‌ను క్లిక్ చేసినప్పుడు చూపబడే పేజీని మార్చింది.</translation>
 <translation id="5143712164865402236">పూర్తి స్క్రీన్‌ను ఎంటర్ చెయ్యండి</translation>
 <translation id="5145331109270917438">సవరించబడిన తేదీ</translation>
-<translation id="514575469079499857">స్థానాన్ని గుర్తించడానికి మీ IP చిరునామాని ఉపయోగించండి (డిఫాల్ట్)</translation>
+<translation id="514575469079499857">స్థానాన్ని (డిఫాల్ట్) గుర్తించడానికి మీ IP చిరునామాని ఉపయోగించండి</translation>
 <translation id="5150254825601720210">Netscape సర్టిఫికెట్ SSL సర్వర్ పేరు</translation>
 <translation id="5151354047782775295">డిస్క్ స్థలాన్ని ఖాళీ చేయండి, లేదంటే ఎంపిక చేసిన డేటా స్వయంచాలకంగా తొలగించబడవచ్చు</translation>
 <translation id="5153297660536091054">PIN అన్‌లాక్ లక్షణం</translation>
@@ -2823,7 +2820,7 @@
 <translation id="5398772614898833570">ప్రకటనలు బ్లాక్ చేయబడ్డాయి</translation>
 <translation id="5402815541704507626">మొబైల్ డేటా ఉపయోగించి నవీకరణను డౌన్‌లోడ్ చేయండి</translation>
 <translation id="540296380408672091"><ph name="HOST" />లో కుక్కీలను ఎల్లప్పుడూ బ్లాక్ చేయి</translation>
-<translation id="5405146885510277940">సెట్టింగ్‌లను రీసెట్ చేయి</translation>
+<translation id="5405146885510277940">సెట్టింగ్‌లను రీసెట్ చేయండి</translation>
 <translation id="5408750356094797285">జూమ్: <ph name="PERCENT" /></translation>
 <translation id="5409029099497331039">నాకు ఆశ్చర్యం కలిగించు</translation>
 <translation id="5411472733320185105">ఈ హోస్ట్‌లు మరియు డొమేన్‌ల కోసం ప్రాక్సీ సెట్టింగ్‌లను ఉపయోగించవద్దు:</translation>
@@ -2949,7 +2946,7 @@
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
 <translation id="5582839680698949063">ప్రధాన మెను</translation>
 <translation id="5583640892426849032">Backspace</translation>
-<translation id="5583726250980167172">ఈ సైట్ కోసం పాస్‌వర్డ్‌లు సేవ్ చేయబడ్డాయి</translation>
+<translation id="5583726250980167172">ఈ సైట్ కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
 <translation id="5585118885427931890">బుక్‌మార్క్ ఫోల్డర్‌ని సృష్టించడం సాధ్యం కాలేదు.</translation>
 <translation id="558563010977877295">నిర్దిష్ట పేజీని లేదా పేజీల సెట్‌ను తెరువు</translation>
 <translation id="5585912436068747822">ఆకృతీకరణ విఫలమైంది</translation>
@@ -3404,7 +3401,7 @@
 <translation id="6307990684951724544">సిస్టమ్ బిజీగా ఉంది</translation>
 <translation id="6308937455967653460">లిం&amp;క్‌ను ఇలా సేవ్ చెయ్యి...</translation>
 <translation id="6311220991371174222">మీ ప్రొఫైల్‌ను తెరుస్తున్నప్పుడు ఏదో తప్పు జరిగినందున Chromeని తెరవడం సాధ్యపడదు. Chromeని పునఃప్రారంభించడానికి ప్రయత్నించండి.</translation>
-<translation id="6312400084708441752">మీ కంప్యూటర్‌లో హానికరమైన సాఫ్ట్‌వేర్, సిస్టమ్ సెట్టింగ్‌లు మరియు ప్రక్రియల గురించిన సమాచారాన్ని కలిగి ఉంటుంది</translation>
+<translation id="6312400084708441752">మీ కంప్యూటర్‌లో హానికరమైన సాఫ్ట్‌వేర్, సిస్టమ్ సెట్టింగ్‌లు మరియు ప్రక్రియల గురించిన సమాచారం ఉంటుంది</translation>
 <translation id="6312403991423642364">తెలియని నెట్‌వర్క్ లోపం</translation>
 <translation id="6313641880021325787">VRని నిష్క్రమించు</translation>
 <translation id="6314819609899340042">మీరు ఈ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరంలో డీబగ్గింగ్ లక్షణాలను విజయవంతంగా ప్రారంభించారు.</translation>
@@ -3450,7 +3447,6 @@
 <translation id="6388771388956873507">మీ పరికరంలో వేలిముద్ర సెన్సార్ ఎక్కడ ఉందో చూసి, మీ వేలితో దాన్ని తాకండి</translation>
 <translation id="6390799748543157332">మీరు ఈ విండో‌లో వీక్షించే పేజీలు బ్రౌజర్ చరిత్రలో కనిపించవు మరియు తెరవబడిన అన్ని అతిథి విండోలను మీరు మూసివేసిన తర్వాత అవి కంప్యూటర్‌లో కుక్కీల వంటి ఇతర జాడలను వదిలిపెట్టవు. అయితే, మీరు డౌన్‌లోడ్ చేసే ఫైల్‌లు భద్రపరచబడతాయి.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />సిస్టమ్ సమాచారం<ph name="END_LINK1" /> మరియు <ph name="BEGIN_LINK2" />గణాంకాలు<ph name="END_LINK2" /> పంపు</translation>
-<translation id="6397363302884558537">మాట్లాడటాన్ని ఆపివేయి</translation>
 <translation id="6397592254427394018">అన్ని బుక్‌మార్క్‌లను &amp;అజ్ఞాత విండోలో తెరువు</translation>
 <translation id="6398715114293939307">Google Play స్టోర్‌ని తీసివేయండి</translation>
 <translation id="6398765197997659313">పూర్తి స్క్రీన్ నుండి నిష్క్రమించు</translation>
@@ -3477,7 +3473,7 @@
 <translation id="642282551015776456">ఈ పేరును ఫైల్ యొక్క ఫోల్డర్ పేరుగా ఉపయోగించలేము.</translation>
 <translation id="6423239382391657905">OpenVPN</translation>
 <translation id="6426200009596957090">ChromeVox సెట్టింగ్‌లను తెరువు</translation>
-<translation id="6429384232893414837">అప్‌డేట్ ఎర్రర్</translation>
+<translation id="6429384232893414837">అప్‌డేట్‌లో ఎర్రర్</translation>
 <translation id="6430814529589430811">Base64-ఎన్‌కోడ్ చేసిన ASCII, ఒక్క సర్టిఫికెట్</translation>
 <translation id="6431217872648827691"><ph name="TIME" />న మీ Google పాస్‌వర్డ్‌తో మొత్తం డేటా
           గుప్తీకరించబడింది</translation>
@@ -4007,7 +4003,7 @@
 <translation id="7278870042769914968">GTK+ థీమ్‌ని ఉపయోగించు</translation>
 <translation id="727952162645687754">డౌన్‌లోడ్ చేయడంలో లోపం</translation>
 <translation id="7279701417129455881">కుక్కీ నిరోధించడాన్ని నిర్వహించు...</translation>
-<translation id="7280041992884344566">హానికరమైన సాఫ్ట్‌వేర్ కోసం Chrome శోధిస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది</translation>
+<translation id="7280041992884344566">Chrome హానికరమైన సాఫ్ట్‌వేర్ కోసం వెతుకుతున్నప్పుడు ఎర్రర్ సంభవించింది</translation>
 <translation id="7280877790564589615">అనుమతి అభ్యర్థించబడింది</translation>
 <translation id="7282992757463864530">సమాచార బార్</translation>
 <translation id="7283041136720745563">Google డిస్క్ కోటా తగినంత పెద్దది కాదు.</translation>
@@ -4023,6 +4019,7 @@
 <translation id="7297443947353982503">వినియోగదారు పేరు/పాస్‌వర్డ్ తప్పు లేదా EAP-ప్రామాణీకరణ విఫలమైంది</translation>
 <translation id="729761647156315797">మీ భాష &amp; కీబోర్డ్‌ను ఎంచుకోండి</translation>
 <translation id="7299337219131431707">అతిథి బ్రౌజింగ్‌ని ప్రారంభించు</translation>
+<translation id="7303900363563182677">క్లిప్‌బోర్డ్‌కు కాపీ చేసిన వచనం మరియు చిత్రాలను చూడనీయకుండా ఈ సైట్ బ్లాక్ చేయబడింది</translation>
 <translation id="730515362922783851">స్థానిక నెట్‌వర్క్‌ లేదా ఇంటర్నెట్‌లో ఏ పరికరంతోనైనా డేటాను ఇచ్చిపుచ్చుకోవడానికి అనుమతి</translation>
 <translation id="7308002049209013926">కొత్త యాప్‌లు మరియు కార్యకలాపాలకు త్వరగా వెళ్లడం కోసం లాంచర్‌ని ఉపయోగించండి. కీబోర్డ్ ద్వారా ఇక్కడికి రావాలాంటే, Alt + Shift + Lని నొక్కండి.</translation>
 <translation id="7309257895202129721">&amp;నియంత్రణలను చూపించు</translation>
@@ -4403,6 +4400,7 @@
 <translation id="7909969815743704077">అజ్ఞాతంలో డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="7910768399700579500">&amp;క్రొత్త ఫోల్డర్</translation>
 <translation id="7912080627461681647">సర్వర్‌లో మీ పాస్‌వర్డ్ మార్చబడింది. దచయేసి సైన్ అవుట్ చేసి, సైన్ ఇన్ చేయండి.</translation>
+<translation id="7912883689016444961">మొబైల్ నెట్‌వర్క్‌ను కాన్ఫిగర్ చేయండి</translation>
 <translation id="7915471803647590281">దయచేసి అభిప్రాయాన్ని పంపడానికి ముందు ఏమి జరిగిందో మాకు చెప్పండి.</translation>
 <translation id="7925247922861151263">AAA తనిఖీ విఫలమైంది</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> కోసం వేచి ఉంది ...</translation>
@@ -4466,7 +4464,7 @@
 <translation id="8005600846065423578">క్లిప్‌బోర్డ్‌ను చూడటానికి ఎల్లప్పుడూ <ph name="HOST" />ని అనుమతించు</translation>
 <translation id="8008356846765065031">ఇంటర్నెట్ డిస్‌కనెక్ట్ చేయబడింది. దయచేసి మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి.</translation>
 <translation id="8008818777654712271">హానికరమైన అనువర్తనాలు మరియు సైట్‌లను గుర్తించడంలో సహాయపడటానికి కొంత సిస్టమ్ సమాచారాన్ని మరియు పేజీ కంటెంట్‌ను Googleకి స్వయంచాలకంగా పంపు</translation>
-<translation id="8009225694047762179">పాస్‌వర్డ్‌లను నిర్వహించు</translation>
+<translation id="8009225694047762179">పాస్‌వర్డ్‌లను నిర్వహించండి</translation>
 <translation id="8012382203418782830">ఈ పేజీ అనువదించబడింది.</translation>
 <translation id="8014154204619229810">అప్‌డేటర్ ప్రస్తుతం అమలులో ఉంది. మళ్లీ తనిఖీ చేయడానికి ఒక నిమిషం తర్వాత రిఫ్రెష్ చేయండి.</translation>
 <translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> మునుపు ఇన్‌స్టాల్ చేసిన సంస్కరణకు తిరిగి మారలేకపోయింది. దయచేసి మీ పరికరాన్ని పవర్‌వాష్ చేయడానికి మళ్లీ ప్రయత్నించండి.</translation>
@@ -4606,7 +4604,7 @@
 <translation id="8234795456569844941">దయచేసి ఈ సమస్యను పరిష్కరించడంలో మా ఇంజినీర్‌లకు సహాయపడండి. మీకు ప్రొఫైల్ లోప సందేశం ఎదురుకావడం కంటే ముందు ఏమి జరిగిందో మాకు తెలియజేయండి:</translation>
 <translation id="8234989666557591529">మీ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేయడానికి ఫోన్‌ని ఎంచుకోండి</translation>
 <translation id="8238649969398088015">సహాయ చిట్కా</translation>
-<translation id="8239020549147958415"><ph name="FULL_NAME" /> వలె సమకాలీకరించు</translation>
+<translation id="8239020549147958415"><ph name="FULL_NAME" /> వలె సమకాలీకరించండి</translation>
 <translation id="8240697550402899963">క్లాసిక్ థీమ్‌ని ఉపయోగించు</translation>
 <translation id="8241040075392580210">షేడీ</translation>
 <translation id="8241806945692107836">పరికర కాన్ఫిగరేషన్‌ను గుర్తిస్తోంది...</translation>
@@ -4743,7 +4741,7 @@
 <translation id="8465444703385715657">అమలు చేయడానికి <ph name="PLUGIN_NAME" />కి మీ అనుమతి అవసరం</translation>
 <translation id="8466234950814670489">Tar ఆర్కైవ్</translation>
 <translation id="8468750959626135884">మీ Android ఫోన్‌తో మీ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేయండి.</translation>
-<translation id="8470513973197838199"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌లు సేవ్ చేయబడ్డాయి</translation>
+<translation id="8470513973197838199"><ph name="ORIGIN" /> కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
 <translation id="8472623782143987204">హార్డ్‌వేర్-వెనుకకు చెయ్యి</translation>
 <translation id="8475313423285172237">మీ కంప్యూటర్‌లోని మరో ప్రోగ్రామ్ జోడించిన పొడిగింపు కారణంగా Chrome పని చేసే విధానం మారవచ్చు.</translation>
 <translation id="8475647382427415476">Google డిస్క్ ప్రస్తుతం "<ph name="FILENAME" />"ని సమకాలీకరించలేకపోయింది. Google డిస్క్ తర్వాత మళ్లీ ప్రయత్నిస్తుంది.</translation>
@@ -4795,7 +4793,7 @@
 <translation id="8569682776816196752">గమ్యస్థానాలు కనుగొనబడలేదు</translation>
 <translation id="8569764466147087991">తెరవడానికి ఫైల్‌ని ఎంచుకోండి</translation>
 <translation id="8571213806525832805">గత 4 వారాలు</translation>
-<translation id="8571613743082299268">సైట్‌కు దారి మళ్లించడం బ్లాక్ చేయబడింది</translation>
+<translation id="8571613743082299268">సైట్‌కు మళ్ళింపు బ్లాక్ చేయబడింది</translation>
 <translation id="8574990355410201600"><ph name="HOST" />లో ఎల్లప్పుడూ ధ్వనిని అనుమతించు</translation>
 <translation id="8578639784464423491">99 అక్షరాలను మించకూడదు</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> అంశాలను సమకాలీకరిస్తోంది...</translation>
@@ -4912,6 +4910,7 @@
 <translation id="8736288397686080465">ఈ సైట్ నేపథ్యంలో నవీకరించబడింది.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />కి బదులుగా <ph name="PROTOCOL" /> లింక్‌లను తెరవాలనుకుంటోంది</translation>
 <translation id="8737709691285775803">షిల్</translation>
+<translation id="8741316211671074806">చిత్రంలో చిత్రం</translation>
 <translation id="8743864605301774756">1గంట క్రితం నవీకరించబడింది</translation>
 <translation id="8749863574775030885">తెలియని విక్రేత అందించిన USB పరికరాలకు ప్రాప్యత</translation>
 <translation id="8754200782896249056">&lt;p&gt;<ph name="PRODUCT_NAME" />ని మద్దతు ఉన్న డెస్క్‌టాప్ పరిసరంలో అమలు చేస్తున్నప్పుడు, సిస్టమ్ ప్రాక్సీ సెట్టింగ్‌లు ఉపయోగించబడతాయి.  అయితే, మీ సిస్టమ్ మద్దతు ఇవ్వడం లేదు లేదా మీ సిస్టమ్ కాన్ఫిగరేషన్‌ను ప్రారంభించడంలో సమస్య ఉంది.&lt;/p&gt;
@@ -5014,7 +5013,6 @@
 <translation id="8912793549644936705">విస్తరించు</translation>
 <translation id="8915370057835397490">సూచన లోడ్ అవుతోంది</translation>
 <translation id="8916476537757519021">అజ్ఞాత సబ్‌ఫ్రేమ్: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" />కు సమకాలీకరించు</translation>
 <translation id="8922013791253848639">ఎల్లప్పుడూ ఈ సైట్‌లోని ప్రకటనలను అనుమతించు</translation>
 <translation id="8925458182817574960">&amp;సెట్టింగ్‌లు</translation>
 <translation id="8926389886865778422">మళ్ళి అడగవద్దు</translation>
@@ -5195,7 +5193,7 @@
 <translation id="932327136139879170">హోమ్</translation>
 <translation id="932508678520956232">ముద్రించడాన్ని ప్రారంభించడం సాధ్యం కాలేదు.</translation>
 <translation id="93393615658292258">పాస్‌వర్డ్ మాత్రమే</translation>
-<translation id="934503638756687833">అవసరమైతే ఇక్కడ జాబితా చేయబడని అంశాలు కూడా తీసివేయబడతాయి. Chrome గోప్యత విధాన పత్రంలో &lt;a href="<ph name="URL" />"&gt;అవాంఛిత సాఫ్ట్‌వేర్ రక్షణ&lt;/a&gt; గురించి మరింత తెలుసుకోండి.</translation>
+<translation id="934503638756687833">అవసరమైతే ఇక్కడ జాబితా చేయబడని అంశాలు తీసివేయవచ్చు. Chrome గోప్యత విధాన పత్రంలో &lt;a href="<ph name="URL" />"&gt;అవాంఛిత సాఫ్ట్‌వేర్ రక్షణ&lt;/a&gt; గురించి మరింత తెలుసుకోండి.</translation>
 <translation id="935490618240037774">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సమకాలీకరించబడతాయి, కావున మీరు వీటిని మీ అన్ని పరికరాల్లో ఉపయోగించవచ్చు.</translation>
 <translation id="936801553271523408">సిస్టమ్ విశ్లేషణ డేటా</translation>
 <translation id="93766956588638423">పొడిగింపును సరి చేయి</translation>
@@ -5209,7 +5207,7 @@
 <translation id="942954117721265519">ఈ డైరెక్టరీలో చిత్రాలు లేవు.</translation>
 <translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation>
 <translation id="952992212772159698">సక్రియం చెయ్యబడలేదు</translation>
-<translation id="957960681186851048">స్వయంచాలకంగా పలు ఫైల్‌లను డౌన్‌లోడ్ చేయడానికి ఈ సైట్ ప్రయత్నించింది</translation>
+<translation id="957960681186851048">ఈ సైట్ ఆటోమెటిక్‌గా బహుళ ఫైల్‌లను డౌన్‌లోడ్ చేయడానికి ప్రయత్నించింది</translation>
 <translation id="9580706199804957">Google సేవలకు కనెక్ట్ చేయడం సాధ్యం కాలేదు</translation>
 <translation id="958515377357646513">ముందుకు వెళ్లడానికి తాకండి.</translation>
 <translation id="960719561871045870">ఆపరేటర్ కోడ్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 8171537..5dad928d 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">การกดแท็บบนหน้าเว็บจะเน้นลิงก์ และฟิลด์ของฟอร์ม</translation>
 <translation id="2916745397441987255">ค้นหาส่วนขยาย</translation>
 <translation id="2921081876747860777">โปรดสร้างรหัสผ่านเพื่อปกป้องข้อมูลในเครื่อง</translation>
-<translation id="2924395203970765374">ซิงค์กับ <ph name="FULL_NAME" /> แล้ว</translation>
 <translation id="2925966894897775835">แผ่นงาน</translation>
 <translation id="2927017729816812676">พื้นที่เก็บข้อมูลแคช</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (บัญชีสำหรับเด็ก)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">ขอแสดงความยินดี</translation>
 <translation id="3349933790966648062">หน่วยความจำที่ใช้</translation>
 <translation id="3353984535370177728">เลือกโฟลเดอร์ที่จะอัปโหลด</translation>
-<translation id="335581015389089642">คำพูด</translation>
 <translation id="3355936511340229503">ข้อผิดพลาดในการเชื่อมต่อ</translation>
 <translation id="3356797067524893661">คุณพร้อมที่จะเข้าการประชุม Hangouts แล้ว</translation>
 <translation id="3358935496594837302">ไม่พบโทรศัพท์ของคุณ โปรดตรวจสอบว่าคุณใช้โทรศัพท์ Android ที่เข้ากันได้ซึ่งเปิดอยู่และอยู่ใกล้ๆ มือคุณ &lt;a&gt;เรียนรู้เพิ่มเติม&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;เปิดในแท็บใหม่่</translation>
 <translation id="3616113530831147358">เสียง</translation>
 <translation id="3616741288025931835">&amp;ล้างข้อมูลการท่องเว็บ...</translation>
-<translation id="3618849550573277856">ค้นหา “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">สำรองข้อมูลทั้งหมดแล้ว!</translation>
 <translation id="3623574769078102674">ผู้ใช้ภายใต้การดูแลนี้จะถูกจัดการโดย <ph name="MANAGER_EMAIL" /></translation>
 <translation id="3625258641415618104">ปิดใช้การจับภาพหน้าจอ</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">ซอฟต์แวร์ป้องกันไวรัสล้มเหลวอย่างไม่คาดคิดในขณะสแกนไฟล์นี้</translation>
 <translation id="428608937826130504">รายการชั้นวาง 8</translation>
 <translation id="4287502004382794929">คุณมีใบอนุญาตซอฟต์แวร์ไม่เพียงพอสำหรับการลงทะเบียนอุปกรณ์นี้ โปรดติดต่อฝ่ายขายเพื่อสั่งซื้อเพิ่มเติม หากคุณเชื่อว่าคุณเห็นข้อความนี้เนื่องจากข้อผิดพลาด โปรดติดต่อฝ่ายสนับสนุน</translation>
-<translation id="4289300219472526559">เริ่มพูด</translation>
 <translation id="4289540628985791613">ภาพรวม</translation>
 <translation id="4296575653627536209">เพิ่มผู้ใช้ภายใต้การดูแล</translation>
 <translation id="4297322094678649474">เปลี่ยนภาษา</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">ข้อผิดพลาดของเครือข่าย</translation>
 <translation id="4816492930507672669">พอดีกับหน้า</translation>
 <translation id="4820334425169212497">ไม่เห็น</translation>
-<translation id="4821725298388681253">นี่เป็นรุ่นเผยแพร่ก่อนกำหนด บางฟีเจอร์อย่างเช่นการค้นหาและการป้อนข้อความยังไม่พร้อมใช้งาน</translation>
 <translation id="4821935166599369261">&amp;เปิดใช้งานการทำแฟ้มประวัติ</translation>
 <translation id="4823484602432206655">อ่านและเปลี่ยนการตั้งค่าผู้ใช้และอุปกรณ์</translation>
 <translation id="4823651846660089135">อุปกรณ์เป็นแบบอ่านอย่างเดียว</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">ค้นหาเซ็นเซอร์ลายนิ้วมือในอุปกรณ์แล้วใช้นิ้วแตะเซ็นเซอร์</translation>
 <translation id="6390799748543157332">หน้าที่คุณดูในหน้าต่างนี้จะไม่ปรากฏในประวัติเบราว์เซอร์และจะไม่ทิ้งร่องรอยอื่นๆ เช่น คุกกี้ ไว้ในคอมพิวเตอร์หลังจากที่คุณปิดหน้าต่างผู้เยี่ยมชมที่เปิดไว้ทั้งหมด อย่างไรก็ตาม ไฟล์ที่คุณดาวน์โหลดจะได้รับการเก็บรักษาไว้</translation>
 <translation id="6395423953133416962">ส่ง<ph name="BEGIN_LINK1" />ข้อมูลระบบ<ph name="END_LINK1" />และ<ph name="BEGIN_LINK2" />เมตริก<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">หยุดพูด</translation>
 <translation id="6397592254427394018">เปิดบุ๊กมาร์กทั้งหมดใน&amp;หน้าต่างที่ไม่ระบุตัวตน</translation>
 <translation id="6398715114293939307">นำ Google Play Store ออก</translation>
 <translation id="6398765197997659313">ออกจากการแสดงแบบเต็มหน้าจอ</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">ยืด</translation>
 <translation id="8915370057835397490">กำลังโหลดคำแนะนำ</translation>
 <translation id="8916476537757519021">เฟรมย่อยแบบไม่ระบุตัวตน: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">ซิงค์กับ <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">อนุญาตโฆษณาในไซต์นี้เสมอ</translation>
 <translation id="8925458182817574960">&amp;การตั้งค่า</translation>
 <translation id="8926389886865778422">ไม่ต้องถามอีก</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index e8e238c..0923a22 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -436,7 +436,7 @@
     belirli sitelere <ph name="BEGIN_BOLD" />izin verebilir veya engelleyebilir<ph name="END_BOLD" />,
     denetlenen kullanıcının ziyaret ettiği web sitelerini <ph name="BEGIN_BOLD" />inceleyebilir<ph name="END_BOLD" />
     ve diğer ayarları <ph name="BEGIN_BOLD" />yönetebilirsiniz<ph name="END_BOLD" />.</translation>
-<translation id="1648528859488547844">Konumu belirlemek için kablosuz ağlar kullanılır</translation>
+<translation id="1648528859488547844">Konum için kablosuz veya mobil ağlar kullanılır</translation>
 <translation id="1648943974594387137">Oturum açma ayrıntıları güncel değil</translation>
 <translation id="1650371550981945235">Giriş seçeneklerini göster</translation>
 <translation id="1650709179466243265">www. ve .com ekleyin ve adresi açın</translation>
@@ -588,7 +588,7 @@
 <translation id="1878524442024357078">Hiçbir sitenin bilgisayarıma erişmek için eklenti kullanmasına izin verme</translation>
 <translation id="1879449842763884566">Uygulamalar'a yükle...</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" sertifikası silinsin mi?</translation>
-<translation id="188190999506226223"><ph name="PASSWORD_MANAGER_BRAND" /> İçin Kullandığınız Şifrenin <ph name="ORIGIN" /> Tarafından Kaydedilmesini İster misiniz?</translation>
+<translation id="188190999506226223"><ph name="ORIGIN" /> İçin Kullandığınız Şifrenin <ph name="PASSWORD_MANAGER_BRAND" /> Tarafından Kaydedilmesini İster misiniz?</translation>
 <translation id="1886996562706621347">Sitelerin, protokoller için varsayılan işleyiciler olmasını sormasına izin ver (önerilir)</translation>
 <translation id="1887442540531652736">Oturum açma hatası</translation>
 <translation id="1887850431809612466">Donanım düzeltmesi</translation>
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">Araçlar menüsünden Uzantılar'ı tıklayarak uzantılarınızı yönetin.</translation>
 <translation id="2359808026110333948">Devam Et</translation>
 <translation id="236141728043665931">Mikrofon erişimini her zaman engelle</translation>
+<translation id="2365507699358342471">Bu site, panoya kopyalanan metin ve resimleri görebilir.</translation>
 <translation id="2367972762794486313">Uygulamaları göster</translation>
 <translation id="2371076942591664043">İşlem tamamlandığın&amp;da aç</translation>
 <translation id="2377319039870049694">Liste görünümüne geç</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">Bir web sayfasında Sekme tuşuna basıldığında bağlantılar ve form alanları vurgulanır</translation>
 <translation id="2916745397441987255">Uzantılarda ara</translation>
 <translation id="2921081876747860777">Yerel verilerinizi korumak için lütfen bir şifre oluşturun.</translation>
-<translation id="2924395203970765374"><ph name="FULL_NAME" /> ile senkronize edildi</translation>
 <translation id="2925966894897775835">E-Tablolar</translation>
 <translation id="2927017729816812676">Önbellek Depolama Alanı</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Çocuklar için hesap)</translation>
@@ -1357,7 +1357,7 @@
 <translation id="3038612606416062604">Manuel olarak yazıcı ekleyin</translation>
 <translation id="3038675903128704560">Sitelerin bilgisayarıma erişmek için eklenti kullanmasına izin verme</translation>
 <translation id="3039828483675273919">$1 öğe taşınıyor...</translation>
-<translation id="3045447014237878114">Bu site otomatik olarak birden fazla dosya indirdi</translation>
+<translation id="3045447014237878114">Bu site birden fazla dosyayı otomatik olarak indirdi</translation>
 <translation id="304567287000691532">Ekran paylaşılıyor</translation>
 <translation id="3046910703532196514">Web Sayfası, Tamamı</translation>
 <translation id="304826556400666995">Sekmelerin Sesini Aç</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">Tebrikler</translation>
 <translation id="3349933790966648062">Kullanılan Bellek Miktarı</translation>
 <translation id="3353984535370177728">Yüklemek için bir klasör seçin</translation>
-<translation id="335581015389089642">Konuşma</translation>
 <translation id="3355936511340229503">Bağlantı hatası</translation>
 <translation id="3356797067524893661">Artık Hangouts Meet'e devam edebilirsiniz</translation>
 <translation id="3358935496594837302">Telefonunuz bulunamıyor. Uyumlu bir Android telefon kullandığınızdan, ayrıca telefonunuzun açık ve yakında olduğundan emin olun. &lt;a&gt;Daha fazla bilgi&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">Yeni sekmede &amp;aç</translation>
 <translation id="3616113530831147358">Ses</translation>
 <translation id="3616741288025931835">Tarama Verilerini &amp;Temizle...</translation>
-<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” Araması Yap</translation>
 <translation id="3620292326130836921">Tümü yedeklendi!</translation>
 <translation id="3623574769078102674">Denetlenen bu kullanıcı <ph name="MANAGER_EMAIL" /> tarafından yönetilecek.</translation>
 <translation id="3625258641415618104">Ekran görüntüleri devre dışı</translation>
@@ -2144,7 +2142,6 @@
 <translation id="428565720843367874">Virüsten koruma yazılımı, bu dosyayı tararken beklenmedik bir şekilde başarısız oldu.</translation>
 <translation id="428608937826130504">Raf öğesi 8</translation>
 <translation id="4287502004382794929">Bu cihazı kaydetmek için yeterli yazılım lisansına sahip değilsiniz. Daha fazla yazılım satın almak için lütfen satış birimiyle bağlantı kurun. Bu mesajın görüntülenmesinin hata olduğunu düşünüyorsanız, lütfen destekle bağlantı kurun.</translation>
-<translation id="4289300219472526559">Konuşmaya Başla</translation>
 <translation id="4289540628985791613">Genel bakış</translation>
 <translation id="4296575653627536209">Denetlenen Kullanıcı Ekle</translation>
 <translation id="4297322094678649474">Dilleri Değiştir</translation>
@@ -2241,7 +2238,7 @@
 <translation id="4478664379124702289">Bağl&amp;antıyı Farklı Kaydet...</translation>
 <translation id="4479424953165245642">Kiosk uygulamalarını yönet</translation>
 <translation id="4479639480957787382">Ethernet</translation>
-<translation id="4480590691557335796">Chrome, bilgisayarınızda zararlı yazılımları bulabilir ve kaldırabilir</translation>
+<translation id="4480590691557335796">Chrome, bilgisayarınızdaki zararlı yazılımları bulabilir ve kaldırabilir</translation>
 <translation id="4481249487722541506">Paketi açılmış uzantı yükle...</translation>
 <translation id="4481530544597605423">Eşlemesi kaldırılmış cihazlar</translation>
 <translation id="4482194545587547824">Google, Arama ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi kullanabilir</translation>
@@ -2405,6 +2402,7 @@
 <translation id="4748762018725435655">Chrome Web Store'dan bir uzantı gerektiriyor</translation>
 <translation id="4750394297954878236">Öneriler</translation>
 <translation id="475088594373173692">İlk kullanıcı</translation>
+<translation id="4751476147751820511">Hareket veya ışık sensörleri</translation>
 <translation id="4756378406049221019">Durdur/Tekrar yükle</translation>
 <translation id="4756388243121344051">&amp;Geçmiş</translation>
 <translation id="4759238208242260848">İndirilenler</translation>
@@ -2439,7 +2437,6 @@
 <translation id="4813512666221746211">Ağ hatası</translation>
 <translation id="4816492930507672669">Sayfaya sığdır</translation>
 <translation id="4820334425169212497">Hayır, görmüyorum</translation>
-<translation id="4821725298388681253">Bu, erken bir sürümdür. Arama ve metin girişi gibi bazı özellikler henüz kullanılamaz.</translation>
 <translation id="4821935166599369261">&amp;Profil Oluşturma Etkin</translation>
 <translation id="4823484602432206655">Kullanıcı ve cihaz ayarlarını okuma ve değiştirme</translation>
 <translation id="4823651846660089135">Cihaz salt okunur</translation>
@@ -2656,7 +2653,7 @@
 <translation id="5143374789336132547">"<ph name="EXTENSION_NAME" />" uzantısı Ana Sayfa düğmesini tıkladığınızda gösterilecek sayfayı değiştirdi.</translation>
 <translation id="5143712164865402236">Tam Ekrana Geç</translation>
 <translation id="5145331109270917438">Değiştirilme tarihi</translation>
-<translation id="514575469079499857">Konumu belirlemek için IP adresiniz kullanılsın (varsayılan)</translation>
+<translation id="514575469079499857">Konumu belirlemek için IP adresinizi kullanın (varsayılan)</translation>
 <translation id="5150254825601720210">Netscape Sertifikası SSL Sunucu Adı</translation>
 <translation id="5151354047782775295">Disk alanını boşaltmazsanız bazı veriler otomatik olarak silinebilir</translation>
 <translation id="5153297660536091054">PIN ile Kilit Açma Özelliği</translation>
@@ -2961,7 +2958,7 @@
 <translation id="5596627076506792578">Diğer seçenekler</translation>
 <translation id="5600706100022181951">Güncellemeyi indirmek için <ph name="UPDATE_SIZE_MB" /> MB mobil veri kullanılacak. Devam etmek istiyor musunuz?</translation>
 <translation id="5601503069213153581">PIN</translation>
-<translation id="5605057818926354551">Bu Siteye Ait Şifrenizin <ph name="PASSWORD_MANAGER_BRAND" /> Tarafından Güncellenmesini İster misiniz?</translation>
+<translation id="5605057818926354551">Bu Site İçin şifrenizin <ph name="PASSWORD_MANAGER_BRAND" /> Tarafından Güncellenmesini İster misiniz?</translation>
 <translation id="5605623530403479164">Diğer arama motorları</translation>
 <translation id="5608580678041221894">Kırpma alanını ayarlamak veya taşımak için aşağıdaki tuşlara dokunun</translation>
 <translation id="5609231933459083978">Uygulamanın geçersiz olduğu görülüyor.</translation>
@@ -3147,7 +3144,7 @@
 <translation id="5882919346125742463">Bilinen Ağlar</translation>
 <translation id="5884474295213649357">Bu sekme bir USB cihazına bağlı.</translation>
 <translation id="5885324376209859881">Medya ayarlarını yönet...</translation>
-<translation id="5887341066363321040"><ph name="ORIGIN" /> İçin Hiç Şifre Kaydedilmedi</translation>
+<translation id="5887341066363321040"><ph name="ORIGIN" /> İçin Şifre Kaydedilmedi</translation>
 <translation id="5889282057229379085">Ara CA sayısı üst sınırı: <ph name="NUM_INTERMEDIATE_CA" /></translation>
 <translation id="5895138241574237353">Yeniden başlat</translation>
 <translation id="5895187275912066135">Verildiği Tarih</translation>
@@ -3451,7 +3448,6 @@
 <translation id="6388771388956873507">Cihazınızın parmak izi sensörünü bulun ve parmağınızla sensöre dokunun</translation>
 <translation id="6390799748543157332">Bu pencerede görüntülediğiniz sayfalar, göz atma geçmişinde görünmez ve açık olan tüm Misafir pencerelerini kapattığınızda bilgisayarda çerez gibi başka izler bırakmaz. Ancak indirdiğiniz dosyalar saklanır.</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Sistem bilgileri<ph name="END_LINK1" /> ve <ph name="BEGIN_LINK2" />metrikleri<ph name="END_LINK2" /> gönder</translation>
-<translation id="6397363302884558537">Konuşmayı Durdur</translation>
 <translation id="6397592254427394018">&amp;Tüm yer işaretlerini gizli pencerede aç</translation>
 <translation id="6398715114293939307">Google Play Store'u kaldır</translation>
 <translation id="6398765197997659313">Tam ekrandan çık</translation>
@@ -3601,7 +3597,7 @@
 <translation id="6613452264606394692">Bu sayfaya yer işareti koyarak buraya hızlıca geri dönün</translation>
 <translation id="6615455863669487791">Göster</translation>
 <translation id="661719348160586794">Kaydedilmiş şifreleriniz burada görünür.</translation>
-<translation id="6618097958368085618">Korumaya Devam Et</translation>
+<translation id="6618097958368085618">Yine de Tut</translation>
 <translation id="6619058681307408113">Satır Yazıcı Arka Plan Programı (LPD)</translation>
 <translation id="6619801788773578757">Kiosk uygulaması ekle</translation>
 <translation id="6619990499523117484">PIN'inizi onaylayın</translation>
@@ -3632,7 +3628,7 @@
 <translation id="6659594942844771486">Sekme</translation>
 <translation id="6664237456442406323">Maalesef bilgisayarınız, hatalı oluşturulmuş bir donanım kimliğiyle yapılandırılmış. Bu durum Chrome OS'nin en son güvenlik düzeltmeleriyle güncellenmesini engeller ve bilgisayarınız <ph name="BEGIN_BOLD" />kötü niyetli saldırılara<ph name="END_BOLD" /> açık duruma gelebilir.</translation>
 <translation id="6664774537677393800">Profiliniz açılırken bir sorun oluştu. Lütfen oturumu kapatıp sonra tekrar oturum açın.</translation>
-<translation id="6669827579181361875">Bu Siteye Ait Şifrenizin <ph name="PASSWORD_MANAGER_BRAND" /> Tarafından Kaydedilmesini İster misiniz?</translation>
+<translation id="6669827579181361875">Bu Site İçin Şifrenizin <ph name="PASSWORD_MANAGER_BRAND" /> Tarafından Kaydedilmesini İster misiniz?</translation>
 <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation>
 <translation id="667517062706956822">Google'ın bu sayfayı <ph name="SOURCE_LANGUAGE" /> dilinden <ph name="TARGET_LANGUAGE" /> diline çevirmesini istiyor musunuz?</translation>
 <translation id="6675665718701918026">İşaretleme cihazı bağlı</translation>
@@ -3956,7 +3952,7 @@
 <translation id="7189234443051076392">Cihazınızda yeterli alan bulunduğundan emin olun</translation>
 <translation id="7191159667348037">Bilinmeyen Yazıcı (USB)</translation>
 <translation id="7191454237977785534">Dosyayı farklı kaydet</translation>
-<translation id="7193374945610105795"><ph name="ORIGIN" /> için hiç şifre kaydedilmedi</translation>
+<translation id="7193374945610105795"><ph name="ORIGIN" /> için şifre kaydedilmedi</translation>
 <translation id="7196835305346730603">Yakınlardaki Chromebox'ları arıyor...</translation>
 <translation id="7199158086730159431">&amp;Yardım Al</translation>
 <translation id="720110658997053098">Bu cihazı kalıcı olarak kiosk modunda tut</translation>
@@ -4024,6 +4020,7 @@
 <translation id="7297443947353982503">Kullanıcı adı/şifre yanlış veya EAP yetkilendirmesi başarısız oldu</translation>
 <translation id="729761647156315797">Dilinizi ve klavyenizi seçin</translation>
 <translation id="7299337219131431707">Misafir olarak göz atmayı etkinleştir</translation>
+<translation id="7303900363563182677">Bu sitenin panoya kopyalanan metin ve resimleri görmesi engellendi</translation>
 <translation id="730515362922783851">Yerel ağ veya İnternet üzerindeki herhangi bir cihazla veri alışverişi</translation>
 <translation id="7308002049209013926">Yeni uygulamalara ve etkinliklere hızlıca ulaşmak için Launcher'ı kullanın. Klavyeyle buraya ulaşmak için Alt + Üst Karakter + L tuşlarına basın.</translation>
 <translation id="7309257895202129721">Denetimleri &amp;göster</translation>
@@ -4405,6 +4402,7 @@
 <translation id="7909969815743704077">Gizli modda indirildi</translation>
 <translation id="7910768399700579500">&amp;Yeni klasör</translation>
 <translation id="7912080627461681647">Şifreniz sunucuda değiştirildi. Lütfen oturumu kapatıp tekrar açın.</translation>
+<translation id="7912883689016444961">Mobil ağı yapılandır</translation>
 <translation id="7915471803647590281">Geri bildirimi göndermeden önce lütfen bize ne olduğunu söyleyin.</translation>
 <translation id="7925247922861151263">AAA kontrolü başarısız oldu</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> bekleniyor...</translation>
@@ -4799,7 +4797,7 @@
 <translation id="8569682776816196752">Hiçbir hedef bulunamadı</translation>
 <translation id="8569764466147087991">Açılacak dosyayı seçin</translation>
 <translation id="8571213806525832805">Son 4 hafta</translation>
-<translation id="8571613743082299268">Siteye yönlendirme engellendi</translation>
+<translation id="8571613743082299268">Şu web sitesine yönlendirme engellendi:</translation>
 <translation id="8574990355410201600"><ph name="HOST" /> sitesinde sese her zaman izin ver</translation>
 <translation id="8578639784464423491">99 harften uzun olamaz</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> öğe senkronize ediliyor...</translation>
@@ -4833,7 +4831,7 @@
 <translation id="8628085465172583869">Sunucu ana makine adı:</translation>
 <translation id="8630903300770275248">Denetlenen kullanıcıyı içe aktar</translation>
 <translation id="8631032106121706562">Çiçek</translation>
-<translation id="8637542770513281060">Bilgisayarınızda, Chrome OS'taki pek çok kritik güvenlik özelliğini uygulamak için kullanılan bir güvenli modül bulunmaktadır. Daha fazla bilgi edinmek için Chromebook Yardım Merkezi'ni ziyaret edin: https://support.google.com/chromebook/?p=sm</translation>
+<translation id="8637542770513281060">Bilgisayarınızda, Chrome OS'teki pek çok kritik güvenlik özelliğini uygulamak için kullanılan bir güvenli modül bulunmaktadır. Daha fazla bilgi edinmek için Chromebook Yardım Merkezi'ni ziyaret edin: https://support.google.com/chromebook/?p=sm</translation>
 <translation id="8637688295594795546">Kullanılabilir sistem güncellemesi mevcut. İndirmeye hazırlanılıyor...</translation>
 <translation id="8639047128869322042">Zararlı yazılımlar denetleniyor...</translation>
 <translation id="8639963783467694461">Otomatik doldurma ayarları</translation>
@@ -4916,6 +4914,7 @@
 <translation id="8736288397686080465">Bu site arka planda güncellendi.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> yerine <ph name="PROTOCOL" /> bağlantılarını açma</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">Pencere İçinde Pencere</translation>
 <translation id="8743864605301774756">1 saat önce güncellendi</translation>
 <translation id="8749863574775030885">Bilinmeyen bir tedarikçinin USB cihazlarına erişme</translation>
 <translation id="8754200782896249056">&lt;p&gt;<ph name="PRODUCT_NAME" />, desteklenen bir masaüstü ortamında çalışırken sistem proxy ayarları kullanılır. Ancak, ya sisteminiz desteklenmiyor ya da sistem yapılandırmanız başlatılırken bir hata oluştu.&lt;/p&gt;
@@ -5018,7 +5017,6 @@
 <translation id="8912793549644936705">Uzat</translation>
 <translation id="8915370057835397490">Öneriler yükleniyor</translation>
 <translation id="8916476537757519021">Gizli Alt Çerçeve: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831"><ph name="ACCOUNT_FULL_NAME" /> hesabıyla senkronize edin</translation>
 <translation id="8922013791253848639">Bu sitede her zaman reklamlara izin ver</translation>
 <translation id="8925458182817574960">&amp;Ayarlar</translation>
 <translation id="8926389886865778422">Bir daha sorma</translation>
@@ -5199,7 +5197,7 @@
 <translation id="932327136139879170">Ana Sayfa</translation>
 <translation id="932508678520956232">Yazdırma başlatılamadı.</translation>
 <translation id="93393615658292258">Yalnızca şifre</translation>
-<translation id="934503638756687833">Gerekirse, burada listelenmeyen öğeler de kaldırılacaktır. &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="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="936801553271523408">Sistem teşhis verileri</translation>
 <translation id="93766956588638423">Uzantıyı onar</translation>
@@ -5213,7 +5211,7 @@
 <translation id="942954117721265519">Bu dizinde resim yok.</translation>
 <translation id="945522503751344254">Geri bildirim gönder</translation>
 <translation id="952992212772159698">Etkin değil</translation>
-<translation id="957960681186851048">Bu site otomatik olarak birden fazla dosya indirmeye çalıştı</translation>
+<translation id="957960681186851048">Bu site birden fazla dosyayı otomatik olarak indirmeye çalıştı</translation>
 <translation id="9580706199804957">Google hizmetlerine bağlanamadı</translation>
 <translation id="958515377357646513">İlerlemek için dokunun.</translation>
 <translation id="960719561871045870">Operatör kodu</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index c40a5ae..49c48200 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">За допомогою клавіші Tab можна виділяти посилання та поля форми на веб-сторінці</translation>
 <translation id="2916745397441987255">Пошук у розширеннях</translation>
 <translation id="2921081876747860777">Створіть пароль, щоб захистити дані на пристрої.</translation>
-<translation id="2924395203970765374">Синхронізовано з обліковим записом користувача <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Таблиці</translation>
 <translation id="2927017729816812676">Кеш-пам’ять</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (обліковий запис для дітей)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Вітаємо</translation>
 <translation id="3349933790966648062">Використання пам’яті</translation>
 <translation id="3353984535370177728">Виберіть папку для завантаження</translation>
-<translation id="335581015389089642">Speech</translation>
 <translation id="3355936511340229503">Помилка з’єднання</translation>
 <translation id="3356797067524893661">Готово. Можете перейти в Hangouts Meet</translation>
 <translation id="3358935496594837302">Не вдається знайти телефон. Переконайтеся, що ваш телефон Android сумісний, увімкнений і розташований поблизу. &lt;a&gt;Докладніше&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Відкрити в новій вкладці</translation>
 <translation id="3616113530831147358">Звук</translation>
 <translation id="3616741288025931835">&amp;Очистити дані веб-перегляду...</translation>
-<translation id="3618849550573277856">Шукати "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="3620292326130836921">Усі файли імпортовано!</translation>
 <translation id="3623574769078102674">Цим контрольованим користувачем буде керувати користувач <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Знімки екрана вимкнено</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Під час сканування цього файлу сталася неочікувана помилка антивірусного програмного забезпечення.</translation>
 <translation id="428608937826130504">Елемент полиці 8</translation>
 <translation id="4287502004382794929">У вас недостатньо ліцензій на використання програмного забезпечення для реєстрації цього пристрою. Зв’яжіться з продавцем, щоб придбати додаткові ліцензії. Якщо ви вважаєте, що це повідомлення з’явилося помилково, зв’яжіться зі службою підтримки.</translation>
-<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4289540628985791613">Огляд</translation>
 <translation id="4296575653627536209">Додати контрольованого користувача</translation>
 <translation id="4297322094678649474">Змінити мови</translation>
@@ -2441,7 +2437,6 @@
 <translation id="4813512666221746211">Помилка мережі</translation>
 <translation id="4816492930507672669">За розміром сторінки</translation>
 <translation id="4820334425169212497">Ні</translation>
-<translation id="4821725298388681253">Це попередній випуск. Деякі функції, як-от пошук і введення тексту, ще не доступні.</translation>
 <translation id="4821935166599369261">&amp;Профілювання ввімкнено</translation>
 <translation id="4823484602432206655">Переглядати та змінювати налаштування користувача й пристрою</translation>
 <translation id="4823651846660089135">Пристрій лише для перегляду</translation>
@@ -3452,7 +3447,6 @@
 <translation id="6388771388956873507">Знайдіть на пристрої сканер відбитків пальців і торкніться його</translation>
 <translation id="6390799748543157332">Сторінки, які ви переглядаєте в цьому вікні, не відображатимуться в історії веб-переглядача, а після закривання всіх вікон, відкритих у гостьовому режимі, не залишать у комп’ютері інших слідів, наприклад файлів cookie. Однак завантажені файли зберігаються.</translation>
 <translation id="6395423953133416962">Надсилати <ph name="BEGIN_LINK1" />інформацію про систему<ph name="END_LINK1" /> та <ph name="BEGIN_LINK2" />показники<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6397592254427394018">Відкрити всі закладки в &amp;анонімному вікні</translation>
 <translation id="6398715114293939307">Вилучити Google Play Маркет</translation>
 <translation id="6398765197997659313">Вийти з повноекранного режиму</translation>
@@ -5022,7 +5016,6 @@
 <translation id="8912793549644936705">Розтягнути</translation>
 <translation id="8915370057835397490">Завантаження пропозиції</translation>
 <translation id="8916476537757519021">Додатковий анонімний фрейм: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Синхронізувати з обліковим записом користувача <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Завжди дозволяти показ реклами на цьому сайті</translation>
 <translation id="8925458182817574960">&amp;Налаштування</translation>
 <translation id="8926389886865778422">Не запитувати знову</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 1f181882..97dcf56b 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1270,7 +1270,6 @@
 <translation id="2916073183900451334">Bấm Tab trên liên kết đánh dấu của trang web, cũng như các trường biểu mẫu</translation>
 <translation id="2916745397441987255">Tìm kiếm trong tiện ích</translation>
 <translation id="2921081876747860777">Vui lòng tạo mật khẩu để bảo vệ dữ liệu cục bộ của bạn.</translation>
-<translation id="2924395203970765374">Đã được đồng bộ hóa với <ph name="FULL_NAME" /></translation>
 <translation id="2925966894897775835">Bảng tính</translation>
 <translation id="2927017729816812676">Bộ nhớ đệm</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (Tài khoản cho trẻ em)</translation>
@@ -1553,7 +1552,6 @@
 <translation id="3348459612390503954">Xin chúc mừng</translation>
 <translation id="3349933790966648062">Mức sử dụng bộ nhớ</translation>
 <translation id="3353984535370177728">Chọn thư mục để tải lên</translation>
-<translation id="335581015389089642">Giọng nói</translation>
 <translation id="3355936511340229503">Lỗi kết nối</translation>
 <translation id="3356797067524893661">Bạn đã thiết lập xong và sẵn sàng tiếp tục với Hangouts Meet</translation>
 <translation id="3358935496594837302">Không thể tìm thấy điện thoại của bạn. Hãy đảm bảo rằng bạn đang sử dụng điện thoại Android tương thích được bật và ở trong tầm tay. &lt;a&gt;Tìm hiểu thêm&lt;/a&gt;</translation>
@@ -1730,7 +1728,6 @@
 <translation id="3613422051106148727">&amp;Mở trong tab mới</translation>
 <translation id="3616113530831147358">Âm thanh</translation>
 <translation id="3616741288025931835">&amp;Xoá Dữ liệu Duyệt web...</translation>
-<translation id="3618849550573277856">Tra cứu “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">Đã sao lưu tất cả!</translation>
 <translation id="3623574769078102674">Người dùng bị giám sát này sẽ được quản lý bởi <ph name="MANAGER_EMAIL" />.</translation>
 <translation id="3625258641415618104">Đã tắt chụp ảnh màn hình</translation>
@@ -2145,7 +2142,6 @@
 <translation id="428565720843367874">Phần mềm chống vi-rút bị lỗi bất ngờ khi đang quét tệp này.</translation>
 <translation id="428608937826130504">Mục giá 8</translation>
 <translation id="4287502004382794929">Bạn không có đủ giấy phép phần mềm để đăng ký thiết bị này. Vui lòng liên hệ với bộ phận bán hàng để mua thêm. Nếu bạn nhận được thư này do nhầm lẫn, vui lòng liên hệ với bộ phận hỗ trợ.</translation>
-<translation id="4289300219472526559">Bắt đầu nói</translation>
 <translation id="4289540628985791613">Tổng quan</translation>
 <translation id="4296575653627536209">Thêm người dùng được giám sát</translation>
 <translation id="4297322094678649474">Thay đổi ngôn ngữ</translation>
@@ -2440,7 +2436,6 @@
 <translation id="4813512666221746211">Lỗi mạng</translation>
 <translation id="4816492930507672669">Vừa với trang</translation>
 <translation id="4820334425169212497">Không, tôi không thấy mã</translation>
-<translation id="4821725298388681253">Đây là bản phát hành sớm. Một số tính năng, như tìm kiếm và nhập văn bản, vẫn chưa sử dụng được.</translation>
 <translation id="4821935166599369261">&amp;Bật cấu hình</translation>
 <translation id="4823484602432206655">Đọc và thay đổi cài đặt người dùng và thiết bị</translation>
 <translation id="4823651846660089135">Thiết bị chỉ đọc</translation>
@@ -3451,7 +3446,6 @@
 <translation id="6388771388956873507">Tìm cảm biến vân tay trên thiết bị của bạn và chạm vào bằng ngón tay</translation>
 <translation id="6390799748543157332">Những trang bạn xem trong cửa sổ này sẽ không xuất hiện trong lịch sử trình duyệt và sẽ không để lại các dấu vết khác như cookie trên máy tính sau khi bạn đóng tất cả cửa sổ Khách đang mở. Tuy nhiên, bất kỳ tệp nào bạn tải xuống cũng sẽ được giữ nguyên.</translation>
 <translation id="6395423953133416962">Gửi <ph name="BEGIN_LINK1" />thông tin hệ thống<ph name="END_LINK1" /> và <ph name="BEGIN_LINK2" />số liệu<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Dừng nói</translation>
 <translation id="6397592254427394018">Mở tất cả dấu trang trong &amp;cửa sổ ẩn danh</translation>
 <translation id="6398715114293939307">Xóa Cửa hàng Google Play</translation>
 <translation id="6398765197997659313">Thoát khỏi chế độ toàn màn hình</translation>
@@ -5018,7 +5012,6 @@
 <translation id="8912793549644936705">Kéo dãn</translation>
 <translation id="8915370057835397490">Đang tải đề xuất</translation>
 <translation id="8916476537757519021">Khung ẩn danh phụ: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">Đồng bộ hóa với <ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">Luôn cho phép quảng cáo trên trang web này</translation>
 <translation id="8925458182817574960">&amp;Cài đặt</translation>
 <translation id="8926389886865778422">Đừng hỏi lại</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index f0f3bb7..9c75ba4 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -879,6 +879,7 @@
 <translation id="2359345697448000899">您可以通过点击“工具”菜单中的“扩展程序”,管理您的扩展程序。</translation>
 <translation id="2359808026110333948">继续</translation>
 <translation id="236141728043665931">始终禁止使用麦克风</translation>
+<translation id="2365507699358342471">此页面可以查看复制到剪贴板的文字和图片。</translation>
 <translation id="2367972762794486313">显示应用</translation>
 <translation id="2371076942591664043">完成时打开(&amp;D)</translation>
 <translation id="2377319039870049694">切换到列表视图</translation>
@@ -1265,7 +1266,6 @@
 <translation id="2916073183900451334">在网页上按 Tab 可突出显示链接以及表单字段</translation>
 <translation id="2916745397441987255">搜索扩展程序</translation>
 <translation id="2921081876747860777">请设置密码,以保护您的本地数据。</translation>
-<translation id="2924395203970765374">已同步到“<ph name="FULL_NAME" />”</translation>
 <translation id="2925966894897775835">表格</translation>
 <translation id="2927017729816812676">缓存空间</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" />(未成年人帐号)</translation>
@@ -1546,7 +1546,6 @@
 <translation id="3348459612390503954">恭喜</translation>
 <translation id="3349933790966648062">内存占用空间</translation>
 <translation id="3353984535370177728">选择要上传的文件夹</translation>
-<translation id="335581015389089642">语音</translation>
 <translation id="3355936511340229503">连接出错</translation>
 <translation id="3356797067524893661">大功告成!您现在便可开始使用 Hangouts Meet 了</translation>
 <translation id="3358935496594837302">找不到您的手机。请确保您使用的是兼容的 Android 手机,而且该手机正处于开机状态且就在您身边。&lt;a&gt;了解详情&lt;/a&gt;</translation>
@@ -1723,7 +1722,6 @@
 <translation id="3613422051106148727">在新标签页中打开(&amp;O)</translation>
 <translation id="3616113530831147358">音频</translation>
 <translation id="3616741288025931835">清除浏览数据(&amp;C)...</translation>
-<translation id="3618849550573277856">查询“<ph name="LOOKUP_STRING" />”</translation>
 <translation id="3620292326130836921">所有文件都已备份!</translation>
 <translation id="3623574769078102674">此受监管用户将由 <ph name="MANAGER_EMAIL" /> 管理。</translation>
 <translation id="3625258641415618104">已停用屏幕截图</translation>
@@ -2137,7 +2135,6 @@
 <translation id="428565720843367874">防病毒软件在扫描此文件时意外失败。</translation>
 <translation id="428608937826130504">栏中第 8 项</translation>
 <translation id="4287502004382794929">您没有足够的软件许可来注册此设备。请与销售代表联系,以购买更多软件许可。如果您认为自己不应看到此讯息,请与支持人员联系。</translation>
-<translation id="4289300219472526559">开始讲话</translation>
 <translation id="4289540628985791613">概述</translation>
 <translation id="4296575653627536209">添加受监管用户</translation>
 <translation id="4297322094678649474">更改语言</translation>
@@ -2398,6 +2395,7 @@
 <translation id="4748762018725435655">需要安装 Chrome 网上应用店中的扩展程序</translation>
 <translation id="4750394297954878236">建议</translation>
 <translation id="475088594373173692">第 1 位用户</translation>
+<translation id="4751476147751820511">动作或光传感器</translation>
 <translation id="4756378406049221019">停止/重新加载</translation>
 <translation id="4756388243121344051">历史记录(&amp;H)</translation>
 <translation id="4759238208242260848">下载内容</translation>
@@ -2432,7 +2430,6 @@
 <translation id="4813512666221746211">网络错误</translation>
 <translation id="4816492930507672669">适合页面大小</translation>
 <translation id="4820334425169212497">没看到</translation>
-<translation id="4821725298388681253">这是早期版本。某些功能(例如搜索和文本输入)尚在开发中。</translation>
 <translation id="4821935166599369261">分析已启用(&amp;P)</translation>
 <translation id="4823484602432206655">读取和更改用户设置与设备设置</translation>
 <translation id="4823651846660089135">设备目前处于只读模式</translation>
@@ -3437,7 +3434,6 @@
 <translation id="6388771388956873507">找到您设备上的指纹传感器并用手指触摸它</translation>
 <translation id="6390799748543157332">当您关闭以访客身份打开的所有窗口后,您在此窗口中浏览的网页将不会显示在浏览器历史记录中,也不会在计算机上留下其他痕迹(例如Cookie)。不过,您下载的所有文件均会保留下来。</translation>
 <translation id="6395423953133416962">发送<ph name="BEGIN_LINK1" />系统信息<ph name="END_LINK1" />和<ph name="BEGIN_LINK2" />指标<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">停止讲话</translation>
 <translation id="6397592254427394018">在隐身窗口中打开所有书签(&amp;I)</translation>
 <translation id="6398715114293939307">移除 Google Play 商店</translation>
 <translation id="6398765197997659313">退出全屏模式</translation>
@@ -4009,6 +4005,7 @@
 <translation id="7297443947353982503">用户名/密码错误或 EAP 身份验证失败</translation>
 <translation id="729761647156315797">选择语言和键盘</translation>
 <translation id="7299337219131431707">启用访客浏览</translation>
+<translation id="7303900363563182677">此网站已被阻止查看复制到剪贴板的文字和图片</translation>
 <translation id="730515362922783851">与本地网络或互联网中的任何设备交换数据</translation>
 <translation id="7308002049209013926">使用启动器快速访问新的应用和活动。若要通过键盘访问这些内容,请按 Alt + Shift + L 组合键。</translation>
 <translation id="7309257895202129721">显示控件(&amp;C)</translation>
@@ -4381,6 +4378,7 @@
 <translation id="7909969815743704077">已在隐身模式下进行下载</translation>
 <translation id="7910768399700579500">新建文件夹(&amp;N)</translation>
 <translation id="7912080627461681647">您已在服务器上更改密码。请先退出,然后重新登录。</translation>
+<translation id="7912883689016444961">配置移动网络</translation>
 <translation id="7915471803647590281">请先告诉我们所发生的情况,然后再发送反馈。</translation>
 <translation id="7925247922861151263">AAA 检查失败</translation>
 <translation id="7925285046818567682">正在等待 <ph name="HOST_NAME" /> 的响应...</translation>
@@ -4892,6 +4890,7 @@
 <translation id="8736288397686080465">此网站已在后台更新。</translation>
 <translation id="8737685506611670901">打开<ph name="PROTOCOL" />链接而非“<ph name="REPLACED_HANDLER_TITLE" />”</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">画中画</translation>
 <translation id="8743864605301774756">上次更新时间:1 小时前</translation>
 <translation id="8749863574775030885">访问来自未知供应商的 USB 设备</translation>
 <translation id="8754200782896249056">&lt;p&gt;在受支持的桌面环境中运行<ph name="PRODUCT_NAME" />时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。&lt;/p&gt;
@@ -4994,7 +4993,6 @@
 <translation id="8912793549644936705">拉伸</translation>
 <translation id="8915370057835397490">正在加载建议</translation>
 <translation id="8916476537757519021">隐身辅助框架:<ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">同步到帐号“<ph name="ACCOUNT_FULL_NAME" />”中</translation>
 <translation id="8922013791253848639">在此网站上始终允许显示广告</translation>
 <translation id="8925458182817574960">设置(&amp;S)</translation>
 <translation id="8926389886865778422">不再询问</translation>
@@ -5175,7 +5173,7 @@
 <translation id="932327136139879170">首页</translation>
 <translation id="932508678520956232">无法开始打印。</translation>
 <translation id="93393615658292258">仅限密码</translation>
-<translation id="934503638756687833">如有必要,此处未列出的条目也会被移除。请参阅 Chrome 隐私权政策白皮书,详细了解&lt;a href="<ph name="URL" />"&gt;垃圾软件防护&lt;/a&gt;。</translation>
+<translation id="934503638756687833">如有必要,此处未列出的内容也会被移除。请参阅 Chrome 隐私权政策白皮书,详细了解&lt;a href="<ph name="URL" />"&gt;垃圾软件防护&lt;/a&gt;。</translation>
 <translation id="935490618240037774">您的书签、历史记录、密码及其他设置均将同步到您的 Google 帐号,以便您在自己所有的设备上使用。</translation>
 <translation id="936801553271523408">系统诊断数据</translation>
 <translation id="93766956588638423">修复扩展程序</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index f63e019..3d6f9ba 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -882,6 +882,7 @@
 <translation id="2359345697448000899">如要管理擴充功能,只要按一下 [工具] 選單裡的 [擴充功能] 即可。</translation>
 <translation id="2359808026110333948">繼續</translation>
 <translation id="236141728043665931">一律封鎖存取麥克風</translation>
+<translation id="2365507699358342471">這個網站可以讀取已複製到剪貼簿的文字和圖片。</translation>
 <translation id="2367972762794486313">顯示應用程式</translation>
 <translation id="2371076942591664043">完成後開啟(&amp;D)</translation>
 <translation id="2377319039870049694">切換為清單檢視</translation>
@@ -957,7 +958,7 @@
 <translation id="249819058197909513">不要再顯示這個應用程式的相關警告訊息</translation>
 <translation id="2498539833203011245">最小化</translation>
 <translation id="2498765460639677199">最大</translation>
-<translation id="2499747912851752301">匯出密碼...</translation>
+<translation id="2499747912851752301">正在匯出密碼...</translation>
 <translation id="2500471369733289700">已封鎖權限,保護你的隱私</translation>
 <translation id="2501173422421700905">憑證保留中</translation>
 <translation id="2501278716633472235">返回</translation>
@@ -1269,7 +1270,6 @@
 <translation id="2916073183900451334">在網頁上按 Tab 鍵可反白顯示連結和表單欄位</translation>
 <translation id="2916745397441987255">搜尋擴充功能</translation>
 <translation id="2921081876747860777">請設定密碼,保護你的本機資料。</translation>
-<translation id="2924395203970765374">已和<ph name="FULL_NAME" />同步</translation>
 <translation id="2925966894897775835">試算表</translation>
 <translation id="2927017729816812676">快取儲存空間</translation>
 <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (兒童專用帳戶)</translation>
@@ -1552,7 +1552,6 @@
 <translation id="3348459612390503954">恭喜你</translation>
 <translation id="3349933790966648062">記憶體使用量</translation>
 <translation id="3353984535370177728">選取要上傳的資料夾</translation>
-<translation id="335581015389089642">語音</translation>
 <translation id="3355936511340229503">連線錯誤</translation>
 <translation id="3356797067524893661">設定程序已完成,現在可以開始使用 Hangouts Meet 了</translation>
 <translation id="3358935496594837302">找不到你的手機。請確定你使用的是相容的 Android 手機並已開機,且手機在適當距離範圍內。&lt;a&gt;瞭解詳情&lt;/a&gt;</translation>
@@ -1729,7 +1728,6 @@
 <translation id="3613422051106148727">在新分頁中開啟(&amp;O)</translation>
 <translation id="3616113530831147358">音訊</translation>
 <translation id="3616741288025931835">清除瀏覽資料(&amp;C)...</translation>
-<translation id="3618849550573277856">查詢「<ph name="LOOKUP_STRING" />」</translation>
 <translation id="3620292326130836921">所有檔案都已備份!</translation>
 <translation id="3623574769078102674">受監管的使用者將由 <ph name="MANAGER_EMAIL" /> 負責管理。</translation>
 <translation id="3625258641415618104">已停用螢幕擷取畫面</translation>
@@ -2052,7 +2050,7 @@
 <translation id="4107048419833779140">識別並退出儲存裝置</translation>
 <translation id="4109135793348361820">將視窗傳送給 <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110559665646603267">將焦點移至檔案櫃</translation>
-<translation id="4110895898888439383">用高對比模式瀏覽網路</translation>
+<translation id="4110895898888439383">以高對比模式瀏覽網路</translation>
 <translation id="4114360727879906392">上一個視窗</translation>
 <translation id="4115002065223188701">偵測不到網路</translation>
 <translation id="4115080753528843955">部分內容服務會使用唯一識別碼來授予受保護內容的存取權</translation>
@@ -2143,7 +2141,6 @@
 <translation id="428565720843367874">掃描這個檔案時,防毒軟體發生意外錯誤。</translation>
 <translation id="428608937826130504">檔案櫃項目 8</translation>
 <translation id="4287502004382794929">你的軟體授權量不足,無法註冊這個裝置。如要購買更多授權,請與銷售人員聯絡。如果你認為這則訊息有誤,請與支援小組聯絡。</translation>
-<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4289540628985791613">總覽</translation>
 <translation id="4296575653627536209">新增受監管的使用者</translation>
 <translation id="4297322094678649474">變更語言</translation>
@@ -2404,6 +2401,7 @@
 <translation id="4748762018725435655">需要來自 Chrome 線上應用程式商店的擴充功能</translation>
 <translation id="4750394297954878236">建議</translation>
 <translation id="475088594373173692">第一位使用者</translation>
+<translation id="4751476147751820511">動作或光源感應器</translation>
 <translation id="4756378406049221019">停止/重新載入</translation>
 <translation id="4756388243121344051">記錄(&amp;H)</translation>
 <translation id="4759238208242260848">下載</translation>
@@ -2438,7 +2436,6 @@
 <translation id="4813512666221746211">網路錯誤</translation>
 <translation id="4816492930507672669">依頁面大小自動調整</translation>
 <translation id="4820334425169212497">否,我沒有看到</translation>
-<translation id="4821725298388681253">這是初期版本,目前還不支援部分功能 (例如搜尋和輸入文字)。</translation>
 <translation id="4821935166599369261">分析已啟用(&amp;P)</translation>
 <translation id="4823484602432206655">讀取及變更使用者和裝置設定</translation>
 <translation id="4823651846660089135">裝置目前是唯讀模式</translation>
@@ -3448,7 +3445,6 @@
 <translation id="6388771388956873507">找到裝置上的指紋感應器,並以手指輕觸</translation>
 <translation id="6390799748543157332">你在這個視窗瀏覽的網頁不會顯示在瀏覽器紀錄中,而且在你關閉所有開啟的訪客視窗後,電腦也不會留下 Cookie 等其他紀錄。不過,系統將會保留你下載的所有檔案。</translation>
 <translation id="6395423953133416962">傳送<ph name="BEGIN_LINK1" />系統資訊<ph name="END_LINK1" />和<ph name="BEGIN_LINK2" />指標<ph name="END_LINK2" /></translation>
-<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6397592254427394018">在無痕式視窗中開啟所有書籤(&amp;I)</translation>
 <translation id="6398715114293939307">移除 Google Play 商店</translation>
 <translation id="6398765197997659313">退出全螢幕模式</translation>
@@ -3597,7 +3593,7 @@
 <translation id="6613452264606394692">將此頁加入書籤,方便你快速返回</translation>
 <translation id="6615455863669487791">顯示</translation>
 <translation id="661719348160586794">你已儲存的密碼會顯示在這裡。</translation>
-<translation id="6618097958368085618">仍要保留</translation>
+<translation id="6618097958368085618">確定保留</translation>
 <translation id="6619058681307408113">線上印表機服務精靈 (LPD)</translation>
 <translation id="6619801788773578757">新增 Kiosk 應用程式</translation>
 <translation id="6619990499523117484">確認你的 PIN 碼</translation>
@@ -4020,6 +4016,7 @@
 <translation id="7297443947353982503">使用者名稱/密碼錯誤或 EAP 驗證失敗</translation>
 <translation id="729761647156315797">選擇語言和鍵盤</translation>
 <translation id="7299337219131431707">啟用訪客瀏覽</translation>
+<translation id="7303900363563182677">這個網站無法讀取已複製到剪貼簿的文字和圖片</translation>
 <translation id="730515362922783851">與區域網路或網際網路中的任何裝置交換資料</translation>
 <translation id="7308002049209013926">使用啟動器快速存取新的應用程式和活動。如要使用鍵盤開啟這個畫面,請按下 Alt + Shift + L 鍵。</translation>
 <translation id="7309257895202129721">顯示控制介面(&amp;C)</translation>
@@ -4237,7 +4234,7 @@
 <translation id="7664620655576155379">不支援的藍牙裝置:「<ph name="DEVICE_NAME" />」。</translation>
 <translation id="7665369617277396874">新增帳戶</translation>
 <translation id="7671130400130574146">使用系統標題列及邊界</translation>
-<translation id="7672520070349703697"><ph name="PAGE_TITLE" /> 的 <ph name="HUNG_IFRAME_URL" />。</translation>
+<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> (在「<ph name="PAGE_TITLE" />」中)。</translation>
 <translation id="7683373461016844951">如要繼續操作,請依序點選 [確定] 和 [新增使用者],為你的 <ph name="DOMAIN" /> 電子郵件地址建立新的設定檔。</translation>
 <translation id="7684212569183643648">由您的管理員安裝</translation>
 <translation id="7684559058815332124">造訪監控式入口網站登入頁面</translation>
@@ -4398,6 +4395,7 @@
 <translation id="7909969815743704077">已在無痕模式中下載</translation>
 <translation id="7910768399700579500">新增資料夾(&amp;N)</translation>
 <translation id="7912080627461681647">伺服器上的密碼已變更。請先登出然後重新登入。</translation>
+<translation id="7912883689016444961">設定行動網路</translation>
 <translation id="7915471803647590281">請將發生的狀況告訴我們,然後再提供意見。</translation>
 <translation id="7925247922861151263">AAA 檢查失敗</translation>
 <translation id="7925285046818567682">正在等候 <ph name="HOST_NAME" />...</translation>
@@ -4909,6 +4907,7 @@
 <translation id="8736288397686080465">這個網站已在背景更新。</translation>
 <translation id="8737685506611670901">開啟<ph name="PROTOCOL" />連結 (取代 <ph name="REPLACED_HANDLER_TITLE" />)</translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8741316211671074806">子母畫面</translation>
 <translation id="8743864605301774756">1 小時前更新</translation>
 <translation id="8749863574775030885">存取製造商不明的 USB 裝置</translation>
 <translation id="8754200782896249056">&lt;p&gt;在受支援的桌面環境下執行「<ph name="PRODUCT_NAME" />」時,瀏覽器會使用系統的 Proxy 設定。不過,您的系統可能不受支援,或在啟動系統設定時發生問題。&lt;/p&gt;
@@ -5011,7 +5010,6 @@
 <translation id="8912793549644936705">延伸</translation>
 <translation id="8915370057835397490">正在載入建議</translation>
 <translation id="8916476537757519021">無痕模式子頁框:<ph name="SUBFRAME_SITE" /></translation>
-<translation id="8918468086406665831">同步到<ph name="ACCOUNT_FULL_NAME" /></translation>
 <translation id="8922013791253848639">一律允許在這個網站中顯示廣告</translation>
 <translation id="8925458182817574960">設定(&amp;S)</translation>
 <translation id="8926389886865778422">不再詢問這個問題</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index 4bfb2eb..a4d4f372 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -165,6 +165,7 @@
 <translation id="565744775970812598">Chrome блокира „<ph name="FILE_NAME" />“, тъй като файлът може да е опасен.</translation>
 <translation id="573759479754913123">Всичко за Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS се показва на този език</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Софтуерът, изпълняван на компютъра ви, е несъвместим с Google Chrome.</translation>
 <translation id="5877064549588274448">Каналът бе променен. Рестартирайте устройството си, за да се приложат промените.</translation>
 <translation id="5895138241574237353">Рестартиране</translation>
@@ -176,6 +177,7 @@
 <translation id="6070348360322141662">За повишаване на сигурността Google Chrome ще шифрова данните ви</translation>
 <translation id="6113794647360055231">Chrome се подобри</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome бета</translation>
 <translation id="61852838583753520">Актуализиране на &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Правило за Google Chrome за допускане на входящия трафик за mDNS.</translation>
 <translation id="6291089322031436445">Приложения за Chrome Dev</translation>
@@ -183,6 +185,7 @@
 <translation id="6338556085225130112">Google Chrome се актуализира</translation>
 <translation id="6368958679917195344">Chrome OS е възможна благодарение на допълнителен <ph name="BEGIN_LINK_CROS_OSS" />софтуер с отворен код<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Можете да ни помогнете да направим браузъра Chrome по-надежден и по-лесен за използване, като автоматично изпращате до Google системна информация и част от съдържанието на страниците, за да ни съдействате при откриването на опасни приложения и сайтове.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome се актуализира (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Използвате <ph name="PROFILE_EMAIL" /> за синхронизиране на нещата си в Chrome. За да актуализирате съответното предпочитание или да ползвате браузъра без профил в Google, посетете <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Копирано в Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index 12d55d2f..66864677 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -167,6 +167,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> বিপজ্জনক হতে পারে, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation>
 <translation id="573759479754913123">Chrome OS সম্পর্কে </translation>
 <translation id="5774845247549698882">Chrome OS এই ভাষায় প্রদর্শিত হচ্ছে</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">আপনার কম্পিউটারে যে সফটওয়্যারটি চলছে  সেটি Google Chrome এর সঙ্গে সঙ্গতিপূর্ণ নয়৷</translation>
 <translation id="5877064549588274448">চ্যানেল পরিবর্তিত হয়েছে৷ পরিবর্তনগুলি প্রয়োগ করার জন্য আপনার ডিভাইস আবার শুরু করুন৷</translation>
 <translation id="5895138241574237353">পুনর্সূচনা</translation>
@@ -178,6 +179,7 @@
 <translation id="6070348360322141662">অতিরিক্ত নিরাপত্তার জন্য, Google Chrome আপনার ডেটা এনক্রিপ্ট করবে</translation>
 <translation id="6113794647360055231">Chrome আরও ভাল হয়ে উঠেছে</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome বিটা</translation>
 <translation id="61852838583753520">&amp;Chrome OS আপডেট</translation>
 <translation id="6235018212288296708">mDNS ট্রাফিকের অনুমতি দিতে Google Chrome এর জন্য ইনবাউন্ড নিয়ম।</translation>
 <translation id="6291089322031436445">Chrome ডেভেলপার অ্যাপ</translation>
@@ -185,6 +187,7 @@
 <translation id="6338556085225130112">Google Chrome আপডেট করা হচ্ছে</translation>
 <translation id="6368958679917195344">Chrome OS সম্ভবত অতিরিক্ত <ph name="BEGIN_LINK_CROS_OSS" />মুক্ত উৎস সফ্টওয়্যার<ph name="END_LINK_CROS_OSS" /> দিয়ে তৈরি৷</translation>
 <translation id="6410540444482791104">বিপজ্জনক অ্যাপ্লিকেশান এবং সাইট সনাক্ত করতে সহায়তা দিতে স্বয়ংক্রিয়ভাবে কিছু তথ্য ও পৃষ্ঠা সামগ্রী Google এ পাঠানোর মাধ্যমে Chrome কে আরও নিরাপদ ও সহজে ব্যবহারযোগ্য করে তুলতে সাহায্য করতে পারেন।</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome আপডেট হচ্ছে (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">আপনার Chrome জিনিসপত্র সমন্বয় করার জন্য আপনি <ph name="PROFILE_EMAIL" /> ব্যবহার করছেন৷ আপনার সিঙ্ক পছন্দগুলি আপডেট করতে বা Google অ্যাকাউন্ট ছাড়া Chrome ব্যবহার করতে <ph name="SETTINGS_LINK" /> এ যান৷</translation>
 <translation id="6600954340915313787">Chrome-এ প্রতিলিপি করা হয়েছে</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 5a9eed3..4ba502e 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598">Chrome ha bloquejat <ph name="FILE_NAME" /> perquè pot ser perillós.</translation>
 <translation id="573759479754913123">Sobre Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS es mostra en aquest idioma</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">El programari que s'executa al vostre ordinador no és compatible amb Google Chrome.</translation>
 <translation id="5877064549588274448">El canal ha canviat. Reinicieu el dispositiu perquè s'apliquin els canvis.</translation>
 <translation id="5895138241574237353">Reinicia</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">Per a més seguretat, Google Chrome encriptarà les teves dades</translation>
 <translation id="6113794647360055231">Chrome és millor que mai</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome Beta</translation>
 <translation id="61852838583753520">Actualitza &amp;SO Chrome</translation>
 <translation id="6235018212288296708">Regla d'entrada de Google Chrome per permetre el trànsit de mDNS.</translation>
 <translation id="6291089322031436445">Aplicacions de Chrome Dev</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">S'està actualitzant Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS és possible gràcies a <ph name="BEGIN_LINK_CROS_OSS" />programari addicional de codi obert<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Per fer que Chrome sigui més segur i més fàcil d'utilitzar, envia automàticament algunes dades del sistema i contingut de les pàgines a Google per ajudar a detectar les aplicacions i els llocs perillosos.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">S'està actualitzant Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Utilitzeu <ph name="PROFILE_EMAIL" /> per sincronitzar el contingut de Chrome. Per modificar la preferència de sincronització o per utilitzar Chrome sense cap compte de Google, dirigiu-vos a <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Copiada de Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 73c7de9..301c7cb2 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598">Soubor <ph name="FILE_NAME" /> může být nebezpečný, proto jej Chrome zablokoval.</translation>
 <translation id="573759479754913123">O operačním systému Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS se zobrazuje v tomto jazyce</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Software spuštěný v počítači není kompatibilní s prohlížečem Google Chrome.</translation>
 <translation id="5877064549588274448">Verze byla změněna. Změny se projeví po restartování zařízení.</translation>
 <translation id="5895138241574237353">Restartovat</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">V zájmu lepšího zabezpečení bude Google Chrome vaše data šifrovat</translation>
 <translation id="6113794647360055231">Chrome je opět o něco lepší</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">Aktualizace operačního systému &amp;Chrome</translation>
 <translation id="6235018212288296708">Pravidlo příchozího provozu pro aplikaci Google Chrome, které povolí provoz mDNS.</translation>
 <translation id="6291089322031436445">Chrome Dev – aplikace</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Aktualizace prohlížeče Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS by nemohl existovat bez dalšího <ph name="BEGIN_LINK_CROS_OSS" />softwaru s otevřeným zdrojovým kódem<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Automatickým hlášením některých informací o systému a obsahu stránek do Googlu můžete pomoci rozpoznávat nebezpečné aplikace a weby a zvýšit tak bezpečnost prohlížeče Chrome a usnadnit jeho používání.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Aktualizace prohlížeče Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Synchronizujete obsah a nastavení Chrome s účtem <ph name="PROFILE_EMAIL" />. Chcete-li možnosti synchronizace upravit nebo Chrome používat bez účtu Google, navštivte <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Zkopírováno do Chromu</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index e74ca099..f4b12f7 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -112,7 +112,7 @@
 <translation id="4028693306634653894">Schneller Zugriff auf Chrome</translation>
 <translation id="4050175100176540509">Wichtige Sicherheitsverbesserungen und neue Funktionen sind in der aktuellen Version verfügbar.</translation>
 <translation id="4053720452172726777">Google Chrome anpassen und einstellen</translation>
-<translation id="4143243756087420366">Name und Bild des Chrome-Profils</translation>
+<translation id="4143243756087420366">Chrome-Name und -Bild</translation>
 <translation id="4147555960264124640">Sie melden sich mit einem verwalteten Konto an und ermöglichen dessen Administrator Zugriff auf Ihr Google Chrome-Profil. Ihre Chrome-Daten, wie Apps, Lesezeichen, Verlauf, Passwörter und andere Einstellungen, werden dauerhaft mit <ph name="USER_NAME" /> verknüpft. Sie können diese Daten über das Google Konten-Dashboard löschen, aber nicht mit einem anderen Konto verknüpfen. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">Das Installationsprogramm konnte das Archiv nicht dekomprimieren. Laden Sie Google Chrome erneut herunter.</translation>
 <translation id="4251615635259297716">Ihre Chrome-Daten mit diesem Konto verknüpfen?</translation>
@@ -163,6 +163,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> ist möglicherweise schädlich und wurde daher von Chrome blockiert.</translation>
 <translation id="573759479754913123">Über Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS wird in dieser Sprache angezeigt</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Auf Ihrem Computer befindet sich Software, die nicht mit Google Chrome kompatibel ist.</translation>
 <translation id="5877064549588274448">Kanal wurde geändert. Starten Sie Ihr Gerät neu, um die Änderungen zu übernehmen.</translation>
 <translation id="5895138241574237353">Neu starten</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">Google Chrome verschlüsselt Ihre Daten zur Erhöhung der Sicherheit</translation>
 <translation id="6113794647360055231">Chrome ist jetzt noch besser</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">&amp;Chrome OS aktualisieren</translation>
 <translation id="6235018212288296708">Eingangsregel für die Zulassung von mDNS-Verkehr in Google Chrome</translation>
 <translation id="6291089322031436445">Chrome Dev-Apps</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Google Chrome wird aktualisiert</translation>
 <translation id="6368958679917195344">Chrome OS wird durch zusätzliche <ph name="BEGIN_LINK_CROS_OSS" />Open-Source-Software<ph name="END_LINK_CROS_OSS" /> möglich gemacht.</translation>
 <translation id="6410540444482791104">Sie können dazu beitragen, die Verwendung von Chrome sicherer und nutzerfreundlicher zu machen, indem Sie einige Systeminformationen und Seiteninhalte automatisch an Google senden. Google kann so schädliche Apps und Websites besser erfassen.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome wird aktualisiert (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Ihre E-Mail-Adresse <ph name="PROFILE_EMAIL" /> wird zurzeit für die Synchronisierung Ihrer Chrome-Inhalte verwendet. Wenn Sie Ihre Synchronisierungseinstellungen ändern oder Chrome ohne Google-Konto verwenden möchten, rufen Sie <ph name="SETTINGS_LINK" /> auf.</translation>
 <translation id="6600954340915313787">In Chrome kopiert</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 6e31a74..3433350 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598">Chrome bloqueó <ph name="FILE_NAME" /> porque es posible que sea un archivo peligroso.</translation>
 <translation id="573759479754913123">Acerca de Chrome OS</translation>
 <translation id="5774845247549698882">El Sistema operativo Chrome se muestra en este idioma</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" />: Google Chrome Canary</translation>
 <translation id="5855036575689098185">El software que se ejecuta en tu computadora no es compatible con Google Chrome.</translation>
 <translation id="5877064549588274448">Se cambió el canal. Reinicia el dispositivo para aplicar los cambios.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">Para mejorar la seguridad, Google Chrome encriptará los datos</translation>
 <translation id="6113794647360055231">Chrome mejorado</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" />: Versión beta de Google Chrome</translation>
 <translation id="61852838583753520">Actualizar el &amp;sistema operativo de Chrome</translation>
 <translation id="6235018212288296708">Regla de entrada para que Google Chrome permita el tráfico mDNS.</translation>
 <translation id="6291089322031436445">Apps de Chrome Dev</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Actualizando Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS es posible gracias al <ph name="BEGIN_LINK_CROS_OSS" />software de código abierto<ph name="END_LINK_CROS_OSS" /> adicional.</translation>
 <translation id="6410540444482791104">Para ayudar a detectar apps y sitios peligrosos y que Chrome sea más seguro y fácil de usar, envía de forma automática información del sistema y contenido de la página a Google.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" />: Versión para desarrolladores de Google Chrome</translation>
 <translation id="6566149418543181476">Actualizando Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Estás utilizando <ph name="PROFILE_EMAIL" /> para sincronizar los datos de Chrome. Si quieres actualizar las preferencias de sincronización o utilizar Chrome sin una cuenta de Google, accede a <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Se copió en Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 13e8a28..84e4fe6 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598">Es posible que <ph name="FILE_NAME" /> sea peligroso, por lo que Chrome lo ha bloqueado.</translation>
 <translation id="573759479754913123">Información de Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS se muestra en este idioma</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> ‑ Google Chrome Canary</translation>
 <translation id="5855036575689098185">El software que se ejecuta en tu ordenador no es compatible con Google Chrome.</translation>
 <translation id="5877064549588274448">Se ha cambiado el canal. Reinicia el dispositivo para aplicar los cambios.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">Para mayor seguridad, Google Chrome cifrará tus datos</translation>
 <translation id="6113794647360055231">Chrome mejor que nunca</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> ‑ Google Chrome Beta</translation>
 <translation id="61852838583753520">Información de &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Regla entrante para que Google Chrome permita tráfico mDNS.</translation>
 <translation id="6291089322031436445">Aplicaciones de Chrome Dev</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Actualizando Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS está creado con <ph name="BEGIN_LINK_CROS_OSS" />software libre<ph name="END_LINK_CROS_OSS" /> adicional.</translation>
 <translation id="6410540444482791104">Ayuda a que Chrome sea más seguro y se pueda utilizar más fácilmente enviando de forma automática información del sistema y contenido de las páginas a Google para que pueda detectar aplicaciones y sitios web peligrosos.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> ‑ Google Chrome para desarrolladores</translation>
 <translation id="6566149418543181476">Actualizando Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Estás utilizando <ph name="PROFILE_EMAIL" /> para sincronizar tu contenido de Chrome. Para actualizar tus preferencias de sincronización o utilizar Chrome sin una cuenta de Google, accede a <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Copiada a Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index a5c3f2c4..ef18ea0b 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -167,6 +167,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> võib olla ohtlik, mistõttu Chrome blokeeris selle.</translation>
 <translation id="573759479754913123">Teave Chrome OS-i kohta</translation>
 <translation id="5774845247549698882">Chrome OS kuvatakse selles keeles</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Teie arvutis töötav tarkvara ei ühildu Google Chrome'iga.</translation>
 <translation id="5877064549588274448">Kanal on muutunud. Muudatuste rakendamiseks taaskäivitage oma seade.</translation>
 <translation id="5895138241574237353">Taaskäivitamine</translation>
@@ -178,6 +179,7 @@
 <translation id="6070348360322141662">Turvalisuse suurendamiseks krüpteerib Google Chrome teie andmed</translation>
 <translation id="6113794647360055231">Chrome muutus just paremaks</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome'i beetaversioon</translation>
 <translation id="61852838583753520">Värskenda &amp;Chrome OS-i</translation>
 <translation id="6235018212288296708">Sissetuleku reegel Google Chrome'ile mDNS-liikluse lubamiseks.</translation>
 <translation id="6291089322031436445">Chrome Devi rakendused</translation>
@@ -185,6 +187,7 @@
 <translation id="6338556085225130112">Google Chrome'i värskendamine</translation>
 <translation id="6368958679917195344">Chrome OS on võimalik tänu <ph name="BEGIN_LINK_CROS_OSS" />avatud lähtekoodiga lisatarkvarale<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Saate aidata muuta Chrome'i turvalisemaks ja hõlpsamini kasutatavaks, kui lubate saata Google'ile automaatselt teatud süsteemiteavet ning lehesisu, mis aitab tuvastada ohtlikke rakendusi ja saite.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome'i värskendamine (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Kasutate Chrome'i kraami sünkroonimiseks kontot <ph name="PROFILE_EMAIL" />. Sünkroonimiseelistuste värskendamiseks või Chrome'i kasutamiseks ilma Google`i kontota avage <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Chrome'i kopeeritud</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index 7d3b964..2705e8d 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -112,7 +112,7 @@
 <translation id="4028693306634653894">Avaa Chrome nopeammin</translation>
 <translation id="4050175100176540509">Uusimmassa versiossa on käytettävissä tärkeitä turvallisuusparannuksia ja uusia ominaisuuksia.</translation>
 <translation id="4053720452172726777">Google Chromen muokkaaminen ja hallinta</translation>
-<translation id="4143243756087420366">Chrome-nimi ja ‑kuva</translation>
+<translation id="4143243756087420366">Chromen nimi ja kuva</translation>
 <translation id="4147555960264124640">Olet kirjautumassa sisään hallinnoidulla tilillä ja antamassa tilin järjestelmänvalvojalle oikeuden hallita Google Chrome -profiiliasi. Chrome-tietosi, kuten sovelluksesi, kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi, yhdistetään pysyvästi käyttäjätiliin <ph name="USER_NAME" />. Voit poistaa nämä tiedot Google-tilien Hallintapaneelissa, mutta et voi liittää tietoja toiseen tiliin. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">Asennusohjelma ei pystynyt purkamaan arkistotiedostoa. Lataa Google Chrome uudelleen.</translation>
 <translation id="4251615635259297716">Linkitetäänkö Chrome-tiedot tähän tiliin?</translation>
@@ -164,6 +164,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> voi olla vaarallinen, joten Chrome on estänyt sen.</translation>
 <translation id="573759479754913123">Tietoja Chrome-käyttöjärjestelmästä</translation>
 <translation id="5774845247549698882">Chrome-käyttöjärjestelmä näytetään tällä kielellä.</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Tietokoneellasi käynnissä oleva ohjelmisto on yhteensopimaton Google Chromen kanssa.</translation>
 <translation id="5877064549588274448">Kanava vaihdettiin. Ota muutokset käyttöön käynnistämällä laite uudelleen.</translation>
 <translation id="5895138241574237353">Käynnistä uudelleen</translation>
@@ -175,6 +176,7 @@
 <translation id="6070348360322141662">Google Chrome lisää suojausta salaamalla tietosi.</translation>
 <translation id="6113794647360055231">Chrome on nyt entistä parempi</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">Päivitä &amp;Chrome-käyttöjärjestelmä</translation>
 <translation id="6235018212288296708">Google Chromen saapuvien yhteyksien sääntö, joka sallii mDNS-liikenteen.</translation>
 <translation id="6291089322031436445">Chromen kehittäjäversion sovellukset</translation>
@@ -182,6 +184,7 @@
 <translation id="6338556085225130112">Päivitetään Google Chromea.</translation>
 <translation id="6368958679917195344">Chrome-käyttöjärjestelmää tukee toinen <ph name="BEGIN_LINK_CROS_OSS" />avoimen lähdekoodin ohjelmisto<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Voit auttaa meitä kehittämään Chromen turvallisuutta ja käytettävyyttä lähettämällä automaattisesti joitain järjestelmän tietoja ja sivun sisältöjä Googlelle. Näin autat havaitsemaan vaarallisia sovelluksia ja sivustoja.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Päivitetään Google Chromea (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Synkronoit Chromen tietosi osoitteella <ph name="PROFILE_EMAIL" />. Voit vaihtaa synkronoinnin asetuksia tai siirtyä käyttämään Chromea ilman Google-tiliä käymällä <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Kopioitiin Chromeen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index a21075a..77d5c4bf 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598">Chrome a bloqué <ph name="FILE_NAME" />, car ce fichier peut être dangereux.</translation>
 <translation id="573759479754913123">À propos de Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS est affiché dans cette langue</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Le logiciel exécuté sur votre ordinateur n'est pas compatible avec Google Chrome.</translation>
 <translation id="5877064549588274448">La version a été modifiée. Redémarrez votre appareil pour appliquer les modifications.</translation>
 <translation id="5895138241574237353">Redémarrer</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">Pour plus de sécurité, vos données seront chiffrées dans Google Chrome</translation>
 <translation id="6113794647360055231">Chrome s'est amélioré</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Bêta</translation>
 <translation id="61852838583753520">Mettre à jour &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Règle de trafic entrant pour Google Chrome autorisant le trafic mDNS</translation>
 <translation id="6291089322031436445">Applications Chrome pour les développeurs</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Mise à jour de Google Chrome...</translation>
 <translation id="6368958679917195344">Google Chrome OS fonctionne grâce à d'autres <ph name="BEGIN_LINK_CROS_OSS" />logiciels Open Source<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Vous pouvez nous aider à rendre Chrome plus sûr et plus facile à utiliser en nous envoyant automatiquement des informations système et du contenu de page. Cela nous aidera à détecter les applications et les sites dangereux.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome pour les développeurs</translation>
 <translation id="6566149418543181476">Mise à jour de Google Chrome (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="6598387184982954187">Vous utilisez le compte <ph name="PROFILE_EMAIL" /> pour synchroniser votre contenu dans Chrome. Pour mettre à jour vos préférences de synchronisation ou pour utiliser Chrome sans compte Google, accédez à la page <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Copiée dans Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index 261beac..8c4183d 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> જોખમી હોઈ શકે છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation>
 <translation id="573759479754913123">Chrome OS વિશે</translation>
 <translation id="5774845247549698882">આ ભાષામાં Chrome OS પ્રદર્શિત થાય છે</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">તમારા કમ્પ્યુટર પર ચાલતા સૉફ્ટવેર Google Chrome સાથે અસંગત છે.</translation>
 <translation id="5877064549588274448">ચેનલ બદલી. ફેરફારો લાગુ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો.</translation>
 <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">વધારાની સુરક્ષા માટે, Google Chrome, તમારા ડેટાને એન્ક્રિપ્ટ કરશે</translation>
 <translation id="6113794647360055231">Chrome હવે પહેલાંથી બહેતર બન્યું છે</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome બીટા</translation>
 <translation id="61852838583753520">&amp;Chrome OS ને અપડેટ કરો</translation>
 <translation id="6235018212288296708">mDNS ટ્રાફિકને મંજૂરી આપવા માટે Google Chrome માટે ઇનબાઉન્ડ નિયમ.</translation>
 <translation id="6291089322031436445">Chrome Dev ઍપ્લિકેશનો</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Google Chrome અપડેટ થઈ રહ્યું છે</translation>
 <translation id="6368958679917195344">Chrome OS એ વધારાના <ph name="BEGIN_LINK_CROS_OSS" />ખુલ્લા સ્ત્રોત સૉફ્ટવેર<ph name="END_LINK_CROS_OSS" /> દ્વારા શક્ય બને છે.</translation>
 <translation id="6410540444482791104">તમે જોખમી અ‍ૅપ્લિકેશનો અને સાઇટ્સ શોધવામાં સહાય કરવા માટે Google ને કેટલીક સિસ્ટમ માહિતી અને પૃષ્ઠ સામગ્રી આપમેળે મોકલીને Chrome ને વધુ સુરક્ષિત તથા ઉપયોગમાં સરળ બનાવવામાં સહાય કરી શકો છો.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome અપડેટ થઈ રહ્યું છે (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">તમે તમારી Chrome સામગ્રીનું સમન્વયન કરવા માટે <ph name="PROFILE_EMAIL" /> નો ઉપયોગ કરી રહ્યાં છો. તમારી સમન્વયન પસંદગીને અપડેટ કરવા માટે અથવા Chrome ને Google એકાઉન્ટ વગર ઉપયોગ કરવા માટે, <ph name="SETTINGS_LINK" /> ની મુલાકાત લો.</translation>
 <translation id="6600954340915313787">Chrome માં કોપી કરાયું</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 193b3143..4b5fe25c 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -165,6 +165,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> खरतरनाक हो सकता है, इसलिए Chrome ने उसे अवरोधित कर दिया है.</translation>
 <translation id="573759479754913123">Chrome OS के बारे में</translation>
 <translation id="5774845247549698882">Chrome OS इस भाषा में प्रदर्शित किया जा रहा है</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome कैनरी</translation>
 <translation id="5855036575689098185">आपके कंप्यूटर पर चल रहा सॉफ़्टवेयर Google Chrome के साथ असंगत है.</translation>
 <translation id="5877064549588274448">चैनल बदल दिया गया है. बदलावों का लागू करने के लिए अपने डिवाइस को फिर से प्रारंभ करें.</translation>
 <translation id="5895138241574237353">पुन: प्रारंभ करें</translation>
@@ -176,6 +177,7 @@
 <translation id="6070348360322141662">अतिरिक्‍त सुरक्षा के लिए, Google Chrome आपका डेटा एन्‍क्रिप्‍ट करेगा</translation>
 <translation id="6113794647360055231">Chrome पहले से बेहतर हो गया है</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome बीटा</translation>
 <translation id="61852838583753520">&amp;Chrome OS को अपडेट करें</translation>
 <translation id="6235018212288296708">mDNS ट्रैफ़िक की अनुमति देने के लिए Google Chrome के लिए इनबाउंड नियम.</translation>
 <translation id="6291089322031436445">Chrome डेवलपर ऐप्लिकेशन</translation>
@@ -183,6 +185,7 @@
 <translation id="6338556085225130112">Google Chrome अपडेट हो रहा है</translation>
 <translation id="6368958679917195344">Chrome OS को अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> द्वारा संभव बनाया गया है.</translation>
 <translation id="6410540444482791104">खतरनाक ऐप्लिकेशन और साइटों का पता लगाने में सहायता करने के लिए Google को अपने आप कुछ सिस्टम जानकारी और पेज सामग्री भेजकर आप Chrome को उपयोग में अधिक सुरक्षित और अधिक आसान बनाने में सहायता कर सकते हैं.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome डेवलपर</translation>
 <translation id="6566149418543181476">Google Chrome अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">आप अपनी Chrome सामग्री को समन्वयित करने के लिए <ph name="PROFILE_EMAIL" /> का उपयोग कर रहे हैं. अपनी समन्वयन प्राथमिकता को अपडेट करने या Google खाते के बिना Chrome का उपयोग करने के लिए, <ph name="SETTINGS_LINK" /> पर जाएं.</translation>
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index ba52c4e..8ea1c21 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598">A(z) <ph name="FILE_NAME" /> veszélyes lehet, ezért a Chrome letiltotta.</translation>
 <translation id="573759479754913123">A Chrome OS névjegye</translation>
 <translation id="5774845247549698882">A Chrome OS ezen a nyelven jelenik meg</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">A számítógépén futó szoftver nem kompatibilis a Google Chrome-mal.</translation>
 <translation id="5877064549588274448">Módosult a csatorna. Indítsa újra az eszközt a módosítások alkalmazásához.</translation>
 <translation id="5895138241574237353">Újraindítás</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">A nagyobb biztonság érdekében a Google Chrome titkosítja az Ön adatait</translation>
 <translation id="6113794647360055231">A Chrome még jobb lett</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Béta</translation>
 <translation id="61852838583753520">A &amp;Chrome OS frissítése</translation>
 <translation id="6235018212288296708">Bejövő szabály a Google Chrome-hoz az mDNS forgalom engedélyezése céljából.</translation>
 <translation id="6291089322031436445">Chrome Dev-alkalmazások</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">A Google Chrome frissítése</translation>
 <translation id="6368958679917195344">A Chrome OS-hez egyéb <ph name="BEGIN_LINK_CROS_OSS" />nyílt forráskódú szoftver<ph name="END_LINK_CROS_OSS" /> is hozzájárult.</translation>
 <translation id="6410540444482791104">A rendszer-információk és oldaltartalmak automatikus küldésével segítséget nyújthat a Google-nak a Chrome használatának biztonságosabbá és egyszerűbbé tételéhez, illetve a veszélyes alkalmazások és webhelyek felderítéséhez.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">A Google Chrome frissítése (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Chrome-os dolgainak szinkronizálásához a(z) <ph name="PROFILE_EMAIL" /> fiókot használja. Szinkronizálási beállításainak frissítéséhez, illetve a Chrome Google-fiók nélküli használatához keresse fel a <ph name="SETTINGS_LINK" /> linket.</translation>
 <translation id="6600954340915313787">A Chrome-ba másolva</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index d14da6e..9aa8d4b2 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -164,6 +164,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> potrebbe essere pericoloso, pertanto è stato bloccato da Chrome.</translation>
 <translation id="573759479754913123">Informazioni su Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS è visualizzato in questa lingua</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">Il software in esecuzione sul computer non è compatibile con Google Chrome.</translation>
 <translation id="5877064549588274448">Canale cambiato. Riavvia il dispositivo per applicare le modifiche.</translation>
 <translation id="5895138241574237353">Riavvia</translation>
@@ -175,6 +176,7 @@
 <translation id="6070348360322141662">Per maggiore sicurezza, Google Chrome cripterà i tuoi dati</translation>
 <translation id="6113794647360055231">Da oggi Chrome è ancora meglio</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome beta</translation>
 <translation id="61852838583753520">Aggiorna &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Regola inbound per consentire il traffico mDNS in Google Chrome.</translation>
 <translation id="6291089322031436445">App di Chrome Dev</translation>
@@ -182,6 +184,7 @@
 <translation id="6338556085225130112">Aggiornamento di Google Chrome in corso</translation>
 <translation id="6368958679917195344">Chrome OS è reso possibile da <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> aggiuntivi.</translation>
 <translation id="6410540444482791104">Puoi contribuire a rendere Chrome più sicuro e più facile da utilizzare inviando automaticamente a Google alcune informazioni sul sistema e alcuni contenuti delle pagine per contribuire a rilevare app e siti pericolosi.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome per gli sviluppatori</translation>
 <translation id="6566149418543181476">Aggiornamento di Google Chrome in corso (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Stai utilizzando <ph name="PROFILE_EMAIL" /> per sincronizzare i tuoi contenuti di Chrome. Per aggiornare la tua preferenza di sincronizzazione o per utilizzare Chrome senza un account Google, accedi alla pagina <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Copiata in Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index 054e78815..9980620 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> は危険なファイルの可能性があるため、Chrome でブロックしました。</translation>
 <translation id="573759479754913123">Chrome OS について</translation>
 <translation id="5774845247549698882">Chrome OS はこの言語で表示されています</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">お使いのパソコンで実行されているソフトウェアは Google Chrome に対応していません。</translation>
 <translation id="5877064549588274448">チャンネルが変更されました。変更を適用するには、デバイスを再起動してください。</translation>
 <translation id="5895138241574237353">再起動</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">セキュリティ強化のため、データは Google Chrome で暗号化されます</translation>
 <translation id="6113794647360055231">進化する Chrome</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome Beta</translation>
 <translation id="61852838583753520">Chrome OS を更新(&amp;C)</translation>
 <translation id="6235018212288296708">mDNS トラフィックを許可する Google Chrome のインバウンド ルールです。</translation>
 <translation id="6291089322031436445">Chrome Dev アプリ</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Google Chrome を更新しています</translation>
 <translation id="6368958679917195344">Chrome OS は、さらに追加の<ph name="BEGIN_LINK_CROS_OSS" />オープンソース ソフトウェア<ph name="END_LINK_CROS_OSS" />によって実現しました。</translation>
 <translation id="6410540444482791104">危険なアプリやサイトの検出に役立てるために一部のシステム情報やページのコンテンツを Google に自動送信して、Chrome の安全性と利便性の向上にご協力ください。</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome を更新しています(<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Chrome データの同期に <ph name="PROFILE_EMAIL" /> を使用しています。同期設定を更新する、または Google アカウントなしで Chrome を使用するには、<ph name="SETTINGS_LINK" /> にアクセスしてください。</translation>
 <translation id="6600954340915313787">Chrome にコピー済み</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index c82c7db1..a99182f9 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" />은(는) 위험할 수 있으므로 Chrome에서 차단했습니다.</translation>
 <translation id="573759479754913123">Chrome OS 정보</translation>
 <translation id="5774845247549698882">현재 Chrome OS에서 사용 중인 언어</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Chrome Canary</translation>
 <translation id="5855036575689098185">컴퓨터에서 실행 중인 소프트웨어가 Chrome과 호환되지 않습니다.</translation>
 <translation id="5877064549588274448">채널이 변경되었습니다. 변경사항을 적용하려면 기기를 다시 시작하세요.</translation>
 <translation id="5895138241574237353">다시 시작</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">보안 강화를 위해 Chrome에서 사용자 데이터를 암호화합니다.</translation>
 <translation id="6113794647360055231">더욱 업그레이드된 Chrome</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Chrome 베타</translation>
 <translation id="61852838583753520">Chrome OS 업데이트(&amp;C)</translation>
 <translation id="6235018212288296708">Chrome이 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
 <translation id="6291089322031436445">Chrome 개발자 앱</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Chrome 업데이트 중</translation>
 <translation id="6368958679917195344">Chrome OS는 추가 <ph name="BEGIN_LINK_CROS_OSS" />오픈소스 소프트웨어<ph name="END_LINK_CROS_OSS" />를 사용했습니다.</translation>
 <translation id="6410540444482791104">위험한 앱과 사이트를 감지할 수 있도록 일부 시스템 정보와 페이지 콘텐츠를 Google로 자동 전송함으로써 Chrome을 더 안전하고 편리하게 사용할 수 있습니다.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - 개발자용 Chrome</translation>
 <translation id="6566149418543181476">Chrome 업데이트 중(<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Chrome 콘텐츠를 동기화하기 위해 <ph name="PROFILE_EMAIL" />을(를) 사용 중입니다. 동기화 환경설정을 업데이트하거나 Google 계정 없이 Chrome을 사용하려면 <ph name="SETTINGS_LINK" />(으)로 이동하세요.</translation>
 <translation id="6600954340915313787">Chrome에 복사됨</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index a5587472c..f0922107 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chrome ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="573759479754913123">Chrome OS-നെക്കുറിച്ച്</translation>
 <translation id="5774845247549698882">Chrome OS ഈ ഭാഷയിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്നു</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ പ്രവർത്തിക്കുന്ന സോഫ്റ്റ്‌വെയർ Google Chrome-ന് അനുയോജ്യമല്ല.</translation>
 <translation id="5877064549588274448">ചാനൽ മാറ്റി. മാറ്റങ്ങൾ ബാധകമാകാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക.</translation>
 <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">കൂടുതൽ സുരക്ഷ ലഭ്യമാക്കാൻ, Google Chrome നിങ്ങളുടെ ഡാറ്റ എന്‍‌ക്രിപ്‌റ്റുചെയ്യും</translation>
 <translation id="6113794647360055231">Chrome കൂടുതൽ മികച്ചതായി</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome ബീറ്റ</translation>
 <translation id="61852838583753520">&amp;Chrome OS അപ്‌ഡേറ്റ് ചെയ്യുക</translation>
 <translation id="6235018212288296708">mDNS ട്രാഫിക് അനുവദിക്കാൻ Google Chrome-നുള്ള ഇൻബൗണ്ട് റൂൾ.</translation>
 <translation id="6291089322031436445">Chrome Dev ആപ്പുകൾ</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Google Chrome അപ്‌ഡേറ്റുചെയ്യുന്നു</translation>
 <translation id="6368958679917195344">അനുബന്ധ <ph name="BEGIN_LINK_CROS_OSS" />ഓപ്പണ്‍ ഉറവിട സോഫ്റ്റ്‍വെയര്‍<ph name="END_LINK_CROS_OSS" /> ഉപയോഗിച്ചാണ് Chrome OS നിര്‍മ്മിച്ചിരിക്കുന്നത്.</translation>
 <translation id="6410540444482791104">അപകടകരമായ ആപ്‌സുകളെയും സൈറ്റുകളെയും തിരിച്ചറിയാൻ സഹായിക്കുന്ന ചില സിസ്‌റ്റം വിവരങ്ങളും പേജ് ഉള്ളടക്കവും സ്വയമേവ Google-ന് അയയ്‌ക്കുന്നതിലൂടെ നിങ്ങൾക്ക് Chrome-ന്റെ ഉപയോഗം കൂടുതൽ സുരക്ഷിതവും എളുപ്പവുമാക്കാൻ സഹായിക്കാം.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome അപ്‌ഡേറ്റുചെയ്യുന്നു, (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Chrome ഫയൽ സമന്വയിപ്പിക്കാൻ നിങ്ങൾ <ph name="PROFILE_EMAIL" /> ഉപയോഗിക്കുന്നു. നിങ്ങളുടെ സമന്വയ മുൻഗണന അപ്‌ഡേറ്റുചെയ്യാനോ ഒരു Google അക്കൗണ്ട് കൂടാതെ Chrome ഉപയോഗിക്കാനോ <ph name="SETTINGS_LINK" /> സന്ദർശിക്കുക.</translation>
 <translation id="6600954340915313787">Chrome-ലേക്ക് പ്കർത്തി</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index f8a9750..0cedc60 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -114,7 +114,7 @@
 <translation id="4028693306634653894">Chrome वर अधिक जलद या</translation>
 <translation id="4050175100176540509">नवीनतम आवृत्तीमध्‍ये महत्त्वाच्या सुरक्षितता सुधारणा आणि नवीन वैशिष्ट्ये उपलब्‍ध आहेत.</translation>
 <translation id="4053720452172726777">Google Chrome सानुकूल करा आणि नियंत्रित करा</translation>
-<translation id="4143243756087420366">Chrome नाव आणि पिक्चर</translation>
+<translation id="4143243756087420366">Chrome नाव आणि फोटो</translation>
 <translation id="4147555960264124640">आपण एका व्यवस्थापित खात्यासह साइन इन करत आहात आणि आपल्या Google Chrome प्रोफाईलवर त्याच्या प्रशासकास नियंत्रण देत आहात. आपला Chrome डेटा, जसे की आपले अॅप्स, बुकमार्क, इतिहास, पासवर्ड आणि अन्य सेटिंग्ज <ph name="USER_NAME" /> वर कायमच्या बद्ध होतील. आपण Google खाती डॅशबोर्ड द्वारे हा डेटा हटविण्यात सक्षम व्हाल, परंतु आपण दुसर्‍या खात्यासह हा डेटा संबद्ध करण्यात सक्षम होणार नाही. <ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">संग्रहणाचा असंक्षिप्त करण्यास इन्स्टॉलर अयशस्वी. कृपया Google Chrome पुन्हा डाउनलोड करा.</translation>
 <translation id="4251615635259297716">या खात्यावर आपल्या Chrome डेटा चा दुवा साधायचा?</translation>
@@ -122,7 +122,7 @@
 <translation id="4309555186815777032">(Chrome <ph name="BEGIN_BUTTON" />रीस्टार्ट<ph name="END_BUTTON" /> करणे आवश्यक)</translation>
 <translation id="4328355335528187361">Google Chrome विकासक (mDNS-In)</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
-<translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> हे Chrome मध्‍ये जोडले गेले आहे</translation>
+<translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> Chrome मध्‍ये जोडले गेले आहे</translation>
 <translation id="4407807842708586359">Google Chrome OS</translation>
 <translation id="4458285410772214805">कृपया हा बदल प्रभावी होण्यासाठी साइन आउट करा आणि साइन इन करा.</translation>
 <translation id="4458462641685292929">Google Chrome वर दुसरे ऑपरेशन प्रगतीपथावर आहे. कृपया नंतर पुन्हा प्रयत्न करा.</translation>
@@ -168,6 +168,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> धोकादायक असू शकते, त्यामुळे Chrom ने ते अवरोधित केले आहे.</translation>
 <translation id="573759479754913123">Chrome OS बद्दल</translation>
 <translation id="5774845247549698882">Chrome OS या भाषेत प्रदर्शित केली आहे</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome कॅनेरी</translation>
 <translation id="5855036575689098185">आपल्या संगणकावर चालत असलेले सॉफ्टवेअर Google Chrome सह विसंगत आहे.</translation>
 <translation id="5877064549588274448">चॅनेल बदलले. बदल लागू करण्यासाठी आपले डिव्हाइस रीस्टार्ट करा.</translation>
 <translation id="5895138241574237353">रीस्टार्ट करा</translation>
@@ -179,6 +180,7 @@
 <translation id="6070348360322141662">अतिरिक्त सुरक्षिततेसाठी, Google Chrome आपला डेटा कूटबद्ध करेल</translation>
 <translation id="6113794647360055231">Chrome आता उत्कृष्ट झाले आहे</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> – Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome बीटा</translation>
 <translation id="61852838583753520">&amp;Chrome OS अपडेट करा</translation>
 <translation id="6235018212288296708">mDNS रहदारीस अनुमती देण्यासाठी Google Chrome साठी अंतर्गामी नियम.</translation>
 <translation id="6291089322031436445">Chrome विकासक अॅप</translation>
@@ -186,6 +188,7 @@
 <translation id="6338556085225130112">Google Chrome अपडेट होत आहे</translation>
 <translation id="6368958679917195344"> Chrome OS अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />मुक्त स्रोत सॉफ्टवेअर<ph name="END_LINK_CROS_OSS" /> द्वारे शक्य झाले आहे.</translation>
 <translation id="6410540444482791104">धोकादायम अ‍ॅप्स आणि साइट शोधण्यात मदत करण्यासाठी Google ला काही सिस्टम माहिती आणि पृष्ठ सामग्री स्वयंचलितपणे पाठवून आपण Chromium सुरक्षित आणि वापरण्यास सुलभ बनविण्यात मदत करू शकता.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome डेव्हलपर</translation>
 <translation id="6566149418543181476">Google Chrome अपडेट करीत आहे (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">आपण आपली Chrome सामग्री संकालित करण्यासाठी <ph name="PROFILE_EMAIL" /> वापरत आहात. आपले संकालन प्राधान्य अपडेट करण्यासाठी किंवा Google खात्याशिवाय Chrome वापरण्यासाठी, <ph name="SETTINGS_LINK" /> ला भेट द्या.</translation>
 <translation id="6600954340915313787">Chrome वर कॉपी केले</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index c0f3d42..be8e3eec 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -169,6 +169,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan gevaarlijk zijn en is daarom door Chrome geblokkeerd.</translation>
 <translation id="573759479754913123">Over Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS wordt weergegeven in deze taal</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">De software op je computer is niet compatibel met Google Chrome.</translation>
 <translation id="5877064549588274448">Kanaal gewijzigd. Start het apparaat opnieuw op om de wijzigingen door te voeren.</translation>
 <translation id="5895138241574237353">Opnieuw starten</translation>
@@ -180,6 +181,7 @@
 <translation id="6070348360322141662">Je gegevens worden voor extra beveiliging door Google Chrome versleuteld</translation>
 <translation id="6113794647360055231">Chrome is nu nog beter</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome Bèta</translation>
 <translation id="61852838583753520">&amp;Chrome OS updaten</translation>
 <translation id="6235018212288296708">Inkomende regel zodat Google Chrome mDNS-verkeer toestaat.</translation>
 <translation id="6291089322031436445">Chrome Dev-apps</translation>
@@ -187,6 +189,7 @@
 <translation id="6338556085225130112">Google Chrome updaten</translation>
 <translation id="6368958679917195344">Chrome OS wordt mogelijk gemaakt door aanvullende <ph name="BEGIN_LINK_CROS_OSS" />open source-software<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Je kunt helpen Chrome veiliger en gebruiksvriendelijker te maken door automatisch bepaalde systeeminformatie en paginacontent naar Google te verzenden om te helpen bij de detectie van gevaarlijke apps en sites.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome updaten (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Je gebruikt <ph name="PROFILE_EMAIL" /> om je Chrome-bestanden te synchroniseren. Als je je synchronisatievoorkeur wilt bijwerken of Chrome zonder Google-account wilt gebruiken, ga je naar '<ph name="SETTINGS_LINK" />'.</translation>
 <translation id="6600954340915313787">Gekopieerd naar Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index be8539e..df2b59f7 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være farlig, så Chrome har blokkert den.</translation>
 <translation id="573759479754913123">Om Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS vises på dette språket</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Programvaren som kjører på datamaskinen din er ikke kompatibel med Google Chrome.</translation>
 <translation id="5877064549588274448">Kanalen ble endret. Start enheten på nytt for å aktivere endringene.</translation>
 <translation id="5895138241574237353">Start på nytt</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">Google Chrome krypterer dataene dine for å øke sikkerheten</translation>
 <translation id="6113794647360055231">Nå er Chrome blitt enda bedre</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">Oppdater &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Regel om innkommende trafikk for Google Chrome for å tillate mDNS-trafikk.</translation>
 <translation id="6291089322031436445">Chrome Dev-apper</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Oppdaterer Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Du kan bidra til å gjøre Chrome tryggere og enklere å bruke ved å sende Google noe systeminformasjon og sideinnhold automatisk. Dette hjelper oss med å oppdage farlige apper og nettsteder.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Oppdaterer Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Du bruker <ph name="PROFILE_EMAIL" /> for synkronisering av Chrome-tingene dine. For å oppdatere alternativene for synkronisering eller bruke Chrome uten Google-konto, kan du gå til <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Kopiert til Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index d42639c..480b9c3 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -120,7 +120,7 @@
 <translation id="4309555186815777032">(necesită <ph name="BEGIN_BUTTON" />repornirea<ph name="END_BUTTON" /> Chrome)</translation>
 <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation>
 <translation id="4331809312908958774">Sistemul de operare Chrome</translation>
-<translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> a fost adăugată la Chrome</translation>
+<translation id="4343195214584226067">Extensia <ph name="EXTENSION_NAME" /> a fost adăugată la Chrome</translation>
 <translation id="4407807842708586359">Sistemul de operare Google Chrome</translation>
 <translation id="4458285410772214805">Pentru ca modificarea să fie aplicată, deconectați-vă și conectați-vă din nou.</translation>
 <translation id="4458462641685292929">O altă operație din Google Chrome este în curs de desfășurare. Încearcă din nou mai târziu.</translation>
@@ -163,6 +163,7 @@
 <translation id="565744775970812598">Este posibil ca <ph name="FILE_NAME" /> să fie periculos, așadar Chrome l-a blocat.</translation>
 <translation id="573759479754913123">Despre sistemul de operare Chrome</translation>
 <translation id="5774845247549698882">Sistemul de operare Chrome este afișat în această limbă</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Software-ul care rulează pe computer este incompatibil cu Google Chrome.</translation>
 <translation id="5877064549588274448">Canalul a fost schimbat. Reporniți dispozitivul pentru a aplica modificările.</translation>
 <translation id="5895138241574237353">Reîncepe</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">Pentru un plus de securitate, Google Chrome îți va cripta datele</translation>
 <translation id="6113794647360055231">Chrome a devenit și mai bun</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> – Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">Actualizați sistemul de operare &amp;Chrome</translation>
 <translation id="6235018212288296708">Regula de intrare pentru Google Chrome pentru a permite traficul mDNS.</translation>
 <translation id="6291089322031436445">Aplicații Chrome Dev</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Google Chrome se actualizează</translation>
 <translation id="6368958679917195344">Sistemul de operare Chrome este posibil datorită unui <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> suplimentar.</translation>
 <translation id="6410540444482791104">Ne poți ajuta să facem Chrome mai sigur și mai ușor de folosit trimițând automat anumite informații despre sistem și conținutul paginii la Google pentru a detecta aplicațiile și site-urile periculoase.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome se actualizează (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">În prezent, folosiți <ph name="PROFILE_EMAIL" /> pentru a sincroniza datele Chrome. Pentru a actualiza preferințele de sincronizare sau pentru a folosi Chrome fără un Cont Google, accesați <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Copiat în Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 1294362..20c15636 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598">Chrome заблокировал файл <ph name="FILE_NAME" /> как потенциально опасный.</translation>
 <translation id="573759479754913123">О Chrome OS</translation>
 <translation id="5774845247549698882">Этот язык сейчас используется в Chrome OS</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Используемое программное обеспечение несовместимо с Google Chrome.</translation>
 <translation id="5877064549588274448">Канал изменен. Чтобы изменения вступили в силу, перезапустите устройство.</translation>
 <translation id="5895138241574237353">Перезапустить</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">В целях повышения безопасности Google Chrome шифрует ваши данные</translation>
 <translation id="6113794647360055231">Chrome становится все лучше</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome (бета-версия)</translation>
 <translation id="61852838583753520">Обновить &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Разрешить в Google Chrome передачу входящего трафика по протоколу mDNS</translation>
 <translation id="6291089322031436445">Приложения Chrome для разработчиков</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Обновление Google Chrome…</translation>
 <translation id="6368958679917195344">Своим появлением Chrome OS обязана дополнительному <ph name="BEGIN_LINK_CROS_OSS" />программному обеспечению с открытым исходным кодом<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Вы можете автоматически отправлять системную информацию и контент страниц в Google, чтобы помочь улучшить распознавание опасных приложений и сайтов. Давайте вместе сделаем Chrome ещё удобнее и безопаснее!</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome для разработчиков</translation>
 <translation id="6566149418543181476">Обновление Google Chrome (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="6598387184982954187">Для синхронизации данных Chrome используется аккаунт <ph name="PROFILE_EMAIL" />. Изменить параметры синхронизации или отключить аккаунт можно в <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Скопировано в Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index eab5343..be1223db 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598">Datoteka <ph name="FILE_NAME" /> je morda nevarna, zato jo je Chrome blokiral.</translation>
 <translation id="573759479754913123">O sistemu Chrome OS</translation>
 <translation id="5774845247549698882">OS Chrome je v tem jeziku</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – delovna različica Google Chroma</translation>
 <translation id="5855036575689098185">Programska oprema, ki se izvaja v računalniku, ni združljiva z Google Chromom.</translation>
 <translation id="5877064549588274448">Kanal spremenjen. Znova zaženite napravo, da uveljavite spremembe.</translation>
 <translation id="5895138241574237353">Znova zaženi</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">Zaradi večje varnosti bo Google Chrome šifriral vaše podatke</translation>
 <translation id="6113794647360055231">Chrome je pravkar postal še boljši</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> – Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> različica beta Google Chroma</translation>
 <translation id="61852838583753520">Posodobitev &amp;sistema Chrome OS</translation>
 <translation id="6235018212288296708">Pravilo za dohodni promet za Google Chrome, ki omogoča promet mDNS.</translation>
 <translation id="6291089322031436445">Aplikacije za Chrome Dev</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Posodabljanje Google Chroma</translation>
 <translation id="6368958679917195344">Sistem Chrome OS uporablja dodatno <ph name="BEGIN_LINK_CROS_OSS" />odprtokodno programsko opremo<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">S samodejnim pošiljanjem nekaterih informacij o sistemu in vsebine strani Googlu, s čimer pomagate pri hitrejšem zaznavanju nevarnih aplikacij in spletnih mest, lahko pomagate narediti Chrome varnejši in preprostejši za uporabo.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> različica Google Chroma za razvijalce</translation>
 <translation id="6566149418543181476">Posodabljanje Google Chroma (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Za sinhronizacijo stvari v Chromu uporabljate <ph name="PROFILE_EMAIL" />. Če želite posodobiti nastavitve sinhroniziranja ali uporabljati Chrome brez Google Računa, odprite <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Kopirano v Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index a2a4397..3d9ffd9 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598">Датотека <ph name="FILE_NAME" /> је можда опасна, па ју је Chrome блокирао.</translation>
 <translation id="573759479754913123">О Chrome ОС-у</translation>
 <translation id="5774845247549698882">Chrome ОС се приказује на овом језику</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Софтвер покренут на рачунару није компатибилан са Google Chrome-ом.</translation>
 <translation id="5877064549588274448">Канал је промењен. Покрените поново уређај да бисте применили промене.</translation>
 <translation id="5895138241574237353">Покрени поново</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">Google Chrome ће шифровати податке ради додатне сигурности</translation>
 <translation id="6113794647360055231">Управо смо побољшали Chrome</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> – Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome бета</translation>
 <translation id="61852838583753520">Ажурирај &amp;Chrome ОС</translation>
 <translation id="6235018212288296708">Правило за долазни саобраћај за Google Chrome да бисте омогућили mDNS саобраћај.</translation>
 <translation id="6291089322031436445">Chrome апликације за програмерски канал</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Ажурирање Google Chrome-а</translation>
 <translation id="6368958679917195344">Chrome OС je могућ захваљујући додатном <ph name="BEGIN_LINK_CROS_OSS" />софтвер отвореног кода<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Можете да помогнете да Chrome буде безбеднији и лакши за коришћење тако што ћете аутоматски слати Google-у неке системске информације и садржај страница да бисмо открили опасне апликације и сајтове.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Програмерска верзија Google Chrome-а</translation>
 <translation id="6566149418543181476">Ажурирање Google Chrome-а (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Користите <ph name="PROFILE_EMAIL" /> за синхронизацију Chrome садржаја. Да бисте ажурирали подешавање синхронизације или користили Chrome без Google налога, посетите <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Копирана у Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 6fb793da..5805d43 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -171,6 +171,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan vara skadlig och har blockerats av Chrome.</translation>
 <translation id="573759479754913123">Om Chrome OS</translation>
 <translation id="5774845247549698882">Chrome OS visas på det här språket</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5855036575689098185">Programmet som körs på datorn är inte kompatibelt med Google Chrome.</translation>
 <translation id="5877064549588274448">Kanalen har ändrats. Starta om enheten om du vill tillämpa ändringarna.</translation>
 <translation id="5895138241574237353">Starta om</translation>
@@ -182,6 +183,7 @@
 <translation id="6070348360322141662">Din data krypteras i Google Chrome för att öka säkerheten</translation>
 <translation id="6113794647360055231">Vi har gjort Chrome ännu bättre</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> – Google Chrome Beta</translation>
 <translation id="61852838583753520">Uppdatera &amp;Chrome OS</translation>
 <translation id="6235018212288296708">Regel som tillåter inkommande mDNS-trafik för Google Chrome.</translation>
 <translation id="6291089322031436445">Appar i Chrome Dev</translation>
@@ -189,6 +191,7 @@
 <translation id="6338556085225130112">Uppdatera Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS fungerar tack vare <ph name="BEGIN_LINK_CROS_OSS" />öppen källkod<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6410540444482791104">Du kan bidra till att göra Chrome säkrare och enklare att använda genom att låta viss systeminformation och visst sidinnehåll skickas automatiskt till Google i syfte att identifiera skadliga appar och webbplatser.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome uppdateras (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Du använder <ph name="PROFILE_EMAIL" /> för att synkronisera dina grejer i Chrome. Om du vill uppdatera synkroniseringsinställningen eller använda Chrome utan ett Google-konto besöker du <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Kopierat till Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index 5b76d38..22a58517 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> ஆபத்தானதாக இருக்கலாம் என்பதால் Chrome அதைத் தடுத்துள்ளது.</translation>
 <translation id="573759479754913123">Chrome OS அறிமுகம்</translation>
 <translation id="5774845247549698882">Chrome OS இந்த மொழியில் காட்டப்படுகிறது</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">உங்கள் கணினியில் இயங்கும் மென்பொருள் Google Chrome உடன் இணங்கவில்லை.</translation>
 <translation id="5877064549588274448">சேனல் மாற்றப்பட்டது. மாற்றங்களைச் செயல்படுத்த உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்.</translation>
 <translation id="5895138241574237353">மறுதொடக்கம்</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">கூடுதல் பாதுகாப்பிற்கு, Google Chrome உங்கள் தரவை என்கிரிப்ட் செய்யும்</translation>
 <translation id="6113794647360055231">Chrome இன்னும் சிறப்படைந்துள்ளது</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome பீட்டா</translation>
 <translation id="61852838583753520">&amp;Chrome OS ஐப் புதுப்பி</translation>
 <translation id="6235018212288296708">mDNS ட்ராஃபிக்கை அனுமதிப்பதற்கான, Google Chrome க்கான உள்வரும் விதி.</translation>
 <translation id="6291089322031436445">Chrome Dev பயன்பாடுகள்</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Google Chromeஐப் புதுப்பிக்கிறது</translation>
 <translation id="6368958679917195344">கூடுதலான <ph name="BEGIN_LINK_CROS_OSS" />ஓப்பன் சோர்ஸ் மென்பொருள்களால்<ph name="END_LINK_CROS_OSS" /> Chrome OS ஐ உருவாக்குவது சாத்தியமானது.</translation>
 <translation id="6410540444482791104">ஆபத்தான பயன்பாடுகளையும் தளங்களையும் கண்டறிவதற்கு உதவியாக, சில சாதனத் தகவலையும் பக்க உள்ளடக்கத்தையும் Googleக்குத் தானாக அனுப்புவதன் மூலம், Chromeஐ எளிதாகவும் பாதுகாப்பாகவும் பயன்படுத்தும்படி மேம்படுத்துவதற்கு நீங்கள் உதவலாம்.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chromeஐப் புதுப்பிக்கிறது (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">உங்கள் Chrome விஷயங்களை ஒத்திசைக்க <ph name="PROFILE_EMAIL" /> ஐப் பயன்படுத்துகிறீர்கள். உங்கள் ஒத்திசைவு விருப்பத்தேர்வைப் புதுப்பிக்க அல்லது Google கணக்கில்லாமல் Chrome ஐப் பயன்படுத்த, <ph name="SETTINGS_LINK" /> ஐப் பார்வையிடவும்.</translation>
 <translation id="6600954340915313787">Chromeக்கு நகலெடுக்கப்பட்டது</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 6a8f16a..f90c82e 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -163,6 +163,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> హానికరం కావచ్చు, కావున Chrome దాన్ని బ్లాక్ చేసింది.</translation>
 <translation id="573759479754913123">Chrome OS గురించి</translation>
 <translation id="5774845247549698882">Chrome OS ఈ భాషలో ప్రదర్శించబడుతోంది</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">మీ కంప్యూటర్‌లో అమలవుతున్న సాఫ్ట్‌వేర్ Google Chromeకు అనుకూలంగా లేదు.</translation>
 <translation id="5877064549588274448">ఛానెల్ మార్చబడింది. మార్పులను వర్తింపజేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి.</translation>
 <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation>
@@ -174,6 +175,7 @@
 <translation id="6070348360322141662">అదనపు భద్రత దృష్ట్యా, Google Chrome మీ డేటాను గుప్తీకరిస్తుంది</translation>
 <translation id="6113794647360055231">Chrome ఇప్పుడు మెరుగైంది</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome బీటా</translation>
 <translation id="61852838583753520">&amp;Chrome OSను నవీకరించు</translation>
 <translation id="6235018212288296708">mDNS ట్రాఫిక్‌ను అనుమతించడానికి Google Chrome కోసం ఇన్‌బౌండ్ నియమం.</translation>
 <translation id="6291089322031436445">Chrome డెవలపర్ అనువర్తనాలు</translation>
@@ -181,6 +183,7 @@
 <translation id="6338556085225130112">Google Chromeని నవీకరిస్తోంది</translation>
 <translation id="6368958679917195344">అదనపు <ph name="BEGIN_LINK_CROS_OSS" />ఓపన్ సోర్స్ సాఫ్ట్‌వేర్‌<ph name="END_LINK_CROS_OSS" /> ద్వారా  Chrome OS సాధ్యం అవుతుంది.</translation>
 <translation id="6410540444482791104">హానికరమైన అనువర్తనాలు మరియు సైట్‌లను గుర్తించడంలో సహాయపడటానికి కొంత సిస్టమ్ సమాచారాన్ని మరియు పేజీ కంటెంట్‌ను Googleకి స్వయంచాలకంగా పంపడం ద్వారా మీరు Chromeని ఉపయోగించడానికి సురక్షితమైనదిగా మరియు సులభమైనదిగా చేయడంలో సహాయపడవచ్చు.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">మీరు మీ Chrome అంశాలను సమకాలీకరించడానికి <ph name="PROFILE_EMAIL" />ని ఉపయోగిస్తున్నారు. మీ సమకాలీకరణ ప్రాధాన్యతను నవీకరించడానికి లేదా Google ఖాతా లేకుండా Chromeని ఉపయోగించడానికి, <ph name="SETTINGS_LINK" />ను సందర్శించండి.</translation>
 <translation id="6600954340915313787">Chromeకి కాపీ చేయబడింది</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index 6e10248..6b5fdfe 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -25,14 +25,14 @@
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> tehlikeli olduğu için Chrome tarafından engellendi.</translation>
 <translation id="1619887657840448962">Chrome'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 aşağıdaki uzantıyı devre dışı bıraktık.</translation>
 <translation id="1628000112320670027">Chrome'la ilgili yardım alın</translation>
-<translation id="163860049029591106">Chrome OS'yi Kullanmaya Başlayın</translation>
+<translation id="163860049029591106">Chrome OS'i Kullanmaya Başlayın</translation>
 <translation id="1674870198290878346">Bağlantıyı Chrome &amp;Gizli Penceresinde Aç</translation>
 <translation id="1682634494516646069">Google Chrome, veri dizini üzerinde okuma ve yazma işlemi yapamıyor: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">Google Chrome, web sayfalarını ve uygulamaları yıldırım hızıyla çalıştıran bir web tarayıcısıdır. Hızlı, dengeli ve kullanımı kolaydır. Kötü amaçlı yazılımlara ve e-dolandırıcılığa karşı Google Chrome'un içinde yerleşik olarak bulunan koruma özellikleriyle web'de daha güvenli bir şekilde gezinin.</translation>
 <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" />'u seçin</translation>
 <translation id="174539241580958092">Oturum açmadaki bir hata nedeniyle Google Chrome, verilerinizi senkronize edemedi.</translation>
 <translation id="1759842336958782510">Chrome</translation>
-<translation id="1773601347087397504">Chrome OS'u kullanma konusunda yardım alın</translation>
+<translation id="1773601347087397504">Chrome OS'i kullanma konusunda yardım alın</translation>
 <translation id="1795405610103747296">Chrome'u telefonunuza yükleyin. Telefonunuza SMS göndereceğiz: <ph name="PHONE_NUMBER" /></translation>
 <translation id="1860536484129686729">Chrome'un bu sitede kameranıza erişmesi için izin gerekiyor</translation>
 <translation id="1873233029667955273">Google Chrome varsayılan tarayıcınız değil</translation>
@@ -113,7 +113,7 @@
 <translation id="4028693306634653894">Chrome'a daha hızlı ulaşın</translation>
 <translation id="4050175100176540509">Son sürümde güvenlikle ilgili önemli iyileştirmeler ve yeni özellikler mevcuttur.</translation>
 <translation id="4053720452172726777">Google Chrome'u özelleştirin ve kontrol edin</translation>
-<translation id="4143243756087420366">Chrome profili adı ve resmi</translation>
+<translation id="4143243756087420366">Chrome adı ve resmi</translation>
 <translation id="4147555960264124640">Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Google Chrome profilinizi denetleme izni veriyorsunuz. Uygulamalarınız, yer işaretleriniz, geçmişiniz, şifreleriniz ve diğer ayarlarınız gibi Chrome verileriniz kalıcı olarak <ph name="USER_NAME" /> ile bağlantılandırılacaktır. Google Hesapları Hesap Özeti'ni kullanarak bu verileri silebilecek, ancak bu verileri başka bir hesapla ilişkilendiremeyeceksiniz.<ph name="LEARN_MORE" /></translation>
 <translation id="4149882025268051530">Yükleyici arşivi açamadı. Lütfen Google Chrome'u yeniden indirin.</translation>
 <translation id="4251615635259297716">Chrome verileriniz bu hesaba bağlansın mı?</translation>
@@ -166,6 +166,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> tehlikeli olabileceği için Chrome tarafından engellendi.</translation>
 <translation id="573759479754913123">Chrome OS hakkında</translation>
 <translation id="5774845247549698882">Chrome OS bu dilde görüntüleniyor</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">Bilgisayarınızda çalışan yazılım Google Chrome ile uyumsuz.</translation>
 <translation id="5877064549588274448">Kanal değişti. Değişikliklerin uygulanması için cihazınızı yeniden başlatın.</translation>
 <translation id="5895138241574237353">Yeniden başlat</translation>
@@ -177,13 +178,15 @@
 <translation id="6070348360322141662">Google Chrome ek güvenlik sağlamak için verilerinizi şifreler</translation>
 <translation id="6113794647360055231">Chrome daha da iyi bir hale geldi</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
-<translation id="61852838583753520">&amp;Chrome OS'u güncelle</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome Beta</translation>
+<translation id="61852838583753520">&amp;Chrome OS'i güncelle</translation>
 <translation id="6235018212288296708">Google Chrome'un mDNS trafiğine izin vermeyi sağlayan gelen trafik kuralı.</translation>
 <translation id="6291089322031436445">Chrome Dev Uygulamaları</translation>
 <translation id="6291549208091401781">Google Chrome zaten bilgisayarınızdaki tüm kullanıcılar için yüklendi.</translation>
 <translation id="6338556085225130112">Google Chrome güncelleniyor</translation>
 <translation id="6368958679917195344">Chrome OS, ek <ph name="BEGIN_LINK_CROS_OSS" />açık kaynak yazılımlardan<ph name="END_LINK_CROS_OSS" /> yararlanılarak geliştirilmiştir.</translation>
 <translation id="6410540444482791104">Tehlikeli uygulamalar ve sitelerin tespit edilmesine yardımcı olmak üzere Google'a bazı sistem bilgilerini ve sayfa içeriklerini otomatik olarak göndererek, Chrome'un daha güvenli olmasını ve daha kolay kullanılmasını sağlayabilirsiniz.</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome güncelleniyor (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Chrome öğelerinizi senkronize etmek için <ph name="PROFILE_EMAIL" /> adresini kullanıyorsunuz. Senkronizasyon tercihinizi güncellemek veya Chrome'u bir Google Hesabı olmadan kullanmak için şunu ziyaret edin: <ph name="SETTINGS_LINK" />.</translation>
 <translation id="6600954340915313787">Chrome'a kopyalandı</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index 21419f79..2f000fe 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -164,6 +164,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> 可能存在危险,因此 Chrome 已将其拦截。</translation>
 <translation id="573759479754913123">关于 Chrome 操作系统</translation>
 <translation id="5774845247549698882">Chrome 操作系统界面目前使用的是这种语言</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5855036575689098185">您计算机上运行的软件与 Google Chrome 不兼容。</translation>
 <translation id="5877064549588274448">版本已更改。请重新启动设备来应用这些变更。</translation>
 <translation id="5895138241574237353">重新启动</translation>
@@ -175,6 +176,7 @@
 <translation id="6070348360322141662">为了提高安全性,Google Chrome 将对您的数据进行加密</translation>
 <translation id="6113794647360055231">Chrome现在更好用了</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome 测试版</translation>
 <translation id="61852838583753520">更新 Chrome 操作系统(&amp;C)</translation>
 <translation id="6235018212288296708">Google Chrome的入站规则,允许mDNS流量。</translation>
 <translation id="6291089322031436445">Chrome 开发者版应用</translation>
@@ -182,6 +184,7 @@
 <translation id="6338556085225130112">正在更新 Google Chrome</translation>
 <translation id="6368958679917195344">Chrome 操作系统的问世还有其他<ph name="BEGIN_LINK_CROS_OSS" />开放源代码软件<ph name="END_LINK_CROS_OSS" />的一份功劳。</translation>
 <translation id="6410540444482791104">您可以选择自动向 Google 发送某些系统信息和网页内容,以帮助我们检测危险应用和网站,从而提高 Chrome 的安全性和易用性。</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome 开发者版</translation>
 <translation id="6566149418543181476">正在更新 Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">您在使用<ph name="PROFILE_EMAIL" />同步自己的Chrome资料和数据。要更新您的同步偏好设置或在不登录Google帐号的情况下使用Chrome,请前往<ph name="SETTINGS_LINK" />部分。</translation>
 <translation id="6600954340915313787">已复制到 Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 63d4ea0..2b77bce 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -165,6 +165,7 @@
 <translation id="565744775970812598"><ph name="FILE_NAME" /> 可能不安全,因此遭到 Chrome 封鎖。</translation>
 <translation id="573759479754913123">關於 Chrome 作業系統</translation>
 <translation id="5774845247549698882">Chrome 作業系統的介面文字已設為這種語言</translation>
+<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary 版</translation>
 <translation id="5855036575689098185">你電腦上執行的軟體與 Google Chrome 不相容。</translation>
 <translation id="5877064549588274448">版本已變更。請重新啟動裝置以套用變更。</translation>
 <translation id="5895138241574237353">重新啟動</translation>
@@ -176,6 +177,7 @@
 <translation id="6070348360322141662">為了提升安全性,Google Chrome 會將你的資料加密保護</translation>
 <translation id="6113794647360055231">Chrome 變得更好用了</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
+<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome 測試版</translation>
 <translation id="61852838583753520">更新 Chrome 作業系統(&amp;C)</translation>
 <translation id="6235018212288296708">允許 mDNS 流量的 Google Chrome 輸入規則。</translation>
 <translation id="6291089322031436445">Chrome 開發人員版應用程式</translation>
@@ -183,6 +185,7 @@
 <translation id="6338556085225130112">正在更新 Google Chrome</translation>
 <translation id="6368958679917195344">Chrome 作業系統藉助了其他<ph name="BEGIN_LINK_CROS_OSS" />開放原始碼軟體<ph name="END_LINK_CROS_OSS" />的相關技術才得以問世。</translation>
 <translation id="6410540444482791104">你可以選擇自動傳送部分系統資訊和網頁內容給 Google,協助我們偵測危險的應用程式和網站,讓 Chrome 變得更安全、更好用。</translation>
+<translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome 開發人員版</translation>
 <translation id="6566149418543181476">正在更新 Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">你正使用 <ph name="PROFILE_EMAIL" /> 帳戶同步處理你的 Chrome 資料。如要更新你的偏好設定,或是在未登入 Google 帳戶的情況下使用 Chrome,請前往 [<ph name="SETTINGS_LINK" />]。</translation>
 <translation id="6600954340915313787">已複製到 Chrome</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 32b5622f..c450d5c 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -997,7 +997,7 @@
   <message name="IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC" desc="A summary for the 'Cookies and site data' option in the 'Clear Browsing Data' screen, explaining that deleting cookies and site data will sign the user out of most websites.">
     Signs you out of most sites.
   </message>
-  <message name="IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_MIRROR_SUMMARY_BASIC" desc="A summary for the 'Cookies and site data' option in the 'Clear Browsing Data' screen, explaining that deleting cookies and site data will sign the user out of most websites but your Google sign in will stay.">
+  <message name="IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION" desc="A summary for the 'Cookies and site data' option in the 'Clear Browsing Data' screen, explaining that deleting cookies and site data will sign the user out of most websites but your Google sign in will stay.">
     Signs you out of most sites. You won't be signed out of your Google Account.
   </message>
   <message name="IDS_SETTINGS_CLEAR_BROWSING_HISTORY_SUMMARY" desc="A subtext for the basic tab explaining browsing history.">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 00c747d..87f9b81 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -223,6 +223,8 @@
     "browsing_data/counters/site_data_counting_helper.h",
     "browsing_data/local_data_container.cc",
     "browsing_data/local_data_container.h",
+    "browsing_data/navigation_entry_remover.cc",
+    "browsing_data/navigation_entry_remover.h",
     "browsing_data/site_data_size_collector.cc",
     "browsing_data/site_data_size_collector.h",
     "budget_service/budget_database.cc",
@@ -577,6 +579,7 @@
     "install_verification/win/module_list.h",
     "install_verification/win/module_verification_common.cc",
     "install_verification/win/module_verification_common.h",
+    "installable/installable_ambient_badge_infobar_delegate.h",
     "installable/installable_data.cc",
     "installable/installable_data.h",
     "installable/installable_logging.cc",
@@ -1404,6 +1407,8 @@
     "ssl/chrome_ssl_host_state_delegate_factory.h",
     "ssl/common_name_mismatch_handler.cc",
     "ssl/common_name_mismatch_handler.h",
+    "ssl/connection_help_tab_helper.cc",
+    "ssl/connection_help_tab_helper.h",
     "ssl/insecure_sensitive_input_driver.cc",
     "ssl/insecure_sensitive_input_driver.h",
     "ssl/insecure_sensitive_input_driver_factory.cc",
@@ -1597,7 +1602,7 @@
     ":active_use_util",
     ":resource_prefetch_predictor_proto",
     "//base:i18n",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//cc",
     "//chrome:extra_resources",
     "//chrome:resources",
@@ -2236,10 +2241,7 @@
       "history/android/bookmark_model_sql_handler.h",
       "history/android/sqlite_cursor.cc",
       "history/android/sqlite_cursor.h",
-      "installable/pwa_ambient_badge_infobar_delegate_android.cc",
-      "installable/pwa_ambient_badge_infobar_delegate_android.h",
-      "installable/pwa_ambient_badge_manager_android.cc",
-      "installable/pwa_ambient_badge_manager_android.h",
+      "installable/installable_ambient_badge_infobar_delegate.cc",
       "invalidation/invalidation_service_factory_android.cc",
       "invalidation/invalidation_service_factory_android.h",
       "lifetime/application_lifetime_android.cc",
@@ -2325,7 +2327,6 @@
       "sync/glue/synced_window_delegates_getter_android.h",
       "sync/profile_sync_service_android.cc",
       "sync/profile_sync_service_android.h",
-      "sync/sessions/sync_sessions_metrics_android.cc",
     ]
     deps += [
       ":client_discourse_context_proto",
@@ -2654,9 +2655,8 @@
       "resource_coordinator/tab_manager_stats_collector.h",
       "resource_coordinator/tab_manager_web_contents_data.cc",
       "resource_coordinator/tab_manager_web_contents_data.h",
+      "resource_coordinator/tab_metrics_logger.cc",
       "resource_coordinator/tab_metrics_logger.h",
-      "resource_coordinator/tab_metrics_logger_impl.cc",
-      "resource_coordinator/tab_metrics_logger_impl.h",
       "resource_coordinator/tab_stats.cc",
       "resource_coordinator/tab_stats.h",
       "resource_coordinator/time.cc",
@@ -4301,13 +4301,13 @@
       "../android/java/src/org/chromium/chrome/browser/infobar/GeneratedPasswordSavedInfoBarDelegate.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBarDelegate.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/NearOomInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/PreviewsInfoBar.java",
-      "../android/java/src/org/chromium/chrome/browser/infobar/PwaAmbientBadgeInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java",
       "../android/java/src/org/chromium/chrome/browser/infobar/SimpleConfirmInfoBarBuilder.java",
@@ -4415,7 +4415,6 @@
       "../android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java",
       "../android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java",
       "../android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java",
-      "../android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java",
       "../android/java/src/org/chromium/chrome/browser/tab/Tab.java",
       "../android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java",
       "../android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 6997ea8..7fd70f5 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -43,6 +43,7 @@
 #include "components/autofill/core/common/autofill_switches.h"
 #include "components/autofill/core/common/autofill_util.h"
 #include "components/browser_sync/browser_sync_switches.h"
+#include "components/browsing_data/core/features.h"
 #include "components/cloud_devices/common/cloud_devices_switches.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
@@ -2684,6 +2685,10 @@
      flag_descriptions::kFullscreenToolbarRevealDescription, kOsMac,
      FEATURE_VALUE_TYPE(features::kFullscreenToolbarReveal)},
 #endif  // OS_MACOSX
+    {"remove-navigation-history",
+     flag_descriptions::kRemoveNavigationHistoryName,
+     flag_descriptions::kRemoveNavigationHistoryDescription, kOsAll,
+     FEATURE_VALUE_TYPE(browsing_data::features::kRemoveNavigationHistory)},
     {"important-sites-in-cbd", flag_descriptions::kImportantSitesInCbdName,
      flag_descriptions::kImportantSitesInCbdDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kImportantSitesInCbd)},
@@ -3737,8 +3742,19 @@
      flag_descriptions::kAshEnableNewOverviewAnimationsName,
      flag_descriptions::kAshEnableNewOverviewAnimationsDescription, kOsCrOS,
      SINGLE_VALUE_TYPE(ash::switches::kAshEnableNewOverviewAnimations)},
+    {"enable-experimental-crostini-ui",
+     flag_descriptions::kExperimentalCrostiniUIName,
+     flag_descriptions::kExperimentalCrostiniUIDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(features::kExperimentalCrostiniUI)},
 #endif  // OS_CHROMEOS
 
+#if defined(OS_ANDROID)
+    {"enable-omnibox-voice-search-always-visible",
+     flag_descriptions::kOmniboxVoiceSearchAlwaysVisibleName,
+     flag_descriptions::kOmniboxVoiceSearchAlwaysVisibleDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kOmniboxVoiceSearchAlwaysVisible)},
+#endif  // OS_ANDROID
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 54aa093..9567c3b0 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -103,6 +103,7 @@
     &kNTPLaunchAfterInactivity,
     &NTPShowGoogleGInOmniboxFeature,
     &kOmniboxSpareRenderer,
+    &kOmniboxVoiceSearchAlwaysVisible,
     &kPayWithGoogleV1,
     &kPhysicalWebFeature,
     &kPhysicalWebSharing,
@@ -321,6 +322,9 @@
 const base::Feature kOmniboxSpareRenderer{"OmniboxSpareRenderer",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kOmniboxVoiceSearchAlwaysVisible{
+    "OmniboxVoiceSearchAlwaysVisible", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kPayWithGoogleV1{"PayWithGoogleV1",
                                      base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 310a9b3e..0fdd63c 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -65,6 +65,7 @@
 extern const base::Feature kNTPLaunchAfterInactivity;
 extern const base::Feature NTPShowGoogleGInOmniboxFeature;
 extern const base::Feature kOmniboxSpareRenderer;
+extern const base::Feature kOmniboxVoiceSearchAlwaysVisible;
 extern const base::Feature kPayWithGoogleV1;
 extern const base::Feature kPhysicalWebFeature;
 extern const base::Feature kPhysicalWebSharing;
diff --git a/chrome/browser/android/history/browsing_history_bridge.cc b/chrome/browser/android/history/browsing_history_bridge.cc
index b30ee2e0..afde911 100644
--- a/chrome/browser/android/history/browsing_history_bridge.cc
+++ b/chrome/browser/android/history/browsing_history_bridge.cc
@@ -43,6 +43,9 @@
       ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile_);
   browsing_history_service_ = std::make_unique<BrowsingHistoryService>(
       this, local_history, sync_service);
+  // Make sure BrowsingDataRemoverDelegate is initialized and listening
+  // for history deletions.
+  profile_->GetBrowsingDataRemoverDelegate();
 
   j_history_service_obj_.Reset(env, obj);
 }
diff --git a/chrome/browser/android/history_report/delta_file_service.h b/chrome/browser/android/history_report/delta_file_service.h
index 0bd710d..6aa1e699 100644
--- a/chrome/browser/android/history_report/delta_file_service.h
+++ b/chrome/browser/android/history_report/delta_file_service.h
@@ -12,12 +12,13 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/threading/sequenced_worker_pool.h"
+#include "base/memory/scoped_refptr.h"
 
 class GURL;
 
 namespace base {
 class FilePath;
+class SequencedTaskRunner;
 }  // namespace base
 
 namespace history_report {
@@ -52,7 +53,7 @@
   std::string Dump();
 
  private:
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> task_runner_;
   std::unique_ptr<DeltaFileBackend> delta_file_backend_;
 
   DISALLOW_COPY_AND_ASSIGN(DeltaFileService);
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.cc b/chrome/browser/android/vr_shell/vr_gl_thread.cc
index 0f14d18..3faa2340 100644
--- a/chrome/browser/android/vr_shell/vr_gl_thread.cc
+++ b/chrome/browser/android/vr_shell/vr_gl_thread.cc
@@ -359,12 +359,11 @@
       base::Bind(&BrowserUiInterface::SetIsExiting, weak_browser_ui_));
 }
 
-void VrGLThread::SetExitVrPromptEnabled(bool enabled,
-                                        UiUnsupportedMode reason) {
+void VrGLThread::ShowExitVrPrompt(UiUnsupportedMode reason) {
   DCHECK(OnMainThread());
-  task_runner()->PostTask(
-      FROM_HERE, base::Bind(&BrowserUiInterface::SetExitVrPromptEnabled,
-                            weak_browser_ui_, enabled, reason));
+  task_runner()->PostTask(FROM_HERE,
+                          base::BindOnce(&BrowserUiInterface::ShowExitVrPrompt,
+                                         weak_browser_ui_, reason));
 }
 
 void VrGLThread::SetSpeechRecognitionEnabled(bool enabled) {
diff --git a/chrome/browser/android/vr_shell/vr_gl_thread.h b/chrome/browser/android/vr_shell/vr_gl_thread.h
index ca7df3c3..a7a678f 100644
--- a/chrome/browser/android/vr_shell/vr_gl_thread.h
+++ b/chrome/browser/android/vr_shell/vr_gl_thread.h
@@ -101,7 +101,7 @@
   void SetAudioCaptureEnabled(bool enabled) override;
   void SetBluetoothConnected(bool enabled) override;
   void SetLocationAccessEnabled(bool enabled) override;
-  void SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason) override;
+  void ShowExitVrPrompt(UiUnsupportedMode reason) override;
   void SetSpeechRecognitionEnabled(bool enabled) override;
   void SetRecognitionResult(const base::string16& result) override;
   void OnSpeechRecognitionStateChanged(int new_state) override;
diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc
index 804ec09e..43292ad 100644
--- a/chrome/browser/android/vr_shell/vr_shell.cc
+++ b/chrome/browser/android/vr_shell/vr_shell.cc
@@ -557,7 +557,7 @@
 void VrShell::RequestToExitVr(JNIEnv* env,
                               const JavaParamRef<jobject>& obj,
                               int reason) {
-  ui_->SetExitVrPromptEnabled(true, static_cast<UiUnsupportedMode>(reason));
+  ui_->ShowExitVrPrompt(static_cast<UiUnsupportedMode>(reason));
 }
 
 void VrShell::ContentSurfaceCreated(jobject surface,
@@ -722,7 +722,8 @@
 
 void VrShell::OnUnsupportedMode(UiUnsupportedMode mode) {
   switch (mode) {
-    case UiUnsupportedMode::kUnhandledCodePoint:
+    case UiUnsupportedMode::kUnhandledCodePoint:  // Fall through.
+    case UiUnsupportedMode::kGenericUnsupportedFeature:
       ExitVrDueToUnsupportedMode(mode);
       return;
     case UiUnsupportedMode::kUnhandledPageInfo: {
@@ -750,7 +751,6 @@
   switch (choice) {
     case ExitVrPromptChoice::CHOICE_NONE:
     case ExitVrPromptChoice::CHOICE_STAY:
-      ui_->SetExitVrPromptEnabled(false, UiUnsupportedMode::kCount);
       should_exit = false;
       break;
     case ExitVrPromptChoice::CHOICE_EXIT:
@@ -1014,6 +1014,14 @@
   ui_->OnAssetsComponentReady();
 }
 
+void VrShell::AcceptDoffPromptForTesting(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  PostToGlThread(FROM_HERE,
+                 base::BindOnce(&VrShellGl::AcceptDoffPromptForTesting,
+                                gl_thread_->GetVrShellGl()));
+}
+
 // ----------------------------------------------------------------------------
 // Native JNI methods
 // ----------------------------------------------------------------------------
diff --git a/chrome/browser/android/vr_shell/vr_shell.h b/chrome/browser/android/vr_shell/vr_shell.h
index 3f25e24..fa7c077 100644
--- a/chrome/browser/android/vr_shell/vr_shell.h
+++ b/chrome/browser/android/vr_shell/vr_shell.h
@@ -236,6 +236,10 @@
   void OnAssetsLoaded(AssetsLoadStatus status,
                       const base::Version& component_version);
 
+  void AcceptDoffPromptForTesting(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj);
+
  private:
   ~VrShell() override;
   void PostToGlThread(const base::Location& from_here, base::OnceClosure task);
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index ab1952c..29db29f 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -1546,4 +1546,8 @@
   binding_.Close();
 }
 
+void VrShellGl::AcceptDoffPromptForTesting() {
+  ui_->AcceptDoffPromptForTesting();
+}
+
 }  // namespace vr
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.h b/chrome/browser/android/vr_shell/vr_shell_gl.h
index 824eb1e..6f682a0 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.h
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.h
@@ -128,6 +128,8 @@
 
   void SetAlertDialogSize(int width, int height);
 
+  void AcceptDoffPromptForTesting();
+
  private:
   void GvrInit(gvr_context* gvr_api);
   device::mojom::VRDisplayFrameTransportOptionsPtr
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index e5ca0a77..e7dd7e00 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -9,7 +9,7 @@
 #include <memory>
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/command_line.h"
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index 644db0c8..80d01f6 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -1833,8 +1833,17 @@
              NO_TEST_SERVER);
 }
 
-IN_PROC_BROWSER_TEST_P(WebViewSizeTest,
-                       Shim_TestResizeWebviewWithDisplayNoneResizesContent) {
+// Flaky on Chromium OS: https://crbug.com/814040
+#if defined(OS_CHROMEOS)
+#define MAYBE_Shim_TestResizeWebviewWithDisplayNoneResizesContent \
+  DISABLED_Shim_TestResizeWebviewWithDisplayNoneResizesContent
+#else
+#define MAYBE_Shim_TestResizeWebviewWithDisplayNoneResizesContent \
+  Shim_TestResizeWebviewWithDisplayNoneResizesContent
+#endif
+IN_PROC_BROWSER_TEST_P(
+    WebViewSizeTest,
+    MAYBE_Shim_TestResizeWebviewWithDisplayNoneResizesContent) {
   TestHelper("testResizeWebviewWithDisplayNoneResizesContent",
              "web_view/shim",
              NO_TEST_SERVER);
diff --git a/chrome/browser/banners/app_banner_manager.cc b/chrome/browser/banners/app_banner_manager.cc
index 716decf..7eae7986 100644
--- a/chrome/browser/banners/app_banner_manager.cc
+++ b/chrome/browser/banners/app_banner_manager.cc
@@ -488,11 +488,9 @@
   }
 
   // Start the pipeline immediately if we pass (or bypass) the engagement check,
-  // or if the feature to run the installability check on page load is enabled.
+  // or if the experimental app banners feature is active.
   if (state_ == State::INACTIVE &&
-      (has_sufficient_engagement_ ||
-       base::FeatureList::IsEnabled(
-           features::kCheckInstallabilityForBannerOnLoad))) {
+      (has_sufficient_engagement_ || IsExperimentalAppBannersEnabled())) {
     RequestAppBanner(validated_url, false /* is_debug_mode */);
   }
 }
diff --git a/chrome/browser/banners/app_banner_manager.h b/chrome/browser/banners/app_banner_manager.h
index f897a5ba0..a05d8c4 100644
--- a/chrome/browser/banners/app_banner_manager.h
+++ b/chrome/browser/banners/app_banner_manager.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/engagement/site_engagement_observer.h"
+#include "chrome/browser/installable/installable_ambient_badge_infobar_delegate.h"
 #include "chrome/browser/installable/installable_logging.h"
 #include "chrome/browser/installable/installable_manager.h"
 #include "chrome/browser/installable/installable_metrics.h"
@@ -27,7 +28,7 @@
 namespace content {
 class RenderFrameHost;
 class WebContents;
-}
+}  // namespace content
 
 // This forward declaration exists solely for the DidFinishCreatingBookmarkApp
 // callback, implemented and called on desktop platforms only.
@@ -53,6 +54,7 @@
 // web app banner (checking manifest validity, service worker, and icon).
 class AppBannerManager : public content::WebContentsObserver,
                          public blink::mojom::AppBannerService,
+                         public InstallableAmbientBadgeInfoBarDelegate::Client,
                          public SiteEngagementObserver {
  public:
   // A StatusReporter handles the reporting of |InstallableStatusCode|s.
@@ -149,6 +151,10 @@
   // Returns the installability status of a site.
   static Installable GetInstallable(content::WebContents* web_contents);
 
+  // InstallableAmbientBadgeInfoBarDelegate::Client overrides. Further
+  // overridden on Android.
+  void AddToHomescreenFromBadge() override {}
+
  protected:
   explicit AppBannerManager(content::WebContents* web_contents);
   ~AppBannerManager() override;
@@ -220,8 +226,10 @@
 
   // Sends a message to the renderer that the page has met the requirements to
   // show a banner. The page can respond to cancel the banner (and possibly
-  // display it later), or otherwise allow it to be shown.
-  void SendBannerPromptRequest();
+  // display it later), or otherwise allow it to be shown. Virtual to allow
+  // platform-specific code to perform actions when it is guaranteed that the
+  // page can show a banner.
+  virtual void SendBannerPromptRequest();
 
   // Updates the current state to |state|. Virtual to allow overriding in tests.
   virtual void UpdateState(State state);
diff --git a/chrome/browser/banners/app_banner_manager_android.cc b/chrome/browser/banners/app_banner_manager_android.cc
index c37376c..37e73c0f3 100644
--- a/chrome/browser/banners/app_banner_manager_android.cc
+++ b/chrome/browser/banners/app_banner_manager_android.cc
@@ -14,7 +14,9 @@
 #include "chrome/browser/banners/app_banner_metrics.h"
 #include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/banners/app_banner_ui_delegate_android.h"
-#include "chrome/browser/installable/pwa_ambient_badge_manager_android.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "components/infobars/core/infobar.h"
+#include "components/infobars/core/infobar_delegate.h"
 #include "content/public/browser/manifest_icon_downloader.h"
 #include "content/public/browser/web_contents.h"
 #include "jni/AppBannerManager_jni.h"
@@ -32,9 +34,7 @@
 
 AppBannerManagerAndroid::AppBannerManagerAndroid(
     content::WebContents* web_contents)
-    : AppBannerManager(web_contents),
-      ambient_badge_manager_(
-          std::make_unique<PwaAmbientBadgeManagerAndroid>(web_contents)) {
+    : AppBannerManager(web_contents) {
   can_install_webapk_ = ChromeWebApkHost::CanInstallWebApk();
   CreateJavaBannerManager();
 }
@@ -99,6 +99,11 @@
   AppBannerManager::RequestAppBanner(validated_url, is_debug_mode);
 }
 
+void AppBannerManagerAndroid::AddToHomescreenFromBadge() {
+  ShowBannerUi(InstallableMetrics::GetInstallSource(
+      web_contents(), InstallTrigger::AMBIENT_BADGE));
+}
+
 std::string AppBannerManagerAndroid::GetAppIdentifier() {
   return native_app_data_.is_null() ? AppBannerManager::GetAppIdentifier()
                                     : native_app_package_;
@@ -189,6 +194,26 @@
   SendBannerPromptRequest();
 }
 
+void AppBannerManagerAndroid::ShowAmbientBadge() {
+  InstallableAmbientBadgeInfoBarDelegate::Create(web_contents(), GetWeakPtr(),
+                                                 primary_icon_);
+}
+
+void AppBannerManagerAndroid::HideAmbientBadge() {
+  InfoBarService* infobar_service =
+      InfoBarService::FromWebContents(web_contents());
+
+  for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
+    infobars::InfoBar* infobar = infobar_service->infobar_at(i);
+    if (infobar->delegate()->GetIdentifier() ==
+        InstallableAmbientBadgeInfoBarDelegate::
+            INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE) {
+      infobar_service->RemoveInfoBar(infobar);
+      break;
+    }
+  }
+}
+
 void AppBannerManagerAndroid::ResetCurrentPageData() {
   AppBannerManager::ResetCurrentPageData();
   native_app_data_.Reset();
@@ -196,6 +221,13 @@
   ui_delegate_ = nullptr;
 }
 
+void AppBannerManagerAndroid::SendBannerPromptRequest() {
+  AppBannerManager::SendBannerPromptRequest();
+
+  if (IsExperimentalAppBannersEnabled())
+    ShowAmbientBadge();
+}
+
 void AppBannerManagerAndroid::ShowBannerUi(WebappInstallSource install_source) {
   content::WebContents* contents = web_contents();
   DCHECK(contents);
@@ -215,6 +247,7 @@
 
   bool banner_shown = false;
   if (IsExperimentalAppBannersEnabled()) {
+    HideAmbientBadge();
     banner_shown = ui_delegate_->ShowDialog();
   } else {
     banner_shown = AppBannerInfoBarDelegateAndroid::Create(
@@ -236,14 +269,6 @@
   }
 }
 
-void AppBannerManagerAndroid::DidFinishLoad(
-    content::RenderFrameHost* render_frame_host,
-    const GURL& validated_url) {
-  if (IsExperimentalAppBannersEnabled())
-    ambient_badge_manager_->MaybeShowBadge();
-  AppBannerManager::DidFinishLoad(render_frame_host, validated_url);
-}
-
 InstallableStatusCode AppBannerManagerAndroid::QueryNativeApp(
     const std::string& platform,
     const GURL& url,
diff --git a/chrome/browser/banners/app_banner_manager_android.h b/chrome/browser/banners/app_banner_manager_android.h
index fd6e49bb..f48e1fb 100644
--- a/chrome/browser/banners/app_banner_manager_android.h
+++ b/chrome/browser/banners/app_banner_manager_android.h
@@ -16,8 +16,6 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "url/gurl.h"
 
-class PwaAmbientBadgeManagerAndroid;
-
 namespace banners {
 
 class AppBannerUiDelegateAndroid;
@@ -74,6 +72,9 @@
   // AppBannerManager overrides.
   void RequestAppBanner(const GURL& validated_url, bool is_debug_mode) override;
 
+  // InstallableAmbientBadgeInfoBarAndroid::Client overrides.
+  void AddToHomescreenFromBadge() override;
+
  protected:
   // AppBannerManager overrides.
   std::string GetAppIdentifier() override;
@@ -87,12 +88,9 @@
   void OnDidPerformInstallableCheck(const InstallableData& result) override;
   void OnAppIconFetched(const SkBitmap& bitmap) override;
   void ResetCurrentPageData() override;
+  void SendBannerPromptRequest() override;
   void ShowBannerUi(WebappInstallSource install_source) override;
 
-  // content::WebContentsObserver overrides.
-  void DidFinishLoad(content::RenderFrameHost* render_frame_host,
-                     const GURL& validated_url) override;
-
  private:
   friend class content::WebContentsUserData<AppBannerManagerAndroid>;
 
@@ -113,7 +111,12 @@
                                        const GURL& url,
                                        const std::string& id);
 
-  std::unique_ptr<PwaAmbientBadgeManagerAndroid> ambient_badge_manager_;
+  // Shows the ambient badge if the current page advertises a native app or is
+  // a PWA.
+  void ShowAmbientBadge();
+
+  // Hides the ambient badge if it is showing.
+  void HideAmbientBadge();
 
   std::unique_ptr<AppBannerUiDelegateAndroid> ui_delegate_;
 
diff --git a/chrome/browser/banners/app_banner_manager_browsertest.cc b/chrome/browser/banners/app_banner_manager_browsertest.cc
index 73a045f75..0ff4d6d 100644
--- a/chrome/browser/banners/app_banner_manager_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_browsertest.cc
@@ -504,92 +504,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
-                       CheckOnLoadWithSufficientEngagement) {
+                       ExperimentalFlowWebAppBannerInsufficientEngagement) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kCheckInstallabilityForBannerOnLoad);
-  std::unique_ptr<AppBannerManagerTest> manager(
-      CreateAppBannerManager(browser()));
-  std::vector<double> engagement_scores{10};
-  RunBannerTest(browser(), manager.get(), GetBannerURL(), engagement_scores,
-                WebappInstallSource::AUTOMATIC_PROMPT_BROWSER_TAB,
-                SHOWING_WEB_APP_BANNER, true);
-}
-
-IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
-                       CheckOnLoadWithSufficientEngagementCancelDirect) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kCheckInstallabilityForBannerOnLoad);
-  std::unique_ptr<AppBannerManagerTest> manager(
-      CreateAppBannerManager(browser()));
-  std::vector<double> engagement_scores{10};
-  RunBannerTest(browser(), manager.get(),
-                GetBannerURLWithAction("cancel_prompt"), engagement_scores,
-                WebappInstallSource::COUNT, RENDERER_CANCELLED, false);
-}
-
-IN_PROC_BROWSER_TEST_F(
-    AppBannerManagerBrowserTest,
-    CheckOnLoadWithSufficientEngagementCancelBannerAfterPromptInHandler) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kCheckInstallabilityForBannerOnLoad);
-  std::unique_ptr<AppBannerManagerTest> manager(
-      CreateAppBannerManager(browser()));
-  std::vector<double> engagement_scores{10};
-  RunBannerTest(browser(), manager.get(),
-                GetBannerURLWithAction("call_prompt_in_handler"),
-                engagement_scores, WebappInstallSource::API_BROWSER_TAB,
-                SHOWING_WEB_APP_BANNER, true);
-  RunBannerTest(browser(), manager.get(),
-                GetBannerURLWithManifestAndQuery(
-                    "/banners/manifest_different_start_url.json", "action",
-                    "cancel_prompt"),
-                engagement_scores, WebappInstallSource::COUNT,
-                RENDERER_CANCELLED, false);
-}
-
-IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
-                       CheckOnLoadWithoutSufficientEngagement) {
-  AppBannerSettingsHelper::SetTotalEngagementToTrigger(1);
-  SiteEngagementService* service =
-      SiteEngagementService::Get(browser()->profile());
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kCheckInstallabilityForBannerOnLoad);
-  std::unique_ptr<AppBannerManagerTest> manager(
-      CreateAppBannerManager(browser()));
-
-  base::HistogramTester histograms;
-  GURL test_url = GetBannerURL();
-  service->ResetBaseScoreForURL(test_url, 0);
-
-  // First run through: expect the manager to end up stopped in the pending
-  // state, without showing a banner.
-  TriggerBannerFlowWithNavigation(browser(), manager.get(), test_url,
-                                  false /* expected_will_show */,
-                                  State::PENDING_ENGAGEMENT);
-
-  // Trigger an engagement increase that signals observers and expect the banner
-  // to be shown.
-  TriggerBannerFlow(
-      browser(), manager.get(),
-      base::BindOnce(&SiteEngagementService::HandleNavigation,
-                     base::Unretained(service),
-                     browser()->tab_strip_model()->GetActiveWebContents(),
-                     ui::PageTransition::PAGE_TRANSITION_TYPED),
-      true /* expected_will_show */, State::COMPLETE);
-
-  histograms.ExpectTotalCount(banners::kMinutesHistogram, 1);
-  histograms.ExpectUniqueSample(banners::kInstallableStatusCodeHistogram,
-                                SHOWING_WEB_APP_BANNER, 1);
-}
-
-IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest, CheckOnLoadThenNavigate) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kCheckInstallabilityForBannerOnLoad);
+  feature_list.InitAndEnableFeature(features::kExperimentalAppBanners);
   std::unique_ptr<AppBannerManagerTest> manager(
       CreateAppBannerManager(browser()));
 
@@ -641,6 +558,37 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
+                       ExperimentalFlowWebAppBannerCancelled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kExperimentalAppBanners);
+  std::unique_ptr<AppBannerManagerTest> manager(
+      CreateAppBannerManager(browser()));
+  base::HistogramTester histograms;
+
+  SiteEngagementService* service =
+      SiteEngagementService::Get(browser()->profile());
+
+  // Explicitly call preventDefault(), but don't call prompt().
+  GURL test_url = GetBannerURLWithAction("cancel_prompt");
+  service->ResetBaseScoreForURL(test_url, 10);
+
+  // Navigate and expect the manager to end up waiting for prompt() to be
+  // called.
+  TriggerBannerFlowWithNavigation(browser(), manager.get(), test_url,
+                                  false /* expected_will_show */,
+                                  State::PENDING_PROMPT);
+
+  // Navigate to about:blank and expect Stop() to be called.
+  TriggerBannerFlowWithNavigation(browser(), manager.get(), GURL("about:blank"),
+                                  false /* expected_will_show */,
+                                  State::INACTIVE);
+
+  histograms.ExpectTotalCount(banners::kMinutesHistogram, 0);
+  histograms.ExpectUniqueSample(banners::kInstallableStatusCodeHistogram,
+                                RENDERER_CANCELLED, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
                        ExperimentalFlowWebAppBannerPromptNeedsGesture) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(features::kExperimentalAppBanners);
@@ -702,6 +650,48 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
+                       ExperimentalFlowWebAppBannerNeedsEngagement) {
+  AppBannerSettingsHelper::SetTotalEngagementToTrigger(1);
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kExperimentalAppBanners);
+  std::unique_ptr<AppBannerManagerTest> manager(
+      CreateAppBannerManager(browser()));
+  base::HistogramTester histograms;
+
+  SiteEngagementService* service =
+      SiteEngagementService::Get(browser()->profile());
+  GURL test_url = GetBannerURLWithAction("stash_event");
+  service->ResetBaseScoreForURL(test_url, 0);
+
+  // Navigate and expect the manager to end up waiting for sufficient
+  // engagement.
+  TriggerBannerFlowWithNavigation(browser(), manager.get(), test_url,
+                                  false /* expected_will_show */,
+                                  State::PENDING_ENGAGEMENT);
+
+  // Trigger an engagement increase that signals observers and expect the
+  // manager to end up waiting for prompt to be called.
+  TriggerBannerFlow(
+      browser(), manager.get(),
+      base::BindOnce(&SiteEngagementService::HandleNavigation,
+                     base::Unretained(service),
+                     browser()->tab_strip_model()->GetActiveWebContents(),
+                     ui::PageTransition::PAGE_TRANSITION_TYPED),
+      false /* expected_will_show */, State::PENDING_PROMPT);
+
+  // Trigger prompt() and expect the banner to be shown.
+  TriggerBannerFlow(
+      browser(), manager.get(),
+      base::BindOnce(&ExecuteScript, browser(), "callStashedPrompt();",
+                     true /* with_gesture */),
+      true /* expected_will_show */, State::COMPLETE);
+
+  histograms.ExpectTotalCount(banners::kMinutesHistogram, 1);
+  histograms.ExpectUniqueSample(banners::kInstallableStatusCodeHistogram,
+                                SHOWING_WEB_APP_BANNER, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(AppBannerManagerBrowserTest,
                        ExperimentalFlowWebAppBannerReprompt) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(features::kExperimentalAppBanners);
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 4db38ae..9e103b9c 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -10,6 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
@@ -25,6 +26,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/browsing_data/core/browsing_data_utils.h"
+#include "components/browsing_data/core/features.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_context.h"
@@ -54,6 +56,8 @@
   BrowsingDataRemoverBrowserTest() {}
 
   void SetUpOnMainThread() override {
+    feature_list_.InitWithFeatures(
+        {browsing_data::features::kRemoveNavigationHistory}, {});
     base::FilePath path;
     PathService::Get(content::DIR_TEST_DATA, &path);
     host_resolver()->AddRule(kExampleHost, "127.0.0.1");
@@ -233,6 +237,8 @@
     *out_count = count;
     run_loop->Quit();
   }
+
+  base::test::ScopedFeatureList feature_list_;
 };
 
 // Test BrowsingDataRemover for downloads.
@@ -405,6 +411,26 @@
   ASSERT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
 }
 
+IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, HistoryDeletion) {
+  const std::string kType = "History";
+  GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html");
+  // Create a new tab to avoid confusion from having a NTP navigation entry.
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  EXPECT_FALSE(HasDataForType(kType));
+  SetDataForType(kType);
+  EXPECT_TRUE(HasDataForType(kType));
+  // Remove history from navigation to site_data.html.
+  RemoveAndWait(ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
+  EXPECT_FALSE(HasDataForType(kType));
+  SetDataForType(kType);
+  EXPECT_TRUE(HasDataForType(kType));
+  // Remove history from previous pushState() call in setHistory().
+  RemoveAndWait(ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
+  EXPECT_FALSE(HasDataForType(kType));
+}
+
 IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, CookieDeletion) {
   TestSiteData("Cookie");
 }
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 57d1783..6dc210e 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/navigation_entry_remover.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/domain_reliability/service_factory.h"
@@ -55,6 +56,7 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/bookmarks/browser/bookmark_model.h"
+#include "components/browsing_data/core/features.h"
 #include "components/content_settings/core/browser/content_settings_registry.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings.h"
@@ -324,7 +326,8 @@
 }  // namespace
 
 ChromeBrowsingDataRemoverDelegate::ChromeBrowsingDataRemoverDelegate(
-    BrowserContext* browser_context)
+    BrowserContext* browser_context,
+    history::HistoryService* history_service)
     : profile_(Profile::FromBrowserContext(browser_context)),
 #if BUILDFLAG(ENABLE_PLUGINS)
       flash_lso_helper_(BrowsingDataFlashLSOHelper::Create(browser_context)),
@@ -332,7 +335,12 @@
 #if defined(OS_ANDROID)
       webapp_registry_(new WebappRegistry()),
 #endif
-      weak_ptr_factory_(this) {}
+      history_observer_(this),
+      weak_ptr_factory_(this) {
+  if (history_service) {
+    history_observer_.Add(history_service);
+  }
+}
 
 ChromeBrowsingDataRemoverDelegate::~ChromeBrowsingDataRemoverDelegate() {}
 
@@ -346,6 +354,16 @@
   return base::BindRepeating(&DoesOriginMatchEmbedderMask);
 }
 
+void ChromeBrowsingDataRemoverDelegate::OnURLsDeleted(
+    history::HistoryService* history_service,
+    const history::DeletionTimeRange& time_range,
+    bool expired,
+    const history::URLRows& deleted_rows,
+    const std::set<GURL>& favicon_urls) {
+  if (!expired && !profile_->IsGuestSession())
+    browsing_data::RemoveNavigationEntries(profile_, time_range, deleted_rows);
+}
+
 bool ChromeBrowsingDataRemoverDelegate::MayRemoveDownloadHistory() const {
   return profile_->GetPrefs()->GetBoolean(prefs::kAllowDeletingBrowserHistory);
 }
@@ -484,7 +502,7 @@
     // Therefore, clearing history for a small set of origins (WHITELIST) should
     // never delete any extension launch times, while clearing for almost all
     // origins (BLACKLIST) should always delete all of extension launch times.
-    if (filter_builder.GetMode() == BrowsingDataFilterBuilder::BLACKLIST) {
+    if (filter_builder.IsEmptyBlacklist()) {
       extensions::ExtensionPrefs* extension_prefs =
           extensions::ExtensionPrefs::Get(profile_);
       extension_prefs->ClearLastLaunchTimes();
@@ -546,9 +564,15 @@
           prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY);
     }
 
+    // When this feature is enabled, recent tabs and sessions will be deleted
+    // by NavigationEntryRemover and not here.
+    bool is_navigation_entry_remover_enabled = base::FeatureList::IsEnabled(
+        browsing_data::features::kRemoveNavigationHistory);
+
     // If the caller is removing history for all hosts, then clear ancillary
     // historical information.
-    if (filter_builder.IsEmptyBlacklist()) {
+    if (!is_navigation_entry_remover_enabled &&
+        filter_builder.GetMode() == BrowsingDataFilterBuilder::BLACKLIST) {
       // We also delete the list of recently closed tabs. Since these expire,
       // they can't be more than a day old, so we can simply clear them all.
       sessions::TabRestoreService* tab_service =
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
index 617b2f93..2756471 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
@@ -11,11 +11,13 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
+#include "base/scoped_observer.h"
 #include "base/synchronization/waitable_event_watcher.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "build/build_config.h"
 #include "chrome/common/features.h"
 #include "components/browsing_data/core/browsing_data_utils.h"
+#include "components/history/core/browser/history_service_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/nacl/common/features.h"
 #include "components/offline_pages/core/offline_page_model.h"
@@ -43,9 +45,10 @@
 // as the embedder.
 class ChromeBrowsingDataRemoverDelegate
     : public content::BrowsingDataRemoverDelegate,
+      public history::HistoryServiceObserver,
       public KeyedService
 #if BUILDFLAG(ENABLE_PLUGINS)
-      ,
+    ,
       public PepperFlashSettingsManager::Client
 #endif
 {
@@ -147,7 +150,8 @@
   static_assert((IMPORTANT_SITES_DATA_TYPES & ~FILTERABLE_DATA_TYPES) == 0,
                 "All important sites datatypes must be filterable.");
 
-  ChromeBrowsingDataRemoverDelegate(content::BrowserContext* browser_context);
+  ChromeBrowsingDataRemoverDelegate(content::BrowserContext* browser_context,
+                                    history::HistoryService* history_service);
   ~ChromeBrowsingDataRemoverDelegate() override;
 
   // KeyedService:
@@ -165,6 +169,13 @@
       int origin_type_mask,
       base::OnceClosure callback) override;
 
+  // history::HistoryServiceObserver:
+  void OnURLsDeleted(history::HistoryService* history_service,
+                     const history::DeletionTimeRange& time_range,
+                     bool expired,
+                     const history::URLRows& deleted_rows,
+                     const std::set<GURL>& favicon_urls) override;
+
 #if defined(OS_ANDROID)
   void OverrideWebappRegistryForTesting(
       std::unique_ptr<WebappRegistry> webapp_registry);
@@ -257,6 +268,9 @@
   std::unique_ptr<WebappRegistry> webapp_registry_;
 #endif
 
+  ScopedObserver<history::HistoryService, history::HistoryServiceObserver>
+      history_observer_;
+
   base::WeakPtrFactory<ChromeBrowsingDataRemoverDelegate> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowsingDataRemoverDelegate);
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
index e696dac4..e86f5a7 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
@@ -95,5 +95,8 @@
 
 KeyedService* ChromeBrowsingDataRemoverDelegateFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  return new ChromeBrowsingDataRemoverDelegate(context);
+  Profile* profile = Profile::FromBrowserContext(context);
+  auto* history_service = HistoryServiceFactory::GetForProfile(
+      profile, ServiceAccessType::EXPLICIT_ACCESS);
+  return new ChromeBrowsingDataRemoverDelegate(context, history_service);
 }
diff --git a/chrome/browser/browsing_data/navigation_entry_remover.cc b/chrome/browser/browsing_data/navigation_entry_remover.cc
new file mode 100644
index 0000000..daa5613c
--- /dev/null
+++ b/chrome/browser/browsing_data/navigation_entry_remover.cc
@@ -0,0 +1,205 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/browsing_data/navigation_entry_remover.h"
+
+#include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/common/features.h"
+#include "components/browsing_data/core/features.h"
+#include "components/sessions/core/serialized_navigation_entry.h"
+#include "components/sessions/core/tab_restore_service.h"
+#include "components/sessions/core/tab_restore_service_observer.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/web_contents.h"
+
+#if defined(OS_ANDROID)
+#include "chrome/browser/android/tab_android.h"
+#include "chrome/browser/ui/android/tab_model/tab_model.h"
+#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
+#else
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#endif
+
+#if BUILDFLAG(ENABLE_SESSION_SERVICE)
+#include "chrome/browser/sessions/session_service.h"
+#include "chrome/browser/sessions/session_service_factory.h"
+#endif  // BUILDFLAG(ENABLE_SESSION_SERVICE)
+
+namespace {
+
+bool TimeRangeMatcher(base::Time begin,
+                      base::Time end,
+                      const content::NavigationEntry& entry) {
+  return begin <= entry.GetTimestamp() &&
+         (entry.GetTimestamp() < end || end.is_null());
+}
+
+bool TimeRangeMatcherForSession(
+    base::Time begin,
+    base::Time end,
+    const sessions::SerializedNavigationEntry& entry) {
+  return begin <= entry.timestamp() &&
+         (entry.timestamp() < end || end.is_null());
+}
+
+bool UrlMatcher(const base::flat_set<GURL>& urls,
+                const content::NavigationEntry& entry) {
+  return urls.find(entry.GetURL()) != urls.end();
+}
+
+bool UrlMatcherForSession(const base::flat_set<GURL>& urls,
+                          const sessions::SerializedNavigationEntry& entry) {
+  return urls.find(entry.virtual_url()) != urls.end();
+}
+
+base::flat_set<GURL> CreateUrlSet(const history::URLRows& deleted_rows) {
+  std::vector<GURL> urls;
+  for (const history::URLRow& row : deleted_rows) {
+    urls.push_back(row.url());
+  }
+  return base::flat_set<GURL>(std::move(urls));
+}
+
+// Desktop is using |TabStripModel|, Android |TabModel|. They don't have a
+// common base class but both have a |GetWebContentsAt()| method.
+// TODO(dullweber): Add a common base class?
+template <typename TabList>
+void DeleteNavigationEntries(
+    TabList* tab_list,
+    int tab_count,
+    const content::NavigationController::DeletionPredicate& predicate) {
+  for (int i = 0; i < tab_count; i++) {
+    content::WebContents* web_contents = tab_list->GetWebContentsAt(i);
+    content::NavigationController* controller = &web_contents->GetController();
+    controller->DiscardNonCommittedEntries();
+    // We discarded pending and transient entries but there could still be
+    // no last_committed_entry, which would prevent deletion.
+    if (controller->CanPruneAllButLastCommitted())
+      controller->DeleteNavigationEntries(predicate);
+  }
+}
+
+void DeleteTabNavigationEntries(Profile* profile,
+                                const history::DeletionTimeRange& time_range,
+                                const base::flat_set<GURL>& url_set) {
+  auto predicate =
+      time_range.IsValid()
+          ? base::BindRepeating(&TimeRangeMatcher, time_range.begin(),
+                                time_range.end())
+          : base::BindRepeating(&UrlMatcher, base::ConstRef(url_set));
+
+#if defined(OS_ANDROID)
+  for (auto it = TabModelList::begin(); it != TabModelList::end(); ++it) {
+    TabModel* tab_model = *it;
+    if (tab_model->GetProfile() == profile) {
+      DeleteNavigationEntries(tab_model, tab_model->GetTabCount(), predicate);
+    }
+  }
+#else
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    TabStripModel* tab_strip = browser->tab_strip_model();
+    if (browser->profile() == profile) {
+      DeleteNavigationEntries(tab_strip, tab_strip->count(), predicate);
+    }
+  }
+#endif
+}
+
+void PerformTabRestoreDeletion(
+    sessions::TabRestoreService* service,
+    const sessions::TabRestoreService::DeletionPredicate& predicate) {
+  service->DeleteNavigationEntries(predicate);
+  service->DeleteLastSession();
+}
+
+// This class waits until TabRestoreService is loaded, then deletes
+// navigation entries using |predicate| and deletes itself afterwards.
+class TabRestoreDeletionHelper : public sessions::TabRestoreServiceObserver {
+ public:
+  TabRestoreDeletionHelper(
+      sessions::TabRestoreService* service,
+      const sessions::TabRestoreService::DeletionPredicate& predicate)
+      : service_(service), deletion_predicate_(predicate) {
+    DCHECK(!service->IsLoaded());
+    service->AddObserver(this);
+    service->LoadTabsFromLastSession();
+  }
+
+  // sessions::TabRestoreServiceObserver:
+  void TabRestoreServiceDestroyed(
+      sessions::TabRestoreService* service) override {
+    delete this;
+  }
+
+  void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override {
+    PerformTabRestoreDeletion(service, deletion_predicate_);
+    delete this;
+  }
+
+ private:
+  ~TabRestoreDeletionHelper() override { service_->RemoveObserver(this); }
+
+  sessions::TabRestoreService* service_;
+  sessions::TabRestoreService::DeletionPredicate deletion_predicate_;
+
+  DISALLOW_COPY_AND_ASSIGN(TabRestoreDeletionHelper);
+};
+
+void DeleteTabRestoreEntries(Profile* profile,
+                             const history::DeletionTimeRange& time_range,
+                             const base::flat_set<GURL>& url_set) {
+  sessions::TabRestoreService* tab_service =
+      TabRestoreServiceFactory::GetForProfile(profile);
+  if (tab_service) {
+    auto predicate =
+        time_range.IsValid()
+            ? base::BindRepeating(&TimeRangeMatcherForSession,
+                                  time_range.begin(), time_range.end())
+            : base::BindRepeating(&UrlMatcherForSession, url_set);
+    if (tab_service->IsLoaded()) {
+      PerformTabRestoreDeletion(tab_service, predicate);
+    } else {
+      // The helper deletes itself when the tab entry deletion is finished.
+      new TabRestoreDeletionHelper(tab_service, predicate);
+    }
+  }
+}
+
+void DeleteLastSessionFromSessionService(Profile* profile) {
+#if BUILDFLAG(ENABLE_SESSION_SERVICE)
+  SessionService* session_service =
+      SessionServiceFactory::GetForProfile(profile);
+  if (session_service)
+    session_service->DeleteLastSession();
+#endif
+}
+
+}  // namespace
+
+namespace browsing_data {
+
+void RemoveNavigationEntries(Profile* profile,
+                             const history::DeletionTimeRange& time_range,
+                             const history::URLRows& deleted_rows) {
+  DCHECK(profile->GetProfileType() == Profile::ProfileType::REGULAR_PROFILE);
+  if (!base::FeatureList::IsEnabled(
+          browsing_data::features::kRemoveNavigationHistory)) {
+    return;
+  }
+
+  base::flat_set<GURL> url_set;
+  if (!time_range.IsValid())
+    url_set = CreateUrlSet(deleted_rows);
+
+  DeleteTabNavigationEntries(profile, time_range, url_set);
+  DeleteTabRestoreEntries(profile, time_range, url_set);
+  DeleteLastSessionFromSessionService(profile);
+}
+
+}  // namespace browsing_data
diff --git a/chrome/browser/browsing_data/navigation_entry_remover.h b/chrome/browser/browsing_data/navigation_entry_remover.h
new file mode 100644
index 0000000..6702af4
--- /dev/null
+++ b/chrome/browser/browsing_data/navigation_entry_remover.h
@@ -0,0 +1,27 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_BROWSING_DATA_NAVIGATION_ENTRY_REMOVER_H_
+#define CHROME_BROWSER_BROWSING_DATA_NAVIGATION_ENTRY_REMOVER_H_
+
+#include "components/history/core/browser/history_types.h"
+#include "components/history/core/browser/url_row.h"
+
+class Profile;
+
+namespace browsing_data {
+
+// Remove navigation entries from the tabs of all browsers of |profile|.
+// Recent tabs will be cleaned up as well and the session will be rewritten.
+// The last session will be removed as it can't be cleaned up easily.
+// If a valid time_range is supplied, all entries within this time range will be
+// removed and |deleted_rows| is ignored.
+// Otherwise entries matching |deleted_rows| will be deleted.
+void RemoveNavigationEntries(Profile* profile,
+                             const history::DeletionTimeRange& time_range,
+                             const history::URLRows& deleted_rows);
+
+}  // namespace browsing_data
+
+#endif  // CHROME_BROWSER_BROWSING_DATA_NAVIGATION_ENTRY_REMOVER_H_
diff --git a/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc
new file mode 100644
index 0000000..a3a05b2
--- /dev/null
+++ b/chrome/browser/browsing_data/navigation_entry_remover_browsertest.cc
@@ -0,0 +1,270 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_path.h"
+#include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
+#include "chrome/browser/browsing_data/navigation_entry_remover.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/browsing_data/core/features.h"
+#include "components/sessions/core/tab_restore_service.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "url/gurl.h"
+
+class NavigationEntryRemoverTest : public InProcessBrowserTest {
+ protected:
+  void SetUpOnMainThread() override {
+    feature_list_.InitWithFeatures(
+        {browsing_data::features::kRemoveNavigationHistory}, {});
+    auto path = base::FilePath(FILE_PATH_LITERAL("browsing_data"));
+    url_a_ = ui_test_utils::GetTestUrl(
+        path, base::FilePath(FILE_PATH_LITERAL("a.html")));
+    url_b_ = ui_test_utils::GetTestUrl(
+        path, base::FilePath(FILE_PATH_LITERAL("b.html")));
+    url_c_ = ui_test_utils::GetTestUrl(
+        path, base::FilePath(FILE_PATH_LITERAL("c.html")));
+    url_d_ = ui_test_utils::GetTestUrl(
+        path, base::FilePath(FILE_PATH_LITERAL("d.html")));
+    about_blank_ = GURL("about:blank");
+  }
+
+  void AddNavigations(Browser* browser, const std::vector<GURL>& urls) {
+    for (const GURL& url : urls) {
+      ui_test_utils::NavigateToURLWithDisposition(
+          browser, url, WindowOpenDisposition::CURRENT_TAB,
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+    }
+  }
+
+  void AddTab(Browser* browser, const std::vector<GURL>& urls) {
+    ui_test_utils::NavigateToURLWithDisposition(
+        browser, urls[0], WindowOpenDisposition::NEW_FOREGROUND_TAB,
+        ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
+            ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+    AddNavigations(browser, {urls.begin() + 1, urls.end()});
+  }
+
+  void AddBrowser(Browser* browser, const std::vector<GURL>& urls) {
+    ui_test_utils::NavigateToURLWithDisposition(
+        browser, urls[0], WindowOpenDisposition::NEW_WINDOW,
+        ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
+    AddNavigations(BrowserList::GetInstance()->GetLastActive(),
+                   {urls.begin() + 1, urls.end()});
+  }
+
+  void GoBack(content::WebContents* web_contents) {
+    content::WindowedNotificationObserver load_stop_observer(
+        content::NOTIFICATION_LOAD_STOP,
+        content::NotificationService::AllSources());
+    web_contents->GetController().GoBack();
+    load_stop_observer.Wait();
+  }
+
+  std::vector<GURL> GetEntries() {
+    std::vector<GURL> urls;
+    for (Browser* browser : *BrowserList::GetInstance()) {
+      for (int j = 0; j < browser->tab_strip_model()->count(); j++) {
+        content::NavigationController* controller =
+            &browser->tab_strip_model()->GetWebContentsAt(j)->GetController();
+        for (int i = 0; i < controller->GetEntryCount(); i++)
+          urls.push_back(controller->GetEntryAtIndex(i)->GetURL());
+      }
+    }
+    return urls;
+  }
+
+  // Helper to compare vectors. The macro gets confused by EXPECT_EQ(v, {a,b}).
+  void ExpectEntries(const std::vector<GURL>& expected,
+                     const std::vector<GURL>& actual) {
+    EXPECT_EQ(expected, actual);
+  }
+
+  GURL url_a_;
+  GURL url_b_;
+  GURL url_c_;
+  GURL url_d_;
+  GURL about_blank_;
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// === Tests for helper functions ===
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, AddNavigation) {
+  // A new browser starts with about:blank. Add a,b,c and check.
+  ExpectEntries({about_blank_}, GetEntries());
+  AddNavigations(browser(), {url_a_, url_b_, url_c_});
+  ExpectEntries({about_blank_, url_a_, url_b_, url_c_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, AddTab) {
+  EXPECT_EQ(1, browser()->tab_strip_model()->count());
+
+  AddTab(browser(), {url_a_});
+  EXPECT_EQ(2, browser()->tab_strip_model()->count());
+  ExpectEntries({about_blank_, url_a_}, GetEntries());
+
+  AddTab(browser(), {url_b_, url_c_});
+  EXPECT_EQ(3, browser()->tab_strip_model()->count());
+  ExpectEntries({about_blank_, url_a_, url_b_, url_c_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, AddWindow) {
+  EXPECT_EQ(1U, BrowserList::GetInstance()->size());
+
+  AddBrowser(browser(), {url_a_, url_b_});
+  EXPECT_EQ(2U, BrowserList::GetInstance()->size());
+  ExpectEntries({about_blank_, url_a_, url_b_}, GetEntries());
+
+  AddBrowser(browser(), {url_c_, url_d_});
+  EXPECT_EQ(3U, BrowserList::GetInstance()->size());
+  ExpectEntries({about_blank_, url_a_, url_b_, url_c_, url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, GoBack) {
+  AddNavigations(browser(), {url_a_, url_b_, url_c_});
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  EXPECT_EQ(url_c_, web_contents->GetLastCommittedURL());
+  GoBack(web_contents);
+  EXPECT_EQ(url_b_, web_contents->GetLastCommittedURL());
+  ExpectEntries({about_blank_, url_a_, url_b_, url_c_}, GetEntries());
+}
+
+// === The actual tests ===
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, DeleteIndividual) {
+  AddNavigations(browser(), {url_a_, url_b_, url_c_, url_d_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_b_, base::Time())});
+  ExpectEntries({about_blank_, url_a_, url_c_, url_d_}, GetEntries());
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_c_, base::Time())});
+  ExpectEntries({about_blank_, url_a_, url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, DeleteAfterNavigation) {
+  AddNavigations(browser(), {url_a_, url_b_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_b_, base::Time())});
+  // The commited entry can't be removed.
+  ExpectEntries({about_blank_, url_a_, url_b_}, GetEntries());
+
+  AddNavigations(browser(), {url_c_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_b_, base::Time())});
+  ExpectEntries({about_blank_, url_a_, url_c_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, DeleteAll) {
+  AddNavigations(browser(), {url_a_, url_b_, url_c_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+  ExpectEntries({url_c_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, DeleteRange) {
+  base::Time t1 = base::Time::Now();
+  AddNavigations(browser(), {url_a_});
+  base::Time t2 = base::Time::Now();
+  AddNavigations(browser(), {url_b_});
+  base::Time t3 = base::Time::Now();
+  AddNavigations(browser(), {url_c_, url_d_});
+  ASSERT_NE(t1, t2);
+  ASSERT_NE(t2, t3);
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange(t2, t3), {});
+  ExpectEntries({about_blank_, url_a_, url_c_, url_d_}, GetEntries());
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange(base::Time(), t1), {});
+  ExpectEntries({url_a_, url_c_, url_d_}, GetEntries());
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange(t3, base::Time()), {});
+  ExpectEntries({url_a_, url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, DeleteAllAfterNavigation) {
+  AddNavigations(browser(), {url_a_, url_b_, url_c_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+  ExpectEntries({url_c_}, GetEntries());
+
+  AddNavigations(browser(), {url_d_});
+  ExpectEntries({url_c_, url_d_}, GetEntries());
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+  ExpectEntries({url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, TwoTabsDeletion) {
+  AddNavigations(browser(), {url_a_, url_b_});
+  AddTab(browser(), {url_c_, url_d_});
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+
+  ExpectEntries({url_b_, url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, TwoWindowsDeletion) {
+  AddNavigations(browser(), {url_a_, url_b_});
+  AddBrowser(browser(), {url_c_, url_d_});
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+
+  ExpectEntries({url_b_, url_d_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, GoBackAndDelete) {
+  AddNavigations(browser(), {url_a_, url_b_, url_c_});
+
+  GoBack(browser()->tab_strip_model()->GetActiveWebContents());
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::AllTime(), {});
+
+  ExpectEntries({url_b_}, GetEntries());
+}
+
+IN_PROC_BROWSER_TEST_F(NavigationEntryRemoverTest, RecentTabDeletion) {
+  AddNavigations(browser(), {url_a_, url_b_});
+  AddTab(browser(), {url_c_});
+  AddTab(browser(), {url_d_});
+  chrome::CloseTab(browser());
+  chrome::CloseTab(browser());
+
+  sessions::TabRestoreService* tab_service =
+      TabRestoreServiceFactory::GetForProfile(browser()->profile());
+  EXPECT_EQ(2U, tab_service->entries().size());
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_c_, base::Time())});
+  content::RunAllTasksUntilIdle();
+  EXPECT_EQ(1U, tab_service->entries().size());
+  auto* tab = static_cast<sessions::TabRestoreService::Tab*>(
+      tab_service->entries().front().get());
+  EXPECT_EQ(url_d_, tab->navigations.back().virtual_url());
+  EXPECT_TRUE(tab_service->IsLoaded());
+
+  browsing_data::RemoveNavigationEntries(
+      browser()->profile(), history::DeletionTimeRange::Invalid(),
+      {history::URLResult(url_d_, base::Time())});
+  EXPECT_EQ(0U, tab_service->entries().size());
+}
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 5df707de..161fbc4 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -376,6 +376,7 @@
 #include "extensions/browser/extension_navigation_throttle.h"
 #include "extensions/browser/extension_protocols.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
 #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
@@ -3755,9 +3756,13 @@
     content::RenderFrameHost* frame_host,
     NonNetworkURLLoaderFactoryMap* factories) {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+  content::BrowserContext* browser_context =
+      frame_host->GetProcess()->GetBrowserContext();
   factories->emplace(
       extensions::kExtensionScheme,
-      extensions::CreateExtensionNavigationURLLoaderFactory(frame_host));
+      extensions::CreateExtensionNavigationURLLoaderFactory(
+          frame_host,
+          extensions::ExtensionSystem::Get(browser_context)->info_map()));
 #endif
 }
 
@@ -3767,8 +3772,11 @@
         const GURL& frame_url,
         NonNetworkURLLoaderFactoryMap* factories) {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+  content::BrowserContext* browser_context =
+      frame_host->GetProcess()->GetBrowserContext();
   auto factory = extensions::MaybeCreateExtensionSubresourceURLLoaderFactory(
-      frame_host, frame_url);
+      frame_host, frame_url,
+      extensions::ExtensionSystem::Get(browser_context)->info_map());
   if (factory)
     factories->emplace(extensions::kExtensionScheme, std::move(factory));
 #endif
diff --git a/chrome/browser/chrome_content_browser_manifest_overlay.json b/chrome/browser/chrome_content_browser_manifest_overlay.json
index 64ec0ff..1547d37b 100644
--- a/chrome/browser/chrome_content_browser_manifest_overlay.json
+++ b/chrome/browser/chrome_content_browser_manifest_overlay.json
@@ -15,6 +15,7 @@
           "mojom::ModuleEventSink",
           "rappor::mojom::RapporRecorder",
           "safe_browsing::mojom::SafeBrowsing",
+          "safe_browsing::mojom::PhishingDetectorClient",
           "translate::mojom::ContentTranslateDriver"
         ],
         "gpu": [
diff --git a/chrome/browser/chrome_content_renderer_manifest_overlay.json b/chrome/browser/chrome_content_renderer_manifest_overlay.json
index 668dfea..0a717e6 100644
--- a/chrome/browser/chrome_content_renderer_manifest_overlay.json
+++ b/chrome/browser/chrome_content_renderer_manifest_overlay.json
@@ -23,6 +23,7 @@
           "dom_distiller::mojom::DistillerPageNotifierService",
           "extensions::mojom::AppWindow",
           "safe_browsing::mojom::ThreatReporter",
+          "safe_browsing::mojom::PhishingDetector",
           "spellcheck::mojom::SpellCheckPanel"
         ]
       }
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index aed4181..c048942 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1234,6 +1234,8 @@
     "policy/android_management_client.h",
     "policy/app_install_event_log.cc",
     "policy/app_install_event_log.h",
+    "policy/app_install_event_log_uploader.cc",
+    "policy/app_install_event_log_uploader.h",
     "policy/auto_enrollment_client.cc",
     "policy/auto_enrollment_client.h",
     "policy/bluetooth_policy_handler.cc",
@@ -1913,6 +1915,7 @@
     "policy/affiliated_invalidation_service_provider_impl_unittest.cc",
     "policy/android_management_client_unittest.cc",
     "policy/app_install_event_log_unittest.cc",
+    "policy/app_install_event_log_uploader_unittest.cc",
     "policy/auto_enrollment_client_unittest.cc",
     "policy/bluetooth_policy_handler_unittest.cc",
     "policy/cached_policy_key_loader_chromeos_unittest.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 2f81b5ba..09e2d6f4 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -679,7 +679,6 @@
   quirks::QuirksManager::Initialize(
       std::unique_ptr<quirks::QuirksManager::Delegate>(
           new quirks::QuirksManagerDelegateImpl()),
-      base::CreateTaskRunnerWithTraits({base::MayBlock()}),
       g_browser_process->local_state(),
       g_browser_process->system_request_context());
 
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 1e70f87..aa77f48 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -271,8 +271,8 @@
 // Returns new CommandLine with per-user flags.
 base::CommandLine CreatePerSessionCommandLine(Profile* profile) {
   base::CommandLine user_flags(base::CommandLine::NO_PROGRAM);
-  flags_ui::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs());
-  about_flags::ConvertFlagsToSwitches(&flags_storage_, &user_flags,
+  flags_ui::PrefServiceFlagsStorage flags_storage(profile->GetPrefs());
+  about_flags::ConvertFlagsToSwitches(&flags_storage, &user_flags,
                                       flags_ui::kAddSentinels);
 
   UserSessionManager::MaybeAppendPolicySwitches(profile->GetPrefs(),
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index a0bc3922..14fdbdab 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -166,9 +166,21 @@
   DISALLOW_COPY_AND_ASSIGN(AnimationObserver);
 };
 
+// Even if oobe is complete we may still want to show it, for example, if there
+// are no users registered then the user may want to enterprise enroll.
+bool IsOobeComplete() {
+  policy::BrowserPolicyConnectorChromeOS* connector =
+      g_browser_process->platform_part()->browser_policy_connector_chromeos();
+
+  // Oobe is completed and we have a user or we are enterprise enrolled.
+  return chromeos::StartupUtils::IsOobeCompleted() &&
+         (!user_manager::UserManager::Get()->GetUsers().empty() ||
+          connector->IsEnterpriseManaged());
+}
+
 bool ShouldShowSigninScreen(chromeos::OobeScreen first_screen) {
   return (first_screen == chromeos::OobeScreen::SCREEN_UNKNOWN &&
-          chromeos::StartupUtils::IsOobeCompleted()) ||
+          IsOobeComplete()) ||
          first_screen == chromeos::OobeScreen::SCREEN_SPECIAL_LOGIN;
 }
 
@@ -1183,9 +1195,8 @@
           switches::kNaturalScrollDefault));
 
   session_manager::SessionManager::Get()->SetSessionState(
-      StartupUtils::IsOobeCompleted()
-          ? session_manager::SessionState::LOGIN_PRIMARY
-          : session_manager::SessionState::OOBE);
+      IsOobeComplete() ? session_manager::SessionState::LOGIN_PRIMARY
+                       : session_manager::SessionState::OOBE);
 
   bool show_app_launch_splash_screen =
       (first_screen == OobeScreen::SCREEN_APP_LAUNCH_SPLASH);
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_uploader.cc b/chrome/browser/chromeos/policy/app_install_event_log_uploader.cc
new file mode 100644
index 0000000..3e17be3
--- /dev/null
+++ b/chrome/browser/chromeos/policy/app_install_event_log_uploader.cc
@@ -0,0 +1,117 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/policy/app_install_event_log_uploader.h"
+
+#include <algorithm>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "components/policy/proto/device_management_backend.pb.h"
+
+namespace policy {
+
+namespace {
+
+// The backoff time starts at |kMinRetryBackoffMs| and doubles after each upload
+// failure until it reaches |kMaxRetryBackoffMs|, from which point on it remains
+// constant. The backoff is reset to |kMinRetryBackoffMs| after the next
+// successful upload or if the upload request is canceled.
+const int kMinRetryBackoffMs = 10 * 1000;            // 10 seconds
+const int kMaxRetryBackoffMs = 24 * 60 * 60 * 1000;  // 24 hours
+
+}  // namespace
+
+AppInstallEventLogUploader::Delegate::~Delegate() {}
+
+AppInstallEventLogUploader::AppInstallEventLogUploader(
+    CloudPolicyClient* client)
+    : client_(client),
+      retry_backoff_ms_(kMinRetryBackoffMs),
+      weak_factory_(this) {
+  client_->AddObserver(this);
+}
+
+AppInstallEventLogUploader::~AppInstallEventLogUploader() {
+  CancelUpload();
+  client_->RemoveObserver(this);
+}
+
+void AppInstallEventLogUploader::SetDelegate(Delegate* delegate) {
+  if (delegate_) {
+    CancelUpload();
+  }
+  delegate_ = delegate;
+}
+
+void AppInstallEventLogUploader::RequestUpload() {
+  CHECK(delegate_);
+  if (upload_requested_) {
+    return;
+  }
+
+  upload_requested_ = true;
+  if (client_->is_registered()) {
+    StartSerialization();
+  }
+}
+
+void AppInstallEventLogUploader::CancelUpload() {
+  weak_factory_.InvalidateWeakPtrs();
+  client_->CancelAppInstallReportUpload();
+  upload_requested_ = false;
+  retry_backoff_ms_ = kMinRetryBackoffMs;
+}
+
+void AppInstallEventLogUploader::OnRegistrationStateChanged(
+    CloudPolicyClient* client) {
+  if (!upload_requested_) {
+    return;
+  }
+
+  if (client->is_registered()) {
+    StartSerialization();
+  } else {
+    CancelUpload();
+    RequestUpload();
+  }
+}
+
+void AppInstallEventLogUploader::StartSerialization() {
+  delegate_->SerializeForUpload(base::BindOnce(
+      &AppInstallEventLogUploader::OnSerialized, weak_factory_.GetWeakPtr()));
+}
+
+void AppInstallEventLogUploader::OnSerialized(
+    const enterprise_management::AppInstallReportRequest* report) {
+  // base::Unretained() is safe here as the destructor cancels any pending
+  // upload, after which the |client_| is guaranteed to not call the callback.
+  client_->UploadAppInstallReport(
+      report,
+      base::AdaptCallbackForRepeating(base::BindOnce(
+          &AppInstallEventLogUploader::OnUploadDone, base::Unretained(this))));
+}
+
+void AppInstallEventLogUploader::OnUploadDone(bool success) {
+  if (success) {
+    upload_requested_ = false;
+    retry_backoff_ms_ = kMinRetryBackoffMs;
+    delegate_->OnUploadSuccess();
+    return;
+  }
+
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&AppInstallEventLogUploader::StartSerialization,
+                     weak_factory_.GetWeakPtr()),
+      base::TimeDelta::FromMilliseconds(retry_backoff_ms_));
+  retry_backoff_ms_ = std::min(retry_backoff_ms_ << 1, kMaxRetryBackoffMs);
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_uploader.h b/chrome/browser/chromeos/policy/app_install_event_log_uploader.h
new file mode 100644
index 0000000..813ac541e
--- /dev/null
+++ b/chrome/browser/chromeos/policy/app_install_event_log_uploader.h
@@ -0,0 +1,124 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_APP_INSTALL_EVENT_LOG_UPLOADER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_APP_INSTALL_EVENT_LOG_UPLOADER_H_
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/policy/core/common/cloud/cloud_policy_client.h"
+
+namespace enterprise_management {
+class AppInstallReportRequest;
+}
+
+namespace policy {
+
+// Adapter between the system that captures and stores app push-install event
+// logs and the policy system which uploads them to the management server. When
+// asked to upload event logs, retrieves them from the log store asynchronously
+// and forwards them for upload, scheduling retries with exponential backoff in
+// case of upload failures.
+class AppInstallEventLogUploader : public CloudPolicyClient::Observer {
+ public:
+  // The delegate that event logs will be retrieved from.
+  class Delegate {
+   public:
+    // Callback invoked by the delegate with the logs to be uploaded in
+    // |report|.
+    using SerializationCallback = base::OnceCallback<void(
+        const enterprise_management::AppInstallReportRequest* report)>;
+
+    // Requests that the delegate serialize the current logs into a protobuf
+    // and pass it to |callback|.
+    virtual void SerializeForUpload(SerializationCallback callback) = 0;
+
+    // Notification to the delegate that the logs passed via the most recent
+    // |SerializationCallback| have been successfully uploaded to the server and
+    // can be pruned from storage.
+    virtual void OnUploadSuccess() = 0;
+
+   protected:
+    virtual ~Delegate();
+  };
+
+  // |client| must outlive |this|.
+  explicit AppInstallEventLogUploader(CloudPolicyClient* client);
+  ~AppInstallEventLogUploader() override;
+
+  // Sets the delegate. The delegate must either outlive |this| or be explicitly
+  // removed by calling |SetDelegate(nullptr)|. Removing the delegate cancels
+  // the pending log upload, if any.
+  void SetDelegate(Delegate* delegate);
+
+  // Requests log upload. If there is no pending upload yet, asks the delegate
+  // to serialize the current logs into a protobuf and sends this to the server.
+  // If an upload is pending already, no new upload is scheduled. However, the
+  // delegate is notified when the pending upload succeeds and may request
+  // another upload at that point.
+  //
+  // Once requested, the upload is retried with exponential backoff until it
+  // succeeds. For each retry, the delegate is asked to serialize logs anew, so
+  // that the most recent logs are uploaded.
+  //
+  // Must only be calling after setting a delegate.
+  void RequestUpload();
+
+  // Cancels the pending log upload, if any. Any log currently being serialized
+  // by the delegate or uploaded by the client is discarded.
+  void CancelUpload();
+
+  // CloudPolicyClient::Observer:
+  void OnPolicyFetched(CloudPolicyClient* client) override {}
+  // Uploads are only possible while the client is registered with the server.
+  // If an upload is requested while the client is not registered, the request
+  // is stored until the client registers. If the client loses its registration
+  // while an upload is pending, the upload is canceled and stored for retry
+  // when the client registers again. A stored request is handled as a brand new
+  // request when the client registers, by asking the delegate to serialize logs
+  // and with the exponential backoff reset to its minimum.
+  void OnRegistrationStateChanged(CloudPolicyClient* client) override;
+  void OnRobotAuthCodesFetched(CloudPolicyClient* client) override {}
+  void OnClientError(CloudPolicyClient* client) override {}
+
+ private:
+  // Asks the delegate to serialize the current logs into a protobuf and pass it
+  // a callback.
+  void StartSerialization();
+
+  // Callback invoked by the delegate with the logs to be uploaded in |report|.
+  // Forwards the logs to the client for upload.
+  void OnSerialized(
+      const enterprise_management::AppInstallReportRequest* report);
+
+  // Notification by the client that the most recent log upload has succeeded if
+  // |success| is |true| or retries have been exhausted if |success| is |false|.
+  // Forwards success to the delegate and schedules a retry with exponential
+  // backoff in case of failure.
+  void OnUploadDone(bool success);
+
+  // The client used to upload logs to the server.
+  CloudPolicyClient* client_ = nullptr;
+
+  // The delegate that provides serialized logs to be uploaded.
+  Delegate* delegate_ = nullptr;
+
+  // |true| if log upload has been requested and not completed yet.
+  bool upload_requested_ = false;
+
+  // The backoff, in milliseconds, for the next upload retry.
+  int retry_backoff_ms_;
+
+  // Weak pointer factory for invalidating callbacks passed to the delegate and
+  // scheduled retries when the upload request is canceled or |this| is
+  // destroyed.
+  base::WeakPtrFactory<AppInstallEventLogUploader> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppInstallEventLogUploader);
+};
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_APP_INSTALL_EVENT_LOG_UPLOADER_H_
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc
new file mode 100644
index 0000000..953874b
--- /dev/null
+++ b/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc
@@ -0,0 +1,437 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/policy/app_install_event_log_uploader.h"
+
+#include <algorithm>
+#include <memory>
+#include <string>
+
+#include "base/memory/ref_counted.h"
+#include "base/test/test_mock_time_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
+#include "components/policy/proto/device_management_backend.pb.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::Invoke;
+using testing::Mock;
+using testing::Pointee;
+using testing::SaveArg;
+using testing::WithArgs;
+using testing::_;
+
+namespace em = enterprise_management;
+
+namespace policy {
+
+namespace {
+
+constexpr base::TimeDelta kMinRetryBackoff = base::TimeDelta::FromSeconds(10);
+constexpr base::TimeDelta kMaxRetryBackoff = base::TimeDelta::FromDays(1);
+
+static const char kDmToken[] = "token";
+static const char kPackageName[] = "package";
+
+MATCHER_P(MatchProto, expected, "matches protobuf") {
+  return arg.SerializePartialAsString() == expected.SerializePartialAsString();
+}
+
+ACTION_TEMPLATE(MoveArg,
+                HAS_1_TEMPLATE_PARAMS(int, k),
+                AND_1_VALUE_PARAMS(out)) {
+  *out = std::move(*testing::get<k>(args));
+};
+
+class MockAppInstallEventLogUploaderDelegate
+    : public AppInstallEventLogUploader::Delegate {
+ public:
+  MockAppInstallEventLogUploaderDelegate() {}
+
+  void SerializeForUpload(SerializationCallback callback) override {
+    SerializeForUpload_(&callback);
+  }
+
+  MOCK_METHOD1(SerializeForUpload_, void(SerializationCallback*));
+  MOCK_METHOD0(OnUploadSuccess, void());
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockAppInstallEventLogUploaderDelegate);
+};
+
+}  // namespace
+
+class AppInstallEventLogUploaderTest : public testing::Test {
+ protected:
+  AppInstallEventLogUploaderTest() {}
+
+  void SetUp() override {
+    task_runner_ = new base::TestMockTimeTaskRunner();
+    task_runner_handle_ =
+        std::make_unique<base::ThreadTaskRunnerHandle>(task_runner_);
+  }
+
+  void TearDown() override {
+    Mock::VerifyAndClearExpectations(&client_);
+    EXPECT_CALL(client_, CancelAppInstallReportUpload());
+    uploader_.reset();
+  }
+
+  void RegisterClient() {
+    client_.dm_token_ = kDmToken;
+    client_.NotifyRegistrationStateChanged();
+  }
+
+  void UnregisterClient() {
+    client_.dm_token_.clear();
+    client_.NotifyRegistrationStateChanged();
+  }
+
+  void CreateUploader() {
+    uploader_ = std::make_unique<AppInstallEventLogUploader>(&client_);
+    uploader_->SetDelegate(&delegate_);
+  }
+
+  void CompleteSerialize() {
+    EXPECT_CALL(delegate_, SerializeForUpload_(_))
+        .WillOnce(WithArgs<0>(Invoke(
+            [=](AppInstallEventLogUploader::Delegate::SerializationCallback*
+                    callback) { std::move(*callback).Run(&log_); })));
+  }
+
+  void CaptureSerialize(
+      AppInstallEventLogUploader::Delegate::SerializationCallback* callback) {
+    EXPECT_CALL(delegate_, SerializeForUpload_(_))
+        .WillOnce(MoveArg<0>(callback));
+  }
+
+  void CompleteUpload(bool success) {
+    EXPECT_CALL(client_, UploadAppInstallReport(Pointee(MatchProto(log_)), _))
+        .WillOnce(WithArgs<1>(
+            Invoke([=](const CloudPolicyClient::StatusCallback& callback) {
+              callback.Run(success);
+            })));
+  }
+
+  void CaptureUpload(CloudPolicyClient::StatusCallback* callback) {
+    CloudPolicyClient::StatusCallback status_callback;
+    EXPECT_CALL(client_, UploadAppInstallReport(Pointee(MatchProto(log_)), _))
+        .WillOnce(SaveArg<1>(callback));
+  }
+
+  void CompleteSerializeAndUpload(bool success) {
+    CompleteSerialize();
+    CompleteUpload(success);
+  }
+
+  void CompleteSerializeAndCaptureUpload(
+      CloudPolicyClient::StatusCallback* callback) {
+    CompleteSerialize();
+    CaptureUpload(callback);
+  }
+
+  em::AppInstallReportRequest log_;
+
+  MockCloudPolicyClient client_;
+  MockAppInstallEventLogUploaderDelegate delegate_;
+  std::unique_ptr<AppInstallEventLogUploader> uploader_;
+
+  scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
+  std::unique_ptr<base::ThreadTaskRunnerHandle> task_runner_handle_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AppInstallEventLogUploaderTest);
+};
+
+// Make a log upload request. Have serialization and log upload succeed. Verify
+// that the delegate is notified of the success.
+TEST_F(AppInstallEventLogUploaderTest, RequestSerializeAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  uploader_->RequestUpload();
+}
+
+// Make a log upload request. Have serialization succeed and log upload begin.
+// Make a second upload request. Have the first upload succeed. Verify that the
+// delegate is notified of the first request's success and no serialization is
+// started for the second request.
+TEST_F(AppInstallEventLogUploaderTest, RequestSerializeRequestAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  CloudPolicyClient::StatusCallback status_callback;
+  CompleteSerializeAndCaptureUpload(&status_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0);
+  status_callback.Run(true);
+}
+
+// Make a log upload request. Have serialization begin. Make a second upload
+// request. Verify that no serialization is started for the second request.
+// Then, have the first request's serialization and upload succeed. Verify that
+// the delegate is notified of the first request's success.
+TEST_F(AppInstallEventLogUploaderTest, RequestRequestSerializeAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  AppInstallEventLogUploader::Delegate::SerializationCallback
+      serialization_callback;
+  CaptureSerialize(&serialization_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  CompleteUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  std::move(serialization_callback).Run(&log_);
+}
+
+// Make a log upload request. Have serialization begin. Cancel the request. Have
+// the serialization succeed. Verify that the serialization result is ignored
+// and no upload is started.
+TEST_F(AppInstallEventLogUploaderTest, RequestCancelAndSerialize) {
+  RegisterClient();
+  CreateUploader();
+
+  AppInstallEventLogUploader::Delegate::SerializationCallback
+      serialization_callback;
+  CaptureSerialize(&serialization_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  uploader_->CancelUpload();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  EXPECT_CALL(client_, UploadAppInstallReport(_, _)).Times(0);
+  EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+  std::move(serialization_callback).Run(&log_);
+}
+
+// Make a log upload request. Have serialization succeed and log upload begin.
+// Cancel the request. Verify that the upload is canceled in the client.
+TEST_F(AppInstallEventLogUploaderTest, RequestSerializeAndCancel) {
+  RegisterClient();
+  CreateUploader();
+
+  CloudPolicyClient::StatusCallback status_callback;
+  CompleteSerializeAndCaptureUpload(&status_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  uploader_->CancelUpload();
+}
+
+// Make a log upload request. Have serialization succeed but log upload fail.
+// Verify that serialization and log upload are retried with exponential
+// backoff. Have the retries fail until the maximum backoff is seen twice. Then,
+// have serialization and log upload succeed. Verify that the delegate is
+// notified of the success. Then, make another log upload request. Have the
+// serialization succeed but log upload fail again. Verify that the backoff has
+// returned to the minimum.
+TEST_F(AppInstallEventLogUploaderTest, Retry) {
+  RegisterClient();
+  CreateUploader();
+
+  CompleteSerializeAndUpload(false /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+  Mock::VerifyAndClearExpectations(&client_);
+
+  const base::TimeDelta min_delay = kMinRetryBackoff;
+  const base::TimeDelta max_delay = kMaxRetryBackoff;
+
+  base::TimeDelta expected_delay = min_delay;
+  int max_delay_count = 0;
+  while (max_delay_count < 2) {
+    EXPECT_EQ(expected_delay, task_runner_->NextPendingTaskDelay());
+
+    CompleteSerializeAndUpload(false /* success */);
+    EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+    task_runner_->FastForwardBy(expected_delay);
+    Mock::VerifyAndClearExpectations(&delegate_);
+    Mock::VerifyAndClearExpectations(&client_);
+
+    if (expected_delay == max_delay) {
+      ++max_delay_count;
+    }
+    expected_delay = std::min(expected_delay * 2, max_delay);
+  }
+
+  EXPECT_EQ(expected_delay, task_runner_->NextPendingTaskDelay());
+
+  log_.add_app_install_report()->set_package(kPackageName);
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  task_runner_->FastForwardBy(expected_delay);
+  Mock::VerifyAndClearExpectations(&delegate_);
+  Mock::VerifyAndClearExpectations(&client_);
+
+  CompleteSerializeAndUpload(false /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+  uploader_->RequestUpload();
+
+  EXPECT_EQ(min_delay, task_runner_->NextPendingTaskDelay());
+}
+
+// Create the uploader using a client that is not registered with the server
+// yet. Register the client with the server. Make a log upload request. Have
+// serialization and log upload succeed. Verify that the delegate is notified of
+// the success.
+TEST_F(AppInstallEventLogUploaderTest, RegisterRequestSerializeAndUpload) {
+  CreateUploader();
+  RegisterClient();
+
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  uploader_->RequestUpload();
+}
+
+// Create the uploader using a client that is not registered with the server
+// yet. Make a log upload request. Verify that serialization is not started.
+// Then, register the client with the server. Verify that serialization is
+// started. Have serialization and log upload succeed. Verify that the delegate
+// is notified of the success.
+TEST_F(AppInstallEventLogUploaderTest, RequestRegisterSerializeAndUpload) {
+  CreateUploader();
+
+  EXPECT_CALL(delegate_, SerializeForUpload_(_)).Times(0);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  RegisterClient();
+}
+
+// Make a log upload request. Have serialization succeed and log upload begin.
+// Unregister the client from the server. Register the client with the server.
+// Verify that a new serialization is started. Then, have serialization and log
+// upload succeed. Verify that the delegate is notified of the success.
+TEST_F(AppInstallEventLogUploaderTest,
+       RequestSerializeUnregisterRegisterAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  CloudPolicyClient::StatusCallback status_callback;
+  CompleteSerializeAndCaptureUpload(&status_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+  Mock::VerifyAndClearExpectations(&client_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  UnregisterClient();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  log_.add_app_install_report()->set_package(kPackageName);
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  RegisterClient();
+}
+
+// Make a log upload request. Have serialization begin. Unregister the client
+// from the server. Have serialization succeed. Verify that the serialization
+// result is ignored and no upload is started. Then, register the client with
+// the server. Verify that a new serialization is started. Then, have
+// serialization and log upload succeed. Verify that the delegate is notified of
+// the success.
+TEST_F(AppInstallEventLogUploaderTest,
+       RequestUnregisterSerializeRegisterAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  AppInstallEventLogUploader::Delegate::SerializationCallback
+      serialization_callback;
+  CaptureSerialize(&serialization_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  UnregisterClient();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  EXPECT_CALL(client_, UploadAppInstallReport(_, _)).Times(0);
+  EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+  std::move(serialization_callback).Run(&log_);
+  Mock::VerifyAndClearExpectations(&delegate_);
+  Mock::VerifyAndClearExpectations(&client_);
+
+  log_.add_app_install_report()->set_package(kPackageName);
+  CompleteSerializeAndUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  RegisterClient();
+}
+
+// Make a log upload request. Have serialization begin. Unregister the client
+// from the server. Register the client with the server. Verify that a second
+// serialization is requested. Then, have the first serialization succeed.
+// Verify that he serialization result is ignored and no upload is started.
+// Then, have the second serialization succeed. Verify that an upload is
+// started. Then, have the upload succeed. Verify that the delegate is notified
+// of the success.
+TEST_F(AppInstallEventLogUploaderTest,
+       RequestUnregisterRegisterSerializeAndUpload) {
+  RegisterClient();
+  CreateUploader();
+
+  AppInstallEventLogUploader::Delegate::SerializationCallback
+      serialization_callback_1;
+  CaptureSerialize(&serialization_callback_1);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&delegate_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  UnregisterClient();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  AppInstallEventLogUploader::Delegate::SerializationCallback
+      serialization_callback_2;
+  CaptureSerialize(&serialization_callback_2);
+  RegisterClient();
+
+  EXPECT_CALL(client_, UploadAppInstallReport(_, _)).Times(0);
+  EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
+  std::move(serialization_callback_1).Run(&log_);
+  Mock::VerifyAndClearExpectations(&delegate_);
+  Mock::VerifyAndClearExpectations(&client_);
+
+  log_.add_app_install_report()->set_package(kPackageName);
+  CompleteUpload(true /* success */);
+  EXPECT_CALL(delegate_, OnUploadSuccess());
+  std::move(serialization_callback_2).Run(&log_);
+}
+
+// Make a log upload request. Have serialization succeed and log upload begin.
+// Remove the delegate. Verify that the upload is canceled in the client.
+TEST_F(AppInstallEventLogUploaderTest, RequestAndRemoveDelegate) {
+  RegisterClient();
+  CreateUploader();
+
+  CloudPolicyClient::StatusCallback status_callback;
+  CompleteSerializeAndCaptureUpload(&status_callback);
+  uploader_->RequestUpload();
+  Mock::VerifyAndClearExpectations(&client_);
+
+  EXPECT_CALL(client_, CancelAppInstallReportUpload());
+  uploader_->SetDelegate(nullptr);
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
index e3b2f41..7e94d294 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/chromeos/login/session/user_session_manager.h"
 #include "chrome/browser/chromeos/login/users/affiliation.h"
 #include "chrome/browser/chromeos/login/users/chrome_user_manager_impl.h"
+#include "chrome/browser/chromeos/policy/app_install_event_log_uploader.h"
 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
 #include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/wildcard_login_checker.h"
@@ -192,6 +193,9 @@
     // Wait for the CloudPolicyStore to finish initializing.
     service()->AddObserver(this);
   }
+
+  app_install_event_log_uploader_ =
+      std::make_unique<AppInstallEventLogUploader>(client());
 }
 
 void UserCloudPolicyManagerChromeOS::OnAccessTokenAvailable(
@@ -245,7 +249,13 @@
   wildcard_username_ = username;
 }
 
+AppInstallEventLogUploader*
+UserCloudPolicyManagerChromeOS::GetAppInstallEventLogUploader() {
+  return app_install_event_log_uploader_.get();
+}
+
 void UserCloudPolicyManagerChromeOS::Shutdown() {
+  app_install_event_log_uploader_.reset();
   if (client())
     client()->RemoveObserver(this);
   if (service())
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h
index 9d32356..1db5c8f 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h
@@ -37,6 +37,7 @@
 
 namespace policy {
 
+class AppInstallEventLogUploader;
 class CloudExternalDataManager;
 class DeviceManagementService;
 class PolicyOAuth2TokenFetcher;
@@ -125,6 +126,10 @@
   // is available.
   void EnableWildcardLoginCheck(const std::string& username);
 
+  // Return the AppInstallEventLogUploader used to send app push-install event
+  // logs to the policy server.
+  AppInstallEventLogUploader* GetAppInstallEventLogUploader();
+
   // ConfigurationPolicyProvider:
   void Shutdown() override;
   bool IsInitializationComplete(PolicyDomain domain) const override;
@@ -196,6 +201,9 @@
   // Manages external data referenced by policies.
   std::unique_ptr<CloudExternalDataManager> external_data_manager_;
 
+  // Helper used to send app push-install event logs to the policy server.
+  std::unique_ptr<AppInstallEventLogUploader> app_install_event_log_uploader_;
+
   // Username for the wildcard login check if applicable, empty otherwise.
   std::string wildcard_username_;
 
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
index 26e5e29..722e04a 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
@@ -788,4 +788,10 @@
             register_request.register_request().lifetime());
 }
 
+TEST_F(UserCloudPolicyManagerChromeOSTest, TestHasAppInstallEventLogUploader) {
+  ASSERT_NO_FATAL_FAILURE(MakeManagerWithEmptyStore(
+      base::TimeDelta(), PolicyEnforcement::kPolicyRequired));
+  EXPECT_TRUE(manager_->GetAppInstallEventLogUploader());
+}
+
 }  // namespace policy
diff --git a/chrome/browser/chromeos/power/ml/user_activity_event.proto b/chrome/browser/chromeos/power/ml/user_activity_event.proto
index b72a93c..20895070 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_event.proto
+++ b/chrome/browser/chromeos/power/ml/user_activity_event.proto
@@ -46,6 +46,7 @@
       SCREEN_OFF = 7;
       SCREEN_LOCK = 8;
       IDLE_SLEEP = 9;
+      MANUAL_SLEEP = 10;
     }
     optional Reason reason = 2;
 
diff --git a/chrome/browser/chromeos/power/ml/user_activity_logger.cc b/chrome/browser/chromeos/power/ml/user_activity_logger.cc
index 5dd3592b..e313422 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_logger.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_logger.cc
@@ -15,8 +15,6 @@
 namespace power {
 namespace ml {
 
-constexpr int kIdleDelaySeconds = 10;
-
 UserActivityLogger::UserActivityLogger(
     UserActivityLoggerDelegate* delegate,
     IdleEventNotifier* idle_event_notifier,
@@ -34,7 +32,6 @@
       session_manager_(session_manager),
       binding_(this, std::move(request)),
       user_manager_(user_manager),
-      idle_delay_(base::TimeDelta::FromSeconds(kIdleDelaySeconds)),
       weak_ptr_factory_(this) {
   DCHECK(logger_delegate_);
   DCHECK(idle_event_notifier);
@@ -74,10 +71,6 @@
     chromeos::PowerManagerClient::LidState state,
     const base::TimeTicks& /* timestamp */) {
   lid_state_ = state;
-  if (lid_state_ == chromeos::PowerManagerClient::LidState::CLOSED) {
-    MaybeLogEvent(UserActivityEvent::Event::OFF,
-                  UserActivityEvent::Event::LID_CLOSED);
-  }
 }
 
 void UserActivityLogger::PowerChanged(
@@ -108,17 +101,55 @@
     const power_manager::ScreenIdleState& proto) {
   if (proto.off()) {
     screen_idle_timer_.Start(
-        FROM_HERE, idle_delay_,
+        FROM_HERE, kIdleDelay,
         base::Bind(&UserActivityLogger::MaybeLogEvent, base::Unretained(this),
                    UserActivityEvent::Event::TIMEOUT,
                    UserActivityEvent::Event::SCREEN_OFF));
   }
 }
 
-void UserActivityLogger::SuspendDone(
-    const base::TimeDelta& /* sleep_duration */) {
-  MaybeLogEvent(UserActivityEvent::Event::TIMEOUT,
-                UserActivityEvent::Event::IDLE_SLEEP);
+void UserActivityLogger::SuspendImminent(
+    power_manager::SuspendImminent::Reason reason) {
+  suspend_reason_ = reason;
+}
+
+void UserActivityLogger::SuspendDone(const base::TimeDelta& sleep_duration) {
+  if (!suspend_reason_)
+    return;
+
+  if (sleep_duration < kMinSuspendDuration) {
+    // 1. If reason_ is IDLE: user quickly woke up the computer hence
+    // it's not a TIMEOUT event but a REACTIVATE event.
+    // 2. If reason_ is LID_CLOSED: user closed the lid and then
+    // quickly opened it hence it's not an OFF event but a REACTIVATE event.
+    // 3. If reason_ is OTHER: user initiated a suspend and then cancelled
+    // it hence it's not an OFF event but a REACTIVATE event.
+    // In any case, when sleep duration is short, we treat the event as a
+    // REACTIVATE event.
+    MaybeLogEvent(UserActivityEvent::Event::REACTIVATE,
+                  UserActivityEvent::Event::USER_ACTIVITY);
+    return;
+  }
+
+  switch (suspend_reason_.value()) {
+    case power_manager::SuspendImminent_Reason_IDLE:
+      MaybeLogEvent(UserActivityEvent::Event::TIMEOUT,
+                    UserActivityEvent::Event::IDLE_SLEEP);
+      break;
+    case power_manager::SuspendImminent_Reason_LID_CLOSED:
+      MaybeLogEvent(UserActivityEvent::Event::OFF,
+                    UserActivityEvent::Event::LID_CLOSED);
+      break;
+    case power_manager::SuspendImminent_Reason_OTHER:
+      MaybeLogEvent(UserActivityEvent::Event::OFF,
+                    UserActivityEvent::Event::MANUAL_SLEEP);
+      break;
+    default:
+      // We don't track other suspend reason.
+      break;
+  }
+
+  suspend_reason_ = base::nullopt;
 }
 
 void UserActivityLogger::InactivityDelaysChanged(
@@ -147,6 +178,12 @@
   }
 }
 
+// static
+constexpr base::TimeDelta UserActivityLogger::kIdleDelay;
+
+// static
+constexpr base::TimeDelta UserActivityLogger::kMinSuspendDuration;
+
 void UserActivityLogger::OnReceiveSwitchStates(
     base::Optional<chromeos::PowerManagerClient::SwitchStates> switch_states) {
   if (switch_states.has_value()) {
diff --git a/chrome/browser/chromeos/power/ml/user_activity_logger.h b/chrome/browser/chromeos/power/ml/user_activity_logger.h
index 669cbd8..9456c94 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_logger.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_logger.h
@@ -17,6 +17,7 @@
 #include "chrome/browser/chromeos/power/ml/user_activity_logger_delegate.h"
 #include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/power_manager/policy.pb.h"
+#include "chromeos/dbus/power_manager/suspend.pb.h"
 #include "chromeos/dbus/power_manager_client.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/session_manager/core/session_manager_observer.h"
@@ -40,6 +41,16 @@
                            public viz::mojom::VideoDetectorObserver,
                            public session_manager::SessionManagerObserver {
  public:
+  // Delay after screen idle event, used to trigger TIMEOUT for user activity
+  // logging.
+  static constexpr base::TimeDelta kIdleDelay =
+      base::TimeDelta::FromSeconds(10);
+
+  // If a suspend has sleep duration shorter than this, the suspend would be
+  // considered as cancelled and the event type will be REACTIVATE.
+  static constexpr base::TimeDelta kMinSuspendDuration =
+      base::TimeDelta::FromSeconds(10);
+
   UserActivityLogger(UserActivityLoggerDelegate* delegate,
                      IdleEventNotifier* idle_event_notifier,
                      ui::UserActivityDetector* detector,
@@ -60,6 +71,7 @@
                                const base::TimeTicks& timestamp) override;
   void ScreenIdleStateChanged(
       const power_manager::ScreenIdleState& proto) override;
+  void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
   void InactivityDelaysChanged(
       const power_manager::PowerManagementPolicy::Delays& delays) override;
@@ -123,6 +135,10 @@
   // Features extracted when receives an idle event.
   UserActivityEvent::Features features_;
 
+  // This is the reason for the in-progress suspend, i.e. it's set by
+  // SuspendImminent and used by SuspendDone.
+  base::Optional<power_manager::SuspendImminent::Reason> suspend_reason_;
+
   // It is base::DefaultClock, but will be set to a mock clock for tests.
   std::unique_ptr<base::Clock> clock_;
 
@@ -145,10 +161,6 @@
 
   const chromeos::ChromeUserManager* const user_manager_;
 
-  // Delay after screen idle event, used to trigger TIMEOUT for user activity
-  // logging.
-  base::TimeDelta idle_delay_;
-
   // Timer to be triggered when a screen idle event is triggered.
   base::OneShotTimer screen_idle_timer_;
 
diff --git a/chrome/browser/chromeos/power/ml/user_activity_logger_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_logger_unittest.cc
index 2df70dda..a9a6015 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_logger_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_logger_unittest.cc
@@ -118,10 +118,14 @@
     session_manager_.SetSessionState(session_manager::SessionState::LOCKED);
   }
 
-  void ReportIdleSleep() { fake_power_manager_client_.SendSuspendDone(); }
+  void ReportSuspend(power_manager::SuspendImminent::Reason reason,
+                     base::TimeDelta sleep_duration) {
+    fake_power_manager_client_.SendSuspendImminent(reason);
+    fake_power_manager_client_.SendSuspendDone(sleep_duration);
+  }
 
-  void ReportInactivityDelays(const base::TimeDelta& screen_dim_delay,
-                              const base::TimeDelta& screen_off_delay) {
+  void ReportInactivityDelays(base::TimeDelta screen_dim_delay,
+                              base::TimeDelta screen_off_delay) {
     power_manager::PowerManagementPolicy::Delays proto;
     proto.set_screen_dim_ms(screen_dim_delay.InMilliseconds());
     proto.set_screen_off_ms(screen_off_delay.InMilliseconds());
@@ -236,13 +240,7 @@
   GetTaskRunner()->FastForwardBy(base::TimeDelta::FromSeconds(2));
   ReportLidEvent(chromeos::PowerManagerClient::LidState::CLOSED);
   const auto& events = delegate_.events();
-  ASSERT_EQ(1U, events.size());
-
-  UserActivityEvent::Event expected_event;
-  expected_event.set_type(UserActivityEvent::Event::OFF);
-  expected_event.set_reason(UserActivityEvent::Event::LID_CLOSED);
-  expected_event.set_log_duration_sec(2);
-  EqualEvent(expected_event, events[0].event());
+  EXPECT_TRUE(events.empty());
 }
 
 TEST_F(UserActivityLoggerTest, PowerChangeActivity) {
@@ -295,8 +293,8 @@
   UserActivityEvent::Event expected_event;
   expected_event.set_type(UserActivityEvent::Event::TIMEOUT);
   expected_event.set_reason(UserActivityEvent::Event::SCREEN_OFF);
-  // Idle timeout is 10 seconds.
-  expected_event.set_log_duration_sec(10);
+  expected_event.set_log_duration_sec(
+      UserActivityLogger::kIdleDelay.InSeconds());
   EqualEvent(expected_event, events[0].event());
 }
 
@@ -339,12 +337,13 @@
   EqualEvent(expected_event, events[0].event());
 }
 
-TEST_F(UserActivityLoggerTest, IdleSleep) {
+TEST_F(UserActivityLoggerTest, SuspendIdle) {
   // Trigger an idle event.
   base::Time now = base::Time::UnixEpoch();
   ReportIdleEvent({now, now});
 
-  ReportIdleSleep();
+  ReportSuspend(power_manager::SuspendImminent_Reason_IDLE,
+                2 * UserActivityLogger::kMinSuspendDuration);
   const auto& events = delegate_.events();
   ASSERT_EQ(1U, events.size());
 
@@ -354,6 +353,89 @@
   EqualEvent(expected_event, events[0].event());
 }
 
+TEST_F(UserActivityLoggerTest, SuspendIdleCancelled) {
+  // Trigger an idle event.
+  base::Time now = base::Time::UnixEpoch();
+  ReportIdleEvent({now, now});
+
+  ReportSuspend(power_manager::SuspendImminent_Reason_IDLE,
+                UserActivityLogger::kMinSuspendDuration -
+                    base::TimeDelta::FromSeconds(2));
+  const auto& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::REACTIVATE);
+  expected_event.set_reason(UserActivityEvent::Event::USER_ACTIVITY);
+  EqualEvent(expected_event, events[0].event());
+}
+
+TEST_F(UserActivityLoggerTest, SuspendLidClosed) {
+  // Trigger an idle event.
+  base::Time now = base::Time::UnixEpoch();
+  ReportIdleEvent({now, now});
+
+  ReportSuspend(power_manager::SuspendImminent_Reason_LID_CLOSED,
+                2 * UserActivityLogger::kMinSuspendDuration);
+  const auto& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::OFF);
+  expected_event.set_reason(UserActivityEvent::Event::LID_CLOSED);
+  EqualEvent(expected_event, events[0].event());
+}
+
+TEST_F(UserActivityLoggerTest, SuspendLidClosedCancelled) {
+  // Trigger an idle event.
+  base::Time now = base::Time::UnixEpoch();
+  ReportIdleEvent({now, now});
+
+  ReportSuspend(power_manager::SuspendImminent_Reason_LID_CLOSED,
+                UserActivityLogger::kMinSuspendDuration -
+                    base::TimeDelta::FromSeconds(2));
+  const auto& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::REACTIVATE);
+  expected_event.set_reason(UserActivityEvent::Event::USER_ACTIVITY);
+  EqualEvent(expected_event, events[0].event());
+}
+
+TEST_F(UserActivityLoggerTest, SuspendOther) {
+  // Trigger an idle event.
+  base::Time now = base::Time::UnixEpoch();
+  ReportIdleEvent({now, now});
+
+  ReportSuspend(power_manager::SuspendImminent_Reason_OTHER,
+                UserActivityLogger::kMinSuspendDuration);
+  const auto& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::OFF);
+  expected_event.set_reason(UserActivityEvent::Event::MANUAL_SLEEP);
+  EqualEvent(expected_event, events[0].event());
+}
+
+TEST_F(UserActivityLoggerTest, SuspendOtherCancelled) {
+  // Trigger an idle event.
+  base::Time now = base::Time::UnixEpoch();
+  ReportIdleEvent({now, now});
+
+  ReportSuspend(power_manager::SuspendImminent_Reason_OTHER,
+                UserActivityLogger::kMinSuspendDuration -
+                    base::TimeDelta::FromSeconds(2));
+  const auto& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::REACTIVATE);
+  expected_event.set_reason(UserActivityEvent::Event::USER_ACTIVITY);
+  EqualEvent(expected_event, events[0].event());
+}
+
 // Test feature extraction.
 TEST_F(UserActivityLoggerTest, FeatureExtraction) {
   ReportLidEvent(chromeos::PowerManagerClient::LidState::OPEN);
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry.cc b/chrome/browser/custom_handlers/protocol_handler_registry.cc
index 608da37..6eae7023 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry.cc
@@ -567,6 +567,11 @@
 
 void ProtocolHandlerRegistry::RemoveHandler(
     const ProtocolHandler& handler) {
+  if (IsIgnored(handler)) {
+    RemoveIgnoredHandler(handler);
+    return;
+  }
+
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   ProtocolHandlerList& handlers = protocol_handlers_[handler.protocol()];
   bool erase_success = false;
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
index 675455d2..eddd2ee 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry_unittest.cc
@@ -492,6 +492,14 @@
   registry()->RemoveHandler(ph1);
   ASSERT_FALSE(registry()->IsRegistered(ph1));
   ASSERT_FALSE(registry()->IsHandledProtocol("test"));
+
+  registry()->OnIgnoreRegisterProtocolHandler(ph1);
+  ASSERT_FALSE(registry()->IsRegistered(ph1));
+  ASSERT_TRUE(registry()->IsIgnored(ph1));
+
+  registry()->RemoveHandler(ph1);
+  ASSERT_FALSE(registry()->IsRegistered(ph1));
+  ASSERT_FALSE(registry()->IsIgnored(ph1));
 }
 
 TEST_F(ProtocolHandlerRegistryTest, TestIsRegistered) {
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 5fda1fa..acbe0f5 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -92,6 +92,8 @@
     "chrome-devtools://devtools/bundled/worker_app.html";
 static const char kJSFrontendURL[] =
     "chrome-devtools://devtools/bundled/js_app.html";
+static const char kFallbackFrontendURL[] =
+    "chrome-devtools://devtools/bundled/inspector.html";
 
 bool FindInspectedBrowserAndTabIndex(
     WebContents* inspected_web_contents, Browser** browser, int* tab) {
@@ -532,6 +534,21 @@
 void DevToolsWindow::OpenDevToolsWindow(
     scoped_refptr<content::DevToolsAgentHost> agent_host,
     Profile* profile) {
+  OpenDevToolsWindow(agent_host, profile, false /* use_bundled_frontend */);
+}
+
+// static
+void DevToolsWindow::OpenDevToolsWindowWithBundledFrontend(
+    scoped_refptr<content::DevToolsAgentHost> agent_host,
+    Profile* profile) {
+  OpenDevToolsWindow(agent_host, profile, true /* use_bundled_frontend */);
+}
+
+// static
+void DevToolsWindow::OpenDevToolsWindow(
+    scoped_refptr<content::DevToolsAgentHost> agent_host,
+    Profile* profile,
+    bool use_bundled_frontend) {
   if (!profile)
     profile = Profile::FromBrowserContext(agent_host->GetBrowserContext());
 
@@ -545,7 +562,7 @@
 
   if (!agent_host->GetFrontendURL().empty()) {
     DevToolsWindow::OpenExternalFrontend(profile, agent_host->GetFrontendURL(),
-                                         agent_host);
+                                         agent_host, use_bundled_frontend);
     return;
   }
 
@@ -607,7 +624,8 @@
 void DevToolsWindow::OpenExternalFrontend(
     Profile* profile,
     const std::string& frontend_url,
-    const scoped_refptr<content::DevToolsAgentHost>& agent_host) {
+    const scoped_refptr<content::DevToolsAgentHost>& agent_host,
+    bool use_bundled_frontend) {
   DevToolsWindow* window = FindDevToolsWindow(agent_host.get());
   if (window) {
     window->ScheduleShow(DevToolsToggleAction::Show());
@@ -625,9 +643,12 @@
 
     FrontendType frontend_type =
         is_worker ? kFrontendRemoteWorker : kFrontendRemote;
-    window = Create(profile, nullptr, frontend_type,
-                    DevToolsUI::GetProxyURL(frontend_url).spec(), false,
-                    std::string(), std::string(), agent_host->IsAttached());
+    std::string effective_frontend_url =
+        use_bundled_frontend ? kFallbackFrontendURL
+                             : DevToolsUI::GetProxyURL(frontend_url).spec();
+    window =
+        Create(profile, nullptr, frontend_type, effective_frontend_url, false,
+               std::string(), std::string(), agent_host->IsAttached());
   }
   if (!window)
     return;
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h
index 0f008302..928fea3 100644
--- a/chrome/browser/devtools/devtools_window.h
+++ b/chrome/browser/devtools/devtools_window.h
@@ -84,6 +84,10 @@
   static void OpenDevToolsWindow(
       scoped_refptr<content::DevToolsAgentHost> host,
       Profile* profile);
+  // Similar to previous one, but forces the bundled frontend to be used.
+  static void OpenDevToolsWindowWithBundledFrontend(
+      scoped_refptr<content::DevToolsAgentHost> host,
+      Profile* profile);
 
   // Perform specified action for current WebContents inside a |browser|.
   // This may close currently open DevTools window.
@@ -259,7 +263,11 @@
   static void OpenExternalFrontend(
       Profile* profile,
       const std::string& frontend_uri,
-      const scoped_refptr<content::DevToolsAgentHost>& agent_host);
+      const scoped_refptr<content::DevToolsAgentHost>& agent_host,
+      bool use_bundled_frontend);
+  static void OpenDevToolsWindow(scoped_refptr<content::DevToolsAgentHost> host,
+                                 Profile* profile,
+                                 bool use_bundled_frontend);
 
   static DevToolsWindow* Create(Profile* profile,
                                 content::WebContents* inspected_web_contents,
diff --git a/chrome/browser/engagement/site_engagement_service.h b/chrome/browser/engagement/site_engagement_service.h
index 57f08ab..eb9a69b9 100644
--- a/chrome/browser/engagement/site_engagement_service.h
+++ b/chrome/browser/engagement/site_engagement_service.h
@@ -27,7 +27,7 @@
 
 namespace banners {
 FORWARD_DECLARE_TEST(AppBannerManagerBrowserTest,
-                     CheckOnLoadWithoutSufficientEngagement);
+                     ExperimentalFlowWebAppBannerNeedsEngagement);
 }
 
 namespace content {
@@ -202,7 +202,7 @@
                            IncognitoEngagementService);
   FRIEND_TEST_ALL_PREFIXES(SiteEngagementServiceTest, GetScoreFromSettings);
   FRIEND_TEST_ALL_PREFIXES(banners::AppBannerManagerBrowserTest,
-                           CheckOnLoadWithoutSufficientEngagement);
+                           ExperimentalFlowWebAppBannerNeedsEngagement);
   FRIEND_TEST_ALL_PREFIXES(AppBannerSettingsHelperTest, SiteEngagementTrigger);
   FRIEND_TEST_ALL_PREFIXES(HostedAppPWAOnlyTest, EngagementHistogram);
 
diff --git a/chrome/browser/extensions/DEPS b/chrome/browser/extensions/DEPS
index 72ef738..d1ad1f6a 100644
--- a/chrome/browser/extensions/DEPS
+++ b/chrome/browser/extensions/DEPS
@@ -30,6 +30,9 @@
     "+ash/touch",
     "+ash/wm/tablet_mode/tablet_mode_controller.h",
   ],
+  "extension_protocols_unittest\.cc": [
+    "+services/network/test",
+  ],
   "launch_util\.cc": [
     # TODO(mash): Remove. http://crbug.com/678705
     "+ash/shell.h",
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index c96b2308..69dedc8 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_function_test_utils.h"
 #include "chrome/browser/net/url_request_mock_util.h"
+#include "chrome/browser/platform_util_internal.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
@@ -1122,6 +1123,7 @@
 
 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest,
                        DownloadsShowDefaultFolderFunction) {
+  platform_util::internal::DisableShellOperationsForTesting();
   ScopedCancellingItem item(CreateFirstSlowTestDownload());
   ASSERT_TRUE(item.get());
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index cfe834e..f441a84 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -74,13 +74,11 @@
     : profile_(profile),
       password_manager_presenter_(
           std::make_unique<PasswordManagerPresenter>(this)),
-      password_manager_porter_(
-          PasswordManagerPorter::
-              CreatePasswordManagerPorterWithCredentialProvider(
-                  password_manager_presenter_.get(),
-                  base::BindRepeating(
-                      &PasswordsPrivateDelegateImpl::OnPasswordsExportProgress,
-                      base::Unretained(this)))),
+      password_manager_porter_(std::make_unique<PasswordManagerPorter>(
+          password_manager_presenter_.get(),
+          base::BindRepeating(
+              &PasswordsPrivateDelegateImpl::OnPasswordsExportProgress,
+              base::Unretained(this)))),
       password_access_authenticator_(
           base::BindRepeating(&PasswordsPrivateDelegateImpl::OsReauthCall,
                               base::Unretained(this))),
diff --git a/chrome/browser/extensions/chrome_content_verifier_delegate.cc b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
index c7fbd331..114d1b1a 100644
--- a/chrome/browser/extensions/chrome_content_verifier_delegate.cc
+++ b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
@@ -184,6 +184,11 @@
   if (!extension)
     return;
   ExtensionSystem* system = ExtensionSystem::Get(context_);
+  if (!system->management_policy()) {
+    // Some tests will add an extension to the registry, but there is no
+    // management policy.
+    return;
+  }
   ExtensionService* service = system->extension_service();
   Mode mode = ShouldBeVerified(*extension);
   if (mode >= ContentVerifierDelegate::ENFORCE) {
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index adee7d44..3d21dbf 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -178,6 +178,27 @@
       send_cors_header);
 }
 
+base::FilePath ChromeExtensionsBrowserClient::GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id) const {
+  return chrome_url_request_util::GetBundleResourcePath(
+      request, extension_resources_path, resource_id);
+}
+
+void ChromeExtensionsBrowserClient::LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header) {
+  chrome_url_request_util::LoadResourceFromResourceBundle(
+      request, std::move(loader), resource_relative_path, resource_id,
+      content_security_policy, std::move(client), send_cors_header);
+}
+
 bool ChromeExtensionsBrowserClient::AllowCrossRendererResourceLoad(
     const GURL& url,
     content::ResourceType resource_type,
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index 9bf9655..0ce3da1 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -71,6 +71,18 @@
       const base::FilePath& directory_path,
       const std::string& content_security_policy,
       bool send_cors_header) override;
+  base::FilePath GetBundleResourcePath(
+      const network::ResourceRequest& request,
+      const base::FilePath& extension_resources_path,
+      int* resource_id) const override;
+  void LoadResourceFromResourceBundle(
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      const base::FilePath& resource_relative_path,
+      int resource_id,
+      const std::string& content_security_policy,
+      network::mojom::URLLoaderClientPtr client,
+      bool send_cors_header) override;
   bool AllowCrossRendererResourceLoad(const GURL& url,
                                       content::ResourceType resource_type,
                                       ui::PageTransition page_transition,
diff --git a/chrome/browser/extensions/chrome_url_request_util.cc b/chrome/browser/extensions/chrome_url_request_util.cc
index a22cfd8..6babbda 100644
--- a/chrome/browser/extensions/chrome_url_request_util.cc
+++ b/chrome/browser/extensions/chrome_url_request_util.cc
@@ -4,7 +4,8 @@
 
 #include "chrome/browser/extensions/chrome_url_request_util.h"
 
-#include <string>
+#include <memory>
+#include <utility>
 
 #include "base/files/file_path.h"
 #include "base/memory/weak_ptr.h"
@@ -21,6 +22,8 @@
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/url_request_util.h"
 #include "extensions/common/file_util.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/system/file_data_pipe_producer.h"
 #include "net/base/mime_util.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_request_headers.h"
@@ -34,6 +37,19 @@
 
 namespace {
 
+void DetermineCharset(const std::string& mime_type,
+                      const base::RefCountedMemory* data,
+                      std::string* out_charset) {
+  if (base::StartsWith(mime_type, "text/",
+                       base::CompareCase::INSENSITIVE_ASCII)) {
+    // All of our HTML files should be UTF-8 and for other resource types
+    // (like images), charset doesn't matter.
+    DCHECK(base::IsStringUTF8(base::StringPiece(
+        reinterpret_cast<const char*>(data->front()), data->size())));
+    *out_charset = "utf-8";
+  }
+}
+
 // A request for an extension resource in a Chrome .pak file. These are used
 // by component extensions.
 class URLRequestResourceBundleJob : public net::URLRequestSimpleJob {
@@ -96,14 +112,7 @@
         base::StringPrintf("%s: %s", net::HttpRequestHeaders::kContentType,
                            read_mime_type->c_str()));
     *out_mime_type = *read_mime_type;
-    if (base::StartsWith(*read_mime_type, "text/",
-                         base::CompareCase::INSENSITIVE_ASCII)) {
-      // All of our HTML files should be UTF-8 and for other resource types
-      // (like images), charset doesn't matter.
-      DCHECK(base::IsStringUTF8(base::StringPiece(
-          reinterpret_cast<const char*>(data->front()), data->size())));
-      *charset = "utf-8";
-    }
+    DetermineCharset(*read_mime_type, data.get(), charset);
     int result = read_result ? net::OK : net::ERR_INVALID_URL;
     callback.Run(result);
   }
@@ -119,6 +128,144 @@
   mutable base::WeakPtrFactory<URLRequestResourceBundleJob> weak_factory_;
 };
 
+// Loads an extension resource in a Chrome .pak file. These are used by
+// component extensions.
+class ResourceBundleFileLoader : public network::mojom::URLLoader {
+ public:
+  static void CreateAndStart(const network::ResourceRequest& request,
+                             network::mojom::URLLoaderRequest loader,
+                             network::mojom::URLLoaderClientPtrInfo client_info,
+                             const base::FilePath& filename,
+                             int resource_id,
+                             const std::string& content_security_policy,
+                             bool send_cors_header) {
+    // Owns itself. Will live as long as its URLLoader and URLLoaderClientPtr
+    // bindings are alive - essentially until either the client gives up or all
+    // file data has been sent to it.
+    auto* bundle_loader =
+        new ResourceBundleFileLoader(content_security_policy, send_cors_header);
+    bundle_loader->Start(request, std::move(loader), std::move(client_info),
+                         filename, resource_id);
+  }
+
+  // mojom::URLLoader implementation:
+  void FollowRedirect() override {
+    NOTREACHED() << "No redirects for local file loads.";
+  }
+  // Current implementation reads all resource data at start of resource
+  // load, so priority, and pausing is not currently implemented.
+  void SetPriority(net::RequestPriority priority,
+                   int32_t intra_priority_value) override {}
+  void PauseReadingBodyFromNet() override {}
+  void ResumeReadingBodyFromNet() override {}
+  void ProceedWithResponse() override {}
+
+ private:
+  ResourceBundleFileLoader(const std::string& content_security_policy,
+                           bool send_cors_header)
+      : binding_(this), weak_factory_(this) {
+    response_headers_ = extensions::BuildHttpHeaders(
+        content_security_policy, send_cors_header, base::Time());
+  }
+  ~ResourceBundleFileLoader() override = default;
+
+  void Start(const network::ResourceRequest& request,
+             network::mojom::URLLoaderRequest loader,
+             network::mojom::URLLoaderClientPtrInfo client_info,
+             const base::FilePath& filename,
+             int resource_id) {
+    client_.Bind(std::move(client_info));
+    binding_.Bind(std::move(loader));
+    binding_.set_connection_error_handler(base::BindOnce(
+        &ResourceBundleFileLoader::OnBindingError, base::Unretained(this)));
+    client_.set_connection_error_handler(base::BindOnce(
+        &ResourceBundleFileLoader::OnConnectionError, base::Unretained(this)));
+    const ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+    scoped_refptr<base::RefCountedMemory> data =
+        rb.LoadDataResourceBytes(resource_id);
+
+    std::string* read_mime_type = new std::string;
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE, {base::MayBlock()},
+        base::BindOnce(&net::GetMimeTypeFromFile, filename,
+                       base::Unretained(read_mime_type)),
+        base::BindOnce(&ResourceBundleFileLoader::OnMimeTypeRead,
+                       weak_factory_.GetWeakPtr(), std::move(data),
+                       base::Owned(read_mime_type)));
+  }
+
+  void OnMimeTypeRead(scoped_refptr<base::RefCountedMemory> data,
+                      std::string* read_mime_type,
+                      bool read_result) {
+    if (!read_result) {
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+      return;
+    }
+    network::ResourceResponseHead head;
+    head.request_start = base::TimeTicks::Now();
+    head.response_start = base::TimeTicks::Now();
+    head.content_length = data->size();
+    head.mime_type = *read_mime_type;
+    DetermineCharset(head.mime_type, data.get(), &head.charset);
+    mojo::DataPipe pipe(data->size());
+    if (!pipe.consumer_handle.is_valid()) {
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+      client_.reset();
+      MaybeDeleteSelf();
+      return;
+    }
+    head.headers = response_headers_;
+    head.headers->AddHeader(
+        base::StringPrintf("%s: %s", net::HttpRequestHeaders::kContentLength,
+                           base::NumberToString(head.content_length).c_str()));
+    if (!head.mime_type.empty()) {
+      head.headers->AddHeader(
+          base::StringPrintf("%s: %s", net::HttpRequestHeaders::kContentType,
+                             head.mime_type.c_str()));
+    }
+    client_->OnReceiveResponse(head, base::nullopt, nullptr);
+    client_->OnStartLoadingResponseBody(std::move(pipe.consumer_handle));
+
+    uint32_t write_size = data->size();
+    MojoResult result = pipe.producer_handle->WriteData(
+        data->front(), &write_size, MOJO_WRITE_DATA_FLAG_NONE);
+    OnFileWritten(result);
+  }
+
+  void OnConnectionError() {
+    client_.reset();
+    MaybeDeleteSelf();
+  }
+
+  void OnBindingError() {
+    binding_.Close();
+    MaybeDeleteSelf();
+  }
+
+  void MaybeDeleteSelf() {
+    if (!binding_.is_bound() && !client_.is_bound())
+      delete this;
+  }
+
+  void OnFileWritten(MojoResult result) {
+    // All the data has been written now. The consumer will be notified that
+    // there will be no more data to read from now.
+    if (result == MOJO_RESULT_OK)
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::OK));
+    else
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+    client_.reset();
+    MaybeDeleteSelf();
+  }
+
+  mojo::Binding<network::mojom::URLLoader> binding_;
+  network::mojom::URLLoaderClientPtr client_;
+  scoped_refptr<net::HttpResponseHeaders> response_headers_;
+  base::WeakPtrFactory<ResourceBundleFileLoader> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ResourceBundleFileLoader);
+};
+
 }  // namespace
 
 namespace extensions {
@@ -188,5 +335,51 @@
   return NULL;
 }
 
+base::FilePath GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id) {
+  *resource_id = 0;
+  // |chrome_resources_path| corresponds to src/chrome/browser/resources in
+  // source tree.
+  base::FilePath chrome_resources_path;
+  if (!PathService::Get(chrome::DIR_RESOURCES, &chrome_resources_path))
+    return base::FilePath();
+
+  // Since component extension resources are included in
+  // component_extension_resources.pak file in |chrome_resources_path|,
+  // calculate the extension |request_relative_path| against
+  // |chrome_resources_path|.
+  if (!chrome_resources_path.IsParent(extension_resources_path))
+    return base::FilePath();
+
+  const base::FilePath request_relative_path =
+      extensions::file_util::ExtensionURLToRelativeFilePath(request.url);
+  if (!ExtensionsBrowserClient::Get()
+           ->GetComponentExtensionResourceManager()
+           ->IsComponentExtensionResource(extension_resources_path,
+                                          request_relative_path, resource_id)) {
+    return base::FilePath();
+  }
+  DCHECK_NE(0, *resource_id);
+
+  return request_relative_path;
+}
+
+void LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header) {
+  DCHECK(!resource_relative_path.empty());
+  ResourceBundleFileLoader::CreateAndStart(
+      request, std::move(loader), client.PassInterface(),
+      resource_relative_path, resource_id, content_security_policy,
+      send_cors_header);
+}
+
 }  // namespace chrome_url_request_util
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_url_request_util.h b/chrome/browser/extensions/chrome_url_request_util.h
index ce03bee..3197256 100644
--- a/chrome/browser/extensions/chrome_url_request_util.h
+++ b/chrome/browser/extensions/chrome_url_request_util.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "content/public/common/resource_type.h"
+#include "services/network/public/mojom/url_loader.mojom.h"
 #include "ui/base/page_transition_types.h"
 
 class GURL;
@@ -54,6 +55,26 @@
     const std::string& content_security_policy,
     bool send_cors_header);
 
+// Return the |request|'s resource path relative to the Chromium resources path
+// (chrome::DIR_RESOURCES) *if* the request refers to a resource within the
+// Chrome resource bundle. If not then the returned file path will be empty.
+base::FilePath GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id);
+
+// Creates and starts a URLLoader for loading component extension resources out
+// of a Chrome resource bundle. This should only be called if
+// GetBundleResourcePath returns a valid path.
+void LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header);
+
 }  // namespace chrome_url_request_util
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/extension_keybinding_registry.cc b/chrome/browser/extensions/extension_keybinding_registry.cc
index 234c1bcf..fbd9075f 100644
--- a/chrome/browser/extensions/extension_keybinding_registry.cc
+++ b/chrome/browser/extensions/extension_keybinding_registry.cc
@@ -42,6 +42,8 @@
   registrar_.Add(this,
                  extensions::NOTIFICATION_EXTENSION_COMMAND_REMOVED,
                  content::Source<Profile>(profile->GetOriginalProfile()));
+  media_keys_listener_ = ui::MediaKeysListener::Create(
+      this, ui::MediaKeysListener::Scope::kFocused);
 }
 
 ExtensionKeybindingRegistry::~ExtensionKeybindingRegistry() {
@@ -73,6 +75,10 @@
       RemoveExtensionKeybindingImpl(old->first, command_name);
       event_targets_.erase(old);
 
+      if (media_keys_listener_ && !IsAnyMediaKeyRegistered()) {
+        media_keys_listener_->StopWatchingMediaKeys();
+      }
+
       // If a specific command_name was requested, it has now been deleted so no
       // further work is required.
       if (!command_name.empty())
@@ -144,8 +150,17 @@
       std::make_pair(extension_id, command_name));
   // Shortcuts except media keys have only one target in the list. See comment
   // about |event_targets_|.
-  if (!extensions::Command::IsMediaKey(accelerator))
+  if (!Command::IsMediaKey(accelerator)) {
     DCHECK_EQ(1u, event_targets_[accelerator].size());
+  }
+
+  if (media_keys_listener_ && !media_keys_listener_->IsWatchingMediaKeys() &&
+      IsAnyMediaKeyRegistered()) {
+    // If media keys were not already being watched, this must have been the
+    // first.
+    DCHECK(Command::IsMediaKey(accelerator));
+    media_keys_listener_->StartWatchingMediaKeys();
+  }
 }
 
 bool ExtensionKeybindingRegistry::GetFirstTarget(
@@ -227,6 +242,15 @@
   }
 }
 
+ui::MediaKeysListener::MediaKeysHandleResult
+ExtensionKeybindingRegistry::OnMediaKeysAccelerator(
+    const ui::Accelerator& accelerator) {
+  return NotifyEventTargets(accelerator)
+             ? ui::MediaKeysListener::MediaKeysHandleResult::
+                   kSuppressPropagation
+             : ui::MediaKeysListener::MediaKeysHandleResult::kIgnore;
+}
+
 bool ExtensionKeybindingRegistry::ExtensionMatchesFilter(
     const extensions::Extension* extension)
 {
@@ -264,4 +288,13 @@
   return executed;
 }
 
+bool ExtensionKeybindingRegistry::IsAnyMediaKeyRegistered() const {
+  for (const auto& iter : event_targets_) {
+    if (Command::IsMediaKey(iter.first)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_keybinding_registry.h b/chrome/browser/extensions/extension_keybinding_registry.h
index 6df47a5..19d8b19 100644
--- a/chrome/browser/extensions/extension_keybinding_registry.h
+++ b/chrome/browser/extensions/extension_keybinding_registry.h
@@ -7,6 +7,7 @@
 
 #include <list>
 #include <map>
+#include <memory>
 #include <string>
 
 #include "base/compiler_specific.h"
@@ -17,6 +18,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "ui/base/accelerators/media_keys_listener.h"
 
 namespace content {
 class BrowserContext;
@@ -36,7 +38,8 @@
 // logic for keyboard accelerators. See platform-specific implementations for
 // implementation details for each platform.
 class ExtensionKeybindingRegistry : public content::NotificationObserver,
-                                    public ExtensionRegistryObserver {
+                                    public ExtensionRegistryObserver,
+                                    public ui::MediaKeysListener::Delegate {
  public:
   enum ExtensionFilter {
     ALL_EXTENSIONS,
@@ -143,6 +146,10 @@
                            const Extension* extension,
                            UnloadedExtensionReason reason) override;
 
+  // ui::MediaKeysListener::Delegate:
+  ui::MediaKeysListener::MediaKeysHandleResult OnMediaKeysAccelerator(
+      const ui::Accelerator& accelerator) override;
+
   // Returns true if the |extension| matches our extension filter.
   bool ExtensionMatchesFilter(const extensions::Extension* extension);
 
@@ -153,6 +160,9 @@
   bool ExecuteCommands(const ui::Accelerator& accelerator,
                        const std::string& extension_id);
 
+  // Whether or not any media keys are currently registered.
+  bool IsAnyMediaKeyRegistered() const;
+
   // The content notification registrar for listening to extension events.
   content::NotificationRegistrar registrar_;
 
@@ -186,6 +196,9 @@
   // in the Find box opening.
   bool shortcut_handling_suspended_;
 
+  // Listen for Media keys events.
+  std::unique_ptr<ui::MediaKeysListener> media_keys_listener_;
+
   DISALLOW_COPY_AND_ASSIGN(ExtensionKeybindingRegistry);
 };
 
diff --git a/chrome/browser/extensions/extension_protocols_unittest.cc b/chrome/browser/extensions/extension_protocols_unittest.cc
index 6c1a6de4..2049742 100644
--- a/chrome/browser/extensions/extension_protocols_unittest.cc
+++ b/chrome/browser/extensions/extension_protocols_unittest.cc
@@ -26,10 +26,14 @@
 #include "content/public/common/previews_state.h"
 #include "content/public/test/mock_resource_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_renderer_host.h"
 #include "content/public/test/test_utils.h"
+#include "content/public/test/web_contents_tester.h"
 #include "extensions/browser/content_verifier.h"
 #include "extensions/browser/content_verifier/test_utils.h"
+#include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_protocols.h"
+#include "extensions/browser/extension_registry.h"
 #include "extensions/browser/info_map.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
@@ -43,13 +47,24 @@
 #include "net/url_request/url_request_job_factory_impl.h"
 #include "net/url_request/url_request_status.h"
 #include "net/url_request/url_request_test_util.h"
+#include "services/network/test/test_url_loader_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using content::ResourceType;
+using extensions::ExtensionRegistry;
+using network::mojom::URLLoader;
 
 namespace extensions {
 namespace {
 
+enum class RequestHandlerType {
+  kURLLoader,
+  kURLRequest,
+};
+
+const RequestHandlerType kTestModes[] = {RequestHandlerType::kURLLoader,
+                                         RequestHandlerType::kURLRequest};
+
 base::FilePath GetTestPath(const std::string& name) {
   base::FilePath path;
   EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path));
@@ -118,25 +133,75 @@
   return extension;
 }
 
+// Helper function to create a |ResourceRequest| for testing purposes.
+network::ResourceRequest CreateResourceRequest(const std::string& method,
+                                               ResourceType resource_type,
+                                               const GURL& url) {
+  network::ResourceRequest request;
+  request.method = method;
+  request.url = url;
+  request.site_for_cookies = url;  // bypass third-party cookie blocking.
+  request.request_initiator =
+      url::Origin::Create(url);  // ensure initiator set.
+  request.referrer_policy = content::Referrer::GetDefaultReferrerPolicy();
+  request.resource_type = resource_type;
+  request.is_main_frame = resource_type == content::RESOURCE_TYPE_MAIN_FRAME;
+  request.allow_download = true;
+  return request;
+}
+
+// The result of either a URLRequest of a URLLoader response (but not both)
+// depending on the on test type.
+class GetResult {
+ public:
+  GetResult(std::unique_ptr<net::URLRequest> request, int result)
+      : request_(std::move(request)), result_(result) {}
+  GetResult(const network::ResourceResponseHead& response, int result)
+      : resource_response_(response), result_(result) {}
+  GetResult(GetResult&& other)
+      : request_(std::move(other.request_)), result_(other.result_) {}
+  ~GetResult() = default;
+
+  std::string GetResponseHeaderByName(const std::string& name) const {
+    std::string value;
+    if (request_)
+      request_->GetResponseHeaderByName(name, &value);
+    else if (resource_response_.headers)
+      resource_response_.headers->GetNormalizedHeader(name, &value);
+    return value;
+  }
+
+  int result() const { return result_; }
+
+ private:
+  std::unique_ptr<net::URLRequest> request_;
+  const network::ResourceResponseHead resource_response_;
+  int result_;
+
+  DISALLOW_COPY_AND_ASSIGN(GetResult);
+};
+
 }  // namespace
 
 // This test lives in src/chrome instead of src/extensions because it tests
 // functionality delegated back to Chrome via ChromeExtensionsBrowserClient.
 // See chrome/browser/extensions/chrome_url_request_util.cc.
-class ExtensionProtocolsTest : public testing::Test {
+class ExtensionProtocolsTest
+    : public testing::Test,
+      public testing::WithParamInterface<RequestHandlerType> {
  public:
   ExtensionProtocolsTest()
       : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
+        rvh_test_enabler_(new content::RenderViewHostTestEnabler()),
         old_factory_(NULL),
         resource_context_(&test_url_request_context_) {}
 
   void SetUp() override {
     testing::Test::SetUp();
     testing_profile_ = TestingProfile::Builder().Build();
+    contents_.reset(CreateTestWebContents());
     extension_info_map_ = new InfoMap();
-    net::URLRequestContext* request_context =
-        resource_context_.GetRequestContext();
-    old_factory_ = request_context->job_factory();
+    old_factory_ = resource_context_.GetRequestContext()->job_factory();
 
     // Set up content verification.
     base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
@@ -144,32 +209,116 @@
         switches::kExtensionContentVerification,
         switches::kExtensionContentVerificationEnforce);
     content_verifier_ = new ContentVerifier(
-        testing_profile_.get(), std::make_unique<ChromeContentVerifierDelegate>(
-                                    testing_profile_.get()));
+        browser_context(),
+        std::make_unique<ChromeContentVerifierDelegate>(browser_context()));
     extension_info_map_->SetContentVerifier(content_verifier_.get());
   }
 
   void TearDown() override {
-    net::URLRequestContext* request_context =
-        resource_context_.GetRequestContext();
-    request_context->set_job_factory(old_factory_);
+    loader_factory_.reset();
+    resource_context_.GetRequestContext()->set_job_factory(old_factory_);
     content_verifier_->Shutdown();
   }
 
   void SetProtocolHandler(bool is_incognito) {
-    net::URLRequestContext* request_context =
-        resource_context_.GetRequestContext();
-    job_factory_.SetProtocolHandler(
-        kExtensionScheme,
-        CreateExtensionProtocolHandler(is_incognito,
-                                       extension_info_map_.get()));
-    request_context->set_job_factory(&job_factory_);
+    switch (request_handler()) {
+      case RequestHandlerType::kURLLoader:
+        loader_factory_ = extensions::CreateExtensionNavigationURLLoaderFactory(
+            main_rfh(), extension_info_map_.get());
+        break;
+      case RequestHandlerType::kURLRequest:
+        job_factory_.SetProtocolHandler(
+            kExtensionScheme, CreateExtensionProtocolHandler(
+                                  is_incognito, extension_info_map_.get()));
+        resource_context_.GetRequestContext()->set_job_factory(&job_factory_);
+        break;
+    }
+    testing_profile_->ForceIncognito(is_incognito);
   }
 
-  void StartRequest(net::URLRequest* request,
-                    ResourceType resource_type) {
+  GetResult RequestOrLoad(const GURL& url, ResourceType resource_type) {
+    switch (request_handler()) {
+      case RequestHandlerType::kURLLoader:
+        return LoadURL(url, resource_type);
+      case RequestHandlerType::kURLRequest:
+        return RequestURL(url, resource_type);
+    }
+    NOTREACHED();
+    return GetResult(nullptr, net::ERR_FAILED);
+  }
+
+  void AddExtension(const scoped_refptr<const Extension>& extension,
+                    bool incognito_enabled,
+                    bool notifications_disabled) {
+    extension_info_map_->AddExtension(extension.get(), base::Time::Now(),
+                                      incognito_enabled,
+                                      notifications_disabled);
+    if (request_handler() == RequestHandlerType::kURLLoader) {
+      EXPECT_TRUE(extension_registry()->AddEnabled(extension));
+      ExtensionPrefs::Get(browser_context())
+          ->SetIsIncognitoEnabled(extension->id(), incognito_enabled);
+    }
+  }
+
+  void RemoveExtension(const scoped_refptr<const Extension>& extension,
+                       const UnloadedExtensionReason reason) {
+    extension_info_map_->RemoveExtension(extension->id(), reason);
+    if (request_handler() == RequestHandlerType::kURLLoader) {
+      EXPECT_TRUE(extension_registry()->RemoveEnabled(extension->id()));
+      if (reason == UnloadedExtensionReason::DISABLE)
+        EXPECT_TRUE(extension_registry()->AddDisabled(extension));
+    }
+  }
+
+  // Helper method to create a URL request/loader, call RequestOrLoad on it, and
+  // return the result. If |extension| hasn't already been added to
+  // |extension_info_map_|, this will add it.
+  GetResult DoRequestOrLoad(const scoped_refptr<Extension> extension,
+                            const std::string& relative_path) {
+    if (!extension_info_map_->extensions().Contains(extension->id())) {
+      AddExtension(extension.get(),
+                   /*incognito_enabled=*/false,
+                   /*notifications_disabled=*/false);
+    }
+    return RequestOrLoad(extension->GetResourceURL(relative_path),
+                         content::RESOURCE_TYPE_MAIN_FRAME);
+  }
+
+  ExtensionRegistry* extension_registry() {
+    return ExtensionRegistry::Get(browser_context());
+  }
+
+  content::BrowserContext* browser_context() { return testing_profile_.get(); }
+
+ protected:
+  scoped_refptr<ContentVerifier> content_verifier_;
+
+ private:
+  GetResult LoadURL(const GURL& url, ResourceType resource_type) {
+    constexpr int32_t kRoutingId = 81;
+    constexpr int32_t kRequestId = 28;
+
+    network::mojom::URLLoaderPtr loader;
+    network::TestURLLoaderClient client;
+    loader_factory_->CreateLoaderAndStart(
+        mojo::MakeRequest(&loader), kRoutingId, kRequestId,
+        network::mojom::kURLLoadOptionNone,
+        CreateResourceRequest("GET", resource_type, url),
+        client.CreateInterfacePtr(),
+        net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
+
+    client.RunUntilComplete();
+    return GetResult(client.response_head(),
+                     client.completion_status().error_code);
+  }
+
+  GetResult RequestURL(const GURL& url, ResourceType resource_type) {
+    auto request = resource_context_.GetRequestContext()->CreateRequest(
+        url, net::DEFAULT_PRIORITY, &test_delegate_,
+        TRAFFIC_ANNOTATION_FOR_TESTS);
+
     content::ResourceRequestInfo::AllocateForTesting(
-        request, resource_type, &resource_context_,
+        request.get(), resource_type, &resource_context_,
         /*render_process_id=*/-1,
         /*render_view_id=*/-1,
         /*render_frame_id=*/-1,
@@ -179,43 +328,41 @@
         /*navigation_ui_data*/ nullptr);
     request->Start();
     base::RunLoop().Run();
+    return GetResult(std::move(request), test_delegate_.request_status());
   }
 
-  // Helper method to create a URLRequest, call StartRequest on it, and return
-  // the result. If |extension| hasn't already been added to
-  // |extension_info_map_|, this will add it.
-  int DoRequest(const Extension& extension, const std::string& relative_path) {
-    if (!extension_info_map_->extensions().Contains(extension.id())) {
-      extension_info_map_->AddExtension(&extension,
-                                        base::Time::Now(),
-                                        false,   // incognito_enabled
-                                        false);  // notifications_disabled
-    }
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension.GetResourceURL(relative_path), net::DEFAULT_PRIORITY,
-            &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME);
-    return test_delegate_.request_status();
+  content::WebContents* CreateTestWebContents() {
+    auto site_instance = content::SiteInstance::Create(browser_context());
+    return content::WebContentsTester::CreateTestWebContents(
+        browser_context(), std::move(site_instance));
   }
 
- protected:
+  content::WebContents* web_contents() { return contents_.get(); }
+
+  content::RenderFrameHost* main_rfh() {
+    return web_contents()->GetMainFrame();
+  }
+
+  RequestHandlerType request_handler() const { return GetParam(); }
+
   content::TestBrowserThreadBundle thread_bundle_;
-  scoped_refptr<InfoMap> extension_info_map_;
+  std::unique_ptr<content::RenderViewHostTestEnabler> rvh_test_enabler_;
   net::URLRequestJobFactoryImpl job_factory_;
   const net::URLRequestJobFactory* old_factory_;
-  net::TestDelegate test_delegate_;
+  std::unique_ptr<network::mojom::URLLoaderFactory> loader_factory_;
   net::TestURLRequestContext test_url_request_context_;
   content::MockResourceContext resource_context_;
-  scoped_refptr<ContentVerifier> content_verifier_;
   std::unique_ptr<TestingProfile> testing_profile_;
+  net::TestDelegate test_delegate_;
+  std::unique_ptr<content::WebContents> contents_;
+  scoped_refptr<InfoMap> extension_info_map_;
 };
 
 // Tests that making a chrome-extension request in an incognito context is
 // only allowed under the right circumstances (if the extension is allowed
 // in incognito, and it's either a non-main-frame request or a split-mode
 // extension).
-TEST_F(ExtensionProtocolsTest, IncognitoRequest) {
+TEST_P(ExtensionProtocolsTest, IncognitoRequest) {
   // Register an incognito extension protocol handler.
   SetProtocolHandler(true);
 
@@ -238,25 +385,21 @@
   for (size_t i = 0; i < arraysize(cases); ++i) {
     scoped_refptr<Extension> extension =
         CreateTestExtension(cases[i].name, cases[i].incognito_split_mode);
-    extension_info_map_->AddExtension(
-        extension.get(), base::Time::Now(), cases[i].incognito_enabled, false);
+    AddExtension(extension, cases[i].incognito_enabled, false);
 
     // First test a main frame request.
     {
       // It doesn't matter that the resource doesn't exist. If the resource
       // is blocked, we should see BLOCKED_BY_CLIENT. Otherwise, the request
       // should just fail because the file doesn't exist.
-      std::unique_ptr<net::URLRequest> request(
-          resource_context_.GetRequestContext()->CreateRequest(
-              extension->GetResourceURL("404.html"), net::DEFAULT_PRIORITY,
-              &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS));
-      StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME);
+      auto get_result = RequestOrLoad(extension->GetResourceURL("404.html"),
+                                      content::RESOURCE_TYPE_MAIN_FRAME);
 
       if (cases[i].should_allow_main_frame_load) {
-        EXPECT_EQ(net::ERR_FILE_NOT_FOUND, test_delegate_.request_status())
+        EXPECT_EQ(net::ERR_FILE_NOT_FOUND, get_result.result())
             << cases[i].name;
       } else {
-        EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status())
+        EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, get_result.result())
             << cases[i].name;
       }
     }
@@ -264,13 +407,14 @@
     // Subframe navigation requests are blocked in ExtensionNavigationThrottle
     // which isn't added in this unit test. This is tested in an integration
     // test in ExtensionResourceRequestPolicyTest.IframeNavigateToInaccessible.
+    RemoveExtension(extension, UnloadedExtensionReason::UNINSTALL);
   }
 }
 
-void CheckForContentLengthHeader(net::URLRequest* request) {
-  std::string content_length;
-  request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentLength,
-                                  &content_length);
+void CheckForContentLengthHeader(const GetResult& get_result) {
+  std::string content_length = get_result.GetResponseHeaderByName(
+      net::HttpRequestHeaders::kContentLength);
+
   EXPECT_FALSE(content_length.empty());
   int length_value = 0;
   EXPECT_TRUE(base::StringToInt(content_length, &length_value));
@@ -279,111 +423,83 @@
 
 // Tests getting a resource for a component extension works correctly, both when
 // the extension is enabled and when it is disabled.
-TEST_F(ExtensionProtocolsTest, ComponentResourceRequest) {
+TEST_P(ExtensionProtocolsTest, ComponentResourceRequest) {
   // Register a non-incognito extension protocol handler.
   SetProtocolHandler(false);
 
   scoped_refptr<Extension> extension = CreateWebStoreExtension();
-  extension_info_map_->AddExtension(extension.get(),
-                                    base::Time::Now(),
-                                    false,
-                                    false);
+  AddExtension(extension, false, false);
 
   // First test it with the extension enabled.
   {
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL("webstore_icon_16.png"),
-            net::DEFAULT_PRIORITY, &test_delegate_,
-            TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA);
-    EXPECT_EQ(net::OK, test_delegate_.request_status());
-    CheckForContentLengthHeader(request.get());
-    std::string mime_type;
-    request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentType,
-                                     &mime_type);
-    EXPECT_EQ("image/png", mime_type);
+    auto get_result =
+        RequestOrLoad(extension->GetResourceURL("webstore_icon_16.png"),
+                      content::RESOURCE_TYPE_MEDIA);
+    EXPECT_EQ(net::OK, get_result.result());
+    CheckForContentLengthHeader(get_result);
+    EXPECT_EQ("image/png", get_result.GetResponseHeaderByName(
+                               net::HttpRequestHeaders::kContentType));
   }
 
   // And then test it with the extension disabled.
-  extension_info_map_->RemoveExtension(extension->id(),
-                                       UnloadedExtensionReason::DISABLE);
+  RemoveExtension(extension, UnloadedExtensionReason::DISABLE);
   {
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL("webstore_icon_16.png"),
-            net::DEFAULT_PRIORITY, &test_delegate_,
-            TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA);
-    EXPECT_EQ(net::OK, test_delegate_.request_status());
-    CheckForContentLengthHeader(request.get());
-    std::string mime_type;
-    request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentType,
-                                     &mime_type);
-    EXPECT_EQ("image/png", mime_type);
+    auto get_result =
+        RequestOrLoad(extension->GetResourceURL("webstore_icon_16.png"),
+                      content::RESOURCE_TYPE_MEDIA);
+    EXPECT_EQ(net::OK, get_result.result());
+    CheckForContentLengthHeader(get_result);
+    EXPECT_EQ("image/png", get_result.GetResponseHeaderByName(
+                               net::HttpRequestHeaders::kContentType));
   }
 }
 
 // Tests that a URL request for resource from an extension returns a few
 // expected response headers.
-TEST_F(ExtensionProtocolsTest, ResourceRequestResponseHeaders) {
+TEST_P(ExtensionProtocolsTest, ResourceRequestResponseHeaders) {
   // Register a non-incognito extension protocol handler.
   SetProtocolHandler(false);
 
   scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension();
-  extension_info_map_->AddExtension(extension.get(),
-                                    base::Time::Now(),
-                                    false,
-                                    false);
+  AddExtension(extension, false, false);
 
   {
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY,
-            &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA);
-    EXPECT_EQ(net::OK, test_delegate_.request_status());
+    auto get_result = RequestOrLoad(extension->GetResourceURL("test.dat"),
+                                    content::RESOURCE_TYPE_MEDIA);
+    EXPECT_EQ(net::OK, get_result.result());
 
     // Check that cache-related headers are set.
-    std::string etag;
-    request->GetResponseHeaderByName("ETag", &etag);
+    std::string etag = get_result.GetResponseHeaderByName("ETag");
     EXPECT_TRUE(base::StartsWith(etag, "\"", base::CompareCase::SENSITIVE));
     EXPECT_TRUE(base::EndsWith(etag, "\"", base::CompareCase::SENSITIVE));
 
-    std::string revalidation_header;
-    request->GetResponseHeaderByName("cache-control", &revalidation_header);
+    std::string revalidation_header =
+        get_result.GetResponseHeaderByName("cache-control");
     EXPECT_EQ("no-cache", revalidation_header);
 
     // We set test.dat as web-accessible, so it should have a CORS header.
-    std::string access_control;
-    request->GetResponseHeaderByName("Access-Control-Allow-Origin",
-                                    &access_control);
+    std::string access_control =
+        get_result.GetResponseHeaderByName("Access-Control-Allow-Origin");
     EXPECT_EQ("*", access_control);
   }
 }
 
 // Tests that a URL request for main frame or subframe from an extension
 // succeeds, but subresources fail. See http://crbug.com/312269.
-TEST_F(ExtensionProtocolsTest, AllowFrameRequests) {
+TEST_P(ExtensionProtocolsTest, AllowFrameRequests) {
   // Register a non-incognito extension protocol handler.
   SetProtocolHandler(false);
 
   scoped_refptr<Extension> extension = CreateTestExtension("foo", false);
-  extension_info_map_->AddExtension(extension.get(),
-                                    base::Time::Now(),
-                                    false,
-                                    false);
+  AddExtension(extension, false, false);
 
   // All MAIN_FRAME requests should succeed. SUB_FRAME requests that are not
-  // explicitly listed in web_accesible_resources or same-origin to the parent
+  // explicitly listed in web_accessible_resources or same-origin to the parent
   // should not succeed.
   {
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY,
-            &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME);
-    EXPECT_EQ(net::OK, test_delegate_.request_status());
+    auto get_result = RequestOrLoad(extension->GetResourceURL("test.dat"),
+                                    content::RESOURCE_TYPE_MAIN_FRAME);
+    EXPECT_EQ(net::OK, get_result.result());
   }
 
   // Subframe navigation requests are blocked in ExtensionNavigationThrottle
@@ -392,16 +508,13 @@
 
   // And subresource types, such as media, should fail.
   {
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL("test.dat"), net::DEFAULT_PRIORITY,
-            &test_delegate_, TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA);
-    EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, test_delegate_.request_status());
+    auto get_result = RequestOrLoad(extension->GetResourceURL("test.dat"),
+                                    content::RESOURCE_TYPE_MEDIA);
+    EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, get_result.result());
   }
 }
 
-TEST_F(ExtensionProtocolsTest, MetadataFolder) {
+TEST_P(ExtensionProtocolsTest, MetadataFolder) {
   SetProtocolHandler(false);
 
   base::FilePath extension_dir = GetTestPath("metadata_folder");
@@ -412,25 +525,25 @@
   ASSERT_NE(extension.get(), nullptr) << "error: " << error;
 
   // Loading "/test.html" should succeed.
-  EXPECT_EQ(net::OK, DoRequest(*extension, "test.html"));
+  EXPECT_EQ(net::OK, DoRequestOrLoad(extension, "test.html").result());
 
   // Loading "/_metadata/verified_contents.json" should fail.
   base::FilePath relative_path =
       base::FilePath(kMetadataFolder).Append(kVerifiedContentsFilename);
   EXPECT_TRUE(base::PathExists(extension_dir.Append(relative_path)));
-  EXPECT_EQ(net::ERR_FAILED,
-            DoRequest(*extension, relative_path.AsUTF8Unsafe()));
+  EXPECT_NE(net::OK,
+            DoRequestOrLoad(extension, relative_path.AsUTF8Unsafe()).result());
 
   // Loading "/_metadata/a.txt" should also fail.
   relative_path = base::FilePath(kMetadataFolder).AppendASCII("a.txt");
   EXPECT_TRUE(base::PathExists(extension_dir.Append(relative_path)));
-  EXPECT_EQ(net::ERR_FAILED,
-            DoRequest(*extension, relative_path.AsUTF8Unsafe()));
+  EXPECT_NE(net::OK,
+            DoRequestOrLoad(extension, relative_path.AsUTF8Unsafe()).result());
 }
 
 // Tests that unreadable files and deleted files correctly go through
 // ContentVerifyJob.
-TEST_F(ExtensionProtocolsTest, VerificationSeenForFileAccessErrors) {
+TEST_P(ExtensionProtocolsTest, VerificationSeenForFileAccessErrors) {
   SetProtocolHandler(false);
 
   // Unzip extension containing verification hashes to a temporary directory.
@@ -451,12 +564,11 @@
   {
     TestContentVerifyJobObserver observer(extension_id, kRelativePath);
 
-    content_verifier_->OnExtensionLoaded(testing_profile_.get(),
-                                         extension.get());
+    content_verifier_->OnExtensionLoaded(browser_context(), extension.get());
     // Wait for PostTask to ContentVerifierIOData::AddData() to finish.
     content::RunAllPendingInMessageLoop();
 
-    EXPECT_EQ(net::OK, DoRequest(*extension, kJs));
+    EXPECT_EQ(net::OK, DoRequestOrLoad(extension, kJs).result());
     EXPECT_EQ(ContentVerifyJob::NONE, observer.WaitForJobFinished());
   }
 
@@ -465,7 +577,7 @@
     TestContentVerifyJobObserver observer(extension->id(), kRelativePath);
     base::FilePath file_path = unzipped_path.AppendASCII(kJs);
     ASSERT_TRUE(base::MakeFileUnreadable(file_path));
-    EXPECT_EQ(net::ERR_ACCESS_DENIED, DoRequest(*extension, kJs));
+    EXPECT_EQ(net::ERR_ACCESS_DENIED, DoRequestOrLoad(extension, kJs).result());
     EXPECT_EQ(ContentVerifyJob::HASH_MISMATCH, observer.WaitForJobFinished());
     // NOTE: In production, hash mismatch would have disabled |extension|, but
     // since UnzipToDirAndLoadExtension() doesn't add the extension to
@@ -479,13 +591,14 @@
     TestContentVerifyJobObserver observer(extension_id, kRelativePath);
     base::FilePath file_path = unzipped_path.AppendASCII(kJs);
     ASSERT_TRUE(base::DieFileDie(file_path, false));
-    EXPECT_EQ(net::ERR_FILE_NOT_FOUND, DoRequest(*extension, kJs));
+    EXPECT_EQ(net::ERR_FILE_NOT_FOUND,
+              DoRequestOrLoad(extension, kJs).result());
     EXPECT_EQ(ContentVerifyJob::HASH_MISMATCH, observer.WaitForJobFinished());
   }
 }
 
 // Tests that zero byte files correctly go through ContentVerifyJob.
-TEST_F(ExtensionProtocolsTest, VerificationSeenForZeroByteFile) {
+TEST_P(ExtensionProtocolsTest, VerificationSeenForZeroByteFile) {
   SetProtocolHandler(false);
 
   const std::string kEmptyJs("empty.js");
@@ -512,12 +625,11 @@
   {
     TestContentVerifyJobObserver observer(extension_id, kRelativePath);
 
-    content_verifier_->OnExtensionLoaded(testing_profile_.get(),
-                                         extension.get());
+    content_verifier_->OnExtensionLoaded(browser_context(), extension.get());
     // Wait for PostTask to ContentVerifierIOData::AddData() to finish.
     content::RunAllPendingInMessageLoop();
 
-    EXPECT_EQ(net::OK, DoRequest(*extension, kEmptyJs));
+    EXPECT_EQ(net::OK, DoRequestOrLoad(extension, kEmptyJs).result());
     EXPECT_EQ(ContentVerifyJob::NONE, observer.WaitForJobFinished());
   }
 
@@ -529,7 +641,8 @@
     TestContentVerifyJobObserver observer(extension->id(), kRelativePath);
     base::FilePath file_path = unzipped_path.AppendASCII(kEmptyJs);
     ASSERT_TRUE(base::MakeFileUnreadable(file_path));
-    EXPECT_EQ(net::ERR_ACCESS_DENIED, DoRequest(*extension, kEmptyJs));
+    EXPECT_EQ(net::ERR_ACCESS_DENIED,
+              DoRequestOrLoad(extension, kEmptyJs).result());
     EXPECT_EQ(ContentVerifyJob::NONE, observer.WaitForJobFinished());
   }
 
@@ -541,13 +654,14 @@
     TestContentVerifyJobObserver observer(extension_id, kRelativePath);
     base::FilePath file_path = unzipped_path.AppendASCII(kEmptyJs);
     ASSERT_TRUE(base::DieFileDie(file_path, false));
-    EXPECT_EQ(net::ERR_FILE_NOT_FOUND, DoRequest(*extension, kEmptyJs));
+    EXPECT_EQ(net::ERR_FILE_NOT_FOUND,
+              DoRequestOrLoad(extension, kEmptyJs).result());
     EXPECT_EQ(ContentVerifyJob::NONE, observer.WaitForJobFinished());
   }
 }
 
 // Tests that mime types are properly set for returned extension resources.
-TEST_F(ExtensionProtocolsTest, MimeTypesForKnownFiles) {
+TEST_P(ExtensionProtocolsTest, MimeTypesForKnownFiles) {
   // Register a non-incognito extension protocol handler.
   SetProtocolHandler(false);
 
@@ -579,8 +693,7 @@
           .Build();
   ASSERT_TRUE(extension);
 
-  extension_info_map_->AddExtension(extension.get(), base::Time::Now(), false,
-                                    false);
+  AddExtension(extension.get(), false, false);
 
   struct {
     const char* file_name;
@@ -592,18 +705,16 @@
 
   for (const auto& test_case : test_cases) {
     SCOPED_TRACE(test_case.file_name);
-    std::unique_ptr<net::URLRequest> request(
-        resource_context_.GetRequestContext()->CreateRequest(
-            extension->GetResourceURL(test_case.file_name),
-            net::DEFAULT_PRIORITY, &test_delegate_,
-            TRAFFIC_ANNOTATION_FOR_TESTS));
-    StartRequest(request.get(), content::RESOURCE_TYPE_SUB_RESOURCE);
-    EXPECT_EQ(net::OK, test_delegate_.request_status());
-    std::string mime_type;
-    request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentType,
-                                     &mime_type);
-    EXPECT_EQ(test_case.expected_mime_type, mime_type);
+    auto result = RequestOrLoad(extension->GetResourceURL(test_case.file_name),
+                                content::RESOURCE_TYPE_SUB_RESOURCE);
+    EXPECT_EQ(
+        test_case.expected_mime_type,
+        result.GetResponseHeaderByName(net::HttpRequestHeaders::kContentType));
   }
 }
 
+INSTANTIATE_TEST_CASE_P(Extensions,
+                        ExtensionProtocolsTest,
+                        ::testing::ValuesIn(kTestModes));
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.h b/chrome/browser/extensions/global_shortcut_listener_mac.h
index fa07c53..5bf9167 100644
--- a/chrome/browser/extensions/global_shortcut_listener_mac.h
+++ b/chrome/browser/extensions/global_shortcut_listener_mac.h
@@ -8,12 +8,13 @@
 #include "chrome/browser/extensions/global_shortcut_listener.h"
 
 #include <Carbon/Carbon.h>
-#include <CoreFoundation/CoreFoundation.h>
 
 #include <map>
+#include <memory>
 
 #include "base/mac/scoped_nsobject.h"
 #include "base/macros.h"
+#include "ui/base/accelerators/media_keys_listener.h"
 
 namespace extensions {
 
@@ -26,7 +27,8 @@
 // (PlayPause, NextTrack, PreviousTrack).
 // 2. Binds keyboard shortcuts (hot keys). Carbon RegisterEventHotKey API for
 // binding to non-media key global hot keys (eg. Command-Shift-1).
-class GlobalShortcutListenerMac : public GlobalShortcutListener {
+class GlobalShortcutListenerMac : public GlobalShortcutListener,
+                                  public ui::MediaKeysListener::Delegate {
  public:
   GlobalShortcutListenerMac();
   ~GlobalShortcutListenerMac() override;
@@ -39,7 +41,6 @@
 
   // Keyboard event callbacks.
   void OnHotKeyEvent(EventHotKeyID hot_key_id);
-  bool OnMediaKeyEvent(int key_code);
 
   // GlobalShortcutListener implementation.
   void StartListening() override;
@@ -47,14 +48,14 @@
   bool RegisterAcceleratorImpl(const ui::Accelerator& accelerator) override;
   void UnregisterAcceleratorImpl(const ui::Accelerator& accelerator) override;
 
+  // ui::MediaKeysListener::Delegate:
+  ui::MediaKeysListener::MediaKeysHandleResult OnMediaKeysAccelerator(
+      const ui::Accelerator& accelerator) override;
+
   // Mac-specific functions for registering hot keys with modifiers.
   bool RegisterHotKey(const ui::Accelerator& accelerator, KeyId hot_key_id);
   void UnregisterHotKey(const ui::Accelerator& accelerator);
 
-  // Enable and disable the media key event tap.
-  void StartWatchingMediaKeys();
-  void StopWatchingMediaKeys();
-
   // Enable and disable the hot key event handler.
   void StartWatchingHotKeys();
   void StopWatchingHotKeys();
@@ -65,10 +66,6 @@
   // Whether or not any hot keys are currently registered.
   bool IsAnyHotKeyRegistered();
 
-  // The callback for when an event tap happens.
-  static CGEventRef EventTapCallback(
-      CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon);
-
   // The callback for when a hot key event happens.
   static OSStatus HotKeyHandler(
       EventHandlerCallRef next_handler, EventRef event, void* user_data);
@@ -90,13 +87,12 @@
   // Keyboard shortcut IDs to hotkeys map for unregistration.
   IdHotKeyRefMap id_hot_key_refs_;
 
-  // Event tap for intercepting mac media keys.
-  CFMachPortRef event_tap_;
-  CFRunLoopSourceRef event_tap_source_;
-
   // Event handler for keyboard shortcut hot keys.
   EventHandlerRef event_handler_;
 
+  // Media keys listener.
+  std::unique_ptr<ui::MediaKeysListener> media_keys_listener_;
+
   DISALLOW_COPY_AND_ASSIGN(GlobalShortcutListenerMac);
 };
 
diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.mm b/chrome/browser/extensions/global_shortcut_listener_mac.mm
index 7df8fba..f612ba2 100644
--- a/chrome/browser/extensions/global_shortcut_listener_mac.mm
+++ b/chrome/browser/extensions/global_shortcut_listener_mac.mm
@@ -18,28 +18,6 @@
 using content::BrowserThread;
 using extensions::GlobalShortcutListenerMac;
 
-namespace {
-
-// The media keys subtype. No official docs found, but widely known.
-// http://lists.apple.com/archives/cocoa-dev/2007/Aug/msg00499.html
-const int kSystemDefinedEventMediaKeysSubtype = 8;
-
-ui::KeyboardCode MediaKeyCodeToKeyboardCode(int key_code) {
-  switch (key_code) {
-    case NX_KEYTYPE_PLAY:
-      return ui::VKEY_MEDIA_PLAY_PAUSE;
-    case NX_KEYTYPE_PREVIOUS:
-    case NX_KEYTYPE_REWIND:
-      return ui::VKEY_MEDIA_PREV_TRACK;
-    case NX_KEYTYPE_NEXT:
-    case NX_KEYTYPE_FAST:
-      return ui::VKEY_MEDIA_NEXT_TRACK;
-  }
-  return ui::VKEY_UNKNOWN;
-}
-
-}  // namespace
-
 namespace extensions {
 
 // static
@@ -53,10 +31,12 @@
 GlobalShortcutListenerMac::GlobalShortcutListenerMac()
     : is_listening_(false),
       hot_key_id_(0),
-      event_tap_(NULL),
-      event_tap_source_(NULL),
       event_handler_(NULL) {
   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  media_keys_listener_ = ui::MediaKeysListener::Create(
+      this, ui::MediaKeysListener::Scope::kGlobal);
+  DCHECK(media_keys_listener_);
 }
 
 GlobalShortcutListenerMac::~GlobalShortcutListenerMac() {
@@ -67,11 +47,6 @@
   if (is_listening_)
     StopListening();
 
-  // If keys are still registered, make sure we stop the tap. Again, this
-  // should never happen.
-  if (IsAnyMediaKeyRegistered())
-    StopWatchingMediaKeys();
-
   if (IsAnyHotKeyRegistered())
     StopWatchingHotKeys();
 }
@@ -106,20 +81,6 @@
   NotifyKeyPressed(accelerator);
 }
 
-bool GlobalShortcutListenerMac::OnMediaKeyEvent(int media_key_code) {
-  CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  ui::KeyboardCode key_code = MediaKeyCodeToKeyboardCode(media_key_code);
-  // Create an accelerator corresponding to the keyCode.
-  ui::Accelerator accelerator(key_code, 0);
-  // Look for a match with a bound hot_key.
-  if (accelerator_ids_.find(accelerator) != accelerator_ids_.end()) {
-    // If matched, callback to the event handling system.
-    NotifyKeyPressed(accelerator);
-    return true;
-  }
-  return false;
-}
-
 bool GlobalShortcutListenerMac::RegisterAcceleratorImpl(
     const ui::Accelerator& accelerator) {
   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -128,7 +89,7 @@
   if (Command::IsMediaKey(accelerator)) {
     if (!IsAnyMediaKeyRegistered()) {
       // If this is the first media key registered, start the event tap.
-      StartWatchingMediaKeys();
+      media_keys_listener_->StartWatchingMediaKeys();
     }
   } else {
     // Register hot_key if they are non-media keyboard shortcuts.
@@ -165,7 +126,7 @@
     // If we unregistered a media key, and now no media keys are registered,
     // stop the media key tap.
     if (!IsAnyMediaKeyRegistered())
-      StopWatchingMediaKeys();
+      media_keys_listener_->StopWatchingMediaKeys();
   } else {
     // If we unregistered a hot key, and no more hot keys are registered, remove
     // the hot key handler.
@@ -175,6 +136,17 @@
   }
 }
 
+ui::MediaKeysListener::MediaKeysHandleResult
+GlobalShortcutListenerMac::OnMediaKeysAccelerator(
+    const ui::Accelerator& accelerator) {
+  if (accelerator_ids_.find(accelerator) != accelerator_ids_.end()) {
+    // If matched, callback to the event handling system.
+    NotifyKeyPressed(accelerator);
+    return ui::MediaKeysListener::MediaKeysHandleResult::kSuppressPropagation;
+  }
+  return ui::MediaKeysListener::MediaKeysHandleResult::kIgnore;
+}
+
 bool GlobalShortcutListenerMac::RegisterHotKey(
     const ui::Accelerator& accelerator, KeyId hot_key_id) {
   EventHotKeyID event_hot_key_id;
@@ -218,51 +190,6 @@
   id_hot_key_refs_.erase(key_id);
 }
 
-void GlobalShortcutListenerMac::StartWatchingMediaKeys() {
-  // Make sure there's no existing event tap.
-  DCHECK(event_tap_ == NULL);
-  DCHECK(event_tap_source_ == NULL);
-
-  // Add an event tap to intercept the system defined media key events.
-  event_tap_ = CGEventTapCreate(kCGSessionEventTap,
-      kCGHeadInsertEventTap,
-      kCGEventTapOptionDefault,
-      CGEventMaskBit(NX_SYSDEFINED),
-      EventTapCallback,
-      this);
-  if (event_tap_ == NULL) {
-    LOG(ERROR) << "Error: failed to create event tap.";
-    return;
-  }
-
-  event_tap_source_ = CFMachPortCreateRunLoopSource(kCFAllocatorSystemDefault,
-      event_tap_, 0);
-  if (event_tap_source_ == NULL) {
-    LOG(ERROR) << "Error: failed to create new run loop source.";
-    return;
-  }
-
-  CFRunLoopAddSource(CFRunLoopGetCurrent(), event_tap_source_,
-      kCFRunLoopCommonModes);
-}
-
-void GlobalShortcutListenerMac::StopWatchingMediaKeys() {
-  CFRunLoopRemoveSource(CFRunLoopGetCurrent(), event_tap_source_,
-      kCFRunLoopCommonModes);
-  // Ensure both event tap and source are initialized.
-  DCHECK(event_tap_ != NULL);
-  DCHECK(event_tap_source_ != NULL);
-
-  // Invalidate the event tap.
-  CFMachPortInvalidate(event_tap_);
-  CFRelease(event_tap_);
-  event_tap_ = NULL;
-
-  // Release the event tap source.
-  CFRelease(event_tap_source_);
-  event_tap_source_ = NULL;
-}
-
 void GlobalShortcutListenerMac::StartWatchingHotKeys() {
   DCHECK(!event_handler_);
   EventHandlerUPP hot_key_function = NewEventHandlerUPP(HotKeyHandler);
@@ -298,64 +225,6 @@
   return false;
 }
 
-// Processed events should propagate if they aren't handled by any listeners.
-// For events that don't matter, this handler should return as quickly as
-// possible.
-// Returning event causes the event to propagate to other applications.
-// Returning NULL prevents the event from propagating.
-// static
-CGEventRef GlobalShortcutListenerMac::EventTapCallback(
-    CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
-  GlobalShortcutListenerMac* shortcut_listener =
-      static_cast<GlobalShortcutListenerMac*>(refcon);
-
-  // Handle the timeout case by re-enabling the tap.
-  if (type == kCGEventTapDisabledByTimeout) {
-    CGEventTapEnable(shortcut_listener->event_tap_, TRUE);
-    return event;
-  }
-
-  // Convert the CGEvent to an NSEvent for access to the data1 field.
-  NSEvent* ns_event = [NSEvent eventWithCGEvent:event];
-  if (ns_event == nil) {
-    return event;
-  }
-
-  // Ignore events that are not system defined media keys.
-  if (type != NX_SYSDEFINED ||
-      [ns_event type] != NSSystemDefined ||
-      [ns_event subtype] != kSystemDefinedEventMediaKeysSubtype) {
-    return event;
-  }
-
-  NSInteger data1 = [ns_event data1];
-  // Ignore media keys that aren't previous, next and play/pause.
-  // Magical constants are from http://weblog.rogueamoeba.com/2007/09/29/
-  int key_code = (data1 & 0xFFFF0000) >> 16;
-  if (key_code != NX_KEYTYPE_PLAY && key_code != NX_KEYTYPE_NEXT &&
-      key_code != NX_KEYTYPE_PREVIOUS && key_code != NX_KEYTYPE_FAST &&
-      key_code != NX_KEYTYPE_REWIND) {
-    return event;
-  }
-
-  int key_flags = data1 & 0x0000FFFF;
-  bool is_key_pressed = ((key_flags & 0xFF00) >> 8) == 0xA;
-
-  // If the key wasn't pressed (eg. was released), ignore this event.
-  if (!is_key_pressed)
-    return event;
-
-  // Now we have a media key that we care about. Send it to the caller.
-  bool was_handled = shortcut_listener->OnMediaKeyEvent(key_code);
-
-  // Prevent event from proagating to other apps if handled by Chrome.
-  if (was_handled)
-    return NULL;
-
-  // By default, pass the event through.
-  return event;
-}
-
 // static
 OSStatus GlobalShortcutListenerMac::HotKeyHandler(
     EventHandlerCallRef next_handler, EventRef event, void* user_data) {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 83d247fa..07609fb 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -653,6 +653,10 @@
     "Enables the use of experimental canvas features which are still in "
     "development.";
 
+const char kExperimentalCrostiniUIName[] = "Experimental Crostini";
+const char kExperimentalCrostiniUIDescription[] =
+    "Enables in-development Crostini features.";
+
 const char kExperimentalExtensionApisName[] = "Experimental Extension APIs";
 const char kExperimentalExtensionApisDescription[] =
     "Enables experimental extension APIs. Note that the extension gallery "
@@ -1067,6 +1071,12 @@
 const char kOmniboxUIVerticalMarginDescription[] =
     "Changes the vertical margin in the Omnibox UI.";
 
+const char kOmniboxVoiceSearchAlwaysVisibleName[] =
+    "Omnibox Voice Search Always Visible";
+const char kOmniboxVoiceSearchAlwaysVisibleDescription[] =
+    "Always displays voice search icon in focused omnibox as long as voice "
+    "search is possible";
+
 const char kOriginTrialsName[] = "Origin Trials";
 const char kOriginTrialsDescription[] =
     "Enables origin trials for controlling access to feature/API experiments.";
@@ -1227,6 +1237,12 @@
     "user in Language Settings. The actual locale of the system is derived "
     "from the user selection based on some simple fallback logic.";
 
+const char kRemoveNavigationHistoryName[] =
+    "Remove navigation entry on history deletion";
+const char kRemoveNavigationHistoryDescription[] =
+    "Remove a navigation entry when the corresponding history entry has been "
+    "deleted.";
+
 const char kRemoveUsageOfDeprecatedGaiaSigninEndpointName[] =
     "Remove usage of the deprecated GAIA sign-in endpoint";
 const char kRemoveUsageOfDeprecatedGaiaSigninEndpointDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 330838a..2458fa1 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -416,6 +416,9 @@
 extern const char kExperimentalCanvasFeaturesName[];
 extern const char kExperimentalCanvasFeaturesDescription[];
 
+extern const char kExperimentalCrostiniUIName[];
+extern const char kExperimentalCrostiniUIDescription[];
+
 extern const char kExperimentalExtensionApisName[];
 extern const char kExperimentalExtensionApisDescription[];
 
@@ -664,6 +667,9 @@
 extern const char kOmniboxUIVerticalMarginName[];
 extern const char kOmniboxUIVerticalMarginDescription[];
 
+extern const char kOmniboxVoiceSearchAlwaysVisibleName[];
+extern const char kOmniboxVoiceSearchAlwaysVisibleDescription[];
+
 extern const char kOverflowIconsForMediaControlsName[];
 extern const char kOverflowIconsForMediaControlsDescription[];
 
@@ -761,6 +767,9 @@
 extern const char kRegionalLocalesAsDisplayUIName[];
 extern const char kRegionalLocalesAsDisplayUIDescription[];
 
+extern const char kRemoveNavigationHistoryName[];
+extern const char kRemoveNavigationHistoryDescription[];
+
 extern const char kRemoveUsageOfDeprecatedGaiaSigninEndpointName[];
 extern const char kRemoveUsageOfDeprecatedGaiaSigninEndpointDescription[];
 
diff --git a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc
new file mode 100644
index 0000000..059c1de
--- /dev/null
+++ b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc
@@ -0,0 +1,48 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/installable/installable_ambient_badge_infobar_delegate.h"
+
+#include <memory>
+
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.h"
+
+InstallableAmbientBadgeInfoBarDelegate::
+    ~InstallableAmbientBadgeInfoBarDelegate() {}
+
+// static
+void InstallableAmbientBadgeInfoBarDelegate::Create(
+    content::WebContents* web_contents,
+    base::WeakPtr<Client> weak_client,
+    const SkBitmap& primary_icon) {
+  InfoBarService::FromWebContents(web_contents)
+      ->AddInfoBar(std::make_unique<InstallableAmbientBadgeInfoBar>(
+          std::unique_ptr<InstallableAmbientBadgeInfoBarDelegate>(
+              new InstallableAmbientBadgeInfoBarDelegate(weak_client,
+                                                         primary_icon))));
+}
+
+void InstallableAmbientBadgeInfoBarDelegate::AddToHomescreen() {
+  if (!weak_client_.get())
+    return;
+
+  weak_client_->AddToHomescreenFromBadge();
+}
+
+const SkBitmap& InstallableAmbientBadgeInfoBarDelegate::GetPrimaryIcon() const {
+  return primary_icon_;
+}
+
+InstallableAmbientBadgeInfoBarDelegate::InstallableAmbientBadgeInfoBarDelegate(
+    base::WeakPtr<Client> weak_client,
+    const SkBitmap& primary_icon)
+    : infobars::InfoBarDelegate(),
+      weak_client_(weak_client),
+      primary_icon_(primary_icon) {}
+
+infobars::InfoBarDelegate::InfoBarIdentifier
+InstallableAmbientBadgeInfoBarDelegate::GetIdentifier() const {
+  return INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE;
+}
diff --git a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h
new file mode 100644
index 0000000..c81c622
--- /dev/null
+++ b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h
@@ -0,0 +1,53 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_INSTALLABLE_INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE_H_
+#define CHROME_BROWSER_INSTALLABLE_INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE_H_
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/infobars/core/infobar_delegate.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+namespace content {
+class WebContents;
+}
+
+// Delegate for a infobar shown to users when they visit a progressive web app.
+// Tapping the infobar triggers the add to home screen flow.
+class InstallableAmbientBadgeInfoBarDelegate
+    : public infobars::InfoBarDelegate {
+ public:
+  class Client {
+   public:
+    // Called to trigger the add to home screen flow.
+    virtual void AddToHomescreenFromBadge() = 0;
+
+    virtual ~Client() {}
+  };
+
+  ~InstallableAmbientBadgeInfoBarDelegate() override;
+
+  // Create and show the infobar.
+  static void Create(content::WebContents* web_contents,
+                     base::WeakPtr<Client> weak_client,
+                     const SkBitmap& primary_icon);
+
+  void AddToHomescreen();
+  const SkBitmap& GetPrimaryIcon() const;
+
+ private:
+  InstallableAmbientBadgeInfoBarDelegate(base::WeakPtr<Client> weak_client,
+                                         const SkBitmap& primary_icon);
+
+  // InfoBarDelegate overrides:
+  infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
+
+  base::WeakPtr<Client> weak_client_;
+  const SkBitmap primary_icon_;
+
+  DISALLOW_COPY_AND_ASSIGN(InstallableAmbientBadgeInfoBarDelegate);
+};
+
+#endif  // CHROME_BROWSER_INSTALLABLE_INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE_H_
diff --git a/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.cc b/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.cc
deleted file mode 100644
index 4604474..0000000
--- a/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h"
-
-#include <utility>
-
-#include "chrome/browser/android/shortcut_helper.h"
-#include "chrome/browser/android/shortcut_info.h"
-#include "chrome/browser/android/webapk/webapk_install_service.h"
-#include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/installable/installable_metrics.h"
-#include "chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.h"
-
-PwaAmbientBadgeInfoBarDelegateAndroid::
-    ~PwaAmbientBadgeInfoBarDelegateAndroid() {}
-
-// static
-void PwaAmbientBadgeInfoBarDelegateAndroid::Create(
-    content::WebContents* web_contents,
-    std::unique_ptr<ShortcutInfo> info,
-    const SkBitmap& primary_icon,
-    const SkBitmap& badge_icon,
-    bool is_webapk) {
-  InfoBarService::FromWebContents(web_contents)
-      ->AddInfoBar(std::make_unique<PwaAmbientBadgeInfoBar>(
-          std::unique_ptr<PwaAmbientBadgeInfoBarDelegateAndroid>(
-              new PwaAmbientBadgeInfoBarDelegateAndroid(
-                  std::move(info), primary_icon, badge_icon, is_webapk))));
-}
-
-void PwaAmbientBadgeInfoBarDelegateAndroid::AddToHomescreen() {
-  content::WebContents* web_contents =
-      InfoBarService::WebContentsFromInfoBar(infobar());
-
-  if (!web_contents)
-    return;
-
-  if (is_webapk_) {
-    WebApkInstallService::Get(web_contents->GetBrowserContext())
-        ->InstallAsync(web_contents, *shortcut_info_, primary_icon_,
-                       badge_icon_,
-                       InstallableMetrics::GetInstallSource(
-                           web_contents, InstallTrigger::AMBIENT_BADGE));
-  } else {
-    ShortcutHelper::AddToLauncherWithSkBitmap(web_contents, *shortcut_info_,
-                                              primary_icon_);
-  }
-}
-
-const SkBitmap& PwaAmbientBadgeInfoBarDelegateAndroid::GetPrimaryIcon() const {
-  return primary_icon_;
-}
-
-PwaAmbientBadgeInfoBarDelegateAndroid::PwaAmbientBadgeInfoBarDelegateAndroid(
-    std::unique_ptr<ShortcutInfo> info,
-    const SkBitmap& primary_icon,
-    const SkBitmap& badge_icon,
-    bool is_webapk)
-    : infobars::InfoBarDelegate(),
-      shortcut_info_(std::move(info)),
-      primary_icon_(primary_icon),
-      badge_icon_(badge_icon),
-      is_webapk_(is_webapk) {}
-
-infobars::InfoBarDelegate::InfoBarIdentifier
-PwaAmbientBadgeInfoBarDelegateAndroid::GetIdentifier() const {
-  return PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID;
-}
diff --git a/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h b/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h
deleted file mode 100644
index 77c17bd..0000000
--- a/chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID_H_
-#define CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "components/infobars/core/infobar_delegate.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-
-struct ShortcutInfo;
-
-namespace content {
-class WebContents;
-}
-
-// Delegate for a infobar shown to users when they visit a progressive web app.
-// Tapping the infobar triggers the add to home screen flow.
-class PwaAmbientBadgeInfoBarDelegateAndroid : public infobars::InfoBarDelegate {
- public:
-  ~PwaAmbientBadgeInfoBarDelegateAndroid() override;
-
-  // Create and show the infobar.
-  static void Create(content::WebContents* web_contents,
-                     std::unique_ptr<ShortcutInfo> info,
-                     const SkBitmap& primary_icon,
-                     const SkBitmap& badge_icon,
-                     bool is_webapk);
-
-  void AddToHomescreen();
-  const SkBitmap& GetPrimaryIcon() const;
-
- private:
-  PwaAmbientBadgeInfoBarDelegateAndroid(std::unique_ptr<ShortcutInfo> info,
-                                        const SkBitmap& primary_icon,
-                                        const SkBitmap& badge_icon,
-                                        bool is_webapk);
-
-  // InfoBarDelegate overrides:
-  infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
-
-  std::unique_ptr<ShortcutInfo> shortcut_info_;
-  const SkBitmap primary_icon_;
-  const SkBitmap badge_icon_;
-  bool is_webapk_;
-
-  DISALLOW_COPY_AND_ASSIGN(PwaAmbientBadgeInfoBarDelegateAndroid);
-};
-
-#endif  // CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/installable/pwa_ambient_badge_manager_android.cc b/chrome/browser/installable/pwa_ambient_badge_manager_android.cc
deleted file mode 100644
index f9664b8a..0000000
--- a/chrome/browser/installable/pwa_ambient_badge_manager_android.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/installable/pwa_ambient_badge_manager_android.h"
-
-#include "chrome/browser/android/shortcut_helper.h"
-#include "chrome/browser/android/webapk/chrome_webapk_host.h"
-#include "chrome/browser/installable/installable_manager.h"
-#include "chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h"
-
-namespace {
-
-InstallableParams GetInstallableParams(bool can_install_webapk) {
-  InstallableParams params;
-  params.check_eligibility = true;
-  params.valid_primary_icon = true;
-  params.valid_badge_icon = can_install_webapk;
-  params.valid_manifest = true;
-  params.has_worker = true;
-  params.wait_for_worker = true;
-
-  return params;
-}
-
-}  // anonymous namespace
-
-PwaAmbientBadgeManagerAndroid::PwaAmbientBadgeManagerAndroid(
-    content::WebContents* contents)
-    : content::WebContentsObserver(contents),
-      installable_manager_(InstallableManager::FromWebContents(contents)),
-      can_install_webapk_(ChromeWebApkHost::CanInstallWebApk()),
-      weak_factory_(this) {
-  DCHECK(installable_manager_);
-}
-
-PwaAmbientBadgeManagerAndroid::~PwaAmbientBadgeManagerAndroid() {}
-
-void PwaAmbientBadgeManagerAndroid::MaybeShowBadge() {
-  installable_manager_->GetData(
-      GetInstallableParams(can_install_webapk_),
-      base::Bind(&PwaAmbientBadgeManagerAndroid::OnDidFinishInstallableCheck,
-                 weak_factory_.GetWeakPtr()));
-}
-
-void PwaAmbientBadgeManagerAndroid::OnDidFinishInstallableCheck(
-    const InstallableData& data) {
-  content::WebContents* contents = web_contents();
-  if (data.error_code != NO_ERROR_DETECTED || !contents)
-    return;
-
-  GURL badge_icon_url;
-  SkBitmap badge_icon;
-
-  if (data.badge_icon && !data.badge_icon->drawsNothing()) {
-    badge_icon_url = data.badge_icon_url;
-    badge_icon = *data.badge_icon;
-  }
-
-  PwaAmbientBadgeInfoBarDelegateAndroid::Create(
-      contents,
-      ShortcutHelper::CreateShortcutInfo(data.manifest_url, *data.manifest,
-                                         data.primary_icon_url, badge_icon_url),
-      *data.primary_icon, badge_icon, can_install_webapk_);
-}
diff --git a/chrome/browser/installable/pwa_ambient_badge_manager_android.h b/chrome/browser/installable/pwa_ambient_badge_manager_android.h
deleted file mode 100644
index 568df25..0000000
--- a/chrome/browser/installable/pwa_ambient_badge_manager_android.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_MANAGER_ANDROID_H_
-#define CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_MANAGER_ANDROID_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "url/gurl.h"
-
-struct InstallableData;
-class InstallableManager;
-
-// Manages an infobar shown to users when they visit a progressive web app.
-// Tapping the infobar triggers the add to home screen flow.
-class PwaAmbientBadgeManagerAndroid : public content::WebContentsObserver {
- public:
-  explicit PwaAmbientBadgeManagerAndroid(content::WebContents* contents);
-  ~PwaAmbientBadgeManagerAndroid() override;
-  void MaybeShowBadge();
-
- private:
-  void OnDidFinishInstallableCheck(const InstallableData& data);
-
-  InstallableManager* installable_manager_;
-  bool can_install_webapk_;
-  base::WeakPtrFactory<PwaAmbientBadgeManagerAndroid> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PwaAmbientBadgeManagerAndroid);
-};
-
-#endif  // CHROME_BROWSER_INSTALLABLE_PWA_AMBIENT_BADGE_MANAGER_ANDROID_H_
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index ba077417..fd02fe3 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -51,6 +51,7 @@
 #include "components/data_use_measurement/core/data_use_ascriber.h"
 #include "components/metrics/metrics_service.h"
 #include "components/net_log/chrome_net_log.h"
+#include "components/network_session_configurator/common/network_features.h"
 #include "components/policy/core/common/policy_service.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -86,6 +87,7 @@
 #include "net/net_features.h"
 #include "net/nqe/external_estimate_provider.h"
 #include "net/nqe/network_quality_estimator_params.h"
+//#include "net/proxy/proxy_script_fetcher_impl.h"
 #include "net/proxy_resolution/pac_file_fetcher_impl.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "net/proxy_resolution/proxy_service.h"
@@ -373,6 +375,31 @@
                                       base::Unretained(this)));
   dns_client_enabled_.MoveToThread(io_thread_proxy);
 
+  if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
+    base::Value specs(base::Value::Type::LIST);
+    base::Value methods(base::Value::Type::LIST);
+    base::Value spec(variations::GetVariationParamValueByFeature(
+        features::kDnsOverHttps, "server"));
+    base::Value method(variations::GetVariationParamValueByFeature(
+        features::kDnsOverHttps, "method"));
+    if (spec.GetString().size() > 0) {
+      specs.GetList().push_back(std::move(spec));
+      methods.GetList().push_back(std::move(method));
+      local_state->SetDefaultPrefValue(prefs::kDnsOverHttpsServers,
+                                       std::move(specs));
+      local_state->SetDefaultPrefValue(prefs::kDnsOverHttpsServerMethods,
+                                       std::move(methods));
+    }
+  }
+  dns_over_https_servers_.Init(
+      prefs::kDnsOverHttpsServers, local_state,
+      base::Bind(&IOThread::UpdateDnsClientEnabled, base::Unretained(this)));
+  dns_over_https_server_methods_.Init(
+      prefs::kDnsOverHttpsServerMethods, local_state,
+      base::Bind(&IOThread::UpdateDnsClientEnabled, base::Unretained(this)));
+  dns_over_https_servers_.MoveToThread(io_thread_proxy);
+  dns_over_https_server_methods_.MoveToThread(io_thread_proxy);
+
 #if defined(OS_POSIX)
   local_state->SetDefaultPrefValue(
       prefs::kNtlmV2Enabled,
@@ -626,6 +653,8 @@
   registry->RegisterBooleanPref(prefs::kEnableReferrers, true);
   data_reduction_proxy::RegisterPrefs(registry);
   registry->RegisterBooleanPref(prefs::kBuiltInDnsClientEnabled, true);
+  registry->RegisterListPref(prefs::kDnsOverHttpsServers);
+  registry->RegisterListPref(prefs::kDnsOverHttpsServerMethods);
   registry->RegisterBooleanPref(prefs::kQuickCheckEnabled, true);
   registry->RegisterBooleanPref(prefs::kPacHttpsUrlStrippingEnabled, true);
 #if defined(OS_POSIX)
@@ -724,7 +753,21 @@
 
 void IOThread::UpdateDnsClientEnabled() {
   globals()->system_request_context->host_resolver()->SetDnsClientEnabled(
-      *dns_client_enabled_);
+      *dns_client_enabled_ || (*dns_over_https_servers_).size() > 0);
+
+  net::HostResolver* resolver =
+      globals()->system_request_context->host_resolver();
+  if ((*dns_over_https_servers_).size()) {
+    resolver->SetRequestContext(globals_->system_request_context);
+  }
+  DCHECK((*dns_over_https_servers_).size() ==
+         (*dns_over_https_server_methods_).size());
+  resolver->ClearDnsOverHttpsServers();
+  for (unsigned int i = 0; i < (*dns_over_https_servers_).size(); i++) {
+    resolver->AddDnsOverHttpsServer(
+        (*dns_over_https_servers_)[i],
+        (*dns_over_https_server_methods_)[i].compare("POST") == 0);
+  }
 }
 
 void IOThread::RegisterSTHObserver(net::ct::STHObserver* observer) {
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 21d23c9..2c58c618 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -280,6 +280,10 @@
 
   BooleanPrefMember pac_https_url_stripping_enabled_;
 
+  StringListPrefMember dns_over_https_servers_;
+
+  StringListPrefMember dns_over_https_server_methods_;
+
   // Store HTTP Auth-related policies in this thread.
   // TODO(aberent) Make the list of auth schemes a PrefMember, so that the
   // policy can change after startup (https://crbug/549273).
diff --git a/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc b/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
index 49665dd..fa0e532 100644
--- a/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_webcam_browsertest.cc
@@ -12,6 +12,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "media/base/media_switches.h"
@@ -21,14 +22,17 @@
 static const char kMainWebrtcTestHtmlPage[] =
     "/webrtc/webrtc_jsep01_test.html";
 
-static const char* kTestConfigFlags[] = {
+enum class TargetVideoCaptureImplementation {
+  DEFAULT,
 #if defined(OS_WIN)
-  NULL,
-  // Media Foundation is only available in Windows versions >= 7, below that the
-  // following flag has no effect; the test would run twice using DirectShow.
-  switches::kForceMediaFoundationVideoCapture
-#else
-  NULL
+  WIN_MEDIA_FOUNDATION
+#endif
+};
+
+const TargetVideoCaptureImplementation kTargetVideoCaptureImplementations[] = {
+    TargetVideoCaptureImplementation::DEFAULT,
+#if defined(OS_WIN)
+    TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION
 #endif
 };
 
@@ -37,16 +41,27 @@
 // The webcam on the system must support up to 1080p, or the test will fail.
 // This test is excellent for testing the various capture paths of WebRTC
 // on all desktop platforms.
-class WebRtcWebcamBrowserTest : public WebRtcTestBase,
-    public testing::WithParamInterface<const char*> {
+class WebRtcWebcamBrowserTest
+    : public WebRtcTestBase,
+      public testing::WithParamInterface<TargetVideoCaptureImplementation> {
  public:
+  WebRtcWebcamBrowserTest() {
+#if defined(OS_WIN)
+    if (GetParam() == TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION) {
+      scoped_feature_list_.InitAndEnableFeature(
+          media::kMediaFoundationVideoCapture);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          media::kMediaFoundationVideoCapture);
+    }
+#endif
+  }
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     EXPECT_FALSE(command_line->HasSwitch(
         switches::kUseFakeDeviceForMediaStream));
     EXPECT_FALSE(command_line->HasSwitch(
         switches::kUseFakeUIForMediaStream));
-    if (GetParam())
-      command_line->AppendSwitch(GetParam());
   }
 
  protected:
@@ -66,6 +81,9 @@
     }
     return actual_stream_size;
   }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 // This test is manual because the test results can vary heavily depending on
@@ -97,4 +115,4 @@
 
 INSTANTIATE_TEST_CASE_P(WebRtcWebcamBrowserTests,
                         WebRtcWebcamBrowserTest,
-                        testing::ValuesIn(kTestConfigFlags));
+                        testing::ValuesIn(kTargetVideoCaptureImplementations));
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index dbef99d..5fee4d9 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -259,6 +259,9 @@
   { key::kEnableOnlineRevocationChecks,
     ssl_config::prefs::kCertRevocationCheckingEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kMachineLevelUserCloudPolicyEnrollmentToken,
+    policy_prefs::kMachineLevelUserCloudPolicyEnrollmentToken,
+    base::Value::Type::STRING },
   { key::kRequireOnlineRevocationChecksForLocalAnchors,
     ssl_config::prefs::kCertRevocationCheckingRequiredLocalAnchors,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/profiling_host/BUILD.gn b/chrome/browser/profiling_host/BUILD.gn
index 9d7dbf3..7b90c77 100644
--- a/chrome/browser/profiling_host/BUILD.gn
+++ b/chrome/browser/profiling_host/BUILD.gn
@@ -16,7 +16,7 @@
 
     deps = [
       "//base",
-      "//base/allocator:features",
+      "//base/allocator:buildflags",
       "//chrome/test:test_support_ui",
       "//testing/gmock",
       "//testing/gtest",
diff --git a/chrome/browser/profiling_host/memlog_browsertest.cc b/chrome/browser/profiling_host/memlog_browsertest.cc
index c9a0ba28..390fade 100644
--- a/chrome/browser/profiling_host/memlog_browsertest.cc
+++ b/chrome/browser/profiling_host/memlog_browsertest.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 "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/json/json_reader.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/chrome/browser/profiling_host/profiling_process_host.cc b/chrome/browser/profiling_host/profiling_process_host.cc
index e282f3c..d1a184d 100644
--- a/chrome/browser/profiling_host/profiling_process_host.cc
+++ b/chrome/browser/profiling_host/profiling_process_host.cc
@@ -9,7 +9,7 @@
 #include <utility>
 #include <vector>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/base_switches.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
diff --git a/chrome/browser/profiling_host/profiling_process_host_unittest.cc b/chrome/browser/profiling_host/profiling_process_host_unittest.cc
index a568349..cb35ae3 100644
--- a/chrome/browser/profiling_host/profiling_process_host_unittest.cc
+++ b/chrome/browser/profiling_host/profiling_process_host_unittest.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/profiling_host/profiling_process_host.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/command_line.h"
 #include "base/test/scoped_command_line.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/chrome/browser/resource_coordinator/tab_activity_watcher.cc b/chrome/browser/resource_coordinator/tab_activity_watcher.cc
index eea19ee..3a34605 100644
--- a/chrome/browser/resource_coordinator/tab_activity_watcher.cc
+++ b/chrome/browser/resource_coordinator/tab_activity_watcher.cc
@@ -5,12 +5,13 @@
 #include "chrome/browser/resource_coordinator/tab_activity_watcher.h"
 
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/resource_coordinator/tab_metrics_logger_impl.h"
+#include "chrome/browser/resource_coordinator/tab_metrics_logger.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/window_activity_watcher.h"
+#include "components/ukm/content/source_url_recorder.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_view_host.h"
@@ -47,8 +48,12 @@
 
   explicit WebContentsData(content::WebContents* web_contents)
       : WebContentsObserver(web_contents) {
+    DCHECK(!web_contents->GetBrowserContext()->IsOffTheRecord());
     tab_metrics_.web_contents = web_contents;
     web_contents->GetRenderViewHost()->GetWidget()->AddInputEventObserver(this);
+
+    // A navigation may already have completed if this is a replacement tab.
+    ukm_source_id_ = ukm::GetSourceIdForWebContentsDocument(web_contents);
   }
 
   // content::WebContentsObserver:
@@ -87,6 +92,10 @@
     TabActivityWatcher::GetInstance()->OnDidStopLoading(web_contents());
   }
   void OnVisibilityChanged(content::Visibility visibility) override {
+    // Ignore visibility changes while the WebContents is being destroyed.
+    if (web_contents()->IsBeingDestroyed())
+      return;
+
     // TODO(michaelpg): Consider tracking occluded tabs, not just background
     // tabs.
     if (visibility == content::Visibility::HIDDEN)
@@ -113,7 +122,7 @@
 };
 
 TabActivityWatcher::TabActivityWatcher()
-    : tab_metrics_logger_(std::make_unique<TabMetricsLoggerImpl>()),
+    : tab_metrics_logger_(std::make_unique<TabMetricsLogger>()),
       browser_tab_strip_tracker_(this, this, nullptr) {
   browser_tab_strip_tracker_.Init();
 
@@ -124,6 +133,24 @@
 
 TabActivityWatcher::~TabActivityWatcher() = default;
 
+void TabActivityWatcher::TabInsertedAt(TabStripModel* tab_strip_model,
+                                       content::WebContents* contents,
+                                       int index,
+                                       bool foreground) {
+  // Ensure the WebContentsData is created to observe this WebContents since it
+  // may represent a newly created tab.
+  WebContentsData::CreateForWebContents(contents);
+}
+
+void TabActivityWatcher::TabReplacedAt(TabStripModel* tab_strip_model,
+                                       content::WebContents* old_contents,
+                                       content::WebContents* new_contents,
+                                       int index) {
+  // Ensure the WebContentsData is created to observe this WebContents since it
+  // likely hasn't been inserted into a tabstrip before.
+  WebContentsData::CreateForWebContents(new_contents);
+}
+
 void TabActivityWatcher::TabPinnedStateChanged(TabStripModel* tab_strip_model,
                                                content::WebContents* contents,
                                                int index) {
@@ -142,6 +169,7 @@
 void TabActivityWatcher::OnWasHidden(content::WebContents* web_contents) {
   DCHECK(web_contents);
 
+  // The tab may not be in the tabstrip if it's being moved.
   Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
   if (!browser)
     return;
@@ -175,8 +203,8 @@
 
   DCHECK(!web_contents->GetBrowserContext()->IsOffTheRecord());
 
-  TabActivityWatcher::WebContentsData* web_contents_data =
-      TabActivityWatcher::WebContentsData::FromWebContents(web_contents);
+  WebContentsData* web_contents_data =
+      WebContentsData::FromWebContents(web_contents);
   DCHECK(web_contents_data);
 
   ukm::SourceId ukm_source_id = web_contents_data->ukm_source_id();
@@ -185,7 +213,7 @@
 }
 
 void TabActivityWatcher::ResetForTesting() {
-  tab_metrics_logger_ = std::make_unique<TabMetricsLoggerImpl>();
+  tab_metrics_logger_ = std::make_unique<TabMetricsLogger>();
 }
 
 // static
@@ -194,11 +222,4 @@
   return &instance;
 }
 
-// static
-void TabActivityWatcher::WatchWebContents(content::WebContents* web_contents) {
-  // In incognito, the UKM service won't log anything.
-  if (!web_contents->GetBrowserContext()->IsOffTheRecord())
-    TabActivityWatcher::WebContentsData::CreateForWebContents(web_contents);
-}
-
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_activity_watcher.h b/chrome/browser/resource_coordinator/tab_activity_watcher.h
index 16118eae..83dc42d9 100644
--- a/chrome/browser/resource_coordinator/tab_activity_watcher.h
+++ b/chrome/browser/resource_coordinator/tab_activity_watcher.h
@@ -29,19 +29,21 @@
   TabActivityWatcher();
   ~TabActivityWatcher() override;
 
-  // TODO(michaelpg): Track more events.
-
   // Returns the single instance, creating it if necessary.
   static TabActivityWatcher* GetInstance();
 
-  // Begins watching the |web_contents|. The watching will stop automatically
-  // when the WebContents is destroyed.
-  static void WatchWebContents(content::WebContents* web_contents);
-
  private:
   friend class TabActivityWatcherTest;
 
   // TabStripModelObserver:
+  void TabInsertedAt(TabStripModel* tab_strip_model,
+                     content::WebContents* contents,
+                     int index,
+                     bool foreground) override;
+  void TabReplacedAt(TabStripModel* tab_strip_model,
+                     content::WebContents* old_contents,
+                     content::WebContents* new_contents,
+                     int index) override;
   void TabPinnedStateChanged(TabStripModel* tab_strip_model,
                              content::WebContents* contents,
                              int index) override;
diff --git a/chrome/browser/resource_coordinator/tab_activity_watcher_unittest.cc b/chrome/browser/resource_coordinator/tab_activity_watcher_unittest.cc
index 3500fc0..c966f93 100644
--- a/chrome/browser/resource_coordinator/tab_activity_watcher_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_activity_watcher_unittest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/resource_coordinator/tab_activity_watcher.h"
 #include "chrome/browser/resource_coordinator/tab_manager.h"
 #include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
-#include "chrome/browser/resource_coordinator/tab_metrics_logger_impl.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_activity_simulator.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -20,6 +19,7 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/test_browser_window.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/ukm/content/source_url_recorder.h"
 #include "components/ukm/ukm_source.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host.h"
@@ -97,7 +97,6 @@
   TabActivitySimulator tab_activity_simulator_;
 
  private:
-  TabMetricsLoggerImpl tab_metrics_logger_;
   DISALLOW_COPY_AND_ASSIGN(TabActivityWatcherTest);
 };
 
@@ -500,4 +499,50 @@
   tab_strip_model->CloseAllTabs();
 }
 
+// Tests that replacing a foreground tab doesn't log new tab metrics until the
+// new tab is backgrounded.
+TEST_F(TabActivityWatcherTest, ReplaceForegroundTab) {
+  Browser::CreateParams params(profile(), true);
+  std::unique_ptr<Browser> browser =
+      CreateBrowserWithTestWindowForParams(&params);
+
+  TabStripModel* tab_strip_model = browser->tab_strip_model();
+  content::WebContents* orig_contents =
+      tab_activity_simulator_.AddWebContentsAndNavigate(tab_strip_model,
+                                                        GURL(kTestUrls[0]));
+  tab_strip_model->ActivateTabAt(0, false);
+  WebContentsTester::For(orig_contents)->TestSetIsLoading(false);
+
+  // Build the replacement contents.
+  std::unique_ptr<content::WebContents> new_contents =
+      tab_activity_simulator_.CreateWebContents(profile());
+
+  // Ensure the test URL gets a UKM source ID upon navigating.
+  // Normally this happens when the browser or prerenderer attaches tab helpers.
+  ukm::InitializeSourceUrlRecorderForWebContents(new_contents.get());
+
+  tab_activity_simulator_.Navigate(new_contents.get(), GURL(kTestUrls[1]));
+  WebContentsTester::For(new_contents.get())->TestSetIsLoading(false);
+
+  // Replace and delete the old contents.
+  std::unique_ptr<content::WebContents> old_contents(
+      tab_strip_model->ReplaceWebContentsAt(0, new_contents.release()));
+  ASSERT_EQ(old_contents.get(), orig_contents);
+  old_contents.reset();
+  tab_strip_model->GetWebContentsAt(0)->WasShown();
+
+  EXPECT_EQ(0, ukm_entry_checker_.NumNewEntriesRecorded(kEntryName));
+
+  // Add a new tab so the first tab is backgrounded.
+  tab_activity_simulator_.AddWebContentsAndNavigate(tab_strip_model,
+                                                    GURL(kTestUrls[2]));
+  tab_activity_simulator_.SwitchToTabAt(tab_strip_model, 1);
+  {
+    SCOPED_TRACE("");
+    ExpectNewEntry(kTestUrls[1], kBasicMetricValues);
+  }
+
+  tab_strip_model->CloseAllTabs();
+}
+
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger_impl.cc b/chrome/browser/resource_coordinator/tab_metrics_logger.cc
similarity index 87%
rename from chrome/browser/resource_coordinator/tab_metrics_logger_impl.cc
rename to chrome/browser/resource_coordinator/tab_metrics_logger.cc
index 86128a9e..85734fe5 100644
--- a/chrome/browser/resource_coordinator/tab_metrics_logger_impl.cc
+++ b/chrome/browser/resource_coordinator/tab_metrics_logger.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/resource_coordinator/tab_metrics_logger_impl.h"
+#include "chrome/browser/resource_coordinator/tab_metrics_logger.h"
 
 #include <algorithm>
 #include <string>
@@ -26,7 +26,6 @@
 #include "content/public/common/page_importance_signals.h"
 #include "net/base/mime_util.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
-#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "third_party/WebKit/public/platform/WebSuddenTerminationDisablerType.h"
 #include "url/gurl.h"
 
@@ -42,59 +41,8 @@
     "ssh",     "tel",  "urn",  "webcal",      "wtai", "xmpp",
 };
 
-// Returns the ContentType that matches |mime_type|.
-TabMetricsEvent::ContentType GetContentTypeFromMimeType(
-    const std::string& mime_type) {
-  // Test for special cases before testing wildcard types.
-  if (mime_type.empty())
-    return TabMetricsEvent::CONTENT_TYPE_UNKNOWN;
-  if (net::MatchesMimeType("text/html", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_TEXT_HTML;
-  if (net::MatchesMimeType("application/*", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_APPLICATION;
-  if (net::MatchesMimeType("audio/*", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_AUDIO;
-  if (net::MatchesMimeType("image/*", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_IMAGE;
-  if (net::MatchesMimeType("text/*", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_TEXT;
-  if (net::MatchesMimeType("video/*", mime_type))
-    return TabMetricsEvent::CONTENT_TYPE_VIDEO;
-  return TabMetricsEvent::CONTENT_TYPE_OTHER;
-}
-
-// Returns the ProtocolHandlerScheme enumerator matching the string.
-// The enumerator value is used in the UKM entry, since UKM entries can't
-// store strings.
-TabMetricsEvent::ProtocolHandlerScheme GetSchemeValueFromString(
-    const std::string& scheme) {
-  const char* const* const scheme_ptr = std::find(
-      std::begin(kWhitelistedSchemes), std::end(kWhitelistedSchemes), scheme);
-  if (scheme_ptr == std::end(kWhitelistedSchemes))
-    return TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER;
-
-  size_t index = scheme_ptr - std::begin(kWhitelistedSchemes);
-  return static_cast<TabMetricsEvent::ProtocolHandlerScheme>(index);
-}
-
-// Returns the site engagement score for the WebContents, rounded down to 10s
-// to limit granularity.
-int GetSiteEngagementScore(const content::WebContents* web_contents) {
-  SiteEngagementService* service = SiteEngagementService::Get(
-      Profile::FromBrowserContext(web_contents->GetBrowserContext()));
-  DCHECK(service);
-
-  // Scores range from 0 to 100. Round down to a multiple of 10 to conform to
-  // privacy guidelines.
-  double raw_score = service->GetScore(web_contents->GetVisibleURL());
-  int rounded_score = static_cast<int>(raw_score / 10) * 10;
-  DCHECK_LE(0, rounded_score);
-  DCHECK_GE(100, rounded_score);
-  return rounded_score;
-}
-
-// Adds a DefaultProtocolHandler metric with the handler's scheme to |entry| if
-// the protocol handler is a default protocol handler.
+// Adds a DefaultProtocolHandler metric with the handler's scheme to |entry|
+// if the protocol handler is a default protocol handler.
 void PopulateSchemeForHandler(ProtocolHandlerRegistry* registry,
                               const ProtocolHandler& handler,
                               ukm::builders::TabManager_TabMetrics* entry) {
@@ -103,7 +51,7 @@
     // Note that multiple DefaultProtocolHandler metrics may be added, one for
     // each scheme the entry's origin handles by default.
     entry->SetDefaultProtocolHandler(
-        GetSchemeValueFromString(handler.protocol()));
+        TabMetricsLogger::GetSchemeValueFromString(handler.protocol()));
   }
 }
 
@@ -164,11 +112,63 @@
 
 }  // namespace
 
-TabMetricsLoggerImpl::TabMetricsLoggerImpl() = default;
-TabMetricsLoggerImpl::~TabMetricsLoggerImpl() = default;
+TabMetricsLogger::TabMetricsLogger() = default;
+TabMetricsLogger::~TabMetricsLogger() = default;
 
-void TabMetricsLoggerImpl::LogBackgroundTab(ukm::SourceId ukm_source_id,
-                                            const TabMetrics& tab_metrics) {
+// static
+TabMetricsEvent::ContentType TabMetricsLogger::GetContentTypeFromMimeType(
+    const std::string& mime_type) {
+  // Test for special cases before testing wildcard types.
+  if (mime_type.empty())
+    return TabMetricsEvent::CONTENT_TYPE_UNKNOWN;
+  if (net::MatchesMimeType("text/html", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_TEXT_HTML;
+  if (net::MatchesMimeType("application/*", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_APPLICATION;
+  if (net::MatchesMimeType("audio/*", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_AUDIO;
+  if (net::MatchesMimeType("image/*", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_IMAGE;
+  if (net::MatchesMimeType("text/*", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_TEXT;
+  if (net::MatchesMimeType("video/*", mime_type))
+    return TabMetricsEvent::CONTENT_TYPE_VIDEO;
+  return TabMetricsEvent::CONTENT_TYPE_OTHER;
+}
+
+// static
+TabMetricsEvent::ProtocolHandlerScheme
+TabMetricsLogger::GetSchemeValueFromString(const std::string& scheme) {
+  const char* const* const scheme_ptr = std::find(
+      std::begin(kWhitelistedSchemes), std::end(kWhitelistedSchemes), scheme);
+  if (scheme_ptr == std::end(kWhitelistedSchemes))
+    return TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER;
+
+  size_t index = scheme_ptr - std::begin(kWhitelistedSchemes);
+  return static_cast<TabMetricsEvent::ProtocolHandlerScheme>(index);
+}
+
+// static
+int TabMetricsLogger::GetSiteEngagementScore(
+    const content::WebContents* web_contents) {
+  if (!SiteEngagementService::IsEnabled())
+    return -1;
+
+  SiteEngagementService* service = SiteEngagementService::Get(
+      Profile::FromBrowserContext(web_contents->GetBrowserContext()));
+  DCHECK(service);
+
+  // Scores range from 0 to 100. Round down to a multiple of 10 to conform to
+  // privacy guidelines.
+  double raw_score = service->GetScore(web_contents->GetVisibleURL());
+  int rounded_score = static_cast<int>(raw_score / 10) * 10;
+  DCHECK_LE(0, rounded_score);
+  DCHECK_GE(100, rounded_score);
+  return rounded_score;
+}
+
+void TabMetricsLogger::LogBackgroundTab(ukm::SourceId ukm_source_id,
+                                        const TabMetrics& tab_metrics) {
   if (!ukm_source_id)
     return;
 
@@ -208,8 +208,10 @@
 
   PopulateProtocolHandlers(web_contents, &entry);
 
-  if (SiteEngagementService::IsEnabled())
-    entry.SetSiteEngagementScore(GetSiteEngagementScore(web_contents));
+  const int engagement_score = GetSiteEngagementScore(web_contents);
+  if (engagement_score >= 0) {
+    entry.SetSiteEngagementScore(engagement_score);
+  }
 
   TabMetricsEvent::ContentType content_type =
       GetContentTypeFromMimeType(web_contents->GetContentsMimeType());
@@ -240,10 +242,3 @@
       .SetSequenceId(++sequence_id_)
       .Record(ukm_recorder);
 }
-
-// static
-TabMetricsEvent::ProtocolHandlerScheme
-TabMetricsLoggerImpl::GetSchemeValueFromString(const std::string& scheme) {
-  // Exposes GetSchemeValueFromString for testing.
-  return ::GetSchemeValueFromString(scheme);
-}
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger.h b/chrome/browser/resource_coordinator/tab_metrics_logger.h
index 5d72ec9..11d5715 100644
--- a/chrome/browser/resource_coordinator/tab_metrics_logger.h
+++ b/chrome/browser/resource_coordinator/tab_metrics_logger.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_METRICS_LOGGER_H_
 
 #include "base/macros.h"
+#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/base/page_transition_types.h"
 
@@ -40,12 +41,34 @@
     PageMetrics page_metrics = {};
   };
 
-  virtual ~TabMetricsLogger() = default;
+  TabMetricsLogger();
+  ~TabMetricsLogger();
 
   // Logs metrics for the tab with the given main frame WebContents. Does
   // nothing if |ukm_source_id| is zero.
-  virtual void LogBackgroundTab(ukm::SourceId ukm_source_id,
-                                const TabMetrics& tab_metrics) = 0;
+  void LogBackgroundTab(ukm::SourceId ukm_source_id,
+                        const TabMetrics& tab_metrics);
+
+  // Returns the ContentType that matches |mime_type|.
+  static metrics::TabMetricsEvent::ContentType GetContentTypeFromMimeType(
+      const std::string& mime_type);
+
+  // Returns the ProtocolHandlerScheme enumerator matching the string.
+  // The enumerator value is used in the UKM entry, since UKM entries can't
+  // store strings.
+  static metrics::TabMetricsEvent::ProtocolHandlerScheme
+  GetSchemeValueFromString(const std::string& scheme);
+
+  // Returns the site engagement score for the WebContents, rounded down to 10s
+  // to limit granularity. Returns -1 if site engagement service is disabled.
+  static int GetSiteEngagementScore(const content::WebContents* web_contents);
+
+ private:
+  // A counter to be incremented and logged with each UKM entry, used to
+  // indicate the order that events within the same report were logged.
+  int sequence_id_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(TabMetricsLogger);
 };
 
 #endif  // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_METRICS_LOGGER_H_
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger_impl.h b/chrome/browser/resource_coordinator/tab_metrics_logger_impl.h
deleted file mode 100644
index f3c8b050..0000000
--- a/chrome/browser/resource_coordinator/tab_metrics_logger_impl.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_METRICS_LOGGER_IMPL_H_
-#define CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_METRICS_LOGGER_IMPL_H_
-
-#include <string>
-
-#include "base/gtest_prod_util.h"
-#include "base/macros.h"
-#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
-#include "chrome/browser/resource_coordinator/tab_metrics_logger.h"
-
-// Logs a TabManager.TabMetrics UKM for a tab when requested. Includes
-// information relevant to the tab and its WebContents.
-// Must be used on the UI thread.
-class TabMetricsLoggerImpl : public TabMetricsLogger {
- public:
-  TabMetricsLoggerImpl();
-  ~TabMetricsLoggerImpl() override;
-
-  // TabMetricsLogger:
-  void LogBackgroundTab(ukm::SourceId ukm_source_id,
-                        const TabMetrics& tab_metrics) override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(TabMetricsLoggerImplTest, Schemes);
-  FRIEND_TEST_ALL_PREFIXES(TabMetricsLoggerImplTest, NonWhitelistedSchemes);
-
-  // Returns the ProtocolHandlerScheme enumerator matching the string.
-  static metrics::TabMetricsEvent::ProtocolHandlerScheme
-  GetSchemeValueFromString(const std::string& scheme);
-
-  // A counter to be incremented and logged with each UKM entry, used to
-  // indicate the order that events within the same report were logged.
-  int sequence_id_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(TabMetricsLoggerImpl);
-};
-
-#endif  // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_METRICS_LOGGER_IMPL_H_
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger_impl_unittest.cc b/chrome/browser/resource_coordinator/tab_metrics_logger_impl_unittest.cc
deleted file mode 100644
index df0a457..0000000
--- a/chrome/browser/resource_coordinator/tab_metrics_logger_impl_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/resource_coordinator/tab_metrics_logger_impl.h"
-
-#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using metrics::TabMetricsEvent;
-
-// Sanity checks for TabMetricsLoggerImpl.
-// See TabActivityWatcherTest for more thorough tab usage UKM tests.
-
-// Tests that protocol schemes are mapped to the correct enumerators.
-TEST(TabMetricsLoggerImplTest, Schemes) {
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_BITCOIN,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("bitcoin"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_GEO,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("geo"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IM,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("im"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRC,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("irc"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRCS,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("ircs"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAGNET,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("magnet"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAILTO,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("mailto"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MMS,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("mms"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NEWS,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("news"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NNTP,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("nntp"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OPENPGP4FPR,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("openpgp4fpr"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SIP,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("sip"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMS,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("sms"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMSTO,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("smsto"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SSH,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("ssh"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_TEL,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("tel"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_URN,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("urn"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WEBCAL,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("webcal"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WTAI,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("wtai"));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("xmpp"));
-
-  static_assert(
-      TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST ==
-              TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP &&
-          TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST == 20,
-      "This test and the scheme list in TabMetricsLoggerImpl must be updated "
-      "when new protocol handlers are added.");
-}
-
-// Tests non-whitelisted protocol schemes.
-TEST(TabMetricsLoggerImplTest, NonWhitelistedSchemes) {
-  // Native (non-web-based) handler.
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("foo"));
-
-  // Custom ("web+") protocol handlers.
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("web+foo"));
-  // "mailto" after the web+ prefix doesn't trigger any special handling.
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("web+mailto"));
-
-  // Nonsense protocol handlers.
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
-            TabMetricsLoggerImpl::GetSchemeValueFromString(""));
-  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
-            TabMetricsLoggerImpl::GetSchemeValueFromString("mailto-xyz"));
-}
diff --git a/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc b/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc
new file mode 100644
index 0000000..8485f64
--- /dev/null
+++ b/chrome/browser/resource_coordinator/tab_metrics_logger_unittest.cc
@@ -0,0 +1,84 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/resource_coordinator/tab_metrics_logger.h"
+
+#include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using metrics::TabMetricsEvent;
+
+// Sanity checks for functions in TabMetricsLogger.
+// See TabActivityWatcherTest for more thorough tab usage UKM tests.
+
+// Tests that protocol schemes are mapped to the correct enumerators.
+TEST(TabMetricsLoggerTest, Schemes) {
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_BITCOIN,
+            TabMetricsLogger::GetSchemeValueFromString("bitcoin"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_GEO,
+            TabMetricsLogger::GetSchemeValueFromString("geo"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IM,
+            TabMetricsLogger::GetSchemeValueFromString("im"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRC,
+            TabMetricsLogger::GetSchemeValueFromString("irc"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_IRCS,
+            TabMetricsLogger::GetSchemeValueFromString("ircs"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAGNET,
+            TabMetricsLogger::GetSchemeValueFromString("magnet"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MAILTO,
+            TabMetricsLogger::GetSchemeValueFromString("mailto"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_MMS,
+            TabMetricsLogger::GetSchemeValueFromString("mms"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NEWS,
+            TabMetricsLogger::GetSchemeValueFromString("news"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_NNTP,
+            TabMetricsLogger::GetSchemeValueFromString("nntp"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OPENPGP4FPR,
+            TabMetricsLogger::GetSchemeValueFromString("openpgp4fpr"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SIP,
+            TabMetricsLogger::GetSchemeValueFromString("sip"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMS,
+            TabMetricsLogger::GetSchemeValueFromString("sms"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SMSTO,
+            TabMetricsLogger::GetSchemeValueFromString("smsto"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_SSH,
+            TabMetricsLogger::GetSchemeValueFromString("ssh"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_TEL,
+            TabMetricsLogger::GetSchemeValueFromString("tel"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_URN,
+            TabMetricsLogger::GetSchemeValueFromString("urn"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WEBCAL,
+            TabMetricsLogger::GetSchemeValueFromString("webcal"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_WTAI,
+            TabMetricsLogger::GetSchemeValueFromString("wtai"));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP,
+            TabMetricsLogger::GetSchemeValueFromString("xmpp"));
+
+  static_assert(
+      TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST ==
+              TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_XMPP &&
+          TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_LAST == 20,
+      "This test and the scheme list in TabMetricsLoggerImpl must be updated "
+      "when new protocol handlers are added.");
+}
+
+// Tests non-whitelisted protocol schemes.
+TEST(TabMetricsLoggerTest, NonWhitelistedSchemes) {
+  // Native (non-web-based) handler.
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
+            TabMetricsLogger::GetSchemeValueFromString("foo"));
+
+  // Custom ("web+") protocol handlers.
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
+            TabMetricsLogger::GetSchemeValueFromString("web+foo"));
+  // "mailto" after the web+ prefix doesn't trigger any special handling.
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
+            TabMetricsLogger::GetSchemeValueFromString("web+mailto"));
+
+  // Nonsense protocol handlers.
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
+            TabMetricsLogger::GetSchemeValueFromString(""));
+  EXPECT_EQ(TabMetricsEvent::PROTOCOL_HANDLER_SCHEME_OTHER,
+            TabMetricsLogger::GetSchemeValueFromString("mailto-xyz"));
+}
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
index 1ce088d..01f9794 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
@@ -525,6 +525,7 @@
       var startNode = ChromeVoxState.instance.currentRange.start.node;
       var collapsedRange = cursors.Range.fromNode(startNode);
       new Output()
+          .withoutHints()
           .withRichSpeechAndBraille(
               collapsedRange, collapsedRange, Output.EventType.NAVIGATE)
           .onSpeechEnd(continueReading)
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index c7d7f28..eefb211 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -1732,7 +1732,12 @@
       return;
     }
 
-    // Prioritized hints.
+    // Add hints by priority.
+    if (node.restriction == chrome.automation.Restriction.DISABLED) {
+      // No hints here without further context such as form validation.
+      return;
+    }
+
     if (node.state[StateType.EDITABLE] && cvox.ChromeVox.isStickyPrefOn)
       this.format_(node, '@sticky_mode_enabled', buff);
 
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
index a40f1f1b..c2b2ba4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rdgrp</translation>
 <translation id="1251750620252348585">পরবর্তী স্তর ৬ শিরোনাম</translation>
 <translation id="1275718070701477396">নির্বাচিত</translation>
-<translation id="1286609444451033486">টগল করতে সার্চ+স্পেস বোতাম টিপুন।</translation>
+<translation id="1286609444451033486">টগল করতে Search+Space বোতাম টিপুন।</translation>
 <translation id="1319608975892113573">কোনো পূর্ববর্তী অবরুদ্ধ উর্দ্ধৃতি নেই৷</translation>
 <translation id="1321576897702511272">ChromeVox সহায়তা লুকান</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" />-এর <ph name="INDEX" /></translation>
@@ -589,7 +589,7 @@
 <translation id="6006050241733874051">রূপ</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ব্যাকস্ল্যাশ}one{#টি ব্যাকস্ল্যাশ}other{#টি ব্যাকস্ল্যাশ}}</translation>
 <translation id="6037602951055904232">প্যান ফরোয়ার্ড</translation>
-<translation id="6042826534790431634">চালু করতে সার্চ+স্পেস টিপুন।</translation>
+<translation id="6042826534790431634">চালু করতে Search+Space টিপুন।</translation>
 <translation id="6044160928851315051">স্ক্রীনে আলো কমান</translation>
 <translation id="605761629541007221">গাঢ় অক্ষর শেষ</translation>
 <translation id="6065293622157674001">ব্যাকরণের ত্রুটি শুরু</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
index 58a545ad..88af20d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -371,7 +371,7 @@
 <translation id="4191918948604314587">Un botó</translation>
 <translation id="4202186506458631436">Desplaça a la dreta.</translation>
 <translation id="4206289001967551965">Dins la taula</translation>
-<translation id="4209770650650780359">Prem les fletxes amunt i avall per navegar per a les opcions d'emplenament automàtic.</translation>
+<translation id="4209770650650780359">Prem les fletxes amunt i avall per navegar per les opcions d'emplenament automàtic.</translation>
 <translation id="4215733775853809057">Control lliscant següent</translation>
 <translation id="4218529045364428769">{COUNT,plural, =1{guió}other{# guions}}</translation>
 <translation id="421884353938374759">selector de color</translation>
@@ -499,7 +499,7 @@
 <translation id="536031132345979795">Retrocedeix durant la lectura contínua</translation>
 <translation id="5368000168321181111">Earcons desactivats</translation>
 <translation id="5374320867641260420">No hi ha cap botó més.</translation>
-<translation id="5376407118396657359">Prem Cerca+Ctrl+Alt junt amb les fletxes per navegar de cel·la en cel·la.</translation>
+<translation id="5376407118396657359">Prem Cerca+Ctrl+Alt i les fletxes per navegar de cel·la en cel·la.</translation>
 <translation id="5382299583965267720">No hi ha cap capçalera més del nivell 1.</translation>
 <translation id="5402367795255837559">Braille</translation>
 <translation id="5402791055281059602">Una alerta modal</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 f218dfc0..1b86e39 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">skup přep</translation>
 <translation id="1251750620252348585">Další nadpis 6. úrovně</translation>
 <translation id="1275718070701477396">Vybráno</translation>
-<translation id="1286609444451033486">Lze přepnout stisknutím tlačítka vyhledávání a mezerníku.</translation>
+<translation id="1286609444451033486">Lze přepnout stisknutím kláves Hledat + mezerník.</translation>
 <translation id="1319608975892113573">Žádná předchozí bloková citace.</translation>
 <translation id="1321576897702511272">Skrýt nápovědu programu ChromeVox</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> z <ph name="TOTAL" /></translation>
@@ -371,7 +371,7 @@
 <translation id="4191918948604314587">Tlačítko</translation>
 <translation id="4202186506458631436">Posunout doprava</translation>
 <translation id="4206289001967551965">V tabulce</translation>
-<translation id="4209770650650780359">Automatické dokončování lze zapnout stisknutím šipky nahoru nebo dolů.</translation>
+<translation id="4209770650650780359">Stisknutím šipky nahoru nebo dolů lze vybrat návrhy automatického dokončení.</translation>
 <translation id="4215733775853809057">Další posuvník</translation>
 <translation id="4218529045364428769">{COUNT,plural, =1{spojovník}few{# spojovníky}many{# dashes}other{# spojovníků}}</translation>
 <translation id="421884353938374759">výběr barev</translation>
@@ -499,7 +499,7 @@
 <translation id="536031132345979795">Přejít zpět při nepřetržitém čtení</translation>
 <translation id="5368000168321181111">Zvukové signály vypnuty</translation>
 <translation id="5374320867641260420">Žádné další tlačítko.</translation>
-<translation id="5376407118396657359">Tabulku můžete procházet po buňkách stisknutím tlačítka vyhledávání + Ctrl + Alt + šipky.</translation>
+<translation id="5376407118396657359">Tabulku můžete procházet po buňkách stisknutím kláves Hledat + Ctrl + Alt a šipek.</translation>
 <translation id="5382299583965267720">Žádný další nadpis 1. úrovně.</translation>
 <translation id="5402367795255837559">Braillovo písmo</translation>
 <translation id="5402791055281059602">Modální upozornění</translation>
@@ -588,7 +588,7 @@
 <translation id="6006050241733874051">Formulář</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{zpětné lomítko}few{# zpětná lomítka}many{# backslashes}other{# zpětných lomítek}}</translation>
 <translation id="6037602951055904232">Posunout dopředu</translation>
-<translation id="6042826534790431634">Lze aktivovat stisknutím tlačítka vyhledávání a mezerníku.</translation>
+<translation id="6042826534790431634">Lze aktivovat stisknutím kláves Hledat + mezerník.</translation>
 <translation id="6044160928851315051">Ztmavit obrazovku</translation>
 <translation id="605761629541007221">Konec tučného písma</translation>
 <translation id="6065293622157674001">Začátek gramatické chyby</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
index f8c30d52..9eb4d47 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rdgrp</translation>
 <translation id="1251750620252348585">Nächste Überschrift der Ebene 6</translation>
 <translation id="1275718070701477396">Ausgewählt</translation>
-<translation id="1286609444451033486">Zum Wechseln Suchtaste + Leertaste drücken.</translation>
+<translation id="1286609444451033486">Zum Wechseln Suchtaste + Leertaste drücken.</translation>
 <translation id="1319608975892113573">Kein vorheriges blockquote-Element</translation>
 <translation id="1321576897702511272">ChromeVox-Hilfe ausblenden</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> von <ph name="TOTAL" /></translation>
@@ -499,7 +499,7 @@
 <translation id="536031132345979795">Im kontinuierlichen Lesemodus rückwärts springen</translation>
 <translation id="5368000168321181111">Earcons sind deaktiviert.</translation>
 <translation id="5374320867641260420">Keine nächste Schaltfläche</translation>
-<translation id="5376407118396657359">Um zwischen Zellen hin- und herzuspringen, die Suchtaste + Strg + Alt und die Pfeiltaste drücken.</translation>
+<translation id="5376407118396657359">Um zwischen Zellen hin- und herzuspringen, die Suchtaste + Strg + Alt und die Pfeiltaste drücken.</translation>
 <translation id="5382299583965267720">Keine nächste Überschrift der Ebene 1</translation>
 <translation id="5402367795255837559">Braille</translation>
 <translation id="5402791055281059602">Eine modale Benachrichtigung</translation>
@@ -588,7 +588,7 @@
 <translation id="6006050241733874051">Formular</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{umgekehrter Schrägstrich}other{# umgekehrte Schrägstriche}}</translation>
 <translation id="6037602951055904232">Nach vorn verschieben</translation>
-<translation id="6042826534790431634">Zum Öffnen Suchtaste + Leertaste drücken.</translation>
+<translation id="6042826534790431634">Zum Aktivieren Suchtaste + Leertaste drücken.</translation>
 <translation id="6044160928851315051">Bildschirm abdunkeln</translation>
 <translation id="605761629541007221">Ende fetter Text</translation>
 <translation id="6065293622157674001">Anfang Grammatikfehler</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 0c3826a..4ea7988a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -500,7 +500,7 @@
 <translation id="536031132345979795">Siirry taaksepäin jatkuvan lukemisen aikana</translation>
 <translation id="5368000168321181111">Earcon-äänimerkit pois käytöstä</translation>
 <translation id="5374320867641260420">Ei seuraavia painikkeita.</translation>
-<translation id="5376407118396657359">Siirry solusta toiseen painamalla haku+Ctrl+Alt nuolinäppäimillä.</translation>
+<translation id="5376407118396657359">Siirry solusta toiseen painamalla haku+Ctrl+Alt ja nuolinäppäin.</translation>
 <translation id="5382299583965267720">Ei seuraavia tason 1 otsikoita.</translation>
 <translation id="5402367795255837559">Pistekirjoitus</translation>
 <translation id="5402791055281059602">Modaalinen ilmoitus</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 8f9ede11..27201b6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -866,7 +866,7 @@
 <translation id="9065283790526219006">+pop-up</translation>
 <translation id="9077213568694924680">supprimé de la sélection</translation>
 <translation id="9082874451376019682">Aucun curseur précédent</translation>
-<translation id="9087707351856729768">Saisissez du texte pour activer la saisie automatique.</translation>
+<translation id="9087707351856729768">Saisissez du texte pour activer la saisie semi-automatique.</translation>
 <translation id="9089864840575085222">Écho de la saisie par cycle</translation>
 <translation id="9105227991373418255">couper $1.</translation>
 <translation id="9107530006868467849">Aucun widget de contenu multimédia précédent</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
index b131e7e..dd7a46a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -372,7 +372,7 @@
 <translation id="4191918948604314587">બટન</translation>
 <translation id="4202186506458631436">જમણી બાજુએ ખસેડો</translation>
 <translation id="4206289001967551965">કોષ્ટકની અંદર</translation>
-<translation id="4209770650650780359">આપમેળે પૂર્ણતા માટે ઉપર અથવા નીચેના તીરની કી દબાવો.</translation>
+<translation id="4209770650650780359">આપમેળે પૂર્ણતા માટે ઉપર અથવા નીચેની ઍરો કી દબાવો.</translation>
 <translation id="4215733775853809057">આગલું સ્લાઇડર</translation>
 <translation id="4218529045364428769">{COUNT,plural, =1{ડેશ}one{# ડેશ}other{# ડેશ}}</translation>
 <translation id="421884353938374759">રંગ ચૂંટનાર</translation>
@@ -406,7 +406,7 @@
 <translation id="4532633738839459153">{COUNT,plural, =1{સ્લેશ}one{# સ્લેશ}other{# સ્લેશ}}</translation>
 <translation id="4547556996012970016">આગલા સ્તર 5 નું મથાળું</translation>
 <translation id="4562381607973973258">હેડર</translation>
-<translation id="4569941707103739422">નૅવિગેટ કરવા માટે ઉપર અથવા નીચેના તીરની કી દબાવો; સક્રિય કરવા માટે Enter કી દબાવો.</translation>
+<translation id="4569941707103739422">નૅવિગેટ કરવા માટે ઉપર અથવા નીચેની ઍરો કી દબાવો; સક્રિય કરવા માટે Enter કી દબાવો.</translation>
 <translation id="4570424871453628777">ખોટી જોડણી સમાપ્ત</translation>
 <translation id="4591507479202817876">, પસંદ કરેલું</translation>
 <translation id="4597532268155981612">ફોર્મ</translation>
@@ -500,7 +500,7 @@
 <translation id="536031132345979795">સતત વાંચન દરમિયાન પાછળ જાઓ</translation>
 <translation id="5368000168321181111">ઇઅરકોન્સ બંધ છે</translation>
 <translation id="5374320867641260420">આગલું બટન નથી.</translation>
-<translation id="5376407118396657359">સેલ વડે નૅવિગેટ કરવા માટે તીર કી સાથે Search+Ctrl+Alt દબાવો.</translation>
+<translation id="5376407118396657359">સેલ વડે નૅવિગેટ કરવા માટે ઍરો કી સાથે Search+Ctrl+Alt દબાવો.</translation>
 <translation id="5382299583965267720">આગલું સ્તર 1 મથાળું નથી.</translation>
 <translation id="5402367795255837559">બ્રેઇલ</translation>
 <translation id="5402791055281059602">મોડલ ચેતવણી</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
index 8514b6a..ebb2c33 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rádiógombcsoport</translation>
 <translation id="1251750620252348585">Következő 6. szintű fejléc</translation>
 <translation id="1275718070701477396">Kijelölt</translation>
-<translation id="1286609444451033486">Nyomja le a Keresés+szóköz billentyűparancsot.</translation>
+<translation id="1286609444451033486">A váltáshoz nyomja le a Keresés+szóköz billentyűparancsot.</translation>
 <translation id="1319608975892113573">Nincs előző bekezdésszintű idézet.</translation>
 <translation id="1321576897702511272">ChromeVox súgójának elrejtése</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></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 5109201..355bef10 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rdgrp</translation>
 <translation id="1251750620252348585">다음 수준 6 제목</translation>
 <translation id="1275718070701477396">선택됨</translation>
-<translation id="1286609444451033486">전환하려면 Search+Space를 누르세요.</translation>
+<translation id="1286609444451033486">전환하려면 Search + Space를 누르세요.</translation>
 <translation id="1319608975892113573">이전 인용구가 없습니다.</translation>
 <translation id="1321576897702511272">ChromeVox 도움말 숨기기</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
@@ -406,7 +406,7 @@
 <translation id="4532633738839459153">{COUNT,plural, =1{슬래시}other{슬래시 #개}}</translation>
 <translation id="4547556996012970016">다음 수준 5 제목</translation>
 <translation id="4562381607973973258">머리글</translation>
-<translation id="4569941707103739422">이동하려면 위쪽 또는 아래쪽 화살표를 누르고 실행하려면 Enter 키를 누르세요.</translation>
+<translation id="4569941707103739422">이동하려면 위쪽 또는 아래쪽 화살표를 누르고, 활성화하려면 Enter를 누르세요.</translation>
 <translation id="4570424871453628777">철자 오류 끝부분</translation>
 <translation id="4591507479202817876">, 선택됨</translation>
 <translation id="4597532268155981612">양식</translation>
@@ -500,7 +500,7 @@
 <translation id="536031132345979795">계속 읽고 있는 중에 뒤로 건너뛰기</translation>
 <translation id="5368000168321181111">이어콘 사용 안함</translation>
 <translation id="5374320867641260420">다음 버튼이 없습니다.</translation>
-<translation id="5376407118396657359">셀별로 이동하려면 Search+Ctrl+Alt 키와 함께 화살표를 누르세요.</translation>
+<translation id="5376407118396657359">셀 단위로 이동하려면 Search + Ctrl + Alt와 함께 화살표를 누르세요.</translation>
 <translation id="5382299583965267720">다음 수준 1 제목이 없습니다.</translation>
 <translation id="5402367795255837559">점자</translation>
 <translation id="5402791055281059602">모달 알림</translation>
@@ -509,7 +509,7 @@
 <translation id="5417034931411865818">라우팅 키 $1 아래에서 항목을 클릭합니다.</translation>
 <translation id="5436105723448703439">{COUNT,plural, =1{작음 부호}other{작음 부호 #개}}</translation>
 <translation id="5444587279251314700">(활성)</translation>
-<translation id="5446809554778706307">포커스가 없습니다. Ctrl+T를 눌러 새 탭을 여세요.</translation>
+<translation id="5446809554778706307">포커스가 없습니다. Ctrl + T를 눌러 새 탭을 여세요.</translation>
 <translation id="5451268436205074266">점 <ph name="DOT" /></translation>
 <translation id="5455441614648621694">상호 보완</translation>
 <translation id="5485036206801896268">이전 그래픽이 없습니다.</translation>
@@ -589,7 +589,7 @@
 <translation id="6006050241733874051">양식</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{역슬래시}other{역슬래시 #개}}</translation>
 <translation id="6037602951055904232">앞으로 이동</translation>
-<translation id="6042826534790431634">활성화하려면 Search+Space를 누르세요.</translation>
+<translation id="6042826534790431634">활성화하려면 Search + Space를 누르세요.</translation>
 <translation id="6044160928851315051">화면을 어둡게 합니다.</translation>
 <translation id="605761629541007221">굵은 글꼴 끝부분</translation>
 <translation id="6065293622157674001">문법 오류 시작 부분</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
index f77ab0b..9a3a279c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rdgrp</translation>
 <translation id="1251750620252348585">അടുത്ത നില 6 ശീർഷകം</translation>
 <translation id="1275718070701477396">തിരഞ്ഞെടുത്തു</translation>
-<translation id="1286609444451033486">മാറ്റാൻ തിരയൽ + സ്‌പെയ്‌സ് അമർത്തുക.</translation>
+<translation id="1286609444451033486">മാറ്റാൻ തിരയൽ+സ്‌പെയ്‌സ് അമർത്തുക.</translation>
 <translation id="1319608975892113573">മുൻ ബ്ലോക്ക്ക്വോട്ട് ഒന്നുമില്ല.</translation>
 <translation id="1321576897702511272">ChromeVox സഹായം മറയ്ക്കുക</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> / <ph name="TOTAL" /></translation>
@@ -499,7 +499,7 @@
 <translation id="536031132345979795">വായന തുടരുന്നതിനിടയിൽ പുറകിലേക്ക് പോകുക</translation>
 <translation id="5368000168321181111">ഇയർകോൺസ് ഓഫാണ്</translation>
 <translation id="5374320867641260420">അടുത്ത ബട്ടൺ ഒന്നുമില്ല.</translation>
-<translation id="5376407118396657359">സെൽ പ്രകാരം നാവിഗേറ്റ് ചെയ്യാൻ തിരയൽ+Ctrl+Alt അമർത്തി അമ്പടയാള കീകൾ ഉപയോഗിക്കുക.</translation>
+<translation id="5376407118396657359">കളം പ്രകാരം നാവിഗേറ്റ് ചെയ്യാൻ തിരയൽ+Ctrl+Alt അമർത്തി അമ്പടയാള കീകൾ ഉപയോഗിക്കുക.</translation>
 <translation id="5382299583965267720">അടുത്ത നില 1 ശീർഷകം ഒന്നുമില്ല.</translation>
 <translation id="5402367795255837559">ബ്രെയ്‌ലി</translation>
 <translation id="5402791055281059602">ഒരു മോഡൽ അലേർട്ട്</translation>
@@ -588,7 +588,7 @@
 <translation id="6006050241733874051">ഫോം</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ബാക്ക്‌സ്ലാഷ്}other{# ബാക്ക്‌സ്ലാഷുകൾ}}</translation>
 <translation id="6037602951055904232">മുന്നിലേക്ക് പാൻ ചെയ്യുക</translation>
-<translation id="6042826534790431634">സജീവമാക്കാൻ തിരയൽ + സ്‌പെയ്‌സ് അമർത്തുക.</translation>
+<translation id="6042826534790431634">സജീവമാക്കാൻ തിരയൽ+സ്‌പെയ്‌സ് അമർത്തുക.</translation>
 <translation id="6044160928851315051">സ്‌ക്രീൻ ഓഫാക്കുക</translation>
 <translation id="605761629541007221">ബോൾഡ് അവസാനിക്കുന്നു</translation>
 <translation id="6065293622157674001">വ്യാകരണ പിശക് തുടങ്ങുന്നു</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
index 3800426..38c7033f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -499,7 +499,7 @@
 <translation id="536031132345979795">Achteruit springen tijdens doorlopend lezen</translation>
 <translation id="5368000168321181111">Earcons uit</translation>
 <translation id="5374320867641260420">Geen volgende knop.</translation>
-<translation id="5376407118396657359">Druk op de zoektoets en op Ctrl+Alt in combinatie met de pijltoetsen om van cel naar cel te navigeren.</translation>
+<translation id="5376407118396657359">Druk op de zoektoets en Ctrl+Alt in combinatie met de pijltoetsen om van cel naar cel te navigeren.</translation>
 <translation id="5382299583965267720">Geen volgende kop voor niveau 1.</translation>
 <translation id="5402367795255837559">Braille</translation>
 <translation id="5402791055281059602">Een melding die in een modaal dialoogvenster wordt weergegeven</translation>
@@ -588,7 +588,7 @@
 <translation id="6006050241733874051">Formulier</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{backslash}other{# backslashes}}</translation>
 <translation id="6037602951055904232">Vooruit schuiven</translation>
-<translation id="6042826534790431634">Druk op de zoektoets in combinatie met de spatiebalk om te activeren.</translation>
+<translation id="6042826534790431634">Druk op de zoektoets en de spatiebalk om te activeren.</translation>
 <translation id="6044160928851315051">Scherm donkerder maken</translation>
 <translation id="605761629541007221">Einde van vetgedrukte tekst</translation>
 <translation id="6065293622157674001">Begin van grammaticafout</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 bf958480..ffc1eade 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">rdgrp</translation>
 <translation id="1251750620252348585">Neste overskrift på nivå 6</translation>
 <translation id="1275718070701477396">Valgt</translation>
-<translation id="1286609444451033486">Trykk på Søk + mellomrom for å slå av eller på.</translation>
+<translation id="1286609444451033486">Trykk på Søk + mellomrom for å slå av/på.</translation>
 <translation id="1319608975892113573">Det finnes ingen tidligere blokksitat-elementer.</translation>
 <translation id="1321576897702511272">Skjul hjelp for ChromeVox</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></translation>
@@ -509,7 +509,7 @@
 <translation id="5417034931411865818">Klikk på elementet under rutertasten $1</translation>
 <translation id="5436105723448703439">{COUNT,plural, =1{mindre enn}other{# mindre enn-tegn}}</translation>
 <translation id="5444587279251314700">(aktiv)</translation>
-<translation id="5446809554778706307">Ikke noe i fokus. Trykk på Ctrl + N for å åpne en ny fane.</translation>
+<translation id="5446809554778706307">Ikke noe i fokus. Trykk på Ctrl + T for å åpne en ny fane.</translation>
 <translation id="5451268436205074266">punkter <ph name="DOT" /></translation>
 <translation id="5455441614648621694">Komplementær</translation>
 <translation id="5485036206801896268">Det finnes ingen tidligere bilder.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
index 3cc449c..ad4b093 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -500,7 +500,7 @@
 <translation id="536031132345979795">Вернуться назад во время непрерывного чтения</translation>
 <translation id="5368000168321181111">Звуковые сигналы отключены.</translation>
 <translation id="5374320867641260420">Следующей кнопки нет.</translation>
-<translation id="5376407118396657359">Для перемещения по ячейкам нажмите Поиск + Ctrl + Alt и нужную стрелку.</translation>
+<translation id="5376407118396657359">Для перемещения к другой ячейке нажмите Поиск + Ctrl + Alt и нужную стрелку.</translation>
 <translation id="5382299583965267720">Следующего заголовка первого уровня нет.</translation>
 <translation id="5402367795255837559">Шрифт Брайля</translation>
 <translation id="5402791055281059602">Модальное оповещение</translation>
@@ -509,7 +509,7 @@
 <translation id="5417034931411865818">Нажать на элемент под ключом маршрутизации $1</translation>
 <translation id="5436105723448703439">{COUNT,plural, =1{знак "меньше"}one{# знак "меньше"}few{# знака "меньше"}many{# знаков "меньше"}other{# less than signs}}</translation>
 <translation id="5444587279251314700">(активна)</translation>
-<translation id="5446809554778706307">Нет аудиофокуса. Нажмите Ctrl + T, чтобы открыть новую вкладку.</translation>
+<translation id="5446809554778706307">Нет аудиофокуса. Нажмите Ctrl + T, чтобы открыть новую вкладку.</translation>
 <translation id="5451268436205074266">точки <ph name="DOT" /></translation>
 <translation id="5455441614648621694">Дополнительно</translation>
 <translation id="5485036206801896268">Предыдущей диаграммы нет.</translation>
@@ -866,7 +866,7 @@
 <translation id="9065283790526219006">+popup</translation>
 <translation id="9077213568694924680">Удалено из выбранного фрагмента.</translation>
 <translation id="9082874451376019682">Предыдущего ползунка нет.</translation>
-<translation id="9087707351856729768">Для автозаполнения начните вводить текст.</translation>
+<translation id="9087707351856729768">Чтобы сработало автозаполнение, начните вводить текст.</translation>
 <translation id="9089864840575085222">Повторно озвучивать вводимый текст</translation>
 <translation id="9105227991373418255">вырезать $1.</translation>
 <translation id="9107530006868467849">Предыдущего виджета мультимедиа нет.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
index 8cfe673..5f698f2c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -866,7 +866,7 @@
 <translation id="9065283790526219006">+pojavnookno</translation>
 <translation id="9077213568694924680">odstranjeni iz izbora</translation>
 <translation id="9082874451376019682">Ni prejšnjega drsnika.</translation>
-<translation id="9087707351856729768">Vnašajte, če želite sprožiti samodokončanja.</translation>
+<translation id="9087707351856729768">Vnašajte, če želite sprožiti samodokončanje.</translation>
 <translation id="9089864840575085222">Kroženje med možnostmi izgovarjanja tipkanja</translation>
 <translation id="9105227991373418255">izreži $1.</translation>
 <translation id="9107530006868467849">Ni pripomočka za prejšnjo predstavnost</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 36d33f1..292fe54 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -36,7 +36,7 @@
 <translation id="1237866625126425153">alternativknappsgrupp</translation>
 <translation id="1251750620252348585">Nästa rubrik på nivå 6</translation>
 <translation id="1275718070701477396">Markerad</translation>
-<translation id="1286609444451033486">Du kan aktivera och inaktivera detta genom att trycka på sök+blanksteg.</translation>
+<translation id="1286609444451033486">Aktivera eller inaktivera detta med Sök+blanksteg.</translation>
 <translation id="1319608975892113573">Det finns inget föregående citatblock.</translation>
 <translation id="1321576897702511272">Dölj hjälpen för ChromeVox</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></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 24f67c4..2c5164d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -372,7 +372,7 @@
 <translation id="4191918948604314587">బటన్</translation>
 <translation id="4202186506458631436">కుడివైపు తరలించండి</translation>
 <translation id="4206289001967551965">పట్టిక లోపల ఉన్నారు</translation>
-<translation id="4209770650650780359">స్వయంచాలకంగా పూర్తి చేయడం కోసం పైకి లేదా కిందికి బాణాన్ని నొక్కండి.</translation>
+<translation id="4209770650650780359">ఆటోమేటిక్‌గా పూర్తి చేయడం కోసం పైకి లేదా కిందికి బాణాన్ని నొక్కండి.</translation>
 <translation id="4215733775853809057">తదుపరి స్లయిడర్</translation>
 <translation id="4218529045364428769">{COUNT,plural, =1{అడ్డగీత}other{# అడ్డగీతలు}}</translation>
 <translation id="421884353938374759">రంగు ఎంపిక</translation>
@@ -866,7 +866,7 @@
 <translation id="9065283790526219006">+పాప్అప్</translation>
 <translation id="9077213568694924680">ఎంపిక నుండి తీసివేయబడింది</translation>
 <translation id="9082874451376019682">మునుపటి స్లయిడర్ లేదు.</translation>
-<translation id="9087707351856729768">స్వయంచాలకంగా పూర్తి చేయడం కోసం టైప్ చేయండి.</translation>
+<translation id="9087707351856729768">ఆటోమేటిక్‌గా పూర్తి చేయడం కోసం టైప్ చేయండి.</translation>
 <translation id="9089864840575085222">సైకిల్ టైపింగ్ అనుకరణ</translation>
 <translation id="9105227991373418255">$1ని కత్తిరించండి.</translation>
 <translation id="9107530006868467849">మునుపటి మీడియా విడ్జెట్ లేదు.</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 b128842..d82d66b4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -405,7 +405,7 @@
 <translation id="4532633738839459153">{COUNT,plural, =1{eğik çizgi}other{# eğik çizgi}}</translation>
 <translation id="4547556996012970016">Sonraki 5. düzey başlık</translation>
 <translation id="4562381607973973258">Üst bilgi</translation>
-<translation id="4569941707103739422">Gezinmek için yukarı veya aşağı ok; etkinleştirmek için Enter tuşuna basın.</translation>
+<translation id="4569941707103739422">Gezinmek için yukarı veya aşağı oka, etkinleştirmek için Enter tuşuna basın.</translation>
 <translation id="4570424871453628777">Yazım hatası sonu</translation>
 <translation id="4591507479202817876">, seçili</translation>
 <translation id="4597532268155981612">form</translation>
diff --git a/chrome/browser/resources/chromeos/emulator/device_emulator_pages.html b/chrome/browser/resources/chromeos/emulator/device_emulator_pages.html
index 9d876d3..b1c2452 100644
--- a/chrome/browser/resources/chromeos/emulator/device_emulator_pages.html
+++ b/chrome/browser/resources/chromeos/emulator/device_emulator_pages.html
@@ -8,6 +8,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-in-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-icon-item.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-listbox/paper-listbox.html">
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
index e8fe923..8c7d6c1 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
@@ -38,6 +38,11 @@
              to ensure the content is stretched to fit. */
           height: 480px;
         }
+
+        .error {
+          color: red;
+          font-weight: 500;
+        }
       </style>
 
       <dialog is="cr-dialog" id="dialog" no-cancel>
@@ -50,11 +55,15 @@
               enable-connect="{{enableConnect_}}" connect-on-save
               share-allow-enable="[[shareAllowEnable_]]"
               share-default="[[shareDefault_]]"
+              error="{{error_}}"
               on-close="close_">
           </network-config>
         </div>
 
-        <div slot="button-container">
+        <div class="layout horizontal center" slot="button-container">
+          <template is="dom-if" if="[[error_]]" restamp>
+            <div class="flex error">[[getError_(error_)]]</div>
+          </template>
           <paper-button class="cancel-button" on-tap="onCancelTap_">
             $i18n{cancel}
           </paper-button>
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
index c3f8a7a..847f8af 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -58,6 +58,15 @@
      * @type {!chrome.networkingPrivate.NetworkProperties}
      */
     networkProperties_: Object,
+
+    /**
+     * Set by network-config when a configuration error occurs.
+     * @private
+     */
+    error_: {
+      type: String,
+      value: '',
+    },
   },
 
   /** @override */
@@ -105,6 +114,16 @@
     return this.i18n('internetJoinType', type);
   },
 
+  /**
+   * @return {string}
+   * @private
+   */
+  getError_: function() {
+    if (this.i18nExists(this.error_))
+      return this.i18n(this.error_);
+    return this.i18n('networkErrorUnknown');
+  },
+
   /** @private */
   onCancelTap_: function() {
     this.close_();
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
deleted file mode 100644
index 8ad38cb..0000000
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-group("closure_compile") {
-  deps = [
-    ":offline_ad_login",
-    ":oobe_change_picture",
-  ]
-}
-
-js_binary("offline_ad_login") {
-  deps = [
-    "//ui/webui/resources/js:load_time_data",
-  ]
-}
-
-js_binary("oobe_change_picture") {
-  deps = [
-    "//ui/webui/resources/cr_elements/chromeos/cr_picture:cr_picture_list",
-    "//ui/webui/resources/cr_elements/chromeos/cr_picture:cr_picture_pane",
-    "//ui/webui/resources/cr_elements/chromeos/cr_picture:cr_picture_types",
-    "//ui/webui/resources/js:assert",
-    "//ui/webui/resources/js:i18n_behavior",
-    "//ui/webui/resources/js:load_time_data",
-    "//ui/webui/resources/js:util",
-  ]
-}
diff --git a/chrome/browser/resources/chromeos/login/active_directory_password_change.html b/chrome/browser/resources/chromeos/login/active_directory_password_change.html
index beb26b02..cea6fdf 100644
--- a/chrome/browser/resources/chromeos/login/active_directory_password_change.html
+++ b/chrome/browser/resources/chromeos/login/active_directory_password_change.html
@@ -8,6 +8,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
 
 <!--
diff --git a/chrome/browser/resources/chromeos/login/controller-pairing-screen.html b/chrome/browser/resources/chromeos/login/controller-pairing-screen.html
index 9c9236dc..63f6d11 100644
--- a/chrome/browser/resources/chromeos/login/controller-pairing-screen.html
+++ b/chrome/browser/resources/chromeos/login/controller-pairing-screen.html
@@ -12,6 +12,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/hero-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable-behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-icon-item.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
diff --git a/chrome/browser/resources/chromeos/login/gaia_password_changed.html b/chrome/browser/resources/chromeos/login/gaia_password_changed.html
index bd0076a0..5fe328b 100644
--- a/chrome/browser/resources/chromeos/login/gaia_password_changed.html
+++ b/chrome/browser/resources/chromeos/login/gaia_password_changed.html
@@ -9,6 +9,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
 
 <!--
diff --git a/chrome/browser/resources/chromeos/login/host-pairing-screen.html b/chrome/browser/resources/chromeos/login/host-pairing-screen.html
index 8d7e313..3faa4aa 100644
--- a/chrome/browser/resources/chromeos/login/host-pairing-screen.html
+++ b/chrome/browser/resources/chromeos/login/host-pairing-screen.html
@@ -10,6 +10,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable-behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-icon-item.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
 
diff --git a/chrome/browser/resources/chromeos/login/offline_gaia.html b/chrome/browser/resources/chromeos/login/offline_gaia.html
index 6531795b..351cd9a 100644
--- a/chrome/browser/resources/chromeos/login/offline_gaia.html
+++ b/chrome/browser/resources/chromeos/login/offline_gaia.html
@@ -12,6 +12,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/slide-right-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 
 <!--
diff --git a/chrome/browser/resources/chromeos/login/saml_confirm_password.html b/chrome/browser/resources/chromeos/login/saml_confirm_password.html
index 3f92b28..480cfa5 100644
--- a/chrome/browser/resources/chromeos/login/saml_confirm_password.html
+++ b/chrome/browser/resources/chromeos/login/saml_confirm_password.html
@@ -10,6 +10,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 
 <!--
diff --git a/chrome/browser/resources/chromeos/select_to_speak/compiled_resources2.gyp b/chrome/browser/resources/chromeos/select_to_speak/compiled_resources2.gyp
index 86c4a2ed..24408f9 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/compiled_resources2.gyp
+++ b/chrome/browser/resources/chromeos/select_to_speak/compiled_resources2.gyp
@@ -15,6 +15,7 @@
 	'<(EXTERNS_GYP):accessibility_private',
 	'<(EXTERNS_GYP):automation',
 	'<(EXTERNS_GYP):chrome_extensions',
+	'<(EXTERNS_GYP):clipboard',
 	'<(EXTERNS_GYP):command_line_private',
 	'<(EXTERNS_GYP):metrics_private',
        ],
diff --git a/chrome/browser/resources/chromeos/select_to_speak/manifest.json.jinja2 b/chrome/browser/resources/chromeos/select_to_speak/manifest.json.jinja2
index bbda5c7..bf59efe 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/manifest.json.jinja2
+++ b/chrome/browser/resources/chromeos/select_to_speak/manifest.json.jinja2
@@ -28,7 +28,13 @@
     "commandLinePrivate",
     "metricsPrivate",
     "storage",
-    "tts"
+    "tabs",
+    "tts",
+    "https://docs.google.com/*",
+    "https://docs.sandbox.google.com/*",
+    "clipboard",
+    "clipboardRead",
+    "clipboardWrite"
   ],
   "automation": {
     "desktop": true
diff --git a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js
index 91cee3a..71d1740 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js
+++ b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js
@@ -15,6 +15,15 @@
 // be kept in sync with the enum count in tools/metrics/histograms/enums.xml.
 const START_SPEECH_METHOD_COUNT = 2;
 
+// Number of milliseconds to wait after requesting a clipboard read
+// before clipboard change and paste events are ignored.
+const CLIPBOARD_READ_MAX_DELAY_MS = 1000;
+
+// Matches one of the known Drive apps which need the clipboard to find and read
+// selected text. Includes sandbox and non-sandbox versions.
+const DRIVE_APP_REGEXP =
+    /^https:\/\/docs\.(?:sandbox\.)?google\.com\/(?:(?:presentation)|(?:document)|(?:spreadsheets)|(?:drawings)){1}\//;
+
 /**
  * Node state. Nodes can be on-screen like normal, or they may
  * be invisible if they are in a tab that is not in the foreground
@@ -176,6 +185,25 @@
 }
 
 /**
+ * Determines if a node is in one of the known Google Drive apps that needs
+ * special case treatment for speaking selected text. Not all Google Drive pages
+ * are included, because some are not known to have a problem with selection:
+ * Forms is not included since it's relatively similar to any HTML page, for
+ * example.
+ * @param {AutomationNode=}  node The node to check
+ * @return {?AutomationNode} The Drive App root node, or null if none is
+ *     found.
+ */
+function getDriveAppRoot(node) {
+  while (node !== undefined && node.root !== undefined) {
+    if (node.root.url !== undefined && DRIVE_APP_REGEXP.exec(node.root.url))
+      return node.root;
+    node = node.root.parent;
+  }
+  return null;
+}
+
+/**
  * @constructor
  */
 var SelectToSpeak = function() {
@@ -266,6 +294,15 @@
   this.scrollToSpokenNode_ = false;
 
   /**
+   * The timestamp at which clipboard data read was requested by the user
+   * doing a "read selection" keystroke on a Google Docs app. If a
+   * clipboard change event comes in within CLIPBOARD_READ_MAX_DELAY_MS,
+   * Select-to-Speak will read that text out loud.
+   * @private {number}
+   */
+  this.readClipboardDataTimeMs_ = -1;
+
+  /**
    * The interval ID from a call to setInterval, which is set whenever
    * speech is in progress.
    * @private {number|undefined}
@@ -378,6 +415,25 @@
     return false;
   },
 
+  onClipboardDataChanged_: function() {
+    if (Date.now() - this.readClipboardDataTimeMs_ <
+        CLIPBOARD_READ_MAX_DELAY_MS) {
+      // The data has changed, and we are ready to read it.
+      // Get it using a paste.
+      document.execCommand('paste');
+    }
+  },
+
+  onClipboardPaste_: function(evt) {
+    if (Date.now() - this.readClipboardDataTimeMs_ <
+        CLIPBOARD_READ_MAX_DELAY_MS) {
+      // Read the current clipboard data.
+      evt.preventDefault();
+      this.startSpeech_(evt.clipboardData.getData('text/plain'));
+      this.readClipboardDataTimeMs_ = -1;
+    }
+  },
+
   /**
    * Called in response to our hit test after the mouse is released,
    * when the user is in a mode where select-to-speak is capturing
@@ -564,13 +620,34 @@
         break;
       }
     }
-    if (lastPosition.node !== nodes[nodes.length - 1]) {
-      // The node at the last position was not added to the list, perhaps it
-      // was whitespace or invisible. Clear the ending offset because it
-      // relates to a node that doesn't exist.
-      this.startSpeechQueue_(nodes, firstPosition.offset);
+    if (nodes.length > 0) {
+      if (lastPosition.node !== nodes[nodes.length - 1]) {
+        // The node at the last position was not added to the list, perhaps it
+        // was whitespace or invisible. Clear the ending offset because it
+        // relates to a node that doesn't exist.
+        this.startSpeechQueue_(nodes, firstPosition.offset);
+      } else {
+        this.startSpeechQueue_(
+            nodes, firstPosition.offset, lastPosition.offset);
+      }
     } else {
-      this.startSpeechQueue_(nodes, firstPosition.offset, lastPosition.offset);
+      let driveAppRootNode = getDriveAppRoot(focusedNode);
+      if (!driveAppRootNode)
+        return;
+      chrome.tabs.query({active: true}, (tabs) => {
+        if (tabs.length == 0) {
+          return;
+        }
+        let tab = tabs[0];
+        this.readClipboardDataTimeMs_ = Date.now();
+        this.currentNode_ = new NodeGroupItem(driveAppRootNode, 0, false);
+        chrome.tabs.executeScript(tab.id, {
+          allFrames: true,
+          matchAboutBlank: true,
+          code: 'document.execCommand("copy");'
+        });
+      });
+      return;
     }
     this.initializeScrollingToOffscreenNodes_(focusedNode.root);
     this.recordStartEvent_(START_SPEECH_METHOD_KEYSTROKE);
@@ -649,6 +726,30 @@
     document.addEventListener('mousedown', this.onMouseDown_.bind(this));
     document.addEventListener('mousemove', this.onMouseMove_.bind(this));
     document.addEventListener('mouseup', this.onMouseUp_.bind(this));
+    chrome.clipboard.onClipboardDataChanged.addListener(
+        this.onClipboardDataChanged_.bind(this));
+    document.addEventListener('paste', this.onClipboardPaste_.bind(this));
+  },
+
+  /**
+   * Enqueue speech for the single given string. The string is not associated
+   * with any particular nodes, so this does not do any work around drawing
+   * focus rings, unlike startSpeechQueue_ below.
+   * @param {string} text The text to speak.
+   */
+  startSpeech_: function(text) {
+    this.prepareForSpeech_();
+    let options = this.speechOptions_();
+    options.onEvent = (event) => {
+      if (event.type == 'start') {
+        this.testCurrentNode_();
+      } else if (
+          event.type == 'end' || event.type == 'interrupted' ||
+          event.type == 'cancelled') {
+        this.clearFocusRingAndNode_();
+      }
+    };
+    chrome.tts.speak(text, options);
   },
 
   /**
@@ -660,13 +761,7 @@
    * at which to end speech. If this is not passed, will stop at the end.
    */
   startSpeechQueue_: function(nodes, opt_startIndex, opt_endIndex) {
-    chrome.tts.stop();
-    if (this.intervalRef_ !== undefined) {
-      clearInterval(this.intervalRef_);
-    }
-    this.intervalRef_ = setInterval(
-        this.testCurrentNode_.bind(this),
-        SelectToSpeak.NODE_STATE_TEST_INTERVAL_MS);
+    this.prepareForSpeech_();
     for (var i = 0; i < nodes.length; i++) {
       let node = nodes[i];
       let nodeGroup = buildNodeGroup(nodes, i);
@@ -710,99 +805,114 @@
         continue;
       }
 
-      let options = {
-        rate: this.speechRate_,
-        pitch: this.speechPitch_,
-        'enqueue': true,
-        onEvent:
-            (event) => {
-              if (event.type == 'start' && nodeGroup.nodes.length > 0) {
-                this.currentBlockParent_ = nodeGroup.blockParent;
-                this.currentNodeGroupIndex_ = 0;
-                this.currentNode_ =
-                    nodeGroup.nodes[this.currentNodeGroupIndex_];
-                if (this.wordHighlight_) {
-                  // At 'start', find the first word and highlight that.
-                  // Clear the previous word in the node.
-                  this.currentNodeWord_ = null;
-                  // If this is the first nodeGroup, pass the opt_startIndex.
-                  // If this is the last nodeGroup, pass the opt_endIndex.
-                  this.updateNodeHighlight_(
-                      nodeGroup.text, event.charIndex,
-                      isFirst ? opt_startIndex : undefined,
-                      isLast ? opt_endIndex : undefined);
-                } else {
-                  this.testCurrentNode_();
-                }
-              } else if (
-                  event.type == 'interrupted' || event.type == 'cancelled') {
-                this.clearFocusRingAndNode_();
-              } else if (event.type == 'end') {
-                if (isLast) {
-                  this.clearFocusRingAndNode_();
-                }
-              } else if (event.type == 'word') {
-                console.debug(
-                    nodeGroup.text + ' (index ' + event.charIndex + ')');
-                console.debug('-'.repeat(event.charIndex) + '^');
-                if (this.currentNodeGroupIndex_ + 1 < nodeGroup.nodes.length) {
-                  let next = nodeGroup.nodes[this.currentNodeGroupIndex_ + 1];
-                  // Check if we've reached this next node yet using the
-                  // character index of the event. Add 1 for the space character
-                  // between words, and another to make it to the start of the
-                  // next node name.
-                  if (event.charIndex + 2 >= next.startChar) {
-                    // Move to the next node.
-                    this.currentNodeGroupIndex_ += 1;
-                    this.currentNode_ = next;
-                    this.currentNodeWord_ = null;
-                    if (!this.wordHighlight_) {
-                      // If we are doing a per-word highlight, we will test the
-                      // node after figuring out what the currently highlighted
-                      // word is.
-                      this.testCurrentNode_();
-                    }
-                  }
-                }
-                if (this.wordHighlight_) {
-                  this.updateNodeHighlight_(
-                      nodeGroup.text, event.charIndex, undefined,
-                      isLast ? opt_endIndex : undefined);
-                } else {
-                  this.currentNodeWord_ = null;
-                }
+      let options = this.speechOptions_();
+      options.onEvent = (event) => {
+        if (event.type == 'start' && nodeGroup.nodes.length > 0) {
+          this.currentBlockParent_ = nodeGroup.blockParent;
+          this.currentNodeGroupIndex_ = 0;
+          this.currentNode_ = nodeGroup.nodes[this.currentNodeGroupIndex_];
+          if (this.wordHighlight_) {
+            // At 'start', find the first word and highlight that.
+            // Clear the previous word in the node.
+            this.currentNodeWord_ = null;
+            // If this is the first nodeGroup, pass the opt_startIndex.
+            // If this is the last nodeGroup, pass the opt_endIndex.
+            this.updateNodeHighlight_(
+                nodeGroup.text, event.charIndex,
+                isFirst ? opt_startIndex : undefined,
+                isLast ? opt_endIndex : undefined);
+          } else {
+            this.testCurrentNode_();
+          }
+        } else if (event.type == 'interrupted' || event.type == 'cancelled') {
+          this.clearFocusRingAndNode_();
+        } else if (event.type == 'end') {
+          if (isLast) {
+            this.clearFocusRingAndNode_();
+          }
+        } else if (event.type == 'word') {
+          console.debug(nodeGroup.text + ' (index ' + event.charIndex + ')');
+          console.debug('-'.repeat(event.charIndex) + '^');
+          if (this.currentNodeGroupIndex_ + 1 < nodeGroup.nodes.length) {
+            let next = nodeGroup.nodes[this.currentNodeGroupIndex_ + 1];
+            // Check if we've reached this next node yet using the
+            // character index of the event. Add 1 for the space character
+            // between words, and another to make it to the start of the
+            // next node name.
+            if (event.charIndex + 2 >= next.startChar) {
+              // Move to the next node.
+              this.currentNodeGroupIndex_ += 1;
+              this.currentNode_ = next;
+              this.currentNodeWord_ = null;
+              if (!this.wordHighlight_) {
+                // If we are doing a per-word highlight, we will test the
+                // node after figuring out what the currently highlighted
+                // word is.
+                this.testCurrentNode_();
               }
             }
+          }
+          if (this.wordHighlight_) {
+            this.updateNodeHighlight_(
+                nodeGroup.text, event.charIndex, undefined,
+                isLast ? opt_endIndex : undefined);
+          } else {
+            this.currentNodeWord_ = null;
+          }
+        }
       };
-
-      // Pick the voice name from prefs first, or the one that matches
-      // the locale next, but don't pick a voice that isn't currently
-      // loaded. If no voices are found, leave the voiceName option
-      // unset to let the browser try to route the speech request
-      // anyway if possible.
-      console.debug('Pref: ' + this.voiceNameFromPrefs_);
-      console.debug('Locale: ' + this.voiceNameFromLocale_);
-      var valid = '';
-      this.validVoiceNames_.forEach(function(voiceName) {
-        if (valid)
-          valid += ',';
-        valid += voiceName;
-      });
-      console.debug('Valid: ' + valid);
-      if (this.voiceNameFromPrefs_ &&
-          this.validVoiceNames_.has(this.voiceNameFromPrefs_)) {
-        options['voiceName'] = this.voiceNameFromPrefs_;
-      } else if (
-          this.voiceNameFromLocale_ &&
-          this.validVoiceNames_.has(this.voiceNameFromLocale_)) {
-        options['voiceName'] = this.voiceNameFromLocale_;
-      }
-
       chrome.tts.speak(nodeGroup.text || '', options);
     }
   },
 
   /**
+   * Prepares for speech. Call once before chrome.tts.speak is called.
+   */
+  prepareForSpeech_: function() {
+    chrome.tts.stop();
+    if (this.intervalRef_ !== undefined) {
+      clearInterval(this.intervalRef_);
+    }
+    this.intervalRef_ = setInterval(
+        this.testCurrentNode_.bind(this),
+        SelectToSpeak.NODE_STATE_TEST_INTERVAL_MS);
+  },
+
+  /**
+   * Generates the basic speech options for Select-to-Speak based on user
+   * preferences. Call for each chrome.tts.speak.
+   * @return {Object} options The TTS options.
+   */
+  speechOptions_: function() {
+    let options = {
+      rate: this.speechRate_,
+      pitch: this.speechPitch_,
+      enqueue: true
+    };
+
+    // Pick the voice name from prefs first, or the one that matches
+    // the locale next, but don't pick a voice that isn't currently
+    // loaded. If no voices are found, leave the voiceName option
+    // unset to let the browser try to route the speech request
+    // anyway if possible.
+    var valid = '';
+    this.validVoiceNames_.forEach(function(voiceName) {
+      if (valid)
+        valid += ',';
+      valid += voiceName;
+    });
+    if (this.voiceNameFromPrefs_ &&
+        this.validVoiceNames_.has(this.voiceNameFromPrefs_)) {
+      options['voiceName'] = this.voiceNameFromPrefs_;
+    } else if (
+        this.voiceNameFromLocale_ &&
+        this.validVoiceNames_.has(this.voiceNameFromLocale_)) {
+      options['voiceName'] = this.voiceNameFromLocale_;
+    }
+    return options;
+  },
+
+  /**
    * Cancels the current speech queue if speech is in progress.
    */
   cancelIfSpeaking_: function(speaking) {
@@ -921,7 +1031,6 @@
 
     chrome.tts.getVoices(
         (function(voices) {
-          console.debug('updateDefaultVoice_ voices: ' + voices.length);
           this.validVoiceNames_ = new Set();
 
           if (voices.length == 0)
diff --git a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak_unittest.gtestjs b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak_unittest.gtestjs
index e8edff1a..7a866c5 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/select_to_speak_unittest.gtestjs
+++ b/chrome/browser/resources/chromeos/select_to_speak/select_to_speak_unittest.gtestjs
@@ -232,4 +232,31 @@
   result = getDeepEquivalentForSelection(root, 9);
   assertEquals(child6, result.node);
   assertEquals(2, result.offset);
+});
+
+TEST_F('SelectToSpeakUnitTest', 'getDriveAppRoot', function() {
+  let root = {url: 'https://docs.google.com/presentation/p/cats_r_awesome'};
+  let div1 = {root: root};
+  let frame1 = {url: 'about:blank', parent: div1};
+  let div2 = {root: frame1};
+  let frame2 = {url: 'about:blank', parent: div2};
+  let focus = {root: frame2};
+  assertEquals(getDriveAppRoot(focus), root);
+  assertEquals(getDriveAppRoot(div2), root);
+
+  // Sandbox URLs should still work.
+  root.url = 'https://docs.sandbox.google.com/spreadsheets/s/spreadsheet';
+  assertEquals(getDriveAppRoot(focus), root);
+
+  // Drive app embedded in something else
+  let parent = {url: 'https://www.has_embedded_doc.com'};
+  let div3 = {root: parent};
+  root.parent = div3;
+  assertEquals(getDriveAppRoot(focus), root);
+  assertEquals(getDriveAppRoot(div2), root);
+
+  // Not in drive app
+  root.url = 'https://www.not_a_doc.com'
+  assertEquals(getDriveAppRoot(focus), null);
+  assertEquals(getDriveAppRoot(div2), null);
 });
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/zip_archiver/css/passphrase-dialog.css b/chrome/browser/resources/chromeos/zip_archiver/css/passphrase-dialog.css
index dc9dc11..fb2bea69 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/css/passphrase-dialog.css
+++ b/chrome/browser/resources/chromeos/zip_archiver/css/passphrase-dialog.css
@@ -16,9 +16,14 @@
   justify-content: space-between;
 }
 
-#buttons {
+#bar {
   align-items: center;
   display: flex;
+  justify-content: space-between;
+}
+
+#buttons {
+  display: flex;
   justify-content: flex-end;
 }
 
diff --git a/chrome/browser/resources/chromeos/zip_archiver/html/passphrase-dialog.html b/chrome/browser/resources/chromeos/zip_archiver/html/passphrase-dialog.html
index 664e146f..78226c8 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/html/passphrase-dialog.html
+++ b/chrome/browser/resources/chromeos/zip_archiver/html/passphrase-dialog.html
@@ -15,17 +15,22 @@
              autofocus
              i18n-values="placeholder:ZIP_ARCHIVER_PASSPHRASE_INPUT_LABEL;aria-label:ZIP_ARCHIVER_PASSPHRASE_INPUT_LABEL">
     </paper-input-container>
-    <div id="buttons">
-      <paper-button noink
-                    on-click="accept"
-                    id="acceptButton"
-                    i18n-content="ZIP_ARCHIVER_PASSPHRASE_ACCEPT">
-      </paper-button>
-      <paper-button noink
-                    on-click="cancel"
-                    id="cancelButton"
-                    i18n-content="ZIP_ARCHIVER_PASSPHRASE_CANCEL">
-      </paper-button>
+    <div id="bar">
+      <paper-checkbox id="remember"
+                      i18n-content="ZIP_ARCHIVER_PASSPHRASE_REMEMBER">
+      </paper-checkbox>
+      <div id="buttons">
+        <paper-button noink
+                      on-click="accept"
+                      id="acceptButton"
+                      i18n-content="ZIP_ARCHIVER_PASSPHRASE_ACCEPT">
+        </paper-button>
+        <paper-button noink
+                      on-click="cancel"
+                      id="cancelButton"
+                      i18n-content="ZIP_ARCHIVER_PASSPHRASE_CANCEL">
+        </paper-button>
+      </div>
     </div>
   </template>
 </dom-module>
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/app.js b/chrome/browser/resources/chromeos/zip_archiver/js/app.js
index da1316b4..2bdc531 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/app.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/app.js
@@ -10,6 +10,12 @@
  */
 unpacker.app = {
   /**
+   * The key used by chrome.storage.local to save and restore the volumes state.
+   * @const {string}
+   */
+  STORAGE_KEY: 'state',
+
+  /**
    * The default id for the NaCl module.
    * @const {string}
    */
@@ -167,6 +173,98 @@
   },
 
   /**
+   * Saves state in case of restarts, event page suspend, crashes, etc. This
+   * method does nothing when context is in incognito mode.
+   * @param {!Array<!unpacker.types.FileSystemId>} fileSystemIdsArray
+   * @private
+   */
+  saveState_: function(fileSystemIdsArray) {
+    // If current context is in incognito mode, then skip save state because
+    // retainEntry is not available in incognito mode.
+    if (chrome.extension.inIncognitoContext)
+      return;
+
+    chrome.storage.local.get([unpacker.app.STORAGE_KEY], function(result) {
+      if (!result[unpacker.app.STORAGE_KEY])  // First save state call.
+        result[unpacker.app.STORAGE_KEY] = {};
+
+      // Overwrite state only for the volumes that have their file system id
+      // present in the input array. Leave the rest of the volumes state
+      // untouched.
+      fileSystemIdsArray.forEach(function(fileSystemId) {
+        var entryId = chrome.fileSystem.retainEntry(
+            unpacker.app.volumes[fileSystemId].entry);
+        result[unpacker.app.STORAGE_KEY][fileSystemId] = {
+          entryId: entryId,
+          passphrase: unpacker.app.volumes[fileSystemId]
+                          .decompressor.passphraseManager.rememberedPassphrase
+        };
+      });
+
+      chrome.storage.local.set(result);
+    });
+  },
+
+  /**
+   * Removes state from local storage for a single volume. This method does
+   * nothing when context is in incognito mode.
+   * @param {!unpacker.types.FileSystemId} fileSystemId
+   */
+  removeState_: function(fileSystemId) {
+    if (chrome.extension.inIncognitoContext)
+      return;
+
+    chrome.storage.local.get([unpacker.app.STORAGE_KEY], function(result) {
+      console.assert(
+          result[unpacker.app.STORAGE_KEY] &&
+              result[unpacker.app.STORAGE_KEY][fileSystemId],
+          'Should call removeState_ only for file systems that ',
+          'have previously called saveState_.');
+
+      delete result[unpacker.app.STORAGE_KEY][fileSystemId];
+      chrome.storage.local.set(result);
+    });
+  },
+
+  /**
+   * Restores archive's entry and opened files for the passed file system id.
+   * @param {!unpacker.types.FileSystemId} fileSystemId
+   * @return {!Promise<!Object>} Promise fulfilled with the entry and list of
+   *     opened files.
+   * @private
+   */
+  restoreVolumeState_: function(fileSystemId) {
+    if (chrome.extension.inIncognitoContext)
+      return Promise.reject('No state restored due to incognito context');
+    return new Promise(function(fulfill, reject) {
+      chrome.storage.local.get([unpacker.app.STORAGE_KEY], function(result) {
+        if (!result[unpacker.app.STORAGE_KEY]) {
+          reject('FAILED');
+          return;
+        }
+
+        var volumeState = result[unpacker.app.STORAGE_KEY][fileSystemId];
+        if (!volumeState) {
+          console.error('No state for: ' + fileSystemId + '.');
+          reject('FAILED');
+          return;
+        }
+
+        chrome.fileSystem.restoreEntry(volumeState.entryId, function(entry) {
+          if (chrome.runtime.lastError) {
+            console.error(
+                'Restore entry error for <', fileSystemId,
+                '>: ' + chrome.runtime.lastError.message);
+            reject('FAILED');
+            return;
+          }
+          fulfill({entry: entry, passphrase: volumeState.passphrase});
+        });
+      });
+    });
+  },
+
+  /**
    * Creates a volume and loads its metadata from NaCl.
    * @param {!unpacker.types.FileSystemId} fileSystemId
    * @param {!Entry} entry The volume's archive entry.
@@ -225,9 +323,68 @@
   },
 
   /**
+   * Restores a volume mounted previously to a suspend / restart. In case of
+   * failure of the load promise for fileSystemId, the corresponding volume is
+   * forcely unmounted.
+   * @param {!unpacker.types.FileSystemId} fileSystemId
+   * @return {!Promise} A promise that restores state and loads volume.
+   * @private
+   */
+  restoreSingleVolume_: function(fileSystemId) {
+    // Load volume after restart / suspend page event.
+    return unpacker.app.restoreVolumeState_(fileSystemId)
+        .then(function(state) {
+          return new Promise(function(fulfill, reject) {
+            // Check if the file system is compatible with this version of the
+            // ZIP unpacker.
+            // TODO(mtomasz): Implement remounting instead of unmounting.
+            chrome.fileSystemProvider.get(fileSystemId, function(fileSystem) {
+              if (chrome.runtime.lastError) {
+                console.error(chrome.runtime.lastError.name);
+                reject('FAILED');
+                return;
+              }
+              if (!fileSystem || fileSystem.openedFilesLimit != 1) {
+                console.error('No compatible mounted file system found.');
+                reject('FAILED');
+                return;
+              }
+              fulfill({state: state, fileSystem: fileSystem});
+            });
+          });
+        })
+        .then(function(stateWithFileSystem) {
+          var openedFilesOptions = {};
+          stateWithFileSystem.fileSystem.openedFiles.forEach(function(
+              openedFile) {
+            openedFilesOptions[openedFile.openRequestId] = {
+              fileSystemId: fileSystemId,
+              requestId: openedFile.openRequestId,
+              mode: openedFile.mode,
+              filePath: openedFile.filePath
+            };
+          });
+          return unpacker.app.loadVolume_(
+              fileSystemId, stateWithFileSystem.state.entry, openedFilesOptions,
+              stateWithFileSystem.state.passphrase);
+        })
+        .catch(function(error) {
+          console.error(error.stack || error);
+          // Force unmount in case restore failed. All resources related to the
+          // volume will be cleanup from both memory and local storage.
+          // TODO(523195): Show a notification that the source file is gone.
+          return unpacker.app.unmountVolume(fileSystemId, true)
+              .then(function() {
+                return Promise.reject('FAILED');
+              });
+        });
+  },
+
+  /**
    * Ensures a volume is loaded by returning its corresponding loaded promise
    * from unpacker.app.volumeLoadedPromises. In case there is no such promise,
-   * then this simply returns a rejected Promise.
+   * then this is a call after suspend / restart and a new volume loaded promise
+   * that restores state is returned.
    * @param {!unpacker.types.FileSystemId} fileSystemId
    * @return {!Promise} The loading volume promise.
    * @private
@@ -243,9 +400,13 @@
     }
 
     return unpacker.app.moduleLoadedPromise.then(function() {
+      // In case there is no volume promise for fileSystemId then we
+      // received a call after restart / suspend as load promises are
+      // created on launched. In this case we will restore volume state
+      // from local storage and create a new load promise.
       if (!unpacker.app.volumeLoadedPromises[fileSystemId]) {
-        console.error(fileSystemId + ' requested before mounting');
-        return Promise.reject('NOT_FOUND');
+        unpacker.app.volumeLoadedPromises[fileSystemId] =
+            unpacker.app.restoreSingleVolume_(fileSystemId);
       }
 
       // Decrement the counter when the mounting process ends.
@@ -340,7 +501,8 @@
   },
 
   /**
-   * Cleans up the resources for a volume.
+   * Cleans up the resources for a volume, except for the local storage. If
+   * necessary that can be done using unpacker.app.removeState_.
    * @param {!unpacker.types.FileSystemId} fileSystemId
    */
   cleanupVolume: function(fileSystemId) {
@@ -390,6 +552,16 @@
   },
 
   /**
+   * Updates the state in case of restarts, event page suspend, crashes, etc.
+   * Use this method to update or save the state out side of the object in case
+   * when password changes, etc.
+   * @param {!Array<!unpacker.types.FileSystemId>} fileSystemIdsArray
+   */
+  updateState: function(fileSystemIdsArray) {
+    unpacker.app.saveState_(fileSystemIdsArray);
+  },
+
+  /**
    * Unmounts a volume and removes any resources related to the volume from both
    * the extension and the local storage state.
    * @param {!unpacker.types.FileSystemId} fileSystemId
@@ -430,6 +602,8 @@
         else
           unpacker.app.cleanupVolume(fileSystemId);
 
+        // Remove volume from local storage.
+        unpacker.app.removeState_(fileSystemId);
         fulfill();
       });
     });
@@ -769,6 +943,9 @@
                   loadPromise
                       .then(function() {
                         unpacker.app.volumeLoadFinished[fileSystemId] = true;
+                        // Mount the volume and save its information in local
+                        // storage in order to be able to recover the metadata
+                        // in case of restarts, system crashes, etc.
                         chrome.fileSystemProvider.mount(
                             {
                               fileSystemId: fileSystemId,
@@ -781,6 +958,9 @@
                                 onError(chrome.runtime.lastError, fileSystemId);
                                 return;
                               }
+                              // Save state so in case of restarts we are able
+                              // to correctly get the archive's metadata.
+                              unpacker.app.saveState_([fileSystemId]);
                               onSuccess(fileSystemId);
                             });
                       })
@@ -819,5 +999,13 @@
       unpacker.app.onLaunchedWithPack(launchData);
     else
       unpacker.app.onLaunchedWithUnpack(launchData, opt_onSuccess, opt_onError);
+  },
+
+  /**
+   * Saves the state before suspending the event page, so we can resume it
+   * once new events arrive.
+   */
+  onSuspend: function() {
+    unpacker.app.saveState_(Object.keys(unpacker.app.volumes));
   }
 };
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/background.js b/chrome/browser/resources/chromeos/zip_archiver/js/background.js
index 173598a..c9fe20e 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/background.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/background.js
@@ -8,6 +8,10 @@
 // declared in the manifest file.
 chrome.app.runtime.onLaunched.addListener(unpacker.app.onLaunched);
 
+// Save the state before suspending the event page, so we can resume it
+// once new events arrive.
+chrome.runtime.onSuspend.addListener(unpacker.app.onSuspend);
+
 chrome.fileSystemProvider.onUnmountRequested.addListener(
     unpacker.app.onUnmountRequested);
 chrome.fileSystemProvider.onGetMetadataRequested.addListener(
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/decompressor.js b/chrome/browser/resources/chromeos/zip_archiver/js/decompressor.js
index 87b0453..aa1e986 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/decompressor.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/decompressor.js
@@ -42,7 +42,8 @@
   this.passphraseManager = passphraseManager;
 
   /**
-   * Requests in progress.
+   * Requests in progress. No need to save them onSuspend for now as metadata
+   * reads are restarted from start.
    * @public {!Object<!unpacker.types.RequestId, !Object>}
    * @const
    */
@@ -295,6 +296,8 @@
 unpacker.Decompressor.prototype.readPassphrase_ = function(data, requestId) {
   this.passphraseManager.getPassphrase()
       .then(function(passphrase) {
+        // Update remembered password
+        unpacker.app.updateState([this.fileSystemId_]);
         this.naclModule_.postMessage(
             unpacker.request.createReadPassphraseDoneResponse(
                 this.fileSystemId_, requestId, passphrase));
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-dialog.js b/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-dialog.js
index 2df9854c..4cc7936 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-dialog.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-dialog.js
@@ -19,7 +19,7 @@
   },
 
   accept: function() {
-    window.onPassphraseSuccess(this.$.input.value);
+    window.onPassphraseSuccess(this.$.input.value, this.$.remember.checked);
     window.close();
   },
 
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-manager.js b/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-manager.js
index 9c37e57..71755e73 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-manager.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/passphrase-manager.js
@@ -4,15 +4,38 @@
 
 /**
  * @constructor
+ * @param {?string} initPassphrase Initial passphrase for the first passphrase
+ *     request or NULL if not available. In such case, call to getPassphrase()
+ *     will invoke a dialog.
  */
-unpacker.PassphraseManager = function() {};
+unpacker.PassphraseManager = function(initPassphrase) {
+  /**
+   * @private {?string}
+   */
+  this.initPassphrase_ = initPassphrase;
+
+  /**
+   * @public {?string}
+   */
+  this.rememberedPassphrase = initPassphrase;
+};
 
 /**
- * Requests a passphrase from the user.
+ * Requests a passphrase from the user. If a passphrase was previously
+ * remembered, then tries it first. Otherwise shows a passphrase dialog.
  * @return {!Promise<string>}
  */
 unpacker.PassphraseManager.prototype.getPassphrase = function() {
   return new Promise(function(fulfill, reject) {
+    // For the first passphrase request try the init passphrase (which may be
+    // incorrect though, so do it only once).
+    if (this.initPassphrase_ != null) {
+      fulfill(this.initPassphrase_);
+      this.initPassphrase_ = null;
+      return;
+    }
+
+    // Ask user for a passphrase.
     chrome.app.window.create(
         '../html/passphrase.html',
         /** @type {!chrome.app.window.CreateWindowOptions} */ ({
@@ -32,8 +55,10 @@
           }.bind(this));
 
           passphraseWindow.contentWindow.onPassphraseSuccess = function(
-                                                                   passphrase) {
+                                                                   passphrase,
+                                                                   remember) {
             passphraseSucceeded = true;
+            this.rememberedPassphrase = remember ? passphrase : null;
             fulfill(passphrase);
           }.bind(this);
         }.bind(this));
diff --git a/chrome/browser/resources/chromeos/zip_archiver/manifest.json b/chrome/browser/resources/chromeos/zip_archiver/manifest.json
index 3478c1c..456a436 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/manifest.json
+++ b/chrome/browser/resources/chromeos/zip_archiver/manifest.json
@@ -22,7 +22,8 @@
         "directory"
       ]
     },
-    "notifications"
+    "notifications",
+    "storage"
   ],
   "file_system_provider_capabilities": {
     "multipleMounts": true,
diff --git a/chrome/browser/resources/inspect/inspect.css b/chrome/browser/resources/inspect/inspect.css
index 5bd5a23..eefce85 100644
--- a/chrome/browser/resources/inspect/inspect.css
+++ b/chrome/browser/resources/inspect/inspect.css
@@ -178,6 +178,14 @@
   margin-left: 6px;
 }
 
+.browser-fallback-note {
+  display: flex;
+  flex-flow: row wrap;
+  margin-left: 4px;
+  margin-top: 5px;
+  min-height: 15px;
+}
+
 .used-for-port-forwarding {
   background-image: url(../../../../ui/webui/resources/images/info.svg);
   height: 15px;
diff --git a/chrome/browser/resources/inspect/inspect.js b/chrome/browser/resources/inspect/inspect.js
index 64288b83..1901d60 100644
--- a/chrome/browser/resources/inspect/inspect.js
+++ b/chrome/browser/resources/inspect/inspect.js
@@ -7,12 +7,17 @@
 var MIN_VERSION_NEW_TAB = 29;
 var MIN_VERSION_TAB_ACTIVATE = 30;
 var WEBRTC_SERIAL = 'WEBRTC';
+var HOST_CHROME_VERSION;
 
 var queryParamsObject = {};
 var browserInspector;
 var browserInspectorTitle;
 
 (function() {
+var chromeMatch = navigator.userAgent.match(/(?:^|\W)Chrome\/(\S+)/);
+if (chromeMatch && chromeMatch.length > 1)
+  HOST_CHROME_VERSION = chromeMatch[1].split('.').map(s => Number(s) || 0);
+
 var queryParams = window.location.search;
 if (!queryParams)
   return;
@@ -31,6 +36,21 @@
 }
 })();
 
+function isVersionNewerThanHost(version) {
+  if (!HOST_CHROME_VERSION)
+    return false;
+  version = version.split('.').map(s => Number(s) || 0);
+  for (var i = 0; i < HOST_CHROME_VERSION.length; i++) {
+    if (i > version.length)
+      return false;
+    if (HOST_CHROME_VERSION[i] > version[i])
+      return false;
+    if (HOST_CHROME_VERSION[i] < version[i])
+      return true;
+  }
+  return false;
+}
+
 function sendCommand(command, args) {
   chrome.send(command, Array.prototype.slice.call(arguments, 1));
 }
@@ -295,6 +315,8 @@
       var majorChromeVersion = browser.adbBrowserChromeVersion;
       var pageList;
       var browserSection = $(browser.id);
+      var browserNeedsFallback =
+          isVersionNewerThanHost(browser.adbBrowserVersion);
       if (browserSection) {
         pageList = browserSection.querySelector('.pages');
       } else {
@@ -320,6 +342,15 @@
         }
         browserSection.appendChild(browserHeader);
 
+        if (browserNeedsFallback) {
+          var browserFallbackNote = document.createElement('div');
+          browserFallbackNote.className = 'browser-fallback-note';
+          browserFallbackNote.textContent =
+              '\u26A0 Remote browser is newer than client browser. ' +
+              'Try `inspect fallback` if inspection fails.';
+          browserSection.appendChild(browserFallbackNote);
+        }
+
         if (majorChromeVersion >= MIN_VERSION_NEW_TAB) {
           var newPage = document.createElement('div');
           newPage.className = 'open';
@@ -401,6 +432,12 @@
                 row, 'close', sendTargetCommand.bind(null, 'close', page),
                 false);
           }
+          if (browserNeedsFallback) {
+            addActionLink(
+                row, 'inspect fallback',
+                sendTargetCommand.bind(null, 'inspect-fallback', page),
+                page.hasNoUniqueId || page.adbAttachedForeign);
+          }
         }
       }
       updateBrowserVisibility(browserSection);
diff --git a/chrome/browser/resources/md_bookmarks/folder_node.html b/chrome/browser/resources/md_bookmarks/folder_node.html
index e8d13978..bf91f497 100644
--- a/chrome/browser/resources/md_bookmarks/folder_node.html
+++ b/chrome/browser/resources/md_bookmarks/folder_node.html
@@ -98,7 +98,7 @@
             open$="[[isSelectedFolder_]]"
             no-children$="[[!hasChildFolder_]]">
         </div>
-        <div class="menu-label elided-text"" title="[[item_.title]]">
+        <div class="menu-label elided-text" title="[[item_.title]]">
           [[item_.title]]
         </div>
       </div>
diff --git a/chrome/browser/resources/md_extensions/detail_view.html b/chrome/browser/resources/md_extensions/detail_view.html
index 72b05c4..decb8d3c 100644
--- a/chrome/browser/resources/md_extensions/detail_view.html
+++ b/chrome/browser/resources/md_extensions/detail_view.html
@@ -195,7 +195,7 @@
         <div id="top-bar">
           <button id="close-button" is="paper-icon-button-light"
               aria-label="$i18n{back}" class="icon-arrow-back no-overlap"
-              on-tap="onCloseButtonTap_"></button>
+              on-click="onCloseButtonTap_"></button>
           <img id="icon" src="[[data.iconUrl]]"
               alt$="[[appOrExtension(
                   data.type,
@@ -247,7 +247,7 @@
               <span>$i18n{itemCorruptInstall}</span>
             </div>
             <paper-button id="repair-button" class="action-button"
-                on-tap="onRepairTap_">
+                on-click="onRepairTap_">
               $i18n{itemRepair}
             </paper-button>
           </div>
@@ -299,7 +299,7 @@
                 <template is="dom-repeat" items="[[data.views]]">
                   <li>
                     <a is="action-link" class="inspectable-view"
-                        on-tap="onInspectTap_">
+                        on-click="onInspectTap_">
                       [[computeInspectLabel_(item)]]
                     </a>
                   </li>
@@ -382,15 +382,15 @@
             disabled="[[!isEnabled_(data.state)]]"
             hidden="[[!shouldShowOptionsLink_(data.*)]]"
             icon-class="icon-external" label="$i18n{itemOptions}"
-            on-tap="onExtensionOptionsTap_">
+            on-click="onExtensionOptionsTap_">
         </button>
         <button class="hr" hidden="[[!data.manifestHomePageUrl.length]]"
             is="cr-link-row" icon-class="icon-external" id="extensionWebsite"
-            label="$i18n{extensionWebsite}" on-tap="onExtensionWebSiteTap_">
+            label="$i18n{extensionWebsite}" on-click="onExtensionWebSiteTap_">
         </button>
         <button class="hr" hidden="[[!data.webStoreUrl.length]]"
             is="cr-link-row" icon-class="icon-external" id="viewInStore"
-            label="$i18n{viewInStore}" on-tap="onViewInStoreTap_">
+            label="$i18n{viewInStore}" on-click="onViewInStoreTap_">
         </button>
         <div class="section block">
           <div class="section-title">$i18n{itemSource}</div>
@@ -400,7 +400,7 @@
           <div id="load-path" class="section-content"
               hidden$="[[!data.prettifiedPath]]">
             <span>$i18n{itemExtensionPath}</span>
-            <a is="action-link" on-tap="onLoadPathTap_">
+            <a is="action-link" on-click="onLoadPathTap_">
               [[data.prettifiedPath]]
             </a>
           </div>
@@ -408,7 +408,7 @@
         <button class="hr" is="cr-link-row"
             hidden="[[isControlled_(data.controlledInfo)]]"
             icon-class="subpage-arrow" id="remove-extension"
-            label="$i18n{itemRemoveExtension}" on-tap="onRemoveTap_">
+            label="$i18n{itemRemoveExtension}" on-click="onRemoveTap_">
         </button>
       </div>
     </div>
diff --git a/chrome/browser/resources/md_extensions/error_page.html b/chrome/browser/resources/md_extensions/error_page.html
index 673c8084..e872d27 100644
--- a/chrome/browser/resources/md_extensions/error_page.html
+++ b/chrome/browser/resources/md_extensions/error_page.html
@@ -177,10 +177,10 @@
         <div id="heading">
           <button id="close-button" is="paper-icon-button-light"
               aria-label="$i18n{back}"
-              class="icon-arrow-back no-overlap" on-tap="onCloseButtonTap_">
+              class="icon-arrow-back no-overlap" on-click="onCloseButtonTap_">
           </button>
           <span>$i18n{errorsPageHeading}</span>
-          <paper-button on-tap="onClearAllTap_" hidden="[[!entries_.length]]">
+          <paper-button on-click="onClearAllTap_" hidden="[[!entries_.length]]">
             $i18n{clearAll}
           </paper-button>
         </div>
@@ -190,7 +190,7 @@
               <div class="item-container">
                 <div class$="error-item
                     [[computeErrorClass_(item, selectedEntry_)]]">
-                  <div actionable class=" start" on-tap="onErrorItemAction_"
+                  <div actionable class=" start" on-click="onErrorItemAction_"
                       on-keydown="onErrorItemAction_" tabindex="0"
                       role="button">
                     <iron-icon icon$="[[computeErrorIcon_(item)]]"
@@ -204,7 +204,7 @@
                   </div>
                   <div class="separator"></div>
                   <button is="paper-icon-button-light" class="icon-delete-gray"
-                      on-tap="onDeleteErrorAction_"
+                      on-click="onDeleteErrorAction_"
                       aria-describedby$="[[item.id]]"
                       aria-label="$i18n{clearEntry}"
                       on-keydown="onDeleteErrorAction_">
@@ -226,7 +226,7 @@
                       </div>
                       <ul class="stack-trace-container">
                         <template is="dom-repeat" items="[[item.stackTrace]]">
-                          <li on-tap="onStackFrameTap_"
+                          <li on-click="onStackFrameTap_"
                               hidden="[[!shouldDisplayFrame_(item.url)]]"
                               class$="[[getStackFrameClass_(item,
                                   selectedStackFrame_)]]">
@@ -244,7 +244,7 @@
                     <paper-button class="devtool-button action-button"
                         hidden$="[[!computeIsRuntimeError_(item)]]"
                         disabled="[[!item.canInspect]]"
-                        on-tap="onDevToolButtonTap_">
+                        on-click="onDevToolButtonTap_">
                       $i18n{openInDevtool}
                     </paper-button>
                   </div>
diff --git a/chrome/browser/resources/md_extensions/extensions.html b/chrome/browser/resources/md_extensions/extensions.html
index 5b728b9..5b851ed 100644
--- a/chrome/browser/resources/md_extensions/extensions.html
+++ b/chrome/browser/resources/md_extensions/extensions.html
@@ -12,6 +12,9 @@
       /* --md-background-color in disguise. Not using the var for increased
        * performance. */
       background-color: #f1f1f1;
+
+      /* Remove 300ms delay for 'click' event, when using touch interface. */
+      touch-action: manipulation;
     }
 
     .loading {
diff --git a/chrome/browser/resources/md_extensions/install_warnings_dialog.html b/chrome/browser/resources/md_extensions/install_warnings_dialog.html
index d50ce39..286b25e5 100644
--- a/chrome/browser/resources/md_extensions/install_warnings_dialog.html
+++ b/chrome/browser/resources/md_extensions/install_warnings_dialog.html
@@ -30,7 +30,7 @@
         </ul>
       </div>
       <div slot="button-container">
-        <paper-button class="action-button" on-tap="onOkTap_">
+        <paper-button class="action-button" on-click="onOkTap_">
           $i18n{ok}
         </paper-button>
       </div>
diff --git a/chrome/browser/resources/md_extensions/item.html b/chrome/browser/resources/md_extensions/item.html
index 286119ec..3dc65c0 100644
--- a/chrome/browser/resources/md_extensions/item.html
+++ b/chrome/browser/resources/md_extensions/item.html
@@ -292,12 +292,12 @@
                   </span>
                   <a class="clippable-flex-text" is="action-link"
                       title="[[computeFirstInspectTitle_(data.views)]]"
-                      on-tap="onInspectTap_">
+                      on-click="onInspectTap_">
                     [[computeFirstInspectLabel_(data.views)]]
                   </a>
                   <a is="action-link"
                       hidden$="[[computeExtraViewsHidden_(data.views)]]"
-                      on-tap="onExtraInspectTap_">
+                      on-click="onExtraInspectTap_">
                     [[computeExtraInspectLabel_(data.views)]]
                   </a>
                 </div>
@@ -308,17 +308,17 @@
       </div>
       <div id="button-strip" class="layout horizontal center">
         <div class="layout flex horizontal center">
-          <paper-button id="details-button" on-tap="onDetailsTap_"
+          <paper-button id="details-button" on-click="onDetailsTap_"
               aria-describedby="a11yAssociation">
             $i18n{itemDetails}
           </paper-button>
-          <paper-button id="remove-button" on-tap="onRemoveTap_"
+          <paper-button id="remove-button" on-click="onRemoveTap_"
               aria-describedby="a11yAssociation"
               hidden="[[isControlled_(data.controlledInfo)]]">
             $i18n{itemRemove}
           </paper-button>
           <template is="dom-if" if="[[shouldShowErrorsButton_(data.*)]]">
-            <paper-button id="errors-button" on-tap="onErrorsTap_"
+            <paper-button id="errors-button" on-click="onErrorsTap_"
                 aria-describedby="a11yAssociation">
               $i18n{itemErrors}
             </paper-button>
@@ -327,17 +327,17 @@
         <template is="dom-if" if="[[!computeDevReloadButtonHidden_(data.*)]]">
           <button id="dev-reload-button" is="paper-icon-button-light"
               aria-label="$i18n{itemReload}" aria-describedby="a11yAssociation"
-              class="icon-refresh no-overlap" on-tap="onReloadTap_">
+              class="icon-refresh no-overlap" on-click="onReloadTap_">
           </button>
         </template>
         <template is="dom-if" if="[[data.disableReasons.corruptInstall]]">
           <paper-button id="repair-button" class="action-button"
-              aria-describedby="a11yAssociation" on-tap="onRepairTap_">
+              aria-describedby="a11yAssociation" on-click="onRepairTap_">
             $i18n{itemRepair}
           </paper-button>
         </template>
         <template is="dom-if" if="[[isTerminated_(data.state)]]">
-          <paper-button id="terminated-reload-button" on-tap="onReloadTap_"
+          <paper-button id="terminated-reload-button" on-click="onReloadTap_"
               aria-describedby="a11yAssociation" class="action-button">
             $i18n{itemReload}
           </paper-button>
diff --git a/chrome/browser/resources/md_extensions/item_list.html b/chrome/browser/resources/md_extensions/item_list.html
index f4cb5c6f..8495907 100644
--- a/chrome/browser/resources/md_extensions/item_list.html
+++ b/chrome/browser/resources/md_extensions/item_list.html
@@ -61,7 +61,7 @@
       <div id="no-items" class="empty-list-message"
           hidden$="[[!shouldShowEmptyItemsMessage_(
               apps.length, extensions.length)]]">
-        <span on-tap="onNoExtensionsTap_">$i18nRaw{noExtensionsOrApps}</span>
+        <span on-click="onNoExtensionsTap_">$i18nRaw{noExtensionsOrApps}</span>
       </div>
       <div id="no-search-results" class="empty-list-message"
           hidden$="[[!shouldShowEmptySearchMessage_(
diff --git a/chrome/browser/resources/md_extensions/kiosk_dialog.html b/chrome/browser/resources/md_extensions/kiosk_dialog.html
index 2709a386..fa86c94e 100644
--- a/chrome/browser/resources/md_extensions/kiosk_dialog.html
+++ b/chrome/browser/resources/md_extensions/kiosk_dialog.html
@@ -95,13 +95,13 @@
               </div>
               <div class="item-controls">
                 <paper-button hidden="[[!canEditAutoLaunch_]]"
-                    on-tap="onAutoLaunchButtonTap_">
+                    on-click="onAutoLaunchButtonTap_">
                   [[getAutoLaunchButtonLabel_(item.autoLaunch,
                       '$i18nPolymer{kioskDisableAutoLaunch}',
                       '$i18nPolymer{kioskEnableAutoLaunch}')]]
                 </paper-button>
                 <button is="paper-icon-button-light" class="icon-delete-gray"
-                    on-tap="onDeleteAppTap_"></button>
+                    on-click="onDeleteAppTap_"></button>
               </div>
             </div>
           </template>
@@ -114,7 +114,7 @@
                   '$i18nPolymer{kioskInvalidApp}', errorAppId_)]]"
               on-keydown="clearInputInvalid_">
           </paper-input>
-          <paper-button id="add-button" on-tap="onAddAppTap_"
+          <paper-button id="add-button" on-click="onAddAppTap_"
               disabled="[[!addAppInput_]]">
             $i18n{add}
           </paper-button>
@@ -126,7 +126,7 @@
         </paper-checkbox>
       </div>
       <div slot="button-container">
-        <paper-button class="action-button" on-tap="onDoneTap_">
+        <paper-button class="action-button" on-click="onDoneTap_">
           $i18n{done}
         </paper-button>
       </div>
@@ -136,10 +136,12 @@
       <div slot="title">$i18n{kioskDisableBailoutWarningTitle}</div>
       <div slot="body">$i18n{kioskDisableBailoutWarningBody}</div>
       <div slot="button-container">
-        <paper-button class="cancel-button" on-tap="onBailoutDialogCancelTap_">
+        <paper-button class="cancel-button"
+            on-click="onBailoutDialogCancelTap_">
           $i18n{cancel}
         </paper-button>
-        <paper-button class="action-button" on-tap="onBailoutDialogConfirmTap_">
+        <paper-button class="action-button"
+            on-click="onBailoutDialogConfirmTap_">
           $i18n{confirm}
         </paper-button>
       </div>
diff --git a/chrome/browser/resources/md_extensions/load_error.html b/chrome/browser/resources/md_extensions/load_error.html
index e5de72a..10080e15 100644
--- a/chrome/browser/resources/md_extensions/load_error.html
+++ b/chrome/browser/resources/md_extensions/load_error.html
@@ -40,11 +40,11 @@
       </div>
       <div slot="button-container">
         <paper-spinner-lite active="[[retrying_]]"></paper-spinner-lite>
-        <paper-button class="cancel-button" on-tap="close">
+        <paper-button class="cancel-button" on-click="close">
           $i18n{cancel}
         </paper-button>
         <paper-button class="action-button" disabled="[[retrying_]]"
-            on-tap="onRetryTap_">
+            on-click="onRetryTap_">
           $i18n{loadErrorRetry}
         </paper-button>
       </div>
diff --git a/chrome/browser/resources/md_extensions/pack_dialog.html b/chrome/browser/resources/md_extensions/pack_dialog.html
index 1ee1ae2..e984b8565 100644
--- a/chrome/browser/resources/md_extensions/pack_dialog.html
+++ b/chrome/browser/resources/md_extensions/pack_dialog.html
@@ -36,7 +36,7 @@
           <paper-input id="root-dir" label="$i18n{packDialogExtensionRoot}"
               always-float-label value="{{packDirectory_}}">
           </paper-input>
-          <paper-button id="root-dir-browse" on-tap="onRootBrowse_">
+          <paper-button id="root-dir-browse" on-click="onRootBrowse_">
             $i18n{packDialogBrowse}
           </paper-button>
         </div>
@@ -44,16 +44,16 @@
           <paper-input id="key-file" label="$i18n{packDialogKeyFile}"
               always-float-label value="{{keyFile_}}">
           </paper-input>
-          <paper-button id="key-file-browse" on-tap="onKeyBrowse_">
+          <paper-button id="key-file-browse" on-click="onKeyBrowse_">
             $i18n{packDialogBrowse}
           </paper-button>
         </div>
       </div>
       <div slot="button-container">
-        <paper-button class="cancel-button" on-tap="onCancelTap_">
+        <paper-button class="cancel-button" on-click="onCancelTap_">
           $i18n{cancel}
         </paper-button>
-        <paper-button class="action-button" on-tap="onConfirmTap_"
+        <paper-button class="action-button" on-click="onConfirmTap_"
             disabled="[[!packDirectory_]]">
           $i18n{packDialogConfirm}
         </paper-button>
diff --git a/chrome/browser/resources/md_extensions/pack_dialog_alert.html b/chrome/browser/resources/md_extensions/pack_dialog_alert.html
index 68bc231..ebf69a9 100644
--- a/chrome/browser/resources/md_extensions/pack_dialog_alert.html
+++ b/chrome/browser/resources/md_extensions/pack_dialog_alert.html
@@ -22,10 +22,10 @@
       <div class="body" slot="body">[[model.message]]</div>
       <div class="button-container" slot="button-container">
         <paper-button class$="[[getCancelButtonClass_(confirmLabel_)]]"
-            on-tap="onCancelTap_" hidden="[[!cancelLabel_]]">
+            on-click="onCancelTap_" hidden="[[!cancelLabel_]]">
           [[cancelLabel_]]
         </paper-button>
-        <paper-button class="action-button" on-tap="onConfirmTap_"
+        <paper-button class="action-button" on-click="onConfirmTap_"
             hidden="[[!confirmLabel_]]">
           [[confirmLabel_]]
         </paper-button>
diff --git a/chrome/browser/resources/md_extensions/shortcut_input.html b/chrome/browser/resources/md_extensions/shortcut_input.html
index ad5c9bb..94b9d0d 100644
--- a/chrome/browser/resources/md_extensions/shortcut_input.html
+++ b/chrome/browser/resources/md_extensions/shortcut_input.html
@@ -46,7 +46,7 @@
           no-label-float>
       </paper-input>
       <button id="clear" is="paper-icon-button-light"
-          class="icon-clear no-overlap" on-tap="onClearTap_"
+          class="icon-clear no-overlap" on-click="onClearTap_"
           hidden$="[[computeClearHidden_(capturing_, shortcut)]]">
       </button>
     </div>
diff --git a/chrome/browser/resources/md_extensions/sidebar.html b/chrome/browser/resources/md_extensions/sidebar.html
index a885707..5e89ab45 100644
--- a/chrome/browser/resources/md_extensions/sidebar.html
+++ b/chrome/browser/resources/md_extensions/sidebar.html
@@ -62,12 +62,12 @@
     <iron-selector id="sectionMenu">
       <!-- Values for "data-path" attribute must match the "Page" enum. -->
       <a class="section-item" id="sections-extensions" href="/"
-          on-tap="onLinkTap_" data-path="items-list">
+          on-click="onLinkTap_" data-path="items-list">
         $i18n{sidebarExtensions}
         <paper-ripple></paper-ripple>
       </a>
       <a class="section-item" id="sections-shortcuts" href="/shortcuts"
-          on-tap="onLinkTap_" data-path="keyboard-shortcuts">
+          on-click="onLinkTap_" data-path="keyboard-shortcuts">
         $i18n{keyboardShortcuts}
         <paper-ripple></paper-ripple>
       </a>
@@ -75,7 +75,7 @@
     <div hidden="[[isSupervised]]">
       <div class="separator"></div>
       <a class="section-item" id="more-extensions" target="_blank"
-          href="$i18n{getMoreExtensionsUrl}" on-tap="onMoreExtensionsTap_">
+          href="$i18n{getMoreExtensionsUrl}" on-click="onMoreExtensionsTap_">
         <span>$i18n{openChromeWebStore}</span>
         <div class="cr-icon icon-external"></div>
         <paper-ripple></paper-ripple>
diff --git a/chrome/browser/resources/md_extensions/toolbar.html b/chrome/browser/resources/md_extensions/toolbar.html
index b2d3b2f..89d752c 100644
--- a/chrome/browser/resources/md_extensions/toolbar.html
+++ b/chrome/browser/resources/md_extensions/toolbar.html
@@ -111,18 +111,18 @@
     <div id="devDrawer" expanded$="[[expanded_]]">
       <div id="button-strip">
         <paper-button hidden$="[[!canLoadUnpacked]]" id="load-unpacked"
-            on-tap="onLoadUnpackedTap_">
+            on-click="onLoadUnpackedTap_">
           $i18n{toolbarLoadUnpacked}
         </paper-button>
-        <paper-button id="pack-extensions" on-tap="onPackTap_">
+        <paper-button id="pack-extensions" on-click="onPackTap_">
           $i18n{toolbarPack}
         </paper-button>
-        <paper-button id="update-now" on-tap="onUpdateNowTap_"
+        <paper-button id="update-now" on-click="onUpdateNowTap_"
             title="$i18n{toolbarUpdateNowTooltip}">
           $i18n{toolbarUpdateNow}
         </paper-button>
 <if expr="chromeos">
-        <paper-button id="kiosk-extensions" on-tap="onKioskTap_"
+        <paper-button id="kiosk-extensions" on-click="onKioskTap_"
             hidden$="[[!kioskEnabled]]">
           $i18n{manageKioskApp}
         </paper-button>
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.html b/chrome/browser/resources/md_user_manager/user_manager_pages.html
index 8a4acecd..c2f8945b 100644
--- a/chrome/browser/resources/md_user_manager/user_manager_pages.html
+++ b/chrome/browser/resources/md_user_manager/user_manager_pages.html
@@ -7,6 +7,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/animations/fade-out-animation.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 
 <dom-module id="user-manager-pages">
   <template>
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.html b/chrome/browser/resources/settings/internet_page/internet_config.html
index c16b51d..fe5ff19 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.html
+++ b/chrome/browser/resources/settings/internet_page/internet_config.html
@@ -14,6 +14,11 @@
       dialog {
         width: 460px;
       }
+
+      .error {
+        color: red;
+        font-weight: 500;
+      }
     </style>
 
     <dialog is="cr-dialog" id="dialog" close-text="$i18n{close}">
@@ -26,11 +31,15 @@
             enable-connect="{{enableConnect_}}" enable-save="{{enableSave_}}"
             share-allow-enable="[[shareAllowEnable_]]"
             share-default="[[shareDefault_]]"
+            error="{{error_}}"
             on-close="close">
         </network-config>
       </div>
 
-      <div slot="button-container">
+      <div class="layout horizontal center" slot="button-container">
+        <template is="dom-if" if="[[error_]]" restamp>
+          <div class="flex error">[[getError_(error_)]]</div>
+        </template>
         <paper-button class="cancel-button" on-click="onCancelTap_">
           $i18n{cancel}
         </paper-button>
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.js b/chrome/browser/resources/settings/internet_page/internet_config.js
index a4764b49..b6bda81 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.js
+++ b/chrome/browser/resources/settings/internet_page/internet_config.js
@@ -69,6 +69,15 @@
      * @private {!chrome.networkingPrivate.NetworkProperties}
      */
     networkProperties_: Object,
+
+    /**
+     * Set by network-config when a configuration error occurs.
+     * @private
+     */
+    error_: {
+      type: String,
+      value: '',
+    },
   },
 
   open: function() {
@@ -106,6 +115,16 @@
   },
 
   /**
+   * @return {string}
+   * @private
+   */
+  getError_: function() {
+    if (this.i18nExists(this.error_))
+      return this.i18n(this.error_);
+    return this.i18n('networkErrorUnknown');
+  },
+
+  /**
    * @return {boolean}
    * @private
    */
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
index c475fb6..f4bdec1 100644
--- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
+++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
@@ -27,8 +27,7 @@
           <extension-controlled-indicator
               extension-id="[[ntpExtension_.id]]"
               extension-name="[[ntpExtension_.name]]"
-              extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]"
-              on-extension-disable="getNtpExtension_">
+              extension-can-be-disabled="[[ntpExtension_.canBeDisabled]]">
           </extension-controlled-indicator>
         </template>
         <controlled-radio-button name="[[prefValues_.CONTINUE]]"
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
index b9f976df..aff7303d0 100644
--- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
+++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.js
@@ -37,19 +37,13 @@
 
   /** @override */
   attached: function() {
-    this.getNtpExtension_();
-    this.addWebUIListener('update-ntp-extension', ntpExtension => {
+    const updateNtpExtension = ntpExtension => {
       // Note that |ntpExtension| is empty if there is no NTP extension.
       this.ntpExtension_ = ntpExtension;
-    });
-  },
-
-  /** @private */
-  getNtpExtension_: function() {
+    };
     settings.OnStartupBrowserProxyImpl.getInstance().getNtpExtension().then(
-        ntpExtension => {
-          this.ntpExtension_ = ntpExtension;
-        });
+        updateNtpExtension);
+    this.addWebUIListener('update-ntp-extension', updateNtpExtension);
   },
 
   /**
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.html b/chrome/browser/resources/settings/people_page/sync_account_control.html
index 9b05cf8..e1d3c77 100644
--- a/chrome/browser/resources/settings/people_page/sync_account_control.html
+++ b/chrome/browser/resources/settings/people_page/sync_account_control.html
@@ -42,6 +42,7 @@
 
       .flex {
         display: flex;
+        flex: 1;
         flex-direction: column;
       }
 
@@ -151,12 +152,12 @@
             </span>
             <div class="secondary">[[shownAccount_.email]]</div>
           </div>
-          <div class="separator" hidden="[[syncStatus.signedIn]]"></div>
-          <button is="paper-icon-button-light" id="dropdown-arrow"
-              on-click="onMenuButtonTap_" title="$i18n{moreActions}"
-              class="icon-arrow-dropdown" hidden="[[syncStatus.signedIn]]">
-          </button>
         </div>
+        <button is="paper-icon-button-light" id="dropdown-arrow"
+            on-click="onMenuButtonTap_" title="$i18n{moreActions}"
+            class="icon-arrow-dropdown" hidden="[[syncStatus.signedIn]]">
+        </button>
+        <div class="separator" hidden="[[syncStatus.signedIn]]"></div>
         <paper-button class="action-button" on-click="onSyncButtonTap_"
             hidden="[[syncStatus.signedIn]]"
             disabled="[[syncStatus.setupInProgress]]">
diff --git a/chrome/browser/resources/settings/people_page/sync_account_control.js b/chrome/browser/resources/settings/people_page/sync_account_control.js
index cb5dee1..8b079fe 100644
--- a/chrome/browser/resources/settings/people_page/sync_account_control.js
+++ b/chrome/browser/resources/settings/people_page/sync_account_control.js
@@ -182,9 +182,7 @@
   onMenuButtonTap_: function() {
     const actionMenu =
         /** @type {!CrActionMenuElement} */ (this.$$('#menu'));
-    actionMenu.showAt(assert(this.$$('#dropdown-arrow')), {
-      anchorAlignmentY: AnchorAlignment.AFTER_END,
-    });
+    actionMenu.showAt(assert(this.$$('#dropdown-arrow')));
   },
 
   /** @private */
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js
index 4ae4472..bd0b40d 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.js
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -283,7 +283,7 @@
 
   /** @private */
   onDialogClosed_: function() {
-    settings.navigateToPreviousRoute();
+    settings.navigateTo(settings.routes.CLEAR_BROWSER_DATA.parent);
     cr.ui.focusWithoutInk(assert(this.$.clearBrowsingDataTrigger));
   },
 
diff --git a/chrome/browser/resources/settings/settings_page/settings_animated_pages.html b/chrome/browser/resources/settings/settings_page/settings_animated_pages.html
index 5b3e821..655b3fa 100644
--- a/chrome/browser/resources/settings/settings_page/settings_animated_pages.html
+++ b/chrome/browser/resources/settings/settings_page/settings_animated_pages.html
@@ -11,6 +11,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animation-runner-behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="../animation/fade_animations.html">
 <link rel="import" href="../route.html">
 
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.html b/chrome/browser/resources/settings/site_settings/protocol_handlers.html
index 044328f..b734fae 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.html
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.html
@@ -44,7 +44,7 @@
             <div class="middle" >
               <div class="protocol-host">[[item.host]]</div>
               <div class="secondary protocol-default"
-                  hidden$="[[!isDefault_(index, protocol.default_handler)]]">
+                  hidden$="[[!item.is_default]]">
                 $i18n{handlerIsDefault}
               </div>
             </div>
@@ -53,26 +53,46 @@
                 class="icon-more-vert" title="$i18n{moreActions}">
             </button>
           </div>
-
         </template>
       </div>
     </template>
 
     <dialog is="cr-action-menu">
-      <button slot="item" class="dropdown-item" on-click="onDefaultTap_"
-          id="defaultButton" hidden$="[[isModelDefault_(actionMenuModel_)]]">
+      <button slot="item" class="dropdown-item" on-click="onDefaultClick_"
+          id="defaultButton" hidden$="[[actionMenuModel_.is_default]]">
         $i18n{handlerSetDefault}
       </button>
-      <button slot="item" class="dropdown-item" on-click="onRemoveTap_"
+      <button slot="item" class="dropdown-item" on-click="onRemoveClick_"
           id="removeButton">
         $i18n{handlerRemove}
       </button>
     </dialog>
 
+    <template is="dom-if" if="[[ignoredProtocols.length]]">
+      <div class="column-header">$i18n{siteSettingsBlocked}</div>
+      <div class="list-frame menu-content vertical-list">
+        <template is="dom-repeat" items="[[ignoredProtocols]]">
+          <div class="list-item">
+            <div class="favicon-image" style$="[[computeSiteIcon(item.host)]]">
+            </div>
+            <div class="middle" >
+              <div class="protocol-host">[[item.host]]</div>
+              <div class="secondary protocol-protocol">[[item.protocol]]</div>
+            </div>
+
+            <button is="paper-icon-button-light" on-click="onRemoveIgnored_"
+                class="icon-clear" title="$i18n{moreActions}"
+                id="removeIgnoredButton">
+            </button>
+          </div>
+        </template>
+      </div>
+    </template>
+
 <if expr="chromeos">
   <template is="dom-if" if="[[settingsAppAvailable_]]">
     <div class="settings-box first"
-        on-click="onManageAndroidAppsTap_" actionable>
+        on-click="onManageAndroidAppsClick_" actionable>
       <div class="start">
         <div>$i18n{androidAppsManageAppLinks}</div>
       </div>
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.js b/chrome/browser/resources/settings/site_settings/protocol_handlers.js
index 6ad35cec..17667e90 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.js
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.js
@@ -19,16 +19,14 @@
 
 /**
  * @typedef {{host: string,
+ *            is_default: boolean,
  *            protocol: string,
  *            spec: string}}
  */
 let HandlerEntry;
 
 /**
- * @typedef {{default_handler: number,
- *            handlers: !Array<!HandlerEntry>,
- *            has_policy_recommendations: boolean,
- *            is_default_handler_set_by_user: boolean,
+ * @typedef {{handlers: !Array<!HandlerEntry>,
  *            protocol: string}}
  */
 let ProtocolEntry;
@@ -52,7 +50,7 @@
 
     /**
      * The targetted object for menu operations.
-     * @private {?Object}
+     * @private {?HandlerEntry}
      */
     actionMenuModel_: Object,
 
@@ -60,6 +58,12 @@
     toggleOffLabel: String,
     toggleOnLabel: String,
 
+    /**
+     * Array of ignored (blocked) protocols.
+     * @type {!Array<!HandlerEntry>}
+     */
+    ignoredProtocols: Array,
+
     // <if expr="chromeos">
     /** @private */
     settingsAppAvailable_: {
@@ -114,17 +118,6 @@
   },
 
   /**
-   * Returns whether the given index matches the default handler.
-   * @param {number} index The index to evaluate.
-   * @param {number} defaultHandler The default handler index.
-   * @return {boolean} Whether the item is default.
-   * @private
-   */
-  isDefault_: function(index, defaultHandler) {
-    return defaultHandler == index;
-  },
-
-  /**
    * Updates the main toggle to set it enabled/disabled.
    * @param {boolean} enabled The state to set.
    * @private
@@ -144,13 +137,21 @@
 
   /**
    * Updates the list of ignored protocol handlers.
-   * @param {!Array<!ProtocolEntry>} args The new (ignored) protocol handler
-   *     list.
+   * @param {!Array<!HandlerEntry>} ignoredProtocols The new (ignored) protocol
+   *     handler list.
    * @private
    */
-  setIgnoredProtocolHandlers_: function(args) {
-    // TODO(finnur): Figure this out. Have yet to be able to trigger the C++
-    // side to send this.
+  setIgnoredProtocolHandlers_: function(ignoredProtocols) {
+    this.ignoredProtocols = ignoredProtocols;
+  },
+
+  /**
+   * Closes action menu and resets action menu model
+   * @private
+   */
+  closeActionMenu_: function() {
+    this.$$('dialog[is=cr-action-menu]').close();
+    this.actionMenuModel_ = null;
   },
 
   /**
@@ -165,45 +166,38 @@
    * The handler for when "Set Default" is selected in the action menu.
    * @private
    */
-  onDefaultTap_: function() {
-    const item = this.actionMenuModel_.item;
-
-    this.$$('dialog[is=cr-action-menu]').close();
-    this.actionMenuModel_ = null;
+  onDefaultClick_: function() {
+    const item = this.actionMenuModel_;
     this.browserProxy.setProtocolDefault(item.protocol, item.spec);
+    this.closeActionMenu_();
   },
 
   /**
    * The handler for when "Remove" is selected in the action menu.
    * @private
    */
-  onRemoveTap_: function() {
-    const item = this.actionMenuModel_.item;
+  onRemoveClick_: function() {
+    const item = this.actionMenuModel_;
+    this.browserProxy.removeProtocolHandler(item.protocol, item.spec);
+    this.closeActionMenu_();
+  },
 
-    this.$$('dialog[is=cr-action-menu]').close();
-    this.actionMenuModel_ = null;
+  /**
+   * Handler for removing handlers that were blocked
+   * @private
+   */
+  onRemoveIgnored_: function(event) {
+    const item = event.model.item;
     this.browserProxy.removeProtocolHandler(item.protocol, item.spec);
   },
 
   /**
-   * Checks whether or not the selected actionMenuModel is the default handler
-   * for its protocol.
-   * @return {boolean} if actionMenuModel_ is default handler of its protocol.
-   */
-  isModelDefault_: function() {
-    return !!this.actionMenuModel_ &&
-        (this.actionMenuModel_.index ==
-         this.actionMenuModel_.protocol.default_handler);
-  },
-
-  /**
    * A handler to show the action menu next to the clicked menu button.
-   * @param {!{model: !{protocol: HandlerEntry, item: ProtocolEntry,
-   *     index: number}}} event
+   * @param {!{model: !{item: HandlerEntry}}} event
    * @private
    */
   showMenu_: function(event) {
-    this.actionMenuModel_ = event.model;
+    this.actionMenuModel_ = event.model.item;
     /** @type {!CrActionMenuElement} */ (this.$$('dialog[is=cr-action-menu]'))
         .showAt(
             /** @type {!Element} */ (
@@ -215,7 +209,7 @@
    * Opens an activity to handle App links (preferred apps).
    * @private
    */
-  onManageAndroidAppsTap_: function() {
+  onManageAndroidAppsClick_: function() {
     this.browserProxy.showAndroidManageAppLinks();
   },
   // </if>
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
index 0bfcff8..7974cfd 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
@@ -374,12 +374,12 @@
 
     /** @override */
     setProtocolDefault(protocol, url) {
-      chrome.send('setDefault', [[protocol, url]]);
+      chrome.send('setDefault', [protocol, url]);
     }
 
     /** @override */
     removeProtocolHandler(protocol, url) {
-      chrome.send('removeHandler', [[protocol, url]]);
+      chrome.send('removeHandler', [protocol, url]);
     }
 
     /** @override */
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
index 05a8b9d..933483f 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -22,7 +22,6 @@
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/db/database_manager.h"
 #include "components/safe_browsing/db/whitelist_checker_client.h"
 #include "components/safe_browsing/proto/csd.pb.h"
@@ -36,6 +35,7 @@
 #include "content/public/common/frame_navigate_params.h"
 #include "content/public/common/url_constants.h"
 #include "net/http/http_response_headers.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "url/gurl.h"
 
 using content::BrowserThread;
@@ -351,6 +351,9 @@
     database_manager_ = sb_service->database_manager();
     ui_manager_->AddObserver(this);
   }
+  registry_.AddInterface(base::BindRepeating(
+      &ClientSideDetectionHost::PhishingDetectorClientRequest,
+      base::Unretained(this)));
 }
 
 ClientSideDetectionHost::~ClientSideDetectionHost() {
@@ -358,16 +361,16 @@
     ui_manager_->RemoveObserver(this);
 }
 
-bool ClientSideDetectionHost::OnMessageReceived(
-    const IPC::Message& message,
-    content::RenderFrameHost* render_frame_host) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(ClientSideDetectionHost, message)
-    IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_PhishingDetectionDone,
-                        OnPhishingDetectionDone)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
+void ClientSideDetectionHost::PhishingDetectorClientRequest(
+    mojom::PhishingDetectorClientRequest request) {
+  phishing_detector_client_bindings_.AddBinding(this, std::move(request));
+}
+
+void ClientSideDetectionHost::OnInterfaceRequestFromFrame(
+    content::RenderFrameHost* render_frame_host,
+    const std::string& interface_name,
+    mojo::ScopedMessagePipeHandle* interface_pipe) {
+  registry_.TryBindInterface(interface_name, interface_pipe);
 }
 
 void ClientSideDetectionHost::DidFinishNavigation(
@@ -499,8 +502,9 @@
     DVLOG(1) << "Instruct renderer to start phishing detection for URL: "
              << browse_info_->url;
     content::RenderFrameHost* rfh = web_contents()->GetMainFrame();
-    rfh->Send(new SafeBrowsingMsg_StartPhishingDetection(rfh->GetRoutingID(),
-                                                         browse_info_->url));
+    safe_browsing::mojom::PhishingDetectorPtr phishing_detector;
+    rfh->GetRemoteInterfaces()->GetInterface(&phishing_detector);
+    phishing_detector->StartPhishingDetection(browse_info_->url);
   }
 }
 
@@ -549,7 +553,7 @@
   }
 }
 
-void ClientSideDetectionHost::OnPhishingDetectionDone(
+void ClientSideDetectionHost::PhishingDetectionDone(
     const std::string& verdict_str) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // There is something seriously wrong if there is no service class but
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.h b/chrome/browser/safe_browsing/client_side_detection_host.h
index 4161994..aa7d747 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.h
+++ b/chrome/browser/safe_browsing/client_side_detection_host.h
@@ -15,8 +15,11 @@
 #include "base/memory/ref_counted.h"
 #include "chrome/browser/safe_browsing/browser_feature_extractor.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
+#include "components/safe_browsing/common/safe_browsing.mojom.h"
 #include "components/safe_browsing/db/database_manager.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
 #include "url/gurl.h"
 
 namespace safe_browsing {
@@ -29,17 +32,14 @@
 // class which sends a ping to a server to validate the verdict.
 // TODO(noelutz): move all client-side detection IPCs to this class.
 class ClientSideDetectionHost : public content::WebContentsObserver,
-                                public SafeBrowsingUIManager::Observer {
+                                public SafeBrowsingUIManager::Observer,
+                                public mojom::PhishingDetectorClient {
  public:
   // The caller keeps ownership of the tab object and is responsible for
   // ensuring that it stays valid until WebContentsDestroyed is called.
   static ClientSideDetectionHost* Create(content::WebContents* tab);
   ~ClientSideDetectionHost() override;
 
-  // From content::WebContentsObserver.
-  bool OnMessageReceived(const IPC::Message& message,
-                         content::RenderFrameHost* render_frame_host) override;
-
   // From content::WebContentsObserver.  If we navigate away we cancel all
   // pending callbacks that could show an interstitial, and check to see whether
   // we should classify the new URL.
@@ -60,6 +60,12 @@
 
   BrowseInfo* GetBrowseInfo() const { return browse_info_.get(); }
 
+  // From content::WebContentsObserver.
+  void OnInterfaceRequestFromFrame(
+      content::RenderFrameHost* render_frame_host,
+      const std::string& interface_name,
+      mojo::ScopedMessagePipeHandle* interface_pipe) override;
+
  protected:
   explicit ClientSideDetectionHost(content::WebContents* tab);
 
@@ -80,12 +86,16 @@
   class ShouldClassifyUrlRequest;
   friend class ShouldClassifyUrlRequest;
 
+  void PhishingDetectorClientRequest(
+      mojom::PhishingDetectorClientRequest request);
+
   // Called when pre-classification checks are done for the phishing
   // classifiers.
   void OnPhishingPreClassificationDone(bool should_classify);
 
+  // mojom::PhishingDetectorClient
   // Verdict is an encoded ClientPhishingRequest protocol message.
-  void OnPhishingDetectionDone(const std::string& verdict);
+  void PhishingDetectionDone(const std::string& verdict) override;
 
   // Callback that is called when the server ping back is
   // done. Display an interstitial if |is_phishing| is true.
@@ -170,6 +180,11 @@
   int unsafe_unique_page_id_;
   std::unique_ptr<security_interstitials::UnsafeResource> unsafe_resource_;
 
+  mojo::BindingSet<mojom::PhishingDetectorClient>
+      phishing_detector_client_bindings_;
+
+  service_manager::BinderRegistry registry_;
+
   base::WeakPtrFactory<ClientSideDetectionHost> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ClientSideDetectionHost);
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
index 1f7de9cd..624c413 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -22,7 +22,6 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/db/database_manager.h"
 #include "components/safe_browsing/db/test_database_manager.h"
 #include "components/safe_browsing/proto/csd.pb.h"
@@ -206,12 +205,65 @@
 
 }  // namespace
 
+class FakePhishingDetector : public mojom::PhishingDetector {
+ public:
+  FakePhishingDetector() = default;
+
+  ~FakePhishingDetector() override = default;
+
+  void BindRequest(mojo::ScopedMessagePipeHandle handle) {
+    bindings_.AddBinding(this,
+                         mojom::PhishingDetectorRequest(std::move(handle)));
+  }
+
+  // mojom::PhishingDetector
+  void StartPhishingDetection(const GURL& url) override {
+    url_ = url;
+    phishing_detection_started_ = true;
+    return;
+  }
+
+  void CheckMessage(const GURL* url) {
+    if (!url) {
+      EXPECT_FALSE(phishing_detection_started_);
+    } else {
+      ASSERT_TRUE(phishing_detection_started_);
+      EXPECT_EQ(*url, url_);
+    }
+  }
+
+  void Reset() {
+    phishing_detection_started_ = false;
+    url_ = GURL();
+  }
+
+ private:
+  mojo::BindingSet<mojom::PhishingDetector> bindings_;
+  bool phishing_detection_started_ = false;
+  GURL url_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakePhishingDetector);
+};
+
 class ClientSideDetectionHostTest : public ChromeRenderViewHostTestHarness {
  public:
   typedef security_interstitials::UnsafeResource UnsafeResource;
 
+  void InitTestApi() {
+    service_manager::InterfaceProvider* remote_interfaces =
+        web_contents()->GetMainFrame()->GetRemoteInterfaces();
+
+    service_manager::InterfaceProvider::TestApi test_api(remote_interfaces);
+
+    test_api.SetBinderForName(
+        mojom::PhishingDetector::Name_,
+        base::BindRepeating(&FakePhishingDetector::BindRequest,
+                            base::Unretained(&fake_phishing_detector_)));
+  }
+
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
+    InitTestApi();
 
     // Inject service classes.
     csd_service_.reset(new StrictMock<MockClientSideDetectionService>());
@@ -246,8 +298,8 @@
     return mock_profile_;
   }
 
-  void OnPhishingDetectionDone(const std::string& verdict_str) {
-    csd_host_->OnPhishingDetectionDone(verdict_str);
+  void PhishingDetectionDone(const std::string& verdict_str) {
+    csd_host_->PhishingDetectionDone(verdict_str);
   }
 
   void DidStopLoading() { csd_host_->DidStopLoading(); }
@@ -324,21 +376,6 @@
     EXPECT_EQ(should_classify, csd_host_->should_classify_for_malware_);
   }
 
-  void ExpectStartPhishingDetection(const GURL* url) {
-    const IPC::Message* msg = process()->sink().GetFirstMessageMatching(
-        SafeBrowsingMsg_StartPhishingDetection::ID);
-    if (url) {
-      ASSERT_TRUE(msg);
-      std::tuple<GURL> actual_url;
-      SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url);
-      EXPECT_EQ(*url, std::get<0>(actual_url));
-      EXPECT_EQ(main_rfh()->GetRoutingID(), msg->routing_id());
-      process()->sink().ClearMessages();
-    } else {
-      ASSERT_FALSE(msg);
-    }
-  }
-
   void TestUnsafeResourceCopied(const UnsafeResource& resource) {
     ASSERT_TRUE(csd_host_->unsafe_resource_.get());
     // Test that the resource from OnSafeBrowsingHit notification was copied
@@ -443,9 +480,10 @@
   scoped_refptr<StrictMock<MockSafeBrowsingUIManager> > ui_manager_;
   scoped_refptr<StrictMock<MockSafeBrowsingDatabaseManager> > database_manager_;
   MockTestingProfile* mock_profile_;  // We don't own this object
+  FakePhishingDetector fake_phishing_detector_;
 };
 
-TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneInvalidVerdict) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneInvalidVerdict) {
   // Case 0: renderer sends an invalid verdict string that we're unable to
   // parse.
   MockBrowserFeatureExtractor* mock_extractor =
@@ -454,11 +492,11 @@
           csd_host_.get());
   SetFeatureExtractor(mock_extractor);  // The host class takes ownership.
   EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
-  OnPhishingDetectionDone("Invalid Protocol Buffer");
+  PhishingDetectionDone("Invalid Protocol Buffer");
   EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
 }
 
-TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneNotPhishing) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneNotPhishing) {
   // Case 1: client thinks the page is phishing.  The server does not agree.
   // No interstitial is shown.
   MockBrowserFeatureExtractor* mock_extractor =
@@ -479,7 +517,7 @@
               SendClientReportPhishingRequest(
                   Pointee(PartiallyEqualVerdict(verdict)), _, _))
       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<2>(&cb)));
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
   ASSERT_FALSE(cb.is_null());
 
@@ -490,7 +528,7 @@
   EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
 }
 
-TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneDisabled) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneDisabled) {
   // Case 2: client thinks the page is phishing and so does the server but
   // showing the interstitial is disabled => no interstitial is shown.
   MockBrowserFeatureExtractor* mock_extractor =
@@ -511,7 +549,7 @@
               SendClientReportPhishingRequest(
                   Pointee(PartiallyEqualVerdict(verdict)), _, _))
       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<2>(&cb)));
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
   ASSERT_FALSE(cb.is_null());
 
@@ -522,7 +560,7 @@
   EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
 }
 
-TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneShowInterstitial) {
   // Case 3: client thinks the page is phishing and so does the server.
   // We show an interstitial.
   MockBrowserFeatureExtractor* mock_extractor =
@@ -544,7 +582,7 @@
               SendClientReportPhishingRequest(
                   Pointee(PartiallyEqualVerdict(verdict)), _, _))
       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<2>(&cb)));
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
   ASSERT_FALSE(cb.is_null());
@@ -570,7 +608,7 @@
                      ui_manager_, resource.callback));
 }
 
-TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneMultiplePings) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneMultiplePings) {
   // Case 4 & 5: client thinks a page is phishing then navigates to
   // another page which is also considered phishing by the client
   // before the server responds with a verdict.  After a while the
@@ -595,7 +633,7 @@
               SendClientReportPhishingRequest(
                   Pointee(PartiallyEqualVerdict(verdict)), _, _))
       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<2>(&cb)));
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
   ASSERT_FALSE(cb.is_null());
@@ -625,7 +663,7 @@
   std::vector<GURL> redirect_chain;
   redirect_chain.push_back(other_phishing_url);
   SetRedirectChain(redirect_chain);
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   base::RunLoop().Run();
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
@@ -656,8 +694,7 @@
                      ui_manager_, resource.callback));
 }
 
-TEST_F(ClientSideDetectionHostTest,
-       OnPhishingDetectionDoneVerdictNotPhishing) {
+TEST_F(ClientSideDetectionHostTest, PhishingDetectionDoneVerdictNotPhishing) {
   // Case 6: renderer sends a verdict string that isn't phishing.
   MockBrowserFeatureExtractor* mock_extractor =
       new StrictMock<MockBrowserFeatureExtractor>(
@@ -671,12 +708,12 @@
   verdict.set_is_phishing(false);
 
   EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
 }
 
 TEST_F(ClientSideDetectionHostTest,
-       OnPhishingDetectionDoneVerdictNotPhishingButSBMatchSubResource) {
+       PhishingDetectionDoneVerdictNotPhishingButSBMatchSubResource) {
   // Case 7: renderer sends a verdict string that isn't phishing but the URL
   // of a subresource was on the regular phishing or malware lists.
   GURL url("http://not-phishing.com/");
@@ -699,13 +736,13 @@
   std::vector<GURL> redirect_chain;
   redirect_chain.push_back(url);
   SetRedirectChain(redirect_chain);
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   base::RunLoop().Run();
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
 }
 
 TEST_F(ClientSideDetectionHostTest,
-       OnPhishingDetectionDoneVerdictNotPhishingButSBMatchOnNewRVH) {
+       PhishingDetectionDoneVerdictNotPhishingButSBMatchOnNewRVH) {
   // When navigating to a different host (thus creating a pending RVH) which
   // matches regular malware list, and after navigation the renderer sends a
   // verdict string that isn't phishing, we should still send the report.
@@ -737,7 +774,7 @@
   std::vector<GURL> redirect_chain;
   redirect_chain.push_back(url);
   SetRedirectChain(redirect_chain);
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   base::RunLoop().Run();
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
 
@@ -749,7 +786,7 @@
 
 TEST_F(
     ClientSideDetectionHostTest,
-    OnPhishingDetectionDoneVerdictNotPhishingButSBMatchOnSubresourceWhileNavPending) {
+    PhishingDetectionDoneVerdictNotPhishingButSBMatchOnSubresourceWhileNavPending) {
   // When a malware hit happens on a committed page while a slow pending load is
   // in progress, the csd report should be sent for the committed page.
 
@@ -793,7 +830,7 @@
   std::vector<GURL> redirect_chain;
   redirect_chain.push_back(url);
   SetRedirectChain(redirect_chain);
-  OnPhishingDetectionDone(verdict.SerializeAsString());
+  PhishingDetectionDone(verdict.SerializeAsString());
   base::RunLoop().Run();
   EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
 }
@@ -967,7 +1004,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -979,7 +1016,8 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
+  fake_phishing_detector_.Reset();
   ExpectShouldClassifyForMalwareResult(true);
 
   // Now try an same-document navigation.  This should not trigger an IPC.
@@ -990,7 +1028,7 @@
   NavigateAndCommit(inpage);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1004,7 +1042,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1016,16 +1054,19 @@
   NavigateAndCommit(url1);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url1);
+  fake_phishing_detector_.CheckMessage(&url1);
   ExpectShouldClassifyForMalwareResult(true);
 
   GURL url2("http://host2.com/");
   ExpectPreClassificationChecks(url2, &kFalse, &kFalse, &kFalse, &kFalse,
                                 &kFalse, &kFalse, &kFalse);
   NavigateAndCommit(url2);
+  // Re-override the binder for PhishingDetector because navigation causes
+  // a new web InterfaceProvider to be created
+  InitTestApi();
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url2);
+  fake_phishing_detector_.CheckMessage(&url2);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1044,7 +1085,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1056,9 +1097,8 @@
                                 NULL);
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
-  const IPC::Message* msg = process()->sink().GetFirstMessageMatching(
-      SafeBrowsingMsg_StartPhishingDetection::ID);
-  ASSERT_FALSE(msg);
+
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(false);
 }
 
@@ -1071,7 +1111,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(false);
 }
 
@@ -1084,7 +1124,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1097,7 +1137,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1111,7 +1151,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1125,7 +1165,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1137,7 +1177,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(false);
 }
 
@@ -1149,7 +1189,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(false);
 }
 
@@ -1160,7 +1200,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(&url);
+  fake_phishing_detector_.CheckMessage(&url);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1172,7 +1212,7 @@
   NavigateAndCommit(url);
   WaitAndCheckPreClassificationChecks();
 
-  ExpectStartPhishingDetection(NULL);
+  fake_phishing_detector_.CheckMessage(NULL);
   ExpectShouldClassifyForMalwareResult(true);
 }
 
@@ -1192,8 +1232,7 @@
   EXPECT_EQ(url, resource.url);
   EXPECT_EQ(url, resource.original_url);
 
-  ExpectStartPhishingDetection(NULL);
-
+  fake_phishing_detector_.CheckMessage(NULL);
   // Showing a phishing warning will invalidate all the weak pointers which
   // means we will not extract malware features.
   ExpectShouldClassifyForMalwareResult(false);
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
index ed6adcc2..6f1c361 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
@@ -19,13 +19,15 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_service.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/common/constants.mojom.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/safe_browsing/client_model.pb.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/prefs/pref_service.h"
+#include "components/safe_browsing/common/safe_browsing.mojom.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
@@ -42,6 +44,7 @@
 #include "net/url_request/url_fetcher.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_status.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "url/gurl.h"
 
 using content::BrowserThread;
@@ -245,7 +248,17 @@
     DVLOG(2) << "Disabling client-side phishing detection for "
              << "RenderProcessHost @" << process;
   }
-  process->Send(new SafeBrowsingMsg_SetPhishingModel(model));
+  safe_browsing::mojom::PhishingModelSetterPtr phishing;
+  // Null in unit tests.
+  if (!ChromeService::GetInstance()->connector()) {
+    return;
+  }
+  ChromeService::GetInstance()->connector()->BindInterface(
+      service_manager::Identity(chrome::mojom::kRendererServiceName,
+                                process->GetChildIdentity().user_id(),
+                                process->GetChildIdentity().instance()),
+      &phishing);
+  phishing->SetPhishingModel(model);
 }
 
 void ClientSideDetectionService::SendModelToRenderers() {
diff --git a/chrome/browser/safe_browsing/client_side_model_loader.cc b/chrome/browser/safe_browsing/client_side_model_loader.cc
index f10c9954..b225475a 100644
--- a/chrome/browser/safe_browsing/client_side_model_loader.cc
+++ b/chrome/browser/safe_browsing/client_side_model_loader.cc
@@ -12,12 +12,12 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/browser/safe_browsing/protocol_manager.h"
 #include "chrome/common/safe_browsing/client_model.pb.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/variations_associated_data.h"
 #include "net/base/load_flags.h"
diff --git a/chrome/browser/sessions/persistent_tab_restore_service_unittest.cc b/chrome/browser/sessions/persistent_tab_restore_service_unittest.cc
index 9489943..efca2921 100644
--- a/chrome/browser/sessions/persistent_tab_restore_service_unittest.cc
+++ b/chrome/browser/sessions/persistent_tab_restore_service_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/sessions/chrome_tab_restore_service_client.h"
 #include "chrome/browser/sessions/session_service.h"
@@ -40,6 +41,7 @@
 #include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+typedef sessions::TabRestoreService::Entry Entry;
 typedef sessions::TabRestoreService::Tab Tab;
 typedef sessions::TabRestoreService::Window Window;
 
@@ -204,8 +206,6 @@
   bool got_loaded() const { return got_loaded_; }
 
   // TabRestoreServiceObserver:
-  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override {
-  }
   void TabRestoreServiceDestroyed(
       sessions::TabRestoreService* service) override {}
   void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override {
@@ -231,7 +231,7 @@
   ASSERT_EQ(1U, service_->entries().size());
 
   // Make sure the entry matches.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
   Tab* tab = static_cast<Tab*>(entry);
   EXPECT_FALSE(tab->pinned);
@@ -290,8 +290,7 @@
   ASSERT_EQ(1U, service_->entries().size());
 
   // And verify the entry.
-  sessions::PersistentTabRestoreService::Entry* entry =
-      service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
   Tab* tab = static_cast<Tab*>(entry);
   EXPECT_FALSE(tab->pinned);
@@ -316,7 +315,7 @@
 
   // We have to explicitly mark the tab as pinned as there is no browser for
   // these tests.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
   Tab* tab = static_cast<Tab*>(entry);
   tab->pinned = true;
@@ -342,6 +341,91 @@
   EXPECT_TRUE(extension_app_id == tab->extension_app_id);
 }
 
+// Tests deleting entries.
+TEST_F(PersistentTabRestoreServiceTest, DeleteNavigationEntries) {
+  SynchronousLoadTabsFromLastSession();
+  AddThreeNavigations();
+
+  // Have the service record the tab.
+  service_->CreateHistoricalTab(live_tab(), -1);
+
+  service_->DeleteNavigationEntries(
+      base::BindLambdaForTesting([&](const SerializedNavigationEntry& entry) {
+        return entry.virtual_url() == url2_;
+      }));
+
+  // The entry should still exist but url2_ was removed and indices adjusted.
+  ASSERT_EQ(1U, service_->entries().size());
+  Entry* entry = service_->entries().front().get();
+  ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
+  Tab* tab = static_cast<Tab*>(entry);
+  ASSERT_EQ(2U, tab->navigations.size());
+  EXPECT_EQ(url1_, tab->navigations[0].virtual_url());
+  EXPECT_EQ(0, tab->navigations[0].index());
+  EXPECT_EQ(url3_, tab->navigations[1].virtual_url());
+  EXPECT_EQ(1, tab->navigations[1].index());
+  EXPECT_EQ(1, tab->current_navigation_index);
+
+  service_->DeleteNavigationEntries(base::BindRepeating(
+      [](const SerializedNavigationEntry& entry) { return true; }));
+
+  // The entry should be removed.
+  EXPECT_EQ(0U, service_->entries().size());
+}
+
+// Tests deleting entries.
+TEST_F(PersistentTabRestoreServiceTest, DeleteCurrentEntry) {
+  SynchronousLoadTabsFromLastSession();
+  AddThreeNavigations();
+
+  // Have the service record the tab.
+  service_->CreateHistoricalTab(live_tab(), -1);
+
+  service_->DeleteNavigationEntries(
+      base::BindLambdaForTesting([&](const SerializedNavigationEntry& entry) {
+        return entry.virtual_url() == url3_;
+      }));
+
+  // The entry should be deleted because the current url was deleted.
+  EXPECT_EQ(0U, service_->entries().size());
+}
+
+// Tests deleting entries.
+TEST_F(PersistentTabRestoreServiceTest, DeleteEntriesAndRecreate) {
+  SynchronousLoadTabsFromLastSession();
+  AddThreeNavigations();
+
+  // Have the service record the tab.
+  service_->CreateHistoricalTab(live_tab(), -1);
+
+  // Delete the navigation for url2_.
+  service_->DeleteNavigationEntries(
+      base::BindLambdaForTesting([&](const SerializedNavigationEntry& entry) {
+        return entry.virtual_url() == url2_;
+      }));
+  // Recreate the service and have it load the tabs.
+  RecreateService();
+  // The entry should still exist but url2_ was removed and indices adjusted.
+  ASSERT_EQ(1U, service_->entries().size());
+  Entry* entry = service_->entries().front().get();
+  ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
+  Tab* tab = static_cast<Tab*>(entry);
+  ASSERT_EQ(2U, tab->navigations.size());
+  EXPECT_EQ(url1_, tab->navigations[0].virtual_url());
+  EXPECT_EQ(0, tab->navigations[0].index());
+  EXPECT_EQ(url3_, tab->navigations[1].virtual_url());
+  EXPECT_EQ(1, tab->navigations[1].index());
+  EXPECT_EQ(1, tab->current_navigation_index);
+
+  // Delete all entries.
+  service_->DeleteNavigationEntries(base::BindRepeating(
+      [](const SerializedNavigationEntry& entry) { return true; }));
+  // Recreate the service and have it load the tabs.
+  RecreateService();
+  // The entry should be removed.
+  ASSERT_EQ(0U, service_->entries().size());
+}
+
 // Make sure we persist entries to disk that have post data.
 TEST_F(PersistentTabRestoreServiceTest, DontPersistPostData) {
   AddThreeNavigations();
@@ -359,8 +443,7 @@
   // One entry should be created.
   ASSERT_EQ(1U, service_->entries().size());
 
-  const sessions::TabRestoreService::Entry* restored_entry =
-      service_->entries().front().get();
+  const Entry* restored_entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, restored_entry->type);
 
   const Tab* restored_tab =
@@ -407,8 +490,7 @@
 
   // Make sure we get back one entry with one tab whose url is url1.
   ASSERT_EQ(1U, service_->entries().size());
-  sessions::TabRestoreService::Entry* entry2 =
-      service_->entries().front().get();
+  Entry* entry2 = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::WINDOW, entry2->type);
   sessions::TabRestoreService::Window* window =
       static_cast<sessions::TabRestoreService::Window*>(entry2);
@@ -467,7 +549,7 @@
   // the tab restore service. The previous session entry should be first.
   ASSERT_EQ(2U, service_->entries().size());
   // The first entry should come from the session service.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::WINDOW, entry->type);
   sessions::TabRestoreService::Window* window =
       static_cast<sessions::TabRestoreService::Window*>(entry);
@@ -521,7 +603,7 @@
   ASSERT_EQ(2U, service_->entries().size());
 
   // The first entry should come from the session service.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::WINDOW, entry->type);
   sessions::TabRestoreService::Window* window =
       static_cast<sessions::TabRestoreService::Window*>(entry);
@@ -564,7 +646,7 @@
   // the tab restore service. The previous session entry should be first.
   ASSERT_EQ(2U, service_->entries().size());
   // The first entry should come from the session service.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::WINDOW, entry->type);
   sessions::TabRestoreService::Window* window =
       static_cast<sessions::TabRestoreService::Window*>(entry);
@@ -609,7 +691,7 @@
   ASSERT_EQ(static_cast<size_t>(kMaxEntries), service_->entries().size());
 
   // The first entry should come from the session service.
-  sessions::TabRestoreService::Entry* entry = service_->entries().front().get();
+  Entry* entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::WINDOW, entry->type);
   sessions::TabRestoreService::Window* window =
       static_cast<sessions::TabRestoreService::Window*>(entry);
@@ -638,8 +720,7 @@
   std::vector<SerializedNavigationEntry> old_navigations;
   {
     // |entry|/|tab| doesn't survive after RecreateService().
-    sessions::TabRestoreService::Entry* entry =
-        service_->entries().front().get();
+    Entry* entry = service_->entries().front().get();
     ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
     Tab* tab = static_cast<Tab*>(entry);
     tab->timestamp = tab_timestamp;
@@ -660,8 +741,7 @@
   ASSERT_EQ(1U, service_->entries().size());
 
   // And verify the entry.
-  sessions::TabRestoreService::Entry* restored_entry =
-      service_->entries().front().get();
+  Entry* restored_entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, restored_entry->type);
   Tab* restored_tab =
       static_cast<Tab*>(restored_entry);
@@ -688,8 +768,7 @@
   std::vector<sessions::SerializedNavigationEntry> old_navigations;
   {
     // |entry|/|tab| doesn't survive after RecreateService().
-    sessions::TabRestoreService::Entry* entry =
-        service_->entries().front().get();
+    Entry* entry = service_->entries().front().get();
     ASSERT_EQ(sessions::TabRestoreService::TAB, entry->type);
     Tab* tab = static_cast<Tab*>(entry);
     old_navigations = tab->navigations;
@@ -709,8 +788,7 @@
   ASSERT_EQ(1U, service_->entries().size());
 
   // And verify the entry.
-  sessions::TabRestoreService::Entry* restored_entry =
-      service_->entries().front().get();
+  Entry* restored_entry = service_->entries().front().get();
   ASSERT_EQ(sessions::TabRestoreService::TAB, restored_entry->type);
   Tab* restored_tab =
       static_cast<Tab*>(restored_entry);
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index 082b2f2..5f67ee4 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -16,6 +16,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/process/launch.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -855,6 +856,33 @@
             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
 }
 
+IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreAfterDelete) {
+  ui_test_utils::NavigateToURL(browser(), url1_);
+  ui_test_utils::NavigateToURL(browser(), url2_);
+  ui_test_utils::NavigateToURL(browser(), url3_);
+
+  content::NavigationController& controller =
+      browser()->tab_strip_model()->GetActiveWebContents()->GetController();
+  // Three urls and the NTP.
+  EXPECT_EQ(4, controller.GetEntryCount());
+  controller.DeleteNavigationEntries(
+      base::BindLambdaForTesting([&](const content::NavigationEntry& entry) {
+        return entry.GetURL() == url2_;
+      }));
+  EXPECT_EQ(3, controller.GetEntryCount());
+
+  Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
+  content::NavigationController& new_controller =
+      new_browser->tab_strip_model()->GetActiveWebContents()->GetController();
+  EXPECT_EQ(3, new_controller.GetEntryCount());
+  ASSERT_EQ(1u, active_browser_list_->size());
+  ASSERT_EQ(url3_,
+            new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
+  GoBack(new_browser);
+  ASSERT_EQ(url1_,
+            new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
+}
+
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, StartupPagesWithOnlyNtp) {
   ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
   SessionStartupPref pref(SessionStartupPref::URLS);
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc
index 3b09cc30..bda4047 100644
--- a/chrome/browser/sessions/session_service.cc
+++ b/chrome/browser/sessions/session_service.cc
@@ -75,6 +75,7 @@
       has_open_trackable_browsers_(false),
       move_on_new_browser_(false),
       force_browser_not_alive_with_no_windows_(false),
+      rebuild_on_next_save_(false),
       weak_factory_(this) {
   // We should never be created when incognito.
   DCHECK(!profile->IsOffTheRecord());
@@ -242,6 +243,11 @@
   if (!ShouldTrackChangesToWindow(window_id))
     return;
 
+  // If Chrome is closed immediately after a history deletion, we have to
+  // rebuild commands before this window is closed, otherwise these tabs would
+  // be lost.
+  RebuildCommandsIfRequired();
+
   // The window is about to close. If there are other tabbed browsers with the
   // same original profile commit the close immediately.
   //
@@ -404,6 +410,17 @@
       sessions::CreateTabNavigationPathPrunedFromFrontCommand(tab_id, count));
 }
 
+void SessionService::TabNavigationPathEntriesDeleted(const SessionID& window_id,
+                                                     const SessionID& tab_id) {
+  if (!ShouldTrackChangesToWindow(window_id))
+    return;
+
+  // Multiple tabs might be affected by this deletion, so the rebuild is
+  // delayed until next save.
+  rebuild_on_next_save_ = true;
+  base_session_service_->StartSaveTimer();
+}
+
 void SessionService::UpdateTabNavigation(
     const SessionID& window_id,
     const SessionID& tab_id,
@@ -508,6 +525,16 @@
   return should_use_delayed_save_;
 }
 
+void SessionService::OnWillSaveCommands() {
+  RebuildCommandsIfRequired();
+}
+
+void SessionService::RebuildCommandsIfRequired() {
+  if (rebuild_on_next_save_ && pending_window_close_ids_.empty()) {
+    ScheduleResetCommands();
+  }
+}
+
 void SessionService::Init() {
   BrowserList::AddObserver(this);
 }
@@ -732,6 +759,7 @@
   base_session_service_->ClearPendingCommands();
   tab_to_available_range_.clear();
   windows_tracking_.clear();
+  rebuild_on_next_save_ = false;
   BuildCommandsFromBrowsers(&tab_to_available_range_,
                             &windows_tracking_);
   if (!windows_tracking_.empty()) {
diff --git a/chrome/browser/sessions/session_service.h b/chrome/browser/sessions/session_service.h
index c78ccb31..4961a2b 100644
--- a/chrome/browser/sessions/session_service.h
+++ b/chrome/browser/sessions/session_service.h
@@ -174,6 +174,11 @@
                                         const SessionID& tab_id,
                                         int count);
 
+  // Invoked when the NavigationController has deleted entries because of a
+  // history deletion.
+  void TabNavigationPathEntriesDeleted(const SessionID& window_id,
+                                       const SessionID& tab_id);
+
   // Updates the navigation entry for the specified tab.
   void UpdateTabNavigation(
       const SessionID& window_id,
@@ -217,6 +222,7 @@
 
   // BaseSessionServiceDelegate:
   bool ShouldUseDelayedSave() override;
+  void OnWillSaveCommands() override;
 
  private:
   // Allow tests to access our innards for testing purposes.
@@ -308,6 +314,9 @@
   // Returns true if we track changes to the specified browser.
   bool ShouldTrackBrowser(Browser* browser) const;
 
+  // Will rebuild session commands if rebuild_on_next_save_ is true.
+  void RebuildCommandsIfRequired();
+
   // Call when certain session relevant notifications
   // (tab_closed, nav_list_pruned) occur.  In addition, this is
   // currently called when Save() is called to compare how often the
@@ -374,6 +383,9 @@
   // without quitting.
   bool force_browser_not_alive_with_no_windows_;
 
+  // Force session commands to be rebuild before next save event.
+  bool rebuild_on_next_save_;
+
   base::WeakPtrFactory<SessionService> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(SessionService);
diff --git a/chrome/browser/sessions/session_tab_helper.cc b/chrome/browser/sessions/session_tab_helper.cc
index 5595366..a5d23d8 100644
--- a/chrome/browser/sessions/session_tab_helper.cc
+++ b/chrome/browser/sessions/session_tab_helper.cc
@@ -94,6 +94,15 @@
   }
 }
 
+void SessionTabHelper::NavigationEntriesDeleted() {
+  SessionService* session_service = SessionServiceFactory::GetForProfile(
+      Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
+  if (!session_service)
+    return;
+
+  session_service->TabNavigationPathEntriesDeleted(window_id(), session_id());
+}
+
 void SessionTabHelper::NavigationEntryChanged(
     const content::EntryChangedDetails& change_details) {
   SessionService* session_service = SessionServiceFactory::GetForProfile(
diff --git a/chrome/browser/sessions/session_tab_helper.h b/chrome/browser/sessions/session_tab_helper.h
index cf73a0c..98d0692 100644
--- a/chrome/browser/sessions/session_tab_helper.h
+++ b/chrome/browser/sessions/session_tab_helper.h
@@ -51,6 +51,7 @@
       const content::LoadCommittedDetails& load_details) override;
   void NavigationListPruned(
       const content::PrunedDetails& pruned_details) override;
+  void NavigationEntriesDeleted() override;
   void NavigationEntryChanged(
       const content::EntryChangedDetails& change_details) override;
 #endif
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc
index 4610e274..9bdc4f0 100644
--- a/chrome/browser/sessions/tab_restore_browsertest.cc
+++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -71,8 +71,6 @@
 
  private:
   // Overridden from TabRestoreServiceObserver:
-  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override {
-  }
   void TabRestoreServiceDestroyed(
       sessions::TabRestoreService* service) override {}
   void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override {
diff --git a/chrome/browser/ssl/connection_help_tab_helper.cc b/chrome/browser/ssl/connection_help_tab_helper.cc
new file mode 100644
index 0000000..f332856
--- /dev/null
+++ b/chrome/browser/ssl/connection_help_tab_helper.cc
@@ -0,0 +1,87 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ssl/connection_help_tab_helper.h"
+
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_switches.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/referrer.h"
+#include "net/base/net_errors.h"
+#include "url/gurl.h"
+
+namespace {
+const char kHelpCenterConnectionHelpUrl[] =
+    "https://support.google.com/chrome/answer/6098869/";
+const char kBundledConnectionHelpUrl[] = "chrome://connection-help";
+
+void MaybeRedirectToBundledHelp(content::WebContents* web_contents) {
+  if (base::FeatureList::IsEnabled(features::kBundledConnectionHelpFeature)) {
+    web_contents->GetController().LoadURL(
+        GURL(kBundledConnectionHelpUrl), content::Referrer(),
+        ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string());
+  }
+}
+}  // namespace
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(ConnectionHelpTabHelper);
+
+ConnectionHelpTabHelper::~ConnectionHelpTabHelper() {}
+
+void ConnectionHelpTabHelper::DidAttachInterstitialPage() {
+  if (web_contents()->GetURL() == GetHelpCenterURL()) {
+    UMA_HISTOGRAM_ENUMERATION(
+        "SSL.CertificateErrorHelpCenterVisited",
+        ConnectionHelpTabHelper::LearnMoreClickResult::kFailedWithInterstitial,
+        ConnectionHelpTabHelper::LearnMoreClickResult::kLearnMoreResultCount);
+    MaybeRedirectToBundledHelp(web_contents());
+  }
+}
+
+void ConnectionHelpTabHelper::DidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (web_contents()->GetURL() == GetHelpCenterURL()) {
+    LearnMoreClickResult histogram_value;
+    if (navigation_handle->IsErrorPage()) {
+      if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+              switches::kCommittedInterstitials) &&
+          net::IsCertificateError(navigation_handle->GetNetErrorCode())) {
+        // When committed interstitials are enabled, DidAttachInterstitialPage
+        // does not get called, so check if this navigation resulted in an SSL
+        // error.
+        histogram_value = ConnectionHelpTabHelper::LearnMoreClickResult::
+            kFailedWithInterstitial;
+        MaybeRedirectToBundledHelp(web_contents());
+      } else {
+        histogram_value =
+            ConnectionHelpTabHelper::LearnMoreClickResult::kFailedOther;
+      }
+    } else {
+      histogram_value =
+          ConnectionHelpTabHelper::LearnMoreClickResult::kSucceeded;
+    }
+    UMA_HISTOGRAM_ENUMERATION(
+        "SSL.CertificateErrorHelpCenterVisited", histogram_value,
+        ConnectionHelpTabHelper::LearnMoreClickResult::kLearnMoreResultCount);
+  }
+}
+
+void ConnectionHelpTabHelper::SetHelpCenterUrlForTesting(const GURL& url) {
+  testing_url_ = url;
+}
+
+ConnectionHelpTabHelper::ConnectionHelpTabHelper(
+    content::WebContents* web_contents)
+    : content::WebContentsObserver(web_contents) {}
+
+GURL ConnectionHelpTabHelper::GetHelpCenterURL() {
+  if (testing_url_.is_valid())
+    return testing_url_;
+  return GURL(kHelpCenterConnectionHelpUrl);
+}
diff --git a/chrome/browser/ssl/connection_help_tab_helper.h b/chrome/browser/ssl/connection_help_tab_helper.h
new file mode 100644
index 0000000..c3bece37
--- /dev/null
+++ b/chrome/browser/ssl/connection_help_tab_helper.h
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SSL_CONNECTION_HELP_TAB_HELPER_H_
+#define CHROME_BROWSER_SSL_CONNECTION_HELP_TAB_HELPER_H_
+
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+class GURL;
+
+namespace content {
+class NavigationHandle;
+}  // namespace content
+
+// ConnectionHelpTabHelper checks URLs that trigger certificate error
+// interstitials, and if a URL matches the connection help page of the help
+// center, it redirects to chrome://connection-help. This allows users to view
+// help content for certificate errors even when a certificate error is
+// preventing them from accessing the live help center site.
+class ConnectionHelpTabHelper
+    : public content::WebContentsObserver,
+      public content::WebContentsUserData<ConnectionHelpTabHelper> {
+ public:
+  // Used to record the SSL.CertificateErrorLearnMoreLinkClicked histogram,
+  // do not reorder. Exposed for testing.
+  enum LearnMoreClickResult {
+    kSucceeded = 0,
+    kFailedWithInterstitial = 1,
+    kFailedOther = 2,
+    kLearnMoreResultCount = 3
+  };
+
+  ~ConnectionHelpTabHelper() override;
+
+  // WebContentsObserver:
+  void DidAttachInterstitialPage() override;
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
+
+  // Sets an alternate Help Center URL (the URL that will trigger the redirect)
+  // for using in tests.
+  void SetHelpCenterUrlForTesting(const GURL& url);
+
+ private:
+  friend class content::WebContentsUserData<ConnectionHelpTabHelper>;
+  explicit ConnectionHelpTabHelper(content::WebContents* web_contents);
+
+  GURL GetHelpCenterURL();
+
+  GURL testing_url_;
+  DISALLOW_COPY_AND_ASSIGN(ConnectionHelpTabHelper);
+};
+#endif  // CHROME_BROWSER_SSL_CONNECTION_HELP_TAB_HELPER_H_
diff --git a/chrome/browser/ssl/connection_help_tab_helper_browsertest.cc b/chrome/browser/ssl/connection_help_tab_helper_browsertest.cc
new file mode 100644
index 0000000..3a9e752a
--- /dev/null
+++ b/chrome/browser/ssl/connection_help_tab_helper_browsertest.cc
@@ -0,0 +1,203 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ssl/connection_help_tab_helper.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_navigator.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "net/base/net_errors.h"
+#include "net/cert/cert_status_flags.h"
+#include "net/cert/cert_verify_result.h"
+#include "net/dns/mock_host_resolver.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "url/gurl.h"
+
+class ConnectionHelpTabHelperTest : public InProcessBrowserTest,
+                                    public testing::WithParamInterface<bool> {
+ public:
+  ConnectionHelpTabHelperTest()
+      : https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
+        https_expired_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
+
+  void SetUpOnMainThread() override {
+    https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
+    https_expired_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
+    https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
+    https_expired_server_.ServeFilesFromSourceDirectory("chrome/test/data");
+    ASSERT_TRUE(https_server_.Start());
+    ASSERT_TRUE(https_expired_server_.Start());
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    if (GetParam()) {
+      command_line->AppendSwitch(switches::kCommittedInterstitials);
+    }
+  }
+
+ protected:
+  bool AreCommittedInterstitialsEnabled() {
+    return base::CommandLine::ForCurrentProcess()->HasSwitch(
+        switches::kCommittedInterstitials);
+  }
+
+  void SetHelpCenterUrl(Browser* browser, const GURL& url) {
+    ConnectionHelpTabHelper::FromWebContents(
+        browser->tab_strip_model()->GetActiveWebContents())
+        ->SetHelpCenterUrlForTesting(url);
+  }
+
+  net::EmbeddedTestServer* https_server() { return &https_server_; }
+
+  net::EmbeddedTestServer* https_expired_server() {
+    return &https_expired_server_;
+  }
+
+ private:
+  net::EmbeddedTestServer https_server_;
+  net::EmbeddedTestServer https_expired_server_;
+  DISALLOW_COPY_AND_ASSIGN(ConnectionHelpTabHelperTest);
+};
+
+INSTANTIATE_TEST_CASE_P(,
+                        ConnectionHelpTabHelperTest,
+                        ::testing::Values(false, true));
+
+// Tests that the chrome://connection-help redirect is not triggered (and
+// metrics are not logged) for an interstitial on a site that is not the help
+// center.
+IN_PROC_BROWSER_TEST_P(ConnectionHelpTabHelperTest,
+                       InterstitialOnNonSupportURL) {
+  const char kHistogramName[] = "SSL.CertificateErrorHelpCenterVisited";
+  base::HistogramTester histograms;
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kBundledConnectionHelpFeature);
+
+  GURL expired_non_support_url = https_expired_server()->GetURL("/title2.html");
+  GURL good_support_url = https_server()->GetURL("/title2.html");
+  SetHelpCenterUrl(browser(), good_support_url);
+  ui_test_utils::NavigateToURL(browser(), expired_non_support_url);
+
+  if (AreCommittedInterstitialsEnabled()) {
+    base::string16 tab_title;
+    ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
+    EXPECT_EQ(base::UTF16ToUTF8(tab_title), "Privacy error");
+  } else {
+    EXPECT_TRUE(browser()
+                    ->tab_strip_model()
+                    ->GetActiveWebContents()
+                    ->ShowingInterstitialPage());
+  }
+
+  histograms.ExpectTotalCount(kHistogramName, 0);
+}
+
+// Tests that the chrome://connection-help redirect is not triggered (and
+// metrics are logged) for the help center URL if there was no interstitial.
+IN_PROC_BROWSER_TEST_P(ConnectionHelpTabHelperTest,
+                       SupportURLWithNoInterstitial) {
+  const char kHistogramName[] = "SSL.CertificateErrorHelpCenterVisited";
+  base::HistogramTester histograms;
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kBundledConnectionHelpFeature);
+
+  GURL good_support_url = https_server()->GetURL("/title2.html");
+  SetHelpCenterUrl(browser(), good_support_url);
+  ui_test_utils::NavigateToURL(browser(), good_support_url);
+
+  base::string16 tab_title;
+  ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
+  EXPECT_EQ(base::UTF16ToUTF8(tab_title), "Title Of Awesomeness");
+
+  histograms.ExpectUniqueSample(
+      kHistogramName, ConnectionHelpTabHelper::LearnMoreClickResult::kSucceeded,
+      1);
+}
+
+// Tests that the chrome://connection-help redirect is triggered (and metrics
+// are logged) for the help center URL if there was an interstitial.
+IN_PROC_BROWSER_TEST_P(ConnectionHelpTabHelperTest, InterstitialOnSupportURL) {
+  const char kHistogramName[] = "SSL.CertificateErrorHelpCenterVisited";
+  base::HistogramTester histograms;
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kBundledConnectionHelpFeature);
+
+  GURL expired_url = https_expired_server()->GetURL("/title2.html");
+  SetHelpCenterUrl(browser(), expired_url);
+
+  // Since ui_test_utils::NavigateToURL uses a TestNavigationObserver to wait
+  // for navigations, and TestNavigationObserver counts interstitials as a
+  // navigation, we need to wait for two navigations (the interstitial, and the
+  // help content) in the non-committed interstitial case. For committed
+  // interstitials, since the redirect happens before the original navigation
+  // finishes, we only need to wait for one.
+  if (AreCommittedInterstitialsEnabled()) {
+    ui_test_utils::NavigateToURL(browser(), expired_url);
+  } else {
+    ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(),
+                                                              expired_url, 2);
+  }
+
+  base::string16 tab_title;
+  ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
+  EXPECT_EQ(base::UTF16ToUTF8(tab_title),
+            l10n_util::GetStringUTF8(IDS_CONNECTION_HELP_TITLE));
+
+  histograms.ExpectUniqueSample(
+      kHistogramName,
+      ConnectionHelpTabHelper::LearnMoreClickResult::kFailedWithInterstitial,
+      1);
+}
+
+// Tests that histogram logs correctly when an interstitial is triggered on the
+// support URL if the feature is disabled.
+IN_PROC_BROWSER_TEST_P(ConnectionHelpTabHelperTest,
+                       InterstitialOnSupportURLWithFeatureDisabled) {
+  const char kHistogramName[] = "SSL.CertificateErrorHelpCenterVisited";
+  base::HistogramTester histograms;
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(features::kBundledConnectionHelpFeature);
+
+  GURL expired_url = https_expired_server()->GetURL("/title2.html");
+  SetHelpCenterUrl(browser(), expired_url);
+  ui_test_utils::NavigateToURL(browser(), expired_url);
+
+  if (AreCommittedInterstitialsEnabled()) {
+    base::string16 tab_title;
+    ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
+    EXPECT_EQ(base::UTF16ToUTF8(tab_title), "Privacy error");
+  } else {
+    EXPECT_TRUE(browser()
+                    ->tab_strip_model()
+                    ->GetActiveWebContents()
+                    ->ShowingInterstitialPage());
+  }
+
+  histograms.ExpectUniqueSample(
+      kHistogramName,
+      ConnectionHelpTabHelper::LearnMoreClickResult::kFailedWithInterstitial,
+      1);
+}
+
+// Tests that a non-interstitial error on the support URL is logged correctly,
+// by setting the support URL to an invalid URL and attempting to navigate to
+// it.
+IN_PROC_BROWSER_TEST_P(ConnectionHelpTabHelperTest, NetworkErrorOnSupportURL) {
+  const char kHistogramName[] = "SSL.CertificateErrorHelpCenterVisited";
+  base::HistogramTester histograms;
+  GURL invalid_url("http://invalid-url.test");
+  SetHelpCenterUrl(browser(), invalid_url);
+  ui_test_utils::NavigateToURL(browser(), invalid_url);
+  histograms.ExpectUniqueSample(
+      kHistogramName,
+      ConnectionHelpTabHelper::LearnMoreClickResult::kFailedOther, 1);
+}
diff --git a/chrome/browser/sync/sessions/sync_sessions_metrics_android.cc b/chrome/browser/sync/sessions/sync_sessions_metrics_android.cc
deleted file mode 100644
index 051ce95..0000000
--- a/chrome/browser/sync/sessions/sync_sessions_metrics_android.cc
+++ /dev/null
@@ -1,44 +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 <string>
-
-#include "base/metrics/field_trial.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/sync/profile_sync_service_factory.h"
-#include "components/browser_sync/profile_sync_service.h"
-#include "components/sync_sessions/sessions_sync_manager.h"
-#include "components/sync_sessions/sync_sessions_metrics.h"
-#include "jni/SyncSessionsMetrics_jni.h"
-
-// static
-void JNI_SyncSessionsMetrics_RecordYoungestForeignTabAgeOnNTP(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jclass>& jcaller) {
-  // Unlike other platforms, Android typically disables session invalidations to
-  // conserve battery. This means that the foreign tab data may be quite stale.
-  // This would drastically distort the metric we want to emit here, however the
-  // revisit experiement disables said optimization, allowing us to collect
-  // valid data but at the cost of a much smaller sample size.
-  const std::string group_name =
-      base::FieldTrialList::FindFullName("PageRevisitInstrumentation");
-  bool shouldInstrument = group_name == "Enabled";
-  if (shouldInstrument) {
-    Profile* profile = ProfileManager::GetActiveUserProfile();
-    if (profile) {
-      browser_sync::ProfileSyncService* sync =
-          ProfileSyncServiceFactory::GetForProfile(profile);
-      if (sync) {
-        sync_sessions::SessionsSyncManager* sessions =
-            static_cast<sync_sessions::SessionsSyncManager*>(
-                sync->GetSessionsSyncableService());
-        if (sessions) {
-          sync_sessions::SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-              sessions);
-        }
-      }
-    }
-  }
-}
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 5d4d323d..2170e90c 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -917,7 +917,7 @@
   deps = [
     "//base",
     "//base:i18n",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//cc/paint",
     "//chrome:extra_resources",
     "//chrome:resources",
@@ -1163,6 +1163,8 @@
       "android/infobars/infobar_android.h",
       "android/infobars/infobar_container_android.cc",
       "android/infobars/infobar_container_android.h",
+      "android/infobars/installable_ambient_badge_infobar.cc",
+      "android/infobars/installable_ambient_badge_infobar.h",
       "android/infobars/instant_apps_infobar.cc",
       "android/infobars/instant_apps_infobar.h",
       "android/infobars/near_oom_infobar.cc",
@@ -1171,8 +1173,6 @@
       "android/infobars/permission_infobar.h",
       "android/infobars/previews_infobar.cc",
       "android/infobars/previews_infobar.h",
-      "android/infobars/pwa_ambient_badge_infobar.cc",
-      "android/infobars/pwa_ambient_badge_infobar.h",
       "android/infobars/reader_mode_infobar.cc",
       "android/infobars/reader_mode_infobar.h",
       "android/infobars/search_geolocation_disclosure_infobar.cc",
@@ -3522,6 +3522,12 @@
         "app_list/arc/arc_vpn_provider_manager.h",
         "app_list/arc/arc_vpn_provider_manager_factory.cc",
         "app_list/arc/arc_vpn_provider_manager_factory.h",
+        "app_list/crostini/crostini_app_item.cc",
+        "app_list/crostini/crostini_app_item.h",
+        "app_list/crostini/crostini_app_model_builder.cc",
+        "app_list/crostini/crostini_app_model_builder.h",
+        "app_list/crostini/crostini_util.cc",
+        "app_list/crostini/crostini_util.h",
         "app_list/search/arc_app_result.cc",
         "app_list/search/arc_app_result.h",
         "ash/launcher/arc_app_deferred_launcher_controller.cc",
diff --git a/chrome/browser/ui/android/infobars/OWNERS b/chrome/browser/ui/android/infobars/OWNERS
index 699a06d5..f5a04fb 100644
--- a/chrome/browser/ui/android/infobars/OWNERS
+++ b/chrome/browser/ui/android/infobars/OWNERS
@@ -2,6 +2,6 @@
 
 per-file app_banner*=dominickn@chromium.org
 per-file generated_password_saved_infobar.*=rouslan@chromium.org
-per-file pwa_ambient_badge*=dominickn@chromium.org
+per-file installable_ambient_badge*=dominickn@chromium.org
 
 # COMPONENT: UI>Browser>Infobars
diff --git a/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc
new file mode 100644
index 0000000..a0330b4
--- /dev/null
+++ b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.h"
+
+#include <utility>
+
+#include "base/android/jni_string.h"
+#include "chrome/browser/installable/installable_ambient_badge_infobar_delegate.h"
+#include "jni/InstallableAmbientBadgeInfoBar_jni.h"
+#include "ui/gfx/android/java_bitmap.h"
+
+InstallableAmbientBadgeInfoBar::InstallableAmbientBadgeInfoBar(
+    std::unique_ptr<InstallableAmbientBadgeInfoBarDelegate> delegate)
+    : InfoBarAndroid(std::move(delegate)) {}
+
+InstallableAmbientBadgeInfoBar::~InstallableAmbientBadgeInfoBar() {}
+
+InstallableAmbientBadgeInfoBarDelegate*
+InstallableAmbientBadgeInfoBar::GetDelegate() {
+  return static_cast<InstallableAmbientBadgeInfoBarDelegate*>(delegate());
+}
+
+void InstallableAmbientBadgeInfoBar::AddToHomescreen(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  GetDelegate()->AddToHomescreen();
+  RemoveSelf();
+}
+
+base::android::ScopedJavaLocalRef<jobject>
+InstallableAmbientBadgeInfoBar::CreateRenderInfoBar(JNIEnv* env) {
+  InstallableAmbientBadgeInfoBarDelegate* delegate = GetDelegate();
+
+  DCHECK(!delegate->GetPrimaryIcon().drawsNothing());
+  base::android::ScopedJavaLocalRef<jobject> java_bitmap =
+      gfx::ConvertToJavaBitmap(&delegate->GetPrimaryIcon());
+
+  return Java_InstallableAmbientBadgeInfoBar_show(env, delegate->GetIconId(),
+                                                  java_bitmap);
+}
+
+void InstallableAmbientBadgeInfoBar::ProcessButton(int action) {}
diff --git a/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.h b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.h
new file mode 100644
index 0000000..ad254bd0
--- /dev/null
+++ b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_ANDROID_INFOBARS_INSTALLABLE_AMBIENT_BADGE_INFOBAR_H_
+#define CHROME_BROWSER_UI_ANDROID_INFOBARS_INSTALLABLE_AMBIENT_BADGE_INFOBAR_H_
+
+#include <memory>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/macros.h"
+#include "chrome/browser/ui/android/infobars/infobar_android.h"
+
+class InstallableAmbientBadgeInfoBarDelegate;
+
+// An infobar shown to users when they visit a progressive web app.
+class InstallableAmbientBadgeInfoBar : public InfoBarAndroid {
+ public:
+  explicit InstallableAmbientBadgeInfoBar(
+      std::unique_ptr<InstallableAmbientBadgeInfoBarDelegate> delegate);
+  ~InstallableAmbientBadgeInfoBar() override;
+
+  void AddToHomescreen(JNIEnv* env,
+                       const base::android::JavaParamRef<jobject>& obj);
+
+ private:
+  InstallableAmbientBadgeInfoBarDelegate* GetDelegate();
+
+  // InfoBarAndroid:
+  base::android::ScopedJavaLocalRef<jobject> CreateRenderInfoBar(
+      JNIEnv* env) override;
+  void ProcessButton(int action) override;
+
+  DISALLOW_COPY_AND_ASSIGN(InstallableAmbientBadgeInfoBar);
+};
+
+#endif  // CHROME_BROWSER_UI_ANDROID_INFOBARS_INSTALLABLE_AMBIENT_BADGE_INFOBAR_H_
diff --git a/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.cc b/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.cc
deleted file mode 100644
index 351d505..0000000
--- a/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.cc
+++ /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.
-
-#include "chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.h"
-
-#include <utility>
-
-#include "base/android/jni_string.h"
-#include "chrome/browser/installable/pwa_ambient_badge_infobar_delegate_android.h"
-#include "jni/PwaAmbientBadgeInfoBar_jni.h"
-#include "ui/gfx/android/java_bitmap.h"
-
-PwaAmbientBadgeInfoBar::PwaAmbientBadgeInfoBar(
-    std::unique_ptr<PwaAmbientBadgeInfoBarDelegateAndroid> delegate)
-    : InfoBarAndroid(std::move(delegate)) {}
-
-PwaAmbientBadgeInfoBar::~PwaAmbientBadgeInfoBar() {}
-
-PwaAmbientBadgeInfoBarDelegateAndroid* PwaAmbientBadgeInfoBar::GetDelegate() {
-  return static_cast<PwaAmbientBadgeInfoBarDelegateAndroid*>(delegate());
-}
-
-void PwaAmbientBadgeInfoBar::AddToHomescreen(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
-  GetDelegate()->AddToHomescreen();
-  RemoveSelf();
-}
-
-base::android::ScopedJavaLocalRef<jobject>
-PwaAmbientBadgeInfoBar::CreateRenderInfoBar(JNIEnv* env) {
-  PwaAmbientBadgeInfoBarDelegateAndroid* delegate = GetDelegate();
-
-  DCHECK(!delegate->GetPrimaryIcon().drawsNothing());
-  base::android::ScopedJavaLocalRef<jobject> java_bitmap =
-      gfx::ConvertToJavaBitmap(&delegate->GetPrimaryIcon());
-
-  return Java_PwaAmbientBadgeInfoBar_show(env, delegate->GetIconId(),
-                                          java_bitmap);
-}
-
-void PwaAmbientBadgeInfoBar::ProcessButton(int action) {}
diff --git a/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.h b/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.h
deleted file mode 100644
index 926b905..0000000
--- a/chrome/browser/ui/android/infobars/pwa_ambient_badge_infobar.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_ANDROID_INFOBARS_PWA_AMBIENT_BADGE_INFOBAR_H_
-#define CHROME_BROWSER_UI_ANDROID_INFOBARS_PWA_AMBIENT_BADGE_INFOBAR_H_
-
-#include <memory>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/macros.h"
-#include "chrome/browser/ui/android/infobars/infobar_android.h"
-
-class PwaAmbientBadgeInfoBarDelegateAndroid;
-
-// An infobar shown to users when they visit a progressive web app.
-class PwaAmbientBadgeInfoBar : public InfoBarAndroid {
- public:
-  explicit PwaAmbientBadgeInfoBar(
-      std::unique_ptr<PwaAmbientBadgeInfoBarDelegateAndroid> delegate);
-  ~PwaAmbientBadgeInfoBar() override;
-
-  void AddToHomescreen(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj);
-
- private:
-  PwaAmbientBadgeInfoBarDelegateAndroid* GetDelegate();
-
-  // InfoBarAndroid:
-  base::android::ScopedJavaLocalRef<jobject> CreateRenderInfoBar(
-      JNIEnv* env) override;
-  void ProcessButton(int action) override;
-
-  DISALLOW_COPY_AND_ASSIGN(PwaAmbientBadgeInfoBar);
-};
-
-#endif  // CHROME_BROWSER_UI_ANDROID_INFOBARS_PWA_AMBIENT_BADGE_INFOBAR_H_
diff --git a/chrome/browser/ui/app_list/DEPS b/chrome/browser/ui/app_list/DEPS
index 4eed37a5..09d8fec7 100644
--- a/chrome/browser/ui/app_list/DEPS
+++ b/chrome/browser/ui/app_list/DEPS
@@ -2,3 +2,10 @@
   # TODO(hejq): Remove this once app_list is migrated. http://crbug.com/733662
   "+ash/app_list/model",
 ]
+
+specific_include_rules = {
+  # TODO(733662): Remove when app_list is migrated.
+  "crostini_app_model_builder\.cc": [
+    "+ash/resources/grit/ash_resources.h",
+  ],
+}
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc
index cb20263..a6c54c4e 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -27,6 +27,8 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/app_list/chrome_app_list_item.h"
 #include "chrome/browser/ui/app_list/chrome_app_list_model_updater.h"
+#include "chrome/browser/ui/app_list/crostini/crostini_app_model_builder.h"
+#include "chrome/browser/ui/app_list/crostini/crostini_util.h"
 #include "chrome/browser/ui/app_list/extension_app_item.h"
 #include "chrome/browser/ui/app_list/extension_app_model_builder.h"
 #include "chrome/common/chrome_switches.h"
@@ -396,12 +398,18 @@
   apps_builder_.reset(new ExtensionAppModelBuilder(controller));
   if (arc::IsArcAllowedForProfile(profile_))
     arc_apps_builder_.reset(new ArcAppModelBuilder(controller));
+  if (IsExperimentalCrostiniUIAvailable())
+    crostini_apps_builder_.reset(new CrostiniAppModelBuilder(controller));
+
   DCHECK(profile_);
   SyncStarted();
   apps_builder_->Initialize(this, profile_, model_updater_.get());
   if (arc_apps_builder_.get())
     arc_apps_builder_->Initialize(this, profile_, model_updater_.get());
 
+  if (crostini_apps_builder_.get())
+    crostini_apps_builder_->Initialize(this, profile_, model_updater_.get());
+
   HandleUpdateFinished();
 }
 
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.h b/chrome/browser/ui/app_list/app_list_syncable_service.h
index db571a60..a7fcd17d 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.h
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.h
@@ -29,6 +29,7 @@
 class AppListModelUpdater;
 class ArcAppModelBuilder;
 class ChromeAppListItem;
+class CrostiniAppModelBuilder;
 class ExtensionAppModelBuilder;
 class Profile;
 
@@ -284,6 +285,7 @@
   std::unique_ptr<ModelUpdaterDelegate> model_updater_delegate_;
   std::unique_ptr<ExtensionAppModelBuilder> apps_builder_;
   std::unique_ptr<ArcAppModelBuilder> arc_apps_builder_;
+  std::unique_ptr<CrostiniAppModelBuilder> crostini_apps_builder_;
   std::unique_ptr<syncer::SyncChangeProcessor> sync_processor_;
   std::unique_ptr<syncer::SyncErrorFactory> sync_error_handler_;
   SyncItemMap sync_items_;
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_item.cc b/chrome/browser/ui/app_list/crostini/crostini_app_item.cc
new file mode 100644
index 0000000..709d42a
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_item.cc
@@ -0,0 +1,46 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/app_list/crostini/crostini_app_item.h"
+
+#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
+#include "ui/gfx/image/image_skia.h"
+
+// static
+const char CrostiniAppItem::kItemType[] = "CrostiniAppItem";
+
+CrostiniAppItem::CrostiniAppItem(
+    Profile* profile,
+    const app_list::AppListSyncableService::SyncItem* sync_item,
+    const std::string& id,
+    const std::string& name,
+    const gfx::ImageSkia* image_skia)
+    : ChromeAppListItem(profile, id) {
+  SetIcon(*image_skia);
+  SetName(name);
+  if (sync_item && sync_item->item_ordinal.IsValid()) {
+    UpdateFromSync(sync_item);
+  } else {
+    SetDefaultPositionIfApplicable();
+  }
+}
+
+CrostiniAppItem::~CrostiniAppItem() {}
+
+const char* CrostiniAppItem::GetItemType() const {
+  return CrostiniAppItem::kItemType;
+}
+
+void CrostiniAppItem::Activate(int event_flags) {
+  // TODO(813699): launch the app, launching the Crostini install flow if
+  // needed e.g. like chrome/browser/ui/app_list/arc/arc_app_utils.cc
+  // if (!crostini::LaunchApp(profile(), id(), event_flags,
+  //                    GetController()->GetAppListDisplayId())) {
+  //  return;
+  //}
+
+  // Manually close app_list view because focus is not changed on Crostini app
+  // start, and current view remains active.
+  GetController()->DismissView();
+}
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_item.h b/chrome/browser/ui/app_list/crostini/crostini_app_item.h
new file mode 100644
index 0000000..7ab4f58
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_item.h
@@ -0,0 +1,32 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_ITEM_H_
+#define CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_ITEM_H_
+
+#include "chrome/browser/ui/app_list/chrome_app_list_item.h"
+
+namespace gfx {
+class ImageSkia;
+}
+
+class CrostiniAppItem : public ChromeAppListItem {
+ public:
+  static const char kItemType[];
+  CrostiniAppItem(Profile* profile,
+                  const app_list::AppListSyncableService::SyncItem* sync_item,
+                  const std::string& id,
+                  const std::string& name,
+                  const gfx::ImageSkia* image_skia);
+  ~CrostiniAppItem() override;
+
+ private:
+  // ChromeAppListItem:
+  void Activate(int event_flags) override;
+  const char* GetItemType() const override;
+
+  DISALLOW_COPY_AND_ASSIGN(CrostiniAppItem);
+};
+
+#endif  // CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_ITEM_H_
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc
new file mode 100644
index 0000000..4b6f7cc
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/app_list/crostini/crostini_app_model_builder.h"
+
+#include "ash/resources/grit/ash_resources.h"
+#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
+#include "chrome/browser/ui/app_list/crostini/crostini_app_item.h"
+#include "components/crx_file/id_util.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace {
+const char kCrostiniTerminalAppName[] = "Terminal";
+}  // namespace
+
+CrostiniAppModelBuilder::CrostiniAppModelBuilder(
+    AppListControllerDelegate* controller)
+    : AppListModelBuilder(controller, CrostiniAppItem::kItemType) {}
+
+CrostiniAppModelBuilder::~CrostiniAppModelBuilder() = default;
+
+void CrostiniAppModelBuilder::BuildModel() {
+  static const std::string kCrostiniTerminalId =
+      crx_file::id_util::GenerateId(kCrostiniTerminalAppName);
+  InsertApp(std::make_unique<CrostiniAppItem>(
+      profile(), GetSyncItem(kCrostiniTerminalId), kCrostiniTerminalId,
+      kCrostiniTerminalAppName,
+      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+          IDR_LOGO_CROSTINI_TERMINAL)));
+}
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.h b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.h
new file mode 100644
index 0000000..37d8723
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.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 CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_MODEL_BUILDER_H_
+#define CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_MODEL_BUILDER_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/app_list/app_list_model_builder.h"
+
+class AppListControllerDelegate;
+
+// This class populates and maintains Crostini apps.
+class CrostiniAppModelBuilder : public AppListModelBuilder {
+ public:
+  explicit CrostiniAppModelBuilder(AppListControllerDelegate* controller);
+  ~CrostiniAppModelBuilder() override;
+
+ private:
+  // AppListModelBuilder:
+  void BuildModel() override;
+
+  DISALLOW_COPY_AND_ASSIGN(CrostiniAppModelBuilder);
+};
+
+#endif  // CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_APP_MODEL_BUILDER_H_
diff --git a/chrome/browser/ui/app_list/crostini/crostini_util.cc b/chrome/browser/ui/app_list/crostini/crostini_util.cc
new file mode 100644
index 0000000..86c427a
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_util.cc
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/app_list/crostini/crostini_util.h"
+
+#include "base/feature_list.h"
+#include "chrome/browser/chromeos/virtual_machines/virtual_machines_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_features.h"
+
+bool IsCrostiniAllowed() {
+  return base::FeatureList::IsEnabled(features::kCrostini) &&
+         virtual_machines::AreVirtualMachinesAllowedByPolicy();
+}
+
+bool IsExperimentalCrostiniUIAvailable() {
+  return IsCrostiniAllowed() &&
+         base::FeatureList::IsEnabled(features::kExperimentalCrostiniUI);
+}
+
+bool IsCrostiniInstalled() {
+  return false;
+}
+
+bool IsCrostiniRunning() {
+  return false;
+}
diff --git a/chrome/browser/ui/app_list/crostini/crostini_util.h b/chrome/browser/ui/app_list/crostini/crostini_util.h
new file mode 100644
index 0000000..c2826b5
--- /dev/null
+++ b/chrome/browser/ui/app_list/crostini/crostini_util.h
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_UTIL_H_
+#define CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_UTIL_H_
+
+// Returns true if crostini is allowed to run.
+// Otherwise, returns false, e.g. if crostini is not available on the device,
+// or it is in the flow to set up managed account creation.
+bool IsCrostiniAllowed();
+
+// Returns true if crostini UI can be shown. Implies crostini is allowed to run.
+bool IsExperimentalCrostiniUIAvailable();
+
+#endif  // CHROME_BROWSER_UI_APP_LIST_CROSTINI_CROSTINI_UTIL_H_
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
index f3796081d..6b97983 100644
--- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -132,7 +132,6 @@
   if (chromeos::GetAshConfig() == ash::Config::MASH) {
     // ash::Shell will not be created because ash is running out-of-process.
     ash::Shell::SetIsBrowserProcessWithMash();
-
     // Register ash-specific window properties with Chrome's property converter.
     // This propagates ash properties set on chrome windows to ash, via mojo.
     DCHECK(views::MusClient::Exists());
@@ -168,6 +167,14 @@
         aura::PropertyConverter::CreateAcceptAnyValueCallback());
     converter->RegisterStringProperty(
         ash::kShelfIDKey, ui::mojom::WindowManager::kShelfID_Property);
+    converter->RegisterPrimitiveProperty(
+        ash::kRestoreBoundsOverrideKey,
+        ash::mojom::kRestoreBoundsOverride_Property,
+        aura::PropertyConverter::CreateAcceptAnyValueCallback());
+    converter->RegisterPrimitiveProperty(
+        ash::kRestoreWindowStateTypeOverrideKey,
+        ash::mojom::kRestoreWindowStateTypeOverride_Property,
+        base::BindRepeating(&ash::IsValidWindowStateType));
 
     mus_client->SetMusPropertyMirror(
         std::make_unique<ash::MusPropertyMirrorAsh>());
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 5b625a2..c210dd0 100644
--- a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
+++ b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
@@ -99,8 +99,8 @@
   }
 
   base::TimeDelta GetSuccessMessageDuration() const override {
-    // Change this to ~4000 if you're in --interactive mode and would like to
-    // see the progress/success overlay.
+    // Change this to ~4000 if you're in --test-launcher-interactive mode and
+    // would like to see the progress/success overlay.
     return base::TimeDelta::FromMilliseconds(10);
   }
 
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index b82e32d..d9f1db78 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -9,7 +9,7 @@
 #include <string>
 
 #include "base/command_line.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/profiler.h"
 #include "base/macros.h"
 #include "base/metrics/user_metrics.h"
diff --git a/chrome/browser/ui/browser_tab_restorer.cc b/chrome/browser/ui/browser_tab_restorer.cc
index 4bbabc4..dcee143 100644
--- a/chrome/browser/ui/browser_tab_restorer.cc
+++ b/chrome/browser/ui/browser_tab_restorer.cc
@@ -40,7 +40,6 @@
   explicit BrowserTabRestorer(Browser* browser);
 
   // TabRestoreServiceObserver:
-  void TabRestoreServiceChanged(sessions::TabRestoreService* service) override;
   void TabRestoreServiceDestroyed(
       sessions::TabRestoreService* service) override;
   void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override;
@@ -82,9 +81,6 @@
   tab_restore_service_->LoadTabsFromLastSession();
 }
 
-void BrowserTabRestorer::TabRestoreServiceChanged(
-    sessions::TabRestoreService* service) {}
-
 void BrowserTabRestorer::TabRestoreServiceDestroyed(
     sessions::TabRestoreService* service) {}
 
diff --git a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
index 2e6edce..4fd9dd91 100644
--- a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
@@ -37,7 +37,6 @@
 #include "components/sync/driver/sync_client.h"
 #include "components/sync/model/fake_sync_change_processor.h"
 #include "components/sync/model/sync_error_factory_mock.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
 #include "components/sync_sessions/sessions_sync_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -178,7 +177,7 @@
                 IsDataTypeControllerRunning(syncer::PROXY_TABS))
         .WillRepeatedly(Return(true));
     EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
-        .WillRepeatedly(Return(manager_.get()));
+        .WillRepeatedly(Return(manager_->GetOpenTabsUIDelegate()));
   }
 
   AppMenuController* controller() {
diff --git a/chrome/browser/ui/cocoa/drag_util.mm b/chrome/browser/ui/cocoa/drag_util.mm
index ea3e6b9..b1a49f7 100644
--- a/chrome/browser/ui/cocoa/drag_util.mm
+++ b/chrome/browser/ui/cocoa/drag_util.mm
@@ -40,9 +40,6 @@
   std::string mime_type;
   net::GetMimeTypeFromFile(full_path, &mime_type);
 
-  // This logic mirrors |BufferedResourceHandler::ShouldDownload()|.
-  // TODO(asvitkine): Refactor this out to a common location instead of
-  //                  duplicating code.
   if (blink::IsSupportedMimeType(mime_type))
     return YES;
 
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index f274106..d4c9163 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -499,7 +499,7 @@
   [[backButton_ cell]
       accessibilitySetOverrideValue:description
                        forAttribute:NSAccessibilityDescriptionAttribute];
-  NSString* helpTag = l10n_util::GetNSStringWithFixup(IDS_ACCNAME_TOOLTIP_BACK);
+  NSString* helpTag = l10n_util::GetNSStringWithFixup(IDS_ACCDESCRIPTION_BACK);
   [[backButton_ cell]
       accessibilitySetOverrideValue:helpTag
                        forAttribute:NSAccessibilityHelpAttribute];
@@ -508,7 +508,7 @@
   [[forwardButton_ cell]
       accessibilitySetOverrideValue:description
                        forAttribute:NSAccessibilityDescriptionAttribute];
-  helpTag = l10n_util::GetNSStringWithFixup(IDS_ACCNAME_TOOLTIP_FORWARD);
+  helpTag = l10n_util::GetNSStringWithFixup(IDS_ACCDESCRIPTION_FORWARD);
   [[forwardButton_ cell]
       accessibilitySetOverrideValue:helpTag
                        forAttribute:NSAccessibilityHelpAttribute];
diff --git a/chrome/browser/ui/passwords/password_manager_porter.cc b/chrome/browser/ui/passwords/password_manager_porter.cc
index 83a221d..94b4c00 100644
--- a/chrome/browser/ui/passwords/password_manager_porter.cc
+++ b/chrome/browser/ui/passwords/password_manager_porter.cc
@@ -104,41 +104,48 @@
 }  // namespace
 
 PasswordManagerPorter::PasswordManagerPorter(
-    std::unique_ptr<password_manager::PasswordManagerExporter> exporter)
-    : exporter_(std::move(exporter)) {}
-
-PasswordManagerPorter::~PasswordManagerPorter() {}
-
-// static
-std::unique_ptr<PasswordManagerPorter>
-PasswordManagerPorter::CreatePasswordManagerPorterWithCredentialProvider(
     password_manager::CredentialProviderInterface*
         credential_provider_interface,
-    ProgressCallback on_export_progress_callback) {
-  return std::make_unique<PasswordManagerPorter>(
-      std::make_unique<password_manager::PasswordManagerExporter>(
-          credential_provider_interface,
-          std::move(on_export_progress_callback)));
-}
+    ProgressCallback on_export_progress_callback)
+    : credential_provider_interface_(credential_provider_interface),
+      on_export_progress_callback_(on_export_progress_callback) {}
+
+PasswordManagerPorter::~PasswordManagerPorter() {}
 
 bool PasswordManagerPorter::Store() {
   // In unittests a null WebContents means: "Abort creating the file Selector."
   if (!web_contents_)
     return true;
 
+  if (exporter_ && exporter_->GetProgressStatus() ==
+                       password_manager::ExportProgressStatus::IN_PROGRESS) {
+    return false;
+  }
+
+  // Set a new exporter for this request.
+  exporter_ =
+      exporter_for_testing_
+          ? std::move(exporter_for_testing_)
+          : std::make_unique<password_manager::PasswordManagerExporter>(
+                credential_provider_interface_, on_export_progress_callback_);
+
   // Start serialising while the user selects a file.
   exporter_->PreparePasswordsForExport();
   PresentFileSelector(web_contents_,
                       PasswordManagerPorter::Type::PASSWORD_EXPORT);
 
-  // TODO(http://crbug/789561) Reject the request if an export is already in
-  // progress.
   return true;
 }
 
 password_manager::ExportProgressStatus
 PasswordManagerPorter::GetExportProgressStatus() {
-  return exporter_->GetProgressStatus();
+  return exporter_ ? exporter_->GetProgressStatus()
+                   : password_manager::ExportProgressStatus::NOT_STARTED;
+}
+
+void PasswordManagerPorter::SetExporterForTesting(
+    std::unique_ptr<password_manager::PasswordManagerExporter> exporter) {
+  exporter_for_testing_ = std::move(exporter);
 }
 
 void PasswordManagerPorter::Load() {
diff --git a/chrome/browser/ui/passwords/password_manager_porter.h b/chrome/browser/ui/passwords/password_manager_porter.h
index c7cb203..77e63593 100644
--- a/chrome/browser/ui/passwords/password_manager_porter.h
+++ b/chrome/browser/ui/passwords/password_manager_porter.h
@@ -35,19 +35,13 @@
       base::RepeatingCallback<void(password_manager::ExportProgressStatus,
                                    const std::string&)>;
 
-  explicit PasswordManagerPorter(
-      std::unique_ptr<password_manager::PasswordManagerExporter> exporter);
-  ~PasswordManagerPorter() override;
-
-  // Create an instance of PasswordManagerPorter.
   // |credential_provider_interface| provides the credentials which can be
   // exported. |on_export_progress_callback| will be called with updates to
   // the progress of exporting.
-  static std::unique_ptr<PasswordManagerPorter>
-  CreatePasswordManagerPorterWithCredentialProvider(
-      password_manager::CredentialProviderInterface*
-          credential_provider_interface,
-      ProgressCallback on_export_progress_callback);
+  PasswordManagerPorter(password_manager::CredentialProviderInterface*
+                            credential_provider_interface,
+                        ProgressCallback on_export_progress_callback);
+  ~PasswordManagerPorter() override;
 
   void set_web_contents(content::WebContents* web_contents) {
     web_contents_ = web_contents;
@@ -57,6 +51,10 @@
   bool Store() override;
   password_manager::ExportProgressStatus GetExportProgressStatus() override;
 
+  // The next export will use |exporter|, instead of creating a new instance.
+  void SetExporterForTesting(
+      std::unique_ptr<password_manager::PasswordManagerExporter> exporter);
+
   // password_manager::ImportFlow
   void Load() override;
 
@@ -86,6 +84,16 @@
   scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
   Profile* profile_ = nullptr;
 
+  // We store |credential_provider_interface_| and
+  // |on_export_progress_callback_| to use them to create a new
+  // PasswordManagerExporter instance for each export.
+  password_manager::CredentialProviderInterface* credential_provider_interface_;
+  ProgressCallback on_export_progress_callback_;
+  // If |exporter_for_testing_| is set, the next export will make it the current
+  // exporter, instead of creating a new instance.
+  std::unique_ptr<password_manager::PasswordManagerExporter>
+      exporter_for_testing_;
+
   // Caching the current WebContents for when PresentFileSelector is called.
   content::WebContents* web_contents_ = nullptr;
 
diff --git a/chrome/browser/ui/passwords/password_manager_porter_unittest.cc b/chrome/browser/ui/passwords/password_manager_porter_unittest.cc
index a96f7721..4e6417c 100644
--- a/chrome/browser/ui/passwords/password_manager_porter_unittest.cc
+++ b/chrome/browser/ui/passwords/password_manager_porter_unittest.cc
@@ -150,9 +150,8 @@
 
 class TestPasswordManagerPorter : public PasswordManagerPorter {
  public:
-  TestPasswordManagerPorter(
-      std::unique_ptr<password_manager::PasswordManagerExporter> exporter)
-      : PasswordManagerPorter(std::move(exporter)) {}
+  TestPasswordManagerPorter()
+      : PasswordManagerPorter(nullptr, ProgressCallback()) {}
 
   MOCK_METHOD1(ImportPasswordsFromPath, void(const base::FilePath& path));
 
@@ -190,7 +189,7 @@
   ~PasswordManagerPorterTest() override = default;
 
   void SetUp() override {
-    password_manager_porter_.reset(new TestPasswordManagerPorter(nullptr));
+    password_manager_porter_.reset(new TestPasswordManagerPorter());
     profile_.reset(new TestingProfile());
     web_contents_.reset(content::WebContentsTester::CreateTestWebContents(
         profile_.get(), nullptr));
@@ -236,32 +235,32 @@
 }
 
 TEST_F(PasswordManagerPorterTest, PasswordExport) {
-  // PasswordManagerPorter will take ownership of this, but we keep a pointer.
-  MockPasswordManagerExporter* mock_password_manager_exporter_ =
-      new StrictMock<MockPasswordManagerExporter>();
-  PasswordManagerPorter porter((std::unique_ptr<MockPasswordManagerExporter>(
-      mock_password_manager_exporter_)));
+  PasswordManagerPorter porter(nullptr,
+                               PasswordManagerPorter::ProgressCallback());
+  std::unique_ptr<MockPasswordManagerExporter> mock_password_manager_exporter_ =
+      std::make_unique<StrictMock<MockPasswordManagerExporter>>();
 
   EXPECT_CALL(*mock_password_manager_exporter_, PreparePasswordsForExport());
   EXPECT_CALL(*mock_password_manager_exporter_, SetDestination(selected_file_));
 
   porter.set_web_contents(web_contents());
+  porter.SetExporterForTesting(std::move(mock_password_manager_exporter_));
   porter.Store();
 }
 
 TEST_F(PasswordManagerPorterTest, CancelExportFileSelection) {
   ui::SelectFileDialog::SetFactory(new FakeCancellingSelectFileDialogFactory());
 
-  // PasswordManagerPorter will take ownership of this, but we keep a pointer.
-  MockPasswordManagerExporter* mock_password_manager_exporter_ =
-      new StrictMock<MockPasswordManagerExporter>();
-  PasswordManagerPorter porter((std::unique_ptr<MockPasswordManagerExporter>(
-      mock_password_manager_exporter_)));
+  std::unique_ptr<MockPasswordManagerExporter> mock_password_manager_exporter_ =
+      std::make_unique<StrictMock<MockPasswordManagerExporter>>();
+  PasswordManagerPorter porter(nullptr,
+                               PasswordManagerPorter::ProgressCallback());
 
   EXPECT_CALL(*mock_password_manager_exporter_, PreparePasswordsForExport());
   EXPECT_CALL(*mock_password_manager_exporter_, Cancel());
 
   porter.set_web_contents(web_contents());
+  porter.SetExporterForTesting(std::move(mock_password_manager_exporter_));
   porter.Store();
 }
 
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.cc b/chrome/browser/ui/search/ntp_user_data_logger.cc
index 5a63cc08..fba95d3 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger.cc
@@ -12,33 +12,14 @@
 #include "chrome/browser/after_startup_task_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
-#include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/url_constants.h"
-#include "components/browser_sync/profile_sync_service.h"
 #include "components/ntp_tiles/metrics.h"
-#include "components/sync_sessions/sessions_sync_manager.h"
-#include "components/sync_sessions/sync_sessions_metrics.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
 
 namespace {
 
-void RecordSyncSessionMetrics(content::WebContents* contents) {
-  if (!contents)
-    return;
-  browser_sync::ProfileSyncService* sync =
-      ProfileSyncServiceFactory::GetForProfile(
-          Profile::FromBrowserContext(contents->GetBrowserContext()));
-  if (!sync)
-    return;
-  sync_sessions::SessionsSyncManager* sessions =
-      static_cast<sync_sessions::SessionsSyncManager*>(
-          sync->GetSessionsSyncableService());
-  sync_sessions::SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-      sessions);
-}
-
 // This enum must match the numbering for NewTabPageVoiceAction in enums.xml.
 // Do not reorder or remove items, only add new items before VOICE_ACTION_MAX.
 enum VoiceAction {
@@ -299,11 +280,6 @@
       has_emitted_(false),
       should_record_doodle_load_time_(true),
       during_startup_(!AfterStartupTaskUtils::IsBrowserStartupComplete()) {
-  // We record metrics about session data here because when this class typically
-  // emits metrics it is too late. This session data would theoretically have
-  // been used to populate the page, and we want to learn about its state when
-  // the NTP is being generated.
-  RecordSyncSessionMetrics(contents);
 }
 
 // content::WebContentsObserver override
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index c460a6a0..1c00f19 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -40,6 +40,7 @@
 
 #if !defined(OS_ANDROID)
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
 #endif
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -286,6 +287,16 @@
   OnCloseCanceled();
 }
 
+// Update back/forward buttons for web_contents that are active.
+void CoreTabHelper::NavigationEntriesDeleted() {
+#if !defined(OS_ANDROID)
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    if (web_contents() == browser->tab_strip_model()->GetActiveWebContents())
+      browser->command_controller()->TabStateChanged();
+  }
+#endif
+}
+
 // Handles the image thumbnail for the context node, composes a image search
 // request based on the received thumbnail and opens the request in a new tab.
 void CoreTabHelper::DoSearchByImageInNewTab(
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.h b/chrome/browser/ui/tab_contents/core_tab_helper.h
index 8d38ce6..1a3b8f2 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.h
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.h
@@ -78,6 +78,7 @@
   void WebContentsDestroyed() override;
   void BeforeUnloadFired(const base::TimeTicks& proceed_time) override;
   void BeforeUnloadDialogCancelled() override;
+  void NavigationEntriesDeleted() override;
 
   void DoSearchByImageInNewTab(
       chrome::mojom::ChromeRenderFrameAssociatedPtr chrome_render_frame,
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index 31fda0c..d0252d7 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -46,6 +46,7 @@
 #include "chrome/browser/resource_coordinator/resource_coordinator_web_contents_observer.h"
 #include "chrome/browser/safe_browsing/trigger_creator.h"
 #include "chrome/browser/sessions/session_tab_helper.h"
+#include "chrome/browser/ssl/connection_help_tab_helper.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
 #include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h"
@@ -100,7 +101,6 @@
 #else
 #include "chrome/browser/banners/app_banner_manager_desktop.h"
 #include "chrome/browser/plugins/plugin_observer.h"
-#include "chrome/browser/resource_coordinator/tab_activity_watcher.h"
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h"
 #include "chrome/browser/safe_browsing/safe_browsing_tab_observer.h"
 #include "chrome/browser/thumbnails/thumbnail_tab_helper.h"
@@ -204,6 +204,7 @@
   }
   ChromeTranslateClient::CreateForWebContents(web_contents);
   ClientHintsObserver::CreateForWebContents(web_contents);
+  ConnectionHelpTabHelper::CreateForWebContents(web_contents);
   CoreTabHelper::CreateForWebContents(web_contents);
   data_use_measurement::DataUseWebContentsObserver::CreateForWebContents(
       web_contents);
@@ -294,8 +295,6 @@
   safe_browsing::SafeBrowsingNavigationObserver::MaybeCreateForWebContents(
       web_contents);
   SearchTabHelper::CreateForWebContents(web_contents);
-  if (base::FeatureList::IsEnabled(features::kTabMetricsLogging))
-    resource_coordinator::TabActivityWatcher::WatchWebContents(web_contents);
   TabContentsSyncedTabDelegate::CreateForWebContents(web_contents);
   TabDialogs::CreateForWebContents(web_contents);
   ThumbnailTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/tabs/tab_activity_simulator.cc b/chrome/browser/ui/tabs/tab_activity_simulator.cc
index 59e1d5d5..2e18f28 100644
--- a/chrome/browser/ui/tabs/tab_activity_simulator.cc
+++ b/chrome/browser/ui/tabs/tab_activity_simulator.cc
@@ -38,32 +38,38 @@
 TabActivitySimulator::TabActivitySimulator() = default;
 TabActivitySimulator::~TabActivitySimulator() = default;
 
-void TabActivitySimulator::Navigate(
-    content::WebContents* web_contents,
-    const GURL& url,
-    ui::PageTransition page_transition = ui::PAGE_TRANSITION_LINK) {
+void TabActivitySimulator::Navigate(content::WebContents* web_contents,
+                                    const GURL& url,
+                                    ui::PageTransition page_transition) {
   std::unique_ptr<content::NavigationSimulator> navigation =
       content::NavigationSimulator::CreateBrowserInitiated(url, web_contents);
   navigation->SetTransition(page_transition);
   navigation->Commit();
 }
 
-content::WebContents* TabActivitySimulator::AddWebContentsAndNavigate(
-    TabStripModel* tab_strip_model,
-    const GURL& initial_url,
-    ui::PageTransition page_transition) {
-  content::WebContents::CreateParams params(tab_strip_model->profile(),
-                                            nullptr);
-  // Create as a background tab if there are other tabs in the tab strip.
-  params.initially_hidden = tab_strip_model->count() > 0;
-  content::WebContents* test_contents =
-      content::WebContentsTester::CreateTestWebContents(params);
+std::unique_ptr<content::WebContents> TabActivitySimulator::CreateWebContents(
+    content::BrowserContext* browser_context,
+    bool initially_hidden) {
+  content::WebContents::CreateParams params(browser_context, nullptr);
+  params.initially_hidden = initially_hidden;
+  std::unique_ptr<content::WebContents> test_contents(
+      content::WebContentsTester::CreateTestWebContents(params));
 
   // Create the TestWebContentsObserver to observe |test_contents|. When the
   // WebContents is destroyed, the observer will be reset automatically.
   observers_.push_back(
-      std::make_unique<TestWebContentsObserver>(test_contents));
+      std::make_unique<TestWebContentsObserver>(test_contents.get()));
+  return test_contents;
+}
 
+content::WebContents* TabActivitySimulator::AddWebContentsAndNavigate(
+    TabStripModel* tab_strip_model,
+    const GURL& initial_url,
+    ui::PageTransition page_transition) {
+  // Create as a background tab if there are other tabs in the tab strip.
+  bool initially_hidden = tab_strip_model->count() > 0;
+  content::WebContents* test_contents =
+      CreateWebContents(tab_strip_model->profile(), initially_hidden).release();
   tab_strip_model->AppendWebContents(test_contents, false);
   Navigate(test_contents, initial_url, page_transition);
   return test_contents;
diff --git a/chrome/browser/ui/tabs/tab_activity_simulator.h b/chrome/browser/ui/tabs/tab_activity_simulator.h
index ad9b958dd..0f14678 100644
--- a/chrome/browser/ui/tabs/tab_activity_simulator.h
+++ b/chrome/browser/ui/tabs/tab_activity_simulator.h
@@ -15,6 +15,7 @@
 class TabStripModel;
 
 namespace content {
+class BrowserContext;
 class WebContents;
 }  // namespace content
 
@@ -30,7 +31,12 @@
   // Simulates a navigation to |url| using the given transition type.
   void Navigate(content::WebContents* web_contents,
                 const GURL& url,
-                ui::PageTransition page_transition);
+                ui::PageTransition page_transition = ui::PAGE_TRANSITION_LINK);
+
+  // Creates a new WebContents suitable for testing.
+  std::unique_ptr<content::WebContents> CreateWebContents(
+      content::BrowserContext* browser_context,
+      bool initially_hidden = true);
 
   // Creates a new WebContents suitable for testing, adds it to the tab strip
   // and commits a navigation to |initial_url|. The WebContents is owned by the
diff --git a/chrome/browser/ui/tabs/window_activity_watcher_unittest.cc b/chrome/browser/ui/tabs/window_activity_watcher_unittest.cc
index 74ed5e8e..d433003 100644
--- a/chrome/browser/ui/tabs/window_activity_watcher_unittest.cc
+++ b/chrome/browser/ui/tabs/window_activity_watcher_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
+#include "chrome/browser/resource_coordinator/tab_activity_watcher.h"
 #include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
@@ -107,6 +108,13 @@
   WindowActivityWatcherTest() = default;
   ~WindowActivityWatcherTest() override { EXPECT_FALSE(WasNewEntryRecorded()); }
 
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+
+    // Start TabActivityWatcher so it logs TabMetrics UKMs.
+    resource_coordinator::TabActivityWatcher::GetInstance();
+  }
+
   // Adds a tab and simulates a basic navigation.
   void AddTab(Browser* browser) {
     content::WebContentsTester::For(
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index 4ea83ce2..de46c514 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -8,7 +8,7 @@
 #include <cmath>
 
 #include "base/command_line.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/profiler.h"
 #include "base/i18n/number_formatting.h"
 #include "base/macros.h"
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
index 93f336a5..d4d740a 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
@@ -207,7 +207,7 @@
                                1, session_entity, GetSessionTimestamp(s))));
   }
   manager->ProcessSyncChanges(FROM_HERE, changes);
-  VerifyExport(manager);
+  VerifyExport(manager->GetOpenTabsUIDelegate());
 }
 
 void RecentTabsBuilderTestHelper::VerifyExport(
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
index ceb3afb..6a01fa6c 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
@@ -226,7 +226,7 @@
                 IsDataTypeControllerRunning(syncer::PROXY_TABS))
         .WillRepeatedly(Return(true));
     EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
-        .WillRepeatedly(Return(manager_.get()));
+        .WillRepeatedly(Return(manager_->GetOpenTabsUIDelegate()));
   }
 
   void NotifySyncEnabled() {
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
index 5d5cab80..bd20555 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
@@ -14,6 +14,7 @@
 #include "ash/public/cpp/immersive/immersive_fullscreen_controller.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_properties.h"
+#include "ash/public/cpp/window_state_type.h"
 #include "ash/shell.h"
 #include "ash/wm/panels/panel_frame_view.h"
 #include "ash/wm/window_properties.h"
@@ -244,8 +245,9 @@
           ash::kRestoreBoundsOverrideKey)) {
     // If an override is given, use that restore state, unless the window is in
     // immersive fullscreen.
-    restore_state = widget()->GetNativeWindow()->GetProperty(
-        ash::kRestoreShowStateOverrideKey);
+    restore_state =
+        ash::ToWindowShowState(widget()->GetNativeWindow()->GetProperty(
+            ash::kRestoreWindowStateTypeOverrideKey));
     is_fullscreen = restore_state == ui::SHOW_STATE_FULLSCREEN;
   } else {
     if (IsMaximized())
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index 01d28e5..9599f8c 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -26,7 +26,6 @@
 #include "components/signin/core/browser/profile_management_switches.h"
 #include "components/signin/core/browser/signin_features.h"
 #include "components/strings/grit/components_strings.h"
-#include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/views/controls/button/md_text_button.h"
@@ -198,9 +197,12 @@
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_)) {
-    footnote_view_ = new DiceBubbleSyncPromoView(
-        profile_, delegate_.get(), IDS_BOOKMARK_DICE_PROMO_SIGNIN_MESSAGE,
-        IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE);
+    DiceBubbleSyncPromoView* dice_bubble_sync_promo_view =
+        new DiceBubbleSyncPromoView(profile_, delegate_.get(),
+                                    IDS_BOOKMARK_DICE_PROMO_SIGNIN_MESSAGE,
+                                    IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE);
+    dice_bubble_sync_promo_view->SetSigninButtonNonProminent();
+    footnote_view_ = dice_bubble_sync_promo_view;
   } else {
     footnote_view_ =
         new BubbleSyncPromoView(delegate_.get(), IDS_BOOKMARK_SYNC_PROMO_LINK,
@@ -258,13 +260,6 @@
   return "BookmarkBubbleView";
 }
 
-void BookmarkBubbleView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
-  LocationBarBubbleDelegateView::GetAccessibleNodeData(node_data);
-  node_data->SetName(l10n_util::GetStringUTF8(
-      newly_bookmarked_ ? IDS_BOOKMARK_BUBBLE_PAGE_BOOKMARKED
-                        : IDS_BOOKMARK_AX_BUBBLE_PAGE_BOOKMARK));
-}
-
 // views::ButtonListener -------------------------------------------------------
 
 void BookmarkBubbleView::ButtonPressed(views::Button* sender,
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h
index ece34925..c7b2ecb4 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h
@@ -82,7 +82,6 @@
   bool Close() override;
   void UpdateButton(views::LabelButton* button, ui::DialogButton type) override;
   const char* GetClassName() const override;
-  void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
 
   // views::ButtonListener:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override;
diff --git a/chrome/browser/ui/views/frame/browser_frame_ash.cc b/chrome/browser/ui/views/frame/browser_frame_ash.cc
index cdd641e..c9c15cc 100644
--- a/chrome/browser/ui/views/frame/browser_frame_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_ash.cc
@@ -9,6 +9,7 @@
 // This file is only instantiated in classic ash/mus. It is never used in mash.
 // See native_browser_frame_factory_chromeos.cc switches on GetAshConfig().
 #include "ash/public/cpp/window_properties.h"  // mash-ok
+#include "ash/public/cpp/window_state_type.h"  // mash-ok
 #include "ash/shell.h"                         // mash-ok
 #include "ash/wm/window_properties.h"          // mash-ok
 #include "ash/wm/window_state.h"               // mash-ok
@@ -107,14 +108,17 @@
                                    ash::kRestoreBoundsOverrideKey);
   if (override_bounds && !override_bounds->IsEmpty()) {
     *bounds = *override_bounds;
-    *show_state = GetWidget()->GetNativeWindow()->GetProperty(
-                      ash::kRestoreShowStateOverrideKey);
+    *show_state =
+        ash::ToWindowShowState(GetWidget()->GetNativeWindow()->GetProperty(
+            ash::kRestoreWindowStateTypeOverrideKey));
   } else {
     *bounds = GetWidget()->GetRestoredBounds();
     *show_state = GetWidget()->GetNativeWindow()->GetProperty(
                       aura::client::kShowStateKey);
   }
 
+  // Session restore might be unable to correctly restore other states.
+  // For the record, https://crbug.com/396272
   if (*show_state != ui::SHOW_STATE_MAXIMIZED &&
       *show_state != ui::SHOW_STATE_MINIMIZED) {
     *show_state = ui::SHOW_STATE_NORMAL;
diff --git a/chrome/browser/ui/views/frame/browser_frame_mus.cc b/chrome/browser/ui/views/frame/browser_frame_mus.cc
index 60545b8..2bad1be 100644
--- a/chrome/browser/ui/views/frame/browser_frame_mus.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_mus.cc
@@ -13,6 +13,7 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "services/ui/public/cpp/property_type_converters.h"
 #include "services/ui/public/interfaces/window_tree.mojom.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/mus/window_tree_host_mus_init_params.h"
 #include "ui/views/mus/desktop_window_tree_host_mus.h"
 #include "ui/views/mus/mus_client.h"
@@ -20,6 +21,8 @@
 
 #if defined(OS_CHROMEOS)
 #include "ash/public/cpp/shelf_types.h"
+#include "ash/public/cpp/window_properties.h"
+#include "ash/public/cpp/window_state_type.h"
 #include "ash/public/interfaces/window_properties.mojom.h"
 #include "ash/public/interfaces/window_style.mojom.h"
 #include "services/ui/public/interfaces/window_manager.mojom.h"
@@ -83,13 +86,34 @@
 }
 
 bool BrowserFrameMus::ShouldSaveWindowPlacement() const {
-  return false;
+#if defined(OS_CHROMEOS)
+  return nullptr == GetWidget()->GetNativeWindow()->GetProperty(
+                        ash::kRestoreBoundsOverrideKey);
+#else
+  return true;
+#endif
 }
 
 void BrowserFrameMus::GetWindowPlacement(
     gfx::Rect* bounds, ui::WindowShowState* show_state) const {
-  *bounds = gfx::Rect(10, 10, 800, 600);
-  *show_state = ui::SHOW_STATE_NORMAL;
+  DesktopNativeWidgetAura::GetWindowPlacement(bounds, show_state);
+#if defined(OS_CHROMEOS)
+  gfx::Rect* override_bounds = GetWidget()->GetNativeWindow()->GetProperty(
+      ash::kRestoreBoundsOverrideKey);
+  if (override_bounds && !override_bounds->IsEmpty()) {
+    *bounds = *override_bounds;
+    *show_state =
+        ash::ToWindowShowState(GetWidget()->GetNativeWindow()->GetProperty(
+            ash::kRestoreWindowStateTypeOverrideKey));
+  }
+#endif
+
+  // Session restore might be unable to correctly restore other states.
+  // For the record, https://crbug.com/396272
+  if (*show_state != ui::SHOW_STATE_MAXIMIZED &&
+      *show_state != ui::SHOW_STATE_MINIMIZED) {
+    *show_state = ui::SHOW_STATE_NORMAL;
+  }
 }
 
 bool BrowserFrameMus::PreHandleKeyboardEvent(
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 34449ef..74cc2b3 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -6,6 +6,8 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
+#include <vector>
 
 #include "base/feature_list.h"
 #include "base/lazy_instance.h"
@@ -335,7 +337,8 @@
   // Third-party software such as DigitalPersona identity verification can hook
   // the underlying window creation methods and use SendMessage to synchronously
   // change focus/activation, resulting in the popup being destroyed by the time
-  // control returns here.  Bail out in this case to avoid a NULL dereference.
+  // control returns here.  Bail out in this case to avoid a nullptr
+  // dereference.
   if (!popup_)
     return;
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
index f14b425..4bb0726 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -10,16 +10,15 @@
 #include <atlwin.h>  // NOLINT
 #endif
 
-#include "base/macros.h"
 #include "chrome/browser/ui/views/omnibox/omnibox_result_view.h"
 
 #include <limits.h>
 
 #include <algorithm>  // NOLINT
-#include <memory>
 
 #include "base/feature_list.h"
 #include "base/i18n/bidi_line_iterator.h"
+#include "base/macros.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/ui/layout_constants.h"
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
index efc1ac45..48cdceb 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -6,6 +6,8 @@
 #define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_RESULT_VIEW_H_
 
 #include <stddef.h>
+#include <memory>
+#include <utility>
 
 #include "base/macros.h"
 #include "components/omnibox/browser/autocomplete_match.h"
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
index f4963a9..3e2a3ab 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
@@ -33,8 +33,13 @@
     BackNavigationType back_navigation_type,
     base::OnceClosure on_edited,
     base::OnceCallback<void(const autofill::AutofillProfile&)> on_added,
-    autofill::AutofillProfile* profile)
-    : EditorViewController(spec, state, dialog, back_navigation_type),
+    autofill::AutofillProfile* profile,
+    bool is_incognito)
+    : EditorViewController(spec,
+                           state,
+                           dialog,
+                           back_navigation_type,
+                           is_incognito),
       profile_to_edit_(profile),
       on_edited_(std::move(on_edited)),
       on_added_(std::move(on_added)) {}
@@ -91,7 +96,8 @@
 
   if (profile_to_edit_) {
     PopulateProfile(profile_to_edit_);
-    state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
+    if (!is_incognito())
+      state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
     state()->profile_comparator()->Invalidate(*profile_to_edit_);
     std::move(on_edited_).Run();
     on_added_.Reset();
@@ -99,7 +105,8 @@
     std::unique_ptr<autofill::AutofillProfile> profile =
         std::make_unique<autofill::AutofillProfile>();
     PopulateProfile(profile.get());
-    state()->GetPersonalDataManager()->AddProfile(*profile);
+    if (!is_incognito())
+      state()->GetPersonalDataManager()->AddProfile(*profile);
     std::move(on_added_).Run(*profile);
     on_edited_.Reset();
   }
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.h b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.h
index 8a000707..94c2fe3 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.h
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.h
@@ -32,7 +32,8 @@
       BackNavigationType back_navigation_type,
       base::OnceClosure on_edited,
       base::OnceCallback<void(const autofill::AutofillProfile&)> on_added,
-      autofill::AutofillProfile* profile);
+      autofill::AutofillProfile* profile,
+      bool is_incognito);
   ~ContactInfoEditorViewController() override;
 
   // EditorViewController:
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
index aae8f2d..94512f71 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
@@ -279,4 +279,47 @@
   EXPECT_EQ(request->state()->contact_profiles().back(), profile);
 }
 
+IN_PROC_BROWSER_TEST_F(PaymentRequestContactInfoEditorTest,
+                       HappyPathInIncognito) {
+  SetIncognito();
+  NavigateTo("/payment_request_contact_details_test.html");
+  InvokePaymentRequestUI();
+  OpenContactInfoEditorScreen();
+
+  SetEditorTextfieldValue(base::ASCIIToUTF16(kNameFull), autofill::NAME_FULL);
+  SetEditorTextfieldValue(base::ASCIIToUTF16(kPhoneNumber),
+                          autofill::PHONE_HOME_WHOLE_NUMBER);
+  SetEditorTextfieldValue(base::ASCIIToUTF16(kEmailAddress),
+                          autofill::EMAIL_ADDRESS);
+
+  autofill::PersonalDataManager* personal_data_manager = GetDataManager();
+  personal_data_manager->AddObserver(&personal_data_observer_);
+
+  EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(0);
+  ClickOnDialogViewAndWait(DialogViewID::EDITOR_SAVE_BUTTON);
+
+  // In incognito, the profile should be available in contact_profiles but it
+  // shouldn't be saved to the PersonalDataManager.
+  ASSERT_EQ(0UL, personal_data_manager->GetProfiles().size());
+  PaymentRequest* request = GetPaymentRequests(GetActiveWebContents()).front();
+  EXPECT_EQ(1U, request->state()->contact_profiles().size());
+  EXPECT_EQ(request->state()->contact_profiles().back(),
+            request->state()->selected_contact_profile());
+
+  autofill::AutofillProfile* profile =
+      request->state()->contact_profiles().back();
+  DCHECK(profile);
+
+  EXPECT_EQ(base::ASCIIToUTF16(kNameFull),
+            profile->GetInfo(autofill::AutofillType(autofill::NAME_FULL),
+                             GetLocale()));
+  EXPECT_EQ(base::ASCIIToUTF16("16515558946"),
+            profile->GetInfo(
+                autofill::AutofillType(autofill::PHONE_HOME_WHOLE_NUMBER),
+                GetLocale()));
+  EXPECT_EQ(base::ASCIIToUTF16(kEmailAddress),
+            profile->GetInfo(autofill::AutofillType(autofill::EMAIL_ADDRESS),
+                             GetLocale()));
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
index 0577433f..a2dd9faf 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
@@ -162,8 +162,9 @@
     int next_ui_tag,
     base::OnceClosure on_edited,
     base::OnceCallback<void(const autofill::CreditCard&)> on_added,
-    autofill::CreditCard* credit_card)
-    : EditorViewController(spec, state, dialog, back_navigation),
+    autofill::CreditCard* credit_card,
+    bool is_incognito)
+    : EditorViewController(spec, state, dialog, back_navigation, is_incognito),
       on_edited_(std::move(on_edited)),
       on_added_(std::move(on_added)),
       credit_card_to_edit_(credit_card),
@@ -409,8 +410,10 @@
 
     credit_card_to_edit_->set_billing_address_id(
         model->GetItemIdentifierAt(address_combobox->selected_index()));
-    state()->GetPersonalDataManager()->UpdateServerCardMetadata(
-        *credit_card_to_edit_);
+    if (!is_incognito()) {
+      state()->GetPersonalDataManager()->UpdateServerCardMetadata(
+          *credit_card_to_edit_);
+    }
     return true;
   }
 
@@ -455,8 +458,10 @@
   }
 
   if (!credit_card_to_edit_) {
-    // Add the card (will not add a duplicate).
-    state()->GetPersonalDataManager()->AddCreditCard(credit_card);
+    if (!is_incognito()) {
+      // Add the card (will not add a duplicate).
+      state()->GetPersonalDataManager()->AddCreditCard(credit_card);
+    }
     std::move(on_added_).Run(credit_card);
   } else {
     credit_card_to_edit_->set_billing_address_id(
@@ -481,7 +486,9 @@
                               locale),
           locale);
     }
-    state()->GetPersonalDataManager()->UpdateCreditCard(*credit_card_to_edit_);
+    if (!is_incognito())
+      state()->GetPersonalDataManager()->UpdateCreditCard(
+          *credit_card_to_edit_);
     std::move(on_edited_).Run();
   }
 
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.h b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.h
index c774419..2616692 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.h
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.h
@@ -45,7 +45,8 @@
       int next_ui_tag,
       base::OnceClosure on_edited,
       base::OnceCallback<void(const autofill::CreditCard&)> on_added,
-      autofill::CreditCard* credit_card);
+      autofill::CreditCard* credit_card,
+      bool is_incognito);
   ~CreditCardEditorViewController() override;
 
   // EditorViewController:
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc
index 266fbb4..6382800 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller_browsertest.cc
@@ -989,4 +989,51 @@
   EXPECT_FALSE(save_button->enabled());
 }
 
+IN_PROC_BROWSER_TEST_F(PaymentRequestCreditCardEditorTest,
+                       EnteringValidDataInIncognito) {
+  SetIncognito();
+  NavigateTo("/payment_request_no_shipping_test.html");
+  autofill::TestAutofillClock test_clock;
+  test_clock.SetNow(kJune2017);
+
+  InvokePaymentRequestUI();
+
+  // No instruments are available.
+  PaymentRequest* request = GetPaymentRequests(GetActiveWebContents()).front();
+  EXPECT_EQ(0U, request->state()->available_instruments().size());
+  EXPECT_EQ(nullptr, request->state()->selected_instrument());
+
+  // But there must be at least one address available for billing.
+  autofill::AutofillProfile billing_profile(autofill::test::GetFullProfile());
+  AddAutofillProfile(billing_profile);
+
+  OpenCreditCardEditorScreen();
+
+  SetEditorTextfieldValue(base::ASCIIToUTF16("Bob Jones"),
+                          autofill::CREDIT_CARD_NAME_FULL);
+  SetEditorTextfieldValue(base::ASCIIToUTF16(" 4111 1111-1111 1111-"),
+                          autofill::CREDIT_CARD_NUMBER);
+  SetComboboxValue(base::ASCIIToUTF16("05"), autofill::CREDIT_CARD_EXP_MONTH);
+  SetComboboxValue(base::ASCIIToUTF16("2026"),
+                   autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR);
+  SelectBillingAddress(billing_profile.guid());
+
+  autofill::PersonalDataManager* personal_data_manager = GetDataManager();
+  personal_data_manager->AddObserver(&personal_data_observer_);
+
+  ResetEventWaiter(DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION);
+
+  EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(0);
+  ClickOnDialogViewAndWait(DialogViewID::EDITOR_SAVE_BUTTON);
+
+  // Since this is incognito, the credit card shouldn't have been added to the
+  // PersonalDataManager but it should be available in available_instruments.
+  EXPECT_EQ(0U, personal_data_manager->GetCreditCards().size());
+
+  // One instrument is available and selected.
+  EXPECT_EQ(1U, request->state()->available_instruments().size());
+  EXPECT_EQ(request->state()->available_instruments().back().get(),
+            request->state()->selected_instrument());
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc
index 672074c..4effc50 100644
--- a/chrome/browser/ui/views/payments/editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -78,10 +78,12 @@
     PaymentRequestSpec* spec,
     PaymentRequestState* state,
     PaymentRequestDialogView* dialog,
-    BackNavigationType back_navigation_type)
+    BackNavigationType back_navigation_type,
+    bool is_incognito)
     : PaymentRequestSheetController(spec, state, dialog),
       initial_focus_field_view_(nullptr),
-      back_navigation_type_(back_navigation_type) {}
+      back_navigation_type_(back_navigation_type),
+      is_incognito_(is_incognito) {}
 
 EditorViewController::~EditorViewController() {}
 
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.h b/chrome/browser/ui/views/payments/editor_view_controller.h
index 42b2476..ec8f317 100644
--- a/chrome/browser/ui/views/payments/editor_view_controller.h
+++ b/chrome/browser/ui/views/payments/editor_view_controller.h
@@ -94,7 +94,8 @@
   EditorViewController(PaymentRequestSpec* spec,
                        PaymentRequestState* state,
                        PaymentRequestDialogView* dialog,
-                       BackNavigationType back_navigation_type);
+                       BackNavigationType back_navigation_type,
+                       bool is_incognito);
   ~EditorViewController() override;
 
   // Will display |error_message| alongside the input field represented by
@@ -172,6 +173,8 @@
       const EditorField& field,
       base::string16* error_message);
 
+  bool is_incognito() const { return is_incognito_; }
+
  private:
   // views::TextfieldController:
   void ContentsChanged(views::Textfield* sender,
@@ -213,6 +216,8 @@
   // Identifies where to go back when the editing completes successfully.
   BackNavigationType back_navigation_type_;
 
+  bool is_incognito_;
+
   DISALLOW_COPY_AND_ASSIGN(EditorViewController);
 };
 
diff --git a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
index 802b5ac..a75b083ab 100644
--- a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
+++ b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
@@ -308,7 +308,7 @@
           std::make_unique<CreditCardEditorViewController>(
               request_->spec(), request_->state(), this, back_navigation_type,
               next_ui_tag, std::move(on_edited), std::move(on_added),
-              credit_card),
+              credit_card, request_->IsIncognito()),
           &controller_map_),
       /* animate = */ true);
   if (observer_for_testing_)
@@ -324,7 +324,8 @@
       CreateViewAndInstallController(
           std::make_unique<ShippingAddressEditorViewController>(
               request_->spec(), request_->state(), this, back_navigation_type,
-              std::move(on_edited), std::move(on_added), profile),
+              std::move(on_edited), std::move(on_added), profile,
+              request_->IsIncognito()),
           &controller_map_),
       /* animate = */ true);
   if (observer_for_testing_)
@@ -340,7 +341,8 @@
       CreateViewAndInstallController(
           std::make_unique<ContactInfoEditorViewController>(
               request_->spec(), request_->state(), this, back_navigation_type,
-              std::move(on_edited), std::move(on_added), profile),
+              std::move(on_edited), std::move(on_added), profile,
+              request_->IsIncognito()),
           &controller_map_),
       /* animate = */ true);
   if (observer_for_testing_)
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
index d1e0ede..50e406d 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
@@ -51,8 +51,13 @@
     BackNavigationType back_navigation_type,
     base::OnceClosure on_edited,
     base::OnceCallback<void(const autofill::AutofillProfile&)> on_added,
-    autofill::AutofillProfile* profile)
-    : EditorViewController(spec, state, dialog, back_navigation_type),
+    autofill::AutofillProfile* profile,
+    bool is_incognito)
+    : EditorViewController(spec,
+                           state,
+                           dialog,
+                           back_navigation_type,
+                           is_incognito),
       on_edited_(std::move(on_edited)),
       on_added_(std::move(on_added)),
       profile_to_edit_(profile),
@@ -121,7 +126,8 @@
   if (!profile_to_edit_) {
     // Add the profile (will not add a duplicate).
     profile.set_origin(autofill::kSettingsOrigin);
-    state()->GetPersonalDataManager()->AddProfile(profile);
+    if (!is_incognito())
+      state()->GetPersonalDataManager()->AddProfile(profile);
     std::move(on_added_).Run(profile);
     on_edited_.Reset();
   } else {
@@ -139,7 +145,8 @@
                                        /*ignore_errors=*/false);
     DCHECK(success);
     profile_to_edit_->set_origin(autofill::kSettingsOrigin);
-    state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
+    if (!is_incognito())
+      state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
     state()->profile_comparator()->Invalidate(*profile_to_edit_);
     std::move(on_edited_).Run();
     on_added_.Reset();
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.h b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.h
index dda2ecb7..dce1ecd 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.h
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.h
@@ -42,7 +42,8 @@
       BackNavigationType back_navigation_type,
       base::OnceClosure on_edited,
       base::OnceCallback<void(const autofill::AutofillProfile&)> on_added,
-      autofill::AutofillProfile* profile);
+      autofill::AutofillProfile* profile,
+      bool is_incognito);
   ~ShippingAddressEditorViewController() override;
 
   // EditorViewController:
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
index a5e93633..98190328 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -1216,4 +1216,52 @@
                 autofill::ADDRESS_HOME_COUNTRY, kLocale));
 }
 
+IN_PROC_BROWSER_TEST_F(PaymentRequestShippingAddressEditorTest,
+                       SyncDataInIncognito) {
+  SetIncognito();
+  NavigateTo("/payment_request_dynamic_shipping_test.html");
+  InvokePaymentRequestUI();
+  SetRegionDataLoader(&test_region_data_loader_);
+
+  // No shipping profiles are available.
+  PaymentRequest* request = GetPaymentRequests(GetActiveWebContents()).front();
+  EXPECT_EQ(0U, request->state()->shipping_profiles().size());
+  EXPECT_EQ(nullptr, request->state()->selected_shipping_profile());
+
+  test_region_data_loader_.set_synchronous_callback(true);
+  OpenShippingAddressEditorScreen();
+
+  std::string country_code(GetSelectedCountryCode());
+
+  SetCommonFields();
+  // We also need to set the state when no region data is provided.
+  SetFieldTestValue(autofill::ADDRESS_HOME_STATE);
+
+  ResetEventWaiterForSequence({DialogEvent::PROCESSING_SPINNER_SHOWN,
+                               DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION,
+                               DialogEvent::PROCESSING_SPINNER_HIDDEN});
+
+  // Verifying the data is in the DB.
+  autofill::PersonalDataManager* personal_data_manager = GetDataManager();
+  personal_data_manager->AddObserver(&personal_data_observer_);
+
+  EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged()).Times(0);
+  ClickOnDialogViewAndWait(DialogViewID::SAVE_ADDRESS_BUTTON);
+
+  // In incognito, the profile should be available in shipping_profiles but it
+  // shouldn't be saved to the PersonalDataManager.
+  ASSERT_EQ(0UL, personal_data_manager->GetProfiles().size());
+
+  ASSERT_EQ(1UL, request->state()->shipping_profiles().size());
+  autofill::AutofillProfile* profile =
+      request->state()->shipping_profiles().back();
+  DCHECK(profile);
+  EXPECT_EQ(base::ASCIIToUTF16(country_code),
+            profile->GetRawInfo(autofill::ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(base::ASCIIToUTF16(kAnyState),
+            profile->GetRawInfo(autofill::ADDRESS_HOME_STATE));
+  ExpectExistingRequiredFields(/*unset_types=*/nullptr,
+                               /*accept_empty_phone_number=*/false);
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 9b9ebcf..dda7abb 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -133,6 +133,10 @@
   layout->AddPaddingRow(2, provider->GetDistanceMetric(
                                views::DISTANCE_UNRELATED_CONTROL_VERTICAL));
 
+  // Needed to ensure this View is drawn even if a sibling (such as dev tools)
+  // has a z-order.
+  SetPaintToLayer();
+
   AttachToWebView();
 
   // Make the accessibility role of this view an alert dialog, and
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc
index 7dde24a..a7cdf0f 100644
--- a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc
+++ b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc
@@ -74,6 +74,14 @@
 
 DiceBubbleSyncPromoView::~DiceBubbleSyncPromoView() = default;
 
+void DiceBubbleSyncPromoView::SetSigninButtonNonProminent() {
+  if (!signin_button_->account()) {
+    // Only the sign-in button can be non prominent (the turn-on-sync button is
+    // always prominent).
+    signin_button_->SetProminent(false);
+  }
+}
+
 void DiceBubbleSyncPromoView::ButtonPressed(views::Button* sender,
                                             const ui::Event& event) {
   if (sender == signin_button_) {
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h
index 821b22e..471fb76 100644
--- a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h
+++ b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h
@@ -40,6 +40,10 @@
                           int accounts_promo_message_resource_id);
   ~DiceBubbleSyncPromoView() override;
 
+  // If a non-personalized signin button is shown in the promo, it is set to
+  // non-prominent. Otherwise, this function does nothing.
+  void SetSigninButtonNonProminent();
+
   // views::ButtonListener:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override;
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index 89497e4..a779f24 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -49,7 +49,6 @@
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
-#include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/accessibility/ax_node_data.h"
@@ -63,6 +62,7 @@
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/native_theme/native_theme_aura.h"
+#include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/widget/tooltip_manager.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/non_client_view.h"
@@ -150,6 +150,8 @@
   back_->set_tag(IDC_BACK);
   back_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_BACK));
   back_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
+  back_->GetViewAccessibility().OverrideDescription(
+      l10n_util::GetStringUTF8(IDS_ACCDESCRIPTION_BACK));
   back_->set_id(VIEW_ID_BACK_BUTTON);
   back_->Init();
 
@@ -163,6 +165,8 @@
   forward_->set_tag(IDC_FORWARD);
   forward_->SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_FORWARD));
   forward_->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD));
+  forward_->GetViewAccessibility().OverrideDescription(
+      l10n_util::GetStringUTF8(IDS_ACCDESCRIPTION_FORWARD));
   forward_->set_id(VIEW_ID_FORWARD_BUTTON);
   forward_->Init();
 
@@ -227,15 +231,6 @@
       base::BindRepeating(&ToolbarView::OnShowHomeButtonChanged,
                           base::Unretained(this)));
 
-  // Accessibility specific tooltip text.
-  if (content::BrowserAccessibilityState::GetInstance()->
-          IsAccessibleBrowser()) {
-    back_->SetTooltipText(
-        l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLTIP_BACK));
-    forward_->SetTooltipText(
-        l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLTIP_FORWARD));
-  }
-
   initialized_ = true;
 }
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h
index 597cb0d..e09a467f 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -103,6 +103,7 @@
   // Accessors.
   Browser* browser() const { return browser_; }
   BrowserActionsContainer* browser_actions() const { return browser_actions_; }
+  ToolbarButton* back_button() const { return back_; }
   ReloadButton* reload_button() const { return reload_; }
   LocationBarView* location_bar() const { return location_bar_; }
   AppMenuButton* app_menu_button() const { return app_menu_button_; }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
index b7471a3..1f5c767 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/views/toolbar/app_menu_button.h"
 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
 #include "chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "components/bookmarks/browser/bookmark_model.h"
@@ -275,3 +276,22 @@
   Browser* second_browser = CreateBrowser(browser()->profile());
   RunToolbarCycleFocusTest(second_browser);
 }
+
+IN_PROC_BROWSER_TEST_F(ToolbarViewTest, BackButtonUpdate) {
+  ToolbarView* toolbar =
+      BrowserView::GetBrowserViewForBrowser(browser())->toolbar();
+  EXPECT_FALSE(toolbar->back_button()->enabled());
+
+  // Navigate to title1.html. Back button should be enabled.
+  GURL url = ui_test_utils::GetTestUrl(
+      base::FilePath(), base::FilePath(FILE_PATH_LITERAL("title1.html")));
+  ui_test_utils::NavigateToURL(browser(), url);
+  EXPECT_TRUE(toolbar->back_button()->enabled());
+
+  // Delete old navigations. Back button will be disabled.
+  auto& controller =
+      browser()->tab_strip_model()->GetActiveWebContents()->GetController();
+  controller.DeleteNavigationEntries(base::BindRepeating(
+      [&](const content::NavigationEntry& entry) { return true; }));
+  EXPECT_FALSE(toolbar->back_button()->enabled());
+}
diff --git a/chrome/browser/ui/webui/browsing_history_handler.cc b/chrome/browser/ui/webui/browsing_history_handler.cc
index 7666d2d..a73f6ce7 100644
--- a/chrome/browser/ui/webui/browsing_history_handler.cc
+++ b/chrome/browser/ui/webui/browsing_history_handler.cc
@@ -242,6 +242,9 @@
       ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile);
   browsing_history_service_ = std::make_unique<BrowsingHistoryService>(
       this, local_history, sync_service);
+  // Make sure BrowsingDataRemoverDelegate is initialized and listening
+  // for history deletions.
+  profile->GetBrowsingDataRemoverDelegate();
 
   // Create our favicon data source.
   content::URLDataSource::Add(profile, new FaviconSource(profile));
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index 597ffcf..ab19c4d 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -40,6 +40,7 @@
 
 const char kInitUICommand[]  = "init-ui";
 const char kInspectCommand[]  = "inspect";
+const char kInspectFallbackCommand[] = "inspect-fallback";
 const char kInspectAdditionalCommand[] = "inspect-additional";
 const char kActivateCommand[]  = "activate";
 const char kCloseCommand[] = "close";
@@ -90,6 +91,7 @@
 
   void HandleInitUICommand(const base::ListValue* args);
   void HandleInspectCommand(const base::ListValue* args);
+  void HandleInspectFallbackCommand(const base::ListValue* args);
   void HandleInspectAdditionalCommand(const base::ListValue* args);
   void HandleActivateCommand(const base::ListValue* args);
   void HandleCloseCommand(const base::ListValue* args);
@@ -115,6 +117,10 @@
       base::Bind(&InspectMessageHandler::HandleInspectCommand,
                  base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
+      kInspectFallbackCommand,
+      base::BindRepeating(&InspectMessageHandler::HandleInspectFallbackCommand,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
       kInspectAdditionalCommand,
       base::Bind(&InspectMessageHandler::HandleInspectAdditionalCommand,
                  base::Unretained(this)));
@@ -177,6 +183,14 @@
     inspect_ui_->Inspect(source, id);
 }
 
+void InspectMessageHandler::HandleInspectFallbackCommand(
+    const base::ListValue* args) {
+  std::string source;
+  std::string id;
+  if (ParseStringArgs(args, &source, &id))
+    inspect_ui_->InspectFallback(source, id);
+}
+
 void InspectMessageHandler::HandleInspectAdditionalCommand(
     const base::ListValue* args) {
   std::string url;
@@ -358,6 +372,16 @@
   }
 }
 
+void InspectUI::InspectFallback(const std::string& source_id,
+                                const std::string& target_id) {
+  scoped_refptr<DevToolsAgentHost> target = FindTarget(source_id, target_id);
+  if (target) {
+    Profile* profile = Profile::FromBrowserContext(
+        web_ui()->GetWebContents()->GetBrowserContext());
+    DevToolsWindow::OpenDevToolsWindowWithBundledFrontend(target, profile);
+  }
+}
+
 void InspectUI::Activate(const std::string& source_id,
                          const std::string& target_id) {
   scoped_refptr<DevToolsAgentHost> target = FindTarget(source_id, target_id);
diff --git a/chrome/browser/ui/webui/inspect_ui.h b/chrome/browser/ui/webui/inspect_ui.h
index a0ccc38..4838d34 100644
--- a/chrome/browser/ui/webui/inspect_ui.h
+++ b/chrome/browser/ui/webui/inspect_ui.h
@@ -38,6 +38,8 @@
 
   void InitUI();
   void Inspect(const std::string& source_id, const std::string& target_id);
+  void InspectFallback(const std::string& source_id,
+                       const std::string& target_id);
   void Activate(const std::string& source_id, const std::string& target_id);
   void Close(const std::string& source_id, const std::string& target_id);
   void Reload(const std::string& source_id, const std::string& target_id);
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc
index 425f41bc..c38eda3 100644
--- a/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -10,7 +10,7 @@
 #include <utility>
 #include <vector>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/bind.h"
 #include "base/memory/weak_ptr.h"
 #include "base/path_service.h"
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 586f981..da46a7f 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -473,7 +473,12 @@
 #if defined(OS_CHROMEOS)
   if (AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile)) {
     clear_cookies_summary_msg_id =
-        IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_MIRROR_SUMMARY_BASIC;
+        IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION;
+  }
+#else  // !defined(OS_CHROMEOS)
+  if (signin::IsDiceEnabledForProfile(profile->GetPrefs())) {
+    clear_cookies_summary_msg_id =
+        IDS_SETTINGS_CLEAR_COOKIES_AND_SITE_DATA_SUMMARY_BASIC_WITH_EXCEPTION;
   }
 #endif
 
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
index 062d170..3b1453e6 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -47,9 +47,6 @@
       base::Bind(
           &ProtocolHandlersHandler::HandleObserveProtocolHandlersEnabledState,
           base::Unretained(this)));
-  web_ui()->RegisterMessageCallback("clearDefault",
-      base::Bind(&ProtocolHandlersHandler::HandleClearDefault,
-                 base::Unretained(this)));
   web_ui()->RegisterMessageCallback("removeHandler",
       base::Bind(&ProtocolHandlersHandler::HandleRemoveHandler,
                  base::Unretained(this)));
@@ -59,9 +56,6 @@
   web_ui()->RegisterMessageCallback("setDefault",
       base::Bind(&ProtocolHandlersHandler::HandleSetDefault,
                  base::Unretained(this)));
-  web_ui()->RegisterMessageCallback("removeIgnoredHandler",
-      base::Bind(&ProtocolHandlersHandler::HandleRemoveIgnoredHandler,
-                 base::Unretained(this)));
 }
 
 ProtocolHandlerRegistry* ProtocolHandlersHandler::GetProtocolHandlerRegistry() {
@@ -70,6 +64,7 @@
 }
 
 static void GetHandlersAsListValue(
+    const ProtocolHandlerRegistry& registry,
     const ProtocolHandlerRegistry::ProtocolHandlerList& handlers,
     base::ListValue* handler_list) {
   ProtocolHandlerRegistry::ProtocolHandlerList::const_iterator handler;
@@ -79,6 +74,7 @@
     handler_value->SetString("protocol", handler->protocol());
     handler_value->SetString("spec", handler->url().spec());
     handler_value->SetString("host", handler->url().host());
+    handler_value->SetBoolean("is_default", registry.IsDefault(*handler));
     handler_list->Append(std::move(handler_value));
   }
 }
@@ -88,16 +84,9 @@
     base::DictionaryValue* handlers_value) {
   ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry();
   handlers_value->SetString("protocol", protocol);
-  handlers_value->SetInteger("default_handler",
-      registry->GetHandlerIndex(protocol));
-  handlers_value->SetBoolean(
-      "is_default_handler_set_by_user",
-      registry->IsRegisteredByUser(registry->GetHandlerFor(protocol)));
-  handlers_value->SetBoolean("has_policy_recommendations",
-                             registry->HasPolicyRegisteredHandler(protocol));
 
   auto handlers_list = std::make_unique<base::ListValue>();
-  GetHandlersAsListValue(registry->GetHandlersFor(protocol),
+  GetHandlersAsListValue(*registry, registry->GetHandlersFor(protocol),
                          handlers_list.get());
   handlers_value->Set("handlers", std::move(handlers_list));
 }
@@ -106,7 +95,7 @@
   ProtocolHandlerRegistry* registry = GetProtocolHandlerRegistry();
   ProtocolHandlerRegistry::ProtocolHandlerList ignored_handlers =
       registry->GetIgnoredHandlers();
-  return GetHandlersAsListValue(ignored_handlers, handlers);
+  return GetHandlersAsListValue(*registry, ignored_handlers, handlers);
 }
 
 void ProtocolHandlersHandler::UpdateHandlerList() {
@@ -148,13 +137,8 @@
 }
 
 void ProtocolHandlersHandler::HandleRemoveHandler(const base::ListValue* args) {
-  const base::ListValue* list;
-  if (!args->GetList(0, &list)) {
-    NOTREACHED();
-    return;
-  }
-
-  ProtocolHandler handler(ParseHandlerFromArgs(list));
+  ProtocolHandler handler(ParseHandlerFromArgs(args));
+  CHECK(!handler.IsEmpty());
   GetProtocolHandlerRegistry()->RemoveHandler(handler);
 
   // No need to call UpdateHandlerList() - we should receive a notification
@@ -162,18 +146,6 @@
   // then.
 }
 
-void ProtocolHandlersHandler::HandleRemoveIgnoredHandler(
-    const base::ListValue* args) {
-  const base::ListValue* list;
-  if (!args->GetList(0, &list)) {
-    NOTREACHED();
-    return;
-  }
-
-  ProtocolHandler handler(ParseHandlerFromArgs(list));
-  GetProtocolHandlerRegistry()->RemoveIgnoredHandler(handler);
-}
-
 void ProtocolHandlersHandler::HandleSetHandlersEnabled(
     const base::ListValue* args) {
   bool enabled = true;
@@ -184,18 +156,8 @@
     GetProtocolHandlerRegistry()->Disable();
 }
 
-void ProtocolHandlersHandler::HandleClearDefault(const base::ListValue* args) {
-  const base::Value* value;
-  CHECK(args->Get(0, &value));
-  std::string protocol_to_clear;
-  CHECK(value->GetAsString(&protocol_to_clear));
-  GetProtocolHandlerRegistry()->ClearDefault(protocol_to_clear);
-}
-
 void ProtocolHandlersHandler::HandleSetDefault(const base::ListValue* args) {
-  const base::ListValue* list;
-  CHECK(args->GetList(0, &list));
-  const ProtocolHandler& handler(ParseHandlerFromArgs(list));
+  const ProtocolHandler& handler(ParseHandlerFromArgs(args));
   CHECK(!handler.IsEmpty());
   GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(handler);
 }
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
index 269f27f..cf5094a 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
@@ -63,12 +63,8 @@
   // Called when the user sets a new default handler for a protocol.
   void HandleSetDefault(const base::ListValue* args);
 
-  // Called when the user clears the default handler for a protocol.
-  // |args| is the string name of the protocol to clear.
-  void HandleClearDefault(const base::ListValue* args);
-
   // Parses a ProtocolHandler out of the arguments passed back from the view.
-  // |args| is a list of [protocol, url, title].
+  // |args| is a list of [protocol, url].
   ProtocolHandler ParseHandlerFromArgs(const base::ListValue* args) const;
 
   // Returns a JSON object describing the set of protocol handlers for the
@@ -83,13 +79,9 @@
   void UpdateHandlerList();
 
   // Remove a handler.
-  // |args| is a list of [protocol, url, title].
+  // |args| is a list of [protocol, url].
   void HandleRemoveHandler(const base::ListValue* args);
 
-  // Remove an ignored handler.
-  // |args| is a list of [protocol, url, title].
-  void HandleRemoveIgnoredHandler(const base::ListValue* args);
-
   ProtocolHandlerRegistry* GetProtocolHandlerRegistry();
 
   content::NotificationRegistrar notification_registrar_;
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index 2935cf1..136d874 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -15,8 +15,8 @@
 
 static_library("vr_common") {
   sources = [
-    "animation_player.cc",
-    "animation_player.h",
+    "animation.cc",
+    "animation.h",
     "assets_component_update_status.h",
     "assets_load_status.h",
     "assets_loader.cc",
@@ -237,7 +237,7 @@
 
 test("vr_common_unittests") {
   sources = [
-    "animation_player_unittest.cc",
+    "animation_unittest.cc",
     "databinding/binding_unittest.cc",
     "databinding/vector_binding_unittest.cc",
     "elements/button_unittest.cc",
diff --git a/chrome/browser/vr/animation_player.cc b/chrome/browser/vr/animation.cc
similarity index 82%
rename from chrome/browser/vr/animation_player.cc
rename to chrome/browser/vr/animation.cc
index 08230c1..5d26df1e 100644
--- a/chrome/browser/vr/animation_player.cc
+++ b/chrome/browser/vr/animation.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/vr/animation_player.h"
+#include "chrome/browser/vr/animation.h"
 
 #include <algorithm>
 
@@ -137,23 +137,23 @@
 
 }  // namespace
 
-int AnimationPlayer::GetNextKeyframeModelId() {
+int Animation::GetNextKeyframeModelId() {
   return s_next_keyframe_model_id++;
 }
 
-int AnimationPlayer::GetNextGroupId() {
+int Animation::GetNextGroupId() {
   return s_next_group_id++;
 }
 
-AnimationPlayer::AnimationPlayer() {}
-AnimationPlayer::~AnimationPlayer() {}
+Animation::Animation() {}
+Animation::~Animation() {}
 
-void AnimationPlayer::AddKeyframeModel(
+void Animation::AddKeyframeModel(
     std::unique_ptr<cc::KeyframeModel> keyframe_model) {
   keyframe_models_.push_back(std::move(keyframe_model));
 }
 
-void AnimationPlayer::RemoveKeyframeModel(int keyframe_model_id) {
+void Animation::RemoveKeyframeModel(int keyframe_model_id) {
   base::EraseIf(keyframe_models_,
                 [keyframe_model_id](
                     const std::unique_ptr<cc::KeyframeModel>& keyframe_model) {
@@ -161,7 +161,7 @@
                 });
 }
 
-void AnimationPlayer::RemoveKeyframeModels(int target_property) {
+void Animation::RemoveKeyframeModels(int target_property) {
   base::EraseIf(keyframe_models_,
                 [target_property](
                     const std::unique_ptr<cc::KeyframeModel>& keyframe_model) {
@@ -170,7 +170,7 @@
                 });
 }
 
-void AnimationPlayer::Tick(base::TimeTicks monotonic_time) {
+void Animation::Tick(base::TimeTicks monotonic_time) {
   DCHECK(target_);
 
   StartKeyframeModels(monotonic_time);
@@ -191,23 +191,22 @@
   StartKeyframeModels(monotonic_time);
 }
 
-void AnimationPlayer::SetTransitionedProperties(
-    const std::set<int>& properties) {
+void Animation::SetTransitionedProperties(const std::set<int>& properties) {
   transition_.target_properties = properties;
 }
 
-void AnimationPlayer::SetTransitionDuration(base::TimeDelta delta) {
+void Animation::SetTransitionDuration(base::TimeDelta delta) {
   transition_.duration = delta;
 }
 
-void AnimationPlayer::TransitionFloatTo(base::TimeTicks monotonic_time,
-                                        int target_property,
-                                        float current,
-                                        float target) {
+void Animation::TransitionFloatTo(base::TimeTicks monotonic_time,
+                                  int target_property,
+                                  float current,
+                                  float target) {
   TransitionValueTo<float>(monotonic_time, target_property, current, target);
 }
 
-void AnimationPlayer::TransitionTransformOperationsTo(
+void Animation::TransitionTransformOperationsTo(
     base::TimeTicks monotonic_time,
     int target_property,
     const cc::TransformOperations& current,
@@ -216,22 +215,22 @@
                                              current, target);
 }
 
-void AnimationPlayer::TransitionSizeTo(base::TimeTicks monotonic_time,
-                                       int target_property,
-                                       const gfx::SizeF& current,
-                                       const gfx::SizeF& target) {
+void Animation::TransitionSizeTo(base::TimeTicks monotonic_time,
+                                 int target_property,
+                                 const gfx::SizeF& current,
+                                 const gfx::SizeF& target) {
   TransitionValueTo<gfx::SizeF>(monotonic_time, target_property, current,
                                 target);
 }
 
-void AnimationPlayer::TransitionColorTo(base::TimeTicks monotonic_time,
-                                        int target_property,
-                                        SkColor current,
-                                        SkColor target) {
+void Animation::TransitionColorTo(base::TimeTicks monotonic_time,
+                                  int target_property,
+                                  SkColor current,
+                                  SkColor target) {
   TransitionValueTo<SkColor>(monotonic_time, target_property, current, target);
 }
 
-bool AnimationPlayer::IsAnimatingProperty(int property) const {
+bool Animation::IsAnimatingProperty(int property) const {
   for (auto& keyframe_model : keyframe_models_) {
     if (keyframe_model->target_property_id() == property)
       return true;
@@ -239,30 +238,30 @@
   return false;
 }
 
-float AnimationPlayer::GetTargetFloatValue(int target_property,
-                                           float default_value) const {
+float Animation::GetTargetFloatValue(int target_property,
+                                     float default_value) const {
   return GetTargetValue<float>(target_property, default_value);
 }
 
-cc::TransformOperations AnimationPlayer::GetTargetTransformOperationsValue(
+cc::TransformOperations Animation::GetTargetTransformOperationsValue(
     int target_property,
     const cc::TransformOperations& default_value) const {
   return GetTargetValue<cc::TransformOperations>(target_property,
                                                  default_value);
 }
 
-gfx::SizeF AnimationPlayer::GetTargetSizeValue(
+gfx::SizeF Animation::GetTargetSizeValue(
     int target_property,
     const gfx::SizeF& default_value) const {
   return GetTargetValue<gfx::SizeF>(target_property, default_value);
 }
 
-SkColor AnimationPlayer::GetTargetColorValue(int target_property,
-                                             SkColor default_value) const {
+SkColor Animation::GetTargetColorValue(int target_property,
+                                       SkColor default_value) const {
   return GetTargetValue<SkColor>(target_property, default_value);
 }
 
-void AnimationPlayer::StartKeyframeModels(base::TimeTicks monotonic_time) {
+void Animation::StartKeyframeModels(base::TimeTicks monotonic_time) {
   cc::TargetProperties animated_properties;
   for (auto& keyframe_model : keyframe_models_) {
     if (keyframe_model->run_state() == cc::KeyframeModel::RUNNING ||
@@ -282,10 +281,10 @@
 }
 
 template <typename ValueType>
-void AnimationPlayer::TransitionValueTo(base::TimeTicks monotonic_time,
-                                        int target_property,
-                                        const ValueType& current,
-                                        const ValueType& target) {
+void Animation::TransitionValueTo(base::TimeTicks monotonic_time,
+                                  int target_property,
+                                  const ValueType& current,
+                                  const ValueType& target) {
   DCHECK(target_);
 
   if (transition_.target_properties.find(target_property) ==
@@ -330,7 +329,7 @@
                                 GetNextGroupId(), target_property));
 }
 
-cc::KeyframeModel* AnimationPlayer::GetRunningKeyframeModelForProperty(
+cc::KeyframeModel* Animation::GetRunningKeyframeModelForProperty(
     int target_property) const {
   for (auto& keyframe_model : keyframe_models_) {
     if ((keyframe_model->run_state() == cc::KeyframeModel::RUNNING ||
@@ -342,7 +341,7 @@
   return nullptr;
 }
 
-cc::KeyframeModel* AnimationPlayer::GetKeyframeModelForProperty(
+cc::KeyframeModel* Animation::GetKeyframeModelForProperty(
     int target_property) const {
   for (auto& keyframe_model : keyframe_models_) {
     if (keyframe_model->target_property_id() == target_property) {
@@ -353,9 +352,8 @@
 }
 
 template <typename ValueType>
-ValueType AnimationPlayer::GetTargetValue(
-    int target_property,
-    const ValueType& default_value) const {
+ValueType Animation::GetTargetValue(int target_property,
+                                    const ValueType& default_value) const {
   cc::KeyframeModel* running_keyframe_model =
       GetKeyframeModelForProperty(target_property);
   if (!running_keyframe_model) {
diff --git a/chrome/browser/vr/animation_player.h b/chrome/browser/vr/animation.h
similarity index 89%
rename from chrome/browser/vr/animation_player.h
rename to chrome/browser/vr/animation.h
index 0a0ddac..e1898ef 100644
--- a/chrome/browser/vr/animation_player.h
+++ b/chrome/browser/vr/animation.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
-#define CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
+#ifndef CHROME_BROWSER_VR_ANIMATION_H_
+#define CHROME_BROWSER_VR_ANIMATION_H_
 
 #include <set>
 #include <vector>
@@ -24,20 +24,20 @@
 
 namespace vr {
 
-// This is a simplified version of the cc::AnimationPlayer. Its sole purpose
-// is the management of its collection of KeyframeModels. Ticking them, updating
-// their state, and deleting them as required.
+// This is a simplified version of the cc::Animation. Its sole purpose is the
+// management of its collection of KeyframeModels. Ticking them, updating their
+// state, and deleting them as required.
 //
 // TODO(vollick): if cc::KeyframeModel and friends move into gfx/, then this
 // class should follow suit. As such, it should not absorb any vr-specific
 // functionality.
-class AnimationPlayer final {
+class Animation final {
  public:
   static int GetNextKeyframeModelId();
   static int GetNextGroupId();
 
-  AnimationPlayer();
-  ~AnimationPlayer();
+  Animation();
+  ~Animation();
 
   cc::AnimationTarget* target() const { return target_; }
   void set_target(cc::AnimationTarget* target) { target_ = target; }
@@ -109,9 +109,9 @@
   KeyframeModels keyframe_models_;
   Transition transition_;
 
-  DISALLOW_COPY_AND_ASSIGN(AnimationPlayer);
+  DISALLOW_COPY_AND_ASSIGN(Animation);
 };
 
 }  // namespace vr
 
-#endif  //  CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
+#endif  //  CHROME_BROWSER_VR_ANIMATION_H_
diff --git a/chrome/browser/vr/animation_player_unittest.cc b/chrome/browser/vr/animation_player_unittest.cc
deleted file mode 100644
index 876c3cb..0000000
--- a/chrome/browser/vr/animation_player_unittest.cc
+++ /dev/null
@@ -1,656 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/vr/animation_player.h"
-
-#include "cc/animation/animation_target.h"
-#include "cc/test/geometry_test_utils.h"
-#include "chrome/browser/vr/target_property.h"
-#include "chrome/browser/vr/test/animation_utils.h"
-#include "chrome/browser/vr/test/constants.h"
-#include "chrome/browser/vr/transition.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/test/gfx_util.h"
-
-namespace vr {
-
-static constexpr float kNoise = 1e-6f;
-
-class TestAnimationTarget : public cc::AnimationTarget {
- public:
-  TestAnimationTarget() {
-    layout_offset_.AppendTranslate(0, 0, 0);
-    operations_.AppendTranslate(0, 0, 0);
-    operations_.AppendRotate(1, 0, 0, 0);
-    operations_.AppendScale(1, 1, 1);
-  }
-
-  const gfx::SizeF& size() const { return size_; }
-  const cc::TransformOperations& operations() const { return operations_; }
-  const cc::TransformOperations& layout_offset() const {
-    return layout_offset_;
-  }
-  float opacity() const { return opacity_; }
-  SkColor background_color() const { return background_color_; }
-
-  void NotifyClientSizeAnimated(const gfx::SizeF& size,
-                                int target_property_id,
-                                cc::KeyframeModel* keyframe_model) override {
-    size_ = size;
-  }
-
-  void NotifyClientTransformOperationsAnimated(
-      const cc::TransformOperations& operations,
-      int target_property_id,
-      cc::KeyframeModel* keyframe_model) override {
-    if (target_property_id == LAYOUT_OFFSET) {
-      layout_offset_ = operations;
-    } else {
-      operations_ = operations;
-    }
-  }
-
-  void NotifyClientFloatAnimated(float opacity,
-                                 int target_property_id,
-                                 cc::KeyframeModel* keyframe_model) override {
-    opacity_ = opacity;
-  }
-
-  void NotifyClientColorAnimated(SkColor color,
-                                 int target_property_id,
-                                 cc::KeyframeModel* keyframe_model) override {
-    background_color_ = color;
-  }
-
- private:
-  cc::TransformOperations layout_offset_;
-  cc::TransformOperations operations_;
-  gfx::SizeF size_ = {10.0f, 10.0f};
-  float opacity_ = 1.0f;
-  SkColor background_color_ = SK_ColorRED;
-};
-
-TEST(AnimationPlayerTest, AddRemoveKeyframeModels) {
-  AnimationPlayer player;
-  EXPECT_TRUE(player.keyframe_models().empty());
-
-  player.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
-                                                gfx::SizeF(20, 200),
-                                                MicrosecondsToDelta(10000)));
-  EXPECT_EQ(1ul, player.keyframe_models().size());
-  EXPECT_EQ(BOUNDS, player.keyframe_models()[0]->target_property_id());
-
-  cc::TransformOperations from_operations;
-  from_operations.AppendTranslate(10, 100, 1000);
-  cc::TransformOperations to_operations;
-  to_operations.AppendTranslate(20, 200, 2000);
-  player.AddKeyframeModel(CreateTransformAnimation(
-      2, 2, from_operations, to_operations, MicrosecondsToDelta(10000)));
-
-  EXPECT_EQ(2ul, player.keyframe_models().size());
-  EXPECT_EQ(TRANSFORM, player.keyframe_models()[1]->target_property_id());
-
-  player.AddKeyframeModel(CreateTransformAnimation(
-      3, 3, from_operations, to_operations, MicrosecondsToDelta(10000)));
-  EXPECT_EQ(3ul, player.keyframe_models().size());
-  EXPECT_EQ(TRANSFORM, player.keyframe_models()[2]->target_property_id());
-
-  player.RemoveKeyframeModels(TRANSFORM);
-  EXPECT_EQ(1ul, player.keyframe_models().size());
-  EXPECT_EQ(BOUNDS, player.keyframe_models()[0]->target_property_id());
-
-  player.RemoveKeyframeModel(player.keyframe_models()[0]->id());
-  EXPECT_TRUE(player.keyframe_models().empty());
-}
-
-TEST(AnimationPlayerTest, AnimationLifecycle) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-
-  player.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
-                                                gfx::SizeF(20, 200),
-                                                MicrosecondsToDelta(10000)));
-  EXPECT_EQ(1ul, player.keyframe_models().size());
-  EXPECT_EQ(BOUNDS, player.keyframe_models()[0]->target_property_id());
-  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player.keyframe_models()[0]->run_state());
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1);
-  player.Tick(start_time);
-  EXPECT_EQ(cc::KeyframeModel::RUNNING,
-            player.keyframe_models()[0]->run_state());
-
-  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
-
-  // Tick beyond the animation
-  player.Tick(start_time + MicrosecondsToDelta(20000));
-
-  EXPECT_TRUE(player.keyframe_models().empty());
-
-  // Should have assumed the final value.
-  EXPECT_SIZEF_EQ(gfx::SizeF(20, 200), target.size());
-}
-
-TEST(AnimationPlayerTest, AnimationQueue) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-
-  player.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
-                                                gfx::SizeF(20, 200),
-                                                MicrosecondsToDelta(10000)));
-  EXPECT_EQ(1ul, player.keyframe_models().size());
-  EXPECT_EQ(BOUNDS, player.keyframe_models()[0]->target_property_id());
-  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player.keyframe_models()[0]->run_state());
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1);
-  player.Tick(start_time);
-  EXPECT_EQ(cc::KeyframeModel::RUNNING,
-            player.keyframe_models()[0]->run_state());
-  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
-
-  player.AddKeyframeModel(CreateBoundsAnimation(2, 2, gfx::SizeF(10, 100),
-                                                gfx::SizeF(20, 200),
-                                                MicrosecondsToDelta(10000)));
-
-  cc::TransformOperations from_operations;
-  from_operations.AppendTranslate(10, 100, 1000);
-  cc::TransformOperations to_operations;
-  to_operations.AppendTranslate(20, 200, 2000);
-  player.AddKeyframeModel(CreateTransformAnimation(
-      3, 2, from_operations, to_operations, MicrosecondsToDelta(10000)));
-
-  EXPECT_EQ(3ul, player.keyframe_models().size());
-  EXPECT_EQ(BOUNDS, player.keyframe_models()[1]->target_property_id());
-  EXPECT_EQ(TRANSFORM, player.keyframe_models()[2]->target_property_id());
-  int id1 = player.keyframe_models()[1]->id();
-
-  player.Tick(start_time + MicrosecondsToDelta(1));
-
-  // Only the transform animation should have started (since there's no
-  // conflicting animation).
-  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-            player.keyframe_models()[1]->run_state());
-  EXPECT_EQ(cc::KeyframeModel::RUNNING,
-            player.keyframe_models()[2]->run_state());
-
-  // Tick beyond the first animation. This should cause it (and the transform
-  // animation) to get removed and for the second bounds animation to start.
-  player.Tick(start_time + MicrosecondsToDelta(15000));
-
-  EXPECT_EQ(1ul, player.keyframe_models().size());
-  EXPECT_EQ(cc::KeyframeModel::RUNNING,
-            player.keyframe_models()[0]->run_state());
-  EXPECT_EQ(id1, player.keyframe_models()[0]->id());
-
-  // Tick beyond all animations. There should be none remaining.
-  player.Tick(start_time + MicrosecondsToDelta(30000));
-  EXPECT_TRUE(player.keyframe_models().empty());
-}
-
-TEST(AnimationPlayerTest, OpacityTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {OPACITY};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  float from = 1.0f;
-  float to = 0.5f;
-  player.TransitionFloatTo(start_time, OPACITY, from, to);
-
-  EXPECT_EQ(from, target.opacity());
-  player.Tick(start_time);
-
-  // Scheduling a redundant, approximately equal transition should be ignored.
-  int keyframe_model_id = player.keyframe_models().front()->id();
-  float nearby = to + kNoise;
-  player.TransitionFloatTo(start_time, OPACITY, from, nearby);
-  EXPECT_EQ(keyframe_model_id, player.keyframe_models().front()->id());
-
-  player.Tick(start_time + MicrosecondsToDelta(5000));
-  EXPECT_GT(from, target.opacity());
-  EXPECT_LT(to, target.opacity());
-
-  player.Tick(start_time + MicrosecondsToDelta(10000));
-  EXPECT_EQ(to, target.opacity());
-}
-
-TEST(AnimationPlayerTest, ReversedOpacityTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {OPACITY};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  float from = 1.0f;
-  float to = 0.5f;
-  player.TransitionFloatTo(start_time, OPACITY, from, to);
-
-  EXPECT_EQ(from, target.opacity());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  float value_before_reversing = target.opacity();
-  EXPECT_GT(from, value_before_reversing);
-  EXPECT_LT(to, value_before_reversing);
-
-  player.TransitionFloatTo(start_time + MicrosecondsToDelta(1000), OPACITY,
-                           target.opacity(), from);
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
-
-  player.Tick(start_time + MicrosecondsToDelta(2000));
-  EXPECT_EQ(from, target.opacity());
-}
-
-TEST(AnimationPlayerTest, LayoutOffsetTransitions) {
-  // In this test, we do expect exact equality.
-  float tolerance = 0.0f;
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {LAYOUT_OFFSET};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  cc::TransformOperations from = target.layout_offset();
-
-  cc::TransformOperations to;
-  to.AppendTranslate(8, 0, 0);
-
-  player.TransitionTransformOperationsTo(start_time, LAYOUT_OFFSET, from, to);
-
-  EXPECT_TRUE(from.ApproximatelyEqual(target.layout_offset(), tolerance));
-  player.Tick(start_time);
-
-  // Scheduling a redundant, approximately equal transition should be ignored.
-  int keyframe_model_id = player.keyframe_models().front()->id();
-  cc::TransformOperations nearby = to;
-  nearby.at(0).translate.x += kNoise;
-  player.TransitionTransformOperationsTo(start_time, LAYOUT_OFFSET, from,
-                                         nearby);
-  EXPECT_EQ(keyframe_model_id, player.keyframe_models().front()->id());
-
-  player.Tick(start_time + MicrosecondsToDelta(5000));
-  EXPECT_LT(from.at(0).translate.x, target.layout_offset().at(0).translate.x);
-  EXPECT_GT(to.at(0).translate.x, target.layout_offset().at(0).translate.x);
-
-  player.Tick(start_time + MicrosecondsToDelta(10000));
-  EXPECT_TRUE(to.ApproximatelyEqual(target.layout_offset(), tolerance));
-}
-
-TEST(AnimationPlayerTest, TransformTransitions) {
-  // In this test, we do expect exact equality.
-  float tolerance = 0.0f;
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {TRANSFORM};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  cc::TransformOperations from = target.operations();
-
-  cc::TransformOperations to;
-  to.AppendTranslate(8, 0, 0);
-  to.AppendRotate(1, 0, 0, 0);
-  to.AppendScale(1, 1, 1);
-
-  player.TransitionTransformOperationsTo(start_time, TRANSFORM, from, to);
-
-  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
-  player.Tick(start_time);
-
-  // Scheduling a redundant, approximately equal transition should be ignored.
-  int keyframe_model_id = player.keyframe_models().front()->id();
-  cc::TransformOperations nearby = to;
-  nearby.at(0).translate.x += kNoise;
-  player.TransitionTransformOperationsTo(start_time, TRANSFORM, from, nearby);
-  EXPECT_EQ(keyframe_model_id, player.keyframe_models().front()->id());
-
-  player.Tick(start_time + MicrosecondsToDelta(5000));
-  EXPECT_LT(from.at(0).translate.x, target.operations().at(0).translate.x);
-  EXPECT_GT(to.at(0).translate.x, target.operations().at(0).translate.x);
-
-  player.Tick(start_time + MicrosecondsToDelta(10000));
-  EXPECT_TRUE(to.ApproximatelyEqual(target.operations(), tolerance));
-}
-
-TEST(AnimationPlayerTest, ReversedTransformTransitions) {
-  // In this test, we do expect exact equality.
-  float tolerance = 0.0f;
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {TRANSFORM};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  cc::TransformOperations from = target.operations();
-
-  cc::TransformOperations to;
-  to.AppendTranslate(8, 0, 0);
-  to.AppendRotate(1, 0, 0, 0);
-  to.AppendScale(1, 1, 1);
-
-  player.TransitionTransformOperationsTo(start_time, TRANSFORM, from, to);
-
-  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  cc::TransformOperations value_before_reversing = target.operations();
-  EXPECT_LT(from.at(0).translate.x, target.operations().at(0).translate.x);
-  EXPECT_GT(to.at(0).translate.x, target.operations().at(0).translate.x);
-
-  player.TransitionTransformOperationsTo(start_time + MicrosecondsToDelta(1000),
-                                         TRANSFORM, target.operations(), from);
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  EXPECT_TRUE(value_before_reversing.ApproximatelyEqual(target.operations(),
-                                                        tolerance));
-
-  player.Tick(start_time + MicrosecondsToDelta(2000));
-  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
-}
-
-TEST(AnimationPlayerTest, BoundsTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {BOUNDS};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  gfx::SizeF from = target.size();
-  gfx::SizeF to(20.0f, 20.0f);
-
-  player.TransitionSizeTo(start_time, BOUNDS, from, to);
-
-  EXPECT_FLOAT_SIZE_EQ(from, target.size());
-  player.Tick(start_time);
-
-  // Scheduling a redundant, approximately equal transition should be ignored.
-  int keyframe_model_id = player.keyframe_models().front()->id();
-  gfx::SizeF nearby = to;
-  nearby.set_width(to.width() + kNoise);
-  player.TransitionSizeTo(start_time, BOUNDS, from, nearby);
-  EXPECT_EQ(keyframe_model_id, player.keyframe_models().front()->id());
-
-  player.Tick(start_time + MicrosecondsToDelta(5000));
-  EXPECT_LT(from.width(), target.size().width());
-  EXPECT_GT(to.width(), target.size().width());
-  EXPECT_LT(from.height(), target.size().height());
-  EXPECT_GT(to.height(), target.size().height());
-
-  player.Tick(start_time + MicrosecondsToDelta(10000));
-  EXPECT_FLOAT_SIZE_EQ(to, target.size());
-}
-
-TEST(AnimationPlayerTest, ReversedBoundsTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {BOUNDS};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  gfx::SizeF from = target.size();
-  gfx::SizeF to(20.0f, 20.0f);
-
-  player.TransitionSizeTo(start_time, BOUNDS, from, to);
-
-  EXPECT_FLOAT_SIZE_EQ(from, target.size());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  gfx::SizeF value_before_reversing = target.size();
-  EXPECT_LT(from.width(), target.size().width());
-  EXPECT_GT(to.width(), target.size().width());
-  EXPECT_LT(from.height(), target.size().height());
-  EXPECT_GT(to.height(), target.size().height());
-
-  player.TransitionSizeTo(start_time + MicrosecondsToDelta(1000), BOUNDS,
-                          target.size(), from);
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  EXPECT_FLOAT_SIZE_EQ(value_before_reversing, target.size());
-
-  player.Tick(start_time + MicrosecondsToDelta(2000));
-  EXPECT_FLOAT_SIZE_EQ(from, target.size());
-}
-
-TEST(AnimationPlayerTest, BackgroundColorTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {BACKGROUND_COLOR};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  SkColor from = SK_ColorRED;
-  SkColor to = SK_ColorGREEN;
-
-  player.TransitionColorTo(start_time, BACKGROUND_COLOR, from, to);
-
-  EXPECT_EQ(from, target.background_color());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(5000));
-  EXPECT_GT(SkColorGetR(from), SkColorGetR(target.background_color()));
-  EXPECT_LT(SkColorGetR(to), SkColorGetR(target.background_color()));
-  EXPECT_LT(SkColorGetG(from), SkColorGetG(target.background_color()));
-  EXPECT_GT(SkColorGetG(to), SkColorGetG(target.background_color()));
-  EXPECT_EQ(0u, SkColorGetB(target.background_color()));
-  EXPECT_EQ(255u, SkColorGetA(target.background_color()));
-
-  player.Tick(start_time + MicrosecondsToDelta(10000));
-  EXPECT_EQ(to, target.background_color());
-}
-
-TEST(AnimationPlayerTest, ReversedBackgroundColorTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {BACKGROUND_COLOR};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  SkColor from = SK_ColorRED;
-  SkColor to = SK_ColorGREEN;
-
-  player.TransitionColorTo(start_time, BACKGROUND_COLOR, from, to);
-
-  EXPECT_EQ(from, target.background_color());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  SkColor value_before_reversing = target.background_color();
-  EXPECT_GT(SkColorGetR(from), SkColorGetR(target.background_color()));
-  EXPECT_LT(SkColorGetR(to), SkColorGetR(target.background_color()));
-  EXPECT_LT(SkColorGetG(from), SkColorGetG(target.background_color()));
-  EXPECT_GT(SkColorGetG(to), SkColorGetG(target.background_color()));
-  EXPECT_EQ(0u, SkColorGetB(target.background_color()));
-  EXPECT_EQ(255u, SkColorGetA(target.background_color()));
-
-  player.TransitionColorTo(start_time + MicrosecondsToDelta(1000),
-                           BACKGROUND_COLOR, target.background_color(), from);
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  EXPECT_EQ(value_before_reversing, target.background_color());
-
-  player.Tick(start_time + MicrosecondsToDelta(2000));
-  EXPECT_EQ(from, target.background_color());
-}
-
-TEST(AnimationPlayerTest, DoubleReversedTransitions) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {OPACITY};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  float from = 1.0f;
-  float to = 0.5f;
-  player.TransitionFloatTo(start_time, OPACITY, from, to);
-
-  EXPECT_EQ(from, target.opacity());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  float value_before_reversing = target.opacity();
-  EXPECT_GT(from, value_before_reversing);
-  EXPECT_LT(to, value_before_reversing);
-
-  player.TransitionFloatTo(start_time + MicrosecondsToDelta(1000), OPACITY,
-                           target.opacity(), from);
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
-
-  player.Tick(start_time + MicrosecondsToDelta(1500));
-  value_before_reversing = target.opacity();
-  // If the code for reversing transitions does not account for an existing time
-  // offset, then reversing a second time will give incorrect values.
-  player.TransitionFloatTo(start_time + MicrosecondsToDelta(1500), OPACITY,
-                           target.opacity(), to);
-  player.Tick(start_time + MicrosecondsToDelta(1500));
-  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
-}
-
-TEST(AnimationPlayerTest, RedundantTransition) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {OPACITY};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  float from = 1.0f;
-  float to = 0.5f;
-  player.TransitionFloatTo(start_time, OPACITY, from, to);
-
-  EXPECT_EQ(from, target.opacity());
-  player.Tick(start_time);
-
-  player.Tick(start_time + MicrosecondsToDelta(1000));
-  float value_before_redundant_transition = target.opacity();
-
-  // While an existing transition is in progress to the same value, we should
-  // not start a new transition.
-  player.TransitionFloatTo(start_time, OPACITY, target.opacity(), to);
-
-  EXPECT_EQ(1lu, player.keyframe_models().size());
-  EXPECT_EQ(value_before_redundant_transition, target.opacity());
-}
-
-TEST(AnimationPlayerTest, TransitionToSameValue) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  Transition transition;
-  transition.target_properties = {OPACITY};
-  transition.duration = MicrosecondsToDelta(10000);
-  player.set_transition(transition);
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  // Transitioning to the same value should be a no-op.
-  float from = 1.0f;
-  float to = 1.0f;
-  player.TransitionFloatTo(start_time, OPACITY, from, to);
-  EXPECT_EQ(from, target.opacity());
-  EXPECT_TRUE(player.keyframe_models().empty());
-}
-
-TEST(AnimationPlayerTest, CorrectTargetValue) {
-  TestAnimationTarget target;
-  AnimationPlayer player;
-  player.set_target(&target);
-  base::TimeDelta duration = MicrosecondsToDelta(10000);
-
-  float from_opacity = 1.0f;
-  float to_opacity = 0.5f;
-  gfx::SizeF from_bounds = gfx::SizeF(10, 200);
-  gfx::SizeF to_bounds = gfx::SizeF(20, 200);
-  SkColor from_color = SK_ColorRED;
-  SkColor to_color = SK_ColorGREEN;
-  cc::TransformOperations from_transform;
-  from_transform.AppendTranslate(10, 100, 1000);
-  cc::TransformOperations to_transform;
-  to_transform.AppendTranslate(20, 200, 2000);
-
-  // Verify the default value is returned if there's no running animations.
-  EXPECT_EQ(from_opacity, player.GetTargetFloatValue(OPACITY, from_opacity));
-  EXPECT_SIZEF_EQ(from_bounds, player.GetTargetSizeValue(BOUNDS, from_bounds));
-  EXPECT_EQ(from_color,
-            player.GetTargetColorValue(BACKGROUND_COLOR, from_color));
-  EXPECT_TRUE(from_transform.ApproximatelyEqual(
-      player.GetTargetTransformOperationsValue(TRANSFORM, from_transform),
-      kEpsilon));
-
-  // Add keyframe_models.
-  player.AddKeyframeModel(
-      CreateOpacityAnimation(2, 1, from_opacity, to_opacity, duration));
-  player.AddKeyframeModel(
-      CreateBoundsAnimation(1, 1, from_bounds, to_bounds, duration));
-  player.AddKeyframeModel(
-      CreateBackgroundColorAnimation(3, 1, from_color, to_color, duration));
-  player.AddKeyframeModel(
-      CreateTransformAnimation(4, 1, from_transform, to_transform, duration));
-
-  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
-  player.Tick(start_time);
-
-  // Verify target value.
-  EXPECT_EQ(to_opacity, player.GetTargetFloatValue(OPACITY, from_opacity));
-  EXPECT_SIZEF_EQ(to_bounds, player.GetTargetSizeValue(BOUNDS, from_bounds));
-  EXPECT_EQ(to_color, player.GetTargetColorValue(BACKGROUND_COLOR, from_color));
-  EXPECT_TRUE(to_transform.ApproximatelyEqual(
-      player.GetTargetTransformOperationsValue(TRANSFORM, from_transform),
-      kEpsilon));
-}
-
-}  // namespace vr
diff --git a/chrome/browser/vr/animation_unittest.cc b/chrome/browser/vr/animation_unittest.cc
new file mode 100644
index 0000000..90635da
--- /dev/null
+++ b/chrome/browser/vr/animation_unittest.cc
@@ -0,0 +1,662 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/vr/animation.h"
+
+#include "cc/animation/animation_target.h"
+#include "cc/test/geometry_test_utils.h"
+#include "chrome/browser/vr/target_property.h"
+#include "chrome/browser/vr/test/animation_utils.h"
+#include "chrome/browser/vr/test/constants.h"
+#include "chrome/browser/vr/transition.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/gfx/test/gfx_util.h"
+
+namespace vr {
+
+static constexpr float kNoise = 1e-6f;
+
+class TestAnimationTarget : public cc::AnimationTarget {
+ public:
+  TestAnimationTarget() {
+    layout_offset_.AppendTranslate(0, 0, 0);
+    operations_.AppendTranslate(0, 0, 0);
+    operations_.AppendRotate(1, 0, 0, 0);
+    operations_.AppendScale(1, 1, 1);
+  }
+
+  const gfx::SizeF& size() const { return size_; }
+  const cc::TransformOperations& operations() const { return operations_; }
+  const cc::TransformOperations& layout_offset() const {
+    return layout_offset_;
+  }
+  float opacity() const { return opacity_; }
+  SkColor background_color() const { return background_color_; }
+
+  void NotifyClientSizeAnimated(const gfx::SizeF& size,
+                                int target_property_id,
+                                cc::KeyframeModel* keyframe_model) override {
+    size_ = size;
+  }
+
+  void NotifyClientTransformOperationsAnimated(
+      const cc::TransformOperations& operations,
+      int target_property_id,
+      cc::KeyframeModel* keyframe_model) override {
+    if (target_property_id == LAYOUT_OFFSET) {
+      layout_offset_ = operations;
+    } else {
+      operations_ = operations;
+    }
+  }
+
+  void NotifyClientFloatAnimated(float opacity,
+                                 int target_property_id,
+                                 cc::KeyframeModel* keyframe_model) override {
+    opacity_ = opacity;
+  }
+
+  void NotifyClientColorAnimated(SkColor color,
+                                 int target_property_id,
+                                 cc::KeyframeModel* keyframe_model) override {
+    background_color_ = color;
+  }
+
+ private:
+  cc::TransformOperations layout_offset_;
+  cc::TransformOperations operations_;
+  gfx::SizeF size_ = {10.0f, 10.0f};
+  float opacity_ = 1.0f;
+  SkColor background_color_ = SK_ColorRED;
+};
+
+TEST(AnimationTest, AddRemoveKeyframeModels) {
+  Animation animation;
+  EXPECT_TRUE(animation.keyframe_models().empty());
+
+  animation.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
+                                                   gfx::SizeF(20, 200),
+                                                   MicrosecondsToDelta(10000)));
+  EXPECT_EQ(1ul, animation.keyframe_models().size());
+  EXPECT_EQ(BOUNDS, animation.keyframe_models()[0]->target_property_id());
+
+  cc::TransformOperations from_operations;
+  from_operations.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_operations;
+  to_operations.AppendTranslate(20, 200, 2000);
+  animation.AddKeyframeModel(CreateTransformAnimation(
+      2, 2, from_operations, to_operations, MicrosecondsToDelta(10000)));
+
+  EXPECT_EQ(2ul, animation.keyframe_models().size());
+  EXPECT_EQ(TRANSFORM, animation.keyframe_models()[1]->target_property_id());
+
+  animation.AddKeyframeModel(CreateTransformAnimation(
+      3, 3, from_operations, to_operations, MicrosecondsToDelta(10000)));
+  EXPECT_EQ(3ul, animation.keyframe_models().size());
+  EXPECT_EQ(TRANSFORM, animation.keyframe_models()[2]->target_property_id());
+
+  animation.RemoveKeyframeModels(TRANSFORM);
+  EXPECT_EQ(1ul, animation.keyframe_models().size());
+  EXPECT_EQ(BOUNDS, animation.keyframe_models()[0]->target_property_id());
+
+  animation.RemoveKeyframeModel(animation.keyframe_models()[0]->id());
+  EXPECT_TRUE(animation.keyframe_models().empty());
+}
+
+TEST(AnimationTest, AnimationLifecycle) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+
+  animation.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
+                                                   gfx::SizeF(20, 200),
+                                                   MicrosecondsToDelta(10000)));
+  EXPECT_EQ(1ul, animation.keyframe_models().size());
+  EXPECT_EQ(BOUNDS, animation.keyframe_models()[0]->target_property_id());
+  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+            animation.keyframe_models()[0]->run_state());
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1);
+  animation.Tick(start_time);
+  EXPECT_EQ(cc::KeyframeModel::RUNNING,
+            animation.keyframe_models()[0]->run_state());
+
+  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
+
+  // Tick beyond the animation
+  animation.Tick(start_time + MicrosecondsToDelta(20000));
+
+  EXPECT_TRUE(animation.keyframe_models().empty());
+
+  // Should have assumed the final value.
+  EXPECT_SIZEF_EQ(gfx::SizeF(20, 200), target.size());
+}
+
+TEST(AnimationTest, AnimationQueue) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+
+  animation.AddKeyframeModel(CreateBoundsAnimation(1, 1, gfx::SizeF(10, 100),
+                                                   gfx::SizeF(20, 200),
+                                                   MicrosecondsToDelta(10000)));
+  EXPECT_EQ(1ul, animation.keyframe_models().size());
+  EXPECT_EQ(BOUNDS, animation.keyframe_models()[0]->target_property_id());
+  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+            animation.keyframe_models()[0]->run_state());
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1);
+  animation.Tick(start_time);
+  EXPECT_EQ(cc::KeyframeModel::RUNNING,
+            animation.keyframe_models()[0]->run_state());
+  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
+
+  animation.AddKeyframeModel(CreateBoundsAnimation(2, 2, gfx::SizeF(10, 100),
+                                                   gfx::SizeF(20, 200),
+                                                   MicrosecondsToDelta(10000)));
+
+  cc::TransformOperations from_operations;
+  from_operations.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_operations;
+  to_operations.AppendTranslate(20, 200, 2000);
+  animation.AddKeyframeModel(CreateTransformAnimation(
+      3, 2, from_operations, to_operations, MicrosecondsToDelta(10000)));
+
+  EXPECT_EQ(3ul, animation.keyframe_models().size());
+  EXPECT_EQ(BOUNDS, animation.keyframe_models()[1]->target_property_id());
+  EXPECT_EQ(TRANSFORM, animation.keyframe_models()[2]->target_property_id());
+  int id1 = animation.keyframe_models()[1]->id();
+
+  animation.Tick(start_time + MicrosecondsToDelta(1));
+
+  // Only the transform animation should have started (since there's no
+  // conflicting animation).
+  EXPECT_EQ(cc::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+            animation.keyframe_models()[1]->run_state());
+  EXPECT_EQ(cc::KeyframeModel::RUNNING,
+            animation.keyframe_models()[2]->run_state());
+
+  // Tick beyond the first animation. This should cause it (and the transform
+  // animation) to get removed and for the second bounds animation to start.
+  animation.Tick(start_time + MicrosecondsToDelta(15000));
+
+  EXPECT_EQ(1ul, animation.keyframe_models().size());
+  EXPECT_EQ(cc::KeyframeModel::RUNNING,
+            animation.keyframe_models()[0]->run_state());
+  EXPECT_EQ(id1, animation.keyframe_models()[0]->id());
+
+  // Tick beyond all animations. There should be none remaining.
+  animation.Tick(start_time + MicrosecondsToDelta(30000));
+  EXPECT_TRUE(animation.keyframe_models().empty());
+}
+
+TEST(AnimationTest, OpacityTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {OPACITY};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  float from = 1.0f;
+  float to = 0.5f;
+  animation.TransitionFloatTo(start_time, OPACITY, from, to);
+
+  EXPECT_EQ(from, target.opacity());
+  animation.Tick(start_time);
+
+  // Scheduling a redundant, approximately equal transition should be ignored.
+  int keyframe_model_id = animation.keyframe_models().front()->id();
+  float nearby = to + kNoise;
+  animation.TransitionFloatTo(start_time, OPACITY, from, nearby);
+  EXPECT_EQ(keyframe_model_id, animation.keyframe_models().front()->id());
+
+  animation.Tick(start_time + MicrosecondsToDelta(5000));
+  EXPECT_GT(from, target.opacity());
+  EXPECT_LT(to, target.opacity());
+
+  animation.Tick(start_time + MicrosecondsToDelta(10000));
+  EXPECT_EQ(to, target.opacity());
+}
+
+TEST(AnimationTest, ReversedOpacityTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {OPACITY};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  float from = 1.0f;
+  float to = 0.5f;
+  animation.TransitionFloatTo(start_time, OPACITY, from, to);
+
+  EXPECT_EQ(from, target.opacity());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  float value_before_reversing = target.opacity();
+  EXPECT_GT(from, value_before_reversing);
+  EXPECT_LT(to, value_before_reversing);
+
+  animation.TransitionFloatTo(start_time + MicrosecondsToDelta(1000), OPACITY,
+                              target.opacity(), from);
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
+
+  animation.Tick(start_time + MicrosecondsToDelta(2000));
+  EXPECT_EQ(from, target.opacity());
+}
+
+TEST(AnimationTest, LayoutOffsetTransitions) {
+  // In this test, we do expect exact equality.
+  float tolerance = 0.0f;
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {LAYOUT_OFFSET};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  cc::TransformOperations from = target.layout_offset();
+
+  cc::TransformOperations to;
+  to.AppendTranslate(8, 0, 0);
+
+  animation.TransitionTransformOperationsTo(start_time, LAYOUT_OFFSET, from,
+                                            to);
+
+  EXPECT_TRUE(from.ApproximatelyEqual(target.layout_offset(), tolerance));
+  animation.Tick(start_time);
+
+  // Scheduling a redundant, approximately equal transition should be ignored.
+  int keyframe_model_id = animation.keyframe_models().front()->id();
+  cc::TransformOperations nearby = to;
+  nearby.at(0).translate.x += kNoise;
+  animation.TransitionTransformOperationsTo(start_time, LAYOUT_OFFSET, from,
+                                            nearby);
+  EXPECT_EQ(keyframe_model_id, animation.keyframe_models().front()->id());
+
+  animation.Tick(start_time + MicrosecondsToDelta(5000));
+  EXPECT_LT(from.at(0).translate.x, target.layout_offset().at(0).translate.x);
+  EXPECT_GT(to.at(0).translate.x, target.layout_offset().at(0).translate.x);
+
+  animation.Tick(start_time + MicrosecondsToDelta(10000));
+  EXPECT_TRUE(to.ApproximatelyEqual(target.layout_offset(), tolerance));
+}
+
+TEST(AnimationTest, TransformTransitions) {
+  // In this test, we do expect exact equality.
+  float tolerance = 0.0f;
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {TRANSFORM};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  cc::TransformOperations from = target.operations();
+
+  cc::TransformOperations to;
+  to.AppendTranslate(8, 0, 0);
+  to.AppendRotate(1, 0, 0, 0);
+  to.AppendScale(1, 1, 1);
+
+  animation.TransitionTransformOperationsTo(start_time, TRANSFORM, from, to);
+
+  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
+  animation.Tick(start_time);
+
+  // Scheduling a redundant, approximately equal transition should be ignored.
+  int keyframe_model_id = animation.keyframe_models().front()->id();
+  cc::TransformOperations nearby = to;
+  nearby.at(0).translate.x += kNoise;
+  animation.TransitionTransformOperationsTo(start_time, TRANSFORM, from,
+                                            nearby);
+  EXPECT_EQ(keyframe_model_id, animation.keyframe_models().front()->id());
+
+  animation.Tick(start_time + MicrosecondsToDelta(5000));
+  EXPECT_LT(from.at(0).translate.x, target.operations().at(0).translate.x);
+  EXPECT_GT(to.at(0).translate.x, target.operations().at(0).translate.x);
+
+  animation.Tick(start_time + MicrosecondsToDelta(10000));
+  EXPECT_TRUE(to.ApproximatelyEqual(target.operations(), tolerance));
+}
+
+TEST(AnimationTest, ReversedTransformTransitions) {
+  // In this test, we do expect exact equality.
+  float tolerance = 0.0f;
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {TRANSFORM};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  cc::TransformOperations from = target.operations();
+
+  cc::TransformOperations to;
+  to.AppendTranslate(8, 0, 0);
+  to.AppendRotate(1, 0, 0, 0);
+  to.AppendScale(1, 1, 1);
+
+  animation.TransitionTransformOperationsTo(start_time, TRANSFORM, from, to);
+
+  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  cc::TransformOperations value_before_reversing = target.operations();
+  EXPECT_LT(from.at(0).translate.x, target.operations().at(0).translate.x);
+  EXPECT_GT(to.at(0).translate.x, target.operations().at(0).translate.x);
+
+  animation.TransitionTransformOperationsTo(
+      start_time + MicrosecondsToDelta(1000), TRANSFORM, target.operations(),
+      from);
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  EXPECT_TRUE(value_before_reversing.ApproximatelyEqual(target.operations(),
+                                                        tolerance));
+
+  animation.Tick(start_time + MicrosecondsToDelta(2000));
+  EXPECT_TRUE(from.ApproximatelyEqual(target.operations(), tolerance));
+}
+
+TEST(AnimationTest, BoundsTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {BOUNDS};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  gfx::SizeF from = target.size();
+  gfx::SizeF to(20.0f, 20.0f);
+
+  animation.TransitionSizeTo(start_time, BOUNDS, from, to);
+
+  EXPECT_FLOAT_SIZE_EQ(from, target.size());
+  animation.Tick(start_time);
+
+  // Scheduling a redundant, approximately equal transition should be ignored.
+  int keyframe_model_id = animation.keyframe_models().front()->id();
+  gfx::SizeF nearby = to;
+  nearby.set_width(to.width() + kNoise);
+  animation.TransitionSizeTo(start_time, BOUNDS, from, nearby);
+  EXPECT_EQ(keyframe_model_id, animation.keyframe_models().front()->id());
+
+  animation.Tick(start_time + MicrosecondsToDelta(5000));
+  EXPECT_LT(from.width(), target.size().width());
+  EXPECT_GT(to.width(), target.size().width());
+  EXPECT_LT(from.height(), target.size().height());
+  EXPECT_GT(to.height(), target.size().height());
+
+  animation.Tick(start_time + MicrosecondsToDelta(10000));
+  EXPECT_FLOAT_SIZE_EQ(to, target.size());
+}
+
+TEST(AnimationTest, ReversedBoundsTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {BOUNDS};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  gfx::SizeF from = target.size();
+  gfx::SizeF to(20.0f, 20.0f);
+
+  animation.TransitionSizeTo(start_time, BOUNDS, from, to);
+
+  EXPECT_FLOAT_SIZE_EQ(from, target.size());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  gfx::SizeF value_before_reversing = target.size();
+  EXPECT_LT(from.width(), target.size().width());
+  EXPECT_GT(to.width(), target.size().width());
+  EXPECT_LT(from.height(), target.size().height());
+  EXPECT_GT(to.height(), target.size().height());
+
+  animation.TransitionSizeTo(start_time + MicrosecondsToDelta(1000), BOUNDS,
+                             target.size(), from);
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  EXPECT_FLOAT_SIZE_EQ(value_before_reversing, target.size());
+
+  animation.Tick(start_time + MicrosecondsToDelta(2000));
+  EXPECT_FLOAT_SIZE_EQ(from, target.size());
+}
+
+TEST(AnimationTest, BackgroundColorTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {BACKGROUND_COLOR};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  SkColor from = SK_ColorRED;
+  SkColor to = SK_ColorGREEN;
+
+  animation.TransitionColorTo(start_time, BACKGROUND_COLOR, from, to);
+
+  EXPECT_EQ(from, target.background_color());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(5000));
+  EXPECT_GT(SkColorGetR(from), SkColorGetR(target.background_color()));
+  EXPECT_LT(SkColorGetR(to), SkColorGetR(target.background_color()));
+  EXPECT_LT(SkColorGetG(from), SkColorGetG(target.background_color()));
+  EXPECT_GT(SkColorGetG(to), SkColorGetG(target.background_color()));
+  EXPECT_EQ(0u, SkColorGetB(target.background_color()));
+  EXPECT_EQ(255u, SkColorGetA(target.background_color()));
+
+  animation.Tick(start_time + MicrosecondsToDelta(10000));
+  EXPECT_EQ(to, target.background_color());
+}
+
+TEST(AnimationTest, ReversedBackgroundColorTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {BACKGROUND_COLOR};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  SkColor from = SK_ColorRED;
+  SkColor to = SK_ColorGREEN;
+
+  animation.TransitionColorTo(start_time, BACKGROUND_COLOR, from, to);
+
+  EXPECT_EQ(from, target.background_color());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  SkColor value_before_reversing = target.background_color();
+  EXPECT_GT(SkColorGetR(from), SkColorGetR(target.background_color()));
+  EXPECT_LT(SkColorGetR(to), SkColorGetR(target.background_color()));
+  EXPECT_LT(SkColorGetG(from), SkColorGetG(target.background_color()));
+  EXPECT_GT(SkColorGetG(to), SkColorGetG(target.background_color()));
+  EXPECT_EQ(0u, SkColorGetB(target.background_color()));
+  EXPECT_EQ(255u, SkColorGetA(target.background_color()));
+
+  animation.TransitionColorTo(start_time + MicrosecondsToDelta(1000),
+                              BACKGROUND_COLOR, target.background_color(),
+                              from);
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  EXPECT_EQ(value_before_reversing, target.background_color());
+
+  animation.Tick(start_time + MicrosecondsToDelta(2000));
+  EXPECT_EQ(from, target.background_color());
+}
+
+TEST(AnimationTest, DoubleReversedTransitions) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {OPACITY};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  float from = 1.0f;
+  float to = 0.5f;
+  animation.TransitionFloatTo(start_time, OPACITY, from, to);
+
+  EXPECT_EQ(from, target.opacity());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  float value_before_reversing = target.opacity();
+  EXPECT_GT(from, value_before_reversing);
+  EXPECT_LT(to, value_before_reversing);
+
+  animation.TransitionFloatTo(start_time + MicrosecondsToDelta(1000), OPACITY,
+                              target.opacity(), from);
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
+
+  animation.Tick(start_time + MicrosecondsToDelta(1500));
+  value_before_reversing = target.opacity();
+  // If the code for reversing transitions does not account for an existing time
+  // offset, then reversing a second time will give incorrect values.
+  animation.TransitionFloatTo(start_time + MicrosecondsToDelta(1500), OPACITY,
+                              target.opacity(), to);
+  animation.Tick(start_time + MicrosecondsToDelta(1500));
+  EXPECT_FLOAT_EQ(value_before_reversing, target.opacity());
+}
+
+TEST(AnimationTest, RedundantTransition) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {OPACITY};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  float from = 1.0f;
+  float to = 0.5f;
+  animation.TransitionFloatTo(start_time, OPACITY, from, to);
+
+  EXPECT_EQ(from, target.opacity());
+  animation.Tick(start_time);
+
+  animation.Tick(start_time + MicrosecondsToDelta(1000));
+  float value_before_redundant_transition = target.opacity();
+
+  // While an existing transition is in progress to the same value, we should
+  // not start a new transition.
+  animation.TransitionFloatTo(start_time, OPACITY, target.opacity(), to);
+
+  EXPECT_EQ(1lu, animation.keyframe_models().size());
+  EXPECT_EQ(value_before_redundant_transition, target.opacity());
+}
+
+TEST(AnimationTest, TransitionToSameValue) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  Transition transition;
+  transition.target_properties = {OPACITY};
+  transition.duration = MicrosecondsToDelta(10000);
+  animation.set_transition(transition);
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  // Transitioning to the same value should be a no-op.
+  float from = 1.0f;
+  float to = 1.0f;
+  animation.TransitionFloatTo(start_time, OPACITY, from, to);
+  EXPECT_EQ(from, target.opacity());
+  EXPECT_TRUE(animation.keyframe_models().empty());
+}
+
+TEST(AnimationTest, CorrectTargetValue) {
+  TestAnimationTarget target;
+  Animation animation;
+  animation.set_target(&target);
+  base::TimeDelta duration = MicrosecondsToDelta(10000);
+
+  float from_opacity = 1.0f;
+  float to_opacity = 0.5f;
+  gfx::SizeF from_bounds = gfx::SizeF(10, 200);
+  gfx::SizeF to_bounds = gfx::SizeF(20, 200);
+  SkColor from_color = SK_ColorRED;
+  SkColor to_color = SK_ColorGREEN;
+  cc::TransformOperations from_transform;
+  from_transform.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_transform;
+  to_transform.AppendTranslate(20, 200, 2000);
+
+  // Verify the default value is returned if there's no running animations.
+  EXPECT_EQ(from_opacity, animation.GetTargetFloatValue(OPACITY, from_opacity));
+  EXPECT_SIZEF_EQ(from_bounds,
+                  animation.GetTargetSizeValue(BOUNDS, from_bounds));
+  EXPECT_EQ(from_color,
+            animation.GetTargetColorValue(BACKGROUND_COLOR, from_color));
+  EXPECT_TRUE(from_transform.ApproximatelyEqual(
+      animation.GetTargetTransformOperationsValue(TRANSFORM, from_transform),
+      kEpsilon));
+
+  // Add keyframe_models.
+  animation.AddKeyframeModel(
+      CreateOpacityAnimation(2, 1, from_opacity, to_opacity, duration));
+  animation.AddKeyframeModel(
+      CreateBoundsAnimation(1, 1, from_bounds, to_bounds, duration));
+  animation.AddKeyframeModel(
+      CreateBackgroundColorAnimation(3, 1, from_color, to_color, duration));
+  animation.AddKeyframeModel(
+      CreateTransformAnimation(4, 1, from_transform, to_transform, duration));
+
+  base::TimeTicks start_time = MicrosecondsToTicks(1000000);
+  animation.Tick(start_time);
+
+  // Verify target value.
+  EXPECT_EQ(to_opacity, animation.GetTargetFloatValue(OPACITY, from_opacity));
+  EXPECT_SIZEF_EQ(to_bounds, animation.GetTargetSizeValue(BOUNDS, from_bounds));
+  EXPECT_EQ(to_color,
+            animation.GetTargetColorValue(BACKGROUND_COLOR, from_color));
+  EXPECT_TRUE(to_transform.ApproximatelyEqual(
+      animation.GetTargetTransformOperationsValue(TRANSFORM, from_transform),
+      kEpsilon));
+}
+
+}  // namespace vr
diff --git a/chrome/browser/vr/browser_ui_interface.h b/chrome/browser/vr/browser_ui_interface.h
index 210befd..3cd47dfc 100644
--- a/chrome/browser/vr/browser_ui_interface.h
+++ b/chrome/browser/vr/browser_ui_interface.h
@@ -32,8 +32,7 @@
   virtual void SetAudioCaptureEnabled(bool enabled) = 0;
   virtual void SetBluetoothConnected(bool enabled) = 0;
   virtual void SetLocationAccessEnabled(bool enabled) = 0;
-  virtual void SetExitVrPromptEnabled(bool enabled,
-                                      UiUnsupportedMode reason) = 0;
+  virtual void ShowExitVrPrompt(UiUnsupportedMode reason) = 0;
   virtual void SetSpeechRecognitionEnabled(bool enabled) = 0;
   virtual void SetRecognitionResult(const base::string16& result) = 0;
   virtual void OnSpeechRecognitionStateChanged(int new_state) = 0;
diff --git a/chrome/browser/vr/elements/audio_permission_prompt.cc b/chrome/browser/vr/elements/audio_permission_prompt.cc
index 7bfe22b..be7fda58 100644
--- a/chrome/browser/vr/elements/audio_permission_prompt.cc
+++ b/chrome/browser/vr/elements/audio_permission_prompt.cc
@@ -10,79 +10,17 @@
 
 AudioPermissionPrompt::AudioPermissionPrompt(
     int preferred_width,
-    const base::Callback<void()>& primary_button_callback,
-    const base::Callback<void()>& secondary_buttton_callback)
-    : TexturedElement(preferred_width),
-      texture_(std::make_unique<AudioPermissionPromptTexture>()),
-      primary_button_callback_(primary_button_callback),
-      secondary_buttton_callback_(secondary_buttton_callback) {}
+    const ExitPromptCallback& result_callback)
+    : ExitPrompt(preferred_width,
+                 result_callback,
+                 std::make_unique<AudioPermissionPromptTexture>()) {
+  set_reason(UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission);
+}
 
 AudioPermissionPrompt::~AudioPermissionPrompt() = default;
 
-void AudioPermissionPrompt::SetTextureForTesting(
-    AudioPermissionPromptTexture* texture) {
-  texture_.reset(texture);
-}
-
-void AudioPermissionPrompt::OnHoverEnter(const gfx::PointF& position) {
-  OnStateUpdated(position);
-}
-
-void AudioPermissionPrompt::OnHoverLeave() {
-  OnStateUpdated(gfx::PointF(std::numeric_limits<float>::max(),
-                             std::numeric_limits<float>::max()));
-}
-
-void AudioPermissionPrompt::OnMove(const gfx::PointF& position) {
-  OnStateUpdated(position);
-}
-
-void AudioPermissionPrompt::OnButtonDown(const gfx::PointF& position) {
-  if (texture_->HitsPrimaryButton(position))
-    primary_down_ = true;
-  else if (texture_->HitsSecondaryButton(position))
-    secondary_down_ = true;
-  OnStateUpdated(position);
-}
-
-void AudioPermissionPrompt::OnButtonUp(const gfx::PointF& position) {
-  if (primary_down_ && texture_->HitsPrimaryButton(position))
-    primary_button_callback_.Run();
-  else if (secondary_down_ && texture_->HitsSecondaryButton(position))
-    secondary_buttton_callback_.Run();
-
-  primary_down_ = false;
-  secondary_down_ = false;
-
-  OnStateUpdated(position);
-}
-
-void AudioPermissionPrompt::SetPrimaryButtonColors(const ButtonColors& colors) {
-  texture_->SetPrimaryButtonColors(colors);
-}
-
-void AudioPermissionPrompt::SetSecondaryButtonColors(
-    const ButtonColors& colors) {
-  texture_->SetSecondaryButtonColors(colors);
-}
-
 void AudioPermissionPrompt::SetIconColor(SkColor color) {
-  texture_->SetIconColor(color);
-}
-
-void AudioPermissionPrompt::OnStateUpdated(const gfx::PointF& position) {
-  const bool primary_hovered = texture_->HitsPrimaryButton(position);
-  const bool secondary_hovered = texture_->HitsSecondaryButton(position);
-
-  texture_->SetPrimaryButtonHovered(primary_hovered);
-  texture_->SetPrimaryButtonPressed(primary_hovered ? primary_down_ : false);
-  texture_->SetSecondaryButtonHovered(secondary_hovered);
-  texture_->SetSecondaryButtonPressed(secondary_hovered ? secondary_down_
-                                                        : false);
-}
-
-UiTexture* AudioPermissionPrompt::GetTexture() const {
-  return texture_.get();
+  static_cast<AudioPermissionPromptTexture*>(GetTexture())->SetIconColor(color);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/elements/audio_permission_prompt.h b/chrome/browser/vr/elements/audio_permission_prompt.h
index 51801386..d690fba 100644
--- a/chrome/browser/vr/elements/audio_permission_prompt.h
+++ b/chrome/browser/vr/elements/audio_permission_prompt.h
@@ -9,47 +9,21 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "chrome/browser/vr/elements/textured_element.h"
-#include "chrome/browser/vr/model/color_scheme.h"
+#include "chrome/browser/vr/elements/exit_prompt.h"
 
 namespace vr {
 
-// TODO (crbug/783788): remove AudioPermissionPromptTexture
-class AudioPermissionPromptTexture;
-
-class AudioPermissionPrompt : public TexturedElement {
+class AudioPermissionPrompt : public ExitPrompt {
  public:
-  AudioPermissionPrompt(
-      int preferred_width,
-      const base::Callback<void()>& primary_button_callback,
-      const base::Callback<void()>& secondary_buttton_callback);
+  AudioPermissionPrompt(int preferred_width,
+                        const ExitPromptCallback& result_callback);
   ~AudioPermissionPrompt() override;
 
-  void SetTextureForTesting(AudioPermissionPromptTexture* texture);
-
-  void OnHoverEnter(const gfx::PointF& position) override;
-  void OnHoverLeave() override;
-  void OnMove(const gfx::PointF& position) override;
-  void OnButtonDown(const gfx::PointF& position) override;
-  void OnButtonUp(const gfx::PointF& position) override;
-
-  void SetPrimaryButtonColors(const ButtonColors& colors);
-  void SetSecondaryButtonColors(const ButtonColors& colors);
   void SetIconColor(SkColor color);
 
  private:
-  UiTexture* GetTexture() const override;
-
   void OnStateUpdated(const gfx::PointF& position);
 
-  bool primary_down_ = false;
-  bool secondary_down_ = false;
-
-  std::unique_ptr<AudioPermissionPromptTexture> texture_;
-
-  base::Callback<void()> primary_button_callback_;
-  base::Callback<void()> secondary_buttton_callback_;
-
   DISALLOW_COPY_AND_ASSIGN(AudioPermissionPrompt);
 };
 
diff --git a/chrome/browser/vr/elements/audio_permission_prompt_texture.cc b/chrome/browser/vr/elements/audio_permission_prompt_texture.cc
index a4994d5..9611907a 100644
--- a/chrome/browser/vr/elements/audio_permission_prompt_texture.cc
+++ b/chrome/browser/vr/elements/audio_permission_prompt_texture.cc
@@ -144,51 +144,6 @@
   canvas->Restore();
 }
 
-float AudioPermissionPromptTexture::ToPixels(float meters) const {
-  return meters * size_.width() / kWidth;
-}
-
-gfx::PointF AudioPermissionPromptTexture::PercentToPixels(
-    const gfx::PointF& percent) const {
-  return gfx::PointF(percent.x() * size_.width(), percent.y() * size_.height());
-}
-
-bool AudioPermissionPromptTexture::HitsPrimaryButton(
-    const gfx::PointF& position) const {
-  return primary_button_rect_.Contains(PercentToPixels(position));
-}
-
-bool AudioPermissionPromptTexture::HitsSecondaryButton(
-    const gfx::PointF& position) const {
-  return secondary_button_rect_.Contains(PercentToPixels(position));
-}
-
-void AudioPermissionPromptTexture::SetPrimaryButtonHovered(bool hovered) {
-  SetAndDirty(&primary_hovered_, hovered);
-}
-
-void AudioPermissionPromptTexture::SetPrimaryButtonPressed(bool pressed) {
-  SetAndDirty(&primary_pressed_, pressed);
-}
-
-void AudioPermissionPromptTexture::SetSecondaryButtonHovered(bool hovered) {
-  SetAndDirty(&secondary_hovered_, hovered);
-}
-
-void AudioPermissionPromptTexture::SetSecondaryButtonPressed(bool pressed) {
-  SetAndDirty(&secondary_pressed_, pressed);
-}
-
-void AudioPermissionPromptTexture::SetPrimaryButtonColors(
-    const ButtonColors& colors) {
-  SetAndDirty(&primary_button_colors_, colors);
-}
-
-void AudioPermissionPromptTexture::SetSecondaryButtonColors(
-    const ButtonColors& colors) {
-  SetAndDirty(&secondary_button_colors_, colors);
-}
-
 void AudioPermissionPromptTexture::SetIconColor(SkColor color) {
   SetAndDirty(&icon_color_, color);
 }
@@ -198,8 +153,8 @@
   return gfx::Size(maximum_width, maximum_width * kHeight / kWidth);
 }
 
-gfx::SizeF AudioPermissionPromptTexture::GetDrawnSize() const {
-  return size_;
+void AudioPermissionPromptTexture::SetContentMessageId(int message_id) {
+  NOTREACHED();
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/elements/audio_permission_prompt_texture.h b/chrome/browser/vr/elements/audio_permission_prompt_texture.h
index 5abeb43..5e362d9 100644
--- a/chrome/browser/vr/elements/audio_permission_prompt_texture.h
+++ b/chrome/browser/vr/elements/audio_permission_prompt_texture.h
@@ -6,52 +6,24 @@
 #define CHROME_BROWSER_VR_ELEMENTS_AUDIO_PERMISSION_PROMPT_TEXTURE_H_
 
 #include "base/macros.h"
-#include "chrome/browser/vr/elements/ui_texture.h"
+#include "chrome/browser/vr/elements/exit_prompt_texture.h"
 #include "chrome/browser/vr/model/color_scheme.h"
 #include "ui/gfx/geometry/rect_f.h"
 
-namespace gfx {
-class PointF;
-}  // namespace gfx
-
 namespace vr {
 
-class AudioPermissionPromptTexture : public UiTexture {
+class AudioPermissionPromptTexture : public ExitPromptTexture {
  public:
   AudioPermissionPromptTexture();
   ~AudioPermissionPromptTexture() override;
   gfx::Size GetPreferredTextureSize(int width) const override;
-  gfx::SizeF GetDrawnSize() const override;
 
-  void SetPrimaryButtonHovered(bool hovered);
-  void SetPrimaryButtonPressed(bool pressed);
-  void SetSecondaryButtonHovered(bool hovered);
-  void SetSecondaryButtonPressed(bool pressed);
-
-  virtual bool HitsSecondaryButton(const gfx::PointF& position) const;
-  virtual bool HitsPrimaryButton(const gfx::PointF& position) const;
-
-  void SetPrimaryButtonColors(const ButtonColors& colors);
-  void SetSecondaryButtonColors(const ButtonColors& colors);
   void SetIconColor(SkColor color);
 
  private:
+  void SetContentMessageId(int message_id) override;
   void Draw(SkCanvas* sk_canvas, const gfx::Size& texture_size) override;
 
-  float ToPixels(float meters) const;
-  gfx::PointF PercentToPixels(const gfx::PointF& percent) const;
-
-  gfx::RectF secondary_button_rect_;
-  gfx::RectF primary_button_rect_;
-  gfx::SizeF size_;
-
-  bool primary_hovered_ = false;
-  bool primary_pressed_ = false;
-  bool secondary_hovered_ = false;
-  bool secondary_pressed_ = false;
-
-  ButtonColors primary_button_colors_;
-  ButtonColors secondary_button_colors_;
   SkColor icon_color_ = SK_ColorBLACK;
 
   DISALLOW_COPY_AND_ASSIGN(AudioPermissionPromptTexture);
diff --git a/chrome/browser/vr/elements/environment/background.cc b/chrome/browser/vr/elements/environment/background.cc
index d4c8286..7c8c30e 100644
--- a/chrome/browser/vr/elements/environment/background.cc
+++ b/chrome/browser/vr/elements/environment/background.cc
@@ -188,18 +188,18 @@
 }
 
 void Background::SetNormalFactor(float factor) {
-  animation_player().TransitionFloatTo(last_frame_time(), NORMAL_COLOR_FACTOR,
-                                       normal_factor_, factor);
+  animation().TransitionFloatTo(last_frame_time(), NORMAL_COLOR_FACTOR,
+                                normal_factor_, factor);
 }
 
 void Background::SetIncognitoFactor(float factor) {
-  animation_player().TransitionFloatTo(
-      last_frame_time(), INCOGNITO_COLOR_FACTOR, incognito_factor_, factor);
+  animation().TransitionFloatTo(last_frame_time(), INCOGNITO_COLOR_FACTOR,
+                                incognito_factor_, factor);
 }
 
 void Background::SetFullscreenFactor(float factor) {
-  animation_player().TransitionFloatTo(
-      last_frame_time(), FULLSCREEN_COLOR_FACTOR, fullscreen_factor_, factor);
+  animation().TransitionFloatTo(last_frame_time(), FULLSCREEN_COLOR_FACTOR,
+                                fullscreen_factor_, factor);
 }
 
 void Background::CreateBackgroundTexture() {
diff --git a/chrome/browser/vr/elements/environment/grid.cc b/chrome/browser/vr/elements/environment/grid.cc
index 3df18925c..ac26c467 100644
--- a/chrome/browser/vr/elements/environment/grid.cc
+++ b/chrome/browser/vr/elements/environment/grid.cc
@@ -72,8 +72,8 @@
 Grid::~Grid() {}
 
 void Grid::SetGridColor(SkColor color) {
-  animation_player().TransitionColorTo(last_frame_time(), GRID_COLOR,
-                                       grid_color_, color);
+  animation().TransitionColorTo(last_frame_time(), GRID_COLOR, grid_color_,
+                                color);
 }
 
 void Grid::NotifyClientColorAnimated(SkColor color,
diff --git a/chrome/browser/vr/elements/exit_prompt.cc b/chrome/browser/vr/elements/exit_prompt.cc
index b91b6464..0d79018 100644
--- a/chrome/browser/vr/elements/exit_prompt.cc
+++ b/chrome/browser/vr/elements/exit_prompt.cc
@@ -9,12 +9,17 @@
 namespace vr {
 
 ExitPrompt::ExitPrompt(int preferred_width,
-                       const ExitPrompt::Callback& primary_button_callback,
-                       const ExitPrompt::Callback& secondary_button_callback)
+                       const ExitPromptCallback& result_callback)
     : TexturedElement(preferred_width),
       texture_(std::make_unique<ExitPromptTexture>()),
-      primary_button_callback_(primary_button_callback),
-      secondary_button_callback_(secondary_button_callback) {}
+      result_callback_(result_callback) {}
+
+ExitPrompt::ExitPrompt(int preferred_width,
+                       const ExitPromptCallback& result_callback,
+                       std::unique_ptr<ExitPromptTexture> texture)
+    : TexturedElement(preferred_width),
+      texture_(std::move(texture)),
+      result_callback_(result_callback) {}
 
 ExitPrompt::~ExitPrompt() = default;
 
@@ -22,8 +27,9 @@
   texture_->SetContentMessageId(message_id);
 }
 
-void ExitPrompt::SetTextureForTesting(ExitPromptTexture* texture) {
-  texture_.reset(texture);
+void ExitPrompt::SetTextureForTesting(
+    std::unique_ptr<ExitPromptTexture> texture) {
+  texture_ = std::move(texture);
 }
 
 void ExitPrompt::OnHoverEnter(const gfx::PointF& position) {
@@ -49,9 +55,9 @@
 
 void ExitPrompt::OnButtonUp(const gfx::PointF& position) {
   if (primary_down_ && texture_->HitsPrimaryButton(position))
-    primary_button_callback_.Run(reason_);
+    result_callback_.Run(PRIMARY, reason_);
   else if (secondary_down_ && texture_->HitsSecondaryButton(position))
-    secondary_button_callback_.Run(reason_);
+    result_callback_.Run(SECONDARY, reason_);
 
   primary_down_ = false;
   secondary_down_ = false;
@@ -68,11 +74,15 @@
 }
 
 void ExitPrompt::ClickPrimaryButtonForTesting() {
-  primary_button_callback_.Run(reason_);
+  result_callback_.Run(PRIMARY, reason_);
 }
 
 void ExitPrompt::ClickSecondaryButtonForTesting() {
-  secondary_button_callback_.Run(reason_);
+  result_callback_.Run(SECONDARY, reason_);
+}
+
+void ExitPrompt::Cancel() {
+  result_callback_.Run(NONE, reason_);
 }
 
 void ExitPrompt::OnStateUpdated(const gfx::PointF& position) {
diff --git a/chrome/browser/vr/elements/exit_prompt.h b/chrome/browser/vr/elements/exit_prompt.h
index 034acd0..66ead8ec 100644
--- a/chrome/browser/vr/elements/exit_prompt.h
+++ b/chrome/browser/vr/elements/exit_prompt.h
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "chrome/browser/vr/elements/textured_element.h"
+#include "chrome/browser/vr/exit_vr_prompt_choice.h"
 #include "chrome/browser/vr/ui_unsupported_mode.h"
 
 namespace vr {
@@ -19,15 +20,17 @@
 
 class ExitPrompt : public TexturedElement {
  public:
-  typedef typename base::Callback<void(UiUnsupportedMode)> Callback;
-  ExitPrompt(int preferred_width,
-             const Callback& primary_button_callback,
-             const Callback& secondary_buttton_callback);
+  enum Button { NONE, PRIMARY, SECONDARY };
+
+  typedef typename base::RepeatingCallback<void(Button, UiUnsupportedMode)>
+      ExitPromptCallback;
+
+  ExitPrompt(int preferred_width, const ExitPromptCallback& result_callback);
   ~ExitPrompt() override;
 
   void SetContentMessageId(int message_id);
 
-  void SetTextureForTesting(ExitPromptTexture* texture);
+  void SetTextureForTesting(std::unique_ptr<ExitPromptTexture> texture);
 
   void set_reason(UiUnsupportedMode reason) { reason_ = reason; }
 
@@ -43,9 +46,16 @@
   void ClickPrimaryButtonForTesting();
   void ClickSecondaryButtonForTesting();
 
- private:
+  void Cancel();
+
+ protected:
+  ExitPrompt(int preferred_width,
+             const ExitPromptCallback& result_callback,
+             std::unique_ptr<ExitPromptTexture> texture);
+
   UiTexture* GetTexture() const override;
 
+ private:
   void OnStateUpdated(const gfx::PointF& position);
 
   bool primary_down_ = false;
@@ -54,8 +64,7 @@
 
   std::unique_ptr<ExitPromptTexture> texture_;
 
-  Callback primary_button_callback_;
-  Callback secondary_button_callback_;
+  ExitPromptCallback result_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(ExitPrompt);
 };
diff --git a/chrome/browser/vr/elements/exit_prompt_texture.h b/chrome/browser/vr/elements/exit_prompt_texture.h
index cea62ca..a21cdcb1 100644
--- a/chrome/browser/vr/elements/exit_prompt_texture.h
+++ b/chrome/browser/vr/elements/exit_prompt_texture.h
@@ -27,7 +27,7 @@
   void SetPrimaryButtonPressed(bool pressed);
   void SetSecondaryButtonHovered(bool hovered);
   void SetSecondaryButtonPressed(bool pressed);
-  void SetContentMessageId(int message_id);
+  virtual void SetContentMessageId(int message_id);
 
   virtual bool HitsSecondaryButton(const gfx::PointF& position) const;
   virtual bool HitsPrimaryButton(const gfx::PointF& position) const;
@@ -35,9 +35,7 @@
   void SetPrimaryButtonColors(const ButtonColors& colors);
   void SetSecondaryButtonColors(const ButtonColors& colors);
 
- private:
-  void Draw(SkCanvas* sk_canvas, const gfx::Size& texture_size) override;
-
+ protected:
   float ToPixels(float meters) const;
   gfx::PointF PercentToPixels(const gfx::PointF& percent) const;
 
@@ -49,11 +47,15 @@
   bool primary_pressed_ = false;
   bool secondary_hovered_ = false;
   bool secondary_pressed_ = false;
-  int content_message_id_ = -1;
 
   ButtonColors primary_button_colors_;
   ButtonColors secondary_button_colors_;
 
+ private:
+  void Draw(SkCanvas* sk_canvas, const gfx::Size& texture_size) override;
+
+  int content_message_id_ = -1;
+
   DISALLOW_COPY_AND_ASSIGN(ExitPromptTexture);
 };
 
diff --git a/chrome/browser/vr/elements/exit_prompt_unittest.cc b/chrome/browser/vr/elements/exit_prompt_unittest.cc
index 4bcb84e..34e314d 100644
--- a/chrome/browser/vr/elements/exit_prompt_unittest.cc
+++ b/chrome/browser/vr/elements/exit_prompt_unittest.cc
@@ -45,11 +45,17 @@
   bool secondary_button_pressed() const { return secondary_button_pressed_; }
 
  private:
-  void OnPrimaryButtonPressed(UiUnsupportedMode reason) {
-    primary_button_pressed_ = true;
-  }
-  void OnSecondaryButtonPressed(UiUnsupportedMode reason) {
-    secondary_button_pressed_ = true;
+  void OnButtonPressed(ExitPrompt::Button button, UiUnsupportedMode reason) {
+    switch (button) {
+      case ExitPrompt::NONE:
+        break;
+      case ExitPrompt::PRIMARY:
+        primary_button_pressed_ = true;
+        break;
+      case ExitPrompt::SECONDARY:
+        secondary_button_pressed_ = true;
+        break;
+    }
   }
 
   bool primary_button_pressed_ = false;
@@ -58,14 +64,12 @@
 
 TestExitPrompt::TestExitPrompt()
     : ExitPrompt(512,
-                 base::Bind(&TestExitPrompt::OnPrimaryButtonPressed,
-                            base::Unretained(this)),
-                 base::Bind(&TestExitPrompt::OnSecondaryButtonPressed,
-                            base::Unretained(this))) {}
+                 base::BindRepeating(&TestExitPrompt::OnButtonPressed,
+                                     base::Unretained(this))) {}
 
 TEST(ExitPromptTest, PrimaryButtonCallbackCalled) {
   TestExitPrompt prompt;
-  MockExitPromptTexture* texture = new MockExitPromptTexture();
+  auto texture = std::make_unique<MockExitPromptTexture>();
   // Called twice from OnButtonDown and twice from OnButtonUp.
   EXPECT_CALL(*texture, HitsPrimaryButton(gfx::PointF()))
       .Times(4)
@@ -85,7 +89,7 @@
 
 TEST(ExitPromptTest, SecondaryButtonCallbackCalled) {
   TestExitPrompt prompt;
-  MockExitPromptTexture* texture = new MockExitPromptTexture();
+  auto texture = std::make_unique<MockExitPromptTexture>();
   // Called twice from OnButtonDown and once from OnButtonUp.
   EXPECT_CALL(*texture, HitsPrimaryButton(gfx::PointF()))
       .Times(3)
diff --git a/chrome/browser/vr/elements/rect.cc b/chrome/browser/vr/elements/rect.cc
index 0c15253..7b048ed 100644
--- a/chrome/browser/vr/elements/rect.cc
+++ b/chrome/browser/vr/elements/rect.cc
@@ -19,13 +19,13 @@
 }
 
 void Rect::SetCenterColor(SkColor color) {
-  animation_player().TransitionColorTo(last_frame_time(), BACKGROUND_COLOR,
-                                       center_color_, color);
+  animation().TransitionColorTo(last_frame_time(), BACKGROUND_COLOR,
+                                center_color_, color);
 }
 
 void Rect::SetEdgeColor(SkColor color) {
-  animation_player().TransitionColorTo(last_frame_time(), FOREGROUND_COLOR,
-                                       edge_color_, color);
+  animation().TransitionColorTo(last_frame_time(), FOREGROUND_COLOR,
+                                edge_color_, color);
 }
 
 void Rect::NotifyClientColorAnimated(SkColor color,
diff --git a/chrome/browser/vr/elements/spinner.cc b/chrome/browser/vr/elements/spinner.cc
index a73dc705..94e7acf 100644
--- a/chrome/browser/vr/elements/spinner.cc
+++ b/chrome/browser/vr/elements/spinner.cc
@@ -8,7 +8,7 @@
 #include "cc/animation/timing_function.h"
 #include "cc/animation/transform_operations.h"
 #include "cc/paint/skia_paint_canvas.h"
-#include "chrome/browser/vr/animation_player.h"
+#include "chrome/browser/vr/animation.h"
 #include "chrome/browser/vr/elements/ui_texture.h"
 #include "chrome/browser/vr/target_property.h"
 #include "third_party/skia/include/core/SkPaint.h"
@@ -83,8 +83,8 @@
       cc::FloatKeyframe::Create(kRotationDuration, 360.0f, nullptr));
 
   std::unique_ptr<cc::KeyframeModel> keyframe_model(cc::KeyframeModel::Create(
-      std::move(curve), AnimationPlayer::GetNextKeyframeModelId(),
-      AnimationPlayer::GetNextGroupId(), SPINNER_ROTATION));
+      std::move(curve), Animation::GetNextKeyframeModelId(),
+      Animation::GetNextGroupId(), SPINNER_ROTATION));
 
   keyframe_model->set_iterations(-1);
   AddKeyframeModel(std::move(keyframe_model));
@@ -98,8 +98,8 @@
   }
 
   keyframe_model = cc::KeyframeModel::Create(
-      std::move(curve), AnimationPlayer::GetNextKeyframeModelId(),
-      AnimationPlayer::GetNextGroupId(), SPINNER_ANGLE_SWEEP);
+      std::move(curve), Animation::GetNextKeyframeModelId(),
+      Animation::GetNextGroupId(), SPINNER_ANGLE_SWEEP);
 
   keyframe_model->set_iterations(-1);
   AddKeyframeModel(std::move(keyframe_model));
@@ -112,8 +112,8 @@
   }
 
   keyframe_model = cc::KeyframeModel::Create(
-      std::move(curve), AnimationPlayer::GetNextKeyframeModelId(),
-      AnimationPlayer::GetNextGroupId(), SPINNER_ANGLE_START);
+      std::move(curve), Animation::GetNextKeyframeModelId(),
+      Animation::GetNextGroupId(), SPINNER_ANGLE_START);
 
   keyframe_model->set_iterations(-1);
   AddKeyframeModel(std::move(keyframe_model));
diff --git a/chrome/browser/vr/elements/throbber.cc b/chrome/browser/vr/elements/throbber.cc
index 98f23f1..02ad7518 100644
--- a/chrome/browser/vr/elements/throbber.cc
+++ b/chrome/browser/vr/elements/throbber.cc
@@ -40,16 +40,16 @@
 
 void Throbber::SetCircleGrowAnimationEnabled(bool enabled) {
   if (!enabled) {
-    if (animation_player().IsAnimatingProperty(CIRCLE_GROW)) {
+    if (animation().IsAnimatingProperty(CIRCLE_GROW)) {
       SetOpacity(opacity_before_animation_);
       SetScale(scale_before_animation_.scale.x, scale_before_animation_.scale.y,
                scale_before_animation_.scale.z);
     }
-    animation_player().RemoveKeyframeModels(CIRCLE_GROW);
+    animation().RemoveKeyframeModels(CIRCLE_GROW);
     return;
   }
 
-  if (animation_player().IsAnimatingProperty(CIRCLE_GROW))
+  if (animation().IsAnimatingProperty(CIRCLE_GROW))
     return;
 
   scale_before_animation_ = GetTargetTransform().at(kScaleIndex);
@@ -64,8 +64,8 @@
       nullptr));
 
   std::unique_ptr<cc::KeyframeModel> keyframe_model(cc::KeyframeModel::Create(
-      std::move(curve), AnimationPlayer::GetNextKeyframeModelId(),
-      AnimationPlayer::GetNextGroupId(), CIRCLE_GROW));
+      std::move(curve), Animation::GetNextKeyframeModelId(),
+      Animation::GetNextGroupId(), CIRCLE_GROW));
   keyframe_model->set_iterations(-1);
   AddKeyframeModel(std::move(keyframe_model));
 }
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
index f4e94340..15fc1a7 100644
--- a/chrome/browser/vr/elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -88,7 +88,7 @@
 EventHandlers::~EventHandlers() = default;
 
 UiElement::UiElement() : id_(AllocateId()) {
-  animation_player_.set_target(this);
+  animation_.set_target(this);
   layout_offset_.AppendTranslate(0, 0, 0);
   transform_operations_.AppendTranslate(0, 0, 0);
   transform_operations_.AppendRotate(1, 0, 0, 0);
@@ -96,7 +96,7 @@
 }
 
 UiElement::~UiElement() {
-  animation_player_.set_target(nullptr);
+  animation_.set_target(nullptr);
 }
 
 void UiElement::SetName(UiElementName name) {
@@ -219,9 +219,9 @@
                              const gfx::Transform& head_pose) {
   // TODO(mthiesse): This is overly cautious. We may have keyframe_models but
   // not trigger any updates, so we should refine this logic and have
-  // AnimationPlayer::Tick return a boolean.
-  bool keyframe_models_updated = animation_player_.keyframe_models().size() > 0;
-  animation_player_.Tick(time);
+  // Animation::Tick return a boolean.
+  bool keyframe_models_updated = animation_.keyframe_models().size() > 0;
+  animation_.Tick(time);
   last_frame_time_ = time;
   set_update_phase(kUpdatedAnimations);
   bool begin_frame_updated = OnBeginFrame(time, head_pose);
@@ -241,8 +241,8 @@
 }
 
 void UiElement::SetSize(float width, float height) {
-  animation_player_.TransitionSizeTo(last_frame_time_, BOUNDS, size_,
-                                     gfx::SizeF(width, height));
+  animation_.TransitionSizeTo(last_frame_time_, BOUNDS, size_,
+                              gfx::SizeF(width, height));
   OnSetSize(gfx::SizeF(width, height));
 }
 
@@ -254,7 +254,7 @@
 
 void UiElement::SetVisibleImmediately(bool visible) {
   opacity_ = visible ? opacity_when_visible_ : 0.0;
-  animation_player_.RemoveKeyframeModels(OPACITY);
+  animation_.RemoveKeyframeModels(OPACITY);
 }
 
 bool UiElement::IsVisible() const {
@@ -281,8 +281,8 @@
   cc::TransformOperation& op = operations.at(0);
   op.translate = {x, y, 0};
   op.Bake();
-  animation_player_.TransitionTransformOperationsTo(
-      last_frame_time_, LAYOUT_OFFSET, transform_operations_, operations);
+  animation_.TransitionTransformOperationsTo(last_frame_time_, LAYOUT_OFFSET,
+                                             transform_operations_, operations);
 }
 
 void UiElement::SetTranslate(float x, float y, float z) {
@@ -290,8 +290,8 @@
   cc::TransformOperation& op = operations.at(kTranslateIndex);
   op.translate = {x, y, z};
   op.Bake();
-  animation_player_.TransitionTransformOperationsTo(
-      last_frame_time_, TRANSFORM, transform_operations_, operations);
+  animation_.TransitionTransformOperationsTo(last_frame_time_, TRANSFORM,
+                                             transform_operations_, operations);
 }
 
 void UiElement::SetRotate(float x, float y, float z, float radians) {
@@ -300,8 +300,8 @@
   op.rotate.axis = {x, y, z};
   op.rotate.angle = gfx::RadToDeg(radians);
   op.Bake();
-  animation_player_.TransitionTransformOperationsTo(
-      last_frame_time_, TRANSFORM, transform_operations_, operations);
+  animation_.TransitionTransformOperationsTo(last_frame_time_, TRANSFORM,
+                                             transform_operations_, operations);
 }
 
 void UiElement::SetScale(float x, float y, float z) {
@@ -309,13 +309,12 @@
   cc::TransformOperation& op = operations.at(kScaleIndex);
   op.scale = {x, y, z};
   op.Bake();
-  animation_player_.TransitionTransformOperationsTo(
-      last_frame_time_, TRANSFORM, transform_operations_, operations);
+  animation_.TransitionTransformOperationsTo(last_frame_time_, TRANSFORM,
+                                             transform_operations_, operations);
 }
 
 void UiElement::SetOpacity(float opacity) {
-  animation_player_.TransitionFloatTo(last_frame_time_, OPACITY, opacity_,
-                                      opacity);
+  animation_.TransitionFloatTo(last_frame_time_, OPACITY, opacity_, opacity);
 }
 
 void UiElement::SetCornerRadii(const CornerRadii& radii) {
@@ -326,12 +325,12 @@
 void UiElement::OnSetCornerRadii(const CornerRadii& radii) {}
 
 gfx::SizeF UiElement::GetTargetSize() const {
-  return animation_player_.GetTargetSizeValue(TargetProperty::BOUNDS, size_);
+  return animation_.GetTargetSizeValue(TargetProperty::BOUNDS, size_);
 }
 
 cc::TransformOperations UiElement::GetTargetTransform() const {
-  return animation_player_.GetTargetTransformOperationsValue(
-      TargetProperty::TRANSFORM, transform_operations_);
+  return animation_.GetTargetTransformOperationsValue(TargetProperty::TRANSFORM,
+                                                      transform_operations_);
 }
 
 gfx::Transform UiElement::ComputeTargetWorldSpaceTransform() const {
@@ -343,8 +342,7 @@
 }
 
 float UiElement::GetTargetOpacity() const {
-  return animation_player_.GetTargetFloatValue(TargetProperty::OPACITY,
-                                               opacity_);
+  return animation_.GetTargetFloatValue(TargetProperty::OPACITY, opacity_);
 }
 
 float UiElement::ComputeTargetOpacity() const {
@@ -637,24 +635,24 @@
 void UiElement::SetTransitionedProperties(
     const std::set<TargetProperty>& properties) {
   std::set<int> converted_properties(properties.begin(), properties.end());
-  animation_player_.SetTransitionedProperties(converted_properties);
+  animation_.SetTransitionedProperties(converted_properties);
 }
 
 void UiElement::SetTransitionDuration(base::TimeDelta delta) {
-  animation_player_.SetTransitionDuration(delta);
+  animation_.SetTransitionDuration(delta);
 }
 
 void UiElement::AddKeyframeModel(
     std::unique_ptr<cc::KeyframeModel> keyframe_model) {
-  animation_player_.AddKeyframeModel(std::move(keyframe_model));
+  animation_.AddKeyframeModel(std::move(keyframe_model));
 }
 
 void UiElement::RemoveKeyframeModel(int keyframe_model_id) {
-  animation_player_.RemoveKeyframeModel(keyframe_model_id);
+  animation_.RemoveKeyframeModel(keyframe_model_id);
 }
 
 bool UiElement::IsAnimatingProperty(TargetProperty property) const {
-  return animation_player_.IsAnimatingProperty(static_cast<int>(property));
+  return animation_.IsAnimatingProperty(static_cast<int>(property));
 }
 
 void UiElement::DoLayOutChildren() {
diff --git a/chrome/browser/vr/elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h
index 422a137..5bdcfd8d 100644
--- a/chrome/browser/vr/elements/ui_element.h
+++ b/chrome/browser/vr/elements/ui_element.h
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "cc/animation/animation_target.h"
 #include "cc/animation/transform_operations.h"
-#include "chrome/browser/vr/animation_player.h"
+#include "chrome/browser/vr/animation.h"
 #include "chrome/browser/vr/databinding/binding_base.h"
 #include "chrome/browser/vr/elements/corner_radii.h"
 #include "chrome/browser/vr/elements/draw_phase.h"
@@ -444,7 +444,7 @@
   gfx::SizeF stale_size() const;
 
  protected:
-  AnimationPlayer& animation_player() { return animation_player_; }
+  Animation& animation() { return animation_; }
 
   base::TimeTicks last_frame_time() const { return last_frame_time_; }
 
@@ -523,7 +523,7 @@
   float x_padding_ = 0.0f;
   float y_padding_ = 0.0f;
 
-  AnimationPlayer animation_player_;
+  Animation animation_;
 
   DrawPhase draw_phase_ = kPhaseNone;
 
diff --git a/chrome/browser/vr/model/modal_prompt_type.cc b/chrome/browser/vr/model/modal_prompt_type.cc
index b14ca01..b6e7f95f 100644
--- a/chrome/browser/vr/model/modal_prompt_type.cc
+++ b/chrome/browser/vr/model/modal_prompt_type.cc
@@ -14,6 +14,8 @@
       return UiUnsupportedMode::kUnhandledPageInfo;
     case kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission:
       return UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission;
+    case kModalPromptTypeGenericUnsupportedFeature:
+      return UiUnsupportedMode::kGenericUnsupportedFeature;
     case kModalPromptTypeNone:
       return UiUnsupportedMode::kCount;
   }
diff --git a/chrome/browser/vr/model/modal_prompt_type.h b/chrome/browser/vr/model/modal_prompt_type.h
index 60db96f..86c349d0 100644
--- a/chrome/browser/vr/model/modal_prompt_type.h
+++ b/chrome/browser/vr/model/modal_prompt_type.h
@@ -13,6 +13,7 @@
   kModalPromptTypeNone,
   kModalPromptTypeExitVRForSiteInfo,
   kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission,
+  kModalPromptTypeGenericUnsupportedFeature,
 };
 
 UiUnsupportedMode GetReasonForPrompt(ModalPromptType prompt);
diff --git a/chrome/browser/vr/test/animation_utils.cc b/chrome/browser/vr/test/animation_utils.cc
index b1feede..e45b631d 100644
--- a/chrome/browser/vr/test/animation_utils.cc
+++ b/chrome/browser/vr/test/animation_utils.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/vr/test/animation_utils.h"
 
-#include "chrome/browser/vr/animation_player.h"
+#include "chrome/browser/vr/animation.h"
 #include "chrome/browser/vr/elements/ui_element.h"
 
 namespace vr {
diff --git a/chrome/browser/vr/test/mock_browser_ui_interface.h b/chrome/browser/vr/test/mock_browser_ui_interface.h
index 84b9259..aa44eb1 100644
--- a/chrome/browser/vr/test/mock_browser_ui_interface.h
+++ b/chrome/browser/vr/test/mock_browser_ui_interface.h
@@ -32,8 +32,7 @@
   MOCK_METHOD1(SetAudioCaptureEnabled, void(bool enabled));
   MOCK_METHOD1(SetBluetoothConnected, void(bool enabled));
   MOCK_METHOD1(SetLocationAccessEnabled, void(bool enabled));
-  MOCK_METHOD2(SetExitVrPromptEnabled,
-               void(bool enabled, UiUnsupportedMode reason));
+  MOCK_METHOD1(ShowExitVrPrompt, void(UiUnsupportedMode reason));
   MOCK_METHOD1(SetSpeechRecognitionEnabled, void(bool enabled));
   MOCK_METHOD1(SetRecognitionResult, void(const base::string16& result));
   MOCK_METHOD1(OnSpeechRecognitionStateChanged, void(int new_state));
diff --git a/chrome/browser/vr/testapp/vr_test_context.cc b/chrome/browser/vr/testapp/vr_test_context.cc
index dc42dd1..4cdc78b 100644
--- a/chrome/browser/vr/testapp/vr_test_context.cc
+++ b/chrome/browser/vr/testapp/vr_test_context.cc
@@ -461,7 +461,7 @@
 void VrTestContext::OnUnsupportedMode(vr::UiUnsupportedMode mode) {
   if (mode == UiUnsupportedMode::kUnhandledPageInfo ||
       mode == UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission) {
-    ui_->SetExitVrPromptEnabled(true, mode);
+    ui_->ShowExitVrPrompt(mode);
   }
 }
 
@@ -473,7 +473,6 @@
       choice == CHOICE_EXIT) {
     voice_search_enabled_ = true;
   }
-  ui_->SetExitVrPromptEnabled(false, UiUnsupportedMode::kCount);
 }
 
 void VrTestContext::OnContentScreenBoundsChanged(const gfx::SizeF& bounds) {}
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc
index 49186e7..5c9aab1 100644
--- a/chrome/browser/vr/ui.cc
+++ b/chrome/browser/vr/ui.cc
@@ -11,6 +11,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/vr/content_input_delegate.h"
 #include "chrome/browser/vr/cpu_surface_provider.h"
+#include "chrome/browser/vr/elements/exit_prompt.h"
 #include "chrome/browser/vr/elements/text_input.h"
 #include "chrome/browser/vr/ganesh_surface_provider.h"
 #include "chrome/browser/vr/keyboard_delegate.h"
@@ -140,18 +141,9 @@
   model_->capturing_state.location_access_enabled = enabled;
 }
 
-void Ui::SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason) {
-  if (!enabled) {
-    DCHECK_EQ(reason, UiUnsupportedMode::kCount);
-    model_->active_modal_prompt_type = kModalPromptTypeNone;
-    return;
-  }
-
-  if (model_->active_modal_prompt_type != kModalPromptTypeNone) {
-    browser_->OnExitVrPromptResult(
-        ExitVrPromptChoice::CHOICE_NONE,
-        GetReasonForPrompt(model_->active_modal_prompt_type));
-  }
+void Ui::ShowExitVrPrompt(UiUnsupportedMode reason) {
+  // Shouldn't request to exit VR when we're already prompting to exit VR.
+  CHECK(model_->active_modal_prompt_type == kModalPromptTypeNone);
 
   switch (reason) {
     case UiUnsupportedMode::kUnhandledCodePoint:
@@ -164,6 +156,10 @@
       model_->active_modal_prompt_type =
           kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission;
       return;
+    case UiUnsupportedMode::kGenericUnsupportedFeature:
+      model_->active_modal_prompt_type =
+          kModalPromptTypeGenericUnsupportedFeature;
+      return;
     case UiUnsupportedMode::kCount:
       NOTREACHED();  // Should never be used as a mode (when |enabled| is true).
       return;
@@ -439,4 +435,16 @@
   model_->supports_selection = ui_initial_state.supports_selection;
 }
 
+void Ui::AcceptDoffPromptForTesting() {
+  DCHECK(model_->active_modal_prompt_type != kModalPromptTypeNone);
+  if (model_->active_modal_prompt_type ==
+      kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission) {
+    static_cast<ExitPrompt*>(scene_->GetUiElementByName(kAudioPermissionPrompt))
+        ->ClickPrimaryButtonForTesting();
+  } else {
+    static_cast<ExitPrompt*>(scene_->GetUiElementByName(kExitPrompt))
+        ->ClickSecondaryButtonForTesting();
+  }
+}
+
 }  // namespace vr
diff --git a/chrome/browser/vr/ui.h b/chrome/browser/vr/ui.h
index 7ae99036..7e159d2 100644
--- a/chrome/browser/vr/ui.h
+++ b/chrome/browser/vr/ui.h
@@ -86,7 +86,7 @@
   void SetAudioCaptureEnabled(bool enabled) override;
   void SetBluetoothConnected(bool enabled) override;
   void SetLocationAccessEnabled(bool enabled) override;
-  void SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason) override;
+  void ShowExitVrPrompt(UiUnsupportedMode reason) override;
   void SetSpeechRecognitionEnabled(bool enabled) override;
   void SetRecognitionResult(const base::string16& result) override;
   void OnSpeechRecognitionStateChanged(int new_state) override;
@@ -158,6 +158,8 @@
   void OnInputCommitted(const EditedText& info) override;
   void OnKeyboardHidden() override;
 
+  void AcceptDoffPromptForTesting();
+
  private:
   void InitializeModel(const UiInitialState& ui_initial_state);
   UiBrowserInterface* browser_;
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index 4e39905..c6e16d0 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -666,7 +666,9 @@
                               kPhaseNone);
   element->AddBinding(VR_BIND_FUNC(
       bool, Model, model_,
-      model->active_modal_prompt_type != kModalPromptTypeExitVRForSiteInfo,
+      model->active_modal_prompt_type ==
+              kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission ||
+          model->active_modal_prompt_type == kModalPromptTypeNone,
       UiElement, element.get(), SetVisible));
   scene_->AddUiElement(k2dBrowsingVisibiltyControlForVoice, std::move(element));
 
@@ -1738,7 +1740,7 @@
 
   auto visibility_toggle_for_audio_permission = Create<UiElement>(
       kOmniboxVisibilityControlForAudioPermissionPrompt, kPhaseNone);
-  // Note that wnen the audio permissions prompt is triggered from the omnibox
+  // Note that when the audio permissions prompt is triggered from the omnibox
   // editing mode, we don't change the opacity of the background like we do in
   // the default browsing case.
   visibility_toggle_for_audio_permission->AddBinding(VR_BIND_FUNC(
@@ -2091,8 +2093,6 @@
 }
 
 void UiSceneCreator::CreateExitPrompt() {
-  std::unique_ptr<UiElement> element;
-
   // Place an invisible but hittable plane behind the exit prompt, to keep the
   // reticle roughly planar with the content if near content.
   auto backplane = std::make_unique<InvisibleHitTarget>();
@@ -2102,27 +2102,32 @@
   backplane->SetTranslate(0.0,
                           kContentVerticalOffset + kExitPromptVerticalOffset,
                           -kContentDistance);
-  EventHandlers event_handlers;
-  event_handlers.button_up = base::BindRepeating(
-      [](UiBrowserInterface* browser, Model* m) {
-        browser->OnExitVrPromptResult(
-            ExitVrPromptChoice::CHOICE_NONE,
-            GetReasonForPrompt(m->active_modal_prompt_type));
-      },
-      base::Unretained(browser_), base::Unretained(model_));
-  backplane->set_event_handlers(event_handlers);
-  VR_BIND_VISIBILITY(backplane, model->active_modal_prompt_type ==
-                                    kModalPromptTypeExitVRForSiteInfo);
-  scene_->AddUiElement(k2dBrowsingRepositioner, std::move(backplane));
+  VR_BIND_VISIBILITY(
+      backplane,
+      model->active_modal_prompt_type != kModalPromptTypeNone &&
+          model->active_modal_prompt_type !=
+              kModalPromptTypeExitVRForVoiceSearchRecordAudioOsPermission);
 
   std::unique_ptr<ExitPrompt> exit_prompt = std::make_unique<ExitPrompt>(
-      512,
-      base::BindRepeating(&UiBrowserInterface::OnExitVrPromptResult,
-                          base::Unretained(browser_),
-                          ExitVrPromptChoice::CHOICE_STAY),
-      base::BindRepeating(&UiBrowserInterface::OnExitVrPromptResult,
-                          base::Unretained(browser_),
-                          ExitVrPromptChoice::CHOICE_EXIT));
+      512, base::BindRepeating(
+               [](Model* model, UiBrowserInterface* browser,
+                  ExitPrompt::Button button, UiUnsupportedMode mode) {
+                 ExitVrPromptChoice choice = CHOICE_NONE;
+                 switch (button) {
+                   case ExitPrompt::NONE:
+                     choice = CHOICE_NONE;
+                     break;
+                   case ExitPrompt::PRIMARY:
+                     choice = CHOICE_STAY;
+                     break;
+                   case ExitPrompt::SECONDARY:
+                     choice = CHOICE_EXIT;
+                     break;
+                 }
+                 browser->OnExitVrPromptResult(choice, mode);
+                 model->active_modal_prompt_type = kModalPromptTypeNone;
+               },
+               base::Unretained(model_), base::Unretained(browser_)));
   exit_prompt->SetName(kExitPrompt);
   exit_prompt->set_hit_testable(true);
   exit_prompt->SetDrawPhase(kPhaseForeground);
@@ -2146,18 +2151,25 @@
                 e->SetContentMessageId(
                     IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION_SITE_INFO);
                 break;
+              case kModalPromptTypeGenericUnsupportedFeature:  // Fall through.
               default:
                 e->SetContentMessageId(IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION);
                 break;
             }
           },
           base::Unretained(exit_prompt.get()))));
+
+  EventHandlers event_handlers;
+  event_handlers.button_up =
+      base::BindRepeating([](ExitPrompt* prompt) { prompt->Cancel(); },
+                          base::Unretained(exit_prompt.get()));
+  backplane->set_event_handlers(event_handlers);
+
+  scene_->AddUiElement(k2dBrowsingRepositioner, std::move(backplane));
   scene_->AddUiElement(kExitPromptBackplane, std::move(exit_prompt));
 }
 
 void UiSceneCreator::CreateAudioPermissionPrompt() {
-  std::unique_ptr<UiElement> element;
-
   // Place an invisible but hittable plane behind the exit prompt, to keep the
   // reticle roughly planar with the content if near content.
   auto backplane = std::make_unique<InvisibleHitTarget>();
@@ -2165,15 +2177,6 @@
   backplane->SetName(kAudioPermissionPromptBackplane);
   backplane->SetSize(kPromptBackplaneSize, kPromptBackplaneSize);
   backplane->SetTranslate(0.0, kContentVerticalOffset, -kOverlayPlaneDistance);
-  EventHandlers event_handlers;
-  event_handlers.button_up = base::BindRepeating(
-      [](UiBrowserInterface* browser, Model* m) {
-        browser->OnExitVrPromptResult(
-            ExitVrPromptChoice::CHOICE_NONE,
-            GetReasonForPrompt(m->active_modal_prompt_type));
-      },
-      base::Unretained(browser_), base::Unretained(model_));
-  backplane->set_event_handlers(event_handlers);
   backplane->SetVisible(false);
   backplane->SetTransitionedProperties({OPACITY});
   VR_BIND_VISIBILITY(
@@ -2187,15 +2190,25 @@
 
   std::unique_ptr<AudioPermissionPrompt> prompt =
       std::make_unique<AudioPermissionPrompt>(
-          1024,
-          base::BindRepeating(
-              &UiBrowserInterface::OnExitVrPromptResult,
-              base::Unretained(browser_), ExitVrPromptChoice::CHOICE_EXIT,
-              UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission),
-          base::BindRepeating(
-              &UiBrowserInterface::OnExitVrPromptResult,
-              base::Unretained(browser_), ExitVrPromptChoice::CHOICE_STAY,
-              UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission));
+          1024, base::BindRepeating(
+                    [](Model* model, UiBrowserInterface* browser,
+                       ExitPrompt::Button button, UiUnsupportedMode mode) {
+                      ExitVrPromptChoice choice = CHOICE_NONE;
+                      switch (button) {
+                        case ExitPrompt::NONE:
+                          choice = CHOICE_NONE;
+                          break;
+                        case ExitPrompt::PRIMARY:
+                          choice = CHOICE_EXIT;
+                          break;
+                        case ExitPrompt::SECONDARY:
+                          choice = CHOICE_STAY;
+                          break;
+                      }
+                      browser->OnExitVrPromptResult(choice, mode);
+                      model->active_modal_prompt_type = kModalPromptTypeNone;
+                    },
+                    base::Unretained(model_), base::Unretained(browser_)));
   prompt->SetName(kAudioPermissionPrompt);
   prompt->SetDrawPhase(kPhaseForeground);
   prompt->SetSize(kAudioPermissionPromptWidth, kAudioPermissionPromptHeight);
@@ -2217,6 +2230,13 @@
                 &TexturedElement::SetBackgroundColor);
   VR_BIND_COLOR(model_, prompt.get(), &ColorScheme::element_foreground,
                 &TexturedElement::SetForegroundColor);
+
+  EventHandlers event_handlers;
+  event_handlers.button_up =
+      base::BindRepeating([](ExitPrompt* prompt) { prompt->Cancel(); },
+                          base::Unretained(prompt.get()));
+  backplane->set_event_handlers(event_handlers);
+
   shadow->AddChild(std::move(prompt));
   backplane->AddChild(std::move(shadow));
   scene_->AddUiElement(k2dBrowsingRepositioner, std::move(backplane));
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc
index 917ad15..df185be 100644
--- a/chrome/browser/vr/ui_unittest.cc
+++ b/chrome/browser/vr/ui_unittest.cc
@@ -549,7 +549,7 @@
 
   // Initial state.
   VerifyOnlyElementsVisible("Initial", kElementsVisibleInBrowsing);
-  ui_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
+  ui_->ShowExitVrPrompt(UiUnsupportedMode::kUnhandledPageInfo);
 
   VerifyOnlyElementsVisible("Prompt visible", kElementsVisibleWithExitPrompt);
 
@@ -560,10 +560,6 @@
                                    UiUnsupportedMode::kUnhandledPageInfo));
   scene_->GetUiElementByName(kExitPromptBackplane)->OnButtonUp(gfx::PointF());
 
-  // This would usually get called by the browser, but since it is mocked we
-  // will call it explicitly here and check that the UI responds as we would
-  // expect.
-  ui_->SetExitVrPromptEnabled(false, UiUnsupportedMode::kCount);
   VerifyOnlyElementsVisible("Prompt cleared", kElementsVisibleInBrowsing);
 }
 
@@ -575,14 +571,13 @@
   model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
   OnBeginFrame();
 
-  // Click on 'OK' should trigger UI browser interface but not close prompt.
+  // Click on 'OK' should trigger UI browser interface and close prompt.
   EXPECT_CALL(*browser_,
               OnExitVrPromptResult(ExitVrPromptChoice::CHOICE_STAY,
                                    UiUnsupportedMode::kUnhandledPageInfo));
   static_cast<ExitPrompt*>(scene_->GetUiElementByName(kExitPrompt))
       ->ClickPrimaryButtonForTesting();
-  VerifyOnlyElementsVisible("Prompt still visible",
-                            kElementsVisibleWithExitPrompt);
+  VerifyOnlyElementsVisible("Prompt cleared", kElementsVisibleInBrowsing);
 }
 
 TEST_F(UiTest, SecondaryButtonClickTriggersOnExitPrompt) {
@@ -593,16 +588,14 @@
   model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
   OnBeginFrame();
 
-  // Click on 'Exit VR' should trigger UI browser interface but not close
-  // prompt.
+  // Click on 'Exit VR' should trigger UI browser interface and close prompt.
   EXPECT_CALL(*browser_,
               OnExitVrPromptResult(ExitVrPromptChoice::CHOICE_EXIT,
                                    UiUnsupportedMode::kUnhandledPageInfo));
 
   static_cast<ExitPrompt*>(scene_->GetUiElementByName(kExitPrompt))
       ->ClickSecondaryButtonForTesting();
-  VerifyOnlyElementsVisible("Prompt still visible",
-                            kElementsVisibleWithExitPrompt);
+  VerifyOnlyElementsVisible("Prompt cleared", kElementsVisibleInBrowsing);
 }
 
 TEST_F(UiTest, UiUpdatesForWebVR) {
@@ -1023,18 +1016,6 @@
   }
 }
 
-TEST_F(UiTest, SecondExitPromptTriggersOnExitPrompt) {
-  CreateScene(kNotInCct, kNotInWebVr);
-  ui_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
-  // Initiating another exit VR prompt while a previous one was in flight should
-  // result in a call to the UiBrowserInterface.
-  EXPECT_CALL(*browser_,
-              OnExitVrPromptResult(ExitVrPromptChoice::CHOICE_NONE,
-                                   UiUnsupportedMode::kUnhandledPageInfo));
-  ui_->SetExitVrPromptEnabled(
-      true, UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission);
-}
-
 TEST_F(UiTest, ExitPresentAndFullscreenOnAppButtonClick) {
   CreateScene(kNotInCct, kNotInWebVr);
   ui_->SetWebVrMode(true, false);
diff --git a/chrome/browser/vr/ui_unsupported_mode.h b/chrome/browser/vr/ui_unsupported_mode.h
index 36b8871..8cbd070 100644
--- a/chrome/browser/vr/ui_unsupported_mode.h
+++ b/chrome/browser/vr/ui_unsupported_mode.h
@@ -17,7 +17,7 @@
   kUnhandledPageInfo = 2,
   // kURLWithStrongRTLChars = 3,  // Obsolete.
   kVoiceSearchNeedsRecordAudioOsPermission = 4,  // TODO(ddorwin): Android only.
-
+  kGenericUnsupportedFeature = 5,
   // This must be last.
   kCount,
 };
diff --git a/chrome/build/chrome.x64.orderfile.sha1 b/chrome/build/chrome.x64.orderfile.sha1
index 0784c20f..640ca95a 100644
--- a/chrome/build/chrome.x64.orderfile.sha1
+++ b/chrome/build/chrome.x64.orderfile.sha1
@@ -1 +1 @@
-21176fbe8d968157213705f1a56f080b17b50895
\ No newline at end of file
+d9c3038f933146779aa83114ee099ce8c2209308
\ No newline at end of file
diff --git a/chrome/build/chrome.x86.orderfile.sha1 b/chrome/build/chrome.x86.orderfile.sha1
index a885284..5689f46c 100644
--- a/chrome/build/chrome.x86.orderfile.sha1
+++ b/chrome/build/chrome.x86.orderfile.sha1
@@ -1 +1 @@
-5e1a0b338acb6d2e8108b5e12a328bf071641128
\ No newline at end of file
+ba1d758134cf74a5c24f22faa9f4145d45d82b3e
\ No newline at end of file
diff --git a/chrome/build/chrome_child.x64.orderfile.sha1 b/chrome/build/chrome_child.x64.orderfile.sha1
index c5153d23..fff0f0c 100644
--- a/chrome/build/chrome_child.x64.orderfile.sha1
+++ b/chrome/build/chrome_child.x64.orderfile.sha1
@@ -1 +1 @@
-3c2e495e166f81aa17d41e12b051f6aaffd3d894
\ No newline at end of file
+2a290e1c757a78ca970063ef0ae64a70e7cf5dcb
\ No newline at end of file
diff --git a/chrome/build/chrome_child.x86.orderfile.sha1 b/chrome/build/chrome_child.x86.orderfile.sha1
index 359a7ce..0829cfb 100644
--- a/chrome/build/chrome_child.x86.orderfile.sha1
+++ b/chrome/build/chrome_child.x86.orderfile.sha1
@@ -1 +1 @@
-ffa047cd9e619f85cd90b876a85c22574aef7369
\ No newline at end of file
+e32e5baeeb5c01baab01cb6354a74afa781981a9
\ No newline at end of file
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index 3ed5121b..94c5f75 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -58,10 +58,12 @@
     }
     if (is_chromeos) {
       sources += [
+        "$root_gen_dir/ash/components/resources/ash_components_resources_${percent}_percent.pak",
         "$root_gen_dir/ash/resources/ash_resources_${percent}_percent.pak",
         "$root_gen_dir/ui/chromeos/resources/ui_chromeos_resources_${percent}_percent.pak",
       ]
       deps += [
+        "//ash/components/resources",
         "//ash/resources",
         "//ui/chromeos/resources",
       ]
diff --git a/chrome/chrome_repack_locales.gni b/chrome/chrome_repack_locales.gni
index 82a6d4b..a80f158 100644
--- a/chrome/chrome_repack_locales.gni
+++ b/chrome/chrome_repack_locales.gni
@@ -55,11 +55,13 @@
 
     if (is_chromeos) {
       source_patterns += [
+        "${root_gen_dir}/ash/components/strings/ash_components_strings_",
         "${root_gen_dir}/ash/strings/ash_strings_",
         "${root_gen_dir}/remoting/resources/",
         "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_",
       ]
       deps += [
+        "//ash/components/strings",
         "//ash/strings",
         "//remoting/resources",
         "//ui/chromeos/strings",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index b547be5..39b5331 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -169,10 +169,6 @@
 const base::Feature kChangePictureVideoMode{"ChangePictureVideoMode",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Whether to trigger app banner installability checks on page load.
-const base::Feature kCheckInstallabilityForBannerOnLoad{
-    "CheckInstallabilityForBannerOnLoad", base::FEATURE_DISABLED_BY_DEFAULT};
-
 #if defined(OS_ANDROID)
 // Enables clearing of browsing data which is older than given time period.
 const base::Feature kClearOldBrowsingData{"ClearOldBrowsingData",
@@ -235,6 +231,11 @@
 const base::Feature kExperimentalAppBanners{"ExperimentalAppBanners",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
+#if defined(OS_CHROMEOS)
+extern const base::Feature kExperimentalCrostiniUI{
+    "ExperimentalCrostiniUI", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 // An experimental fullscreen prototype that allows pages to map browser and
 // system-reserved keyboard shortcuts.
 const base::Feature kExperimentalKeyboardLockUI{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index f8638aa5..76e5242 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -86,8 +86,6 @@
 
 extern const base::Feature kChangePictureVideoMode;
 
-extern const base::Feature kCheckInstallabilityForBannerOnLoad;
-
 #if defined(OS_ANDROID)
 extern const base::Feature kClearOldBrowsingData;
 #endif
@@ -125,6 +123,11 @@
 extern const base::Feature kExpectCTReporting;
 
 extern const base::Feature kExperimentalAppBanners;
+
+#if defined(OS_CHROMEOS)
+extern const base::Feature kExperimentalCrostiniUI;
+#endif
+
 extern const base::Feature kExperimentalKeyboardLockUI;
 
 // Android expects this string from Java code, so it is always needed.
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 85f943e..ceb04ee 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1674,6 +1674,12 @@
 // Boolean that specifies whether the built-in asynchronous DNS client is used.
 const char kBuiltInDnsClientEnabled[] = "async_dns.enabled";
 
+// String containing list of DNS over HTTPS servers to be used.
+const char kDnsOverHttpsServers[] = "dns_over_https.servers";
+// String contianing list of methods (GET or POST) to use with DNS over HTTPS
+// servers, in the same order of the above pref.
+const char kDnsOverHttpsServerMethods[] = "dns_over_https.methods";
+
 // A pref holding the value of the policy used to explicitly allow or deny
 // access to audio capture devices.  When enabled or not set, the user is
 // prompted for device access.  When disabled, access to audio capture devices
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index a71c273..705e971d 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -685,6 +685,8 @@
 #endif  // defined(OS_POSIX)
 
 extern const char kBuiltInDnsClientEnabled[];
+extern const char kDnsOverHttpsServers[];
+extern const char kDnsOverHttpsServerMethods[];
 
 extern const char kRegisteredProtocolHandlers[];
 extern const char kIgnoredProtocolHandlers[];
diff --git a/chrome/common/profiling/BUILD.gn b/chrome/common/profiling/BUILD.gn
index 43bfe79..2080ad8 100644
--- a/chrome/common/profiling/BUILD.gn
+++ b/chrome/common/profiling/BUILD.gn
@@ -24,8 +24,8 @@
   ]
   deps = [
     "//base",
-    "//base:debugging_flags",
-    "//base/allocator:features",
+    "//base:debugging_buildflags",
+    "//base/allocator:buildflags",
     "//chrome/common:constants",
     "//content/public/common",
     "//mojo/edk/system",
diff --git a/chrome/common/profiling/memlog_allocator_shim.cc b/chrome/common/profiling/memlog_allocator_shim.cc
index a837aca..d957b09 100644
--- a/chrome/common/profiling/memlog_allocator_shim.cc
+++ b/chrome/common/profiling/memlog_allocator_shim.cc
@@ -5,11 +5,11 @@
 #include "chrome/common/profiling/memlog_allocator_shim.h"
 
 #include "base/allocator/allocator_shim.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/atomicops.h"
 #include "base/compiler_specific.h"
-#include "base/debug/debugging_flags.h"
+#include "base/debug/debugging_buildflags.h"
 #include "base/debug/stack_trace.h"
 #include "base/lazy_instance.h"
 #include "base/no_destructor.h"
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn
index cba6e88..cadd440c 100644
--- a/chrome/installer/mini_installer/BUILD.gn
+++ b/chrome/installer/mini_installer/BUILD.gn
@@ -21,9 +21,6 @@
   skip_archive_compression = !is_official_build || is_component_build
 }
 
-assert(skip_archive_compression || !is_component_build,
-       "Archive compression is not supported in component build.")
-
 config("mini_installer_compiler_flags") {
   # Disable buffer security checking.
   cflags = [ "/GS-" ]
diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc
index 2144f12..1f39abbe 100644
--- a/chrome/installer/mini_installer/mini_installer.cc
+++ b/chrome/installer/mini_installer/mini_installer.cc
@@ -460,13 +460,6 @@
   }
 
 #if defined(COMPONENT_BUILD)
-
-#if !defined(SKIP_ARCHIVE_COMPRESSION)
-// Component modules are assumed to always be uncompressed
-// per usage of kBinResourceType.
-#error Unsupported config
-#endif  // defined(SKIP_ARCHIVE_COMPRESSION)
-
   if (exit_code.IsSuccess()) {
     // Extract the modules in component build required by setup.exe.
     if (!::EnumResourceNames(module, kBinResourceType, WriteResourceToDirectory,
diff --git a/chrome/installer/setup/BUILD.gn b/chrome/installer/setup/BUILD.gn
index c8567465..32524d4 100644
--- a/chrome/installer/setup/BUILD.gn
+++ b/chrome/installer/setup/BUILD.gn
@@ -116,7 +116,7 @@
       ":lib",
       "//base",
       "//base:i18n",
-      "//base/allocator:features",
+      "//base/allocator:buildflags",
       "//base/test:test_support",
       "//chrome/install_static:install_static_util",
       "//chrome/install_static/test:test_support",
diff --git a/chrome/installer/setup/memory_unittest.cc b/chrome/installer/setup/memory_unittest.cc
index 9230162..cdb7c45 100644
--- a/chrome/installer/setup/memory_unittest.cc
+++ b/chrome/installer/setup/memory_unittest.cc
@@ -6,7 +6,7 @@
 
 #include <limits>
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/process/memory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/installer/zucchini/buffer_source.cc b/chrome/installer/zucchini/buffer_source.cc
index b688dc4c..09a69ad 100644
--- a/chrome/installer/zucchini/buffer_source.cc
+++ b/chrome/installer/zucchini/buffer_source.cc
@@ -6,6 +6,8 @@
 
 #include <algorithm>
 
+#include "chrome/installer/zucchini/algorithm.h"
+
 namespace zucchini {
 
 BufferSource::BufferSource(ConstBufferView buffer) : ConstBufferView(buffer) {}
@@ -38,4 +40,66 @@
   return true;
 }
 
+// [0aaaaaaa] => 00000000'00000000'00000000'0aaaaaaa
+// [1aaaaaaa 0bbbbbbb] => 00000000'00000000'00bbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 0ccccccc] => 00000000'000ccccc'ccbbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 1ccccccc 0ddddddd] => 0000dddd'dddccccc'ccbbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 1ccccccc 1ddddddd 0???eeee]
+//     => eeeedddd'dddccccc'ccbbbbbb'baaaaaaa
+// Note that "???" is discarded. Meanwhile, 1???eeee is invalid.
+bool BufferSource::GetUleb128(uint32_t* ret) {
+  int shift_lim =
+      static_cast<int>(std::min<size_type>(kMaxLeb128Size, size())) * 7;
+  const_iterator cur = cbegin();
+  uint32_t value = 0U;
+  for (int shift = 0; shift < shift_lim; shift += 7, ++cur) {
+    uint32_t b = *cur;
+    // When |shift == 28|, |(b & 0x7F) << shift| discards the "???" bits.
+    value |= static_cast<uint32_t>(b & 0x7F) << shift;
+    if (!(b & 0x80)) {
+      *ret = value;
+      seek(cur + 1);
+      return true;
+    }
+  }
+  return false;
+}
+
+// [0Saaaaaa] => SSSSSSSS'SSSSSSSS'SSSSSSSS'SSaaaaaa
+// [1aaaaaaa 0Sbbbbbb] => SSSSSSSS'SSSSSSSS'SSSbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 0Scccccc] => SSSSSSSS'SSSScccc'ccbbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 1ccccccc 0Sdddddd] => SSSSSddd'dddccccc'ccbbbbbb'baaaaaaa
+// [1aaaaaaa 1bbbbbbb 1ccccccc 1ddddddd 0???Seee]
+//     => Seeedddd'dddccccc'ccbbbbbb'baaaaaaa
+// Note that "???" is discarded. Meanwhile, 1???eeee is invalid.
+bool BufferSource::GetSleb128(int32_t* ret) {
+  int shift_lim =
+      static_cast<int>(std::min<size_type>(kMaxLeb128Size, size())) * 7;
+  const_iterator cur = cbegin();
+  int32_t value = 0;
+  for (int shift = 0; shift < shift_lim; shift += 7, ++cur) {
+    uint32_t b = *cur;
+    // When |shift == 28|, |(b & 0x7F) << shift| discards the "???" bits.
+    value |= static_cast<int32_t>(b & 0x7F) << shift;
+    if (!(b & 0x80)) {
+      *ret = (shift == 28) ? value : SignExtend(shift + 6, value);
+      seek(cur + 1);
+      return true;
+    }
+  }
+  return false;
+}
+
+bool BufferSource::SkipLeb128() {
+  int lim = static_cast<int>(std::min<size_type>(kMaxLeb128Size, size()));
+  const_iterator cur = cbegin();
+  for (int i = 0; i < lim; ++i, ++cur) {
+    if (!(*cur & 0x80)) {
+      seek(cur + 1);
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_source.h b/chrome/installer/zucchini/buffer_source.h
index 7a460b0..ff594d9 100644
--- a/chrome/installer/zucchini/buffer_source.h
+++ b/chrome/installer/zucchini/buffer_source.h
@@ -23,6 +23,9 @@
 // maintain cursor progress across reads.
 class BufferSource : public ConstBufferView {
  public:
+  // LEB128 info: http://dwarfstd.org/doc/dwarf-2.0.0.pdf , Section 7.6.
+  enum : size_t { kMaxLeb128Size = 5 };
+
   static BufferSource FromRange(const_iterator first, const_iterator last) {
     return BufferSource(ConstBufferView::FromRange(first, last));
   }
@@ -47,7 +50,6 @@
   bool CheckNextValue(const T& value) const {
     static_assert(std::is_integral<T>::value,
                   "Value type must be an integral type");
-
     DCHECK_NE(begin(), nullptr);
     if (Remaining() < sizeof(T))
       return false;
@@ -116,6 +118,20 @@
   // region, and returns true. Otherwise returns false.
   bool GetRegion(size_type size, ConstBufferView* buffer);
 
+  // Reads an Unsigned Little Endian Base 128 (uleb128) int at |first_|. If
+  // successful, writes the result to |value|, advances |first_|, and returns
+  // true. Otherwise returns false.
+  bool GetUleb128(uint32_t* value);
+
+  // Reads a Signed Little Endian Base 128 (sleb128) int at |first_|. If
+  // successful, writes the result to |value|, advances |first_|, and returns
+  // true. Otherwise returns false.
+  bool GetSleb128(int32_t* value);
+
+  // Reads uleb128 / sleb128 at |first_| but discards the result. If successful,
+  // advances |first_| and returns true. Otherwise returns false.
+  bool SkipLeb128();
+
   // Returns the number of bytes remaining from cursor until end.
   size_type Remaining() const { return size(); }
 };
diff --git a/chrome/installer/zucchini/buffer_source_unittest.cc b/chrome/installer/zucchini/buffer_source_unittest.cc
index c88e1e7..c182d77 100644
--- a/chrome/installer/zucchini/buffer_source_unittest.cc
+++ b/chrome/installer/zucchini/buffer_source_unittest.cc
@@ -8,27 +8,28 @@
 #include <stdint.h>
 
 #include <iterator>
+#include <string>
+#include <tuple>
 #include <vector>
 
+#include "chrome/installer/zucchini/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace zucchini {
 
 using vec = std::vector<uint8_t>;
 
-constexpr size_t kLen = 10;
-constexpr uint8_t bytes[kLen] = {0x10, 0x32, 0x54, 0x76, 0x98,
-                                 0xBA, 0xDC, 0xFE, 0x10, 0x00};
-
 class BufferSourceTest : public testing::Test {
  protected:
-  BufferSource source_ = {std::begin(bytes), kLen};
+  std::vector<uint8_t> bytes_ = ParseHexString("10 32 54 76 98 BA DC FE 10 00");
+
+  BufferSource source_ = {bytes_.data(), bytes_.size()};
 };
 
 TEST_F(BufferSourceTest, Skip) {
-  EXPECT_EQ(kLen, source_.Remaining());
+  EXPECT_EQ(bytes_.size(), source_.Remaining());
   source_.Skip(2);
-  EXPECT_EQ(kLen - 2, source_.Remaining());
+  EXPECT_EQ(bytes_.size() - 2, source_.Remaining());
   source_.Skip(10);  // Skipping past end just moves cursor to end.
   EXPECT_EQ(size_t(0), source_.Remaining());
 }
@@ -51,7 +52,7 @@
 
 TEST_F(BufferSourceTest, ConsumeBytes) {
   EXPECT_FALSE(source_.ConsumeBytes({0x10, 0x00}));
-  EXPECT_EQ(kLen, source_.Remaining());
+  EXPECT_EQ(bytes_.size(), source_.Remaining());
   EXPECT_TRUE(source_.ConsumeBytes({0x10, 0x32, 0x54, 0x76}));
   EXPECT_EQ(size_t(6), source_.Remaining());
   EXPECT_TRUE(source_.ConsumeBytes({0x98, 0xBA, 0xDC, 0xFE}));
@@ -109,7 +110,7 @@
 TEST_F(BufferSourceTest, GetRegion) {
   ConstBufferView region;
   EXPECT_TRUE(source_.GetRegion(0, &region));
-  EXPECT_EQ(kLen, source_.Remaining());
+  EXPECT_EQ(bytes_.size(), source_.Remaining());
   EXPECT_TRUE(region.empty());
 
   EXPECT_TRUE(source_.GetRegion(2, &region));
@@ -117,7 +118,7 @@
   EXPECT_EQ(vec({0x10, 0x32}), vec(region.begin(), region.end()));
   EXPECT_EQ(size_t(8), source_.Remaining());
 
-  EXPECT_FALSE(source_.GetRegion(kLen, &region));
+  EXPECT_FALSE(source_.GetRegion(bytes_.size(), &region));
   EXPECT_EQ(size_t(8), source_.Remaining());
   // |region| is left untouched.
   EXPECT_EQ(vec({0x10, 0x32}), vec(region.begin(), region.end()));
@@ -169,4 +170,178 @@
   EXPECT_EQ(size_t(4), source_.Remaining());
 }
 
+TEST_F(BufferSourceTest, GetUleb128) {
+  using size_type = BufferSource::size_type;
+  // Result = {success, value, bytes_consumed}.
+  using Result = std::tuple<bool, uint32_t, size_type>;
+
+  constexpr uint32_t kUnInit = 0xCCCCCCCC;  // Arbitrary value.
+  constexpr Result kBad{false, kUnInit, 0U};
+
+  auto run = [kUnInit](const std::string hex_string) -> Result {
+    std::vector<uint8_t> bytes = ParseHexString(hex_string);
+    BufferSource source(ConstBufferView{bytes.data(), bytes.size()});
+    BufferSource::iterator base = source.begin();
+    // Initialize |value| to |kUnInit| to ensure no write on failure.
+    uint32_t value = kUnInit;
+    bool success = source.GetUleb128(&value);
+    return {success, value, source.begin() - base};
+  };
+
+  auto good = [](uint32_t value, size_type bytes_consumed) -> Result {
+    return Result{true, value, bytes_consumed};
+  };
+
+  EXPECT_EQ(good(0x0U, 1U), run("00"));
+  EXPECT_EQ(good(0x20U, 1U), run("20"));
+  EXPECT_EQ(good(0x42U, 1U), run("42"));
+  EXPECT_EQ(good(0x7FU, 1U), run("7F"));
+  EXPECT_EQ(kBad, run("80"));               // Out of data.
+  EXPECT_EQ(good(0x0U, 2U), run("80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x80U, 2U), run("80 01"));
+  EXPECT_EQ(good(0x7FU, 2U), run("FF 00"));  // Redundant (unsigned).
+  EXPECT_EQ(good(0x3FFFU, 2U), run("FF 7F"));
+  EXPECT_EQ(good(0x0U, 1U), run("00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80"));               // Out of data.
+  EXPECT_EQ(kBad, run("F1 88"));               // Out of data.
+  EXPECT_EQ(good(0x0U, 3U), run("80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x4000U, 3U), run("80 80 01"));
+  EXPECT_EQ(good(0x00100000U, 3U), run("80 80 40"));
+  EXPECT_EQ(good(0x001FFFFFU, 3U), run("FF FF 7F"));
+  EXPECT_EQ(good(0x0U, 1U), run("00 00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80 80"));               // Out of data.
+  EXPECT_EQ(kBad, run("AB CD EF"));               // Out of data.
+  EXPECT_EQ(good(0x0U, 4U), run("80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x00100000U, 4U), run("80 80 C0 00"));
+  EXPECT_EQ(good(0x00200000U, 4U), run("80 80 80 01"));
+  EXPECT_EQ(good(0x08000000U, 4U), run("80 80 80 40"));
+  EXPECT_EQ(good(0x001FC07FU, 4U), run("FF 80 FF 00"));
+  EXPECT_EQ(good(0x0U, 5U), run("80 80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x10000000U, 5U), run("80 80 80 80 01"));
+  EXPECT_EQ(good(0x10204081U, 5U), run("81 81 81 81 01"));
+  EXPECT_EQ(good(0x7FFFFFFFU, 5U), run("FF FF FF FF 07"));
+  EXPECT_EQ(good(0x80000000U, 5U), run("80 80 80 80 08"));
+  EXPECT_EQ(good(0xFFFFFFFFU, 5U), run("FF FF FF FF 0F"));
+  EXPECT_EQ(kBad, run("FF FF FF FF 80"));  // Too long / out of data.
+  EXPECT_EQ(good(0x0FFFFFFFU, 5U), run("FF FF FF FF 10"));  // "1" discarded.
+  EXPECT_EQ(good(0x00000000U, 5U), run("80 80 80 80 20"));  // "2" discarded.
+  EXPECT_EQ(good(0xA54A952AU, 5U), run("AA AA AA AA 7A"));  // "7" discarded.
+  EXPECT_EQ(kBad, run("FF FF FF FF FF 00"));                // Too long.
+}
+
+TEST_F(BufferSourceTest, GetSleb128) {
+  using size_type = BufferSource::size_type;
+  // Result = {success, value, bytes_consumed}.
+  using Result = std::tuple<bool, int32_t, size_type>;
+
+  constexpr int32_t kUnInit = 0xCCCCCCCC;  // Arbitrary value.
+  constexpr Result kBad{false, kUnInit, 0U};
+
+  auto run = [kUnInit](const std::string hex_string) -> Result {
+    std::vector<uint8_t> bytes = ParseHexString(hex_string);
+    BufferSource source(ConstBufferView{bytes.data(), bytes.size()});
+    BufferSource::iterator base = source.begin();
+    // Initialize |value| to |kUnInit| to ensure no write on failure.
+    int32_t value = kUnInit;
+    bool success = source.GetSleb128(&value);
+    return {success, value, source.begin() - base};
+  };
+
+  auto good = [](int32_t value, size_type bytes_consumed) -> Result {
+    return Result{true, value, bytes_consumed};
+  };
+
+  EXPECT_EQ(good(0x0, 1U), run("00"));
+  EXPECT_EQ(good(0x20U, 1U), run("20"));
+  EXPECT_EQ(good(-0x3E, 1U), run("42"));
+  EXPECT_EQ(good(-0x1, 1U), run("7F"));
+  EXPECT_EQ(kBad, run("80"));              // Out of data.
+  EXPECT_EQ(good(0x0, 2U), run("80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x80, 2U), run("80 01"));
+  EXPECT_EQ(good(0x7F, 2U), run("FF 00"));    // Not redudnant.
+  EXPECT_EQ(good(-0x1, 2U), run("FF 7F"));    // Redundant code.
+  EXPECT_EQ(good(0x0, 1U), run("00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80"));              // Out of data.
+  EXPECT_EQ(kBad, run("F1 88"));              // Out of data.
+  EXPECT_EQ(good(0x0, 3U), run("80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x4000, 3U), run("80 80 01"));
+  EXPECT_EQ(good(-0x100000, 3U), run("80 80 40"));
+  EXPECT_EQ(good(-0x1, 3U), run("FF FF 7F"));    // Redundant code.
+  EXPECT_EQ(good(0x0, 1U), run("00 00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80 80"));              // Out of data.
+  EXPECT_EQ(kBad, run("AB CD EF"));              // Out of data.
+  EXPECT_EQ(good(0x0, 4U), run("80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x00100000, 4U), run("80 80 C0 00"));
+  EXPECT_EQ(good(0x00200000, 4U), run("80 80 80 01"));
+  EXPECT_EQ(good(-static_cast<int32_t>(0x08000000), 4U), run("80 80 80 40"));
+  EXPECT_EQ(good(0x001FC07F, 4U), run("FF 80 FF 00"));
+  EXPECT_EQ(good(0x0, 5U), run("80 80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(0x10000000, 5U), run("80 80 80 80 01"));
+  EXPECT_EQ(good(0x10204081, 5U), run("81 81 81 81 01"));
+  EXPECT_EQ(good(0x7FFFFFFF, 5U), run("FF FF FF FF 07"));
+  EXPECT_EQ(good(-static_cast<int32_t>(0x80000000), 5U), run("80 80 80 80 08"));
+  EXPECT_EQ(good(-0x1, 5U), run("FF FF FF FF 0F"));  // Redundant code.
+  EXPECT_EQ(kBad, run("FF FF FF FF 80"));            // Too long / out of data.
+  EXPECT_EQ(good(0x0FFFFFFF, 5U), run("FF FF FF FF 10"));   // "1" discarded.
+  EXPECT_EQ(good(0x00000000, 5U), run("80 80 80 80 20"));   // "2" discarded.
+  EXPECT_EQ(good(-0x5AB56AD6, 5U), run("AA AA AA AA 7A"));  // "7" discarded.
+  EXPECT_EQ(kBad, run("FF FF FF FF FF 00"));                // Too long.
+}
+
+TEST_F(BufferSourceTest, SkipLeb128) {
+  using size_type = BufferSource::size_type;
+  // Result = {success, value, bytes_consumed}.
+  using Result = std::tuple<bool, size_type>;
+
+  constexpr Result kBad{false, 0U};
+
+  auto run = [](const std::string hex_string) -> Result {
+    std::vector<uint8_t> bytes = ParseHexString(hex_string);
+    BufferSource source(ConstBufferView{bytes.data(), bytes.size()});
+    BufferSource::iterator base = source.begin();
+    bool success = source.SkipLeb128();
+    return {success, source.begin() - base};
+  };
+
+  auto good = [](size_type bytes_consumed) -> Result {
+    return Result{true, bytes_consumed};
+  };
+
+  EXPECT_EQ(good(1U), run("00"));
+  EXPECT_EQ(good(1U), run("20"));
+  EXPECT_EQ(good(1U), run("42"));
+  EXPECT_EQ(good(1U), run("7F"));
+  EXPECT_EQ(kBad, run("80"));         // Out of data.
+  EXPECT_EQ(good(2U), run("80 00"));  // Redundant code.
+  EXPECT_EQ(good(2U), run("80 01"));
+  EXPECT_EQ(good(2U), run("FF 00"));  // Redundant (unsigned).
+  EXPECT_EQ(good(2U), run("FF 7F"));
+  EXPECT_EQ(good(1U), run("00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80"));         // Out of data.
+  EXPECT_EQ(kBad, run("F1 88"));         // Out of data.
+  EXPECT_EQ(good(3U), run("80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(3U), run("80 80 01"));
+  EXPECT_EQ(good(3U), run("80 80 40"));
+  EXPECT_EQ(good(3U), run("FF FF 7F"));
+  EXPECT_EQ(good(1U), run("00 00 80"));     // Only reads byte 0.
+  EXPECT_EQ(kBad, run("80 80 80"));         // Out of data.
+  EXPECT_EQ(kBad, run("AB CD EF"));         // Out of data.
+  EXPECT_EQ(good(4U), run("80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(4U), run("80 80 C0 00"));
+  EXPECT_EQ(good(4U), run("80 80 80 01"));
+  EXPECT_EQ(good(4U), run("80 80 80 40"));
+  EXPECT_EQ(good(4U), run("FF 80 FF 00"));
+  EXPECT_EQ(good(5U), run("80 80 80 80 00"));  // Redundant code.
+  EXPECT_EQ(good(5U), run("80 80 80 80 01"));
+  EXPECT_EQ(good(5U), run("81 81 81 81 01"));
+  EXPECT_EQ(good(5U), run("FF FF FF FF 07"));
+  EXPECT_EQ(good(5U), run("80 80 80 80 08"));
+  EXPECT_EQ(good(5U), run("FF FF FF FF 0F"));
+  EXPECT_EQ(kBad, run("FF FF FF FF 80"));      // Too long / out of data.
+  EXPECT_EQ(good(5U), run("FF FF FF FF 10"));  // "1" discarded.
+  EXPECT_EQ(good(5U), run("80 80 80 80 20"));  // "2" discarded.
+  EXPECT_EQ(good(5U), run("AA AA AA AA 7A"));  // "7" discarded.
+  EXPECT_EQ(kBad, run("FF FF FF FF FF 00"));   // Too long.
+}
+
 }  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_view.h b/chrome/installer/zucchini/buffer_view.h
index 9e903a05..c5e0edb 100644
--- a/chrome/installer/zucchini/buffer_view.h
+++ b/chrome/installer/zucchini/buffer_view.h
@@ -160,11 +160,27 @@
     first_ += n;
   }
 
-  // Moves the start of the view to |pos| which is in range [begin(), end()).
-  void seek(iterator pos) {
-    DCHECK_GE(pos, begin());
-    DCHECK_LE(pos, end());
-    first_ = pos;
+  // Moves the start of the view to |it|, which is in range [begin(), end()).
+  void seek(iterator it) {
+    DCHECK_GE(it, begin());
+    DCHECK_LE(it, end());
+    first_ = it;
+  }
+
+  // Given |origin| that contains |*this|, minimally increase |first_| (possibly
+  // by 0) so that |first_ <= last_|, and |first_ - origin.first_| is a multiple
+  // of |alignment|. On success, updates |first_| and returns true. Otherwise
+  // returns false.
+  bool AlignOn(BufferViewBase origin, size_type alignment) {
+    DCHECK_GT(alignment, 0U);
+    DCHECK_LE(origin.first_, first_);
+    DCHECK_GE(origin.last_, last_);
+    size_type aligned_size =
+        ceil(static_cast<size_type>(first_ - origin.first_), alignment);
+    if (aligned_size > static_cast<size_type>(last_ - origin.first_))
+      return false;
+    first_ = origin.first_ + aligned_size;
+    return true;
   }
 
  private:
diff --git a/chrome/installer/zucchini/buffer_view_unittest.cc b/chrome/installer/zucchini/buffer_view_unittest.cc
index c2e30deb..0fb070c 100644
--- a/chrome/installer/zucchini/buffer_view_unittest.cc
+++ b/chrome/installer/zucchini/buffer_view_unittest.cc
@@ -12,66 +12,72 @@
 #include <vector>
 
 #include "base/test/gtest_util.h"
+#include "chrome/installer/zucchini/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace zucchini {
 
 class BufferViewTest : public testing::Test {
  protected:
-  enum : size_t { kLen = 10 };
-
   // Some tests might modify this.
-  uint8_t bytes_[kLen] = {0x10, 0x32, 0x54, 0x76, 0x98,
-                          0xBA, 0xDC, 0xFE, 0x10, 0x00};
+  std::vector<uint8_t> bytes_ = ParseHexString("10 32 54 76 98 BA DC FE 10 00");
 };
 
 TEST_F(BufferViewTest, Size) {
-  for (size_t len = 0; len <= kLen; ++len) {
-    EXPECT_EQ(len, ConstBufferView(std::begin(bytes_), len).size());
-    EXPECT_EQ(len, MutableBufferView(std::begin(bytes_), len).size());
+  for (size_t len = 0; len <= bytes_.size(); ++len) {
+    EXPECT_EQ(len, ConstBufferView(bytes_.data(), len).size());
+    EXPECT_EQ(len, MutableBufferView(bytes_.data(), len).size());
   }
 }
 
 TEST_F(BufferViewTest, Empty) {
   // Empty view.
-  EXPECT_TRUE(ConstBufferView(std::begin(bytes_), 0).empty());
-  EXPECT_TRUE(MutableBufferView(std::begin(bytes_), 0).empty());
+  EXPECT_TRUE(ConstBufferView(bytes_.data(), 0).empty());
+  EXPECT_TRUE(MutableBufferView(bytes_.data(), 0).empty());
 
-  for (size_t len = 1; len <= kLen; ++len) {
-    EXPECT_FALSE(ConstBufferView(std::begin(bytes_), len).empty());
-    EXPECT_FALSE(MutableBufferView(std::begin(bytes_), len).empty());
+  for (size_t len = 1; len <= bytes_.size(); ++len) {
+    EXPECT_FALSE(ConstBufferView(bytes_.data(), len).empty());
+    EXPECT_FALSE(MutableBufferView(bytes_.data(), len).empty());
   }
 }
 
 TEST_F(BufferViewTest, FromRange) {
+  constexpr size_t kSize = 10;
+  uint8_t raw_data[kSize] = {0x10, 0x32, 0x54, 0x76, 0x98,
+                             0xBA, 0xDC, 0xFE, 0x10, 0x00};
   ConstBufferView buffer =
-      ConstBufferView::FromRange(std::begin(bytes_), std::end(bytes_));
-  EXPECT_EQ(kLen, buffer.size());
-  EXPECT_EQ(std::begin(bytes_), buffer.begin());
+      ConstBufferView::FromRange(std::begin(raw_data), std::end(raw_data));
+  EXPECT_EQ(bytes_.size(), buffer.size());
+  EXPECT_EQ(std::begin(raw_data), buffer.begin());
+
+  MutableBufferView mutable_buffer =
+      MutableBufferView::FromRange(std::begin(raw_data), std::end(raw_data));
+  EXPECT_EQ(bytes_.size(), mutable_buffer.size());
+  EXPECT_EQ(std::begin(raw_data), mutable_buffer.begin());
 
   EXPECT_DCHECK_DEATH(
-      ConstBufferView::FromRange(std::end(bytes_), std::begin(bytes_)));
+      ConstBufferView::FromRange(std::end(raw_data), std::begin(raw_data)));
 
-  EXPECT_DCHECK_DEATH(
-      ConstBufferView::FromRange(std::begin(bytes_) + 1, std::begin(bytes_)));
+  EXPECT_DCHECK_DEATH(MutableBufferView::FromRange(std::begin(raw_data) + 1,
+                                                   std::begin(raw_data)));
 }
 
 TEST_F(BufferViewTest, Subscript) {
-  ConstBufferView view(std::begin(bytes_), kLen);
+  ConstBufferView view(bytes_.data(), bytes_.size());
 
   EXPECT_EQ(0x10, view[0]);
   static_assert(!std::is_assignable<decltype(view[0]), uint8_t>::value,
                 "BufferView values should not be mutable.");
 
-  MutableBufferView mutable_view(std::begin(bytes_), kLen);
+  MutableBufferView mutable_view(bytes_.data(), bytes_.size());
 
-  EXPECT_EQ(&bytes_[0], &mutable_view[0]);
+  EXPECT_EQ(bytes_.data(), &mutable_view[0]);
   mutable_view[0] = 42;
   EXPECT_EQ(42, mutable_view[0]);
 }
 
 TEST_F(BufferViewTest, SubRegion) {
-  ConstBufferView view(std::begin(bytes_), kLen);
+  ConstBufferView view(bytes_.data(), bytes_.size());
 
   ConstBufferView sub_view = view[{2, 4}];
   EXPECT_EQ(view.begin() + 2, sub_view.begin());
@@ -79,19 +85,17 @@
 }
 
 TEST_F(BufferViewTest, Shrink) {
-  ConstBufferView buffer =
-      ConstBufferView::FromRange(std::begin(bytes_), std::end(bytes_));
+  ConstBufferView buffer(bytes_.data(), bytes_.size());
 
-  buffer.shrink(kLen);
-  EXPECT_EQ(kLen, buffer.size());
+  buffer.shrink(bytes_.size());
+  EXPECT_EQ(bytes_.size(), buffer.size());
   buffer.shrink(2);
   EXPECT_EQ(size_t(2), buffer.size());
-  EXPECT_DCHECK_DEATH(buffer.shrink(kLen));
+  EXPECT_DCHECK_DEATH(buffer.shrink(bytes_.size()));
 }
 
 TEST_F(BufferViewTest, Read) {
-  ConstBufferView buffer =
-      ConstBufferView::FromRange(std::begin(bytes_), std::end(bytes_));
+  ConstBufferView buffer(bytes_.data(), bytes_.size());
 
   EXPECT_EQ(0x10U, buffer.read<uint8_t>(0));
   EXPECT_EQ(0x54U, buffer.read<uint8_t>(2));
@@ -112,13 +116,11 @@
 }
 
 TEST_F(BufferViewTest, Write) {
-  MutableBufferView buffer =
-      MutableBufferView::FromRange(std::begin(bytes_), std::end(bytes_));
+  MutableBufferView buffer(bytes_.data(), bytes_.size());
 
   buffer.write<uint32_t>(0, 0x01234567);
   buffer.write<uint32_t>(4, 0x89ABCDEF);
-  EXPECT_EQ(std::vector<uint8_t>(
-                {0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, 0x89, 0x10, 0x00}),
+  EXPECT_EQ(ParseHexString("67 45 23 01 EF CD AB 89 10 00"),
             std::vector<uint8_t>(buffer.begin(), buffer.end()));
 
   buffer.write<uint8_t>(9, 0xFF);
@@ -129,8 +131,7 @@
 }
 
 TEST_F(BufferViewTest, CanAccess) {
-  MutableBufferView buffer =
-      MutableBufferView::FromRange(std::begin(bytes_), std::end(bytes_));
+  MutableBufferView buffer(bytes_.data(), bytes_.size());
   EXPECT_TRUE(buffer.can_access<uint32_t>(0));
   EXPECT_TRUE(buffer.can_access<uint32_t>(6));
   EXPECT_FALSE(buffer.can_access<uint32_t>(7));
@@ -145,30 +146,30 @@
 }
 
 TEST_F(BufferViewTest, LocalRegion) {
-  ConstBufferView view(std::begin(bytes_), kLen);
+  ConstBufferView view(bytes_.data(), bytes_.size());
 
   BufferRegion region = view.local_region();
   EXPECT_EQ(0U, region.offset);
-  EXPECT_EQ(kLen, region.size);
+  EXPECT_EQ(bytes_.size(), region.size);
 }
 
 TEST_F(BufferViewTest, Covers) {
   EXPECT_FALSE(ConstBufferView().covers({0, 0}));
   EXPECT_FALSE(ConstBufferView().covers({0, 1}));
 
-  ConstBufferView view(std::begin(bytes_), kLen);
+  ConstBufferView view(bytes_.data(), bytes_.size());
 
   EXPECT_TRUE(view.covers({0, 0}));
   EXPECT_TRUE(view.covers({0, 1}));
-  EXPECT_TRUE(view.covers({0, kLen}));
-  EXPECT_FALSE(view.covers({0, kLen + 1}));
-  EXPECT_FALSE(view.covers({1, kLen}));
+  EXPECT_TRUE(view.covers({0, bytes_.size()}));
+  EXPECT_FALSE(view.covers({0, bytes_.size() + 1}));
+  EXPECT_FALSE(view.covers({1, bytes_.size()}));
 
-  EXPECT_TRUE(view.covers({kLen - 1, 0}));
-  EXPECT_TRUE(view.covers({kLen - 1, 1}));
-  EXPECT_FALSE(view.covers({kLen - 1, 2}));
-  EXPECT_FALSE(view.covers({kLen, 0}));
-  EXPECT_FALSE(view.covers({kLen, 1}));
+  EXPECT_TRUE(view.covers({bytes_.size() - 1, 0}));
+  EXPECT_TRUE(view.covers({bytes_.size() - 1, 1}));
+  EXPECT_FALSE(view.covers({bytes_.size() - 1, 2}));
+  EXPECT_FALSE(view.covers({bytes_.size(), 0}));
+  EXPECT_FALSE(view.covers({bytes_.size(), 1}));
 
   EXPECT_FALSE(view.covers({1, size_t(-1)}));
   EXPECT_FALSE(view.covers({size_t(-1), 1}));
@@ -176,11 +177,10 @@
 }
 
 TEST_F(BufferViewTest, Equals) {
-  // Almost identical to |bytes_|, except at [5] and [6].
-  uint8_t bytes2[kLen] = {0x10, 0x32, 0x54, 0x76, 0x98,
-                          0xAB, 0xCD, 0xFE, 0x10, 0x00};
-  ConstBufferView view1(std::begin(bytes_), kLen);
-  ConstBufferView view2(std::begin(bytes2), kLen);
+  // Almost identical to |bytes_|, except at 2 places:         v  v
+  std::vector<uint8_t> bytes2 = ParseHexString("10 32 54 76 98 AB CD FE 10 00");
+  ConstBufferView view1(bytes_.data(), bytes_.size());
+  ConstBufferView view2(&bytes2[0], bytes2.size());
 
   EXPECT_TRUE(view1.equals(view1));
   EXPECT_TRUE(view2.equals(view2));
@@ -198,4 +198,45 @@
   EXPECT_FALSE((view2[{1, 1}]).equals(view2[{8, 1}]));
 }
 
+TEST_F(BufferViewTest, AlignOn) {
+  using size_type = ConstBufferView::size_type;
+  ConstBufferView image(bytes_.data(), bytes_.size());
+  ConstBufferView view = image;
+  ASSERT_EQ(10U, view.size());
+
+  auto get_pos = [&image, &view]() -> size_type {
+    EXPECT_TRUE(view.begin() >= image.begin());  // Iterator compare.
+    return static_cast<size_type>(view.begin() - image.begin());
+  };
+
+  EXPECT_EQ(0U, get_pos());
+  view.remove_prefix(1U);
+  EXPECT_EQ(1U, get_pos());
+  view.remove_prefix(4U);
+  EXPECT_EQ(5U, get_pos());
+
+  // Align.
+  EXPECT_TRUE(view.AlignOn(image, 1U));  // Trival case.
+  EXPECT_EQ(5U, get_pos());
+
+  EXPECT_TRUE(view.AlignOn(image, 2U));
+  EXPECT_EQ(6U, get_pos());
+  EXPECT_TRUE(view.AlignOn(image, 2U));
+  EXPECT_EQ(6U, get_pos());
+
+  EXPECT_TRUE(view.AlignOn(image, 4U));
+  EXPECT_EQ(8U, get_pos());
+  EXPECT_TRUE(view.AlignOn(image, 2U));
+  EXPECT_EQ(8U, get_pos());
+
+  view.remove_prefix(1U);
+  EXPECT_EQ(9U, get_pos());
+
+  // Pos is at 9, align to 4 would yield 12, but size is 10, so this fails.
+  EXPECT_FALSE(view.AlignOn(image, 4U));
+  EXPECT_EQ(9U, get_pos());
+  EXPECT_TRUE(view.AlignOn(image, 2U));
+  EXPECT_EQ(10U, get_pos());
+}
+
 }  // namespace zucchini
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 3c0643f..3143511 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -61,7 +61,6 @@
 #include "chrome/renderer/prerender/prerender_dispatcher.h"
 #include "chrome/renderer/prerender/prerender_helper.h"
 #include "chrome/renderer/prerender/prerenderer_client.h"
-#include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
 #include "chrome/renderer/tts_dispatcher.h"
 #include "chrome/renderer/url_loader_throttle_provider_impl.h"
 #include "chrome/renderer/worker_content_settings_client.h"
@@ -146,6 +145,10 @@
 #include "chrome/renderer/searchbox/searchbox_extension.h"
 #endif
 
+#if defined(FULL_SAFE_BROWSING)
+#include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
+#endif
+
 #if BUILDFLAG(ENABLE_NACL)
 #include "components/nacl/common/nacl_constants.h"
 #include "components/nacl/renderer/nacl_helper.h"
@@ -423,7 +426,8 @@
     InitSpellCheck();
 #endif
 #if defined(FULL_SAFE_BROWSING)
-  phishing_classifier_.reset(safe_browsing::PhishingClassifierFilter::Create());
+  registry_.AddInterface(
+      base::BindRepeating(&safe_browsing::PhishingClassifierFilter::Create));
 #endif
   prerender_dispatcher_.reset(new prerender::PrerenderDispatcher());
   subresource_filter_ruleset_dealer_.reset(
@@ -434,9 +438,6 @@
 #endif
 
   thread->AddObserver(chrome_observer_.get());
-#if defined(FULL_SAFE_BROWSING)
-  thread->AddObserver(phishing_classifier_.get());
-#endif
   thread->AddObserver(prerender_dispatcher_.get());
   thread->AddObserver(subresource_filter_ruleset_dealer_.get());
 
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 964c03b..00301234 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -74,10 +74,6 @@
 class PrerenderDispatcher;
 }
 
-namespace safe_browsing {
-class PhishingClassifierFilter;
-}
-
 namespace subresource_filter {
 class UnverifiedRulesetDealer;
 }
@@ -314,7 +310,6 @@
 #if BUILDFLAG(ENABLE_SPELLCHECK)
   std::unique_ptr<SpellCheck> spellcheck_;
 #endif
-  std::unique_ptr<safe_browsing::PhishingClassifierFilter> phishing_classifier_;
   std::unique_ptr<subresource_filter::UnverifiedRulesetDealer>
       subresource_filter_ruleset_dealer_;
   std::unique_ptr<prerender::PrerenderDispatcher> prerender_dispatcher_;
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc
index e24414b..18498c0 100644
--- a/chrome/renderer/chrome_render_frame_observer.cc
+++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -24,7 +24,6 @@
 #include "chrome/common/prerender_messages.h"
 #include "chrome/common/render_messages.h"
 #include "chrome/renderer/prerender/prerender_helper.h"
-#include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
 #include "chrome/renderer/web_apps.h"
 #include "components/crash/core/common/crash_key.h"
 #include "components/translate/content/renderer/translate_helper.h"
@@ -58,6 +57,10 @@
 #include "chrome/renderer/searchbox/searchbox_extension.h"
 #endif  // !defined(OS_ANDROID)
 
+#if defined(FULL_SAFE_BROWSING)
+#include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
+#endif
+
 #if BUILDFLAG(ENABLE_PRINTING)
 #include "components/printing/common/print_messages.h"
 #include "components/printing/renderer/print_render_frame_helper.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
index 61406c8..f9cae4e 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
@@ -15,12 +15,12 @@
 #include "chrome/renderer/safe_browsing/feature_extractor_clock.h"
 #include "chrome/renderer/safe_browsing/phishing_classifier.h"
 #include "chrome/renderer/safe_browsing/scorer.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/document_state.h"
 #include "content/public/renderer/navigation_state.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/WebKit/public/platform/WebURL.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
@@ -46,28 +46,17 @@
     DestructorAtExit g_phishing_scorer = LAZY_INSTANCE_INITIALIZER;
 
 // static
-PhishingClassifierFilter* PhishingClassifierFilter::Create() {
-  // Private constructor and public static Create() method to facilitate
-  // stubbing out this class for binary-size reduction purposes.
-  return new PhishingClassifierFilter();
+void PhishingClassifierFilter::Create(
+    mojom::PhishingModelSetterRequest request) {
+  mojo::MakeStrongBinding(std::make_unique<PhishingClassifierFilter>(),
+                          std::move(request));
 }
 
-PhishingClassifierFilter::PhishingClassifierFilter()
-    : RenderThreadObserver() {}
+PhishingClassifierFilter::PhishingClassifierFilter() {}
 
 PhishingClassifierFilter::~PhishingClassifierFilter() {}
 
-bool PhishingClassifierFilter::OnControlMessageReceived(
-    const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(PhishingClassifierFilter, message)
-    IPC_MESSAGE_HANDLER(SafeBrowsingMsg_SetPhishingModel, OnSetPhishingModel)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
-void PhishingClassifierFilter::OnSetPhishingModel(const std::string& model) {
+void PhishingClassifierFilter::SetPhishingModel(const std::string& model) {
   safe_browsing::Scorer* scorer = NULL;
   // An empty model string means we should disable client-side phishing
   // detection.
@@ -111,6 +100,10 @@
 
   if (g_phishing_scorer.Get().get())
     SetPhishingScorer(g_phishing_scorer.Get().get());
+
+  registry_.AddInterface(
+      base::BindRepeating(&PhishingClassifierDelegate::PhishingDetectorRequest,
+                          base::Unretained(this)));
 }
 
 PhishingClassifierDelegate::~PhishingClassifierDelegate() {
@@ -135,7 +128,18 @@
   MaybeStartClassification();
 }
 
-void PhishingClassifierDelegate::OnStartPhishingDetection(const GURL& url) {
+void PhishingClassifierDelegate::PhishingDetectorRequest(
+    mojom::PhishingDetectorRequest request) {
+  phishing_detector_bindings_.AddBinding(this, std::move(request));
+}
+
+void PhishingClassifierDelegate::OnInterfaceRequestForFrame(
+    const std::string& interface_name,
+    mojo::ScopedMessagePipeHandle* interface_pipe) {
+  registry_.TryBindInterface(interface_name, interface_pipe);
+}
+
+void PhishingClassifierDelegate::StartPhishingDetection(const GURL& url) {
   last_url_received_from_browser_ = StripRef(url);
   // Start classifying the current page if all conditions are met.
   // See MaybeStartClassification() for details.
@@ -198,17 +202,6 @@
   have_page_text_ = false;
 }
 
-bool PhishingClassifierDelegate::OnMessageReceived(
-    const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(PhishingClassifierDelegate, message)
-    IPC_MESSAGE_HANDLER(SafeBrowsingMsg_StartPhishingDetection,
-                        OnStartPhishingDetection)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
 void PhishingClassifierDelegate::ClassificationDone(
     const ClientPhishingRequest& verdict) {
   // We no longer need the page text.
@@ -217,8 +210,9 @@
            << " score = " << verdict.client_score();
   if (verdict.client_score() != PhishingClassifier::kInvalidScore) {
     DCHECK_EQ(last_url_sent_to_classifier_.spec(), verdict.url());
-    RenderThread::Get()->Send(new SafeBrowsingHostMsg_PhishingDetectionDone(
-        routing_id(), verdict.SerializeAsString()));
+    safe_browsing::mojom::PhishingDetectorClientPtr phishing_detector;
+    render_frame()->GetRemoteInterfaces()->GetInterface(&phishing_detector);
+    phishing_detector->PhishingDetectionDone(verdict.SerializeAsString());
   }
 }
 
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate.h b/chrome/renderer/safe_browsing/phishing_classifier_delegate.h
index 7c711d8..f598c2c 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_delegate.h
+++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate.h
@@ -11,8 +11,12 @@
 
 #include "base/macros.h"
 #include "base/strings/string16.h"
+#include "components/safe_browsing/common/safe_browsing.mojom.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/public/renderer/render_thread_observer.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
 
@@ -21,21 +25,24 @@
 class PhishingClassifier;
 class Scorer;
 
-class PhishingClassifierFilter : public content::RenderThreadObserver {
+class PhishingClassifierFilter : public mojom::PhishingModelSetter {
  public:
-  static PhishingClassifierFilter* Create();
+  PhishingClassifierFilter();
   ~PhishingClassifierFilter() override;
 
-  bool OnControlMessageReceived(const IPC::Message& message) override;
+  static void Create(mojom::PhishingModelSetterRequest request);
 
  private:
-  PhishingClassifierFilter();
-  void OnSetPhishingModel(const std::string& model);
+  // mojom::PhishingModelSetter
+  void SetPhishingModel(const std::string& model) override;
+
+  mojo::StrongBindingPtr<mojom::PhishingModelSetter> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(PhishingClassifierFilter);
 };
 
-class PhishingClassifierDelegate : public content::RenderFrameObserver {
+class PhishingClassifierDelegate : public content::RenderFrameObserver,
+                                   public mojom::PhishingDetector {
  public:
   // The RenderFrame owns us.  This object takes ownership of the classifier.
   // Note that if classifier is null, a default instance of PhishingClassifier
@@ -79,19 +86,24 @@
     CANCEL_CLASSIFICATION_MAX  // Always add new values before this one.
   };
 
+  void PhishingDetectorRequest(mojom::PhishingDetectorRequest request);
+
   // Cancels any pending classification and frees the page text.
   void CancelPendingClassification(CancelClassificationReason reason);
 
-  // RenderFrameObserver implementation.
-  bool OnMessageReceived(const IPC::Message& message) override;
   void OnDestruct() override;
 
+  void OnInterfaceRequestForFrame(
+      const std::string& interface_name,
+      mojo::ScopedMessagePipeHandle* interface_pipe) override;
+
+  // mojom::PhishingDetector
   // Called by the RenderFrame when it receives a StartPhishingDetection IPC
   // from the browser.  This signals that it is ok to begin classification
   // for the given toplevel URL.  If the URL has been fully loaded into the
   // RenderFrame and a Scorer has been set, this will begin classification,
   // otherwise classification will be deferred until these conditions are met.
-  void OnStartPhishingDetection(const GURL& url);
+  void StartPhishingDetection(const GURL& url) override;
 
   // Called when classification for the current page finishes.
   void ClassificationDone(const ClientPhishingRequest& verdict);
@@ -137,6 +149,10 @@
   // Set to true if the classifier is currently running.
   bool is_classifying_;
 
+  mojo::BindingSet<mojom::PhishingDetector> phishing_detector_bindings_;
+
+  service_manager::BinderRegistry registry_;
+
   DISALLOW_COPY_AND_ASSIGN(PhishingClassifierDelegate);
 };
 
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
index 552a4a1..cac95bc1 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
@@ -12,10 +12,11 @@
 #include "chrome/renderer/safe_browsing/scorer.h"
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "chrome/test/base/chrome_unit_test_suite.h"
-#include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_view.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/WebKit/public/platform/WebURL.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
@@ -59,52 +60,58 @@
 };
 }  // namespace
 
-class FakeRenderThread : public ChromeMockRenderThread {
+class FakePhishingDetectorClient : public mojom::PhishingDetectorClient {
  public:
-  // Instead of sending this message, we verify its content here.
-  bool Send(IPC::Message* msg) override {
-    // handle and verify message here.
-    IPC_BEGIN_MESSAGE_MAP(FakeRenderThread, *msg)
-      IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_PhishingDetectionDone,
-                          VerifyMessageContent)
-    IPC_END_MESSAGE_MAP()
-    if (msg) {  // Prevent memory leak.
-      delete msg;
-      msg = nullptr;
-    }
-    // Return true anyway, since we don't want to block other IPC.
-    return true;
+  FakePhishingDetectorClient() = default;
+
+  ~FakePhishingDetectorClient() override = default;
+
+  void BindRequest(mojom::PhishingDetectorClientRequest request) {
+    bindings_.AddBinding(this, std::move(request));
   }
 
-  void VerifyMessageContent(const std::string& verdict_str) {
+  // mojom::PhishingDetectorClient
+  void PhishingDetectionDone(const std::string& request_proto) override {
     ClientPhishingRequest verdict;
-    if (verdict.ParseFromString(verdict_str)) {
-      EXPECT_EQ("http://host.com/", verdict.url());
-      EXPECT_EQ(0.8f, verdict.client_score());
-      EXPECT_FALSE(verdict.is_phishing());
-    } else {
-      NOTREACHED() << "Cannot parse IPC content. Test failed.";
-    }
+    ASSERT_TRUE(verdict.ParseFromString(request_proto));
+    EXPECT_EQ("http://host.com/", verdict.url());
+    EXPECT_EQ(0.8f, verdict.client_score());
+    EXPECT_FALSE(verdict.is_phishing());
   }
+
+ private:
+  mojo::BindingSet<mojom::PhishingDetectorClient> bindings_;
+  DISALLOW_COPY_AND_ASSIGN(FakePhishingDetectorClient);
 };
 
 class PhishingClassifierDelegateTest : public ChromeRenderViewTest {
  protected:
   void SetUp() override {
-    ChromeUnitTestSuite::InitializeProviders();
-    ChromeUnitTestSuite::InitializeResourceBundle();
-
-    // Plug-in FakeRenderThread.
-    chrome_render_thread_ = new FakeRenderThread();
-    render_thread_.reset(chrome_render_thread_);
-
-    content::RenderViewTest::SetUp();
+    ChromeRenderViewTest::SetUp();
 
     content::RenderFrame* render_frame = view_->GetMainRenderFrame();
     classifier_ = new StrictMock<MockPhishingClassifier>(render_frame);
     delegate_ = PhishingClassifierDelegate::Create(render_frame, classifier_);
   }
 
+  void TearDown() override { ChromeRenderViewTest::TearDown(); }
+
+  void RegisterMainFrameRemoteInterfaces() override {
+    service_manager::InterfaceProvider* remote_interfaces =
+        view_->GetMainRenderFrame()->GetRemoteInterfaces();
+    service_manager::InterfaceProvider::TestApi test_api(remote_interfaces);
+    test_api.SetBinderForName(
+        mojom::PhishingDetectorClient::Name_,
+        base::BindRepeating(
+            &PhishingClassifierDelegateTest::BindPhishingDetectorClient,
+            base::Unretained(this)));
+  }
+
+  void BindPhishingDetectorClient(mojo::ScopedMessagePipeHandle handle) {
+    fake_phishing_client_.BindRequest(
+        mojom::PhishingDetectorClientRequest(std::move(handle)));
+  }
+
   // Runs the ClassificationDone callback, then verify if message sent
   // by FakeRenderThread is correct.
   void RunAndVerifyClassificationDone(const ClientPhishingRequest& verdict) {
@@ -112,7 +119,7 @@
   }
 
   void OnStartPhishingDetection(const GURL& url) {
-    delegate_->OnStartPhishingDetection(url);
+    delegate_->StartPhishingDetection(url);
   }
 
   void PageCaptured(base::string16* page_text,
@@ -140,6 +147,7 @@
 
   StrictMock<MockPhishingClassifier>* classifier_;  // Owned by |delegate_|.
   PhishingClassifierDelegate* delegate_;            // Owned by the RenderFrame.
+  FakePhishingDetectorClient fake_phishing_client_;
 };
 
 TEST_F(PhishingClassifierDelegateTest, Navigation) {
diff --git a/chrome/service/service_process.cc b/chrome/service/service_process.cc
index 0b2e540..7dceddf 100644
--- a/chrome/service/service_process.cc
+++ b/chrome/service/service_process.cc
@@ -26,7 +26,6 @@
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/scheduler_worker_pool_params.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -156,7 +155,7 @@
   main_message_loop_ = message_loop;
   service_process_state_.reset(state);
 
-  // Initialize TaskScheduler and redirect SequencedWorkerPool tasks to it.
+  // Initialize TaskScheduler.
   constexpr int kMaxBackgroundThreads = 1;
   constexpr int kMaxBackgroundBlockingThreads = 1;
   constexpr int kMaxForegroundThreads = 3;
@@ -172,8 +171,6 @@
        {kMaxForegroundBlockingThreads, kSuggestedReclaimTime,
         base::SchedulerBackwardCompatibility::INIT_COM_STA}});
 
-  base::SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess();
-
   // The NetworkChangeNotifier must be created after TaskScheduler because it
   // posts tasks to it.
   network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index f4475b7..10234a5 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/base_switches.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/containers/queue.h"
@@ -325,6 +326,20 @@
 
 bool ServiceUtilityProcessHost::Launch(base::CommandLine* cmd_line,
                                        bool sandbox) {
+  const base::CommandLine& service_command_line =
+      *base::CommandLine::ForCurrentProcess();
+  static const char* const kForwardSwitches[] = {
+      switches::kDisableLogging,
+      switches::kEnableLogging,
+      switches::kIPCConnectionTimeout,
+      switches::kLoggingLevel,
+      switches::kUtilityStartupDialog,
+      switches::kV,
+      switches::kVModule,
+  };
+  cmd_line->CopySwitchesFrom(service_command_line, kForwardSwitches,
+                             arraysize(kForwardSwitches));
+
   mojo::edk::ScopedPlatformHandle parent_handle;
   bool success = false;
   if (sandbox) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 1a32e19..099c57d4 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -473,6 +473,7 @@
       "../browser/browsing_data/counters/media_licenses_counter_browsertest.cc",
       "../browser/browsing_data/counters/passwords_counter_browsertest.cc",
       "../browser/browsing_data/counters/sync_aware_counter_browsertest.cc",
+      "../browser/browsing_data/navigation_entry_remover_browsertest.cc",
       "../browser/budget_service/budget_manager_browsertest.cc",
       "../browser/chrome_content_browser_client_browsertest.cc",
       "../browser/chrome_content_browser_client_browsertest_chromeos.cc",
@@ -706,6 +707,7 @@
       "../browser/ssl/certificate_reporting_test_utils.h",
       "../browser/ssl/chrome_expect_ct_reporter_browsertest.cc",
       "../browser/ssl/chrome_ssl_host_state_delegate_test.cc",
+      "../browser/ssl/connection_help_tab_helper_browsertest.cc",
       "../browser/ssl/security_state_tab_helper_browsertest.cc",
       "../browser/ssl/ssl_browsertest.cc",
       "../browser/ssl/ssl_client_certificate_selector_test.cc",
@@ -2853,7 +2855,7 @@
       "../browser/resource_coordinator/tab_manager_stats_collector_unittest.cc",
       "../browser/resource_coordinator/tab_manager_unittest.cc",
       "../browser/resource_coordinator/tab_manager_web_contents_data_unittest.cc",
-      "../browser/resource_coordinator/tab_metrics_logger_impl_unittest.cc",
+      "../browser/resource_coordinator/tab_metrics_logger_unittest.cc",
 
       # Android does not use the Message Center notification system.
       "../browser/net/firefox_proxy_settings_unittest.cc",
diff --git a/chrome/test/base/memory_tracing_browsertest.cc b/chrome/test/base/memory_tracing_browsertest.cc
index 2d11b49..a56f6f6 100644
--- a/chrome/test/base/memory_tracing_browsertest.cc
+++ b/chrome/test/base/memory_tracing_browsertest.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/test/base/tracing.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/run_loop.h"
diff --git a/chrome/test/chromedriver/test/test_expectations b/chrome/test/chromedriver/test/test_expectations
index 8f9977e..c001ffa 100644
--- a/chrome/test/chromedriver/test/test_expectations
+++ b/chrome/test/chromedriver/test/test_expectations
@@ -281,6 +281,15 @@
 
 _OS_NEGATIVE_FILTER['android:chromium'] = (
     _OS_NEGATIVE_FILTER['android:chrome'] + [
+        # https://bugs.chromium.org/p/chromedriver/issues/detail?id=2286
+        'CorrectEventFiringTest.testSendingKeysToAnElementShouldCauseTheFocusEventToFire',
+        'CorrectEventFiringTest.testSendingKeysToAnElementShouldCauseTheFocusEventToFire',
+        'JavascriptEnabledDriverTest.testShouldBeAbleToFindElementAfterJavascriptCausesANewPageToLoad',
+        'ElementAttributeTest.testShouldReturnValueOfOnClickAttribute',
+        'BasicMouseInterfaceTest.testDoubleClickThenGet',
+        'TypingTest.testShouldReportKeyCodeOfArrowKeysUpDownEvents',
+        'FormHandlingTest.testShouldSubmitAFormUsingTheEnterKey',
+        'FormHandlingTest.testShouldSubmitAFormUsingTheNewlineLiteral',
     ]
 )
 _OS_NEGATIVE_FILTER['android:chrome_beta'] = (
diff --git a/chrome/test/data/browsing_data/a.html b/chrome/test/data/browsing_data/a.html
new file mode 100644
index 0000000..b32e46a
--- /dev/null
+++ b/chrome/test/data/browsing_data/a.html
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <h1>A</h1>
+  </body>
+</html>
diff --git a/chrome/test/data/browsing_data/b.html b/chrome/test/data/browsing_data/b.html
new file mode 100644
index 0000000..1493e08
--- /dev/null
+++ b/chrome/test/data/browsing_data/b.html
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <h1>B</h1>
+  </body>
+</html>
diff --git a/chrome/test/data/browsing_data/c.html b/chrome/test/data/browsing_data/c.html
new file mode 100644
index 0000000..93a4b9d
--- /dev/null
+++ b/chrome/test/data/browsing_data/c.html
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <h1>C</h1>
+  </body>
+</html>
diff --git a/chrome/test/data/browsing_data/d.html b/chrome/test/data/browsing_data/d.html
new file mode 100644
index 0000000..03d0435
--- /dev/null
+++ b/chrome/test/data/browsing_data/d.html
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <h1>D</h1>
+  </body>
+</html>
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 8deeea1..43e768d 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -2170,6 +2170,16 @@
     ]
   },
 
+  "MachineLevelUserCloudPolicyEnrollmentToken": {
+    "os": ["win", "linux", "mac"],
+    "test_policy": {"MachineLevelUserCloudPolicyEnrollmentToken": ""},
+    "pref_mappings": [
+        { "pref": "policy.machine_level_user_cloud_policy_enrollment_token",
+          "local_state": true
+        }
+      ]
+  },
+
   "SSLVersionMin": {
     "os": ["win", "linux", "mac", "chromeos"],
     "test_policy": { "SSLVersionMin": "tls1.1" },
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 43b3869..7998b8c98 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -92,7 +92,6 @@
     "settings/basic_page_browsertest.js",
     "settings/cr_settings_browsertest.js",
     "settings/help_page_browsertest.js",
-    "settings/on_startup_browsertest.js",
     "settings/passwords_and_autofill_fake_data.js",
     "settings/passwords_and_forms_browsertest.js",
     "settings/settings_autofill_section_browsertest.js",
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 8aa4cccf..7903261 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1818,3 +1818,26 @@
 TEST_F('CrSettingsChangePasswordPageTest', 'All', function() {
   mocha.run();
 });
+
+/**
+ * @constructor
+ * @extends {CrSettingsBrowserTest}
+ */
+function CrSettingsOnStartupPageTest() {}
+
+CrSettingsOnStartupPageTest.prototype = {
+  __proto__: CrSettingsBrowserTest.prototype,
+
+  /** @override */
+  browsePreload: 'chrome://settings/on_startup_page/on_startup_page.html',
+
+  /** @override */
+  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
+    '../test_browser_proxy.js',
+    'on_startup_page_tests.js',
+  ]),
+};
+
+TEST_F('CrSettingsOnStartupPageTest', 'All', function() {
+  mocha.run();
+});
diff --git a/chrome/test/data/webui/settings/on_startup_browsertest.js b/chrome/test/data/webui/settings/on_startup_browsertest.js
deleted file mode 100644
index bf01595..0000000
--- a/chrome/test/data/webui/settings/on_startup_browsertest.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/** @fileoverview Runs Polymer OnStartup Settings tests. */
-
-GEN_INCLUDE(['settings_page_browsertest.js']);
-
-/**
- * Radio button enum values for restore on startup.
- * @enum
- */
-const RestoreOnStartupEnum = {
-  CONTINUE: 1,
-  OPEN_NEW_TAB: 5,
-  OPEN_SPECIFIC: 4,
-};
-
-/**
- * Test Polymer On Startup Settings elements.
- * @constructor
- * @extends {SettingsPageBrowserTest}
- */
-function OnStartupSettingsBrowserTest() {}
-
-OnStartupSettingsBrowserTest.prototype = {
-  __proto__: SettingsPageBrowserTest.prototype,
-
-  /** @return {Element} */
-  getPageElement: function(selector) {
-    const section = this.getSection(this.basicPage, 'onStartup');
-    assertTrue(!!section);
-    const module = section.querySelector('settings-on-startup-page');
-    assertTrue(!!module);
-    const result = module.$$(selector);
-    assertTrue(!!result);
-    return result;
-  },
-};
-
-TEST_F('OnStartupSettingsBrowserTest', 'uiTests', function() {
-  /**
-   * The prefs API that will get a fake implementation.
-   * @type {!SettingsPrivate}
-   */
-  let settingsPrefs;
-  const self = this;
-
-  const restoreOnStartup = function() {
-    return self.getPageElement('#onStartupRadioGroup')
-        .querySelector('.iron-selected')
-        .label;
-  };
-
-  suite('OnStartupHandler', function() {
-    suiteSetup(function() {
-      self.basicPage.set('pageVisibility.onStartup', true);
-      Polymer.dom.flush();
-
-      settingsPrefs =
-          document.querySelector('settings-ui').$$('settings-prefs');
-      assertTrue(!!settingsPrefs);
-      return CrSettingsPrefs.initialized;
-    });
-
-    test('open-continue', function() {
-      settingsPrefs.set(
-          'prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.CONTINUE);
-      assertEquals('Continue where you left off', restoreOnStartup());
-    });
-
-    test('open-ntp', function() {
-      settingsPrefs.set(
-          'prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.OPEN_NEW_TAB);
-      assertEquals('Open the New Tab page', restoreOnStartup());
-    });
-
-    test('open-specific', function() {
-      settingsPrefs.set(
-          'prefs.session.restore_on_startup.value',
-          RestoreOnStartupEnum.OPEN_SPECIFIC);
-      assertEquals('Open a specific page or set of pages', restoreOnStartup());
-    });
-  });
-  mocha.run();
-});
diff --git a/chrome/test/data/webui/settings/on_startup_page_tests.js b/chrome/test/data/webui/settings/on_startup_page_tests.js
new file mode 100644
index 0000000..2630ed1
--- /dev/null
+++ b/chrome/test/data/webui/settings/on_startup_page_tests.js
@@ -0,0 +1,158 @@
+// 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.
+
+/** @implements {settings.ProfileInfoBrowserProxy} */
+class TestOnStartupBrowserProxy extends TestBrowserProxy {
+  constructor() {
+    super([
+      'getNtpExtension'
+    ]);
+
+    /** @private {?NtpExtension} */
+    this.ntpExtension_ = null;
+  }
+
+  /** @override */
+  getNtpExtension() {
+    this.methodCalled('getNtpExtension', arguments);
+    return Promise.resolve(this.ntpExtension_);
+  }
+
+  /**
+   * Sets ntpExtension and fires an update event
+   * @param {?NtpExtension}
+   */
+  setNtpExtension(ntpExtension) {
+    this.ntpExtension_ = ntpExtension;
+    cr.webUIListenerCallback('update-ntp-extension', ntpExtension);
+  }
+}
+
+/** @fileoverview Suite of tests for on_startup_page. */
+suite('OnStartupPage', function() {
+  /**
+   * Radio button enum values for restore on startup.
+   * @enum
+   */
+  const RestoreOnStartupEnum = {
+    CONTINUE: 1,
+    OPEN_NEW_TAB: 5,
+    OPEN_SPECIFIC: 4,
+  };
+
+  let testElement;
+
+  /**
+   * The mock proxy object to use during test.
+   * @type {TestOnStartupBrowserProxy}
+   */
+  let onStartupBrowserProxy = null;
+
+  /** @type {NtpExtension} */
+  const ntpExtension = {
+    id: 'id',
+    name: 'name',
+    canBeDisabled: true
+  };
+
+  /** @return {!Promise} */
+  function initPage() {
+    onStartupBrowserProxy.reset();
+    PolymerTest.clearBody();
+    testElement = document.createElement('settings-on-startup-page');
+    testElement.prefs = {
+      session: {
+        restore_on_startup: {
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: RestoreOnStartupEnum.OPEN_NEW_TAB,
+        },
+      },
+    };
+    document.body.appendChild(testElement);
+    return onStartupBrowserProxy.whenCalled('getNtpExtension')
+        .then(function() {
+          Polymer.dom.flush();
+        });
+  }
+
+  function getSelectedOptionLabel() {
+    return testElement.$.onStartupRadioGroup
+        .querySelector('.iron-selected')
+        .label;
+  }
+
+  setup(function() {
+    onStartupBrowserProxy = new TestOnStartupBrowserProxy();
+    settings.OnStartupBrowserProxyImpl.instance_ = onStartupBrowserProxy;
+    return initPage();
+  });
+
+  teardown(function() {
+    if (testElement) {
+      testElement.remove();
+      testElement = null;
+    }
+  });
+
+  test('open-continue', function() {
+    testElement.set(
+        'prefs.session.restore_on_startup.value',
+        RestoreOnStartupEnum.CONTINUE);
+    assertEquals('Continue where you left off', getSelectedOptionLabel());
+  });
+
+  test('open-ntp', function() {
+    testElement.set(
+        'prefs.session.restore_on_startup.value',
+        RestoreOnStartupEnum.OPEN_NEW_TAB);
+    assertEquals('Open the New Tab page', getSelectedOptionLabel());
+  });
+
+  test('open-specific', function() {
+    testElement.set(
+        'prefs.session.restore_on_startup.value',
+        RestoreOnStartupEnum.OPEN_SPECIFIC);
+    assertEquals(
+        'Open a specific page or set of pages',
+        getSelectedOptionLabel());
+  });
+
+  function extensionControlledIndicatorExists() {
+    return !!testElement.$$('extension-controlled-indicator');
+  }
+
+  test('given ntp extension, extension indicator always exists', function() {
+    onStartupBrowserProxy.setNtpExtension(ntpExtension);
+    return onStartupBrowserProxy.whenCalled('getNtpExtension')
+        .then(function() {
+          Polymer.dom.flush();
+          assertTrue(extensionControlledIndicatorExists());
+          Object.values(RestoreOnStartupEnum).forEach(function(option) {
+            testElement.set('prefs.session.restore_on_startup.value', option);
+            assertTrue(extensionControlledIndicatorExists());
+          });
+        });
+  });
+
+  test(
+      'extension indicator not shown when no ntp extension enabled',
+      function() {
+        assertFalse(extensionControlledIndicatorExists());
+        Object.values(RestoreOnStartupEnum).forEach(function(option) {
+          testElement.set('prefs.session.restore_on_startup.value', option);
+          assertFalse(extensionControlledIndicatorExists());
+        });
+      }
+  );
+
+  test('ntp extension updated, extension indicator added', function() {
+    assertFalse(extensionControlledIndicatorExists());
+    onStartupBrowserProxy.setNtpExtension(ntpExtension);
+    return onStartupBrowserProxy.whenCalled('getNtpExtension')
+        .then(function() {
+          Polymer.dom.flush();
+          assertTrue(extensionControlledIndicatorExists());
+        });
+  });
+});
diff --git a/chrome/test/data/webui/settings/protocol_handlers_tests.js b/chrome/test/data/webui/settings/protocol_handlers_tests.js
index 2ed7826..0f0949d 100644
--- a/chrome/test/data/webui/settings/protocol_handlers_tests.js
+++ b/chrome/test/data/webui/settings/protocol_handlers_tests.js
@@ -16,37 +16,45 @@
    */
   const protocols = [
     {
-      default_handler: 0,
       handlers: [{
         host: 'www.google.com',
         protocol: 'mailto',
-        spec: 'http://www.google.com/%s'
+        spec: 'http://www.google.com/%s',
+        is_default: true
       }],
-      has_policy_recommendations: false,
-      is_default_handler_set_by_user: true,
       protocol: 'mailto'
     },
     {
-      default_handler: 0,
       handlers: [
         {
           host: 'www.google1.com',
           protocol: 'webcal',
-          spec: 'http://www.google1.com/%s'
+          spec: 'http://www.google1.com/%s',
+          is_default: true
         },
         {
           host: 'www.google2.com',
           protocol: 'webcal',
-          spec: 'http://www.google2.com/%s'
+          spec: 'http://www.google2.com/%s',
+          is_default: false
         }
       ],
-      has_policy_recommendations: false,
-      is_default_handler_set_by_user: true,
       protocol: 'webcal'
     }
   ];
 
   /**
+   * A list of IngnoredProtocolEntry fixtures.
+   * @type {!Array<!HandlerEntry}>}
+   */
+  const ignoredProtocols = [{
+    host: 'www.google.com',
+    protocol: 'web+ignored',
+    spec: 'https://www.google.com/search?q=ignored+%s',
+    is_default: false
+  }];
+
+  /**
    * The mock proxy object to use during test.
    * @type {TestSiteSettingsPrefsBrowserProxy}
    */
@@ -69,14 +77,17 @@
     testElement = document.createElement('protocol-handlers');
     document.body.appendChild(testElement);
     return browserProxy.whenCalled('observeProtocolHandlers')
-        .then(Polymer.dom.flush.bind(Polymer.dom));
+        .then(function() {
+          Polymer.dom.flush();
+        });
   }
 
   test('empty list', function() {
-    return initPage().then(function() {
-      const listFrames = testElement.root.querySelectorAll('.list-frame');
-      assertEquals(0, listFrames.length);
-    });
+    return initPage()
+        .then(function() {
+          const listFrames = testElement.root.querySelectorAll('.list-frame');
+          assertEquals(0, listFrames.length);
+        });
   });
 
   test('non-empty list', function() {
@@ -104,6 +115,27 @@
     });
   });
 
+  test('non-empty ignored protocols', () => {
+    browserProxy.setIgnoredProtocols(ignoredProtocols);
+
+    return initPage().then(() => {
+      const listFrames = testElement.root.querySelectorAll('.list-frame');
+      const listItems = testElement.root.querySelectorAll('.list-item');
+      // There is a single blocked protocols section
+      assertEquals(1, listFrames.length);
+      // There is one total handlers within the two protocols.
+      assertEquals(1, listItems.length);
+
+      // Check that item hosts are rendered correctly.
+      const hosts = testElement.root.querySelectorAll('.protocol-host');
+      assertEquals('www.google.com', hosts[0].textContent);
+
+      // Check that item default subtexts are rendered correctly.
+      const defText = testElement.root.querySelectorAll('.protocol-protocol');
+      assertFalse(defText[0].hidden);
+    });
+  });
+
   /**
    * A reusable function to test different action buttons.
    * @param {string} button id of the button to test.
@@ -111,48 +143,33 @@
    * @return {!Promise}
    */
   function testButtonFlow(button, browserProxyHandler) {
-    let menuButtons;
-    let functionButton;
-    let dialog;
-
-    return initPage()
-        .then(function() {
-          // Initiating the elements
-          menuButtons =
-              testElement.root.querySelectorAll('button.icon-more-vert');
-          functionButton = testElement.$[button];
-          dialog = testElement.$$('dialog[is=cr-action-menu]');
-          assertEquals(3, menuButtons.length);
-
-          // Test the button for the first protocol handler
-          MockInteractions.tap(menuButtons[0]);
-          assertTrue(dialog.open);
-
-          MockInteractions.tap(functionButton);
-
-          return browserProxy.whenCalled(browserProxyHandler);
-        })
-        .then(function(args) {
-          // BrowserProxy's handler is expected to be called with arguments as
-          // [protocol, url].
-          assertEquals(protocols[0].protocol, args[0]);
-          assertEquals(protocols[0].handlers[0].spec, args[1]);
-
-          const dialog = testElement.$$('dialog[is=cr-action-menu]');
-          assertFalse(dialog.open);
-
-          // Test the button for the second protocol handler
-          browserProxy.reset();
-          MockInteractions.tap(menuButtons[1]);
-          assertTrue(dialog.open);
-          MockInteractions.tap(functionButton);
-
-          return browserProxy.whenCalled(browserProxyHandler);
-        })
-        .then(function(args) {
-          assertEquals(protocols[1].protocol, args[0]);
-          assertEquals(protocols[1].handlers[0].spec, args[1]);
+    return initPage().then(() => {
+      // Initiating the elements
+      const menuButtons =
+          testElement.root.querySelectorAll('button.icon-more-vert');
+      assertEquals(3, menuButtons.length);
+      const dialog = testElement.$$('dialog[is=cr-action-menu]');
+      return Promise.all([[0, 0], [1, 0], [1, 1]].map((indices, menuIndex) => {
+        const protocolIndex = indices[0];
+        const handlerIndex = indices[1];
+        // Test the button for the first protocol handler
+        browserProxy.reset();
+        assertFalse(dialog.open);
+        MockInteractions.tap(menuButtons[menuIndex]);
+        assertTrue(dialog.open);
+        MockInteractions.tap(testElement.$[button]);
+        assertFalse(dialog.open);
+        return browserProxy.whenCalled(browserProxyHandler).then(args => {
+          const protocol = args[0];
+          const url = args[1];
+          // BrowserProxy's handler is expected to be called with
+          // arguments as [protocol, url].
+          assertEquals(protocols[protocolIndex].protocol, protocol);
+          assertEquals(
+              protocols[protocolIndex].handlers[handlerIndex].spec, url);
         });
+      }));
+    });
   }
 
   test('remove button works', function() {
@@ -162,6 +179,36 @@
 
   test('default button works', function() {
     browserProxy.setProtocolHandlers(protocols);
-    return testButtonFlow('defaultButton', 'setProtocolDefault');
+    return testButtonFlow('defaultButton', 'setProtocolDefault').then(() => {
+      const menuButtons =
+          testElement.root.querySelectorAll('button.icon-more-vert');
+      const closeMenu = () =>
+          testElement.$$('dialog[is=cr-action-menu]').close();
+      MockInteractions.tap(menuButtons[0]);
+      assertTrue(testElement.$.defaultButton.hidden);
+      closeMenu();
+      MockInteractions.tap(menuButtons[1]);
+      assertTrue(testElement.$.defaultButton.hidden);
+      closeMenu();
+      MockInteractions.tap(menuButtons[2]);
+      assertFalse(testElement.$.defaultButton.hidden);
+    });
+  });
+
+  test('remove button for ignored works', () => {
+    browserProxy.setIgnoredProtocols(ignoredProtocols);
+    return initPage()
+        .then(() => {
+          MockInteractions.tap(testElement.$$('#removeIgnoredButton'));
+          return browserProxy.whenCalled('removeProtocolHandler');
+        })
+        .then(args => {
+          const protocol = args[0];
+          const url = args[1];
+          // BrowserProxy's handler is expected to be called with arguments as
+          // [protocol, url].
+          assertEquals(ignoredProtocols[0].protocol, protocol);
+          assertEquals(ignoredProtocols[0].spec, url);
+        });
   });
 });
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
index 107545c2..d8d0e57 100644
--- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
@@ -32,6 +32,7 @@
       'isPatternValid',
       'observeProtocolHandlers',
       'observeProtocolHandlersEnabledState',
+      'removeIgnoredHandler',
       'removeProtocolHandler',
       'removeUsbDevice',
       'removeZoomLevel',
@@ -58,6 +59,9 @@
     /** @private {!Array<!ProtocolEntry>} */
     this.protocolHandlers_ = [];
 
+    /** @private {!Array<!HandlerEntry>} */
+    this.ignoredProtocols_ = [];
+
     /** @private {boolean} */
     this.isOriginValid_ = true;
 
@@ -142,6 +146,15 @@
     this.protocolHandlers_ = list.slice();
   }
 
+  /**
+   * Sets the prefs to use when testing.
+   * @param {!Array<!HandlerEntry>}
+   */
+  setIgnoredProtocols(list) {
+    // Shallow copy of the passed-in array so mutation won't impact the source
+    this.ignoredProtocols_ = list.slice();
+  }
+
   /** @override */
   setDefaultValueForContentType(contentType, defaultValue) {
     this.methodCalled(
@@ -302,6 +315,8 @@
   observeProtocolHandlers() {
     cr.webUIListenerCallback('setHandlersEnabled', true);
     cr.webUIListenerCallback('setProtocolHandlers', this.protocolHandlers_);
+    cr.webUIListenerCallback(
+        'setIgnoredProtocolHandlers', this.ignoredProtocols_);
     this.methodCalled('observeProtocolHandlers');
   }
 
diff --git a/chrome/test/data/webui/test_browser_proxy.js b/chrome/test/data/webui/test_browser_proxy.js
index 706c8276..0247bfd 100644
--- a/chrome/test/data/webui/test_browser_proxy.js
+++ b/chrome/test/data/webui/test_browser_proxy.js
@@ -38,7 +38,7 @@
   constructor(methodNames) {
     /** @private {!Map<string, !PromiseResolver>} */
     this.resolverMap_ = new Map();
-    methodNames.forEach((methodName) => {
+    methodNames.forEach(methodName => {
       this.resolverMap_.set(methodName, new PromiseResolver());
     });
   }
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 2be2bc4a..0ea40ad 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -15,6 +15,8 @@
 
 cast_source_set("browser") {
   sources = [
+    "application_media_capabilities.cc",
+    "application_media_capabilities.h",
     "cast_browser_context.cc",
     "cast_browser_context.h",
     "cast_browser_main_parts.cc",
@@ -95,6 +97,7 @@
     "//chromecast/base:cast_version",
     "//chromecast/browser:resources",
     "//chromecast/common",
+    "//chromecast/common:interfaces",
     "//chromecast/common/media",
     "//chromecast/common/media:interfaces",
     "//chromecast/graphics",
@@ -154,7 +157,6 @@
     ]
 
     deps += [
-      "//chromecast/common:interfaces",
       "//mojo/public/cpp/bindings",
       "//ui/aura",
     ]
@@ -311,6 +313,8 @@
   sources = [
     "test/cast_browser_test.cc",
     "test/cast_browser_test.h",
+    "test/fake_web_contents_observer.cc",
+    "test/fake_web_contents_observer.h",
   ]
 
   public_deps = [
@@ -321,6 +325,7 @@
   deps = [
     "//base",
     "//chromecast/base",
+    "//chromecast/common:interfaces",
     "//content/public/browser",
     "//content/public/common",
     "//testing/gtest",
diff --git a/chromecast/browser/android/BUILD.gn b/chromecast/browser/android/BUILD.gn
index cf4cef45..c912bbdb 100644
--- a/chromecast/browser/android/BUILD.gn
+++ b/chromecast/browser/android/BUILD.gn
@@ -76,6 +76,15 @@
   ]
 }
 
+android_library("reactive_android_java") {
+  java_src_dir = "//chromecast/browser/android/apk/src"
+  java_files = [ "$java_src_dir/org/chromium/chromecast/shell/LocalBroadcastReceiverScope.java" ]
+  deps = [
+    "//base:base_java",
+    "//third_party/android_tools:android_support_core_utils_java",
+  ]
+}
+
 android_library("cast_shell_java") {
   java_src_dir = "//chromecast/browser/android/apk/src"
   java_files = [
@@ -110,8 +119,10 @@
     ":cast_intents_java",
     ":cast_shell_android_resources",
     ":cast_shell_manifest",
+    ":reactive_android_java",
     "//base:base_java",
     "//chromecast/base:base_java",
+    "//components/content_view:content_view_java",
     "//components/crash/android:java",
     "//content/public/android:content_java",
     "//device/geolocation:geolocation_java",
@@ -131,6 +142,7 @@
 junit_binary("cast_shell_junit_tests") {
   java_files = [
     "junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java",
+    "junit/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScopeTest.java",
     "junit/src/org/chromium/chromecast/shell/LogcatElisionUnitTest.java",
     "junit/src/org/chromium/chromecast/shell/ElidedLogcatProviderUnitTest.java",
   ]
diff --git a/chromecast/browser/android/DEPS b/chromecast/browser/android/DEPS
index 86c3781a..31449f7 100644
--- a/chromecast/browser/android/DEPS
+++ b/chromecast/browser/android/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/content_view",
   "+content/public/android",
   "+jni",
   "+ui/android",
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java
index 1fca41d..658a04b 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java
@@ -13,7 +13,7 @@
 
 import org.chromium.base.Log;
 import org.chromium.base.annotations.JNINamespace;
-import org.chromium.content.browser.ContentView;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.content_public.browser.ContentViewCore;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.ViewAndroidDelegate;
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsSurfaceHelper.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsSurfaceHelper.java
index 7a76107..fa9abf2 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsSurfaceHelper.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsSurfaceHelper.java
@@ -5,8 +5,6 @@
 package org.chromium.chromecast.shell;
 
 import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.Color;
@@ -19,9 +17,10 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chromecast.base.Controller;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.content.browser.ActivityContentVideoViewEmbedder;
 import org.chromium.content.browser.ContentVideoViewEmbedder;
-import org.chromium.content.browser.ContentView;
 import org.chromium.content.browser.ContentViewRenderView;
 import org.chromium.content_public.browser.ContentViewCore;
 import org.chromium.content_public.browser.WebContents;
@@ -46,6 +45,9 @@
 
     private static final int TEARDOWN_GRACE_PERIOD_TIMEOUT_MILLIS = 300;
 
+    private final Controller<WebContents> mHasWebContentsState = new Controller<>();
+    private final Controller<Uri> mHasUriState = new Controller<>();
+
     private final Activity mHostActivity;
     private final boolean mShowInFragment;
     private final Handler mHandler;
@@ -54,9 +56,6 @@
 
     private Uri mUri;
     private String mInstanceId;
-    private BroadcastReceiver mWindowDestroyedBroadcastReceiver;
-    private BroadcastReceiver mScreenOffBroadcastReceiver;
-    private BroadcastReceiver mInternalStopReceiver;
     private ContentViewRenderView mContentViewRenderView;
     private WindowAndroid mWindow;
     private ContentViewCore mContentViewCore;
@@ -77,6 +76,31 @@
         mCastWebContentsLayout = castWebContentsLayout;
         mHandler = new Handler();
         mAudioManager = CastAudioManager.getAudioManager(getActivity());
+
+        // Receive broadcasts indicating the screen turned off while we have active WebContents.
+        mHasWebContentsState.watch(() -> {
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(CastIntents.ACTION_SCREEN_OFF);
+            return new LocalBroadcastReceiverScope(filter, (Intent intent) -> {
+                detachWebContentsIfAny();
+                maybeFinishLater();
+            });
+        });
+        // Receive broadcasts requesting to tear down this app while we have a valid URI.
+        mHasUriState.watch((Uri uri) -> {
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(CastIntents.ACTION_STOP_WEB_CONTENT);
+            return new LocalBroadcastReceiverScope(filter, (Intent intent) -> {
+                Log.d(TAG, "Intent action=" + intent.getAction());
+                String intentUri = intent.getStringExtra(CastWebContentsComponent.INTENT_EXTRA_URI);
+                if (!uri.toString().equals(intentUri)) {
+                    Log.d(TAG, "Current URI=" + uri + "; intent URI=" + intentUri);
+                    return;
+                }
+                detachWebContentsIfAny();
+                maybeFinishLater();
+            });
+        });
     }
 
     void onNewWebContents(
@@ -98,51 +122,8 @@
         // http://developer.android.com/training/managing-audio/volume-playback.html
         mHostActivity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
 
-        if (mWindowDestroyedBroadcastReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mWindowDestroyedBroadcastReceiver);
-        }
-
-        if (mScreenOffBroadcastReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mScreenOffBroadcastReceiver);
-        }
-
-        mScreenOffBroadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                detachWebContentsIfAny();
-                maybeFinishLater();
-            }
-        };
-
-        IntentFilter screenOffIntentFilter = new IntentFilter();
-        screenOffIntentFilter.addAction(CastIntents.ACTION_SCREEN_OFF);
-        getLocalBroadcastManager().registerReceiver(
-                mScreenOffBroadcastReceiver, screenOffIntentFilter);
-
-        if (mInternalStopReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mWindowDestroyedBroadcastReceiver);
-        }
-        mInternalStopReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                Log.d(TAG, "Intent action=" + intent.getAction());
-                if (mUri == null
-                        || !mUri.toString().equals(intent.getStringExtra(
-                                   CastWebContentsComponent.INTENT_EXTRA_URI))) {
-                    Log.d(TAG,
-                            "Current URI=" + mUri + "; intent URI="
-                                    + intent.getStringExtra(
-                                              CastWebContentsComponent.INTENT_EXTRA_URI));
-                    return;
-                }
-                detachWebContentsIfAny();
-                maybeFinishLater();
-            }
-        };
-        IntentFilter internalStopReceiverFilter = new IntentFilter();
-        internalStopReceiverFilter.addAction(CastIntents.ACTION_STOP_WEB_CONTENT);
-        getLocalBroadcastManager().registerReceiver(
-                mInternalStopReceiver, internalStopReceiverFilter);
+        mHasUriState.set(mUri);
+        mHasWebContentsState.set(webContents);
 
         showWebContents(webContents);
     }
@@ -160,7 +141,8 @@
                         Intent in = new Intent();
                         in.setAction(CastIntents.ACTION_ON_WEB_CONTENT_STOPPED);
                         in.putExtra(CastWebContentsComponent.INTENT_EXTRA_URI, mUri.toString());
-                        getLocalBroadcastManager().sendBroadcastSync(in);
+                        LocalBroadcastManager.getInstance(ContextUtils.getApplicationContext())
+                                .sendBroadcastSync(in);
                     } else {
                         mHostActivity.finish();
                     }
@@ -279,18 +261,8 @@
     // Destroys all resources. After calling this method, this object must be dropped.
     void onDestroy() {
         detachWebContentsIfAny();
-
-        if (mWindowDestroyedBroadcastReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mWindowDestroyedBroadcastReceiver);
-        }
-
-        if (mScreenOffBroadcastReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mScreenOffBroadcastReceiver);
-        }
-
-        if (mInternalStopReceiver != null) {
-            getLocalBroadcastManager().unregisterReceiver(mInternalStopReceiver);
-        }
+        mHasWebContentsState.reset();
+        mHasUriState.reset();
     }
 
     String getInstanceId() {
@@ -301,10 +273,6 @@
         return mTouchInputEnabled;
     }
 
-    private LocalBroadcastManager getLocalBroadcastManager() {
-        return LocalBroadcastManager.getInstance(ContextUtils.getApplicationContext());
-    }
-
     private native void nativeSetContentVideoViewEmbedder(
             WebContents webContents, ContentVideoViewEmbedder embedder);
 }
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScope.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScope.java
new file mode 100644
index 0000000..c39e1560
--- /dev/null
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScope.java
@@ -0,0 +1,50 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromecast.shell;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.v4.content.LocalBroadcastManager;
+
+import org.chromium.base.ContextUtils;
+
+/**
+ * Registers a BroadcastReceiver in the constructor, and unregisters it in the close() method.
+ *
+ * This can be used to react to Observables to properly control the lifetimes of BroadcastReceivers.
+ */
+public class LocalBroadcastReceiverScope implements AutoCloseable {
+    private final LocalBroadcastManager mBroadcastManager;
+    private final BroadcastReceiver mReceiver;
+
+    public LocalBroadcastReceiverScope(IntentFilter filter, IntentReceivedCallback callback) {
+        this(LocalBroadcastManager.getInstance(ContextUtils.getApplicationContext()), filter,
+                callback);
+    }
+
+    public LocalBroadcastReceiverScope(LocalBroadcastManager broadcastManager, IntentFilter filter,
+            IntentReceivedCallback callback) {
+        mBroadcastManager = broadcastManager;
+        mReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                callback.onReceive(intent);
+            }
+        };
+        mBroadcastManager.registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    public void close() {
+        mBroadcastManager.unregisterReceiver(mReceiver);
+    }
+
+    /**
+     * Functional interface to handle received Intents.
+     */
+    public interface IntentReceivedCallback { public void onReceive(Intent intent); }
+}
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScopeTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScopeTest.java
new file mode 100644
index 0000000..f94282e
--- /dev/null
+++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScopeTest.java
@@ -0,0 +1,80 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromecast.shell;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.emptyIterable;
+import static org.junit.Assert.assertThat;
+
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.v4.content.LocalBroadcastManager;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for LocalBroadcastReceiverScope.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class LocalBroadcastReceiverScopeTest {
+    @Test
+    public void testConstructorRegistersReceiver() {
+        String action = "org.chromium.chromecast.test.ACTION_HELLO";
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(action);
+        List<String> result = new ArrayList<>();
+        LocalBroadcastManager broadcastManager =
+                LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+        new LocalBroadcastReceiverScope(broadcastManager, filter,
+                (Intent intent) -> result.add("Intent received: " + intent.getAction()));
+        Intent intent = new Intent().setAction(action);
+        broadcastManager.sendBroadcast(intent);
+        assertThat(result, contains("Intent received: org.chromium.chromecast.test.ACTION_HELLO"));
+    }
+
+    @Test
+    public void testCallbackNotCalledIfBroadcastDoesNotMeetFilterSpec() {
+        String helloAction = "org.chromium.chromecast.test.ACTION_HELLO";
+        String goodbyeAction = "org.chromium.chromecast.test.ACTION_GOODBYE";
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(helloAction);
+        List<String> result = new ArrayList<>();
+        LocalBroadcastManager broadcastManager =
+                LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+        new LocalBroadcastReceiverScope(broadcastManager, filter,
+                (Intent intent) -> result.add("Intent received: " + intent.getAction()));
+        Intent intent = new Intent().setAction(goodbyeAction);
+        broadcastManager.sendBroadcast(intent);
+        assertThat(result, emptyIterable());
+    }
+
+    @Test
+    public void testCloseUnregistersReceiver() {
+        String action = "org.chromium.chromecast.test.ACTION_HELLO";
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(action);
+        List<String> result = new ArrayList<>();
+        LocalBroadcastManager broadcastManager =
+                LocalBroadcastManager.getInstance(RuntimeEnvironment.application);
+        // Wrap scope in try-with-resources to call close() on it.
+        try (AutoCloseable scope = new LocalBroadcastReceiverScope(broadcastManager, filter,
+                     (Intent intent) -> result.add("Intent received: " + intent.getAction()))) {
+        } catch (Exception e) {
+            result.add("Exception during lifetime of BroadcastReceiver scope: " + e);
+        }
+        Intent intent = new Intent().setAction(action);
+        broadcastManager.sendBroadcast(intent);
+        assertThat(result, emptyIterable());
+    }
+}
diff --git a/chromecast/browser/application_media_capabilities.cc b/chromecast/browser/application_media_capabilities.cc
new file mode 100644
index 0000000..443baa0
--- /dev/null
+++ b/chromecast/browser/application_media_capabilities.cc
@@ -0,0 +1,41 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/browser/application_media_capabilities.h"
+
+#include <utility>
+
+#include "chromecast/base/bitstream_audio_codecs.h"
+
+namespace chromecast {
+namespace shell {
+
+ApplicationMediaCapabilities::ApplicationMediaCapabilities()
+    : supported_bitstream_audio_codecs_(kBitstreamAudioCodecNone) {}
+
+ApplicationMediaCapabilities::~ApplicationMediaCapabilities() = default;
+
+void ApplicationMediaCapabilities::AddBinding(
+    mojom::ApplicationMediaCapabilitiesRequest request) {
+  bindings_.AddBinding(this, std::move(request));
+}
+
+void ApplicationMediaCapabilities::SetSupportedBitstreamAudioCodecs(
+    int codecs) {
+  supported_bitstream_audio_codecs_ = codecs;
+  observers_.ForAllPtrs(
+      [codecs](mojom::ApplicationMediaCapabilitiesObserver* observer) {
+        observer->OnSupportedBitstreamAudioCodecsChanged(codecs);
+      });
+}
+
+void ApplicationMediaCapabilities::AddObserver(
+    mojom::ApplicationMediaCapabilitiesObserverPtr observer) {
+  observer->OnSupportedBitstreamAudioCodecsChanged(
+      supported_bitstream_audio_codecs_);
+  observers_.AddPtr(std::move(observer));
+}
+
+}  // namespace shell
+}  // namespace chromecast
diff --git a/chromecast/browser/application_media_capabilities.h b/chromecast/browser/application_media_capabilities.h
new file mode 100644
index 0000000..a117b89a
--- /dev/null
+++ b/chromecast/browser/application_media_capabilities.h
@@ -0,0 +1,45 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMECAST_BROWSER_APPLICATION_MEDIA_CAPABILITIES_H_
+#define CHROMECAST_BROWSER_APPLICATION_MEDIA_CAPABILITIES_H_
+
+#include "base/macros.h"
+#include "chromecast/common/application_media_capabilities.mojom.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/interface_ptr_set.h"
+
+namespace content {
+class RenderFrameHost;
+}  // namespace content
+
+namespace chromecast {
+namespace shell {
+
+class ApplicationMediaCapabilities
+    : public mojom::ApplicationMediaCapabilities {
+ public:
+  ApplicationMediaCapabilities();
+  ~ApplicationMediaCapabilities() override;
+
+  void AddBinding(mojom::ApplicationMediaCapabilitiesRequest request);
+
+  void SetSupportedBitstreamAudioCodecs(int codecs);
+
+ private:
+  // mojom::ApplicationMediaCapabilities implementation:
+  void AddObserver(
+      mojom::ApplicationMediaCapabilitiesObserverPtr observer) override;
+
+  mojo::BindingSet<mojom::ApplicationMediaCapabilities> bindings_;
+  mojo::InterfacePtrSet<mojom::ApplicationMediaCapabilitiesObserver> observers_;
+  int supported_bitstream_audio_codecs_;
+
+  DISALLOW_COPY_AND_ASSIGN(ApplicationMediaCapabilities);
+};
+
+}  // namespace shell
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BROWSER_APPLICATION_MEDIA_CAPABILITIES_H_
diff --git a/chromecast/browser/cast_media_blocker_browsertest.cc b/chromecast/browser/cast_media_blocker_browsertest.cc
index cf989e0..1fe24498 100644
--- a/chromecast/browser/cast_media_blocker_browsertest.cc
+++ b/chromecast/browser/cast_media_blocker_browsertest.cc
@@ -10,6 +10,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromecast/browser/cast_media_blocker.h"
 #include "chromecast/browser/test/cast_browser_test.h"
+#include "chromecast/browser/test/fake_web_contents_observer.h"
 #include "chromecast/chromecast_features.h"
 #include "content/public/browser/media_session.h"
 #include "content/public/browser/web_contents.h"
@@ -42,7 +43,10 @@
     GURL gurl = content::GetFileUrlWithQuery(
         media::GetTestDataFilePath("player.html"), query);
 
-    web_contents_ = NavigateToURL(gurl);
+    web_contents_ = CreateWebView();
+    web_contents_observer_ =
+        std::make_unique<FakeWebContentsObserver>(web_contents_);
+    NavigateToURL(gurl);
     WaitForLoadStop(web_contents_);
 
     blocker_ = std::make_unique<CastMediaBlocker>(
@@ -81,6 +85,7 @@
 
  private:
   content::WebContents* web_contents_;
+  std::unique_ptr<FakeWebContentsObserver> web_contents_observer_;
   std::unique_ptr<CastMediaBlocker> blocker_;
 
   DISALLOW_COPY_AND_ASSIGN(CastMediaBlockerBrowserTest);
diff --git a/chromecast/browser/cast_touch_device_manager.cc b/chromecast/browser/cast_touch_device_manager.cc
index 70ee180..91069ee 100644
--- a/chromecast/browser/cast_touch_device_manager.cc
+++ b/chromecast/browser/cast_touch_device_manager.cc
@@ -25,9 +25,21 @@
   touch_device_transform.device_id = touchscreen.id;
   touch_device_transform.transform.Translate(display_bounds.x(),
                                              display_bounds.y());
+
+  float touchscreen_width = touchscreen_size.width();
+  float touchscreen_height = touchscreen_size.height();
+
+  // If the display orientation is rotated between portrait and landscape,
+  // the width and height of the touchscreen must be swapped as well.
+  if (display.rotation() == display::Display::Rotation::ROTATE_90 ||
+      display.rotation() == display::Display::Rotation::ROTATE_270) {
+    touchscreen_width = touchscreen_size.height();
+    touchscreen_height = touchscreen_size.width();
+  }
+
   touch_device_transform.transform.Scale(
-      display_bounds.width() / touchscreen_size.width(),
-      display_bounds.height() / touchscreen_size.height());
+      display_bounds.width() / touchscreen_width,
+      display_bounds.height() / touchscreen_height);
 
   return touch_device_transform;
 }
diff --git a/chromecast/browser/extensions/cast_extensions_browser_client.cc b/chromecast/browser/extensions/cast_extensions_browser_client.cc
index 9c20dd27..4e90128c 100644
--- a/chromecast/browser/extensions/cast_extensions_browser_client.cc
+++ b/chromecast/browser/extensions/cast_extensions_browser_client.cc
@@ -109,6 +109,24 @@
   return nullptr;
 }
 
+base::FilePath CastExtensionsBrowserClient::GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id) const {
+  return base::FilePath();
+}
+
+void CastExtensionsBrowserClient::LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header) {
+  NOTREACHED() << "Cannot load resource from bundle w/o path";
+}
+
 bool CastExtensionsBrowserClient::AllowCrossRendererResourceLoad(
     const GURL& url,
     content::ResourceType resource_type,
diff --git a/chromecast/browser/extensions/cast_extensions_browser_client.h b/chromecast/browser/extensions/cast_extensions_browser_client.h
index a0ba803a..2044b5f 100644
--- a/chromecast/browser/extensions/cast_extensions_browser_client.h
+++ b/chromecast/browser/extensions/cast_extensions_browser_client.h
@@ -54,6 +54,18 @@
       const base::FilePath& directory_path,
       const std::string& content_security_policy,
       bool send_cors_header) override;
+  base::FilePath GetBundleResourcePath(
+      const network::ResourceRequest& request,
+      const base::FilePath& extension_resources_path,
+      int* resource_id) const override;
+  void LoadResourceFromResourceBundle(
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      const base::FilePath& resource_relative_path,
+      int resource_id,
+      const std::string& content_security_policy,
+      network::mojom::URLLoaderClientPtr client,
+      bool send_cors_header) override;
   bool AllowCrossRendererResourceLoad(const GURL& url,
                                       content::ResourceType resource_type,
                                       ui::PageTransition page_transition,
diff --git a/chromecast/browser/test/cast_navigation_browsertest.cc b/chromecast/browser/test/cast_navigation_browsertest.cc
index 13b5903..3698feb 100644
--- a/chromecast/browser/test/cast_navigation_browsertest.cc
+++ b/chromecast/browser/test/cast_navigation_browsertest.cc
@@ -6,6 +6,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromecast/browser/test/cast_browser_test.h"
+#include "chromecast/browser/test/fake_web_contents_observer.h"
 #include "chromecast/chromecast_features.h"
 #include "content/public/test/browser_test_utils.h"
 #include "media/base/test_data_util.h"
@@ -25,8 +26,9 @@
   CastNavigationBrowserTest() {}
 
   void LoadAboutBlank() {
-    content::WebContents* web_contents =
-        NavigateToURL(GURL(url::kAboutBlankURL));
+    content::WebContents* web_contents = CreateWebView();
+    FakeWebContentsObserver web_contents_observer(web_contents);
+    NavigateToURL(GURL(url::kAboutBlankURL));
     content::TitleWatcher title_watcher(
         web_contents, base::ASCIIToUTF16(url::kAboutBlankURL));
     base::string16 result = title_watcher.WaitAndGetTitle();
@@ -58,7 +60,9 @@
   }
 
   std::string RunTest(const GURL& gurl, const std::string& expected_title) {
-    content::WebContents* web_contents = NavigateToURL(gurl);
+    content::WebContents* web_contents = CreateWebView();
+    FakeWebContentsObserver web_contents_observer(web_contents);
+    NavigateToURL(gurl);
     content::TitleWatcher title_watcher(web_contents,
                                         base::ASCIIToUTF16(expected_title));
     title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16(kEnded));
diff --git a/chromecast/browser/test/fake_web_contents_observer.cc b/chromecast/browser/test/fake_web_contents_observer.cc
new file mode 100644
index 0000000..5a05fd6
--- /dev/null
+++ b/chromecast/browser/test/fake_web_contents_observer.cc
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/browser/test/fake_web_contents_observer.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "chromecast/common/application_media_capabilities.mojom.h"
+
+namespace chromecast {
+namespace shell {
+
+FakeWebContentsObserver::FakeWebContentsObserver(
+    content::WebContents* web_contents)
+    : content::WebContentsObserver(web_contents) {
+  registry_.AddInterface<mojom::ApplicationMediaCapabilities>(
+      base::BindRepeating(&ApplicationMediaCapabilities::AddBinding,
+                          base::Unretained(&app_media_capabilities_)));
+}
+
+FakeWebContentsObserver::~FakeWebContentsObserver() = default;
+
+void FakeWebContentsObserver::DidFinishNavigation(
+    content::NavigationHandle* /* navigation_handle */) {}
+
+void FakeWebContentsObserver::DidFirstVisuallyNonEmptyPaint() {}
+
+void FakeWebContentsObserver::RenderViewCreated(
+    content::RenderViewHost* /* render_view_host */) {}
+
+void FakeWebContentsObserver::RenderViewReady() {}
+
+void FakeWebContentsObserver::OnInterfaceRequestFromFrame(
+    content::RenderFrameHost* /* render_frame_host */,
+    const std::string& interface_name,
+    mojo::ScopedMessagePipeHandle* interface_pipe) {
+  registry_.TryBindInterface(interface_name, interface_pipe);
+}
+
+}  // namespace shell
+}  // namespace chromecast
diff --git a/chromecast/browser/test/fake_web_contents_observer.h b/chromecast/browser/test/fake_web_contents_observer.h
new file mode 100644
index 0000000..6b88ca4
--- /dev/null
+++ b/chromecast/browser/test/fake_web_contents_observer.h
@@ -0,0 +1,50 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMECAST_BROWSER_TEST_FAKE_WEB_CONTENTS_OBSERVER_H_
+#define CHROMECAST_BROWSER_TEST_FAKE_WEB_CONTENTS_OBSERVER_H_
+
+#include <string>
+
+#include "chromecast/browser/application_media_capabilities.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
+
+namespace content {
+class NavigationHandle;
+class RenderFrameHost;
+class RenderViewHost;
+class WebContents;
+}  // namespace content
+
+namespace chromecast {
+namespace shell {
+
+class FakeWebContentsObserver : public content::WebContentsObserver {
+ public:
+  explicit FakeWebContentsObserver(content::WebContents* web_contents);
+  ~FakeWebContentsObserver() override;
+
+ private:
+  // content::WebContentsObserver implementation:
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
+  void DidFirstVisuallyNonEmptyPaint() override;
+  void RenderViewCreated(content::RenderViewHost* render_view_host) override;
+  void RenderViewReady() override;
+  void OnInterfaceRequestFromFrame(
+      content::RenderFrameHost* render_frame_host,
+      const std::string& interface_name,
+      mojo::ScopedMessagePipeHandle* interface_pipe) override;
+
+  service_manager::BinderRegistry registry_;
+  ApplicationMediaCapabilities app_media_capabilities_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeWebContentsObserver);
+};
+
+}  // namespace shell
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BROWSER_TEST_FAKE_WEB_CONTENTS_OBSERVER_H_
diff --git a/chromeos/dbus/fake_power_manager_client.cc b/chromeos/dbus/fake_power_manager_client.cc
index 1ab7281..7ec72fc 100644
--- a/chromeos/dbus/fake_power_manager_client.cc
+++ b/chromeos/dbus/fake_power_manager_client.cc
@@ -204,12 +204,12 @@
     render_process_manager_delegate_->SuspendImminent();
 }
 
-void FakePowerManagerClient::SendSuspendDone() {
+void FakePowerManagerClient::SendSuspendDone(base::TimeDelta sleep_duration) {
   if (render_process_manager_delegate_)
     render_process_manager_delegate_->SuspendDone();
 
   for (auto& observer : observers_)
-    observer.SuspendDone(base::TimeDelta());
+    observer.SuspendDone(sleep_duration);
 }
 
 void FakePowerManagerClient::SendDarkSuspendImminent() {
diff --git a/chromeos/dbus/fake_power_manager_client.h b/chromeos/dbus/fake_power_manager_client.h
index 854a875..888f773b 100644
--- a/chromeos/dbus/fake_power_manager_client.h
+++ b/chromeos/dbus/fake_power_manager_client.h
@@ -101,7 +101,7 @@
   // Emulates the power manager announcing that the system is starting or
   // completing a suspend attempt.
   void SendSuspendImminent(power_manager::SuspendImminent::Reason reason);
-  void SendSuspendDone();
+  void SendSuspendDone(base::TimeDelta sleep_duration = base::TimeDelta());
   void SendDarkSuspendImminent();
 
   // Emulates the power manager announcing that the system is changing
diff --git a/components/autofill/content/renderer/form_tracker.cc b/components/autofill/content/renderer/form_tracker.cc
index a143946..9c530b3 100644
--- a/components/autofill/content/renderer/form_tracker.cc
+++ b/components/autofill/content/renderer/form_tracker.cc
@@ -11,8 +11,8 @@
 #include "third_party/WebKit/public/web/WebInputElement.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
-#include "third_party/WebKit/public/web/modules/password_manager/WebFormElementObserver.h"
-#include "third_party/WebKit/public/web/modules/password_manager/WebFormElementObserverCallback.h"
+#include "third_party/WebKit/public/web/modules/autofill/WebFormElementObserver.h"
+#include "third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h"
 #include "ui/base/page_transition_types.h"
 
 using blink::WebDocumentLoader;
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc
index ba4b6144..4f9a0db 100644
--- a/components/autofill/core/browser/autofill_metrics.cc
+++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -1534,8 +1534,6 @@
   }
 
   // Logging again in a different histogram for segmentation purposes.
-  // TODO(waltercacau): Re-evaluate if we still need such fine grained
-  // segmentation. http://crbug.com/454018
   if (server_record_type_count_ == 0 && local_record_type_count_ == 0)
     name += ".WithNoData";
   else if (server_record_type_count_ > 0 && local_record_type_count_ == 0)
diff --git a/components/browser_sync/profile_sync_service.cc b/components/browser_sync/profile_sync_service.cc
index 1202561..2cfcebb 100644
--- a/components/browser_sync/profile_sync_service.cc
+++ b/components/browser_sync/profile_sync_service.cc
@@ -385,9 +385,12 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   // Although the backing data actually is of type |SESSIONS|, the desire to use
   // open tabs functionality is tracked by the state of the |PROXY_TABS| type.
-  return IsDataTypeControllerRunning(syncer::PROXY_TABS)
-             ? sessions_sync_manager_.get()
-             : nullptr;
+  if (!IsDataTypeControllerRunning(syncer::PROXY_TABS)) {
+    return nullptr;
+  }
+
+  DCHECK(sessions_sync_manager_);
+  return sessions_sync_manager_->GetOpenTabsUIDelegate();
 }
 
 sync_sessions::FaviconCache* ProfileSyncService::GetFaviconCache() {
diff --git a/components/browser_sync/profile_sync_test_util.h b/components/browser_sync/profile_sync_test_util.h
index 2b29455c..2feedb9 100644
--- a/components/browser_sync/profile_sync_test_util.h
+++ b/components/browser_sync/profile_sync_test_util.h
@@ -21,7 +21,7 @@
 #include "components/sync/driver/fake_sync_client.h"
 #include "components/sync/driver/sync_api_component_factory_mock.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
+#include "components/sync_sessions/mock_sync_sessions_client.h"
 
 namespace base {
 class Time;
@@ -150,7 +150,7 @@
     return &component_factory_;
   }
 
-  sync_sessions::FakeSyncSessionsClient* sync_sessions_client() {
+  sync_sessions::MockSyncSessionsClient* sync_sessions_client() {
     return &sync_sessions_client_;
   }
 
@@ -173,7 +173,8 @@
   FakeSigninManagerType signin_manager_;
   FakeProfileOAuth2TokenService auth_service_;
   syncer::SyncApiComponentFactoryMock component_factory_;
-  sync_sessions::FakeSyncSessionsClient sync_sessions_client_;
+  testing::NiceMock<sync_sessions::MockSyncSessionsClient>
+      sync_sessions_client_;
   invalidation::FakeInvalidationService fake_invalidation_service_;
   scoped_refptr<net::URLRequestContextGetter> url_request_context_;
   base::ScopedTempDir base_directory_;
diff --git a/components/browsing_data/core/BUILD.gn b/components/browsing_data/core/BUILD.gn
index c54f351d1..4e1a1b8e 100644
--- a/components/browsing_data/core/BUILD.gn
+++ b/components/browsing_data/core/BUILD.gn
@@ -23,6 +23,8 @@
     "counters/passwords_counter.h",
     "counters/sync_tracker.cc",
     "counters/sync_tracker.h",
+    "features.cc",
+    "features.h",
     "history_notice_utils.cc",
     "history_notice_utils.h",
     "pref_names.cc",
diff --git a/components/browsing_data/core/features.cc b/components/browsing_data/core/features.cc
new file mode 100644
index 0000000..0122426
--- /dev/null
+++ b/components/browsing_data/core/features.cc
@@ -0,0 +1,14 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/browsing_data/core/features.h"
+
+namespace browsing_data {
+namespace features {
+
+const base::Feature kRemoveNavigationHistory{"RemoveNavigationHistory",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+
+}  // namespace features
+}  // namespace browsing_data
diff --git a/components/browsing_data/core/features.h b/components/browsing_data/core/features.h
new file mode 100644
index 0000000..5ec27f3
--- /dev/null
+++ b/components/browsing_data/core/features.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_BROWSING_DATA_FEATURES_H_
+#define COMPONENTS_BROWSING_DATA_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace browsing_data {
+namespace features {
+
+// Enable propagation of history deletions to navigation history.
+extern const base::Feature kRemoveNavigationHistory;
+
+}  // namespace features
+}  // namespace browsing_data
+
+#endif  // COMPONENTS_BROWSING_DATA_FEATURES_H_
diff --git a/components/cbor/cbor_reader.cc b/components/cbor/cbor_reader.cc
index 3fdccaaa..1c63f85 100644
--- a/components/cbor/cbor_reader.cc
+++ b/components/cbor/cbor_reader.cc
@@ -281,9 +281,10 @@
 base::Optional<CBORValue> CBORReader::ReadArrayContent(
     const CBORReader::DataItemHeader& header,
     int max_nesting_level) {
-  int64_t length = base::checked_cast<int64_t>(header.value);
+  uint64_t length = header.value;
+
   CBORValue::ArrayValue cbor_array;
-  while (length-- > 0) {
+  for (uint64_t i = 0; i < length; ++i) {
     base::Optional<CBORValue> cbor_element =
         DecodeCompleteDataItem(max_nesting_level - 1);
     if (!cbor_element.has_value())
@@ -296,9 +297,10 @@
 base::Optional<CBORValue> CBORReader::ReadMapContent(
     const CBORReader::DataItemHeader& header,
     int max_nesting_level) {
-  int64_t length = base::checked_cast<int64_t>(header.value);
+  uint64_t length = header.value;
+
   CBORValue::MapValue cbor_map;
-  while (length-- > 0) {
+  for (uint64_t i = 0; i < length; ++i) {
     base::Optional<CBORValue> key =
         DecodeCompleteDataItem(max_nesting_level - 1);
     base::Optional<CBORValue> value =
diff --git a/components/cbor/cbor_reader_unittest.cc b/components/cbor/cbor_reader_unittest.cc
index dd8bbd8..277b428 100644
--- a/components/cbor/cbor_reader_unittest.cc
+++ b/components/cbor/cbor_reader_unittest.cc
@@ -1304,4 +1304,19 @@
   }
 }
 
+TEST(CBORReaderTest, TestSuperLongContentDontCrash) {
+  static const std::vector<uint8_t> kTestCases[] = {
+      // CBOR array of 0xffffffff length.
+      {0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+      // CBOR map of 0xffffffff pairs.
+      {0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+  };
+  for (const auto& test_case : kTestCases) {
+    CBORReader::DecoderError error_code;
+    base::Optional<CBORValue> cbor = CBORReader::Read(test_case, &error_code);
+    EXPECT_FALSE(cbor.has_value());
+    EXPECT_EQ(error_code, CBORReader::DecoderError::INCOMPLETE_CBOR_DATA);
+  }
+}
+
 }  // namespace cbor
diff --git a/components/content_view/BUILD.gn b/components/content_view/BUILD.gn
new file mode 100644
index 0000000..c50f552
--- /dev/null
+++ b/components/content_view/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("content_view_java") {
+  deps = [
+    "//base:base_java",
+    "//content/public/android:content_java",
+    "//ui/android:ui_java",
+  ]
+  java_files =
+      [ "java/src/org/chromium/components/content_view/ContentView.java" ]
+}
diff --git a/components/content_view/DEPS b/components/content_view/DEPS
new file mode 100644
index 0000000..f20cebbb
--- /dev/null
+++ b/components/content_view/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+  "-content/public/android/java",
+  "+content/public/android/java/src/org/chromium/content_public",
+
+  "+ui/android/java",
+]
diff --git a/components/content_view/OWNERS b/components/content_view/OWNERS
new file mode 100644
index 0000000..7bf23a78
--- /dev/null
+++ b/components/content_view/OWNERS
@@ -0,0 +1,6 @@
+boliu@chromium.org
+jinsukkim@chromium.org
+tedchoc@chromium.org
+
+# COMPONENT: Internals>Core
+# OS: Android
diff --git a/components/content_view/README b/components/content_view/README
new file mode 100644
index 0000000..e8196ae1
--- /dev/null
+++ b/components/content_view/README
@@ -0,0 +1,2 @@
+- ContentView exists in Android UI view hierarchy, and exposes various
+view functionality to content layer.
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentView.java b/components/content_view/java/src/org/chromium/components/content_view/ContentView.java
similarity index 98%
rename from content/public/android/java/src/org/chromium/content/browser/ContentView.java
rename to components/content_view/java/src/org/chromium/components/content_view/ContentView.java
index 8a387fa6..b12dbe37 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentView.java
+++ b/components/content_view/java/src/org/chromium/components/content_view/ContentView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.content.browser;
+package org.chromium.components.content_view;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -32,8 +32,8 @@
  * The containing view for {@link ContentViewCore} that exists in the Android UI hierarchy and
  * exposes the various {@link View} functionality to it.
  */
-public class ContentView extends FrameLayout
-        implements ContentViewCore.InternalAccessDelegate, SmartClipProvider {
+public class ContentView
+        extends FrameLayout implements ContentViewCore.InternalAccessDelegate, SmartClipProvider {
     private static final String TAG = "cr.ContentView";
 
     // Default value to signal that the ContentView's size need not be overridden.
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java b/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java
index 6c57b4f..a943c4a 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamBuilderImpl.java
@@ -126,6 +126,7 @@
         return this;
     }
 
+    @Override
     @SuppressLint("WrongConstant") // TODO(jbudorick): Remove this after rolling to the N SDK.
     public ExperimentalBidirectionalStream build() {
         return mCronetEngine.createBidirectionalStream(mUrl, mCallback, mExecutor, mHttpMethod,
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
index 92aa537..2b6424f 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
@@ -461,6 +461,7 @@
     @CalledByNative
     private void onStreamReady(final boolean requestHeadersSent) {
         postTaskToExecutor(new Runnable() {
+            @Override
             public void run() {
                 synchronized (mNativeStreamLock) {
                     if (isDoneLocked()) {
@@ -500,6 +501,7 @@
             return;
         }
         postTaskToExecutor(new Runnable() {
+            @Override
             public void run() {
                 synchronized (mNativeStreamLock) {
                     if (isDoneLocked()) {
@@ -574,6 +576,7 @@
         final UrlResponseInfo.HeaderBlock trailersBlock =
                 new UrlResponseInfoImpl.HeaderBlockImpl(headersListFromStrings(trailers));
         postTaskToExecutor(new Runnable() {
+            @Override
             public void run() {
                 synchronized (mNativeStreamLock) {
                     if (isDoneLocked()) {
@@ -614,6 +617,7 @@
     @CalledByNative
     private void onCanceled() {
         postTaskToExecutor(new Runnable() {
+            @Override
             public void run() {
                 try {
                     mCallback.onCanceled(CronetBidirectionalStream.this, mResponseInfo);
@@ -783,6 +787,7 @@
      */
     private void failWithException(final CronetException exception) {
         postTaskToExecutor(new Runnable() {
+            @Override
             public void run() {
                 failWithExceptionOnExecutor(exception);
             }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
index 1ad08c9..2d4d2b1 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
@@ -136,90 +136,108 @@
     }
 
     @Nullable
+    @Override
     public Date getRequestStart() {
         return toDate(mRequestStartMs);
     }
 
     @Nullable
+    @Override
     public Date getDnsStart() {
         return toDate(mDnsStartMs);
     }
 
     @Nullable
+    @Override
     public Date getDnsEnd() {
         return toDate(mDnsEndMs);
     }
 
     @Nullable
+    @Override
     public Date getConnectStart() {
         return toDate(mConnectStartMs);
     }
 
     @Nullable
+    @Override
     public Date getConnectEnd() {
         return toDate(mConnectEndMs);
     }
 
     @Nullable
+    @Override
     public Date getSslStart() {
         return toDate(mSslStartMs);
     }
 
     @Nullable
+    @Override
     public Date getSslEnd() {
         return toDate(mSslEndMs);
     }
 
     @Nullable
+    @Override
     public Date getSendingStart() {
         return toDate(mSendingStartMs);
     }
 
     @Nullable
+    @Override
     public Date getSendingEnd() {
         return toDate(mSendingEndMs);
     }
 
     @Nullable
+    @Override
     public Date getPushStart() {
         return toDate(mPushStartMs);
     }
 
     @Nullable
+    @Override
     public Date getPushEnd() {
         return toDate(mPushEndMs);
     }
 
     @Nullable
+    @Override
     public Date getResponseStart() {
         return toDate(mResponseStartMs);
     }
 
     @Nullable
+    @Override
     public Date getRequestEnd() {
         return toDate(mRequestEndMs);
     }
 
+    @Override
     public boolean getSocketReused() {
         return mSocketReused;
     }
 
     @Nullable
+    @Override
     public Long getTtfbMs() {
         return mTtfbMs;
     }
 
     @Nullable
+    @Override
     public Long getTotalTimeMs() {
         return mTotalTimeMs;
     }
 
     @Nullable
+    @Override
     public Long getSentByteCount() {
         return mSentByteCount;
     }
 
     @Nullable
+    @Override
     public Long getReceivedByteCount() {
         return mReceivedByteCount;
     }
diff --git a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java
index fd2128e0c..335e8389 100644
--- a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java
+++ b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java
@@ -83,6 +83,7 @@
             final String url = info.getUrl();
             final String text = "Completed " + url + " (" + info.getHttpStatusCode() + ")";
             CronetSampleActivity.this.runOnUiThread(new Runnable() {
+                @Override
                 public void run() {
                     mResultText.setText(text);
                     mReceiveDataText.setText(receivedData);
@@ -98,6 +99,7 @@
             final String url = mUrl;
             final String text = "Failed " + mUrl + " (" + error.getMessage() + ")";
             CronetSampleActivity.this.runOnUiThread(new Runnable() {
+                @Override
                 public void run() {
                     mResultText.setText(text);
                     promptForURL(url);
@@ -140,6 +142,7 @@
         alert.setView(alertView);
 
         alert.setPositiveButton("Load", new DialogInterface.OnClickListener() {
+            @Override
             public void onClick(DialogInterface dialog, int button) {
                 String url = urlInput.getText().toString();
                 String postData = postInput.getText().toString();
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
index 4437c2b..4aedb07 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestContextTest.java
@@ -1239,6 +1239,7 @@
         // Fetch deltas on a different thread the second time to make sure this is permitted.
         // See crbug.com/719448
         FutureTask<byte[]> task = new FutureTask<byte[]>(new Callable<byte[]>() {
+            @Override
             public byte[] call() {
                 return testFramework.mCronetEngine.getGlobalMetricsDeltas();
             }
@@ -1280,6 +1281,7 @@
     private static class TestBadLibraryLoader extends CronetEngine.Builder.LibraryLoader {
         private boolean mWasCalled = false;
 
+        @Override
         public void loadLibrary(String libName) {
             // Report that this method was called, but don't load the library
             mWasCalled = true;
@@ -1329,16 +1331,19 @@
         final ConditionVariable otherThreadDone = new ConditionVariable();
         final ConditionVariable uiThreadDone = new ConditionVariable();
         new Handler(Looper.getMainLooper()).post(new Runnable() {
+            @Override
             public void run() {
                 final ExperimentalCronetEngine.Builder builder =
                         new ExperimentalCronetEngine.Builder(getContext());
                 new Thread() {
+                    @Override
                     public void run() {
                         CronetEngine cronetEngine = builder.build();
                         otherThreadDone.open();
                         cronetEngine.shutdown();
                     }
-                }.start();
+                }
+                        .start();
                 otherThreadDone.block();
                 builder.build().shutdown();
                 uiThreadDone.open();
@@ -1410,6 +1415,7 @@
      */
     private int getThreadPriority(CronetEngine engine) throws Exception {
         FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
+            @Override
             public Integer call() {
                 return Process.getThreadPriority(Process.myTid());
             }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
index 93d2a78..fab4c363 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestBidirectionalStreamCallback.java
@@ -74,6 +74,7 @@
     private final DirectExecutor mDirectExecutor;
 
     private class ExecutorThreadFactory implements ThreadFactory {
+        @Override
         public Thread newThread(Runnable r) {
             mExecutorThread = new Thread(r);
             return mExecutorThread;
@@ -388,6 +389,7 @@
             throw new IllegalStateException("Callback Exception.");
         }
         Runnable task = new Runnable() {
+            @Override
             public void run() {
                 stream.cancel();
             }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
index c85faa3..a5e1bfa3 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
@@ -172,6 +172,7 @@
         }
     }
 
+    @Override
     public void rewind(final UploadDataSink uploadDataSink) throws IOException {
         ++mNumRewindCalls;
         if (mClosed.get()) {
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
index 3b65a61..be9f3760 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
@@ -72,6 +72,7 @@
     private int mBufferPositionBeforeRead;
 
     private class ExecutorThreadFactory implements ThreadFactory {
+        @Override
         public Thread newThread(final Runnable r) {
             mExecutorThread = new Thread(new Runnable() {
                 @Override
@@ -327,6 +328,7 @@
             throw new IllegalStateException("Listener Exception.");
         }
         Runnable task = new Runnable() {
+            @Override
             public void run() {
                 request.cancel();
             }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/MessageLoopTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/MessageLoopTest.java
index 9e0dee2..8d1938b 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/MessageLoopTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/MessageLoopTest.java
@@ -37,6 +37,7 @@
     private final ExecutorService mExecutorService =
             Executors.newSingleThreadExecutor(new ExecutorThreadFactory());
     private class ExecutorThreadFactory implements ThreadFactory {
+        @Override
         public Thread newThread(Runnable r) {
             mTestThread = new Thread(r);
             return mTestThread;
diff --git a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
index 5b3af3f..77f3d62 100644
--- a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
+++ b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
@@ -133,7 +133,7 @@
             mBlock.block();
         }
 
-
+        @Override
         public void run() {
             try {
                 // Configure the server.
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index 093e710..1c53208f 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -58,6 +58,7 @@
 const char kQuicMaxIdleTimeBeforeCryptoHandshakeSeconds[] =
     "max_idle_time_before_crypto_handshake_seconds";
 const char kQuicCloseSessionsOnIpChange[] = "close_sessions_on_ip_change";
+const char kQuicAllowServerMigration[] = "allow_server_migration";
 const char kQuicMigrateSessionsOnNetworkChange[] =
     "migrate_sessions_on_network_change";
 const char kQuicMigrateSessionsOnNetworkChangeV2[] =
@@ -300,6 +301,13 @@
             quic_close_sessions_on_ip_change;
       }
 
+      bool quic_allow_server_migration = false;
+      if (quic_args->GetBoolean(kQuicAllowServerMigration,
+                                &quic_allow_server_migration)) {
+        session_params->quic_allow_server_migration =
+            quic_allow_server_migration;
+      }
+
       bool quic_migrate_sessions_on_network_change = false;
       if (quic_args->GetBoolean(kQuicMigrateSessionsOnNetworkChange,
                                 &quic_migrate_sessions_on_network_change)) {
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 5174b6f..dda4d870 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -98,6 +98,7 @@
   EXPECT_EQ(300, params->quic_idle_connection_timeout_seconds);
 
   EXPECT_TRUE(params->quic_close_sessions_on_ip_change);
+  EXPECT_FALSE(params->quic_allow_server_migration);
   EXPECT_FALSE(params->quic_migrate_sessions_on_network_change);
   EXPECT_FALSE(params->quic_migrate_sessions_on_network_change_v2);
   EXPECT_FALSE(params->quic_migrate_sessions_early_v2);
@@ -126,6 +127,58 @@
                          info, &addresses, net::NetLogWithSource()));
 }
 
+TEST(URLRequestContextConfigTest, SetQuicServerMigrationOptions) {
+  base::test::ScopedTaskEnvironment scoped_task_environment_(
+      base::test::ScopedTaskEnvironment::MainThreadType::IO);
+
+  URLRequestContextConfig config(
+      // Enable QUIC.
+      true,
+      // QUIC User Agent ID.
+      "Default QUIC User Agent ID",
+      // Enable SPDY.
+      true,
+      // Enable Brotli.
+      false,
+      // Type of http cache.
+      URLRequestContextConfig::HttpCacheType::DISK,
+      // Max size of http cache in bytes.
+      1024000,
+      // Disable caching for HTTP responses. Other information may be stored in
+      // the cache.
+      false,
+      // Storage path for http cache and cookie storage.
+      "/data/data/org.chromium.net/app_cronet_test/test_storage",
+      // Accept-Language request header field.
+      "foreign-language",
+      // User-Agent request header field.
+      "fake agent",
+      // JSON encoded experimental options.
+      "{\"QUIC\":{\"allow_server_migration\":true}}",
+      // MockCertVerifier to use for testing purposes.
+      std::unique_ptr<net::CertVerifier>(),
+      // Enable network quality estimator.
+      false,
+      // Enable Public Key Pinning bypass for local trust anchors.
+      true,
+      // Certificate verifier cache data.
+      "");
+
+  net::URLRequestContextBuilder builder;
+  net::NetLog net_log;
+  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  // Set a ProxyConfigService to avoid DCHECK failure when building.
+  builder.set_proxy_config_service(
+      std::make_unique<net::ProxyConfigServiceFixed>(
+          net::ProxyConfig::CreateDirect()));
+  std::unique_ptr<net::URLRequestContext> context(builder.Build());
+  const net::HttpNetworkSession::Params* params =
+      context->GetNetworkSessionParams();
+
+  EXPECT_FALSE(params->quic_close_sessions_on_ip_change);
+  EXPECT_TRUE(params->quic_allow_server_migration);
+}
+
 TEST(URLRequestContextConfigTest, SetQuicConnectionMigrationOptions) {
   base::test::ScopedTaskEnvironment scoped_task_environment_(
       base::test::ScopedTaskEnvironment::MainThreadType::IO);
diff --git a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc
index a6fefc7..448c71b 100644
--- a/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc
+++ b/components/dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/callback.h"
+#include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/path_service.h"
@@ -18,6 +19,7 @@
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/shell/browser/shell.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -100,6 +102,16 @@
 };
 
 IN_PROC_BROWSER_TEST_F(DomDistillerJsTest, RunJsTests) {
+  // TODO(jaebaek): Revisit this code when the --use-zoom-for-dsf feature on
+  // Android is done. If we remove this code (i.e., enable --use-zoom-for-dsf),
+  // HTMLImageElement::LayoutBoxWidth() returns a value that has a small error
+  // from the real one (i.e., the real is 38, but it returns 37) and it results
+  // in the failure of
+  // EmbedExtractorTest.testImageExtractorWithAttributesCSSHeightCM (See
+  // crrev.com/c/916021). We must solve this precision issue.
+  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+      switches::kEnableUseZoomForDSF, "false");
+
   // Load the test file in content shell and wait until it has fully loaded.
   content::WebContents* web_contents = shell()->web_contents();
   dom_distiller::WebContentsMainFrameObserver::CreateForWebContents(
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn
index 39c933c..9e5a97c 100644
--- a/components/download/internal/common/BUILD.gn
+++ b/components/download/internal/common/BUILD.gn
@@ -10,6 +10,7 @@
   ]
 
   sources = [
+    "download_create_info.cc",
     "download_interrupt_reasons_impl.cc",
     "download_utils.cc",
     "rate_estimator.cc",
@@ -17,6 +18,7 @@
 
   deps = [
     "//base",
+    "//net",
   ]
 }
 
diff --git a/components/download/internal/common/DEPS b/components/download/internal/common/DEPS
index 74c3f3e6..d4f127a 100644
--- a/components/download/internal/common/DEPS
+++ b/components/download/internal/common/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "-content",
   "+components/download/public/common",
+  "+net/http/http_response_headers.h",
 ]
diff --git a/content/browser/download/download_create_info.cc b/components/download/internal/common/download_create_info.cc
similarity index 70%
rename from content/browser/download/download_create_info.cc
rename to components/download/internal/common/download_create_info.cc
index a2c42a2..eb4a1ca 100644
--- a/content/browser/download/download_create_info.cc
+++ b/components/download/internal/common/download_create_info.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 "content/browser/download/download_create_info.h"
+#include "components/download/public/common/download_create_info.h"
 
 #include <string>
 
@@ -11,27 +11,29 @@
 #include "base/strings/stringprintf.h"
 #include "net/http/http_response_headers.h"
 
-namespace content {
+namespace download {
 
 DownloadCreateInfo::DownloadCreateInfo(
     const base::Time& start_time,
-    std::unique_ptr<download::DownloadSaveInfo> save_info)
-    : download_id(download::DownloadItem::kInvalidId),
+    std::unique_ptr<DownloadSaveInfo> save_info)
+    : download_id(DownloadItem::kInvalidId),
       start_time(start_time),
       total_bytes(0),
       offset(0),
       has_user_gesture(false),
       transient(false),
-      result(download::DOWNLOAD_INTERRUPT_REASON_NONE),
+      result(DOWNLOAD_INTERRUPT_REASON_NONE),
       save_info(std::move(save_info)),
+      render_process_id(-1),
+      render_frame_id(-1),
       accept_range(false),
       connection_info(net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN),
       method("GET"),
       ukm_source_id(ukm::kInvalidSourceId) {}
 
 DownloadCreateInfo::DownloadCreateInfo()
-    : DownloadCreateInfo(base::Time(),
-                         base::WrapUnique(new download::DownloadSaveInfo)) {}
+    : DownloadCreateInfo(base::Time(), base::WrapUnique(new DownloadSaveInfo)) {
+}
 
 DownloadCreateInfo::~DownloadCreateInfo() {}
 
@@ -39,4 +41,4 @@
   return url_chain.empty() ? GURL::EmptyGURL() : url_chain.back();
 }
 
-}  // namespace content
+}  // namespace download
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn
index 46139b8..2fafc41 100644
--- a/components/download/public/common/BUILD.gn
+++ b/components/download/public/common/BUILD.gn
@@ -16,10 +16,12 @@
 component("public") {
   sources = [
     "download_content.h",
+    "download_create_info.h",
     "download_danger_type.h",
     "download_interrupt_reason_values.h",
     "download_interrupt_reasons.h",
     "download_item.h",
+    "download_request_handle_interface.h",
     "download_save_info.cc",
     "download_save_info.h",
     "download_source.h",
@@ -40,6 +42,7 @@
     "//components/download/internal/common:internal",
     "//crypto",
     "//net",
+    "//services/metrics/public/cpp:metrics_cpp",
     "//services/network/public/cpp",
     "//storage/browser",
     "//ui/base",
diff --git a/components/download/public/common/DEPS b/components/download/public/common/DEPS
index 6ad4edd..044a6af 100644
--- a/components/download/public/common/DEPS
+++ b/components/download/public/common/DEPS
@@ -1,9 +1,11 @@
 include_rules = [
   "+crypto",
+  "+net/http/http_response_info.h",
   "+net/url_request/url_request.h",
   # TODO(qinmin): remove this once network service is enabled.
   "+net/url_request/url_request_context_getter.h",
   "+net/traffic_annotation/network_traffic_annotation.h",
+  "+services/metrics/public/cpp",
   "+services/network/public/cpp",
   "+storage/browser",
   "+ui/base",
diff --git a/content/browser/download/download_create_info.h b/components/download/public/common/download_create_info.h
similarity index 83%
rename from content/browser/download/download_create_info.h
rename to components/download/public/common/download_create_info.h
index 713e0cee..c17299f 100644
--- a/content/browser/download/download_create_info.h
+++ b/components/download/public/common/download_create_info.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 CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_CREATE_INFO_H_
-#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_CREATE_INFO_H_
+#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_
 
 #include <stdint.h>
 
@@ -15,11 +15,12 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "base/time/time.h"
+#include "components/download/public/common/download_export.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_item.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/download_save_info.h"
 #include "components/download/public/common/download_source.h"
-#include "content/browser/download/download_request_handle.h"
-#include "content/common/content_export.h"
 #include "net/http/http_response_info.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/base/page_transition_types.h"
@@ -29,13 +30,13 @@
 class HttpResponseHeaders;
 }
 
-namespace content {
+namespace download {
 
 // Used for informing the download manager of a new download, since we don't
 // want to pass |DownloadItem|s between threads.
-struct CONTENT_EXPORT DownloadCreateInfo {
+struct COMPONENTS_DOWNLOAD_EXPORT DownloadCreateInfo {
   DownloadCreateInfo(const base::Time& start_time,
-                     std::unique_ptr<download::DownloadSaveInfo> save_info);
+                     std::unique_ptr<DownloadSaveInfo> save_info);
   DownloadCreateInfo();
   ~DownloadCreateInfo();
 
@@ -96,12 +97,19 @@
   // If the download is initially created in an interrupted state (because the
   // response was in error), then |result| would be something other than
   // INTERRUPT_REASON_NONE.
-  download::DownloadInterruptReason result;
+  DownloadInterruptReason result;
 
   // The download file save info.
-  std::unique_ptr<download::DownloadSaveInfo> save_info;
+  std::unique_ptr<DownloadSaveInfo> save_info;
+
+  // The render process id that initiates this download.
+  int render_process_id;
+
+  // The render frame id that initiates this download.
+  int render_frame_id;
 
   // The handle to the URLRequest sourcing this download.
+  // TODO(qinmin): remove this when network service is fully enabled.
   std::unique_ptr<DownloadRequestHandleInterface> request_handle;
 
   // ---------------------------------------------------------------------------
@@ -151,12 +159,12 @@
   std::string request_origin;
 
   // Source of the download, used in metrics.
-  download::DownloadSource download_source = download::DownloadSource::UNKNOWN;
+  DownloadSource download_source = DownloadSource::UNKNOWN;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DownloadCreateInfo);
 };
 
-}  // namespace content
+}  // namespace download
 
-#endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_CREATE_INFO_H_
+#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_
diff --git a/components/download/public/common/download_request_handle_interface.h b/components/download/public/common/download_request_handle_interface.h
new file mode 100644
index 0000000..31678df4
--- /dev/null
+++ b/components/download/public/common/download_request_handle_interface.h
@@ -0,0 +1,29 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_REQUEST_HANDLE_INTERFACE_H_
+#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_REQUEST_HANDLE_INTERFACE_H_
+
+#include "base/compiler_specific.h"
+#include "base/memory/weak_ptr.h"
+#include "components/download/public/common/download_export.h"
+
+namespace download {
+
+// A handle used by the download system for operations on the network request.
+class COMPONENTS_DOWNLOAD_EXPORT DownloadRequestHandleInterface {
+ public:
+  virtual ~DownloadRequestHandleInterface() = default;
+
+  // Pauses or resumes the network request.
+  virtual void PauseRequest() = 0;
+  virtual void ResumeRequest() = 0;
+
+  // Cancels the request.
+  virtual void CancelRequest(bool user_cancel) = 0;
+};
+
+}  // namespace download
+
+#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_REQUEST_HANDLE_INTERFACE_H_
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h
index 4943eee..2a99697 100644
--- a/components/infobars/core/infobar_delegate.h
+++ b/components/infobars/core/infobar_delegate.h
@@ -148,7 +148,7 @@
     FRAMEBUST_BLOCK_INFOBAR_ANDROID = 77,
     SURVEY_INFOBAR_ANDROID = 78,
     NEAR_OOM_INFOBAR_ANDROID = 79,
-    PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID = 80,
+    INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE = 80,
   };
 
   // Describes navigation events, used to decide whether infobars should be
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc
index f5fbf34..b322e03 100644
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc
@@ -347,7 +347,7 @@
   // origin checking logic that may get confused if service workers respond with
   // resources from another origin.
   // https://w3c.github.io/ServiceWorker/#implementer-concerns
-  request.SetServiceWorkerMode(blink::WebURLRequest::ServiceWorkerMode::kNone);
+  request.SetSkipServiceWorker(true);
 
   return request;
 }
@@ -1042,8 +1042,7 @@
 
   // Requests from plug-ins must skip service workers, see the comment in
   // CreateWebURLRequest.
-  DCHECK_EQ(request.GetServiceWorkerMode(),
-            blink::WebURLRequest::ServiceWorkerMode::kNone);
+  DCHECK(request.GetSkipServiceWorker());
 
   // ManifestDownloader deletes itself after invoking the callback.
   ManifestDownloader* manifest_downloader = new ManifestDownloader(
diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc
index abf8b98..87dbb7d 100644
--- a/components/network_session_configurator/common/network_features.cc
+++ b/components/network_session_configurator/common/network_features.cc
@@ -9,4 +9,7 @@
 const base::Feature kTokenBinding{"token-binding",
                                   base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kDnsOverHttps{"dns-over-https",
+                                  base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h
index dbcc98c..6d92c7a 100644
--- a/components/network_session_configurator/common/network_features.h
+++ b/components/network_session_configurator/common/network_features.h
@@ -14,6 +14,10 @@
 // (https://www.ietf.org/id/draft-ietf-tokbind-protocol-04.txt).
 NETWORK_SESSION_CONFIGURATOR_EXPORT extern const base::Feature kTokenBinding;
 
+// Enabled DNS over HTTPS
+// (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt).
+NETWORK_SESSION_CONFIGURATOR_EXPORT extern const base::Feature kDnsOverHttps;
+
 }  // namespace features
 
 #endif  // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_
diff --git a/components/omnibox/browser/contextual_suggestions_service.cc b/components/omnibox/browser/contextual_suggestions_service.cc
index 5c0c945..eae95a9 100644
--- a/components/omnibox/browser/contextual_suggestions_service.cc
+++ b/components/omnibox/browser/contextual_suggestions_service.cc
@@ -57,9 +57,8 @@
 //
 //     urls: {
 //       url : <current_url>
-//       // timestamp_usec is the timestamp for the page visit time.
-//       // It is actually in *milliseconds* since the Unix epoch, not
-//       // microseconds (as the name would have you believe).
+//       // timestamp_usec is the timestamp for the page visit time, measured
+//       // in microseconds since the Unix epoch.
 //       timestamp_usec: <visit_time>
 //     }
 //     // stream_type = 1 corresponds to zero suggest suggestions.
@@ -73,12 +72,9 @@
   auto url_list = std::make_unique<base::ListValue>();
   auto url_entry = std::make_unique<base::DictionaryValue>();
   url_entry->SetString("url", current_url);
-  // Warning: syncer::TimeToProtoTime() generates the timestamp in
-  // *milliseconds* since the Unix epoch.  Labeling the parameter as usec is
-  // wrong.  However, live clients are already sending this parameter, so
-  // it's worth attempting to correct it so the semantics are right.
-  url_entry->SetString("timestamp_usec",
-                       std::to_string(syncer::TimeToProtoTime(visit_time)));
+  url_entry->SetString(
+      "timestamp_usec",
+      std::to_string((visit_time - base::Time::UnixEpoch()).InMicroseconds()));
   url_list->Append(std::move(url_entry));
   request->Set("urls", std::move(url_list));
   // stream_type = 1 corresponds to zero suggest suggestions.
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc
index 70a99cee..02ee67f 100644
--- a/components/omnibox/browser/omnibox_edit_model.cc
+++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -342,7 +342,7 @@
   *url_from_text = match_from_text.destination_url;
 
   GURL current_page_url = PermanentURL();
-  if (PopupIsOpen() && user_input_in_progress_) {
+  if (PopupIsOpen()) {
     AutocompleteMatch current_match = CurrentMatch(nullptr);
     if (!AutocompleteMatch::IsSearchType(current_match.type) &&
         current_match.destination_url.is_valid()) {
diff --git a/components/password_manager/core/browser/export/password_manager_exporter.cc b/components/password_manager/core/browser/export/password_manager_exporter.cc
index 44858773..687564e 100644
--- a/components/password_manager/core/browser/export/password_manager_exporter.cc
+++ b/components/password_manager/core/browser/export/password_manager_exporter.cc
@@ -10,6 +10,7 @@
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task_runner_util.h"
+#include "base/task_scheduler/lazy_task_runner.h"
 #include "base/task_scheduler/post_task.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/export/password_csv_writer.h"
@@ -18,6 +19,16 @@
 
 namespace {
 
+// Multiple exports should be queued in sequence. This helps avoid race
+// conditions where there are multiple simultaneous exports to the same
+// destination and one of them was cancelled and will delete the file. We use
+// TaskPriority::USER_VISIBLE, because a busy UI is displayed while the
+// passwords are being exported.
+base::LazySingleThreadTaskRunner g_task_runner =
+    LAZY_SINGLE_THREAD_TASK_RUNNER_INITIALIZER(
+        base::TaskTraits(base::MayBlock(), base::TaskPriority::USER_VISIBLE),
+        base::SingleThreadTaskRunnerThreadMode::SHARED);
+
 // A wrapper for |write_function|, which can be bound and keep a copy of its
 // data on the closure.
 bool Write(int (*write_function)(const base::FilePath& filename,
@@ -44,13 +55,14 @@
       on_progress_(std::move(on_progress)),
       last_progress_status_(ExportProgressStatus::NOT_STARTED),
       write_function_(&base::WriteFile),
-      task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::TaskPriority::USER_VISIBLE, base::MayBlock()})),
+      delete_function_(base::BindRepeating(&base::DeleteFile)),
+      task_runner_(g_task_runner.Get()),
       weak_factory_(this) {}
 
 PasswordManagerExporter::~PasswordManagerExporter() {}
 
 void PasswordManagerExporter::PreparePasswordsForExport() {
+  DCHECK_EQ(GetProgressStatus(), ExportProgressStatus::NOT_STARTED);
   export_preparation_started_ = base::Time::Now();
 
   std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
@@ -67,6 +79,8 @@
 
 void PasswordManagerExporter::SetDestination(
     const base::FilePath& destination) {
+  DCHECK_EQ(GetProgressStatus(), ExportProgressStatus::NOT_STARTED);
+
   destination_ = destination;
 
   if (IsReadyForExport())
@@ -92,12 +106,21 @@
   // Tasks which had their pointers invalidated won't run.
   weak_factory_.InvalidateWeakPtrs();
 
-  destination_.clear();
-  serialised_password_list_.clear();
-  password_count_ = 0;
-
+  // If we are currently still serialising, Export() will see the cancellation
+  // status and won't schedule writing.
   OnProgress(ExportProgressStatus::FAILED_CANCELLED, std::string());
 
+  // If we are currently writing to the disk, we will have to cleanup the file
+  // once writing stops.
+  if (!destination_.empty()) {
+    task_runner_->PostTask(FROM_HERE,
+                           base::BindOnce(base::IgnoreResult(delete_function_),
+                                          destination_, false));
+  }
+
+  // TODO(crbug.com/789561) If the passwords have already been written to the
+  // disk, then we've already recorded ExportPasswordsResult::SUCCESS. Ideally,
+  // we should make different results mutually exclusive.
   UMA_HISTOGRAM_ENUMERATION("PasswordManager.ExportPasswordsToCSVResult",
                             ExportPasswordsResult::USER_ABORTED,
                             ExportPasswordsResult::COUNT);
@@ -115,28 +138,32 @@
   write_function_ = write_function;
 }
 
+void PasswordManagerExporter::SetDeleteForTesting(
+    DeleteCallback delete_callback) {
+  delete_function_ = delete_callback;
+}
+
 bool PasswordManagerExporter::IsReadyForExport() {
   return !destination_.empty() && !serialised_password_list_.empty();
 }
 
 void PasswordManagerExporter::Export() {
-  base::FilePath destination_copy_(destination_);
+  // If cancelling was requested while we were serialising the passwords, don't
+  // write anything to the disk.
+  if (GetProgressStatus() == ExportProgressStatus::FAILED_CANCELLED) {
+    serialised_password_list_.clear();
+    return;
+  }
+
   base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE,
-      base::BindOnce(::Write, write_function_, std::move(destination_copy_),
+      base::BindOnce(::Write, write_function_, destination_,
                      std::move(serialised_password_list_)),
       base::BindOnce(&PasswordManagerExporter::OnPasswordsExported,
-                     weak_factory_.GetWeakPtr(), std::move(destination_),
-                     password_count_));
-
-  destination_.clear();
-  serialised_password_list_.clear();
-  password_count_ = 0;
+                     weak_factory_.GetWeakPtr()));
 }
 
 void PasswordManagerExporter::OnPasswordsExported(
-    const base::FilePath& destination,
-    int count,
     bool success) {
   if (success) {
     OnProgress(ExportProgressStatus::SUCCEEDED, std::string());
@@ -145,10 +172,10 @@
                               ExportPasswordsResult::SUCCESS,
                               ExportPasswordsResult::COUNT);
     UMA_HISTOGRAM_COUNTS("PasswordManager.ExportedPasswordsPerUserInCSV",
-                         count);
+                         password_count_);
   } else {
     OnProgress(ExportProgressStatus::FAILED_WRITE_FAILED,
-               destination.DirName().BaseName().AsUTF8Unsafe());
+               destination_.DirName().BaseName().AsUTF8Unsafe());
 
     UMA_HISTOGRAM_ENUMERATION("PasswordManager.ExportPasswordsToCSVResult",
                               ExportPasswordsResult::WRITE_FAILED,
diff --git a/components/password_manager/core/browser/export/password_manager_exporter.h b/components/password_manager/core/browser/export/password_manager_exporter.h
index a14ebe4..3885334 100644
--- a/components/password_manager/core/browser/export/password_manager_exporter.h
+++ b/components/password_manager/core/browser/export/password_manager_exporter.h
@@ -20,14 +20,17 @@
 
 class CredentialProviderInterface;
 
-// Controls the exporting of passwords. PasswordManagerExporter will perform
-// the export asynchrnously as soon as all the required info is available
-// (password list and destination), unless canceled.
+// Controls the exporting of passwords. One instance per export flow.
+// PasswordManagerExporter will perform the export asynchronously as soon as all
+// the required info is available (password list and destination), unless
+// canceled.
 class PasswordManagerExporter {
  public:
   using ProgressCallback =
       base::RepeatingCallback<void(password_manager::ExportProgressStatus,
                                    const std::string&)>;
+  using DeleteCallback =
+      base::RepeatingCallback<bool(const base::FilePath&, bool)>;
 
   explicit PasswordManagerExporter(
       password_manager::CredentialProviderInterface*
@@ -39,10 +42,11 @@
   virtual void PreparePasswordsForExport();
 
   // Set the destination, where the passwords will be written when they are
-  // ready.
+  // ready. This is expected to be called after PreparePasswordsForExport().
   virtual void SetDestination(const base::FilePath& destination);
 
-  // Best-effort canceling of any on-going task related to exporting.
+  // Cancel any pending exporting tasks and clear the file, if it was written
+  // to the disk.
   virtual void Cancel();
 
   // Returns the most recent ExportProgressStatus value, as would have been
@@ -55,6 +59,10 @@
                                                 const char* data,
                                                 int size));
 
+  // Replace the function which writes to the filesystem with a custom action.
+  // The return value is true when deleting successfully.
+  void SetDeleteForTesting(DeleteCallback delete_callback);
+
  private:
   // Caches the serialised password list. It proceeds to export, if all the
   // parts are ready. |count| is the number of passwords which were serialised.
@@ -72,9 +80,7 @@
   // the UI and to metrics. |destination| is the folder we wrote to. |count| is
   // the number of passwords exported. |success| is whether they were actually
   // written.
-  void OnPasswordsExported(const base::FilePath& destination,
-                           int count,
-                           bool success);
+  void OnPasswordsExported(bool success);
 
   // Wrapper for the |on_progress_| callback, which caches |status|, so that
   // it can be provided by GetProgressStatus.
@@ -108,6 +114,10 @@
                          const char* data,
                          int size);
 
+  // The function which does the actual deleting of a file. It should wrap
+  // base::DeleteFile, unless it's changed for testing purposes.
+  DeleteCallback delete_function_;
+
   // |task_runner_| is used for time-consuming tasks during exporting. The tasks
   // will dereference a WeakPtr to |*this|, which means they all need to run on
   // the same sequence.
diff --git a/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc b/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc
index 19e67562..0976d86a 100644
--- a/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc
+++ b/components/password_manager/core/browser/export/password_manager_exporter_unittest.cc
@@ -38,6 +38,8 @@
 // A callback that matches the signature of base::WriteFile
 using WriteCallback =
     base::RepeatingCallback<int(const base::FilePath&, const char*, int)>;
+using DeleteCallback =
+    password_manager::PasswordManagerExporter::DeleteCallback;
 
 #if defined(OS_WIN)
 const base::FilePath::CharType kNullFileName[] = FILE_PATH_LITERAL("/nul");
@@ -108,6 +110,7 @@
         destination_path_(kNullFileName) {
     g_write_callback = &mock_write_file_;
     exporter_.SetWriteForTesting(&WriteFunction);
+    exporter_.SetDeleteForTesting(mock_delete_file_.Get());
   }
 
   ~PasswordManagerExporterTest() override { g_write_callback = nullptr; }
@@ -120,6 +123,7 @@
       mock_on_progress_;
   password_manager::PasswordManagerExporter exporter_;
   StrictMock<base::MockCallback<WriteCallback>> mock_write_file_;
+  StrictMock<base::MockCallback<DeleteCallback>> mock_delete_file_;
   base::FilePath destination_path_;
   base::HistogramTester histogram_tester_;
 
@@ -127,7 +131,7 @@
   DISALLOW_COPY_AND_ASSIGN(PasswordManagerExporterTest);
 };
 
-TEST_F(PasswordManagerExporterTest, PasswordExportSetPasswordListFirst) {
+TEST_F(PasswordManagerExporterTest, SuccessfulExport) {
   std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
       CreatePasswordList();
   fake_credential_provider_.SetPasswordList(password_list);
@@ -157,36 +161,6 @@
       ExportPasswordsResult::SUCCESS, 1);
 }
 
-TEST_F(PasswordManagerExporterTest, PasswordExportSetDestinationFirst) {
-  std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
-      CreatePasswordList();
-  fake_credential_provider_.SetPasswordList(password_list);
-  const std::string serialised(
-      password_manager::PasswordCSVWriter::SerializePasswords(password_list));
-
-  EXPECT_CALL(mock_write_file_,
-              Run(destination_path_, StrEq(serialised), serialised.size()))
-      .WillOnce(ReturnArg<2>());
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::IN_PROGRESS, IsEmpty()));
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::SUCCEEDED, IsEmpty()));
-
-  exporter_.SetDestination(destination_path_);
-  exporter_.PreparePasswordsForExport();
-
-  scoped_task_environment_.RunUntilIdle();
-  histogram_tester_.ExpectUniqueSample(
-      "PasswordManager.ExportedPasswordsPerUserInCSV", password_list.size(), 1);
-  histogram_tester_.ExpectTotalCount(
-      "PasswordManager.TimeReadingExportedPasswords", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "PasswordManager.ExportPasswordsToCSVResult",
-      ExportPasswordsResult::SUCCESS, 1);
-}
-
 TEST_F(PasswordManagerExporterTest, WriteFileFailed) {
   std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
       CreatePasswordList();
@@ -202,8 +176,8 @@
               Run(password_manager::ExportProgressStatus::FAILED_WRITE_FAILED,
                   StrEq(destination_folder_name)));
 
-  exporter_.SetDestination(destination_path_);
   exporter_.PreparePasswordsForExport();
+  exporter_.SetDestination(destination_path_);
 
   scoped_task_environment_.RunUntilIdle();
   histogram_tester_.ExpectTotalCount(
@@ -232,8 +206,8 @@
   EXPECT_CALL(mock_on_progress_, Run(_, _)).WillRepeatedly(SaveArg<0>(&status));
 
   ASSERT_EQ(exporter_.GetProgressStatus(), status);
-  exporter_.SetDestination(destination_path_);
   exporter_.PreparePasswordsForExport();
+  exporter_.SetDestination(destination_path_);
   ASSERT_EQ(exporter_.GetProgressStatus(), status);
 
   scoped_task_environment_.RunUntilIdle();
@@ -270,13 +244,9 @@
   EXPECT_CALL(
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::FAILED_CANCELLED, IsEmpty()));
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::IN_PROGRESS, IsEmpty()));
 
   exporter_.PreparePasswordsForExport();
   exporter_.Cancel();
-  exporter_.SetDestination(destination_path_);
 
   scoped_task_environment_.RunUntilIdle();
   histogram_tester_.ExpectTotalCount(
@@ -286,12 +256,13 @@
       ExportPasswordsResult::USER_ABORTED, 1);
 }
 
-TEST_F(PasswordManagerExporterTest, CancelAfterDestination) {
+TEST_F(PasswordManagerExporterTest, CancelWhileExporting) {
   std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
       CreatePasswordList();
   fake_credential_provider_.SetPasswordList(password_list);
 
   EXPECT_CALL(mock_write_file_, Run(_, _, _)).Times(0);
+  EXPECT_CALL(mock_delete_file_, Run(destination_path_, false));
   EXPECT_CALL(
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::IN_PROGRESS, IsEmpty()));
@@ -299,9 +270,9 @@
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::FAILED_CANCELLED, IsEmpty()));
 
+  exporter_.PreparePasswordsForExport();
   exporter_.SetDestination(destination_path_);
   exporter_.Cancel();
-  exporter_.PreparePasswordsForExport();
 
   scoped_task_environment_.RunUntilIdle();
   histogram_tester_.ExpectTotalCount(
@@ -311,72 +282,32 @@
       ExportPasswordsResult::USER_ABORTED, 1);
 }
 
-// Test that PasswordManagerExporter is reusable, after an export has been
-// cancelled.
-TEST_F(PasswordManagerExporterTest, CancelAfterPasswordsThenExport) {
+// The "Cancel" button may still be visible on the UI after Chrome has completed
+// exporting. If the user chooses to cancel, Chrome should clear the file.
+TEST_F(PasswordManagerExporterTest, CancelAfterExporting) {
   std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
       CreatePasswordList();
-  const std::string serialised(
-      password_manager::PasswordCSVWriter::SerializePasswords(password_list));
   fake_credential_provider_.SetPasswordList(password_list);
 
-  EXPECT_CALL(mock_write_file_,
-              Run(destination_path_, StrEq(serialised), serialised.size()))
-      .WillOnce(ReturnArg<2>());
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::FAILED_CANCELLED, IsEmpty()));
+  EXPECT_CALL(mock_write_file_, Run(_, _, _)).WillOnce(ReturnArg<2>());
+  EXPECT_CALL(mock_delete_file_, Run(destination_path_, false));
   EXPECT_CALL(
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::IN_PROGRESS, IsEmpty()));
   EXPECT_CALL(
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::SUCCEEDED, IsEmpty()));
-
-  exporter_.PreparePasswordsForExport();
-  exporter_.Cancel();
-  exporter_.SetDestination(destination_path_);
-  exporter_.PreparePasswordsForExport();
-
-  scoped_task_environment_.RunUntilIdle();
-  histogram_tester_.ExpectUniqueSample(
-      "PasswordManager.ExportedPasswordsPerUserInCSV", password_list.size(), 1);
-}
-
-// Test that PasswordManagerExporter is reusable, after an export has been
-// cancelled.
-TEST_F(PasswordManagerExporterTest, CancelAfterDestinationThenExport) {
-  std::vector<std::unique_ptr<autofill::PasswordForm>> password_list =
-      CreatePasswordList();
-  const std::string serialised(
-      password_manager::PasswordCSVWriter::SerializePasswords(password_list));
-  fake_credential_provider_.SetPasswordList(password_list);
-
-  base::FilePath cancelled_path(FILE_PATH_LITERAL("clean_me_up"));
-
-  EXPECT_CALL(mock_write_file_, Run(cancelled_path, _, _)).Times(0);
-  EXPECT_CALL(mock_write_file_,
-              Run(destination_path_, StrEq(serialised), serialised.size()))
-      .WillOnce(ReturnArg<2>());
   EXPECT_CALL(
       mock_on_progress_,
       Run(password_manager::ExportProgressStatus::FAILED_CANCELLED, IsEmpty()));
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::IN_PROGRESS, IsEmpty()))
-      .Times(2);
-  EXPECT_CALL(
-      mock_on_progress_,
-      Run(password_manager::ExportProgressStatus::SUCCEEDED, IsEmpty()));
 
-  exporter_.SetDestination(std::move(cancelled_path));
-  exporter_.Cancel();
   exporter_.PreparePasswordsForExport();
   exporter_.SetDestination(destination_path_);
 
   scoped_task_environment_.RunUntilIdle();
-  histogram_tester_.ExpectUniqueSample(
-      "PasswordManager.ExportedPasswordsPerUserInCSV", password_list.size(), 1);
+  exporter_.Cancel();
+
+  scoped_task_environment_.RunUntilIdle();
 }
 
 }  // namespace
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 0e952d71..d253cc5 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -348,6 +348,10 @@
   display_handle_.reset();
 }
 
+bool PaymentRequest::IsIncognito() const {
+  return delegate_->IsIncognito();
+}
+
 void PaymentRequest::RecordFirstAbortReason(
     JourneyLogger::AbortReason abort_reason) {
   if (!has_recorded_completion_) {
diff --git a/components/payments/content/payment_request.h b/components/payments/content/payment_request.h
index 2fea0388..30a7c556 100644
--- a/components/payments/content/payment_request.h
+++ b/components/payments/content/payment_request.h
@@ -101,6 +101,8 @@
   // Hide this Payment Request if it's already showing.
   void HideIfNecessary();
 
+  bool IsIncognito() const;
+
   content::WebContents* web_contents() { return web_contents_; }
 
   PaymentRequestSpec* spec() { return spec_.get(); }
diff --git a/components/policy/core/browser/browser_policy_connector.cc b/components/policy/core/browser/browser_policy_connector.cc
index ae3a9357..d5ccf3e 100644
--- a/components/policy/core/browser/browser_policy_connector.cc
+++ b/components/policy/core/browser/browser_policy_connector.cc
@@ -162,6 +162,8 @@
   registry->RegisterIntegerPref(
       policy_prefs::kUserPolicyRefreshRate,
       CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs);
+  registry->RegisterStringPref(
+      policy_prefs::kMachineLevelUserCloudPolicyEnrollmentToken, std::string());
 }
 
 }  // namespace policy
diff --git a/components/policy/core/common/cloud/mock_cloud_policy_client.h b/components/policy/core/common/cloud/mock_cloud_policy_client.h
index ff45774..210a62a3 100644
--- a/components/policy/core/common/cloud/mock_cloud_policy_client.h
+++ b/components/policy/core/common/cloud/mock_cloud_policy_client.h
@@ -41,6 +41,10 @@
                void(const enterprise_management::DeviceStatusReportRequest*,
                     const enterprise_management::SessionStatusReportRequest*,
                     const StatusCallback&));
+  MOCK_METHOD2(UploadAppInstallReport,
+               void(const enterprise_management::AppInstallReportRequest*,
+                    const StatusCallback& callback));
+  MOCK_METHOD0(CancelAppInstallReportUpload, void(void));
   MOCK_METHOD2(UpdateGcmId, void(const std::string&, const StatusCallback&));
 
   // Sets the DMToken.
diff --git a/components/policy/core/common/policy_pref_names.cc b/components/policy/core/common/policy_pref_names.cc
index d788866dd..6daa439 100644
--- a/components/policy/core/common/policy_pref_names.cc
+++ b/components/policy/core/common/policy_pref_names.cc
@@ -22,5 +22,9 @@
 // by the cloud policy subsystem.
 const char kUserPolicyRefreshRate[] = "policy.user_refresh_rate";
 
+// The enrollment token of machine level user cloud policy
+const char kMachineLevelUserCloudPolicyEnrollmentToken[] =
+    "policy.machine_level_user_cloud_policy_enrollment_token";
+
 }  // namespace policy_prefs
 }  // namespace policy
diff --git a/components/policy/core/common/policy_pref_names.h b/components/policy/core/common/policy_pref_names.h
index 343ea10..31a8211 100644
--- a/components/policy/core/common/policy_pref_names.h
+++ b/components/policy/core/common/policy_pref_names.h
@@ -14,7 +14,7 @@
 POLICY_EXPORT extern const char kUrlBlacklist[];
 POLICY_EXPORT extern const char kUrlWhitelist[];
 POLICY_EXPORT extern const char kUserPolicyRefreshRate[];
-
+POLICY_EXPORT extern const char kMachineLevelUserCloudPolicyEnrollmentToken[];
 }  // namespace policy_prefs
 }  // namespace policy
 
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 6a3aa43..a4adc11b 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -146,7 +146,7 @@
 #   persistent IDs for all fields (but not for groups!) are needed. These are
 #   specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
 #   because doing so would break the deployed wire format!
-#   For your editing convenience: highest ID currently used: 427
+#   For your editing convenience: highest ID currently used: 428
 #   And don't forget to also update the EnterprisePolicies enum of
 #   histograms.xml (run 'python tools/metrics/histograms/update_policies.py').
 #
@@ -11425,6 +11425,24 @@
       If this setting is disabled or not set, then password protection service will send users to https://myaccounts.google.com to change their password.
       This policy is not available on Windows instances that are not joined to a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> domain.''',
     },
+    {
+      'name': 'MachineLevelUserCloudPolicyEnrollmentToken',
+      'type': 'string',
+      'schema': { 'type': 'string' },
+      'supported_on': ['chrome.*:66-'],
+      'features': {
+        'dynamic_refresh': False,
+        'per_profile': False,
+      },
+      'example_value': '37185d02-e055-11e7-80c1-9a214cf093ae',
+      'id': 428,
+      'caption': '''The enrollment token of cloud policy on desktop''',
+      'tags': [],
+      'desc': '''
+        If this policy is set, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will try to register itself and apply associated cloud policy for all profiles.
+
+        The value of this policy is an Enrollment token that can be retrieved from the Google Admin console.''',
+    }
   ],
 
   'messages': {
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 51e171b..5456e5b 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -200,6 +200,7 @@
 За него трябва да се посочи URL адрес, от който <ph name="PRODUCT_OS_NAME" /> може да изтегли Общите условия. Те трябва да бъдат с неформатиран текст, показван като тип MIME „text/plain“. Не е разрешено маркиране.</translation>
 <translation id="1750315445671978749">Блокиране на всички изтегляния</translation>
 <translation id="1781356041596378058">Това правило контролира и достъпа до опциите за програмисти под Android. Ако зададете true за него, потребителите няма да имат достъп до тях. В случай че правилото е false или не е конфигурирано, потребителите ще могат да използват опциите за програмисти, като докоснат седем пъти номера на компилацията в приложението Настройки на Android.</translation>
+<translation id="1797233582739332495">Периодично показване на подкана, указваща на потребителя, че е необходимо повторно стартиране</translation>
 <translation id="1803646570632580723">Списък с фиксирани приложения, които да се показват в стартовия панел</translation>
 <translation id="1808715480127969042">Блокиране на „бисквитките“ на тези сайтове</translation>
 <translation id="1827523283178827583">Използване на фиксирани прокси сървъри</translation>
@@ -272,6 +273,11 @@
 
 Ако това правило не е зададено, ще се използват и четирите схеми.</translation>
 <translation id="2067011586099792101">Блокиране на достъпа до сайтове извън пакети със съдържание</translation>
+<translation id="2070270043919235595">Известяване на потребителите, че трябва да стартират отново <ph name="PRODUCT_NAME" />, за да се приложи изчакваща актуализация.
+
+С настройката на това правило се активират известията, които уведомяват потребителя, че повторното стартиране на браузъра е препоръчително или задължително. Ако тя не бъде зададена, необходимостта от рестартиране се указва чрез малки промени в менюто на <ph name="PRODUCT_NAME" />. При задаване на „Recommended“ периодично ще се извежда предупреждение, че повторното стартиране е препоръчително. Потребителят може да отхвърли предупреждението, за да отложи рестартирането. При „Required“ периодичното предупреждение ще указва, че браузърът ще бъде рестартиран принудително след края на периода на известяване. Продължителността на този период е седем дни по подразбиране и може да бъде конфигурирана чрез правилото <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+Потребителската сесия се възстановява след повторното стартиране.</translation>
 <translation id="2077129598763517140">Да се използва хардуерно ускорение, когато е налице</translation>
 <translation id="2077273864382355561">Забавяне преди изключване на екрана при работа на батерия</translation>
 <translation id="2082205219176343977">Конфигуриране на най-ниската разрешена версия на Chrome за устройството.</translation>
@@ -316,6 +322,9 @@
 Ако настройката е конфигурирана, потребителите на бързо отключване ще трябва да въвеждат паролите си на заключения екран толкова често, колкото е указано в нея.
 
 В случай че тя не е конфигурирана, потребителите ще трябва да въвеждат паролата си всеки ден.</translation>
+<translation id="2188722565665306629">Дава възможност да зададете периода от време за показване на известията за повторно стартиране на <ph name="PRODUCT_NAME" /> с цел прилагане на изчакваща актуализация.
+
+Настройката на това правило служи за контролиране на времевия интервал в милисекунди, в рамките на който потребителят периодично да бъде информиран, че трябва да стартира отново <ph name="PRODUCT_NAME" /> (т.е. да рестартира <ph name="PRODUCT_OS_NAME" />), за да се инсталира актуализация. По време на този период потребителят ще бъде уведомяван неколкократно за необходимостта от актуализиране въз основа на настройката на правилото <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ако периодът не бъде зададен, ще се използва стандартният, който е 604800000 милисекунди (една седмица).</translation>
 <translation id="2194470398825717446">Това правило е оттеглено в M61. Вместо това, моля, използвайте EcryptfsMigrationStrategy.
 
       Определя поведението на устройство, доставено с ecryptfs, което трябва да премине към шифроване в ext4.
@@ -508,6 +517,13 @@
 <translation id="267596348720209223">Посочва кодиранията на знаците, поддържани от търсещата машина. Това са имена на кодови страници, като UTF-8, GB2312 и ISO-8859-1. Те се изпробват в посочения ред. Това правило не е задължително. В случай че не е зададено, ще се използва кодиране по подразбиране, което е UTF-8. То се спазва само ако правилото „DefaultSearchProviderEnabled“ е активирано.</translation>
 <translation id="2682225790874070339">Деактивиране на Диск в приложението Файлове за <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Активиране на функцията на прокси сървър за компресиране на данни</translation>
+<translation id="2726613915126661822">Дава възможност да контролирате дали изпълняването на виртуални машини да е разрешено под Chrome OS.
+
+Ако за правилото е зададено True, стартирането на виртуални машини ще бъде позволено на устройството.
+При False то ще е забранено.
+Когато правилото бъде променено на False, стартирането на нови виртуални машини няма да е възможно, но вече работещите няма да бъдат изключени.
+В случай че правилото не е зададено на управлявано устройство, изпълняването на виртуални машини няма да е разрешено на него.
+Неуправляваните устройства могат да изпълняват виртуални машини.</translation>
 <translation id="2731627323327011390">Деактивиране на използването на сертификатите в <ph name="PRODUCT_OS_NAME" /> за приложенията в ARC</translation>
 <translation id="2742843273354638707">Скрийте от новия раздел в браузъра и от стартовия панел с приложения в <ph name="PRODUCT_OS_NAME" /> иконата на уеб магазина на Chrome и водещата към него връзка в долната част.
 
@@ -720,6 +736,7 @@
           Това правило не е задължително. Ако не е зададено, няма да се осигурява нов раздел.
 
           Правилото се зачита само ако е активирано правилото „DefaultSearchProviderEnabled“.</translation>
+<translation id="3465852069254497664">Известяване на потребителя, че е препоръчително или задължително да стартира отново браузъра</translation>
 <translation id="346731943813722404">Посочва дали забавянията при управление на захранването и ограничаването на продължителността на сесията да започват да се изпълняват само след начало на потребителската активност в нея.
 
 Ако правилото е „true“, гореописаните функции не влизат в сила преди отчитането на такава активност в сесията.
@@ -753,6 +770,7 @@
 <translation id="3711895659073496551">Спиране</translation>
 <translation id="3736879847913515635">Активиране на възможността за добавяне на хора чрез функцията за управление на потребителите</translation>
 <translation id="3737544779868348650">Име на хоста за мрежата на устройството</translation>
+<translation id="3740754010292550733">Задаване на периода за известията за повторно стартиране с цел актуализиране</translation>
 <translation id="3750220015372671395">Блокиране на генерирането на ключове от тези сайтове</translation>
 <translation id="3756011779061588474">Блокиране на режима за програмисти</translation>
 <translation id="3758089716224084329">Позволява да посочите прокси сървъра, използван от <ph name="PRODUCT_NAME" />, и не разрешава на потребителите да променят настройките за него.
@@ -1047,7 +1065,7 @@
 
 За пълно описание на възможните настройки и структурата на това правило, моля, посетете https://www.chromium.org/administrators/policy-list-3/extension-settings-full
           </translation>
-<translation id="4554651132977135445">Режим, в който правилата на ниво устройство се прилагат за всички негови потребители</translation>
+<translation id="4554651132977135445">Режим за обработване на правилата за потребители от GPO на ниво устройство</translation>
 <translation id="4555850956567117258">Активиране на отдалеченото удостоверяване за потребителя</translation>
 <translation id="4557134566541205630">URL адрес на новия раздел за търсещата машина по подразбиране</translation>
 <translation id="4600786265870346112">Активиране на голям курсор</translation>
@@ -1425,6 +1443,7 @@
           Ако зададете това правило, потребителите могат временно да го заменят, като активират или деактивират голям курсор. Изборът им обаче не е за постоянно и стойността по подразбиране се възстановява, когато екранът за вход се покаже отново или потребителят не прави нищо на този екран за минута.
 
           Ако правилото не бъде зададено, големият курсор е деактивиран при първото показване на екрана за вход. Потребителите могат да активират или деактивират голям курсор по всяко време и състоянието му в екрана за вход се запазва между тях.</translation>
+<translation id="5929855945144989709">Разрешаване на устройствата да изпълняват виртуални машини под Chrome OS</translation>
 <translation id="5932767795525445337">Това правило служи и за фиксиране на приложения за Android.</translation>
 <translation id="5936622343001856595">Принуждава заявките в Google Търсене в мрежата да бъдат извършвани с активирано Безопасно търсене и не разрешава на потребителите да променят тази настройка.
 
@@ -1667,6 +1686,15 @@
 
 <ph name="SYNC_DISABLED_POLICY_NAME" /> деактивира синхронизирането на всички данни, заменяйки правилото RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Принудително активиране на езици за проверка на правописа</translation>
+<translation id="673699536430961464">Тази настройка позволява на потребителите да превключват между профили в Google от областта със съдържание в прозореца на браузъра, след като влязат в устройството си с <ph name="PRODUCT_OS_NAME" />.
+
+Ако зададете false за правилото, влизането в друг профил от областта със съдържание няма да е разрешено, когато браузърът не е в режим „инкогнито“.
+
+В случай че правилото не е зададено или е true, ще се използва стандартната настройка – влизането в друг профил от областта със съдържание в браузъра ще е разрешено, като изключение ще правят профилите на деца. При тях то ще е забранено, когато областта със съдържание не е в режим „инкогнито“.
+
+Ако влизането в други профили не трябва да е разрешено в режим „инкогнито“, можете да го блокирате посредством правилото IncognitoModeAvailability.
+
+Обърнете внимание, че потребителите ще имат достъп до услугите на Google в неудостоверено състояние, като блокират „бисквитките“.</translation>
 <translation id="6757438632136860443">Позволява да зададете списък с образци на URL адреси, посочващи сайтовете, на които е разрешено да изпълняват приставката <ph name="FLASH_PLUGIN_NAME" />.
 
 В случай че това правило не е зададено, за всички сайтове ще се използва глобалната стандартна стойност от правилото DefaultPluginsSetting, ако е зададено, или личната конфигурация на потребителя в противен случай.</translation>
@@ -1676,6 +1704,7 @@
 <translation id="6786967369487349613">Задаване на директорията за подвижните потребителски профили</translation>
 <translation id="6810445994095397827">Блокиране на JavaScript на тези сайтове</translation>
 <translation id="681446116407619279">Поддържани схеми за удостоверяване</translation>
+<translation id="6835883744948188639">Периодично показване на подкана, указваща на потребителя, че повторното стартиране е препоръчително</translation>
 <translation id="685769593149966548">Налагане на строго ограничен режим за YouTube</translation>
 <translation id="687046793986382807">Това правило е оттеглено от версия 35 на <ph name="PRODUCT_NAME" /> нататък.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 8c1b6b8d3..c8915dc 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -256,6 +256,7 @@
       নীতিটি একটি URL এ সেট করা উচিত যেখান থেকে <ph name="PRODUCT_OS_NAME" /> পরিষেবার শর্তাদি ডাউনলোড করতে পারবে৷ পরিষেবার শর্তাদিটিকে অবশ্যই সাধারণ পাঠ্য হতে হবে, যা MIME প্রকার পাঠ্য/সাধারণ হিসাবে পরিবেশিত৷ কোন মার্কআপ অনুমোদিত নয়৷</translation>
 <translation id="1750315445671978749">সমস্ত ডাউনলোড ব্লক করুন</translation>
 <translation id="1781356041596378058">এছাড়া, এই নীতিটি Android ডেভেলপার বিকল্পগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে। আপনি এই নীতিটি সত্য হিসেবে সেট করলে, ব্যবহারকারীরা ডেভেলপার বিকল্পগুলি অ্যাক্সেস করতে পারবে না। আপনি যদি এই নীতিটি মিথ্যা হিসেবে সেট করেন বা এটি সেট না করে ছেড়ে যান, তাহলে ব্যবহারকারীরা Android সেটিংস অ্যাপ্লিকেশানে বিল্ড সংখ্যার উপর সাতবার আলতো চাপ দিয়ে ডেভেলপার বিকল্পগুলি অ্যাক্সেস করতে পারবেন।</translation>
+<translation id="1797233582739332495">এটি যে রিলঞ্চ করা প্রয়োজন তা ব্যবহারকারীকে বার বার বিজ্ঞপ্তি পাঠিয়ে জানান।</translation>
 <translation id="1803646570632580723">লঞ্চারে প্রদর্শন করার জন্য পিন করা অ্যাপ্লিকেশনের তালিকা</translation>
 <translation id="1808715480127969042">এই সাইটগুলিতে কুকিজ অবরোধ করুন</translation>
 <translation id="1827523283178827583">স্থির প্রক্সি সার্ভার ব্যবহার করুন</translation>
@@ -340,6 +341,11 @@
 
           যদি এই নীতিটি সেট না করে ছেড়ে দেওয়া থাকে তবে চারটি স্কিমের সবকয়টি ব্যবহার করা হবে৷</translation>
 <translation id="2067011586099792101">সামগ্রী প্যাকগুলির বাইরের সাইটগুলিতে অ্যাক্সেস অবরুদ্ধ করুন</translation>
+<translation id="2070270043919235595">বাকি থাকা আপডেট প্রয়োগ করার জন্য অবশ্যই <ph name="PRODUCT_NAME" /> রিলঞ্চ করতে হবে তা ব্যবহারকারীদের জানান।
+
+      ব্রাউজার রিলঞ্চ করা প্রয়োজন অথবা করলে ভাল হয়, তা ব্যবহারকারীকে জানানোর জন্য বিজ্ঞপ্তি পাঠানো হবে কিনা তা এই নীতির সেটিংস অনুযায়ী নির্ধারণ করা হয়। সেট করা না হলে মেনুতে সূক্ষ্ম পরিবর্তনের মাধ্যমে <ph name="PRODUCT_NAME" /> ব্যবহারকারীকে বোঝানোর চেষ্টা করে যে রিলঞ্চ করা প্রয়োজন।  'প্রস্তাবিত' সেটিংস বেছে নিলে ব্যবহারকারীকে বারবার সতর্কবার্তা দেখিয়ে বলা হয় যে রিলঞ্চ করার পরামর্শ দেওয়া হচ্ছে। রিলঞ্চ পিছিয়ে দিতে চাইলে ব্যবহারকারী সতর্কবার্তাগুলি খারিজ করে দিতে পারেন। 'প্রয়োজন' সেটিংস বেছে নিলে বারবার সতর্কবার্তা দেখিয়ে বোঝানো হবে যে বিজ্ঞপ্তির সময়সীমা পেরিয়ে গেলে ব্রাউজার নিজে থেকে রিলঞ্চ করা হবে। এই সময়সীমা স্বভাবত ৭ দিন হিসেবে ধরা হয় এবং <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> নীতির সেটিং থেকে এটি কনফিগার করা যায়।
+
+      রিলঞ্চের পরে ব্যবহারকারীর সেশন যেখানে বন্ধ করা হয়েছিল সেখান থেকেই আবার চালু করা হয়।</translation>
 <translation id="2077129598763517140">যখনই উপলব্ধ তখন হার্ডওয়্যার অ্যাক্সিলারেশন ব্যবহার করুন</translation>
 <translation id="2077273864382355561">AC পাওয়ার চলাকালীন স্ক্রীন বন্ধে বিলম্ব</translation>
 <translation id="2082205219176343977">ডিভাইসের জন্য সর্বনিম্ন অনুমোদিত Chrome ভার্সন কনফিগার করুন</translation>
@@ -385,6 +391,9 @@
       এই সেটিংটি কনফিগার করা হলে, যেসব ব্যবহারকারী দ্রুত আনলক ব্যবহার করবেন তাদেরকে সেটিং অনুযায়ী লক স্ক্রীনে তাদের পাসওয়ার্ড লিখতে অনুরোধ করা হবে।
 
       এই সেটিংটি কনফিগার না করা হলে, যেসব ব্যবহারকারী দ্রুত আনলক ব্যবহার করবেন তাদেরকে প্রতিদিন লক স্ক্রীনে তাদের পাসওয়ার্ড লিখতে অনুরোধ করা হবে।</translation>
+<translation id="2188722565665306629">বাকি থাকা আপডেট প্রয়োগ করার আগে কতদিন ধরে <ph name="PRODUCT_NAME" /> রিলঞ্চের বিজ্ঞপ্তি দেখানো হবে, তা এর মাধ্যমে সেট করা যায়।
+
+      আপডেটের জন্য <ph name="PRODUCT_NAME" /> রিলঞ্চ করতে হবে (অথবা <ph name="PRODUCT_OS_NAME" /> রিস্টার্ট করতে হবে), তা কতক্ষণ ধরে ব্যবহারকারীকে ক্রমাগত মনে করিয়ে যাওয়া হবে, সেটি এই নীতির সেটিংসের মাধ্যমে মিলিসেকেন্ডের হিসেবে নির্ধারণ করা যায়। এই সময়সীমার মধ্যে <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> এর নীতির সেটিং অনুযায়ী ব্যবহারকারীকে বারবার আপডেটের প্রয়োজনীয়তার কথা জানিয়ে যাওয়া হবে। নীতিটি সেট করা না হলে ডিফল্ট মান হিসেবে ৬০,৪৮,০০,০০০ মিলিসেকেন্ড (এক সপ্তাহ) বেছে নেওয়া হবে।</translation>
 <translation id="2194470398825717446">M61 এ এই নীতিটি আর ব্যবহার করা হচ্ছে না, অনুগ্রহ করে এর পরিবর্তে EcryptfsMigrationStrategy ব্যবহার করুন।
 
       ecryptfs এ থাকা কোনও ডিভাইস কিভাবে আচরণ করবে এটি তা উল্লেখ করে এবং সেটি ext4 এনক্রিপশনে রূপান্তর করতে হবে।
@@ -614,6 +623,13 @@
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> ফাইলগুলির অ্যাপ্লিকেশানে ড্রাইভ অক্ষম করে</translation>
 <translation id="268577405881275241">ডেটা কম্প্রেশন প্রক্সি বৈশিষ্ট্যটি সক্ষম করুন</translation>
 <translation id="2710534340210290498">এই নীতি মিথ্যাতে সেট করা থাকলে, ব্যবহারকারীরা স্ক্রিন লক করতে পারবেন না (শুধুমাত্র ইউজার সেসন থেকে সাইন-আউট করা সম্ভব হবে)। এই নীতি সেট না করা থাকলে বা সত্যতে সেট করা থাকলে, যেসব ব্যবহারকারী পাসওয়ার্ড দিয়ে প্রমাণীকরণ করেছেন তারা স্ক্রিন লক করতে পারবেন।</translation>
+<translation id="2726613915126661822">ভার্চুয়াল মেশিন Chrome OS- এ চালানোর অনুমতি দেওয়া হচ্ছে কিনা তা নিয়ন্ত্রণ করতে আপনাকে অনুমতি দেয়।
+
+      নীতিটি যদি ‘ট্রু’তে সেট করা হয় তাহলে ডিভাইসটি ভার্চুয়াল মেশিন চালানোর অনুমতি দেয়।
+      নীতিটি যদি ‘ফল্সে’ সেট করা হয় তাহলে ডিভাইসটি ভার্চুয়াল মেশিন চালানোর অনুমতি দেবে না।
+      নীতিটি পরিবর্তন করে যদি ‘ফল্স’ করা হয় তাহলে সেটি নতুন ভার্চুয়াল মেশিন চালানো শুরু করবে কিন্তু আগে থেকে চলতে থাকা ভার্চুয়াল মেশিনটি বন্ধ করবে না।
+      নীতিটি যদি একটি পরিচালিত ডিভাইসে সেট না করা হয় তাহলে ডিভাইসটি ভার্চুয়াল মেশিন চালানোর অনুমতি দেবে না।
+      অপরিচালিত ডিভাইসগুলি ভার্চুয়াল মেশিন চালানোর অনুমতি দেয় না।</translation>
 <translation id="2731627323327011390">ARC-অ্যাপ্লিকেশানগুলিতে <ph name="PRODUCT_OS_NAME" /> শংসাপত্রের ব্যবহার অক্ষম করুন</translation>
 <translation id="2742843273354638707">নতুন ট্যাবের পৃষ্ঠা এবং <ph name="PRODUCT_OS_NAME" /> অ্যাপ্লিকেশান লঞ্চার থেকে Chrome ওয়েব দোকান অ্যাপ্লিকেশান এবং পাদলেখের লিঙ্ক লুকায়৷
 
@@ -859,6 +875,7 @@
           এই নীতিটি ঐচ্ছিক৷ যদি সেট না করা থাকে, তবে কোনো নতুন ট্যাব পৃষ্ঠা উপলব্ধ করা হবে না৷
 
           এই নীতিটি তখনই ব্যবহৃত হয় যখন 'DefaultSearchProviderEnabled' নীতিটি সক্ষম করা থাকে৷</translation>
+<translation id="3465852069254497664">ব্রাউজারটি রিলঞ্চ করা প্রয়োজন অথবা রিলঞ্চ করলে ভাল সে বিষয়টি ব্যবহারকারীকে জানান</translation>
 <translation id="346731943813722404">পাওয়ার ম্যানেজমেন্ট বিলম্ব করবে কিনা এবং সেশনের সময়ের সীমা শুধুমাত্র একটি সেশনে প্রথম ব্যবহারকারীর কার্যকলাপ পরিলক্ষিত হওয়ার পরেই চলতে শুরু করবে কিনা তা নির্দিষ্ট করে৷
 
           যদি এই নীতি সত্য হিসাবে সেট করা থাকে, পাওয়ার ম্যানেজমেন্ট বিলম্ব করবে এবং একটি সেশনে প্রথম ব্যবহারকারীর কার্যকলাপ পরিলক্ষিত না হওয়া পর্যন্ত সেশনের সময় সীমা শুরু হবে না৷
@@ -909,6 +926,7 @@
 <translation id="3734995764843493369">প্রতিদিন (২৪ ঘণ্টা) পাসওয়ার্ড দেওয়া প্রয়োজন</translation>
 <translation id="3736879847913515635">ইউজার ম্যানেজারে অন্যদের যোগ করা সক্ষম করুন</translation>
 <translation id="3737544779868348650">ডিভাইসের নেটওয়ার্ক হোস্টনেম</translation>
+<translation id="3740754010292550733">আপডেট রিলঞ্চ বিজ্ঞপ্তিগুলির সময় নির্ধারণ করুন</translation>
 <translation id="3750220015372671395">এই সাইটগুলিতে কী তৈরি করা অবরোধ করুন</translation>
 <translation id="375266612405883748">এই মেশিনে দূরবর্তী অ্যাক্সেস হোস্ট দ্বারা ব্যবহৃত UDP পোর্ট ব্যাপ্তি সীমাবদ্ধ করে।
 
@@ -1786,6 +1804,7 @@
           যদি আপনি এই নীতিটি সেট করেন, তাহলে ব্যবহারকারীরা বড় কার্সার সক্ষম বা অক্ষম করার মাধ্যমে অস্থায়ীভাবে এটিকে ওভাররাইড করতে পারবেন৷ যাই হোক, ব্যবহারকারীর পছন্দ স্থায়ী নয় এবং যখন নতুন লগইন স্ক্রীন প্রদর্শিত হয় বা লগইন স্ক্রীনে ব্যবহারকারী এক মিনিটের জন্য নিষ্ক্রিয় থাকে, তখন ডিফল্টটি পুনঃস্থাপিত হয়৷
 
           যদি এই নীতিটিকে সেট না করে ছেড়ে রাখা হয়, তাহলে যখন লগইন স্ক্রীন প্রথমে প্রদর্শিত হয় তখন বড় কার্সার অক্ষম থাকে৷ ব্যবহারকারীরা যেকোনো সময়ে বড় কার্সার সক্ষম বা অক্ষম করতে পারেন এবং লগইন স্ক্রীনে ব্যবহারকারীদের মধ্যে এটির স্থিতি স্থায়ী হয়৷</translation>
+<translation id="5929855945144989709">Chrome OS এ ভার্চুয়াল মেশিন চালানোর জন্য ডিভাইসগুলিকে অনুমতি দিন</translation>
 <translation id="5932767795525445337">Android অ্যাপকে পিন করার জন্যও এই নীতিটি ব্যবহার করা যেতে পারে।</translation>
 <translation id="5936622343001856595">SafeSearch দিয়ে Google ওয়েব অনুসন্ধানে করা হবে যে ফোর্সেস ক্যোয়ারীগুলি তা সক্রিয় তে সেট করে এবং এই সেটিং পরিবর্তন করতে ব্যবহারকারীদের বাধা দেয়৷
 
@@ -2046,6 +2065,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> পলিসিটি RoamingProfileSupportEnabled ওভাররাইড করার মাধ্যমে সব ডেটা সিঙ্ক্রোনাইজেশনকে অক্ষম করে।</translation>
 <translation id="6735701345096330595">ভাষাতে বানান পরীক্ষা বাধ্যতামূলকভাবে সক্ষম করুন</translation>
+<translation id="673699536430961464">এই সেটিংস ব্যবহারকারীরা তাদের <ph name="PRODUCT_OS_NAME" /> ডিভাইসে সাইন-ইন করার পরে ব্যবহারকারীদের তাদের Google অ্যাকাউন্টের মধ্যে তাদের ব্রাউজার উইন্ডোতে কন্টেন্ট এলাকায় পরিবর্তন করতে দেয়।
+
+      এই নীতি যদি 'ফলসে' সেট করা থাকে, তাহলে অ-ছদ্মবেশী ব্রাউজার কন্টেন্ট এলাকা থেকে একটি পৃথক অ্যাকাউন্টে সাইন-ইন করার অনুমতি দেওয়া হবে না।
+
+      এই নীতিটি যদি সেট না করা থাকে বা 'ট্রু'তে সেট করা থাকে তবে ডিফল্ট আচরণটি ব্যবহার করা হবে: বাচ্চাদের অ্যাকাউন্ট যেখানে অ-ছদ্মবেশী কন্টেন্ট এলাকা ব্লক করা হবে, সেগুলি বাদে ব্রাউজারের কন্টেন্ট এলাকা থেকে একটি পৃথক অ্যাকাউন্টে সাইন-ইন করার অনুমতি দেওয়া হবে।
+
+      যদি একটি ভিন্ন অ্যাকাউন্টে সাইন-ইন করা ছদ্মবেশী মোডের মাধ্যমে অনুমোদিত না হয় তবে IncognitoModeAvailability নীতি ব্যবহার করে সেই মোডটি ব্লক করার কথা বিবেচনা করুন।
+
+      মনে রাখবেন ব্যবহারকারীরা কুকি ব্লক করে Google পরিষেবাগুলি অনুমোদিত নয় এমন পরিষেবা থেকে অ্যাক্সেস করতে পারবেন।</translation>
 <translation id="6757438632136860443">যে সমস্ত সাইটকে <ph name="FLASH_PLUGIN_NAME" /> প্লাগ ইন চালানোর অনুমতি দিতে চান, সেগুলির URL এর একটি তালিকা সেট করতে দেয়।
 
           এই নীতিটি যদি এখন সেট করা না হয়, এবং  'ডিফল্ট প্লাগইন সেটিংস' নীতিটি যদি সেট করা থাকে, তাহলে সেই অনুযায়ী সমস্ত সাইটের জন্য এই নীতির গ্লোবাল ডিফল্ট সেটিং নির্ধারণ করা হবে। তা না হলে, ব্যবহারকারীর ব্যক্তিগত কনফিগারেশন অনুযায়ী এটি সেট করা হবে।</translation>
@@ -2055,6 +2083,7 @@
 <translation id="6786967369487349613">রোমিং প্রোফাইল ডিরেক্টরি সেট করুন</translation>
 <translation id="6810445994095397827">এই সাইটগুলিকে জাভাস্ক্রিপ্ট অবরোধ করুন</translation>
 <translation id="681446116407619279">সমর্থিত প্রমাণীকরণ স্কীম</translation>
+<translation id="6835883744948188639">ব্যবহারকারীকে রিলঞ্চ করার যে পরামর্শ দেওয়া হচ্ছে তা বিজ্ঞপ্তি পাঠিয়ে জানান।</translation>
 <translation id="685769593149966548">YouTube এর জন্য কঠোর সীমাবদ্ধ মোড বলবৎ করুন</translation>
 <translation id="687046793986382807"><ph name="PRODUCT_NAME" /> সংস্করণ ৩৫ থেকে এই নীতিটিকে বাতিল করা হয়েছে৷
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index 78225c9..ffbae92 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -89,7 +89,7 @@
 
       Si aquesta política s'estableix en "false", <ph name="PRODUCT_NAME" /> no permetrà que s'iniciïn els perfils de convidat.</translation>
 <translation id="1363275621236827384">Activa l'opció d'enviar consultes a Quirks Server per als perfils de maquinari</translation>
-<translation id="1387596372902085462">Determina si es confia en la infraestructura de PKI heretada de Symantec Corporation</translation>
+<translation id="1387596372902085462">Determina si es confia en la infraestructura de PKI heretada de Symantec Corporation</translation>
 <translation id="1393485621820363363">Impressores activades per a dispositius d'empresa</translation>
 <translation id="1397855852561539316">URL de suggeriments del proveïdor de cerca predeterminat</translation>
 <translation id="1426410128494586442">Sí</translation>
@@ -204,6 +204,7 @@
       La política s'ha de definir en un URL del qual <ph name="PRODUCT_OS_NAME" /> pugui baixar els Termes i condicions, que han de trobar-se com a text sense format proporcionat com a text/sense format de tipus MIME. No es permet el marcatge.</translation>
 <translation id="1750315445671978749">Bloqueja totes les baixades</translation>
 <translation id="1781356041596378058">Aquesta política també controla l'accés a les Opcions per a desenvolupadors d'Android. Si l'estableixes en "true", els usuaris no hi poden accedir. Si l'estableixes en "false" o la deixes sense establir, els usuaris hi poden accedir tocant set vegades el número de compilació que hi ha a l'aplicació de configuració d'Android.</translation>
+<translation id="1797233582739332495">Mostra una sol·licitud periòdica a l'usuari per indicar-li que cal reiniciar el navegador</translation>
 <translation id="1803646570632580723">Llista d'aplicacions fixades perquè es mostrin a la barra d'execució ràpida</translation>
 <translation id="1808715480127969042">Bloqueja les galetes en aquests llocs</translation>
 <translation id="1827523283178827583">Fes servir servidors intermediaris fixos</translation>
@@ -276,6 +277,11 @@
 
           Si no s'estableix aquesta política, s'utilitzaran els quatre esquemes.</translation>
 <translation id="2067011586099792101">Bloqueja l'accés a llocs situats fora de paquets de contingut.</translation>
+<translation id="2070270043919235595">Notifica els usuaris que cal reiniciar <ph name="PRODUCT_NAME" /> per aplicar una actualització pendent.
+
+      Aquesta política activa les notificacions per avisar l'usuari que es recomana o es requereix reiniciar el navegador. Si no s'estableix, <ph name="PRODUCT_NAME" /> fa canvis subtils al seu menú per indicar a l'usuari que cal reiniciar el navegador. Si s'estableix en "Recommended", s'avisa periòdicament l'usuari que es recomana reiniciar el navegador. L'usuari pot ignorar aquest advertiment per posposar el reinici. Si s'estableix en "Required", s'avisa periòdicament l'usuari que el navegador es reiniciarà a la força en finalitzar el període de notificació. La durada predeterminada d'aquest període és de 7 dies i es pot configurar amb la política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      La sessió de l'usuari es restaura en reiniciar el navegador.</translation>
 <translation id="2077129598763517140">Utilitza l'acceleració per maquinari quan estigui disponible</translation>
 <translation id="2077273864382355561">Retard de la desactivació de pantalla quan s'utilitza bateria</translation>
 <translation id="2082205219176343977">Configura la versió mínima de Chrome que es permet al dispositiu.</translation>
@@ -321,6 +327,9 @@
       Si aquesta opció es configura, es demanarà als usuaris que fan servir el desbloqueig ràpid que introdueixin la contrasenya a la pantalla de bloqueig en funció d'aquesta opció.
 
       Si aquesta opció no es configura, es demanarà als usuaris que fan servir el desbloqueig ràpid que introdueixin la contrasenya a la pantalla de bloqueig cada dia.</translation>
+<translation id="2188722565665306629">Et permet establir el període de temps durant el qual es mostren les notificacions per reiniciar <ph name="PRODUCT_NAME" /> a fi d'aplicar una actualització pendent.
+
+      Aquesta política es pot utilitzar per controlar el període de temps, en mil·lisegons, durant el qual s'informa l'usuari de manera progressiva que cal reiniciar <ph name="PRODUCT_NAME" /> (o <ph name="PRODUCT_OS_NAME" />) per aplicar una actualització. Durant aquest període de temps, s'informa l'usuari repetidament de la necessitat d'actualitzar el navegador en funció de com estigui configurada la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no s'estableix, s'utilitza el període predeterminat de 604.800.000 mil·lisegons (1 setmana).</translation>
 <translation id="2194470398825717446">Aquesta política es considera obsoleta a M61; utilitza EcryptfsMigrationStrategy en lloc seu.
 
       Especifica com s'ha de comportar un dispositiu que conté eCryptfs i que ha de fer una transició a encriptació ext4.
@@ -507,6 +516,13 @@
 <translation id="267596348720209223">Especifica les codificacions de caràcters que admet el proveïdor de cerca. Les codificacions són noms de pàgines de codi com ara UTF-8, GB2312 i ISO-8859-1. Es proven per ordre. Aquesta política és opcional. Si no es defineix, s'utilitzarà el valor predeterminat, que és UTF-8. Aquesta política només es respecta si la política "DefaultSearchProviderEnabled" està activada.</translation>
 <translation id="2682225790874070339">Desactiva Drive a l'aplicació Fitxers de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Activa la funció del servidor intermediari de compressió de dades</translation>
+<translation id="2726613915126661822">Et permet controlar si es poden executar ordinadors virtuals a Chrome OS.
+
+      Si la política es defineix en "true", el dispositiu pot executar ordinadors virtuals.
+      Si la política es defineix en "false", el dispositiu no pot executar ordinadors virtuals.
+      Quan la política es canvia a "false", afecta l'execució d'ordinadors virtuals nous, però no apaga els que ja s'estan executant.
+      Quan la política no es defineix en un dispositiu gestionat, el dispositiu no té permís per executar ordinadors virtuals.
+      Els dispositius no gestionats tenen permís per executar ordinadors virtuals.</translation>
 <translation id="2731627323327011390">Desactiva l'ús de certificats de <ph name="PRODUCT_OS_NAME" /> a les aplicacions ARC</translation>
 <translation id="2742843273354638707">Amaga l'aplicació Chrome Web Store i l'enllaç de la part inferior de la pàgina a la pàgina Pestanya nova i al Menú d'aplicacions de <ph name="PRODUCT_OS_NAME" />.
 
@@ -723,6 +739,7 @@
           Aquesta política és opcional. Si no es configura, no es proporcionarà cap pestanya nova.
 
           La política només s'aplica si la política "DefaultSearchProviderEnabled" està activada.</translation>
+<translation id="3465852069254497664">Notifica a un usuari que es recomana o que cal reiniciar el navegador</translation>
 <translation id="346731943813722404">Permet especificar si els retards de la gestió de l'energia i el límit de la durada de la sessió només s'han d'executar quan l'usuari realitzi la primera acció en una sessió.
 
           Si la política s'estableix com a True, els retards de la gestió de l'energia i el límit de la durada de la sessió no s'executen fins que l'usuari no realitza la primera acció en una sessió.
@@ -756,6 +773,7 @@
 <translation id="3711895659073496551">Suspèn</translation>
 <translation id="3736879847913515635">Activa l'opció Afegeix una persona al gestor d'usuaris</translation>
 <translation id="3737544779868348650">Nom d'amfitrió de la xarxa del dispositiu</translation>
+<translation id="3740754010292550733">Estableix el període per actualitzar les notificacions de reinici</translation>
 <translation id="3750220015372671395">Bloqueja la generació de claus en aquests llocs web</translation>
 <translation id="3756011779061588474">Bloquejar el mode de desenvolupador</translation>
 <translation id="3758089716224084329">Et permet especificar el servidor intermediari que <ph name="PRODUCT_NAME" /> utilitza i impedeix que els usuaris en canviïn la configuració.
@@ -1416,6 +1434,7 @@
           Si s'estableix aquesta política, els usuaris podran anular-la temporalment si activen o desactiven el cursor gran. No obstant això, l'elecció de l'usuari no és permanent i l'estat predeterminat es restablirà quan la pantalla d'inici de sessió es torni a mostrar o si l'usuari resta inactiu a la pantalla d'inici de sessió durant un minut.
 
           Si no s'estableix aquesta política, el cursor gran es desactivarà quan la pantalla d'inici de sessió es mostri per primera vegada. Els usuaris podran activar o desactivar el cursor gran en qualsevol moment i el seu estat a la pantalla d'inici de sessió es mantindrà entre els usuaris.</translation>
+<translation id="5929855945144989709">Permet que els dispositius executin ordinadors virtuals a Chrome OS</translation>
 <translation id="5932767795525445337">Aquesta política també es pot utilitzar per fixar les aplicacions per a Android.</translation>
 <translation id="5936622343001856595">Força que les consultes de Cerca web de Google es facin amb l'opció SafeSearch activada i impedeix que els usuaris canviïn aquest paràmetre.
 
@@ -1655,6 +1674,15 @@
 
       La política <ph name="SYNC_DISABLED_POLICY_NAME" /> desactiva la sincronització de totes les dades i substitueix RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Força l'activació del corrector ortogràfic d'idiomes</translation>
+<translation id="673699536430961464">Aquesta opció de configuració permet que els usuaris canviïn d'un compte de Google a un altre des de l'àrea de contingut de la finestra del navegador després que hagin iniciat la sessió al dispositiu <ph name="PRODUCT_OS_NAME" />.
+
+      Si aquesta política es defineix en "false", els usuaris no podran iniciar la sessió en un altre compte des de l'àrea de contingut d'un navegador que no estigui en mode d'incògnit.
+
+      Si aquesta política no es defineix o es defineix en "true", s'aplicarà el comportament predeterminat: els usuaris podran iniciar la sessió en un altre compte des de l'àrea de contingut del navegador, excepte en el cas dels comptes secundaris, en què es bloquejarà aquesta política a l'àrea de contingut dels navegadors que no estiguin en mode d'incògnit.
+
+      En cas que no es vulgui permetre l'inici de sessió a un altre compte mitjançant el mode d'incògnit, pots bloquejar aquest mode amb la política IncognitoModeAvailability.
+
+      Tinguis en compte que els usuaris poden bloquejar les galetes per accedir als serveis de Google sense autenticar-se.</translation>
 <translation id="6757438632136860443">Permet definir una llista de patrons d'URL que especifiquin llocs que poden executar el connector <ph name="FLASH_PLUGIN_NAME" />.
 
           Si aquesta política no es defineix, s'utilitzarà per a tots els llocs el valor global predeterminat indicat en la política "DefaultPluginsSetting" (si s'ha definit) o el valor personalitzat que hagi definit l'usuari.</translation>
@@ -1664,6 +1692,7 @@
 <translation id="6786967369487349613">Estableix el directori de perfils itinerants</translation>
 <translation id="6810445994095397827">Bloqueja JavaScript en aquests llocs</translation>
 <translation id="681446116407619279">Esquemes d'autenticació compatibles</translation>
+<translation id="6835883744948188639">Mostra una sol·licitud periòdica a l'usuari per indicar-li que es recomana reiniciar el navegador</translation>
 <translation id="685769593149966548">Aplica el mode restringit estricte a YouTube</translation>
 <translation id="687046793986382807">Aquesta política s'ha retirat a partir de la versió 35 de <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 5802d357..c7b5c37 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -196,6 +196,7 @@
       Jako hodnotu této zásady zadejte adresu URL, ze které může systém <ph name="PRODUCT_OS_NAME" /> smluvní podmínky stáhnout. Smluvní podmínky musejí být uloženy ve formátu prostého textu s typem MIME „text/plain“. Nejsou povoleny žádné značky.</translation>
 <translation id="1750315445671978749">Blokovat veškerá stahování</translation>
 <translation id="1781356041596378058">Tato zásada také ovládá přístup k možnostem Pro vývojáře v systému Android. Pokud tuto zásadu nastavíte na hodnotu True, uživatelé nebudou mít přístup k sekci Pro vývojáře. Pokud tuto zásadu nastavíte na hodnotu False nebo ji nenastavíte, uživatelé budou moci možnosti Pro vývojáře otevřít tak, že v aplikaci Nastavení Android sedmkrát klepnou na číslo sestavení.</translation>
+<translation id="1797233582739332495">Zobrazovat uživateli opakovaně výzvu s oznámením, že je vyžadován restart</translation>
 <translation id="1803646570632580723">Seznam připnutých aplikací, které se zobrazují ve spouštěči</translation>
 <translation id="1808715480127969042">Blokovat soubory cookie na těchto stránkách</translation>
 <translation id="1827523283178827583">Použít pevně dané servery proxy</translation>
@@ -274,6 +275,11 @@
 
           Pokud tuto zásadu nenastavíte, budou se používat všechna čtyři schémata.</translation>
 <translation id="2067011586099792101">Blokování přístupu k webům mimo obsahové balíčky</translation>
+<translation id="2070270043919235595">Oznamovat uživatelům, že je nutné prohlížeč <ph name="PRODUCT_NAME" /> restartovat, aby bylo možné použít aktualizaci čekající na vyřízení.
+
+      Tato zásada povoluje oznámení o tom, že je vyžadován nebo doporučen restart prohlížeče. Pokud není nastavena, <ph name="PRODUCT_NAME" /> uživatele o potřebě restartu informuje prostřednictvím drobných změn v nabídce. Pokud je nastavena na hodnotu Doporučeno, bude se uživateli opakovaně zobrazovat upozornění, že je doporučen restart. Uživatel upozornění může odmítnout a tím restart odložit. Pokud je nastavena na hodnotu Povinné, bude se uživateli opakovaně zobrazovat upozornění, že po uplynutí lhůty pro oznámení bude vynucen restart prohlížeče. Lhůta je ve výchozím nastavení sedm dní a lze ji nakonfigurovat pomocí zásady <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Relace uživatele se po restartu obnoví.</translation>
 <translation id="2077129598763517140">V případě dostupnosti použít hardwarovou akceleraci</translation>
 <translation id="2077273864382355561">Prodleva vypnutí obrazovky při napájení z baterie</translation>
 <translation id="2082205219176343977">Konfigurace minimální povolené verze Chromu v zařízení.</translation>
@@ -312,6 +318,9 @@
       Je-li toto nastavení nakonfigurováno, uživatelé, kteří používají rychlé odemknutí, budou muset na obrazovce uzamčení zadávat heslo podle tohoto nastavení.
 
       Pokud toto nastavení není nakonfigurováno, uživatelé, kteří používají rychlé odemknutí, budou na obrazovce uzamčení muset zadávat heslo každý den.</translation>
+<translation id="2188722565665306629">Umožňuje nastavit dobu, po kterou se budou zobrazovat oznámení o restartu prohlížeče <ph name="PRODUCT_NAME" /> za účelem použití aktualizace čekající na vyřízení.
+
+      Pomocí této zásady lze ovládat dobu (v milisekundách), po kterou je uživatel postupně informován o tom, že je třeba prohlížeč <ph name="PRODUCT_NAME" /> nebo systém <ph name="PRODUCT_OS_NAME" /> kvůli aktualizaci restartovat. Během této doby bude uživatel na základě nastavení zásady <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> opakovaně informován, že je potřeba nainstalovat aktualizaci. Pokud tuto zásadu nenastavíte, použije se výchozí hodnota 604 800 000 milisekund (jeden týden).</translation>
 <translation id="2194470398825717446">Podpora této zásady byla ve verzi M61 ukončena. Použijte namísto ní zásadu EcryptfsMigrationStrategy.
 
 Určuje, jak se má chovat zařízení dodané s šifrováním ecryptfs, které potřebuje přejít na šifrování ext4.
@@ -383,7 +392,7 @@
 
           Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultNotificationsSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="2386362615870139244">Povolit uzamčení obrazovky při probuzení</translation>
-<translation id="2411817661175306360">Ochrana hesla – varování je vypnuté</translation>
+<translation id="2411817661175306360">Ochrana hesla – upozornění je vypnuté</translation>
 <translation id="2411919772666155530">Blokovat upozornění na těchto stránkách</translation>
 <translation id="2418507228189425036">Deaktivuje ukládání historie procházení v prohlížeči <ph name="PRODUCT_NAME" /> a brání uživatelům, aby toto nastavení změnili.
 
@@ -515,6 +524,13 @@
           Zásada bude dodržována pouze v případě, že je aktivní zásada DefaultSearchProviderEnabled.</translation>
 <translation id="2682225790874070339">Zakáže v aplikaci Soubory v systému <ph name="PRODUCT_OS_NAME" /> přístup k Disku.</translation>
 <translation id="268577405881275241">Aktivace funkce datové komprese proxy serveru</translation>
+<translation id="2726613915126661822">Umožňuje určit, zda má být v systému Chrome OS povoleno spouštění virtuálních počítačů.
+
+      Pokud je tato zásada nastavena na hodnotu True, spouštění virtuálních počítačů je v zařízení povoleno.
+      Pokud je tato zásada nastavena na hodnotu False, spouštění virtuálních počítačů v zařízení povoleno není.
+      Při změně na hodnotu False se na spouštění nových virtuálních počítačů použije nové nastavení, ale již spuštěné virtuální počítače nebudou ukončeny.
+      Pokud tato zásada není nastavena na spravovaném zařízení, spouštění virtuálních počítačů v něm nebude povoleno.
+      Na zařízeních, která nejsou spravována, je spouštění virtuálních počítačů povoleno.</translation>
 <translation id="2731627323327011390">Zakázat aplikacím ARC používání certifikátů systému <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2742843273354638707">Skryje ze stránky Nová karta a ze spouštěče aplikací systému <ph name="PRODUCT_OS_NAME" /> aplikaci Internetový obchod Chrome a odkaz na zápatí.
 
@@ -733,6 +749,7 @@
           Tato zásada je nepovinná. Pokud ji nenastavíte, žádná stránka nové karty se nezobrazí.
 
           Tato zásada je respektována pouze v případě, že je aktivována zásada DefaultSearchProviderEnabled.</translation>
+<translation id="3465852069254497664">Oznamovat uživateli, že je doporučen nebo vyžadován restart prohlížeče</translation>
 <translation id="346731943813722404">Určuje, zda mají prodlevy systému správy napájení a limit délky relací začít běžet až poté, co je v relaci zaznamenána první aktivita uživatele.
 
           Pokud je tato zásada nastavena na hodnotu True, prodlevy systému správy napájení a limit délky relace začnou běžet až poté, co je v relaci zaznamenána první aktivita uživatele.
@@ -766,6 +783,7 @@
 <translation id="3711895659073496551">Pozastavit</translation>
 <translation id="3736879847913515635">Povolit přidání osoby ve správci uživatelů</translation>
 <translation id="3737544779868348650">Název hostitele používaný pro zařízení v síti</translation>
+<translation id="3740754010292550733">Nastavit dobu oznámení o restartu z důvodu aktualizace</translation>
 <translation id="3750220015372671395">Blokovat generování klíčů na těchto stránkách</translation>
 <translation id="3756011779061588474">Blokovat režim pro vývojáře</translation>
 <translation id="3758089716224084329">Umožňuje zadat proxy server, který bude prohlížeč <ph name="PRODUCT_NAME" /> používat, a brání uživatelům ve změně nastavení proxy serveru.
@@ -1474,6 +1492,7 @@
 Pokud tuto zásadu nastavíte, uživatelé ji budou moci dočasně přepsat aktivací nebo deaktivací velkého kurzoru. Volba uživatele nicméně nebude trvalá a po opětovném zobrazení přihlašovací obrazovky nebo nečinnosti uživatele na přihlašovací obrazovce po dobu jedné minuty se obnoví původní nastavení.
 
 Pokud tuto zásadu nenastavíte, bude při prvním zobrazení přihlašovací obrazovky velký kurzor deaktivován. Uživatelé budou moci velký kurzor kdykoli aktivovat nebo deaktivovat a zvolený stav na přihlašovací obrazovce přetrvá i u jiných uživatelů.</translation>
+<translation id="5929855945144989709">Povolit zařízením spouštět v systému Chrome OS virtuální počítače</translation>
 <translation id="5932767795525445337">Tuto zásadu lze využít také k připnutí aplikací pro Android.</translation>
 <translation id="5936622343001856595">Vynutí, aby se při použití Vyhledávání Google vždy aktivovalo Bezpečné vyhledávání, a zabrání uživatelům toto nastavení změnit.
 
@@ -1724,6 +1743,15 @@
 
       Zásada <ph name="SYNC_DISABLED_POLICY_NAME" /> zakáže veškerou synchronizaci dat a tím zásadu RoamingProfileSupportEnabled přepíše.</translation>
 <translation id="6735701345096330595">Vynutit povolení jazyků kontroly pravopisu</translation>
+<translation id="673699536430961464">Toto nastavení uživatelům umožňuje přepínat mezi účty Google v obsahové oblasti okna prohlížeče po přihlášení k zařízení <ph name="PRODUCT_OS_NAME" />.
+
+      Je-li tato zásada nastavena na hodnotu false, přihlášení k jinému učtu z obsahové oblasti neanonymního okna prohlížeče nebude povoleno.
+
+      Pokud tato zásada není nastavena nebo je nastavena na hodnotu true, použije se výchozí chování: přihlášení k jinému účtu z obsahové oblasti prohlížeče bude povoleno s výjimkou dětských účtů, u nichž bude v obsahové oblasti neanonymních oken blokováno.
+
+      Pokud nechcete povolovat přihlášení k jinému účtu pomocí anonymního režimu, zvažte zablokování tohoto režimu pomocí zásady IncognitoModeAvailability.
+
+      Upozorňujeme, že uživatelé budou moci získat přístup ke službám Google v neověřeném stavu tím, že zablokují soubory cookie.</translation>
 <translation id="6757438632136860443">Umožňuje nastavit seznam vzorů adres URL webů, které mají povoleno spouštět plugin <ph name="FLASH_PLUGIN_NAME" />.
 
           Pokud tuto zásadu nenastavíte, použije se pro všechny weby globální výchozí hodnota buď ze zásady DefaultPluginsSetting (pokud je nastavena), nebo z osobní konfigurace uživatele.</translation>
@@ -1733,6 +1761,7 @@
 <translation id="6786967369487349613">Nastavit adresář cestovního profilu</translation>
 <translation id="6810445994095397827">Blokovat JavaScript na těchto stránkách</translation>
 <translation id="681446116407619279">Podporovaná schémata ověření</translation>
+<translation id="6835883744948188639">Zobrazovat uživateli opakovaně výzvu s oznámením, že je doporučen restart</translation>
 <translation id="685769593149966548">Vynutit přísný omezený režim pro YouTube</translation>
 <translation id="687046793986382807">V prohlížečích <ph name="PRODUCT_NAME" /> verze 35 a novějších byla tato zásada zrušena.
 
@@ -2230,7 +2259,7 @@
       Pokud tuto zásadu ponecháte nenastavenou nebo deaktivovanou, budou se soubory PDF otevírat pomocí pluginu PDF (pokud jej uživatel nezakáže).</translation>
 <translation id="8402079500086185021">Soubory PDF otevírat vždy externě</translation>
 <translation id="8412312801707973447">Zda se budou provádět online kontroly OCSP/CRL</translation>
-<translation id="841977920223099909">Ochrana hesla – spouštěč varování</translation>
+<translation id="841977920223099909">Ochrana hesla – spouštěč upozornění</translation>
 <translation id="8424255554404582727">Nastavit výchozí otočení displeje, které se použije při každém restartu</translation>
 <translation id="8426231401662877819">Otočit obrazovku ve směru hodinových ručiček o 90 stupňů</translation>
 <translation id="8451988835943702790">Jako domovskou použít stránku Nová karta</translation>
@@ -2289,7 +2318,7 @@
 Pokud zásada zůstane nenastavena, pokusí se <ph name="PRODUCT_NAME" /> zjistit, zda se server nachází v intranetu, a teprve poté bude reagovat na požadavky IWA. Pokud bude server zjištěn jako internet, bude <ph name="PRODUCT_NAME" /> požadavky IWA ignorovat.</translation>
 <translation id="8672321184841719703">Cílová verze automatické aktualizace</translation>
 <translation id="867410340948518937">U2F (Universal Second Factor)</translation>
-<translation id="8685024486845674965">Ochrana hesla – varování je spouštěno opětovným použitím hesla</translation>
+<translation id="8685024486845674965">Ochrana hesla – upozornění je spouštěno opětovným použitím hesla</translation>
 <translation id="8693243869659262736">Použít integrovaného klienta DNS</translation>
 <translation id="8704831857353097849">Seznam deaktivovaných pluginů</translation>
 <translation id="8711086062295757690">Určuje klíčové slovo, které v adresním řádku spouští vyhledávání tohoto poskytovatele.
@@ -2326,7 +2355,7 @@
       Pokud tato zásada není nastavena, nebo je nastavena na hodnotu false, poloha oznamována nebude.</translation>
 <translation id="8818768076343557335">Předvídat síťové akce u všech nemobilních sítí.
           (Od verze 50 ukončena podpora, od verze 52 odstraněno. Od verze 52 platí, že pokud je nastavena hodnota 1, bude se zásada chovat stejně, jako by byla nastavena hodnota 0 – síťové akce se budou předvídat u všech síťových připojení.)</translation>
-<translation id="8825782996899863372">Ochrana hesla – varování je spouštěno opětovným použitím hesla na phishingové stránce</translation>
+<translation id="8825782996899863372">Ochrana hesla – upozornění je spouštěno opětovným použitím hesla na phishingové stránce</translation>
 <translation id="8828766846428537606">Slouží ke konfiguraci výchozí domovské stránky v prohlížeči <ph name="PRODUCT_NAME" /> a brání uživatelům, aby nastavenou domovskou stránku měnili.
 
       Nastavení domovské stránky uživatele jsou zcela uzamčena pouze v případě, že jako domovskou stránku nastavíte buď stránku Nová karta, nebo adresu URL, kterou zadáte. Pokud adresu URL domovské stránky nezadáte, uživatel bude moci domovskou stránku změnit na stránku Nová karta, a to tím, že zadá řetězec „chrome://newtab“.</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 70ac7e4b..62633e3 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -27,7 +27,7 @@
       Ist diese Richtlinie festgelegt, wird die Anmeldeseite immer in der Sprache angezeigt, die durch den ersten Wert der Richtlinie bestimmt wird. Sie ist als eine Liste für Aufwärtskompatibilität definiert. Ist sie nicht festgelegt oder verweist auf eine leere Liste, wird die Anmeldeseite in der Sprache der letzten Nutzersitzung dargestellt. Ist für diese Richtlinie eine ungültige Sprache festgelegt, wird die Anmeldeseite in einer Ersatzsprache angezeigt, derzeit en-US.</translation>
 <translation id="1062011392452772310">Remote-Bescheinigung (Remote Attestation) für das Gerät aktivieren</translation>
 <translation id="1062407476771304334">Ersetzen</translation>
-<translation id="109166998561583554">Kontomeldeauslöser "Passwortschutz gefährdet"</translation>
+<translation id="109166998561583554">Auslöser für Kontomeldung "Passwortschutz gefährdet"</translation>
 <translation id="1093082332347834239">Ist diese Einstellung aktiviert, läuft der Host für Remote-Unterstützung in einem Prozess mit <ph name="UIACCESS_PERMISSION_NAME" />-Berechtigungen. So kann der Remote-Nutzer mit geöffneten Fenstern auf dem lokalen Desktop arbeiten.
 
           Ist diese Einstellung deaktiviert oder nicht konfiguriert, läuft der Host für Remote-Unterstützung nur im Nutzerbereich. Remote-Nutzer können nicht mit geöffneten Fenstern auf dem Desktop arbeiten.</translation>
@@ -202,6 +202,7 @@
       In der Richtlinie muss eine URL angegeben werden, von der <ph name="PRODUCT_OS_NAME" /> die Nutzungsbedingungen herunterladen kann. Die Nutzungsbedingungen müssen als unformatierter Text mit dem MIME-Typ "text/plain" vorliegen. Markups sind nicht zulässig.</translation>
 <translation id="1750315445671978749">Alle Downloads blockieren</translation>
 <translation id="1781356041596378058">Diese Richtlinie steuert zudem den Zugriff auf Android-Entwickleroptionen. Wenn Sie diese Richtlinie auf "true" setzen, können Nutzer nicht auf die Entwickleroptionen zugreifen. Wenn Sie diese Richtlinie auf "false" setzen oder nicht konfigurieren, können Nutzer auf die Entwickleroptionen zugreifen, indem sie siebenmal auf die Build-Nummer in der Android-App "Einstellungen" tippen.</translation>
+<translation id="1797233582739332495">Dem Nutzer eine wiederkehrende Aufforderung anzeigen, dass ein Neustart erforderlich ist</translation>
 <translation id="1803646570632580723">Liste der in der Übersicht angezeigten Apps ansehen</translation>
 <translation id="1808715480127969042">Cookies auf diesen Websites blockieren</translation>
 <translation id="1827523283178827583">Feste Proxyserver verwenden</translation>
@@ -274,6 +275,11 @@
 
           Wenn diese Richtlinie nicht konfiguriert ist, kommen alle vier Schemas zum Einsatz.</translation>
 <translation id="2067011586099792101">Zugriff auf Websites außerhalb von Inhaltspaketen blockieren</translation>
+<translation id="2070270043919235595">Nutzer benachrichtigen, dass <ph name="PRODUCT_NAME" /> neu gestartet werden muss, um ein ausstehendes Update durchzuführen.
+
+      Mit dieser Richtlinieneinstellung kann der Nutzer durch Benachrichtigungen informiert werden, dass ein Neustart des Browsers empfohlen wird oder erforderlich ist. Wenn die Richtlinie nicht festgelegt ist, wird dem Nutzer in <ph name="PRODUCT_NAME" /> durch kleinere Menüänderungen angezeigt, dass ein Neustart erforderlich ist. Wenn die Richtlinie auf "Recommended" (Empfohlen) festgelegt ist, wird dem Nutzer eine wiederkehrende Warnung angezeigt, dass ein Neustart empfohlen wird. Der Nutzer kann diese Warnung schließen, um den Neustart zu verschieben. Wenn die Richtlinie auf "Required" (Erforderlich) festgelegt ist, wird dem Nutzer eine wiederkehrende Warnung angezeigt, dass nach Ablauf des Benachrichtigungszeitraums ein Neustart des Browsers erzwungen wird. Dieser Zeitraum beträgt standardmäßig sieben Tage und kann über die <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />-Richtlinieneinstellung konfiguriert werden.
+
+      Nach dem Neustart wird die Sitzung des Nutzers wiederhergestellt.</translation>
 <translation id="2077129598763517140">Hardwarebeschleunigung verwenden, falls verfügbar</translation>
 <translation id="2077273864382355561">Verzögerung für die Bildschirmabschaltung im Akkubetrieb</translation>
 <translation id="2082205219176343977">Konfigurieren Sie die für das Gerät erforderliche Mindestversion von Chrome.</translation>
@@ -319,6 +325,9 @@
           Ist diese Einstellung konfiguriert, werden Nutzer, die das schnelle Entsperren verwenden, dazu aufgefordert, ihr Passwort je nach Einstellung auf dem Sperrbildschirm einzugeben.
 
           Ist diese Einstellung nicht konfiguriert, werden Nutzer, die das schnelle Entsperren verwenden, dazu aufgefordert, ihr Passwort jeden Tag auf dem Sperrbildschirm einzugeben.</translation>
+<translation id="2188722565665306629">Mit dieser Einstellung können Sie festlegen, wie lange Benachrichtigungen zum Neustart von <ph name="PRODUCT_NAME" /> angezeigt werden, um ein ausstehendes Update durchzuführen.
+
+      Mit dieser Richtlinieneinstellung kann der Zeitraum in Millisekunden festgelegt werden, in dem ein Nutzer fortschreitend darüber informiert wird, dass <ph name="PRODUCT_NAME" /> oder <ph name="PRODUCT_OS_NAME" /> für ein Update neu gestartet werden muss. Während dieses Zeitraums wird der Nutzer basierend auf der Einstellung der <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-Richtlinie wiederholt über die Notwendigkeit eines Updates informiert. Wenn die Richtlinie nicht festgelegt ist, wird der Standardzeitraum von 604.800.000 Millisekunden verwendet. Dies entspricht einer Woche.</translation>
 <translation id="2194470398825717446">Diese Richtlinie ist in M61 eingestellt, bitte verwenden Sie stattdessen EcryptfsMigrationStrategy.
 
       Hiermit wird angegeben, wie sich ein Gerät verhalten soll, das mit eCryptfs geliefert wurde und nun eine ext4-Verschlüsselung benötigt.
@@ -505,6 +514,13 @@
 <translation id="267596348720209223">Gibt die vom Suchanbieter unterstützten Zeichencodierungen an. Codierungen sind Codepage-Namen wie UTF-8, GB2312 und ISO-8859-1. Sie werden in der Reihenfolge durchprobiert, in der sie angegeben werden. Diese Richtlinie ist optional. Ist sie nicht konfiguriert, so kommt der Standardwert UTF-8 zum Einsatz. Diese Richtlinie wird nur umgesetzt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation>
 <translation id="2682225790874070339">Synchronisierung zwischen Google Drive und der App "Dateien" von <ph name="PRODUCT_OS_NAME" /> deaktivieren</translation>
 <translation id="268577405881275241">Funktion für Datenkomprimierungs-Proxy aktivieren</translation>
+<translation id="2726613915126661822">Mit dieser Einstellung können Sie festlegen, ob virtuelle Maschinen unter Chrome OS ausgeführt werden dürfen.
+
+      Wenn die Richtlinie auf "True" festgelegt ist, dürfen virtuelle Maschinen auf dem Gerät ausgeführt werden.
+      Wenn die Richtlinie auf "False" festgelegt ist, dürfen keine virtuellen Maschinen auf dem Gerät ausgeführt werden.
+      Wenn die Richtlinieneinstellung zu "False" geändert wird, gilt dies für den Start neuer virtueller Maschinen. Bereits ausgeführte virtuelle Maschinen werden jedoch nicht heruntergefahren.
+      Wenn diese Richtlinie auf einem verwalteten Gerät nicht festgelegt ist, dürfen auf dem Gerät keine virtuellen Maschinen ausgeführt werden.
+      Auf nicht verwalteten Geräten dürfen virtuelle Maschinen ausgeführt werden.</translation>
 <translation id="2731627323327011390">Verwendung von <ph name="PRODUCT_OS_NAME" />-Zertifikaten für ARC-Apps deaktivieren</translation>
 <translation id="2742843273354638707">Hiermit werden die Chrome Web Store App und der zugehörige Fußzeilenlink auf der "Neuer Tab"-Seite und im App Launcher von <ph name="PRODUCT_OS_NAME" /> ausgeblendet.
 
@@ -718,6 +734,7 @@
           Diese Richtlinie ist optional. Ist sie nicht festgelegt, wird keine "Neuer Tab"-Seite bereitgestellt.
 
           Die Richtlinie wird nur berücksichtigt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation>
+<translation id="3465852069254497664">Nutzer benachrichtigen, dass ein Neustart des Browsers empfohlen wird oder erforderlich ist</translation>
 <translation id="346731943813722404">Damit legen Sie fest, ob die erste Aktivität des Nutzers in einer Sitzung als Ausgangspunkt für Verzögerungen beim Energiesparmodus und Begrenzungen der Sitzungslänge verwendet werden soll.
           Wenn diese Richtlinie auf "true" gesetzt ist, wie die erste Aktivität des Nutzers in einer Sitzung als Ausgangspunkt für Verzögerungen beim Energiesparmodus und Begrenzungen der Sitzungslänge verwendet.
 
@@ -750,6 +767,7 @@
 <translation id="3711895659073496551">Suspend-Modus</translation>
 <translation id="3736879847913515635">"Person hinzufügen" im Nutzermanager aktivieren</translation>
 <translation id="3737544779868348650">Hostname im Gerätenetzwerk</translation>
+<translation id="3740754010292550733">Zeitraum für Neustartbenachrichtigungen für ein Update festlegen</translation>
 <translation id="3750220015372671395">Schlüsselgenerierung auf diesen Websites blockieren</translation>
 <translation id="3756011779061588474">Entwicklermodus blockieren</translation>
 <translation id="3758089716224084329">Ermöglicht Ihnen, den von <ph name="PRODUCT_NAME" /> verwendeten Proxy-Server anzugeben, und verhindert, dass Nutzer die Proxy-Einstellungen ändern.
@@ -1425,6 +1443,7 @@
           Wenn Sie diese Richtlinie konfigurieren, können die Nutzer sie vorübergehend außer Kraft setzen, indem sie den großen Cursor aktivieren bzw. deaktivieren. Die Nutzerauswahl ist jedoch nicht dauerhaft und die Standardeinstellung wird wiederhergestellt, sobald die Anmeldeseite erneut angezeigt wird oder der Nutzer auf der Anmeldeseite eine Minute lang inaktiv ist.
 
           Falls diese Richtlinie nicht konfiguriert wird, ist der große Cursor deaktiviert, wenn die Anmeldeseite das erste Mal angezeigt wird. Die Nutzer können den großen Cursor jederzeit aktivieren oder deaktivieren und dieser Status bleibt auf der Anmeldeseite erhalten.</translation>
+<translation id="5929855945144989709">Geräten die Ausführung von virtuellen Maschinen unter Chrome OS erlauben</translation>
 <translation id="5932767795525445337">Diese Richtlinie kann auch verwendet werden, um Android-Apps anzuheften.</translation>
 <translation id="5936622343001856595">Erzwingt die Ausführung der Google Websuche mit aktivierter SafeSearch-Funktion und verhindert, dass Nutzer diese Einstellung ändern.
 
@@ -1669,6 +1688,15 @@
 
       Durch die Richtlinie <ph name="SYNC_DISABLED_POLICY_NAME" /> wird die gesamte Datensynchronisierung deaktiviert und somit RoamingProfileSupportEnabled überschrieben.</translation>
 <translation id="6735701345096330595">Aktivierung von Sprachen für die Rechtschreibprüfung erzwingen</translation>
+<translation id="673699536430961464">Mit dieser Einstellung können Nutzer nach der Anmeldung auf ihrem <ph name="PRODUCT_OS_NAME" />-Gerät im Inhaltsbereich des Browserfensters zwischen Google-Konten wechseln.
+
+      Wenn diese Richtlinie auf "false" festgelegt ist, ist die Anmeldung in einem anderen Konto im Inhaltsbereich eines Browsers, der nicht im Inkognitomodus ist, nicht erlaubt.
+
+      Wenn diese Richtlinie nicht oder auf "true" festgelegt ist, wird das Standardverhalten verwendet: Die Anmeldung in einem anderen Konto aus dem Inhaltsbereich eines Browsers ist dann erlaubt; hiervon ausgenommen sind jedoch Konten für Kinder, bei denen die Anmeldung für den Inhaltsbereich eines Browsers, der nicht im Inkognitomodus ist, blockiert wird.
+
+      Falls die Anmeldung in einem anderen Konto über den Inkognitomodus nicht erlaubt ist, können Sie diesen Modus mithilfe der IncognitoModeAvailability-Richtlinie blockieren.
+
+      Hinweis: Nutzer können durch Blockieren von Cookies auf Google-Dienste, die nicht authentifiziert sind, zugreifen.</translation>
 <translation id="6757438632136860443">Ermöglicht die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, denen die Ausführung des Plug-ins "<ph name="FLASH_PLUGIN_NAME" />" gestattet ist.
 
           Ist diese Richtlinie nicht festgelegt, kommt für alle Websites entweder der globale Standardwert der Richtlinie "DefaultPluginsSetting", sofern konfiguriert, oder die persönliche Konfiguration des Nutzers zum Einsatz.</translation>
@@ -1678,6 +1706,7 @@
 <translation id="6786967369487349613">Roaming-Profilverzeichnis festlegen</translation>
 <translation id="6810445994095397827">JavaScript auf diesen Websites blockieren</translation>
 <translation id="681446116407619279">Unterstützte Authentifizierungsschemas</translation>
+<translation id="6835883744948188639">Dem Nutzer eine wiederkehrende Aufforderung anzeigen, dass ein Neustart empfohlen wird</translation>
 <translation id="685769593149966548">Strikt eingeschränkten Modus auf YouTube erzwingen</translation>
 <translation id="687046793986382807">Diese Richtlinie gilt ab <ph name="PRODUCT_NAME" /> Version 35 nicht mehr.
 
@@ -2232,7 +2261,7 @@
       Wenn diese Einstellung aktiviert oder nicht festgelegt ist, können der Browser- und Downloadverlauf gelöscht werden.
 
       Wenn diese Einstellung deaktiviert ist, können der Browser- und Downloadverlauf nicht gelöscht werden.</translation>
-<translation id="8759829385824155666">Zulässige Kerberos-Verschlüsselungsarten</translation>
+<translation id="8759829385824155666">Erlaubte Kerberos-Verschlüsselungstypen</translation>
 <translation id="8764119899999036911">Gibt an, ob der generierte Kerberos-SPN auf dem kanonischen DNS-Namen oder dem ursprünglich eingegebenen Namen basiert. Wenn Sie diese Einstellung aktivieren, wird die CNAME-Suche übersprungen und der Servername so wie eingegeben verwendet. Sollten Sie die Einstellung deaktivieren oder nicht konfigurieren, wird der kanonische Name des Servers per CNAME-Suche ermittelt.</translation>
 <translation id="87812015706645271">Erfordert, dass der Name des lokalen Nutzers und des Remote-Zugriff-Host-Inhabers übereinstimmen</translation>
 <translation id="8782750230688364867">Hiermit wird der Prozentsatz angegeben, um den die Spanne für die Bildschirmabdunkelung skaliert wird, wenn sich das Gerät im Präsentationsmodus befindet.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index bf06420..c55d91d 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -89,6 +89,16 @@
 
       If this policy is set to false, <ph name="PRODUCT_NAME" /> will not allow guest profiles to be started.</translation>
 <translation id="1363275621236827384">Enable queries to Quirks Server for hardware profiles</translation>
+<translation id="1366104148063673624">
+      NOTE: This policy is experimental and may break functionality!
+      If the policy is enabled, each of the named origins in a
+      comma-separated list will run in its own process. This will also isolate
+      origins named by subdomains, e.g. specifying https://example.com/ will
+      also cause https://foo.example.com/ to be isolated as part of the
+      https://example.com/ site.
+      If the policy is disabled, the per-Site Isolation process management logic will take effect.
+      If the policy is not configured, the user will be able to change this setting.
+      </translation>
 <translation id="1387596372902085462">Whether to enable trust in Symantec Corporation's Legacy PKI Infrastructure</translation>
 <translation id="1393485621820363363">Enabled enterprise device printers</translation>
 <translation id="1397855852561539316">Default search provider suggest URL</translation>
@@ -177,6 +187,16 @@
       If this policy is unset, there will be no device printers and the other <ph name="DEVICE_PRINTERS_POLICY_PATTERN" /> policies will be ignored.</translation>
 <translation id="1608755754295374538">URLs that will be granted access to audio capture devices without prompt</translation>
 <translation id="1617235075406854669">Enable deleting browser and download history</translation>
+<translation id="1617923360251336102">
+      NOTE: This policy is experimental and may break functionality!
+      You might want to look at the IsolateOrigins policy setting to get the
+      best of both worlds, isolation and limited impact for users, by using
+      IsolateOrigins with a list of the sites that you want to isolate. This setting,
+      SitePerProcess, isolates all sites.
+      If the policy is enabled, each site will run in its own process.
+      If the policy is disabled, the per-Site Isolation process management logic will take effect.
+      If the policy is not configured, the user will be able to change this setting.
+      </translation>
 <translation id="163200210584085447">Patterns in this list will be matched against the security
       origin of the requesting URL.  If a match is found, access to video
       capture devices will be granted on SAML login pages.  If no match is
@@ -503,6 +523,17 @@
 <translation id="2529700525201305165">Restrict which users are allowed to sign in to <ph name="PRODUCT_NAME" /></translation>
 <translation id="2529880111512635313">Configure the list of force-installed apps and extensions</translation>
 <translation id="253135976343875019">Idle warning delay when running on AC power</translation>
+<translation id="2535309829711666278">
+      NOTE: This policy is experimental and may break functionality!
+      This policy applies to the sign-in screen. Please see also the 'SitePerProcess' policy which applies to the user session. It is recommended to set both policies to the same value.
+      You might want to look at the IsolateOrigins policy setting to get the
+      best of both worlds, isolation and limited impact for users, by using
+      IsolateOrigins with a list of the sites that you want to isolate. This setting,
+      SitePerProcess, isolates all sites.
+      If the policy is enabled, each site will run in its own process.
+      If the policy is disabled, the per-Site Isolation process management logic will take effect.
+      If the policy is not configured, the user will be able to change this setting.
+      </translation>
 <translation id="2552966063069741410">Timezone</translation>
 <translation id="2562339630163277285">Specifies the URL of the search engine used to provide instant results. The URL should contain the string <ph name="SEARCH_TERM_MARKER" />, which will be replaced at query time by the text the user has entered so far.
 
@@ -616,6 +647,12 @@
 <translation id="2893546967669465276">Send system logs to the management server</translation>
 <translation id="2899002520262095963">Android apps can use the network configurations and CA certificates set via this policy, but do not have access to some configuration options.</translation>
 <translation id="2906874737073861391">List of AppPack extensions</translation>
+<translation id="2907992746861405243">Controls which printers from the <ph name="BULK_PRINTERS_POLICY" /> are available to users.
+
+      Designates which access policy is used for bulk printer configuration. If <ph name="PRINTERS_ALLOW_ALL" /> is selected, all printers are shown. If <ph name="PRINTERS_BLACKLIST" /> is selected, <ph name="BULK_PRINTERS_BLACKLIST" /> is used to restrict access to the specified printers. If <ph name="PRINTERS_WHITELIST" /> is selected, <ph name="BULK_PRINTERS_WHITELIST" /> designates only those printers which are selectable.
+
+      If this policy is not set, <ph name="PRINTERS_ALLOW_ALL" /> is assumed.
+      </translation>
 <translation id="2908277604670530363">Maximum number of concurrent connections to the proxy server</translation>
 <translation id="2956777931324644324">This policy has been retired as of <ph name="PRODUCT_NAME" /> version 36.
 
@@ -747,6 +784,12 @@
 <translation id="332771718998993005">Determine the name advertised as a <ph name="PRODUCT_NAME" /> destination.
 
           If this policy is set to a non-empty string, that string will be used as the name of the <ph name="PRODUCT_NAME" /> destination. Otherwise, the destination name will be the device name. If this policy is not set, the destination name will be the device name, and the owner of the device (or a user from the domain managing the device) will be allowed to change it. The name is limited to 24 characters.</translation>
+<translation id="3332365412942111108">Allows you to control the triggering of password protection warning. Password protection alerts users when they reuse their protected password on potentially suspicious sites.
+
+      If this policy is set to 'PasswordProtectionWarningOff', no password protection warning will be shown.
+      If this policy is set to 'PasswordProtectionWarningOnPasswordReuse', password protection warning will be shown when users reuse Google passwords on any non-whitelisted sites.
+      If this policy is set to 'PasswordProtectionWarningOnPhishingReuse', password protection warning will be shown when users reuse Google passwords on phishing sites.
+      If this policy is left unset, password protection warning will be triggered when users reuse Google passwords on phishing sites, but the user can change it.</translation>
 <translation id="3381968327636295719">Use the host browser by default</translation>
 <translation id="3395348522300156660">Specifies the printers which a user can use.
 
@@ -754,6 +797,9 @@
 
       If this policy is used, only the printers with IDs matching the values in this policy are available to the user. The IDs must correspond to the entries in the file specified in <ph name="DEVICE_PRINTERS_POLICY" />.
       </translation>
+<translation id="3414260318408232239">If this policy is not configured then <ph name="PRODUCT_NAME" /> uses a default minimum version which is TLS 1.0.
+
+      Otherwise it may be set to one of the following values: 'tls1', 'tls1.1' or 'tls1.2'. When set, <ph name="PRODUCT_NAME" /> will not use SSL/TLS versions less than the specified version. An unrecognised value will be ignored.</translation>
 <translation id="3417418267404583991">If this policy is set to true or not configured, <ph name="PRODUCT_OS_NAME" /> will enable guest logins. Guest logins are anonymous user sessions and do not require a password.
 
       If this policy is set to false, <ph name="PRODUCT_OS_NAME" /> will not allow guest sessions to be started.</translation>
@@ -867,6 +913,13 @@
 
           If this policy is left unset, the on-screen keyboard is disabled initially but can be enabled by the user at any time.</translation>
 <translation id="382476126209906314">Configure the TalkGadget prefix for remote access hosts</translation>
+<translation id="3831376478177535007">When this setting is enabled, <ph name="PRODUCT_NAME" /> allows certificates issued by Symantec Corporation's Legacy PKI operations to be trusted if they otherwise successfully validate and chain to a recognised CA certificate.
+
+      Note that this policy depends on the operating system still recognising certificates from Symantec's legacy infrastructure. If an OS update changes the OS handling of such certificates, this policy no longer has effect. Further, this policy is intended as a temporary workaround to give enterprises more time to transition away from legacy Symantec certificates. This policy will be removed on or around 1 January 2019.
+
+      If this policy is not set, or it is set to false, then <ph name="PRODUCT_NAME" /> follows the publicly announced deprecation schedule.
+
+      See https://g.co/chrome/symantecpkicerts for more details on this deprecation.</translation>
 <translation id="383466854578875212">Allows you to specify which native messaging hosts are not subject to the blacklist.
 
           A blacklist value of * means that all native messaging hosts are blacklisted and only native messaging hosts listed in the whitelist will be loaded.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 9d5af249..2014b47 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -207,6 +207,7 @@
       La política debe establecerse en una URL de la cual <ph name="PRODUCT_OS_NAME" /> pueda descargar las Condiciones del servicio. Estas deberán estar en texto sin formato y ofrecerse como texto sin formato tipo MIME. No se permiten marcas.</translation>
 <translation id="1750315445671978749">Bloquear todas las descargas</translation>
 <translation id="1781356041596378058">Esta política también controla el acceso a las Opciones para programador de Android. Si habilitas esta política, los usuarios no podrán acceder a las Opciones para programador. Si estableces esta política como falsa o no la estableces, los usuarios podrán acceder a las Opciones para programador al presionar siete veces el número de compilación en la app de Configuración de Android.</translation>
+<translation id="1797233582739332495">Mostrar un mensaje recurrente al usuario para indicarle que debe reiniciar</translation>
 <translation id="1803646570632580723">Lista de aplicaciones fijas para mostrar en el menú de aplicaciones</translation>
 <translation id="1808715480127969042">Bloquear cookies en estos sitios</translation>
 <translation id="1827523283178827583">Usar servidores proxy fijos</translation>
@@ -279,6 +280,11 @@
 
           Si esta política no se configura, se usarán los cuatro esquemas.</translation>
 <translation id="2067011586099792101">Bloquea el acceso a sitios fuera de los paquetes de contenido.</translation>
+<translation id="2070270043919235595">Notifica a los usuarios que deben reiniciar <ph name="PRODUCT_NAME" /> para aplicar una actualización pendiente.
+
+      Esta configuración de la política habilita notificaciones para informarle al usuario que se recomienda o es obligatorio reiniciar. Si no se establece, <ph name="PRODUCT_NAME" /> implementará cambios sutiles en el menú para indicarle al usuario que se necesita reiniciar. Si se establece como "Recomendado", el usuario verá una advertencia recurrente con una recomendación para reiniciar. El usuario puede omitir esta advertencia para posponer el reinicio. Si se establece como "Obligatorio", se le mostrará una advertencia recurrente al usuario para indicarle que el navegador se reiniciará de manera forzada una vez que finalice un período específico. De forma predeterminada, este período es siete días y se puede configurar a través de la configuración de política de <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Después del reinicio, se restablecerá la sesión del usuario.</translation>
 <translation id="2077129598763517140">Usar aceleración de hardware cuando esté disponible</translation>
 <translation id="2077273864382355561">Demora de pantalla apagada con batería</translation>
 <translation id="2082205219176343977">Configura la versión mínima permitida de Chrome para el dispositivo.</translation>
@@ -317,6 +323,9 @@
       Si se establece esta configuración, se les solicitará a los usuarios que usan el desbloqueo rápido que ingresen sus contraseñas en la pantalla bloqueada, de acuerdo con esta configuración.
 
       Si no se establece esta configuración, se les solicitará a los usuarios que usan el desbloqueo rápido que ingresen sus contraseñas en la pantalla bloqueada todos los días.</translation>
+<translation id="2188722565665306629">Permite establecer el período en el que se mostrarán las notificaciones de reinicio de <ph name="PRODUCT_NAME" /> para aplicar una actualización pendiente.
+
+      Esta configuración de política se puede usar para controlar el período, en milisegundos, durante el cual se informan a los usuarios que <ph name="PRODUCT_NAME" /> (o <ph name="PRODUCT_OS_NAME" />) debe reiniciarse para instalar una actualización. En este período, se le informará al usuario de manera reiterada que es necesario instalar una actualización en función de la configuración de la política de <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se establece, se utiliza el período predeterminado de 604800000 milisegundos (una semana).</translation>
 <translation id="2194470398825717446">Esta política dejó de estar disponible en M61, usa EcryptfsMigrationStrategy en su lugar.
 
 Especifica el comportamiento de un dispositivo que se envió con ecryptfs y debe realizar una transición a la encriptación ext4.
@@ -503,6 +512,13 @@
 <translation id="267596348720209223">Especifica la codificación de caracteres admitida por el proveedor de búsqueda. Las codificaciones son nombres de páginas de códigos, como UTF-8, GB2312 e ISO-8859-1. Se prueban en el orden dado. Esta política es opcional. Si no se configura, se usará el valor predeterminado, que es UTF-8. Esta política solo se respeta si la política "DefaultSearchProviderEnabled" está habilitada.</translation>
 <translation id="2682225790874070339">Inhabilita Drive en la aplicación Archivos de <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="268577405881275241">Habilitar la función del proxy de compresión de datos</translation>
+<translation id="2726613915126661822">Permite controlar si las máquinas virtuales pueden ejecutarse en el Sistema operativo Chrome.
+
+      Si la política se establece como verdadera, el dispositivo podrá ejecutar las máquinas virtuales.
+      Si se establece como falsa, el dispositivo no podrá ejecutarlas.
+      Cuando se cambia a falsa, se aplica a las máquinas virtuales que se inician a partir de ese momento, pero no se apagan las máquinas virtuales que ya estén ejecutándose.
+      Cuando no se establece la política en un dispositivo administrado, el dispositivo no podrá ejecutar máquinas virtuales.
+      Los dispositivos no administrados podrán ejecutar máquinas virtuales.</translation>
 <translation id="2731627323327011390">Inhabilitar el uso de certificados de <ph name="PRODUCT_OS_NAME" /> para apps de ARC</translation>
 <translation id="2742843273354638707">Permite ocultar la aplicación Chrome Web Store y el vínculo de la parte inferior de la página Nueva pestaña y del Selector de aplicaciones de <ph name="PRODUCT_OS_NAME" />.
 
@@ -719,6 +735,7 @@
           Esta política es opcional. Si no se establece, no se mostrará una página Nueva pestaña.
 
           Esta política solo se respeta si está habilita la política "DefaultSearchProviderEnabled".</translation>
+<translation id="3465852069254497664">Notificar a un usuario que se recomienda o es obligatorio reiniciar el navegador</translation>
 <translation id="346731943813722404">Especifica si las demoras por administración de energía y el límite de duración de la sesión deben ejecutarse solo después de que se observe actividad inicial en la sesión de un usuario.
 
           Si esta política se establece en "True", las demoras por administración de energía y el límite de duración de la sesión no se ejecutan hasta que se observe actividad inicial en la sesión de un usuario.
@@ -752,6 +769,7 @@
 <translation id="3711895659073496551">Suspender</translation>
 <translation id="3736879847913515635">Habilitar la opción para agregar una persona en el Administrador de usuarios</translation>
 <translation id="3737544779868348650">Nombre de host de la red del dispositivo</translation>
+<translation id="3740754010292550733">Establecer el período de las notificaciones de reinicio para instalar actualizaciones</translation>
 <translation id="3750220015372671395">Bloquear generación de claves en estos sitios</translation>
 <translation id="3756011779061588474">Bloquear modo de programador</translation>
 <translation id="3758089716224084329">Te permite establecer el servidor proxy que usa <ph name="PRODUCT_NAME" /> y evita que los usuarios cambien la configuración del proxy.
@@ -1303,7 +1321,7 @@
 
       Ten en cuenta que, si la plataforma es compatible con las notificaciones de política, el retraso de actualización se establecerá en 24 horas (se ignoran todos los valores predeterminados y el valor de esta política), ya que se espera que las notificaciones de política fuercen una actualización de forma automática cada vez que la política cambie. Esto hace que las actualizaciones frecuentes no sean necesarias.</translation>
 <translation id="5530347722229944744">Bloquear las descargas potencialmente peligrosas</translation>
-<translation id="5530586312297447592">La marca la protección de la contraseña que indica que la cuenta está en riesgo se activa cuando se vuelve a usar la contraseña en una página de suplantación de identidad (phishing)</translation>
+<translation id="5530586312297447592">La marca de la protección de la contraseña que indica que la cuenta está en riesgo se activa cuando se vuelve a usar la contraseña en una página de suplantación de identidad (phishing)</translation>
 <translation id="5535973522252703021">Lista blanca de servidores de delegación de Kerberos</translation>
 <translation id="555077880566103058">Permitir que todos los sitios ejecuten el complemento <ph name="FLASH_PLUGIN_NAME" /> de manera automática</translation>
 <translation id="5559079916187891399">Esta política no tiene efecto en las apps de Android.</translation>
@@ -1424,6 +1442,7 @@
           Si estableces esta política, los usuarios podrán anularla de forma temporal habilitando o inhabilitando el cursor grande. Sin embargo, la selección del usuario no es permanente, y se restablecerá la opción predeterminada cuando se vuelva a mostrar la pantalla de acceso o el usuario permanezca ausente en la pantalla de acceso durante un minuto.
 
           Si no se establece esta política, el cursor grande se inhabilitará la primera vez que se muestre la pantalla de acceso. Los usuarios pueden habilitar o inhabilitar el cursor grande en cualquier momento, y su estado en la pantalla de acceso permanece entre usuarios.</translation>
+<translation id="5929855945144989709">Permitir que los dispositivos ejecuten máquinas virtuales en el Sistema operativo Chrome</translation>
 <translation id="5932767795525445337">Esta política también se puede usar para fijar apps de Android.</translation>
 <translation id="5936622343001856595">Permite forzar las consultas en la Búsqueda web de Google para que se realicen con SafeSearch activado y evitar que los usuarios modifiquen esta configuración.
 
@@ -1667,6 +1686,15 @@
 
       La política <ph name="SYNC_DISABLED_POLICY_NAME" /> inhabilita la sincronización de todos los datos y anula la política RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Habilitar la corrección ortográfica de idiomas</translation>
+<translation id="673699536430961464">Esta configuración permite que los usuarios cambien entre cuentas de Google en el área de contenido de la ventana del navegador después de acceder en el dispositivo con <ph name="PRODUCT_OS_NAME" />.
+
+      Si la política se establece como falsa, no se permitirá acceder en otra cuenta desde el área de contenido de una ventana de navegador que no sea de incógnito.
+
+      Si no se establece o se establece como verdadera, se usará el comportamiento predeterminado: se permitirá acceder a otra cuenta desde el área de contenido del navegador, excepto para las cuentas secundarias, donde se bloqueará para el área de contenido en ventanas que no sean de incógnito.
+
+      En caso de que no deba permitirse el acceso a otra cuenta a través del modo de navegación incógnito, considera bloquear dicho modo mediante la política IncognitoModeAvailability.
+
+      Debes tener en cuenta que, si bloquean sus cookies, los usuarios podrán acceder a los servicios de Google en un estado no autenticado.</translation>
 <translation id="6757438632136860443">Te permite establecer una lista de patrones de URL que especifican los sitios que pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />.
 
           Si esta política no se establece, se usará el valor predeterminado global para todos los sitios, ya sea desde la política "DefaultPluginsSetting", si se establece, o desde otro tipo de configuración personal del usuario.</translation>
@@ -1676,6 +1704,7 @@
 <translation id="6786967369487349613">Establecer el directorio del perfil de itinerancia</translation>
 <translation id="6810445994095397827">Bloquear JavaScript en estos sitios</translation>
 <translation id="681446116407619279">Esquemas de autenticación compatibles</translation>
+<translation id="6835883744948188639">Mostrar un mensaje recurrente al usuario para indicarle que se recomienda reiniciar</translation>
 <translation id="685769593149966548">Aplicar el modo restringido estricto para YouTube</translation>
 <translation id="687046793986382807">Esta política no está disponible a partir de la versión 35 de <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 5a06715..ce2e220a 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -205,6 +205,7 @@
       La política se debe establecer en una URL desde la que <ph name="PRODUCT_OS_NAME" /> podrá descargar las Condiciones de Servicio. Las Condiciones de Servicio deben ser texto sin formato, que actúe como texto/sin formato del tipo MIME. No se permite ningún tipo de marcado.</translation>
 <translation id="1750315445671978749">Bloquear todas las descargas</translation>
 <translation id="1781356041596378058">Esta política también controla el acceso a las Opciones para Desarrolladores de Android. Si se asigna el valor true a esta política, los usuarios no podrán acceder a las Opciones para Desarrolladores. Si se le asigna el valor false o no se configura, los usuarios podrán tocar siete veces el número de compilación en la aplicación Ajustes de Android para acceder a esas opciones.</translation>
+<translation id="1797233582739332495">Mostrar un mensaje periódico al usuario indicando que es necesario reiniciar el navegador</translation>
 <translation id="1803646570632580723">Lista de aplicaciones fijadas que deben aparecer en la barra de aplicaciones</translation>
 <translation id="1808715480127969042">Bloquear cookies en estos sitios</translation>
 <translation id="1827523283178827583">Utilizar servidores proxy fijos</translation>
@@ -283,6 +284,11 @@
 
           Si no se establece esta política, se utilizarán los cuatro esquemas.</translation>
 <translation id="2067011586099792101">Bloquear acceso a sitios no incluidos en paquetes de contenido</translation>
+<translation id="2070270043919235595">Notifica a los usuarios que <ph name="PRODUCT_NAME" /> debe reiniciarse para aplicar una actualización pendiente.
+
+      Este ajuste de la política habilita las notificaciones para informar al usuario de que es necesario o recomendable reiniciar el navegador. Si no se configura, <ph name="PRODUCT_NAME" /> indica al usuario que es necesario reiniciarlo mediante pequeños cambios en el menú. Si se le asigna el valor "Recomendada", se muestra una advertencia al usuario de forma periódica indicando que se recomienda reiniciar el navegador. El usuario puede ignorar esta advertencia y aplazar esta acción. Si se le asigna el valor "Obligatoria", se muestra una advertencia al usuario de forma periódica indicando que se reiniciará el navegador cuando haya transcurrido el periodo de notificación. De forma predeterminada, este periodo dura siete días, pero se puede configurar en los ajustes de la política <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      La sesión del usuario se restaurará cuando el navegador se reinicie.</translation>
 <translation id="2077129598763517140">Utilizar aceleración por hardware cuando esté disponible</translation>
 <translation id="2077273864382355561">Retraso de desconexión de pantalla cuando el dispositivo funciona con la batería</translation>
 <translation id="2082205219176343977">Configurar la versión mínima permitida de Chrome en el dispositivo.</translation>
@@ -327,6 +333,9 @@
           Si se configura esta opción, se solicitará a los usuarios que utilicen el desbloqueo rápido que introduzcan sus contraseñas en la pantalla de bloqueo según corresponda.
 
           Si esta opción no se configura, se solicitará a los usuarios que utilicen el desbloqueo rápido que introduzcan su contraseña en la pantalla de bloqueo todos los días.</translation>
+<translation id="2188722565665306629">Te permite definir cada cuánto tiempo muestra <ph name="PRODUCT_NAME" /> las notificaciones de reinicio para aplicar una actualización pendiente.
+
+      Puedes utilizar esta opción de la política para controlar el periodo (en milisegundos) en el que se informa al usuario de forma progresiva de que debe reiniciar <ph name="PRODUCT_NAME" /> (o de que debe reiniciar <ph name="PRODUCT_OS_NAME" />) para aplicar una actualización. En este periodo, el usuario recibe una notificación de forma periódica indicando que es necesario aplicar una actualización de acuerdo con el ajuste de la política <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si no se le asigna ningún valor, se utiliza el periodo predeterminado, que es de 604.800.000 milisegundos (una semana).</translation>
 <translation id="2194470398825717446">Esta política está obsoleta en M61. En su lugar, utiliza EcryptfsMigrationStrategy.
 
       Especifica cómo debe comportarse un dispositivo que se ha enviado con eCryptfs y tiene que transferirse al sistema de cifrado ext4.
@@ -531,6 +540,13 @@
           Para que se aplique esta política, se debe habilitar la política DefaultSearchProviderEnabled.</translation>
 <translation id="2682225790874070339">Inhabilita Drive en aplicación Archivos de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Habilitar la función del proxy de compresión de datos</translation>
+<translation id="2726613915126661822">Te permite controlar si se pueden utilizar máquinas virtuales en Chrome OS.
+
+      Si se le asigna el valor "True" a la política, el dispositivo puede utilizar máquinas virtuales.
+      Si se le asigna el valor "False" a la política, el dispositivo no puede utilizar máquinas virtuales.
+      Si el valor asignado a esta política se cambia a "False", se aplica a las máquinas virtuales nuevas, pero no afecta a las antiguas que ya se estén utilizando.
+      Si no se le asigna ningún valor en un dispositivo gestionado, este no puede utilizar máquinas virtuales.
+      Los dispositivos no gestionados pueden utilizar máquinas virtuales.</translation>
 <translation id="2731627323327011390">Inhabilitar el uso de certificados de <ph name="PRODUCT_OS_NAME" /> a las aplicaciones ARC</translation>
 <translation id="2742843273354638707">Permite ocultar la aplicación Chrome Web Store y el enlace de la parte inferior de la página en la página Nueva pestaña y en el menú de aplicaciones de <ph name="PRODUCT_OS_NAME" />.
 
@@ -751,6 +767,7 @@
           Esta política es opcional. Si no se establece, no se mostrará una página Nueva pestaña.
 
           Esta política solo se respeta si está habilita la política DefaultSearchProviderEnabled.</translation>
+<translation id="3465852069254497664">Informar al usuario de que es necesario o recomendable reiniciar el navegador</translation>
 <translation id="346731943813722404">Especifica si los retrasos de administración de energía y el límite de duración de sesión se deben ejecutar después de que se haya detectado actividad por parte del usuario en una sesión.
 
           Si esta política se establece en true, los retrasos de administración de energía y el límite de duración de sesión no se ejecutarán hasta que se haya detectado actividad por parte del usuario en una sesión.
@@ -784,6 +801,7 @@
 <translation id="3711895659073496551">Suspender</translation>
 <translation id="3736879847913515635">Habilitar Añadir persona en el administrador de usuarios</translation>
 <translation id="3737544779868348650">Nombre de host de la red del dispositivo</translation>
+<translation id="3740754010292550733">Definir el periodo de las notificaciones de reinicio para aplicar una actualización</translation>
 <translation id="3750220015372671395">Bloquear la generación de claves en estos sitios web</translation>
 <translation id="3756011779061588474">Bloquear el modo de desarrollador</translation>
 <translation id="3758089716224084329">Permite especificar el servidor proxy que utiliza <ph name="PRODUCT_NAME" /> e impide que los usuarios cambien la configuración del proxy.
@@ -1509,6 +1527,7 @@
           Si estableces esta política, los usuarios podrán anularla de forma temporal habilitando o inhabilitando el cursor grande. No obstante, la selección del usuario no es permanente, y se restablecerá la opción predeterminada cuando se vuelva a mostrar la pantalla de inicio de sesión o el usuario permanezca inactivo en la pantalla de inicio durante un minuto.
 
           Si no se establece esta política, el cursor grande se inhabilitará la primera vez que se muestre la pantalla de inicio de sesión. Los usuarios pueden habilitar o inhabilitar el cursor grande en cualquier momento, y su estado en la pantalla de inicio de sesión permanece entre usuarios.</translation>
+<translation id="5929855945144989709">Permitir que los dispositivos utilicen máquinas virtuales en Chrome OS</translation>
 <translation id="5932767795525445337">Esta política también se puede utilizar para fijar aplicaciones Android.</translation>
 <translation id="5936622343001856595">Permite forzar las consultas en la Búsqueda web de Google para que se realicen con Búsqueda Segura activado e impide que los usuarios modifiquen esta configuración.
 
@@ -1765,6 +1784,15 @@
 
       La política <ph name="SYNC_DISABLED_POLICY_NAME" /> inhabilita todas las sincronizaciones de datos y anula RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Forzar que se habilite el corrector ortográfico de idiomas</translation>
+<translation id="673699536430961464">Esta opción permite que los usuarios cambien de una cuenta de Google a otra en el área de contenido de la ventana de su navegador después de haber iniciado sesión en su dispositivo <ph name="PRODUCT_OS_NAME" />.
+
+      Si se le asigna el valor "False" a esta política, los usuarios no podrán iniciar sesión en otra cuenta desde el área de contenido de un navegador que no esté en modo incógnito.
+
+      Si no se asigna ningún valor a esta política o se le asigna el valor "True", se utilizará el comportamiento predeterminado: los usuarios podrán iniciar sesión en otra cuenta desde el área de contenido del navegador, excepto en el caso de cuentas secundarias, en las que se bloqueará esta política en el área de contenido de los navegadores que no estén en modo incógnito.
+
+      En caso de que no deba permitirse iniciar sesión en otra cuenta a través del modo incógnito, este se puede bloquear con la política IncognitoModeAvailability.
+
+      Ten en cuenta que los usuarios podrán acceder a los servicios de Google sin tener que identificarse bloqueando las cookies.</translation>
 <translation id="6757438632136860443">Permite configurar una lista de patrones de URL que especifican los sitios web que pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />.
 
           Si esta política no se configura, se usará para todos los sitios web el valor general predeterminado que se indique en la política "DefaultPluginsSetting" (si se ha configurado) o las preferencias personales del usuario (en caso contrario).</translation>
@@ -1774,6 +1802,7 @@
 <translation id="6786967369487349613">Especificar el directorio de perfiles de itinerancia</translation>
 <translation id="6810445994095397827">Bloquear JavaScript en estos sitios</translation>
 <translation id="681446116407619279">Esquemas de autenticación admitidos</translation>
+<translation id="6835883744948188639">Mostrar un mensaje periódico al usuario indicando que se recomienda reiniciar el navegador</translation>
 <translation id="685769593149966548">Aplicar el modo restringido estricto en YouTube</translation>
 <translation id="687046793986382807">Esta política no está disponible a partir de la versión 35 de <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index adc757d..b87ee10 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -210,6 +210,7 @@
       Reegel tuleb määrata URL-ile, kust <ph name="PRODUCT_OS_NAME" /> saab teenusetingimused alla laadida. Teenusetingimused peavad olema lihtteksti vormingus, esitatud MIME-tüüpi tekstina/lihttekstina. Märgistused pole lubatud.</translation>
 <translation id="1750315445671978749">Blokeeri kõik allalaadimised</translation>
 <translation id="1781356041596378058">See reegel juhib ka juurdepääsu Androidi arendaja valikutele. Kui määrate reegli väärtuseks Tõene, ei pääse kasutajad arendaja valikutele juurde. Kui määrate reegli väärtuseks Väär või jätate selle määramata, pääsevad kasutajad arendaja valikutele juurde, puudutades rakenduses Androidi seaded seitse korda järgunumbrit.</translation>
+<translation id="1797233582739332495">Kuva kasutajale korduv viip, mis näitab, et taaskäivitamine on nõutav</translation>
 <translation id="1803646570632580723">Kinnitatud rakenduste loend, mida näidatakse käivitis</translation>
 <translation id="1808715480127969042">Blokeeri nende saitide küpsised</translation>
 <translation id="1827523283178827583">Kasuta fikseeritud puhverservereid</translation>
@@ -288,6 +289,11 @@
 
           Kui jätate selle reegli määramata, siis kasutatakse kõiki nelja skeemi.</translation>
 <translation id="2067011586099792101">Sisupakettidest väljaspool olevatele saitidele juurdepääsu blokeerimine</translation>
+<translation id="2070270043919235595">Teavitage kasutajaid sellest, et <ph name="PRODUCT_NAME" /> tuleb ooteloleva värskenduse rakendamiseks uuesti käivitada.
+
+      See reegli seade lubab märguanded, mis teavitavad kasutajat sellest, brauseri taaskäivitamine on soovitatav või nõutav. Kui reegel on määramata, <ph name="PRODUCT_NAME" /> näidatakse taaskäivitamise vajadust menüü väikeste muudatuste abil. Kui reegel on seatud väärtusele „Soovitatav”, kuvatakse kasutajale korduv hoiatus, mis annab teada, et taaskäivitamine on soovitatav. Kasutaja saab hoiatusest loobuda, et taaskäivitamine edasi lükata. Kui valitud on väärtus „Nõutav”, kuvatakse kasutajale korduv hoiatus, mis annab teada, et brauser taaskäivitatakse sunniviisiliselt pärast märguandeperioodi möödumist. Perioodi vaikekestus on seitse päeva ja seda saab reegli <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> seadetes konfigureerida.
+
+      Kasutaja seanss taastatakse pärast taaskäivitamist.</translation>
 <translation id="2077129598763517140">Kasuta võimaluse korral riistvarakiirendust</translation>
 <translation id="2077273864382355561">Ekraani väljalülitamise viiteaeg akutoite kasutamisel</translation>
 <translation id="2082205219176343977">Seadmes kõige vanema lubatud Chrome'i versiooni seadistamine.</translation>
@@ -332,6 +338,9 @@
           Kui see seade on seadistatud, peavad kasutajad, kes kasutavad kiiravamist, sisestama lukustuskuval parooli sellest seadest olenevalt.
 
           Kui see seade on seadistamata, peavad kasutajad, kes kasutavad kiiravamist, sisestama lukustuskuval parooli iga päev.</translation>
+<translation id="2188722565665306629">Võimaldab määrata ajavahemiku, mille jooksul kuvatakse märguanded rakenduse <ph name="PRODUCT_NAME" /> taaskäivitamiseks, et rakendada ootelolev värskendus.
+
+      Reegli seade abil saab juhtida ajavahemikku millisekundites, mille jooksul antakse kasutajale regulaarselt teada, et <ph name="PRODUCT_NAME" /> (või <ph name="PRODUCT_OS_NAME" />) tuleb taaskäivitada värskenduse rakendamiseks. Ajavahemiku jooksul teavitatakse kasutajat reegli <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> seade alusel korduvalt sellest, et värskendus on nõutav. Kui reegel on määramata, kasutatakse vaikeperioodi 604 800 000 millisekundit (üks nädal).</translation>
 <translation id="2194470398825717446">Tugi sellele reeglile on versioonis M61 katkestatud. Kasutage selle asemel reeglit EcryptfsMigrationStrategy.
 
       Määrab, kuidas peaks käituma süsteemiga ecryptfs tarnitud seade, mis on vaja üle viia krüpteerimissüsteemile ext4.
@@ -535,6 +544,13 @@
           See reegel kehtivad vaid juhul, kui reegel „DefaultSearchProviderEnabled” on lubatud.</translation>
 <translation id="2682225790874070339">Keelab Drive'i operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> rakenduses Failid</translation>
 <translation id="268577405881275241">Andmete tihendamise puhverserveri funktsiooni lubamine</translation>
+<translation id="2726613915126661822">Võimaldab juhtida, kas virtuaalsete masinate käitamine Chrome OS-is on lubatud.
+
+      Kui reegel on seatud väärtusele Tõene, on seadmes lubatud käitada virtuaalmasinaid.
+      Kui reegel on seatud väärtusele Väär, ei ole seadmes lubatud käitada virtuaalmasinaid.
+      Kui reegli seade asendatakse väärtusega Väär, kehtib see uute virtuaalmasinate käivitamisel, ent juba töötavaid virtuaalmasinaid ei lülitata välja.
+      Kui reegel jäetakse hallatavas seadmes määramata, ei ole seadmes lubatud virtuaalmasinaid käitada.
+      Haldamata seadmetes on lubatud virtuaalmasinaid käitada.</translation>
 <translation id="2731627323327011390">Keela ARC-rakenduste jaoks operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> sertifikaatide kasutamine</translation>
 <translation id="2742843273354638707">Peitke Chrome'i veebipoe rakendus ja jaluse link uuel vahelehel ja operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> rakenduse käivitajas.
 
@@ -755,6 +771,7 @@
           See reegel on valikuline. Kui seda pole määratud, siis ei looda ühtegi uut vahelehte.
 
           Reeglit arvestatakse ainult juhul, kui on lubatud reegel „DefaultSearchProviderEnabled”.</translation>
+<translation id="3465852069254497664">Kasutaja teavitamine sellest, et brauseri taaskäivitamine on soovitatav või nõutav</translation>
 <translation id="346731943813722404">Määrab, kas toitehalduse viivituste ja seansi pikkuse limiidi aktiveerimine peaks toimuma pärast seda, kui seansi ajal on toimunud esmane kasutajatoiming.
 
           Kui reegel on määratud olekule Tõene, siis ei toimu toitehalduse viivituste ja seansi pikkuse limiidi aktiveerimine enne, kui seansi ajal on toimunud esimene kasutajatoiming.
@@ -788,6 +805,7 @@
 <translation id="3711895659073496551">Peata</translation>
 <translation id="3736879847913515635">Kasutajahalduris inimese lisamise lubamine</translation>
 <translation id="3737544779868348650">Seadme võrgu hostinimi</translation>
+<translation id="3740754010292550733">Värskenduse tõttu taaskäivitamise märguannete ajaperioodi määramine</translation>
 <translation id="3750220015372671395">Blokeeri võtmete loomine nendel saitidel</translation>
 <translation id="3756011779061588474">Arendaja režiimi blokeerimine</translation>
 <translation id="3758089716224084329">Võimaldab määrata rakenduse <ph name="PRODUCT_NAME" /> kasutatava puhverserveri ega lase kasutajatel puhverserveri seadeid muuta.
@@ -1505,6 +1523,7 @@
           Kui määrate reegli, saavad kasutajad selle ajutiselt alistada, lubades või keelates suure kursori. Kasutaja valik pole siiski püsiv ja vaikeväärtus taastatakse, kui kuvatakse uuesti sisselogimisekraan või kui kasutaja jääb sisselogimisekraanile minutiks tegevuseta olekusse.
 
           Kui jätate reegli määramata, on suur kursor sisselogimisekraani esmakuvamisel keelatud. Kasutajad võivad suure kursori igal ajal lubada või keelata ja selle olek on sisselogimisekraanil kasutajati püsiv.</translation>
+<translation id="5929855945144989709">Seadmetel Chrome OS-is virtuaalmasinate käitamise lubamine</translation>
 <translation id="5932767795525445337">Seda reeglit saab kasutada ka Androidi rakenduste kinnitamiseks.</translation>
 <translation id="5936622343001856595">Sunnib Google'i veebiotsingute tegemisel kasutama SafeSearchi ja takistab kasutajaid seadet muutmast.
 
@@ -1760,6 +1779,15 @@
 
       Reegel <ph name="SYNC_DISABLED_POLICY_NAME" /> keelab kogu andmete sünkroonimise, alistades reegli RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Õigekirjakontrolli keelte sundlubamine</translation>
+<translation id="673699536430961464">Seade võimaldab kasutajatel pärast operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmesse sisselogimist vahetada Google'i kontosid brauseriakna sisualal.
+
+      Kui reegel on seatud väärtusele Väär, ei ole mitte-inkognito brauseriakna sisualal lubatud muule kontole sisse logida.
+
+      Kui reegel on määratama või seatud väärtusele Tõene, kasutatakse vaikekäitumist: brauseri sisualal on lubatud sisse logida muule kontole, v.a tütarkontode puhul, mille jaoks on funktsioon mitte-inkognito sisualal blokeeritud.
+
+      Kui inkognito režiimi kaudu muule kontole sisselogimine peab olema keelatud, kaaluge režiimi blokeerimist reegliga IncognitoModeAvailability.
+
+      Pange tähele, et kasutajad võivad küpsised blokeerida, et saada juurdepääs autentimata olekus Google'i teenustele.</translation>
 <translation id="6757438632136860443">Võimaldab määrata URL-i mustrite loendi, mis määrab saidid, millel on lubatud pistikprogrammi <ph name="FLASH_PLUGIN_NAME" /> käitada.
 
           Kui jätate selle reegli määramata, kasutatakse kõikide saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultPluginsSetting” (kui see on määratud) või kasutaja isiklikust seadistusest.</translation>
@@ -1769,6 +1797,7 @@
 <translation id="6786967369487349613">Rändlusprofiili kataloogi määramine</translation>
 <translation id="6810445994095397827">Blokeeri JavaScript nendel saitidel</translation>
 <translation id="681446116407619279">Toetatud autentimisskeemid</translation>
+<translation id="6835883744948188639">Kuva kasutajale korduv viip, mis näitab, et taaskäivitamine on soovitatav</translation>
 <translation id="685769593149966548">Jõusta YouTube'is rangelt piiratud režiim</translation>
 <translation id="687046793986382807">Selle reegli pakkumine lõpetati toote <ph name="PRODUCT_NAME" /> versiooniga 35.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index 099e3385..632f4bd9 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -208,6 +208,7 @@
       Tämän käytännön arvoksi määritetään URL-osoite, josta <ph name="PRODUCT_OS_NAME" /> voi ladata käyttöehdot. Käyttöehtojen täytyy olla tavallista tekstiä (MIME-tyyppi text/plain). Muotoilua ei sallita.</translation>
 <translation id="1750315445671978749">Estä kaikki lataukset</translation>
 <translation id="1781356041596378058">Tämä käytäntö hallinnoi myös Android-kehittäjäasetusten käyttöä. Jos tämän käytännön arvoksi määritetään tosi, käyttäjät eivät voi käyttää kehittäjäasetuksia. Jos tämän käytännön arvoksi määritetään epätosi tai sitä ei määritetä ollenkaan, käyttäjät voivat käyttää kehittäjäasetuksia koskettamalla Android-asetukset-sovelluksessa olevaa versionumeroa seitsemän kertaa.</translation>
+<translation id="1797233582739332495">Näytä käyttäjälle toistuva kehote vaaditusta uudelleenkäynnistyksestä</translation>
 <translation id="1803646570632580723">Luettelo kiinnitetyistä sovelluksista, jotka näytetään käynnistyspalkissa</translation>
 <translation id="1808715480127969042">Estä evästeet näissä sivustoissa</translation>
 <translation id="1827523283178827583">Käytä kiinteitä välityspalvelimia</translation>
@@ -279,6 +280,11 @@
           Mahdollisia arvoja ovat basic, digest, ntlm ja negotiate. Erota arvot toisistaan pilkuilla.
           Jos tätä käytäntöä ei ole määritetty, kaikkia neljää todennustapaa tuetaan.</translation>
 <translation id="2067011586099792101">Estä pääsy sisältöpakkauksiin kuulumattomiin sivustoihin</translation>
+<translation id="2070270043919235595">Ilmoita käyttäjille, että <ph name="PRODUCT_NAME" /> on käynnistettävä uudelleen odottavan päivityksen käyttöönottamiseksi.
+
+      Tämän käytäntöasetuksen avulla voit ilmoittaa käyttäjälle, että selaimen uudelleenkäynnistystä suositellaan tai vaaditaan. Jos asetusta ei ole määritetty, <ph name="PRODUCT_NAME" /> kertoo käyttäjälle uudelleenkäynnistyksen tarpeesta hienovaraisilla valikon muutoksilla. Jos tilana on Suositeltu, käyttäjä saa toistuvan varoituksen suositellusta uudelleenkäynnistyksestä. Käyttäjä voi hylätä varoituksen ja lykätä uudelleenkäynnistystä. Jos tilana on Vaadittu, käyttäjä saa toistuvan varoituksen ilmoitusaikaa seuraavasta selaimen pakotetusta uudelleenkäynnistyksestä. Tämä aika on oletuksena seitsemän päivää, ja sitä voi muuttaa <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />-käytäntoasetuksista.
+
+      Käyttäjän käyttökerta palautetaan uudelleenkäynnistyksen jälkeen.</translation>
 <translation id="2077129598763517140">Käytä laitteistokiihdytystä, jos mahdollista</translation>
 <translation id="2077273864382355561">Ruudun sammutuksen viive käytettäessä laitetta akkuvirralla</translation>
 <translation id="2082205219176343977">Määritä vanhin sallittu Chrome-versio laitteelle.</translation>
@@ -324,6 +330,9 @@
           Jos tämä asetus on määritetty, pika-avaamista käyttäviä käyttäjiä pyydetään antamaan salasana lukitusnäytöllä tämän asetuksen mukaisesti.
 
           Jos tätä asetusta ei ole määritetty, pika-avaamista käyttäviä käyttäjiä pyydetään antamaan salasana lukitusnäytöllä päivittäin.</translation>
+<translation id="2188722565665306629">Voit määrittää ajanjakson, jolloin tuotteen <ph name="PRODUCT_NAME" /> uudelleenkäynnistysilmoituksia näytetään.
+
+      Tämän käytäntöasetuksen avulla voit määrittää millisekunteina sen ajan, jolloin käyttäjä saa ilmoituksia päivityksen edellyttämästä tuotteen <ph name="PRODUCT_NAME" /> uudelleenkäynnistyksestä (tai tuotteen <ph name="PRODUCT_OS_NAME" /> uudelleenkäynnistyksestä). Tänä aikana käyttäjä saa toistuvia muistutuksia <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-käytännön mukaisen päivityksen tarpeellisuudesta. Jos ajanjaksoa ei ole määritetty, oletuksena on 604 800 000 millisekuntia (yksi viikko).</translation>
 <translation id="2194470398825717446">Tämä käytäntö on poistettu käytöstä M61:ssä, ota sen sijaan käyttöön EcryptfsMigrationStrategy.
 
       Määrittää laitteen toiminnan, jos se toimitettiin ecryptfs-salauksen kanssa mutta on siirrettävä ext4-salaukseen.
@@ -510,6 +519,13 @@
 <translation id="267596348720209223">Määrittää hakupalvelun tukemat merkkikoodaukset. Koodaukset ovat koodisivun nimiä, kuten UTF-8, GB2312 ja ISO-8859-1. Koodauksia yritetään käyttää määritetyssä järjestyksessä. Tämä käytäntö on valinnainen, ja jos sitä ei ole määritetty, käytetään oletusasetusta (UTF-8). Tämä käytäntö on voimassa vain, jos DefaultSearchProviderEnabled-käytäntö on käytössä.</translation>
 <translation id="2682225790874070339">Poistaa Google Driven käytöstä tuotteen <ph name="PRODUCT_OS_NAME" /> Tiedostot-sovelluksesta</translation>
 <translation id="268577405881275241">Ota käyttöön tietojen pakkauksen välitysominaisuus</translation>
+<translation id="2726613915126661822">Voit määrittää, saako virtuaalikoneita käyttää Chrome-käyttöjärjestelmässä.
+
+      Jos käytännön arvo on tosi, laite saa käyttää virtuaalikoneita.
+      Jos käytännön arvo on epätosi, laite ei saa käyttää virtuaalikoneita.
+      Kun käytännön arvoksi muutetaan epätosi, tämä koskee uusien virtuaalikoneiden käynnistämistä mutta ei sammuta jo käytössä olevia virtuaalikoneita.
+      Jos käytäntöä ei ole määritetty hallinnoidulla laitteella, laite ei saa käyttää virtuaalikoneita.
+      Hallinnoimattomat laitteet saavat käyttää virtuaalikoneita.</translation>
 <translation id="2731627323327011390">Estä ARC-sovelluksia käyttämästä <ph name="PRODUCT_OS_NAME" /> -varmenteita</translation>
 <translation id="2742843273354638707">Piilota Chrome Web Store -sovellus ja linkki Uusi välilehti -sivulla sekä tuotteen <ph name="PRODUCT_OS_NAME" /> sovellusten käynnistysohjelmassa.
 
@@ -727,6 +743,7 @@
           Tämä käytäntö on valinnainen. Jos sitä ei ole asetettu, uutta välilehteä ei tarjota.
 
           Tämä käytäntö toteutetaan, jos käytäntö DefaultSearchProviderEnabled on käytössä.</translation>
+<translation id="3465852069254497664">Ilmoita käyttäjälle, että selaimen uudelleenkäynnistystä suositellaan tai vaaditaan</translation>
 <translation id="346731943813722404">Määritä, alkavatko virranhallinnan viiveet ja istuntojen pituusrajoitukset vasta käyttäjän ensimmäisen toiminnon jälkeen.
 
           Jos tämän käytännön arvoksi on määritetty tosi, virranhallinnan viiveet ja istuntojen pituusrajoitukset eivät ala ennen kuin käyttäjän ensimmäinen istunnon aikainen toiminto on havaittu.
@@ -760,6 +777,7 @@
 <translation id="3711895659073496551">Keskeytä</translation>
 <translation id="3736879847913515635">Salli profiilien luominen käyttäjien hallinnassa</translation>
 <translation id="3737544779868348650">Laitteen verkon isäntänimi</translation>
+<translation id="3740754010292550733">Määritä päivitysten uudelleenkäynnistysilmoitusten ajanjakso</translation>
 <translation id="3750220015372671395">Estä avainten luominen näillä sivustoilla</translation>
 <translation id="3756011779061588474">Estä kehittäjätila</translation>
 <translation id="3758089716224084329">Voit määrittää välityspalvelimen, jota <ph name="PRODUCT_NAME" /> käyttää, ja estää käyttäjiä muokkaamasta välityspalvelinasetuksia.
@@ -1435,6 +1453,7 @@
           Jos määrität tämän käytännön, käyttäjät voivat ohittaa sen väliaikaisesti ottamalla suuren osoittimen käyttöön tai poistamalla sen käytöstä. Käyttäjän valinta ei kuitenkaan ole pysyvä, ja oletusarvo palautetaan käyttöön aina kirjautumisnäytön tullessa näkyviin uudestaan tai käyttäjän ollessa epäaktiivinen kirjautumisnäytössä minuutin ajan.
 
           Jos tätä käytäntöä ei määritetä, suuri osoitin ei ole käytössä kirjautumisnäytön ensimmäisellä näyttökerralla. Käyttäjät voivat ottaa suuren osoittimen käyttöön tai pois käytöstä milloin tahansa, ja sen tila kirjautumisnäytössä pysyy samana, vaikka käyttäjä vaihtuisi.</translation>
+<translation id="5929855945144989709">Salli laitteiden käyttää virtuaalikoneita Chrome-käyttöjärjestelmässä</translation>
 <translation id="5932767795525445337">Tämän käytännön avulla voidaan myös kiinnittää Android-sovelluksia.</translation>
 <translation id="5936622343001856595">Pakottaa Google-verkkohaun kyselyt tehtäväksi SafeSearch-tilassa ja estää käyttäjiä muuttamasta tätä asetusta.
 
@@ -1676,6 +1695,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> poistaa kaiken tietojen synkronoinnin käytöstä ja ohittaa RoamingProfileSupportEnabled-käytännön .</translation>
 <translation id="6735701345096330595">Pakota oikeinkirjoituksen tarkistuskielten käyttöönotto</translation>
+<translation id="673699536430961464">Tämä käytäntö antaa käyttäjien vaihtaa Google-tililtä toiselle selainikkunan sisältöosassa <ph name="PRODUCT_OS_NAME" /> ‑laitteelle kirjautumisen jälkeen.
+
+      Jos käytännön arvo on epätosi, toiselle tilille kirjautuminen ei ole sallittua muun kuin incognito-selaimen sisältöalueella.
+
+      Jos käytännön arvo on tosi tai sille ei ole määritetty arvoa, oletuskäyttäytymistä sovelletaan: toiselle tilille kirjautuminen selaimen sisältöalueella on sallittua, paitsi jos kyseessä on lapsen tili, jolloin se on kiellettyä, paitsi jos kyseessä ole incognito-ikkunan sisältöalue.
+
+      Jos et halua, että toiselle tilille kirjautuminen incognito-tilan avulla on sallittua, voit estää tämän tilan IncognitoModeAvailability-käytännöllä.
+
+      Huomaa, että käyttäjät pääsevät käyttämään Google-palveluja ilman todennusta estämällä evästeet.</translation>
 <translation id="6757438632136860443">Voit määrittää URL-osoitemalleja, joiden määrittämät sivustot saavat suorittaa <ph name="FLASH_PLUGIN_NAME" />-laajennuksen.
 
           Jos tätä käytäntöä ei ole määritetty, kaikkiin sivustoihin sovelletaan DefaultPluginsSetting-käytäntöä (jos se on määritetty) tai käyttäjän omien asetusten mukaista yleistä oletusarvoa.</translation>
@@ -1685,6 +1713,7 @@
 <translation id="6786967369487349613">Määritä roaming-profiilihakemisto</translation>
 <translation id="6810445994095397827">Estä JavaScript näissä sivustoissa</translation>
 <translation id="681446116407619279">Tuetut todennusjärjestelmät</translation>
+<translation id="6835883744948188639">Näytä käyttäjälle toistuva kehote suositellusta uudelleenkäynnistyksestä</translation>
 <translation id="685769593149966548">Pakota rajoitettu tila YouTubessa</translation>
 <translation id="687046793986382807">Tämä käytäntö on poistettu käytöstä tuotteen <ph name="PRODUCT_NAME" /> versiosta 35 alkaen.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 5bbfe595..4e72eec8 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -212,6 +212,7 @@
       La règle doit être définie sur une URL à partir de laquelle <ph name="PRODUCT_OS_NAME" /> peut télécharger les conditions d'utilisation. Ces conditions doivent être en texte brut, et proposées au format texte/brut au type MIME. Aucun balisage n'est autorisé.</translation>
 <translation id="1750315445671978749">Bloquer tous les téléchargements</translation>
 <translation id="1781356041596378058">Cette règle permet également de contrôler l'accès aux options pour les développeurs Android. Si vous définissez cette règle sur "True", les utilisateurs ne pourront pas accéder aux options pour les développeurs. Si vous la définissez sur "False" ou si vous ne la modifiez pas, les utilisateurs pourront accéder aux options pour les développeurs en appuyant sept fois sur le numéro de version dans l'application des paramètres Android.</translation>
+<translation id="1797233582739332495">Afficher une invite récurrente indiquant qu'un redémarrage est nécessaire</translation>
 <translation id="1803646570632580723">Liste des applications épinglées à afficher dans le lanceur d'applications</translation>
 <translation id="1808715480127969042">Bloquer les cookies sur ces sites</translation>
 <translation id="1827523283178827583">Utiliser des serveurs proxy déterminés</translation>
@@ -290,6 +291,11 @@
 
           Si cette règle n'est pas définie, les quatre modèles seront utilisés.</translation>
 <translation id="2067011586099792101">Bloquer l'accès aux sites en dehors des packs de contenu</translation>
+<translation id="2070270043919235595">Avertir les utilisateurs que <ph name="PRODUCT_NAME" /> doit être redémarré pour qu'une mise à jour en cours puisse être appliquée.
+
+      Cette règle active l'envoi de notifications pour avertir l'utilisateur qu'un redémarrage du navigateur est recommandé ou requis. Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> indique à l'utilisateur, par le biais de modifications discrètes du menu, qu'un redémarrage est nécessaire. Si elle est définie sur "Recommandé", un avertissement récurrent s'affiche, indiquant qu'un redémarrage est recommandé. L'utilisateur peut ignorer cet avertissement et redémarrer le navigateur plus tard. Si elle est définie sur "Requis", un avertissement récurrent s'affiche, indiquant que le redémarrage du navigateur sera forcé à l'issue de la période de notification. Par défaut, ce délai est de sept jours, et peut être configuré à l'aide du paramètre <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      La session de l'utilisateur est restaurée après le redémarrage.</translation>
 <translation id="2077129598763517140">Utiliser l'accélération matérielle (le cas échéant)</translation>
 <translation id="2077273864382355561">Délai d'arrêt de l'écran (batterie)</translation>
 <translation id="2082205219176343977">Configurer la version Chrome minimale autorisée de l'appareil.</translation>
@@ -340,6 +346,9 @@
 
 
           Si ce paramètre n'est pas configuré, les utilisateurs sont invités à saisir leur mot de passe tous les jours dans l'écran de verrouillage.</translation>
+<translation id="2188722565665306629">Vous permet de définir la période au cours de laquelle les notifications de redémarrage de <ph name="PRODUCT_NAME" /> concernant l'application d'une mise à jour en cours s'affichent.
+
+      Ce paramètre peut être utilisé pour définir la période, en millisecondes, pendant laquelle un utilisateur est régulièrement averti que <ph name="PRODUCT_NAME" /> (ou <ph name="PRODUCT_OS_NAME" />) doit être redémarré pour être mis à jour. Au cours de cette période, l'utilisateur est régulièrement informé de la nécessité de la mise à jour en fonction du paramètre de la règle <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Si ce paramètre n'est pas défini, la période par défaut utilisée est de 604 800 000 millisecondes (une semaine).</translation>
 <translation id="2194470398825717446">Cette stratégie est obsolète dans M61. Veuillez appliquer "EcryptfsMigrationStrategy" à la place.
 
       Indique le comportement à adopter par un appareil qui a été fourni avec eCryptfs et qui doit faire la transition vers un chiffrement ext4.
@@ -544,6 +553,13 @@
 Cette règle n'est respectée que si la règle "DefaultSearchProviderEnabled" est activée.</translation>
 <translation id="2682225790874070339">Désactiver Drive dans l'application Fichiers de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Activer la fonctionnalité de proxy pour la compression de données</translation>
+<translation id="2726613915126661822">Vous permet d'autoriser l'exécution de machines virtuelles sur Chrome OS.
+
+      Si la règle est définie sur "true", l'appareil est autorisé à exécuter des machines virtuelles.
+      Si elle est définie sur "false", l'appareil n'est pas autorisé à exécuter des machines virtuelles.
+      Lorsque la valeur de cette règle est modifiée et passe de "true" à "false", la règle s'applique au démarrage de nouvelles machines virtuelles. Les machines virtuelles qui s'exécutent déjà ne sont pas arrêtées.
+      Si cette règle n'est pas définie sur un appareil géré, l'appareil n'est pas autorisé à exécuter des machines virtuelles.
+      Les appareils non gérés sont autorisés à exécuter des machines virtuelles.</translation>
 <translation id="2731627323327011390">Désactiver l'utilisation de certificats <ph name="PRODUCT_OS_NAME" /> pour les applications ARC</translation>
 <translation id="2742843273354638707">Masque l'application Chrome Web Store et le lien de bas de page sur la page Nouvel onglet et dans le lanceur d'applications de <ph name="PRODUCT_OS_NAME" />.
 
@@ -767,6 +783,7 @@
           Cette règle est facultative. Si elle n'est pas définie, aucune page Nouvel onglet ne s'affiche.
 
           Cette règle n'est appliquée que si la règle "DefaultSearchProviderEnabled" est activée.</translation>
+<translation id="3465852069254497664">Avertir un utilisateur qu'un redémarrage du navigateur est recommandé ou requis</translation>
 <translation id="346731943813722404">Indiquer si les délais liés à la gestion de l'alimentation et la limite relative à la durée de la session ne doivent être activés que lorsque l'utilisateur a effectué une première activité au cours d'une session.
 
           Si la règle est définie sur "True", les délais liés à la gestion de l'alimentation et la limite relative à la durée de la session ne sont activés que lorsque l'utilisateur a effectué une première activité au cours d'une session.
@@ -800,6 +817,7 @@
 <translation id="3711895659073496551">Arrêter</translation>
 <translation id="3736879847913515635">Autoriser l'ajout de personnes dans le gestionnaire d'utilisateurs</translation>
 <translation id="3737544779868348650">Nom d'hôte du réseau de l'appareil</translation>
+<translation id="3740754010292550733">Définir la période d'affichage des notifications de redémarrage pour mise à jour</translation>
 <translation id="3750220015372671395">Bloquer la génération de clé sur ces sites</translation>
 <translation id="3756011779061588474">Bloquer le mode développeur</translation>
 <translation id="3758089716224084329">Permet de préciser le serveur proxy utilisé par <ph name="PRODUCT_NAME" /> et d'empêcher les utilisateurs de modifier les paramètres de proxy.
@@ -1531,6 +1549,7 @@
           Si vous définissez cette règle, les utilisateurs peuvent l'ignorer temporairement en activant ou en désactivant le grand curseur. Toutefois, cette option n'est pas définitive, et la valeur par défaut est restaurée dès que l'écran de connexion est affiché de nouveau ou que l'utilisateur reste inactif pendant une minute sur l'écran de connexion.
 
           Si vous ne définissez pas cette règle, le grand curseur est désactivé au premier affichage de l'écran de connexion. Les utilisateurs peuvent l'activer ou le désactiver à tout moment, et son état sur l'écran de connexion est appliqué à tous les utilisateurs.</translation>
+<translation id="5929855945144989709">Autoriser les appareils à exécuter des machines virtuelles sur Chrome OS</translation>
 <translation id="5932767795525445337">Ces règles peuvent également être utilisées pour épingler des applications Android.</translation>
 <translation id="5936622343001856595">SafeSearch est obligatoirement activé pour les recherches sur le Web Google et ce paramètre ne peut être modifié par l'utilisateur.
 
@@ -1781,6 +1800,15 @@
 
       La règle <ph name="SYNC_DISABLED_POLICY_NAME" /> entraîne la désactivation de la synchronisation des données, remplaçant ainsi RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Forcer l'activation des langues de la vérification orthographique</translation>
+<translation id="673699536430961464">Ce paramètre permet aux utilisateurs de basculer d'un compte Google à l'autre dans la zone de contenu de la fenêtre de leur navigateur une fois qu'ils sont connectés sur leur appareil <ph name="PRODUCT_OS_NAME" />.
+
+      Si cette règle est définie sur "false", ils ne seront pas autorisés à se connecter à un autre compte depuis la zone de contenu d'un navigateur n'étant pas en mode navigation privée.
+
+      Si elle est définie sur "true" ou si elle n'est pas configurée, le comportement par défaut sera utilisé : ils pourront se connecter à un autre compte depuis la zone de contenu du navigateur, sauf pour les comptes enfant où cela sera bloqué pour la zone de contenu hors navigation privée.
+
+      Dans le cas où la connexion à un autre compte ne doit pas être autorisée par l'intermédiaire du mode navigation privée, pensez à bloquer ce mode à l'aide de la règle IncognitoModeAvailability.
+
+      Notez que les utilisateurs pourront accéder aux services Google dans un état non authentifié en bloquant leurs cookies.</translation>
 <translation id="6757438632136860443">Cette règle permet de définir une liste de formats d'URL spécifiant les sites qui sont autorisés à exécuter le plug-in "<ph name="FLASH_PLUGIN_NAME" />".
 
           Si cette règle n'est pas configurée, la valeur par défaut globale sera utilisée pour tous les sites à partir de la règle "DefaultPluginsSetting", si elle est définie, ou à défaut, à partir de la configuration personnelle de l'utilisateur.</translation>
@@ -1790,6 +1818,7 @@
 <translation id="6786967369487349613">Définir le répertoire des profils itinérants</translation>
 <translation id="6810445994095397827">Bloquer JavaScript sur ces sites</translation>
 <translation id="681446116407619279">Modèles d'authentification compatibles</translation>
+<translation id="6835883744948188639">Afficher une invite récurrente indiquant qu'un redémarrage est recommandé</translation>
 <translation id="685769593149966548">Appliquer le mode restreint strict sur YouTube</translation>
 <translation id="687046793986382807">Cette règle a été supprimée de la version 35 de <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index d03bb1c..20dfb4e 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -257,6 +257,7 @@
       નીતિ એ URL પર સેટ કરવી કે જેમાંથી <ph name="PRODUCT_OS_NAME" /> સેવાની શરતોને ડાઉનલોડ કરી શકે. સેવાની શરતો સાદા ટેક્સ્ટમાં, MIME પ્રકાર ટેક્સ્ટ/સાદા તરીકે આપેલી હોવી આવશ્યક છે. કોઈ માર્કઅપની મંજૂરી નથી.</translation>
 <translation id="1750315445671978749">બધા ડાઉનલોડ અવરોધિત કરો</translation>
 <translation id="1781356041596378058">આ નીતિ Android વિકાસકર્તા વિકલ્પોની ઍક્સેસને પણ નિયંત્રિત કરે છે. જો તમે આ નીતિને true પર સેટ કરેલ હોય, તો વપરાશકર્તાઓ, વિકાસકર્તા વિકલ્પોને ઍક્સેસ કરી શકતાં નથી. જો તમે આ નીતિ false પર સેટ કરેલ હોય અથવા તો સેટ કર્યા વિના છોડી દીધેલ હોય, તો વપરાશકર્તાઓ, Android સેટિંગ્સ ઍપ્લિકેશનમાં બિલ્ડ નંબર પર સાત વાર ટૅપ કરીને વિકાસકર્તા વિકલ્પોને ઍક્સેસ કરી શકે છે.</translation>
+<translation id="1797233582739332495">વપરાશકર્તાને રીલૉન્ચ કરવાની આવશ્યકતા છે તેવું વારંવાર દર્શાવતો સંકેત બતાવો</translation>
 <translation id="1803646570632580723">લૉન્ચરમાં બતાવવા માટે પિન કરેલી એપ્લિકેશંસની સૂચિ</translation>
 <translation id="1808715480127969042">આ સાઇટ્સ પર કૂકીઝને અવરોધિત કરો</translation>
 <translation id="1827523283178827583">સ્થિર પ્રોક્સી સર્વર્સનો ઉપયોગ કરો</translation>
@@ -340,6 +341,11 @@
 
           જો નીતિ સેટ કર્યા વિના છોડેલી છે, તો બધી ચાર યોજનાઓનો ઉપયોગ કરવામાં આવશે.</translation>
 <translation id="2067011586099792101">સામગ્રી પૅક્સની બહારની સાઇટ્સની ઍક્સેસ અવરોધિત કરો</translation>
+<translation id="2070270043919235595">વપરાશકર્તાઓને સૂચિત કરો કે <ph name="PRODUCT_NAME" /> એ બાકી અપડેટને લાગુ કરવા માટે રીલૉન્ચ કરવું આવશ્યક છે.
+
+      આ નીતિની સેટિંગ વપરાશકર્તાને જાણ કરવા માટે નોટિફિકેશનને ચાલુ કરે છે કે બ્રાઉઝર રીલૉન્ચ કરવાનો સુઝાવ આપેલ છે અથવા આવશ્યક છે. જો તે સેટ કરવામાં આવ્યું ન હોય, તો <ph name="PRODUCT_NAME" /> વપરાશકર્તાને ઝીણવટભર્યા ફેરફારોથી દર્શાવવામાં આવે છે કે તેના મેનૂને રીલૉન્ચ કરવું જરૂરી છે. જો 'સુઝાવ આપેલ' પર સેટ કરવામાં આવ્યું હોય, તો રીલૉન્ચ કરવાનો સુઝાવ આપેલ છે તેવી ચેતવણી વપરાશકર્તાને વારંવાર બતાવવામાં આવશે. રીલૉન્ચ મુલતવી રાખવા માટે વપરાશકર્તા આ ચેતવણીને છોડી શકે છે. જો 'આવશ્યક' તરીકે સેટ કરવામાં આવ્યું હોય, તો વપરાશકર્તાને એવું દર્શાવતી ચેતવણી વારંવાર બતાવવામાં આવશે કે જ્યાં સુધી નોટિફિકેશનનો સમયગાળો પસાર ન થઈ જાય, ત્યાં સુધી બ્રાઉઝરને ફરજિયાત પણે રીલૉન્ચ કરવામાં આવશે. ડિફૉલ્ટ તરીકે આ સમયગાળો સાત દિવસનો હોય છે અને તેને કદાચ <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />ની નીતિ સેટિંગ મારફતે ગોઠવવામાં આવી શકે છે.
+
+      રીલૉન્ચ કર્યા પછી વપરાશકર્તાનું સત્ર પાછું મેળવવામાં આવે છે.</translation>
 <translation id="2077129598763517140">હાર્ડવેર ઍક્સિલરેશન ઉપલબ્ધ હોવા પર ઉપયોગ કરો</translation>
 <translation id="2077273864382355561">જ્યારે બેટરી પાવર પર ચાલી રહ્યું હોય ત્યારે સ્ક્રીન બંધ વિલંબ</translation>
 <translation id="2082205219176343977">ઉપકરણ માટે Chromeના ન્યૂનતમ માન્ય વર્ઝનની ગોઠવણી કરો.</translation>
@@ -389,6 +395,9 @@
           જો આ સેટિંગ ગોઠવવામાં આવી હોય, તો ઝડપી અનલૉકનો ઉપયોગ કરતાં વપરાશકર્તાઓને આ સેટિંગના આધારે લૉક સ્ક્રીન પર તેમના પાસવર્ડ્સ દાખલ કરવાની વિનંતી કરવામાં આવશે.
 
           જો આ સેટિંગ ગોઠવવામાં આવેલ ન હોય, તો ઝડપી અનલૉકનો ઉપયોગ કરતાં વપરાશકર્તાઓને લૉક સ્ક્રીન પર દરરોજ તેમનો પાસવર્ડ દાખલ કરવાની વિનંતી કરવામાં આવશે.</translation>
+<translation id="2188722565665306629">એક બાકી અપડેટને લાગુ કરવા માટે <ph name="PRODUCT_NAME" />ના રીલૉન્ચ કરવાના નોટિફિકેશન બતાવવા માટે તમને સમયગાળો સેટ કરવાની મંજૂરી આપે છે.
+
+      આ નીતિ સેટિંગનો ઉપયોગ સમયગાળાને મિલીસેકન્ડમાં નિયંત્રિત કરવા માટે કરી શકાય છે, જેમાં એક વપરાશકર્તાને ક્રમશઃ જણાવવામાં આવે છે કે અપડેટ માટે <ph name="PRODUCT_NAME" />ને રીલૉન્ચ કરવું આવશ્યક છે (અથવા <ph name="PRODUCT_OS_NAME" />ને ફરીથી શરૂ કરવું આવશ્યક છે). આ સમયગાળા દરમિયાન, વપરાશકર્તાને વારંવાર <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />ની નીતિના સેટિંગ આધારિત અપડેટની જરૂરિયાત વિશે જાણ કરવામાં આવશે. જો તે સેટ કરવામાં આવી ન હોય, તો 604800000 મિલીસેકન્ડ (એક અઠવાડિયું)ના ડિફૉલ્ટ સમયગાળાનો ઉપયોગ કરવામાં આવશે.</translation>
 <translation id="2194470398825717446">આ નીતિ M61માં ટાળવામાં આવે છે, તેના બદલે કૃપા કરીને EcryptfsMigrationStrategyનો ઉપયોગ કરો.
 
       ecryptfs સાથે રવાના કરવામાં આવેલ અને ext4 એન્ક્રિપ્શન પર ટ્રાન્ઝિશનની આવશ્યકતા ધરાવતું ઉપકરણ કઈ રીતે કાર્ય કરવું જોઈએ તેનો ઉલ્લેખ કરે છે.
@@ -617,6 +626,13 @@
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> ફાઇલ્સ એપ્લિકેશનમાં ડ્રાઇવને અક્ષમ કરે છે</translation>
 <translation id="268577405881275241">ડેટા સંકોચન પ્રોક્સી સુવિધા સક્ષમ કરો</translation>
 <translation id="2710534340210290498">જો આ નીતિ false પર સેટ કરેલ છે, તો વપરાશકર્તાઓ સ્ક્રીનને લૉક કરવામાં સમર્થ હશે નહીં (ફક્ત વપરાશકર્તા સત્રથી સાઇન આઉટ કરવું જ શક્ય હશે). જો આ સેટિંગ true પર સેટ કરેલ છે અથવા તો સેટ કરેલ નથી, તો વપરાશકર્તાઓ જે પાસવર્ડ વડે પ્રમાણીકૃત થયેલ છે તે સ્ક્રીનને લૉક કરી શકે છે.</translation>
+<translation id="2726613915126661822">વર્ચ્યુઅલ મશીન Chrome OS પર ચાલે તેની મંજૂરી આપવી કે નહીં તે તમે નિયંત્રિત કરી શકો છો.
+
+      જો નીતિને True પર સેટ કરવામાં આવી હોય, તો ઉપકરણને વર્ચ્યુઅલ મશીન ચલાવવાની મંજૂરી રહેશે.
+      જો નીતિને False પર સેટ કરવામાં આવી હોય, તો ઉપકરણને વર્ચ્યુઅલ મશીન ચલાવવાની મંજૂરી રહેશે નહીં.
+      જયારે આ નીતિને False પર બદલવામાં આવે, ત્યારે વર્ચ્યુઅલ મશીનને શરૂ કરવા માટે તે લાગુ થશે પરંતુ જે પહેલાંથી ચાલી રહ્યાં હોય તેવા વર્ચ્યુઅલ મશીનને બંધ કરશે નહીં.
+      જયારે આ નીતિને મેનેજ કરેલ ઉપકરણ પર સેટ કરવામાં આવી ન હોય, ત્યારે ઉપકરણને વર્ચ્યુઅલ મશીન ચલાવવાની મંજૂરી રહેશે નહીં.
+      મેનેજ કર્યા વગરના ઉપકરણોને વર્ચ્યુઅલ મશીન ચલાવવાની મંજૂરી હોય છે.</translation>
 <translation id="2731627323327011390">ARC ઍપ્લિકેશનો માટે <ph name="PRODUCT_OS_NAME" /> પ્રમાણપત્રના વપરાશને અક્ષમ કરો</translation>
 <translation id="2742843273354638707">નવું ટેબ પૃષ્ઠ અને <ph name="PRODUCT_OS_NAME" /> એપ લૉન્ચરથી Chrome વેબ દુકાન ઍપ્લિકેશન અને ફૂટર લિંકને છુપાવો.
 
@@ -865,6 +881,7 @@
           આ નીતિ વૈકલ્પિક છે. જો સેટ કરી નથી, તો કોઈ નવું ટેબ પૃષ્ઠ પ્રદાન કરવામાં આવશે નહીં.
 
           જો 'DefaultSearchProviderEnabled' નીતિ સક્ષમ હોય તો જ આ નીતિનું સન્માન કરવામાં આવે છે.</translation>
+<translation id="3465852069254497664">એક વપરાશકર્તાને સૂચિત કરો કે બ્રાઉઝર રીલૉન્ચ કરવાનો સુઝાવ આપેલ અથવા આવશ્યક છે</translation>
 <translation id="346731943813722404">પાવર મેનેજમેન્ટ વિલંબ અને સત્ર લંબાઇ મર્યાદા એક સત્રમાં પ્રથમ વપરાશકર્તા પ્રવૃત્તિ ધ્યાનમાં આવે પછી જ પ્રારંભ થવી જોઇએ કે કેમ તે સ્પષ્ટ કરે છે.
 
           જો આ નીતિ સાચા પર સેટ થયેલી હોય, તો પાવર મેનેજમેન્ટમાં વિલંબ થાય છે અને સત્ર મર્યાદા એક સત્રમાં પ્રથમ વપરાશકર્તા પ્રવૃત્તિ ધ્યાનમાં ન આવે ત્યાં સુધી પ્રારંભ થતી નથી.
@@ -915,6 +932,7 @@
 <translation id="3734995764843493369">દરરોજ (24 કલાક) પાસવર્ડ એન્ટ્રી જરૂરી છે</translation>
 <translation id="3736879847913515635">વપરાશકર્તા સંચાલકમાં વ્યક્તિ ઉમેરોને સક્ષમ કરો</translation>
 <translation id="3737544779868348650">ઉપકરણના નેટવર્કના હોસ્ટનું નામ</translation>
+<translation id="3740754010292550733">રીલૉન્ચ કરવાના નોટિફિકેશનના અપડેટ માટેનો સમયગાળો સેટ કરો</translation>
 <translation id="3750220015372671395">આ સાઇટ્સ પર કી જનરેશનને અવરોધિત કરો</translation>
 <translation id="375266612405883748">આ મશીનમાં રિમોટ ઍક્સેસ હોસ્ટ દ્વારા ઉપયોગમાં લેવાતી UDP પોર્ટ શ્રેણીને પ્રતિબંધિત કરે છે.
 
@@ -1274,7 +1292,7 @@
 
           સંભવિત સેટિંગ અને આ નીતિની સંરચનાના સંપૂર્ણ વર્ણન માટે કૃપા કરીને https://www.chromium.org/administrators/policy-list-3/extension-settings-full ની મુલાકાત લો
           </translation>
-<translation id="4554651132977135445">વપરાશકર્તા નીતિ લૂપબેક પ્રક્રિયા મોડ</translation>
+<translation id="4554651132977135445">વપરાશકર્તા નીતિ લૂપબૅક પ્રક્રિયા મોડ</translation>
 <translation id="4555850956567117258">વપરાશકર્તા માટે દૂરસ્થ પ્રમાણન સક્ષમ કરો</translation>
 <translation id="4557134566541205630">ડિફોલ્ટ શોધ પ્રદાતા નવું ટેબ પૃષ્ઠ URL</translation>
 <translation id="4578912515887794133">જો આ સેટિંગ સક્ષમ કરેલ હોય, તો પછી રિમોટ ઍક્સેસ હોસ્ટ, સ્થાનિક વપરાશકર્તાના નામની (હોસ્ટ જેની સાથે સંકળાયેલો હોય તે) અને હોસ્ટ માલિક તરીકે નોંધાયેલ Google એકાઉન્ટના નામની (એટલે કે જો "johndoe@example.com" Google એકાઉન્ટ એ હોસ્ટના માલિક હોય તો "johndoe") સરખામણી કરે છે.  જો હોસ્ટ માલિકનું નામ હોસ્ટ જેની સાથે સંકળાયેલ હોય તે સ્થાનિક વપરાશકર્તાના નામથી ભિન્ન હોય તો રિમોટ ઍક્સેસ હોસ્ટનો શરૂ થશે નહીં. હોસ્ટ માલિકનું Google એકાઉન્ટ ચોક્કસ ડોમેન (એટલે કે "example.com") સાથે સંકળાયેલું છે તે લાગુ કરવા માટે પણ RemoteAccessHostMatchUsername નીતિનો RemoteAccessHostDomain ની સાથે ઉપયોગ થવો જોઈએ.
@@ -1796,6 +1814,7 @@
           જો તમે આ નીતિને સેટ કરેલી હોય, તો વપરાશકર્તાઓ મોટા કર્સરને સક્ષમ અથવા અક્ષમ કરીને તેને અસ્થાયીરૂપે ઓવરરાઇડ કરી શકે છે. જોકે, વપરાશકર્તાની પસંદગી નિરંતર નથી અને જ્યારે પણ લોગિન સ્ક્રીન નવેસરથી બતાવવામાં આવે અથવા વપરાશકર્તા લોગિન સ્ક્રીન પર એક મિનિટ માટે નિષ્ક્રિય રહે ત્યારે ડિફોલ્ટ પુનઃસ્થાપિત થાય છે.
 
           જો આ નીતિને સેટ કર્યા વિના છોડેલી હોય, તો લોગિન સ્ક્રીન પહેલી વખત બતાવવામાં આવે ત્યારે મોટું કર્સર અક્ષમ હોય છે. વપરાશકર્તાઓ કોઈ પણ સમયે મોટું કર્સર સક્ષમ અથવા અક્ષમ કરી શકે છે અને લોગિન સ્ક્રીન પર તેની સ્થિતિ વપરાશકર્તાઓ વચ્ચે નિરંતર હોય છે.</translation>
+<translation id="5929855945144989709">ઉપકરણોને Chrome OS પર વર્ચ્યુઅલ મશીન ચલાવવાની મંજૂરી આપો</translation>
 <translation id="5932767795525445337">આ નીતિનો ઉપયોગ Android ઍપને પિન કરવા માટે પણ થઈ શકે છે.</translation>
 <translation id="5936622343001856595">ક્વેરીઝને Google વેબ શોધમાં સક્રિય તરીકે સેટ SafeSearch સાથે પૂર્ણ કરવાની ફરજ પાડે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલતા અટકાવે છે.
 
@@ -2054,6 +2073,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> નીતિ RoamingProfileSupportEnabledને ઓવરરાઇડ કરીને, બધા ડેટાને સિંક કરવાનું અક્ષમ કરે છે.</translation>
 <translation id="6735701345096330595">જોડણી-તપાસ ભાષાઓને ચાલુ કરવાની ફરજ પાડો</translation>
+<translation id="673699536430961464">આ સેટિંગ વપરાશકર્તાઓને તેમના <ph name="PRODUCT_OS_NAME" /> ઉપકરણમાં સાઇન ઇન કરે તે પછી તેમને તેમની બ્રાઉઝર વિંડોના કન્ટેન્ટ ક્ષેત્રમાં Google એકાઉન્ટ વચ્ચે સ્વિચ કરવાની મંજૂરી આપે છે.
+
+      આ નીતિને false પર સેટ કરવામાં આવી હોય, તો બિન-છૂપા બ્રાઉઝર કન્ટેન્ટ ક્ષેત્રમાંથી એક અલગ એકાઉન્ટમાં સાઇન ઇન કરવાની મંજૂરી અપાશે નહીં.
+
+      જો આ નીતિને સેટ કર્યા વિના રાખી હોય અથવા true પર સેટ કરવામાં આવી હોય, તો ડિફૉલ્ટ વર્તણૂકનો ઉપયોગ કરાશે: બ્રાઉઝર કન્ટેન્ટ ક્ષેત્રમાંથી એક અલગ એકાઉન્ટમાં સાઇન ઇન કરવાની મંજૂરી આપવામાં આવશે, સિવાય કે બાળકના એકાઉન્ટમાં કે જેમાં તેને બિન-છૂપા કન્ટેન્ટ ક્ષેત્ર માટે બ્લૉક કરેલ રહેશે.
+
+      જો છૂપા મોડ મારફતે એક અલગ એકાઉન્ટમાં સાઇન ઇન કરવાની મંજૂરી ન આપવી હોય, એવા કિસ્સામાં IncognitoModeAvailability નીતિનો ઉપયોગ કરીને તેવા મોડને બ્લૉક કરવાનું વિચારો.
+
+      નોંધો કે વપરાશકર્તાઓ તેઓની કુકીને બ્લૉક કરીને એક અનધિકૃત સ્થિતિમાં Google સેવાઓને ઍક્સેસ કરી શકશે.</translation>
 <translation id="6757438632136860443">તમને તે URLપેટર્નની સૂચિ સેટ કરવાની મંજૂરી આપે છે કે જેમાં <ph name="FLASH_PLUGIN_NAME" /> પ્લગ-ઇન ચલાવવાની મંજૂરી હોય તેવી સાઇટનો ઉલ્લેખ કરેલો હોય.
 
           જો આ નીતિને સેટ કર્યા વિના છોડવામાં આવી હોય, તો બધી સાઇટ માટે 'DefaultPluginsSetting' નીતિમાંથી જો સેટ કરેલ હોય, અન્યથા વપરાશકર્તાની વ્યક્તિગત ગોઠવણીમાંથી વૈશ્વિક ડિફૉલ્ટ મૂલ્યનો ઉપયોગ કરવામાં આવશે.</translation>
@@ -2063,6 +2091,7 @@
 <translation id="6786967369487349613">રોમિંગ પ્રોફાઇલ નિર્દેશિકા સેટ કરો</translation>
 <translation id="6810445994095397827">આ સાઇટ્સ પર JavaScript ને અવરોધિત કરો</translation>
 <translation id="681446116407619279">સપોર્ટેડ પ્રમાણીકરણ યોજનાઓ </translation>
+<translation id="6835883744948188639">વપરાશકર્તાને રીલૉન્ચ કરવાનો સુઝાવ આપેલ છે તેવું વારંવાર દર્શાવતો સંકેત બતાવો</translation>
 <translation id="685769593149966548">YouTube માટે ચુસ્ત પ્રતિબંધિત મોડ લાગુ કરો</translation>
 <translation id="687046793986382807">આ નીતિ <ph name="PRODUCT_NAME" /> સંસ્કરણ 35 થી હટાવવામાં આવી છે.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index babd4ce..402077a 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -210,6 +210,7 @@
       नीति को किसी ऐसे URL पर सेट किया जाना चाहिए जिससे <ph name="PRODUCT_OS_NAME" /> सेवा की शर्तों डाउनलोड कर सके. सेवा की शर्तों सादा लेख में होनी चाहिए, MIME प्रकार के लेख/सादे के रूप में प्रदान की जानी चाहिए. किसी मार्कअप की अनुमति नहीं है.</translation>
 <translation id="1750315445671978749">सभी डाउनलोड ब्लॉक करें</translation>
 <translation id="1781356041596378058">यह नीति Android डेवलपर विकल्प का एक्सेस भी नियंत्रित करती है. यदि आप इस नीति को सही पर सेट करते हैं, तो उपयोगकर्ता डेवलपर विकल्प का एक्सेस नियंत्रित नहीं कर सकते. यदि आप इस नीति को गलत पर सेट करते हैं या सेट किए बिना छोड़ देते हैं, तो उपयोगकर्ता Android सेटिंग ऐप्लिकेशन में बिल्ड संख्या पर सात बार टैप करके डेवलपर विकल्प एक्सेस कर सकते हैं.</translation>
+<translation id="1797233582739332495">उपयोगकर्ता को बार-बार यह सूचित करने वाला संकेत दिखाती है कि फिर से लॉन्च करना ज़रूरी है</translation>
 <translation id="1803646570632580723">लॉन्चर में दिखाए जाने वाले पिन किए गए ऐप्स  की सूची</translation>
 <translation id="1808715480127969042">इन साइटों पर कुकी अवरुद्ध करें</translation>
 <translation id="1827523283178827583">निश्चित प्रॉक्सी सर्वर का उपयोग करें</translation>
@@ -283,6 +284,11 @@
 
           यदि इस पॉलिसी को सेट नहीं किया जाता है, तो चारों योजनाओं का उपयोग किया जाएगा.</translation>
 <translation id="2067011586099792101">सामग्री पैक से बाहर की साइटों की एक्‍सेस अवरुद्ध करें</translation>
+<translation id="2070270043919235595">उपयोगकर्ताओं को सूचित करती है कि जिस अपडेट की मंज़ूरी बाकी है उसे लागू करने के लिए <ph name="PRODUCT_NAME" /> को फिर से लॉन्च करना होगा.
+
+      यह नीति सेटिंग उपयोगकर्ता को इस बात की सूचना देने के लिए सूचनाएं चालू करती है कि ब्राउज़र को फिर से लॉन्च करने का सुझाव दिया गया है या ऐसा करना ज़रूरी है. अगर सेट नहीं होती है, तो <ph name="PRODUCT_NAME" /> उपयोगकर्ता को यह बताता है कि उसके मेन्यू में खास बदलावों के ज़रिए फिर से लॉन्च करना ज़रूरी है. अगर 'सुझाया गया' पर सेट होती है, तो उपयोगकर्ता को बार-बार यह चेतावनी दिखाएगी कि फिर से लॉन्च करने का सुझाव दिया गया है. उपयोगकर्ता फिर से लॉन्च करने को टालने के लिए इस चेतावनी को खारिज कर सकता है. अगर 'ज़रूरी' पर सेट होती है, तो उपयोगकर्ता को बार-बार यह चेतावनी दिखाएगी कि सूचना की अवधि खत्म होने पर ब्राउज़र को बिना पूछे फिर से लॉन्च कर दिया जाएगा. डिफ़ॉल्ट रूप से यह अवधि सात दिनों की होती है और <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> नीति सेटिंग के ज़रिए कॉन्फ़िगर की जा सकती है.
+
+      फिर से लॉन्च करने के बाद उपयोगकर्ता का सत्र बहाल कर दिया जाता है.</translation>
 <translation id="2077129598763517140">उपलब्ध होने पर हार्डवेयर त्वरण का उपयोग करें</translation>
 <translation id="2077273864382355561">बैटरी पावर पर चलते समय स्क्रीन बंद विलंब</translation>
 <translation id="2082205219176343977">डिवाइस के लिए कम से कम अनुमत Chrome वर्शन कॉन्फ़िगर करें.</translation>
@@ -325,6 +331,9 @@
           यदि यह सेटिंग कॉन्फ़िगर की जाती है, तो तुरंत अनलॉक करें का उपयोग करने वाले उपयोगकर्ताओं से इस सेटिंग के आधार पर लॉक स्क्रीन पर अपना पासवर्ड डालने का अनुरोध किया जाएगा.
 
           यदि यह सेटिंग कॉन्फ़िगर नहीं की जाती है, तो तुरंत अनलॉक करें का उपयोग करने वाले उपयोगकर्ताओं से प्रति दिन लॉक स्क्रीन पर अपना पासवर्ड डालने का अनुरोध किया जाएगा.</translation>
+<translation id="2188722565665306629">आपको वह समयावधि सेट करने देती है जिसके दौरान <ph name="PRODUCT_NAME" /> रुके हुए अपडेट को लागू करने के लिए फिर से लॉन्च करने की सूचनाएं दिखाता है.
+
+      इस नीति सेटिंग का इस्तेमाल मिलीसेकंड में उस समयावधि को नियंत्रित करने के लिए किया जा सकता है, जिसके दौरान उपयोगकर्ता को बार-बार यह सूचित किया जाएगा कि <ph name="PRODUCT_NAME" /> को एक अपडेट के लिए फिर से लॉन्च करना होगा (या <ph name="PRODUCT_OS_NAME" /> को रीस्टार्ट करना होगा). इस समयावधि के दौरान, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> नीति की सेटिंग के मुताबिक उपयोगकर्ता को अपडेट की ज़रूरत के बारे में बार-बार सूचित किया जाएगा. अगर सेट नहीं होती है, तो 604800000 मिलीसेकंड (एक हफ़्ते) की डिफ़ॉल्ट अवधि इस्तेमाल की जाती है.</translation>
 <translation id="2194470398825717446">इस नीति का समर्थन M61 में रोक दिया गया है, कृपया इसके बजाय EcryptfsMigrationStrategy का उपयोग करें.
 
       यह बताती है कि ecryptfs के ज़रिए भेजे गए डिवाइस को किस तरह व्यवहार करना चाहिए और उसे ext4 एन्क्रिप्शन में संक्रमण करने की ज़रूरत होती है.
@@ -529,6 +538,13 @@
           इस नीति पर तभी विचार किया जाता है जबकि 'DefaultSearchProviderEnabled' नीति सक्षम हो.</translation>
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> फ़ाइलें ऐप्स में डिस्क को अक्षम करती है</translation>
 <translation id="268577405881275241">डेटा संपीडन प्रॉक्सी सुविधा सक्षम करें</translation>
+<translation id="2726613915126661822">आपको यह नियंत्रित करने देती है कि Chrome OS पर वर्चुअल मशीनें चलाने की मंजूरी देनी है या नहीं.
+
+      अगर नीति सही पर सेट की जाती है, तो डिवाइस वर्चुअल मशीनें चला सकता है.
+      अगर नीति गलत पर सेट की जाती है, तो डिवाइस वर्चुअल मशीनें नहीं चला सकेगा.
+      जब यह नीति गलत में बदली जाती है, तो यह नई वर्चुअल मशीनें शुरू कर देती है लेकिन पहले से चल रही वर्चुअल मशीनें बंद नहीं करती है.
+      जब यह नीति किसी प्रबंधित डिवाइस पर सेट नहीं होती है, तो डिवाइस वर्चुअल मशीनें नहीं चला सकेगा.
+      प्रबंधित नहीं किए गए डिवाइस वर्चुअल मशीनें चला सकते हैं.</translation>
 <translation id="2731627323327011390">ARC-ऐप्लिकेशन के लिए <ph name="PRODUCT_OS_NAME" /> प्रमाणपत्रों का उपयोग अक्षम करें</translation>
 <translation id="2742843273354638707">Chrome वेब स्टोर ऐप्स और पादलेख लिंक को नए टैब पेज और <ph name="PRODUCT_OS_NAME" /> में ऐप चलाने के साधन से छिपाएं.
 
@@ -750,6 +766,7 @@
           यह नीति वैकल्पिक है. यदि सेट न हो, तो कोई नया टैब पेज प्रदान नहीं किया जाएगा.
 
          'DefaultSearchProviderEnabled' नीति के सक्षम होने पर ही इस नीति का पालन किया जाता है.</translation>
+<translation id="3465852069254497664">उपयोगकर्ता को यह सूचित करती है कि ब्राउज़र को फिर से लॉन्च करने का सुझाव दिया गया है या ऐसा करना ज़रूरी है</translation>
 <translation id="346731943813722404">निर्दिष्ट करती है कि पावर प्रबंधन विलंब और सत्र अवधि सीमा केवल किसी सत्र में प्रथम उपयोगकर्ता गतिविधि के बाद ही प्रारंभ हो या नहीं.
 
           यदि यह नीति सही पर सेट है, तो पावर प्रबंधन विलंब और सत्र अवधि सीमा तब तक प्रारंभ नहीं होती जब तक कि किसी सत्र में पहली उपयोगकर्ता गतिविधि दिखाई नहीं देती.
@@ -783,6 +800,7 @@
 <translation id="3711895659073496551">निलंबित</translation>
 <translation id="3736879847913515635">उपयोगकर्ता प्रबंधक में व्यक्ति जोड़ना सक्षम करें</translation>
 <translation id="3737544779868348650">डिवाइस नेटवर्क होस्टनाम</translation>
+<translation id="3740754010292550733">अपडेट फिर से लॉन्च करने की सूचनाओं की अवधि सेट करें</translation>
 <translation id="3750220015372671395">इन साइट पर कुंजी जेनरेशन अवरुद्ध करें</translation>
 <translation id="3756011779061588474">डेवलपर मोड अवरुद्ध करें</translation>
 <translation id="3758089716224084329">आपको <ph name="PRODUCT_NAME" /> द्वारा उपयोग किया जाने वाला प्रॉक्सी सर्वर निर्दिष्ट करने देती है और उपयोगकर्ताओं को प्रॉक्सी सेटिंग बदलने से रोकती है.
@@ -1504,6 +1522,7 @@
           यदि आप इस नीति को सेट करते हैं, तो उपयोगकर्ता बड़े कर्सर को सक्षम या अक्षम करके इसे अस्थायी रूप से ओवरराइड कर सकते हैं. हालांकि, उपयोगकर्ता की पसंद स्थायी नहीं होती है और प्रवेश स्क्रीन के पुन: दिखाई देने या उपयोगकर्ता द्वारा प्रवेश स्क्रीन पर एक मिनट तक प्रयोग में नहीं रहने पर डिफ़ॉल्ट पुनर्स्थापित हो जाता है.
 
           यदि नीति सेट किए बिना छोड़ दी जाती है, तो प्रवेश स्क्रीन के पहली बार दिखाई देने पर बड़ा कर्सर अक्षम हो जाता है. उपयोगकर्ता कभी भी बड़े कर्सर को सक्षम या अक्षम कर सकते हैं और उपयोगकर्ताओं के बीच प्रवेश स्क्रीन पर इसकी स्थिति स्थायी हो जाती है.</translation>
+<translation id="5929855945144989709">डिवाइस को Chrome OS पर वर्चुअल मशीनें चलाने देती है</translation>
 <translation id="5932767795525445337">Android ऐप पिन करने के लिए भी इस नीति का इस्तेमाल किया जा सकता है.</translation>
 <translation id="5936622343001856595">Forces queries in Google वेब खोज की क्वेरी को, सुरक्षित खोज के सक्रिय रहते हुए किए जाने के लिए बाध्य करता है और उपयोगकर्ताओं को यह सेटिंग बदलने से रोकता है.
 
@@ -1754,6 +1773,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> नीति RoamingProfileSupportEnabled को ओवरराइड करके सभी डेटा सिंक्रनाइज़ेशन अक्षम करती है.</translation>
 <translation id="6735701345096330595">वर्तनी जांच की भाषाएं बलपूर्वक चालू करें</translation>
+<translation id="673699536430961464">यह सेटिंग उपयोगकर्ताओं को अपने <ph name="PRODUCT_OS_NAME" /> डिवाइस पर साइन इन करने के बाद अपनी ब्राउज़र विंडो के सामग्री क्षेत्र में Google खातों के बीच स्विच करने देती है.
+
+      अगर यह नीति गलत पर सेट की जाती है, तो गैर-गुप्त ब्राउज़र के सामग्री क्षेत्र से किसी दूसरे खाते में साइन इन नहीं करने दिया जाएगा.
+
+      अगर यह नीति सेट नहीं की जाती है या सही पर सेट की जाती है, तो डिफ़ॉल्ट व्यवहार का इस्तेमाल किया जाएगा: ब्राउज़र के सामग्री क्षेत्र से किसी दूसरे खाते में साइन इन करने दिया जाएगा, इसमें बच्चों के ऐसे खाते शामिल नहीं होंगे जहां उसे गैर-गुप्त सामग्री क्षेत्र के लिए ब्लॉक किया जाएगा.
+
+      अगर गुप्त मोड के ज़रिए किसी दूसरे खाते में साइन इन करने की अनुमति नहीं दी जाती है, तो IncognitoModeAvailability नीति का इस्तेमाल करके उस मोड को ब्लॉक करने पर विचार करें.
+
+      ध्यान दें कि उपयोगकर्ता अपनी कुकी ब्लॉक करके अप्रमाणित स्थिति में Google की सभी सेवाएं एक्सेस कर सकेंगे.</translation>
 <translation id="6757438632136860443">आपको ऐसी साइट बताने वाले url पैटर्न की सूची सेट करने देती है जिन्‍हें <ph name="FLASH_PLUGIN_NAME" /> प्लग इन चलाने की अनुमति है.
 
           अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो 'DefaultPluginsSetting' नीति सेट होने पर या तो उससे सभी साइटों के लिए वैश्विक डिफ़ॉल्‍ट मान का उपयोग किया जाएगा या फिर उपयोगकर्ता के व्‍यक्तिगत कॉन्‍फ़‍िगरेशन का उपयोग किया जाएगा.</translation>
@@ -1763,6 +1791,7 @@
 <translation id="6786967369487349613">रोमिंग प्रोफ़ाइल निर्देशिका सेट करें</translation>
 <translation id="6810445994095397827">इन साइटों पर JavaScript अवरुद्ध करें</translation>
 <translation id="681446116407619279">समर्थित प्रमाणीकरण स्कीम</translation>
+<translation id="6835883744948188639">उपयोगकर्ता को बार-बार यह सूचित करने वाला संकेत दिखाती है कि फिर से लॉन्च करने का सुझाव दिया गया है</translation>
 <translation id="685769593149966548">YouTube के लिए सख्त प्रतिबंधित मोड लागू करें</translation>
 <translation id="687046793986382807">यह नीति <ph name="PRODUCT_NAME" /> वर्शन 35 से समाप्त हो चुकी है.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index da806af..5cf3ba2 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -207,6 +207,7 @@
       A házirend beállításánál egy URL-t kell megadni, amelyről a(z) <ph name="PRODUCT_OS_NAME" /> letöltheti az Általános Szerződési Feltételeket. Az Általános Szerződési Feltételek egyszerű szöveg formátumban legyenek, amelyet text/plain MIME típusként kell megjeleníteni. HTML-kódok nem engedélyezettek.</translation>
 <translation id="1750315445671978749">Az összes letöltés letiltása</translation>
 <translation id="1781356041596378058">A házirend meghatározza az Android fejlesztői beállításokhoz való hozzáférést is. Ha igaz értékre állítja ezt a házirendet, akkor a felhasználók nem férhetnek hozzá a fejlesztői beállításokhoz. Ha hamis értékre állítja a házirendet, illetve nem ad meg beállítást, akkor a felhasználók hozzáférhetnek a fejlesztői beállításokhoz, ha hétszer a build számára koppintanak az Android Beállítások alkalmazásában.</translation>
+<translation id="1797233582739332495">Ismétlődő értesítés megjelenítése a felhasználónak arról, hogy újraindításra van szükség</translation>
 <translation id="1803646570632580723">Az indítóban megjeleníteni kívánt rögzített alkalmazások listája</translation>
 <translation id="1808715480127969042">Cookie-k letiltása ezeken a webhelyeken</translation>
 <translation id="1827523283178827583">Használjon fix proxyszervereket</translation>
@@ -279,6 +280,11 @@
 
           Ha a házirend konfigurálatlanul marad, a böngésző mind a négy sémát használhatja.</translation>
 <translation id="2067011586099792101">A tartalomcsomagokon kívüli webhelyekhez való hozzáférés letiltása</translation>
+<translation id="2070270043919235595">Értesíti a felhasználót arról, hogy újra kell indítani a <ph name="PRODUCT_NAME" /> böngészőt a függőben lévő frissítés élesítéséhez.
+
+      Ezen házirend-beállítás használatával a felhasználó értesítéseken keresztül tudomást szerezhet arról, hogy ajánlott, illetve szükséges a böngésző újraindítása. Ha nincs beállítva, a <ph name="PRODUCT_NAME" /> a menüben található apró módosításokkal jelzi a felhasználónak, hogy szükség van az újraindításra. Ha a házirend beállítása „Ajánlott”, ismétlődő figyelmeztetés jelenik meg a felhasználó számára az ajánlott újraindítással kapcsolatban. A felhasználónak lehetősége van a figyelmeztetés elvetésére és az újraindítás elhalasztására. Ha a házirend beállítása „Szükséges”, ismétlődő figyelmeztetés jelenik meg a felhasználó számára, amely szerint a rendszer kényszeríti a böngésző újraindítását az értesítési időszak lejárta után. Ez az időszak alapértelmezés szerint hét nap, és a <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> házirend-beállításnál módosítható.
+
+      Az újraindítás után a rendszer visszaállítja a felhasználói munkamenetet.</translation>
 <translation id="2077129598763517140">Hardveres gyorsítás alkalmazása lehetőség szerint</translation>
 <translation id="2077273864382355561">Képernyő kikapcsolásának késleltetése akkumulátorról való működés során</translation>
 <translation id="2082205219176343977">Az engedélyezett legrégebbi Chrome-verzió beállítása az eszközön.</translation>
@@ -323,6 +329,9 @@
       Ha konfigurálta ezt a beállítást, a gyorsfeloldást használó felhasználóknak a beállítástól függően kell beírniuk jelszavukat a lezárási képernyőn.
 
       Ha nem konfigurálta ezt a beállítást, a gyorsfeloldást használó felhasználóknak minden nap be kell írniuk jelszavukat a lezárási képernyőn.</translation>
+<translation id="2188722565665306629">Lehetővé teszi annak az időszaknak a beállítását, amely során a <ph name="PRODUCT_NAME" /> újraindítására vonatkozó értesítések jelennek meg a függőben lévő frissítéssel kapcsolatban.
+
+      Ezen házirend-beállítás segítségével ezredmásodpercben adható meg az az időszak, amely során a rendszer folyamatosan tájékoztatja a felhasználót arról, hogy frissítés miatt szükség van a <ph name="PRODUCT_NAME" /> (vagy a <ph name="PRODUCT_OS_NAME" />) újraindítására. Ezen időszak során a rendszer újra és újra tájékoztatja a felhasználót a frissítés szükségességéről a <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> házirend beállítása alapján. Ha a házirend értéke nincs megadva, a rendszer alapértelmezés szerint 604 800 000 ezredmásodperces időszakot (egy hét) vesz alapul.</translation>
 <translation id="2194470398825717446">Ezt a házirendet megszüntettük az M61 verzióban, használja helyette az EcryptfsMigrationStrategy házirendet.
 
       Meghatározza az olyan eszközök viselkedését, amelyek ecryptfs titkosítással rendelkeznek, és amelyeket át kell ültetni ext4 titkosításra.
@@ -509,6 +518,13 @@
 <translation id="267596348720209223">Meghatározza a keresési szolgáltató által támogatott karakterkódolásokat. A kódolások kódtáblanevek, például UTF-8, GB2312 vagy ISO-8859-1. A szolgáltató a megadott sorrendben próbálja őket használni. A házirend nem kötelező. Ha nincs beállítva, akkor a rendszer az alapértelmezés szerinti UTF-8-at használja. A házirend csak akkor teljesül, ha a "DefaultSearchProviderEnabled" házirend engedélyezve van.</translation>
 <translation id="2682225790874070339">Letiltja a Google Drive szolgáltatást a <ph name="PRODUCT_OS_NAME" /> Fájlok alkalmazásában</translation>
 <translation id="268577405881275241">Az adattömörítő proxyfunkció engedélyezése</translation>
+<translation id="2726613915126661822">Segítségével szabályozhatja, hogy futhatnak-e virtuális gépek a Chrome OS rendszeren.
+
+      Ha a házirend értéke „Igaz”, az eszközön futhatnak virtuális gépek.
+      Ha a házirend értéke „Hamis”, az eszközön nem futhatnak virtuális gépek.
+      Amikor „Hamis” értékre állítja ezt a házirendet, a módosítás az új virtuális gépek indítására vonatkozik, de nem kapcsolja ki a már futó virtuális gépeket.
+      Ha a házirend nincs beállítva kezelt eszközön, az eszköz számára nem lesz engedélyezve a virtuális gépek futtatása.
+      A nem kezelt eszközök számára engedélyezett a virtuális gépek futtatása.</translation>
 <translation id="2731627323327011390">A(z) <ph name="PRODUCT_OS_NAME" /> által az ARC-alkalmazásoknak kiadott CA-tanúsítványok használatának letiltása</translation>
 <translation id="2742843273354638707">A Chrome Internetes áruház alkalmazásnak és a láblécben lévő linkjének elrejtése az Új lap oldalon és a <ph name="PRODUCT_OS_NAME" /> alkalmazásindítóban.
 
@@ -724,6 +740,7 @@
           Ezt a szabályt nem kötelező beállítani. Ha nincs megadva, nem lesz új lap oldal megjelenítve.
 
           A rendszer csak akkor veszi figyelembe ezt a szabályt, ha a „DefaultSearchProviderEnabled” szabály engedélyezve van.</translation>
+<translation id="3465852069254497664">A felhasználó értesítése arról, hogy ajánlott, illetve szükséges a böngésző újraindítása</translation>
 <translation id="346731943813722404">Meghatározza, hogy az energiagazdálkodási késleltetések és a munkamenet hosszúsági korlátja egy munkamenet során csak az első felhasználói tevékenység észlelése után kezdődjön-e.
 
           Ha az irányelv beállítása Igaz, akkor az energiagazdálkodási késleltetések és a munkamenet hosszúsági korlátja nem indul el egy munkamenet során az első felhasználói tevékenység észleléséig.
@@ -757,6 +774,7 @@
 <translation id="3711895659073496551">Felfüggesztés</translation>
 <translation id="3736879847913515635">Engedélyezi a személyek hozzáadását a felhasználókezelőben</translation>
 <translation id="3737544779868348650">Eszköz hálózati gazdagépneve</translation>
+<translation id="3740754010292550733">A frissítéssel kapcsolatos újraindítási értesítésekhez tartozó időszak beállítása</translation>
 <translation id="3750220015372671395">Kulcslétrehozás letiltása a következő webhelyeken</translation>
 <translation id="3756011779061588474">Fejlesztői mód letiltása</translation>
 <translation id="3758089716224084329">Lehetővé teszi a(z) <ph name="PRODUCT_NAME" /> által használt proxyszerver meghatározását, és megakadályozza, hogy a felhasználók megváltoztassák a proxybeállításokat.
@@ -1429,6 +1447,7 @@
           Amennyiben beállítja ezt a házirendet, a felhasználók ideiglenesen felülbírálhatják a nagy mutató engedélyezésével vagy letiltásával. A felhasználó döntése azonban nem végleges, és az alapértelmezett beállítás lép érvénybe a bejelentkezési képernyő ismételt megjelenítésekor, vagy ha a felhasználó egy percig nem hajt végre semmilyen tevékenységet a bejelentkezési képernyőn.
 
           Ha nem állítja be ezt a házirendet, akkor a nagy egérmutató le lesz tiltva a bejelentkezési képernyő első megjelenítésekor. A felhasználók bármikor engedélyezhetik vagy letilthatják a nagy egérmutatót, és annak állapota mindegyik felhasználó esetében megmarad a bejelentkezési képernyőn.</translation>
+<translation id="5929855945144989709">Virtuális gépek futtatásának engedélyezése eszközök számára Chrome OS rendszeren</translation>
 <translation id="5932767795525445337">Ez a házirend Android-alkalmazások rögzítésére is használható.</translation>
 <translation id="5936622343001856595">Hatására a Google Internetes Kereső bekapcsolt Biztonságos Keresés mellett végez lekérdezéseket, és megakadályozza, hogy a felhasználók módosítsák ezt a beállítást.
 
@@ -1672,6 +1691,15 @@
 
       A(z) <ph name="SYNC_DISABLED_POLICY_NAME" /> házirend letilt minden adatszinkronizálást, felülbírálva a RoamingProfileSupportEnabled házirendet.</translation>
 <translation id="6735701345096330595">A helyesírás-ellenőrzéshez használt nyelvek engedélyezésének kényszerítése</translation>
+<translation id="673699536430961464">A beállítás lehetővé teszi a felhasználók számára a Google-fiókok közötti váltást a böngészőablak tartalomterületén belül, miután bejelentkeztek <ph name="PRODUCT_OS_NAME" />-eszközükbe.
+
+      Ha a házirend beállítása „hamis”, nem engedélyezett a másik fiókba történő bejelentkezés a nem inkognitómódban használt böngésző tartalomterületén.
+
+      Ha a házirend nincs beállítva, vagy értéke „igaz”, az alapértelmezett beállítás van használatban: Engedélyezett a másik fiókba történő bejelentkezés a böngésző tartalomterületéről, kivéve gyermek fiókok esetén, amelyeknél ez a lehetőség le van tiltva a nem inkognitómódban használt tartalomterületeken.
+
+      Ha nem szeretné engedélyezni a másik fiókba történő bejelentkezést inkognitómódban, fontolja meg a mód letiltását az IncognitoModeAvailability házirenddel.
+
+      Megjegyzés: A felhasználók a cookie-k letiltásával hozzá tudnak férni a Google-szolgáltatásokhoz nem hitelesített állapotban.</translation>
 <translation id="6757438632136860443">Lehetővé teszi URL-minták olyan listájának megadását, amely meghatározza, hogy mely webhelyek futtathatják a(z) <ph name="FLASH_PLUGIN_NAME" /> beépülő modult.
 
           Ha nem állítja be ezt a házirendet, akkor a böngésző valamennyi webhelyre vonatkozóan a globális alapértelmezett értéket használja a „DefaultPluginsSetting” házirend (ha be van állítva) vagy a felhasználó személyes konfigurációja alapján.</translation>
@@ -1681,6 +1709,7 @@
 <translation id="6786967369487349613">Barangolási profilcímtár beállítása</translation>
 <translation id="6810445994095397827">JavaScript letiltása ezeken a webhelyeken</translation>
 <translation id="681446116407619279">Támogatott hitelesítési sémák</translation>
+<translation id="6835883744948188639">Ismétlődő értesítés megjelenítése a felhasználónak arról, hogy ajánlott az újraindítás</translation>
 <translation id="685769593149966548">Szigorú Korlátozott mód kényszerítése a YouTube-on</translation>
 <translation id="687046793986382807">Ez a házirend a(z) <ph name="PRODUCT_NAME" /> 35-ös verziójától kezdve megszűnt.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index efbfc38..daddfa1 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -197,6 +197,7 @@
 Per la norma dovrebbe essere impostato un URL da cui <ph name="PRODUCT_OS_NAME" /> possa scaricare i Termini di servizio. I Termini di servizio devono essere in testo normale e pubblicati come testo di tipo MIME/semplice. Il markup non è consentito.</translation>
 <translation id="1750315445671978749">Blocca tutti i download</translation>
 <translation id="1781356041596378058">Questa norma controlla anche l'accesso alle Opzioni sviluppatore di Android. Se la norma viene impostata su true, gli utenti non possono accedere alle Opzioni sviluppatore. Se la norma viene impostata su false o non viene impostata, gli utenti possono accedere alle Opzioni sviluppatore toccando sette volte il numero di build nell'app Impostazioni di Android.</translation>
+<translation id="1797233582739332495">Mostra un messaggio ricorrente all'utente in cui indica che è necessario un riavvio</translation>
 <translation id="1803646570632580723">Elenco di applicazioni bloccate da visualizzare in Avvio applicazioni</translation>
 <translation id="1808715480127969042">Blocca cookie su questi siti</translation>
 <translation id="1827523283178827583">Utilizza server proxy definiti</translation>
@@ -269,6 +270,11 @@
 
           Se questa norma non viene impostata, vengono utilizzati tutti e quattro gli schemi.</translation>
 <translation id="2067011586099792101">Blocca l'accesso ai siti non presenti nei pacchetti di contenuti</translation>
+<translation id="2070270043919235595">Notifica agli utenti che <ph name="PRODUCT_NAME" /> deve essere riavviato per applicare l'aggiornamento in attesa.
+
+      Questa impostazione della norma consente di informare l'utente tramite notifiche che è obbligatorio o consigliato eseguire un riavvio del browser. Se non è impostata, <ph name="PRODUCT_NAME" /> indica all'utente che è necessario un riavvio tramite piccole modifiche al menu. Se impostata su "Consigliato", all'utente verrà mostrato un avviso ricorrente con un riavvio consigliato. L'utente può ignorare questo avviso e rimandare il riavvio. Se impostata su "Obbligatorio", verrà visualizzato un avviso ricorrente all'utente che indica che il riavvio del browser sarà forzato una volta trascorso il periodo di notifica. Per impostazione predefinita, il periodo di notifica è di sette giorni e può essere configurato tramite l'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      La sessione dell'utente viene ripristinata dopo il riavvio.</translation>
 <translation id="2077129598763517140">Usa accelerazione hardware quando disponibile</translation>
 <translation id="2077273864382355561">Ritardo disattivazione schermo in caso di utilizzo della batteria</translation>
 <translation id="2082205219176343977">Configura la versione minima di Chrome consentita per il dispositivo.</translation>
@@ -307,6 +313,9 @@
       Se questa impostazione viene configurata, gli utenti che usano lo sblocco rapido devono inserire le proprie password nella schermata di blocco in base a questa impostazione.
 
       Se questa impostazione non viene configurata, gli utenti che usano lo sblocco rapido devono inserire ogni giorno la propria password nella schermata di blocco.</translation>
+<translation id="2188722565665306629">Ti consente di impostare il periodo di tempo durante il quale vengono visualizzate le notifiche di riavvio di <ph name="PRODUCT_NAME" /> per applicare un aggiornamento in attesa.
+
+      Questa impostazione della norma può essere utilizzata per controllare il periodo di tempo, in millisecondi, durante il quale un utente viene informato progressivamente che <ph name="PRODUCT_NAME" /> deve essere riavviato (o <ph name="PRODUCT_OS_NAME" /> deve essere riavviato) per un aggiornamento. Durante questo periodo, l'utente verrà ripetutamente informato della necessità di un aggiornamento in base all'impostazione della norma <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Se non impostata, viene utilizzato il periodo predefinito di 604800000 millisecondi (una settimana).</translation>
 <translation id="2194470398825717446">Questa norma è stata ritirata in M61. Usa la norma EcryptfsMigrationStrategy.
 
       Consente di specificare come deve comportarsi un dispositivo con ecryptfs e come deve passare alla crittografia ext4.
@@ -493,6 +502,13 @@
 <translation id="267596348720209223">Consente di specificare le codifiche dei caratteri supportate dal provider di ricerca. Le codifiche sono nomi di pagine codificati come UTF-8, GB2312 e ISO-8859-1. Vengono provate nell'ordine indicato. Questa norma è facoltativa. Se non viene impostata viene utilizzato il valore predefinito UTF-8. Questa norma viene rispettata soltanto se è attiva la norma "DefaultSearchProviderEnabled".</translation>
 <translation id="2682225790874070339">Consente di disattivare Drive nell'app File di <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Attiva la funzione proxy di compressione dei dati</translation>
+<translation id="2726613915126661822">Ti consente di controllare se le macchine virtuali possono essere eseguite su Chrome OS.
+
+      Se la norma viene impostata su true, al dispositivo è consentito eseguire le macchine virtuali.
+      Se la norma viene impostata su false, al dispositivo non è consentito eseguire le macchine virtuali.
+      Quando questa norma viene modificata in false, quest'ultima ha valore solo sulle nuove macchine virtuali e non arresta le macchine virtuali già in esecuzione.
+      Quando questa norma non è impostata su un dispositivo gestito, il dispositivo non potrà eseguire macchine virtuali.
+      I dispositivi non gestiti sono autorizzati a eseguire macchine virtuali.</translation>
 <translation id="2731627323327011390">Disattiva l'utilizzo dei certificati <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation>
 <translation id="2742843273354638707">Consente di nascondere l'app Chrome Web Store e il link nel piè di pagina nella pagina Nuova scheda e in Avvio applicazioni di <ph name="PRODUCT_OS_NAME" />.
 
@@ -705,6 +721,7 @@
 Questa norma è facoltativa. Se non viene impostata non verrà fornita una pagina Nuova scheda.
 
 Questa norma viene rispettata soltanto se viene attivata la norma "DefaultSearchProviderEnabled".</translation>
+<translation id="3465852069254497664">Notifica a un utente che è necessario od obbligatorio eseguire un riavvio del browser</translation>
 <translation id="346731943813722404">Consente di specificare se i ritardi di gestione dell'alimentazione e il limite di durata delle sessioni devono iniziare soltanto dopo il rilevamento dell'attività del primo utente in una sessione.
 
 Se questa norma viene impostata su True, i ritardi di gestione dell'alimentazione e il limite di durata delle sessioni non iniziano fino al termine del rilevamento dell'attività del primo utente in una sessione.
@@ -738,6 +755,7 @@
 <translation id="3711895659073496551">Sospensione</translation>
 <translation id="3736879847913515635">Attiva la funzione Aggiungi persona in Gestione utenti</translation>
 <translation id="3737544779868348650">Nome host della rete del dispositivo</translation>
+<translation id="3740754010292550733">Imposta il periodo per le notifiche di riavvio dell'aggiornamento</translation>
 <translation id="3750220015372671395">Blocca la generazione di chiavi su questi siti</translation>
 <translation id="3756011779061588474">Blocca modalità sviluppatore</translation>
 <translation id="3758089716224084329">Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare le impostazioni proxy.
@@ -1399,6 +1417,7 @@
 Se la norma viene impostata, gli utenti possono ignorarla temporaneamente attivando o disattivando il puntatore grande. La scelta dell'utente non è però permanente e viene ripristinato il valore predefinito quando viene visualizzata di nuovo la schermata di accesso o quando l'utente rimane inattivo nella schermata di accesso per un minuto.
 
 Se la norma non viene impostata, il puntatore grande viene disattivato alla prima visualizzazione della schermata di accesso. Gli utenti possono attivare o disattivare il puntatore grande in qualsiasi momento e il relativo stato nella schermata di accesso persiste per tutti gli utenti.</translation>
+<translation id="5929855945144989709">Consente ai dispositivi di eseguire macchine virtuali su Chrome OS</translation>
 <translation id="5932767795525445337">Questa policy può essere utilizzata anche per bloccare app per Android.</translation>
 <translation id="5936622343001856595">Forza l'esecuzione delle query in Ricerca Google con l'opzione SafeSearch attiva e impedisce agli utenti di modificare questa impostazione.
 
@@ -1634,6 +1653,15 @@
 
       La norma <ph name="SYNC_DISABLED_POLICY_NAME" /> consente di disattivare la sincronizzazione di tutti i dati e sostituisce la norma RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Forza attivazione lingue per controllo ortografico</translation>
+<translation id="673699536430961464">Questa impostazione consente agli utenti di passare da un account Google a un altro all'interno dell'area dei contenuti della finestra del browser dopo avere eseguito l'accesso al dispositivo <ph name="PRODUCT_OS_NAME" />.
+
+      Se questa norma viene impostata su false, l'accesso a un altro account dall'area dei contenuti del browser in modalità diversa da quella di navigazione in incognito non sarà consentito.
+
+      Se questa norma non viene impostata o viene impostata su true, verrà usato il comportamento predefinito: sarà possibile accedere a un altro account dall'area dei contenuti del browser, ma non agli account di minori, per i quali tale accesso non sarà consentito dall'area dei contenuti in modalità diversa da quella di navigazione in incognito.
+
+      Qualora l'accesso a un altro account non debba essere consentito tramite la modalità di navigazione in incognito, potresti bloccare tale modalità usando la norma IncognitoModeAvailability.
+
+      Tieni presente che gli utenti potranno accedere ai servizi Google in uno stato non autenticato bloccando i loro cookie.</translation>
 <translation id="6757438632136860443">Consente di impostare un elenco di pattern URL che specificano i siti che possono eseguire il plug-in <ph name="FLASH_PLUGIN_NAME" />.
 
           Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultPluginsSetting", se impostata, oppure la configurazione personale dell'utente..</translation>
@@ -1643,6 +1671,7 @@
 <translation id="6786967369487349613">Imposta la directory profilo di roaming</translation>
 <translation id="6810445994095397827">Blocca Javascript in questi siti</translation>
 <translation id="681446116407619279">Schemi di autenticazione supportati</translation>
+<translation id="6835883744948188639">Mostra un messaggio ricorrente all'utente in cui indica che è consigliato eseguire un riavvio</translation>
 <translation id="685769593149966548">Imponi Livello massimo della Modalità con restrizioni per YouTube</translation>
 <translation id="687046793986382807">Questa norma è stata ritirata a partire dalla versione 35 di <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 7472d1ea..4adbe02 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -97,7 +97,7 @@
 <translation id="1438739959477268107">デフォルトのキー生成設定</translation>
 <translation id="1454846751303307294">JavaScript の実行を許可しないサイトを指定する URL パターンのリストを設定できます。このポリシーが未設定の場合、グローバルのデフォルト値がすべてのサイトで使用されます。グローバルのデフォルト値は「DefaultJavaScriptSetting」ポリシーの値か、この値が未設定の場合はユーザーの個人設定の値です。</translation>
 <translation id="1456822151187621582">Windows(<ph name="PRODUCT_OS_NAME" /> クライアント):</translation>
-<translation id="1457305643416399820">パスワード保護サービスでリスクのあるアカウントとしての報告は行われません</translation>
+<translation id="1457305643416399820">パスワード保護サービスでリスクのあるアカウントとして報告しない</translation>
 <translation id="1464848559468748897"><ph name="PRODUCT_OS_NAME" /> 搭載デバイス上のマルチプロフィール セッションでのユーザーの行動を制御します。
 
       このポリシーが「MultiProfileUserBehaviorUnrestricted」に設定されている場合、ユーザーはメイン ユーザーまたはサブ ユーザーとしてマルチプロフィール セッションに参加できます。
@@ -209,6 +209,7 @@
       ポリシーは、<ph name="PRODUCT_OS_NAME" /> による利用規約のダウンロードが可能な URL に設定する必要があります。利用規約はテキスト形式で、MIME タイプのプレーン テキストとして配信してください。マークアップ形式は使用できません。</translation>
 <translation id="1750315445671978749">すべてのダウンロードをブロックする</translation>
 <translation id="1781356041596378058">このポリシーでは、Android 開発者向けオプションへのアクセスも管理できます。このポリシーを true に設定した場合、ユーザーは開発者向けオプションにアクセスできません。このポリシーを false に設定するか未設定のままにした場合、ユーザーは Android 設定アプリのビルド番号を 7 回タップすれば開発者向けオプションにアクセスできます。</translation>
+<translation id="1797233582739332495">再起動が必要であることを示すメッセージをユーザーに繰り返し表示する</translation>
 <translation id="1803646570632580723">ランチャーに表示する固定アプリのリスト</translation>
 <translation id="1808715480127969042">これらのサイトの Cookie をブロックする</translation>
 <translation id="1827523283178827583">固定プロキシ サーバーを使用する</translation>
@@ -281,6 +282,11 @@
 
           このポリシーが未設定の場合、4 つのスキームのすべてが使用されます。</translation>
 <translation id="2067011586099792101">コンテンツ パック外部のサイトへのアクセスをブロックする</translation>
+<translation id="2070270043919235595">保留中のアップデートを適用するには <ph name="PRODUCT_NAME" /> の再起動が必要であることをユーザーに通知します。
+
+      このポリシー設定は、ブラウザの再起動が推奨されるか必要であることをユーザーに示す通知を有効にするものです。このポリシーが設定されていない場合、<ph name="PRODUCT_NAME" /> ではメニューがわずかに変更され、再起動が必要であることがユーザーに示されます。このポリシーが「推奨」に設定されている場合は、再起動が推奨されることを示す警告がユーザーに繰り返し表示されます。ユーザーはこの警告を閉じて再起動を遅らせることができます。このポリシーが「必須」に設定されている場合は、通知の期間を過ぎるとブラウザが自動的に再起動されることを示す警告がユーザーに繰り返し表示されます。この期間はデフォルトでは 7 日間で、<ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> ポリシー設定で変更することができます。
+
+      再起動後はユーザー セッションが復元されます。</translation>
 <translation id="2077129598763517140">ハードウェア アクセラレーションが使用可能な場合は使用する</translation>
 <translation id="2077273864382355561">画面がオフになるまでの時間(バッテリー電源での実行時)</translation>
 <translation id="2082205219176343977">端末での使用を許可する Chrome の最小バージョンを設定する。</translation>
@@ -319,6 +325,9 @@
           この設定に値を指定した場合、ロックのクイック解除機能を使用しているユーザーには、この設定に基づくタイミングでロック画面でのパスワード入力が求められます。
 
           この設定に値を指定しなかった場合、ロックのクイック解除機能を使用しているユーザーには、1 日に 1 回ロック画面でのパスワード入力が求められます。</translation>
+<translation id="2188722565665306629">保留中のアップデートを適用するための <ph name="PRODUCT_NAME" /> の再起動通知を表示する期間を設定します。
+
+      このポリシー設定を使用して、アップデートに <ph name="PRODUCT_NAME" /> の再起動(または <ph name="PRODUCT_OS_NAME" /> の再起動)が必要であることをユーザーに連続的に通知する期間をミリ秒単位で設定できます。この期間を通じて、<ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> ポリシーの設定に基づき、アップデートが必要であることがユーザーに繰り返し通知されます。このポリシーが設定されていない場合は、デフォルトの期間として 604800000 ミリ秒(1 週間)が使用されます。</translation>
 <translation id="2194470398825717446">このポリシーは M61 でサポート終了となりました。代わりに EcryptfsMigrationStrategy を使用してください。
 
       初期状態で ecryptfs を使用するように設定され、ext4 暗号化に移行する必要のある端末について、動作方法を指定します。
@@ -382,7 +391,7 @@
       このポリシーはミリ秒単位で指定します。</translation>
 <translation id="237494535617297575">通知表示を許可するサイトを指定する URL パターンのリストを設定できます。このポリシーが未設定の場合、グローバルのデフォルト値がすべてのサイトで使用されます。グローバルのデフォルト値は「DefaultNotificationsSetting」ポリシーの値か、この値が未設定の場合はユーザーの個人設定の値です。</translation>
 <translation id="2386362615870139244">ウェイクアップ画面のロックを許可する</translation>
-<translation id="2411817661175306360">パスワード保護の警告は行われません</translation>
+<translation id="2411817661175306360">パスワード保護について警告しない</translation>
 <translation id="2411919772666155530">これらのサイトの通知をブロックする</translation>
 <translation id="2418507228189425036"><ph name="PRODUCT_NAME" /> のブラウザ履歴の保存を無効にし、ユーザーがこの設定を変更できないようにします。
 
@@ -505,6 +514,13 @@
 <translation id="267596348720209223">検索プロバイダによってサポートされる文字エンコードを指定します。エンコードは、UTF-8、GB2312、ISO-8859-1 などのコード ページ名であり、指定された順序で適用されます。このポリシーは省略可能です。未設定の場合、デフォルトでは UTF-8 が使用されます。このポリシーは、「DefaultSearchProviderEnabled」ポリシーが有効な場合にのみ適用されます。</translation>
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> ファイル アプリでのドライブの同期を無効にする</translation>
 <translation id="268577405881275241">データ圧縮プロキシ機能を有効にする</translation>
+<translation id="2726613915126661822">Chrome OS で仮想マシンを実行できるかどうかを制御します。
+
+      このポリシーが true に設定されている場合、その端末では仮想マシンを実行できます。
+      このポリシーが false に設定されている場合、その端末では仮想マシンを実行できません。
+      このポリシーが false に変更された場合は、それ以降の新しい仮想マシンがポリシーの適用対象となります。すでに実行中の仮想マシンは、終了されずに実行を続けることができます。
+      このポリシーが設定されていない場合、管理対象の端末では仮想マシンを実行できません。
+      管理対象ではない端末では仮想マシンを実行できます。</translation>
 <translation id="2731627323327011390">ARC アプリで <ph name="PRODUCT_OS_NAME" /> の証明書を使用できないようにする</translation>
 <translation id="2742843273354638707">[新しいタブ] ページと <ph name="PRODUCT_OS_NAME" /> のアプリ ランチャーで、Chrome ウェブストア アプリとフッターのリンクを非表示にします。
 
@@ -722,6 +738,7 @@
           このポリシーは省略できます。設定しないと新しいタブ ページは提供されません。
 
           このポリシーは、DefaultSearchProviderEnabled ポリシーが有効の場合にのみ適用されます。</translation>
+<translation id="3465852069254497664">ブラウザの再起動が推奨されるか必要であることをユーザーに通知する</translation>
 <translation id="346731943813722404">電源管理の遅延とセッションの時間制限の開始は、セッションでユーザーが何らかの操作をしてからにするかどうかを指定します。
 
           このポリシーが true に設定された場合、電源管理の遅延とセッションの時間制限の開始は、セッションでユーザーが何らかの操作をするまで行われません。
@@ -755,6 +772,7 @@
 <translation id="3711895659073496551">停止する</translation>
 <translation id="3736879847913515635">ユーザー管理画面でのユーザー追加を許可する</translation>
 <translation id="3737544779868348650">端末のネットワーク ホスト名</translation>
+<translation id="3740754010292550733">アップデートのための再起動通知の期間を設定する</translation>
 <translation id="3750220015372671395">指定サイトでのキー生成をブロックする</translation>
 <translation id="3756011779061588474">デベロッパー モードをブロックする</translation>
 <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> が使用するプロキシ サーバーを指定できます。この場合、ユーザーがプロキシ設定を変更することはできません。
@@ -974,6 +992,13 @@
 <translation id="4347908978527632940">true に設定した場合、監視対象ユーザーについて、他の Android アプリからコンテンツ プロバイダを介してウェブ制限を問い合わせることができます。
 
           false に設定した場合、または未設定の場合、コンテンツ プロバイダから情報は返されません。</translation>
+<translation id="435461861920493948"><ph name="PRODUCT_NAME" /> でのアカウントの表示を制御するために使用するパターンのリストを指定します。
+
+      端末に登録されている各 Google アカウントは、このポリシーで指定されているパターンと照合され、<ph name="PRODUCT_NAME" /> で表示されるかどうかが決定されます。リストのいずれかのパターンに名前が一致すれば、そのアカウントは表示されます。どのパターンにも名前が一致しない場合、そのアカウントは表示されません。
+
+      ワイルドカード文字「*」を使用して、0 文字以上の任意の文字列を表すことができます。エスケープ文字は「\」です。「*」文字と「\」文字そのものを一致対象として指定するには、それぞれの文字の前に「\」を指定します。
+
+      このポリシーが設定されていない場合、端末に登録されているすべての Google アカウントは <ph name="PRODUCT_NAME" /> で表示されます。</translation>
 <translation id="436581050240847513">デバイスのネットワーク インターフェースを報告する</translation>
 <translation id="4372704773119750918">マルチプロフィール(プライマリまたはセカンダリ)への参加を企業ユーザーに許可しない</translation>
 <translation id="4377599627073874279">すべてのサイトに対してすべての画像表示を許可する</translation>
@@ -1302,7 +1327,7 @@
 
       プラットフォームがポリシーの通知に対応している場合は、ポリシーが変更されるたびにポリシー通知により更新は自動的に適用されることになるため、更新の遅延は 24 時間に設定され、頻繁な更新は不要になります(すべてのデフォルト値とこのポリシーの値は無視されます)。</translation>
 <translation id="5530347722229944744">危険性のあるダウンロードをブロックする</translation>
-<translation id="5530586312297447592">フィッシング ページでパスワードが再使用されたときに、パスワード保護サービスでリスクのあるアカウントとして報告します</translation>
+<translation id="5530586312297447592">フィッシング ページでパスワードが再使用されたときに、パスワード保護サービスでリスクのあるアカウントとして報告する</translation>
 <translation id="5535973522252703021">Kerberos 委任サーバーのホワイトリスト</translation>
 <translation id="555077880566103058">すべてのサイトで <ph name="FLASH_PLUGIN_NAME" /> プラグインの自動実行を許可する</translation>
 <translation id="5559079916187891399">このポリシーは Android アプリには適用されません。</translation>
@@ -1422,6 +1447,7 @@
           管理者がこのポリシーを設定した場合も、ユーザーは一時的に大きいカーソルを有効または無効にすることができます。ただし、このユーザーの選択は恒久的ではなく、ログイン画面が改めて表示されたときや、ログイン画面でユーザーが何もしない時間が 1 分に達したときにデフォルト値が復元されます。
 
           このポリシーが未設定の場合は、ログイン画面が表示された直後は大きいカーソルが無効になります。ユーザーはいつでも大きいカーソルを有効または無効にすることができ、ログイン画面での大きいカーソルの状態はログアウト後も維持されます。</translation>
+<translation id="5929855945144989709">Chrome OS での仮想マシンの実行を端末に許可する</translation>
 <translation id="5932767795525445337">このポリシーを使って Android アプリを固定することもできます。</translation>
 <translation id="5936622343001856595">セーフサーチをアクティブに設定して Google ウェブ検索のクエリを強制するとともに、ユーザーがこの設定を変更できないようにします。
 
@@ -1490,6 +1516,17 @@
 
       ランチャーにアプリを固定する場合は、PinnedLauncherApps をご覧ください。</translation>
 <translation id="602728333950205286">デフォルトの検索プロバイダのインスタント検索 URL</translation>
+<translation id="6029950823657977211">
+      注: このポリシーは試験運用版であり、機能に影響を及ぼす可能性があります。
+      このポリシーはログイン画面に適用されます。ユーザー セッションに適用される「IsolateOrigins」ポリシーもご覧ください。両方のポリシーを同じ値に設定することをおすすめします。
+      このポリシーが有効に設定されている場合、カンマ区切りのリストで
+      指定された発行元は各自のプロセスで実行されます。また、
+      サブドメインを使って指定された発行元も分離されます。たとえば、
+      https://example.com/ と指定すると、
+      https://foo.example.com/ も https://example.com/ サイトの一部として分離されます。
+      このポリシーが無効に設定されている場合は、サイトごとの分離プロセス管理のロジックが適用されます。
+      このポリシーが未設定の場合、ログイン画面ではプラットフォームのデフォルトのサイト分離設定が使用されます。
+      </translation>
 <translation id="603410445099326293">POST を使用するキーワード候補による検索 URL のパラメータ</translation>
 <translation id="6036523166753287175">リモート アクセス ホストからのファイアウォール トラバーサルを有効にする</translation>
 <translation id="6070667616071269965">端末のログイン画面のキーボード配列</translation>
@@ -1646,7 +1683,7 @@
       このポリシーが未設定の場合、ネットワーク予測は有効になりますが、ユーザーはこの設定を変更できます。</translation>
 <translation id="6658245400435704251">最初にアップデートがサーバーにプッシュされた時刻から、デバイスによるアップデートのダウンロードをランダムに遅延できる最大時間を秒数で指定します。デバイスは、この時間の一部を実際の経過時間として、残りの時間をアップデート チェックとして待機できます。どのような場合でも、係数にはある一定の時間の上限があるため、アップデートのダウンロードを永遠に待機してデバイスが停止し続けることはありません。</translation>
 <translation id="6689792153960219308">ハードウェア ステータスを報告する</translation>
-<translation id="6698071416141001300">パスワードが再使用されたときに、パスワード保護サービスでリスクのあるアカウントとして報告します</translation>
+<translation id="6698071416141001300">パスワードが再使用されたときに、パスワード保護サービスでリスクのあるアカウントとして報告する</translation>
 <translation id="6699880231565102694">リモート アクセス ホストの 2 段階認証プロセスを有効にする</translation>
 <translation id="6724842112053619797">この設定を有効にした場合は、<ph name="PRODUCT_NAME" /> プロフィールに保存されている設定(ブックマーク、自動入力データ、パスワードなど)が、「ローミング」ユーザー プロフィール フォルダまたは管理者が <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" /> ポリシーで指定した場所に保存されるファイルにも書き込まれます。このポリシーを有効にすると、クラウド同期は無効になります。
 
@@ -1654,6 +1691,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> ポリシーが設定されている場合は、すべてのデータ同期が無効になります。この設定は、RoamingProfileSupportEnabled ポリシーの設定よりも優先されます。</translation>
 <translation id="6735701345096330595">言語のスペルチェックを強制的に有効にする</translation>
+<translation id="673699536430961464">ユーザーが <ph name="PRODUCT_OS_NAME" /> デバイスにログインした後に、ブラウザ ウィンドウのコンテンツ領域内で Google アカウントを切り替えることができるかどうかを制御します。
+
+      このポリシーが false に設定されている場合は、シークレット モード以外のブラウザ コンテンツ領域内から別のアカウントにログインすることはできません。
+
+      このポリシーが true に設定されている場合は、デフォルトの動作が使用されます。つまり、子アカウントでなければ、ブラウザのコンテンツ領域内から別のアカウントにログインすることができます。子アカウントの場合、シークレット モード以外のコンテンツ領域内から別のアカウントにログインすることはできません。
+
+      シークレット モードで別のアカウントにログインできないようにする必要がある場合は、IncognitoModeAvailability ポリシーを使用してシークレット モードをブロックすることをご検討ください。
+
+      なお、ユーザーは Cookie をブロックすることで、承認されていない状態でも Google のサービスにアクセスできます。</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> プラグインの実行を許可するサイトを表す URL パターンのリストを設定します。
 
           このポリシーが未設定の場合は、すべてのサイトでグローバルなデフォルト値(「DefaultPluginsSetting」ポリシーで値が設定されている場合はその値、設定されていない場合はユーザーの個人設定の値)が使用されます。</translation>
@@ -1663,6 +1709,7 @@
 <translation id="6786967369487349613">ローミング プロフィール ディレクトリの設定</translation>
 <translation id="6810445994095397827">これらのサイトの Javascript をブロックする</translation>
 <translation id="681446116407619279">サポートされる認証スキーム</translation>
+<translation id="6835883744948188639">再起動が推奨されることを示すメッセージをユーザーに繰り返し表示する</translation>
 <translation id="685769593149966548">YouTube で制限付きモード「強」を強制する</translation>
 <translation id="687046793986382807">このポリシーは <ph name="PRODUCT_NAME" /> バージョン 35 で廃止されました。
 
@@ -2154,10 +2201,17 @@
       このポリシーを未設定のままにするか無効にした場合は、ユーザーが PDF プラグインを無効にしない限り、PDF ファイルは PDF プラグインで開かれます。</translation>
 <translation id="8402079500086185021">PDF ファイルを常に外部アプリで開く</translation>
 <translation id="8412312801707973447">オンライン OCSP/CRL チェックを実行するかどうかを指定する</translation>
-<translation id="841977920223099909">パスワード保護の警告を行う場合のトリガー</translation>
+<translation id="841977920223099909">パスワード保護について警告する場合のトリガー</translation>
 <translation id="8424255554404582727">再起動のたびにデフォルトのディスプレイ回転方法を再適用する</translation>
 <translation id="8426231401662877819">画面を時計回りに 90 度回転</translation>
 <translation id="8451988835943702790">新しいタブ ページをホームページとして使用する</translation>
+<translation id="8459216513698220096">パソコンの GPO のユーザー ポリシーを処理するかどうかと、処理する場合はその方法を指定します。
+
+      このポリシーが「Default」(デフォルト)に設定されている場合、または未設定の場合、ユーザー ポリシーはユーザー GPO からのみ読み取られます(パソコンの GPO は無視されます)。
+
+      このポリシーが「Merge」(統合)に設定されている場合は、ユーザー GPO のユーザー ポリシーとパソコンの GPO のユーザー ポリシーが統合されます(パソコンの GPO が優先されます)。
+
+      このポリシーが「Replace」(置換)に設定されている場合、ユーザー GPO のユーザー ポリシーはパソコンの GPO のユーザー ポリシーに置き換えられます(ユーザー GPO は無視されます)。</translation>
 <translation id="8465065632133292531">POST を使用するインスタント検索 URL のパラメータ</translation>
 <translation id="847472800012384958">すべてのサイトに対してポップアップ表示を許可しない</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
@@ -2206,7 +2260,7 @@
           このポリシーを設定しない場合、<ph name="PRODUCT_NAME" /> はサーバーがイントラネット上にあるかどうか検出を試み、その上で IWA リクエストに応答します。サーバーがインターネット上で検出された場合、そのサーバーからの IWA リクエストは <ph name="PRODUCT_NAME" /> では無視されます。</translation>
 <translation id="8672321184841719703">自動更新の対象バージョンを指定</translation>
 <translation id="867410340948518937">U2F(Universal Second Factor)</translation>
-<translation id="8685024486845674965">パスワードが再使用されたときに、パスワード保護の警告を行います</translation>
+<translation id="8685024486845674965">パスワードが再使用されたときに、パスワード保護について警告する</translation>
 <translation id="8693243869659262736">組み込みの DNS クライアントを使用する</translation>
 <translation id="8704831857353097849">無効なプラグインのリスト</translation>
 <translation id="8711086062295757690">アドレスバーで使用するショートカットとして、このプロバイダで検索を実行するためのキーワードを指定します。このポリシーは省略可能です。未設定の場合、検索プロバイダをアクティブにするキーワードは設定されません。このポリシーは、「DefaultSearchProviderEnabled」ポリシーが有効な場合にのみ適用されます。</translation>
@@ -2235,7 +2289,7 @@
       このポリシーを設定していない場合、あるいは false に設定している場合、位置はレポートされません。</translation>
 <translation id="8818768076343557335">モバイル以外のネットワークでのネットワーク動作を予測します。
           (バージョン 50 でサポート終了、バージョン 52 で削除。バージョン 52 以降は、値 1 が設定されている場合は 0 として扱われ、あらゆるネットワーク接続でネットワーク動作を予測します。)</translation>
-<translation id="8825782996899863372">フィッシング ページでパスワードが再使用されたときに、パスワード保護の警告を行います</translation>
+<translation id="8825782996899863372">フィッシング ページでパスワードが再使用されたときに、パスワード保護について警告する</translation>
 <translation id="8828766846428537606"><ph name="PRODUCT_NAME" /> のデフォルトのホームページを設定し、ユーザーが変更できないようにします。ホームページが新しいタブ ページになることを選択するか、ホームページ URL を指定すると、ユーザーのホームページ設定は完全にロックダウンされます。ホームページ URL を指定しない場合は、ユーザーが「chrome://newtab」を指定してホームページを新しいタブ ページに設定することができます。</translation>
 <translation id="8833109046074170275">デフォルトの GAIA フローで認証する</translation>
 <translation id="8838303810937202360"><ph name="PRODUCT_OS_NAME" /> は、1 台のデバイスで複数のユーザーがインストールするアプリと拡張機能をキャッシュに保存することで、ユーザーごとに繰り返しダウンロードする必要をなくします。
@@ -2295,6 +2349,13 @@
 
       このポリシーは、ユーザーが個々のデバイスでプリンタを設定できるかどうかに影響するものではなく、個々のユーザーがプリンタを設定するときの補助として使用されることを想定したものです。
       </translation>
+<translation id="8934944553121392674">ユーザーが <ph name="DEVICE_PRINTERS_POLICY" /> のどのプリンタを使用できるかを制御します。
+
+      このポリシーは、プリンタの一括設定で使用するアクセス ポリシーを指定するものです。<ph name="PRINTERS_ALLOW_ALL" /> が選択されている場合は、すべてのプリンタが表示されます。<ph name="PRINTERS_BLACKLIST" /> が選択されている場合は、<ph name="DEVICE_PRINTERS_BLACKLIST" /> に基づき、指定されたプリンタへのアクセスが制限されます。<ph name="PRINTERS_WHITELIST" /> が選択されている場合は、<ph name="DEVICE_PRINTERS_WHITELIST" />
+で指定されたプリンタのみが選択可能になります。
+
+      このポリシーが未設定の場合は、<ph name="PRINTERS_ALLOW_ALL" /> が選択された場合と同じ動作になります。
+      </translation>
 <translation id="8947415621777543415">端末の位置をレポート</translation>
 <translation id="8951350807133946005">ディスクのキャッシュ ディレクトリの設定</translation>
 <translation id="8952317565138994125">Google でホストされる同期サービスを使用した <ph name="PRODUCT_NAME" /> でのデータ同期を無効にするとともに、ユーザーがこの設定を変更できないようにします。
@@ -2366,5 +2427,11 @@
 <translation id="930930237275114205"><ph name="PRODUCT_FRAME_NAME" /> のユーザー データ ディレクトリを設定する</translation>
 <translation id="934390688529359269"><ph name="PRODUCT_NAME" /> への強制ログインを有効にする</translation>
 <translation id="944817693306670849">ディスク キャッシュ サイズを設定します</translation>
+<translation id="9775893229076211">パスワード保護サービスでリスクのあるアカウントとして報告する場合のトリガーを制御します。パスワード保護サービスでリスクのあるアカウントとして報告すると、アカウントに乗っ取りの危険性があることが Google に通知されます。
+
+      このポリシーが「PasswordProtectionRiskOff」に設定されている場合、そのアカウントはパスワード保護サービスでリスクのあるアカウントとして報告されません。
+      このポリシーが「PasswordProtectionRiskOnPasswordReuse」に設定されている場合は、ホワイトリスト登録されていないサイトでユーザーが Google のパスワードを再使用したときに、そのアカウントがパスワード保護サービスでリスクのあるアカウントとして報告されます。
+      このポリシーが「PasswordProtectionRiskOnPhishingReuse」に設定されている場合は、フィッシング サイトでユーザーが Google のパスワードを再使用したときに、そのアカウントがパスワード保護サービスでリスクのあるアカウントとして報告されます。
+      このポリシーが設定されていない場合は、フィッシング サイトでユーザーが Google のパスワードを再使用したときに、そのアカウントがパスワード保護サービスでリスクのあるアカウントとして報告されます。ただしユーザーはこの設定を変更できます。</translation>
 <translation id="982497069985795632">スペルチェックを有効にする</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index b9fae3b3..9eb311d1 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -27,7 +27,7 @@
       이 정책이 설정되면 로그인 화면이 항상 이 정책의 첫 번째 값에 의해 주어지는 언어로 표시됩니다(이 정책은 향후 호환성을 위해 목록으로 정의됨). 이 정책이 설정되지 않거나 빈 목록으로 설정되는 경우 로그인 화면이 최종 사용자 세션의 언어로 표시됩니다. 이 정책이 유효한 언어가 아닌 값으로 설정되는 경우 로그인 화면이 대체 언어(현재 en-US)로 표시됩니다.</translation>
 <translation id="1062011392452772310">기기에 대한 원격 인증을 사용합니다.</translation>
 <translation id="1062407476771304334">바꾸기</translation>
-<translation id="109166998561583554">위험 계정 비밀번호 보호 경고 트리거</translation>
+<translation id="109166998561583554">위험 계정 비밀번호 보호 경고 실행</translation>
 <translation id="1093082332347834239">이 설정을 사용 설정하면 <ph name="UIACCESS_PERMISSION_NAME" /> 권한을 사용하여 원격 지원 호스트가 실행됩니다. 이 경우 원격 사용자가 로컬 사용자의 데스크톱에서 관리자 창으로 상호 작용하도록 허용합니다.
 
           이 설정을 사용 중지하거나 설정하지 않으면 원격 지원 호스트가 사용자의 컨텍스트에서 실행되며 원격 사용자는 데스크톱에서 관리자 창으로 상호 작용할 수 없습니다.</translation>
@@ -100,7 +100,7 @@
 
           이 정책을 설정하지 않은 경우 'DefaultJavaScriptSetting' 정책이 설정되면 해당 정책의, 그렇지 않으면 사용자 개인 설정의 전체 기본값이 모든 사이트에서 사용됩니다.</translation>
 <translation id="1456822151187621582">Windows(<ph name="PRODUCT_OS_NAME" /> 클라이언트):</translation>
-<translation id="1457305643416399820">위험 계정 비밀번호 보호 경고 꺼짐</translation>
+<translation id="1457305643416399820">위험 계정 비밀번호 보호 경고가 꺼짐</translation>
 <translation id="1464848559468748897"><ph name="PRODUCT_OS_NAME" /> 기기에서 멀티프로필 세션의 사용자 동작을 제어합니다.
 
       이 정책을 'MultiProfileUserBehaviorUnrestricted'로 설정한 경우 사용자는 멀티프로필 세션에서 기본 또는 보조 사용자가 될 수 있습니다.
@@ -210,6 +210,7 @@
       정책은 <ph name="PRODUCT_OS_NAME" />에서 서비스 약관을 다운로드할 수 있는 URL로 설정되어야 합니다. 서비스 약관은 일반 텍스트여야 하며 MIME 유형 text/plain으로 제공됩니다. 마크업은 허용되지 않습니다.</translation>
 <translation id="1750315445671978749">모든 다운로드 차단</translation>
 <translation id="1781356041596378058">이 정책은 Android 개발자 옵션 액세스 권한도 제어합니다. 이 정책을 true로 설정하는 경우 사용자는 개발자 옵션에 액세스할 수 없습니다. 이 정책을 false로 설정하거나 설정하지 않은 채로 두는 경우 Android 설정 앱에서 빌드 번호를 7번 탭하면 개발자 옵션에 액세스할 수 있습니다.</translation>
+<translation id="1797233582739332495">사용자에게 재실행이 필요하다는 메시지를 반복하여 표시</translation>
 <translation id="1803646570632580723">런처에 표시되는 고정된 앱 목록</translation>
 <translation id="1808715480127969042">이 사이트에서 쿠키 차단</translation>
 <translation id="1827523283178827583">고정 프록시 서버 사용</translation>
@@ -288,6 +289,11 @@
 
           이 정책을 설정하지 않은 경우 4개의 스키마를 모두 사용합니다.</translation>
 <translation id="2067011586099792101">콘텐츠 팩 외부 사이트에 대한 액세스를 차단합니다.</translation>
+<translation id="2070270043919235595">대기 중인 업데이트를 적용하려면 <ph name="PRODUCT_NAME" />을(를) 재실행해야 한다고 사용자에게 알립니다.
+
+      이 정책을 설정하면 사용자에게 브라우저 재실행이 필요하거나 권장된다는 알림이 전송됩니다. 정책을 설정하지 않으면 <ph name="PRODUCT_NAME" />의 메뉴가 미세하게 변경되어 재실행이 필요하다는 정보가 사용자에게 전달됩니다. 정책을 '권장'으로 설정하면 재실행하는 것이 좋다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 사용자는 이 경고를 무시하고 나중에 재실행할 수 있습니다. '필수'로 설정하면 알림 기간이 지난 후 브라우저가 강제로 재실행된다는 경고 메시지가 사용자에게 반복적으로 표시됩니다. 이 기간은 기본적으로 7일로 설정되어 있으며, <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 정책 설정을 통해 변경할 수 있습니다.
+
+      재실행 후에는 사용자의 세션이 복원됩니다.</translation>
 <translation id="2077129598763517140">가능한 경우 하드웨어 가속 사용</translation>
 <translation id="2077273864382355561">배터리 전원으로 실행할 때 화면 꺼짐 지연</translation>
 <translation id="2082205219176343977">기기에 허용되는 최소 Chrome 버전을 설정합니다.</translation>
@@ -332,6 +338,9 @@
           이 설정을 구성하면 빠른 잠금 해제를 사용하는 사용자에게 이 설정에 따라 잠금 화면에 비밀번호를 입력하라는 메시지가 표시됩니다.
 
           이 설정을 구성하지 않으면 빠른 잠금 해제를 사용하는 사용자는 매일 잠금 화면에 비밀번호를 입력해야 합니다</translation>
+<translation id="2188722565665306629">대기 중인 업데이트를 적용하기 위해 <ph name="PRODUCT_NAME" /> 재실행 알림이 표시되는 기간을 설정할 수 있습니다.
+
+      이 정책 설정을 사용하면 업데이트를 위해 <ph name="PRODUCT_NAME" />을(를) 재실행하거나 <ph name="PRODUCT_OS_NAME" />을(를) 재시작해야 한다는 알림을 사용자에게 반복적으로 표시할 기간을 밀리초 단위로 관리할 수 있습니다. 이 기간 동안 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 정책의 설정에 따라 업데이트가 필요하다는 알림이 사용자에게 반복적으로 표시됩니다. 이 정책을 설정하지 않으면 604,800,000밀리초(일주일)가 기본적으로 사용됩니다.</translation>
 <translation id="2194470398825717446">이 정책은 M61부터 지원이 중단되었으므로 EcryptfsMigrationStrategy를 대신 사용하세요.
 
       ecryptfs가 포함되어 배송된 기기의 작동 방식을 지정하며 ex4 암호화로 전환해야 합니다.
@@ -401,7 +410,7 @@
 
           이 정책을 설정하지 않은 경우 'DefaultNotificationsSetting' 정책이 설정되면 해당 정책의, 그렇지 않으면 사용자 개인 설정의 전체 기본값이 모든 사이트에서 사용됩니다.</translation>
 <translation id="2386362615870139244">화면 잠금 허용</translation>
-<translation id="2411817661175306360">비밀번호 보호 경고 꺼짐</translation>
+<translation id="2411817661175306360">비밀번호 보호 경고가 꺼짐</translation>
 <translation id="2411919772666155530">이 사이트에서 알림 차단</translation>
 <translation id="2418507228189425036"><ph name="PRODUCT_NAME" />에서 인터넷 사용 기록 저장을 사용 중지하고 사용자가 이 설정을 변경하지 못하게 합니다.
 
@@ -534,6 +543,13 @@
           이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우에만 적용됩니다.</translation>
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> 파일 앱에서 Google 드라이브 사용 중지</translation>
 <translation id="268577405881275241">데이터 압축 프록시 기능 사용</translation>
+<translation id="2726613915126661822">Chrome OS에서 가상 머신 실행을 허용할지 여부를 설정할 수 있습니다.
+
+      정책을 True로 설정하면 기기에서 가상 머신을 실행할 수 있습니다.
+      정책을 False로 설정하면 기기에서 가상 머신을 실행할 수 없습니다.
+      이 정책을 False로 변경하면 새로운 가상 머신을 실행할 수 없지만 이미 실행 중인 가상 머신이 종료되지는 않습니다.
+      관리 대상 기기에 이 정책을 설정하지 않으면 기기에서 가상 머신을 실행할 수 없습니다.
+      관리 대상이 아닌 기기에서는 가상 머신을 실행할 수 있습니다.</translation>
 <translation id="2731627323327011390">ARC 앱에서 <ph name="PRODUCT_OS_NAME" /> 인증서를 사용하지 않도록 설정</translation>
 <translation id="2742843273354638707">새 탭 페이지 및 <ph name="PRODUCT_OS_NAME" /> 앱 런처에서 Chrome 웹 스토어 앱과 바닥글 링크가 표시되지 않도록 숨깁니다.
 
@@ -757,6 +773,7 @@
           이 정책은 선택사항입니다. 설정하지 않으면 새 탭 페이지가 제공되지 않습니다.
 
           이 정책은 'DefaultSearchProviderEnabled' 정책을 사용하도록 설정한 경우에만 적용됩니다.</translation>
+<translation id="3465852069254497664">사용자에게 브라우저 재실행이 필요하거나 권장된다고 알림</translation>
 <translation id="346731943813722404">세션에서 첫 번째 사용자 활동이 감지된 후에만 전원 관리 지연 및 세션 길이 제한을 실행할지 여부를 지정합니다.
 
           이 정책이 true로 설정되면 세션 내에서 첫 번째 사용자 활동이 감지되기 전까지 전원 관리 지연 및 세션 길이 제한이 실행되지 않습니다.
@@ -790,6 +807,7 @@
 <translation id="3711895659073496551">일시중지</translation>
 <translation id="3736879847913515635">사용자 관리자에서 사용자 추가 허용</translation>
 <translation id="3737544779868348650">기기 네트워크 호스트 이름</translation>
+<translation id="3740754010292550733">업데이트를 위한 재실행 알림 표시 기간 설정</translation>
 <translation id="3750220015372671395">이 사이트에서 키 생성 차단</translation>
 <translation id="3756011779061588474">개발자 모드 차단</translation>
 <translation id="3758089716224084329"><ph name="PRODUCT_NAME" />에서사용하는 프록시 서버를 지정하도록 하며 사용자가 프록시 설정을 변경하지 못하게 합니다.
@@ -1381,7 +1399,7 @@
 
       플랫폼에서 정책 알림을 지원하면 정책이 변경될 때마다 정책 알림이 자동으로 강제 새로고침되어 잦은 새로고침이 불필요하므로 새로고침 지연이 24시간으로 설정됩니다(모든 기본값 및 이 정책의 값 무시).</translation>
 <translation id="5530347722229944744">위험할 가능성이 있는 다운로드 차단</translation>
-<translation id="5530586312297447592">피싱 페이지에서의 비밀번호 재사용으로 인해 위험 계정에 대해 비밀번호 보호 경고가 실행됨</translation>
+<translation id="5530586312297447592">피싱 페이지에서 비밀번호가 재사용되어 위험 계정에 관한 비밀번호 보호 경고가 실행됨</translation>
 <translation id="5535973522252703021">Kerberos 위임 서버 허용목록</translation>
 <translation id="555077880566103058">모든 사이트에서 <ph name="FLASH_PLUGIN_NAME" /> 플러그인을 자동으로 실행하도록 허용</translation>
 <translation id="5559079916187891399">이 정책은 Android 앱에 아무런 영향을 미치지 않습니다.</translation>
@@ -1507,6 +1525,7 @@
           이 정책이 설정된 경우 사용자는 큰 커서를 사용 설정하거나 사용 중지함으로써 정책을 일시적으로 무시할 수 있습니다. 하지만 사용자의 선택은 계속 유지되지 않으며 로그인 화면이 새로 표시되거나 사용자가 로그인 화면에서 몇 분간 유휴 상태를 유지할 때마다 기본값이 복원됩니다.
 
           이 정책이 설정되지 않은 경우 로그인 화면이 처음 나타날 때 큰 커서가 사용 중지되어 있습니다. 사용자는 언제든지 큰 커서를 사용 설정 또는 사용 중지할 수 있으며 로그인 화면에서의 상태가 사용자별로 유지됩니다.</translation>
+<translation id="5929855945144989709">기기가 Chrome OS에서 가상 머신을 실행하도록 허용</translation>
 <translation id="5932767795525445337">이 정책은 Android 앱을 고정하는 데에도 사용할 수 있습니다.</translation>
 <translation id="5936622343001856595">Google 웹 검색의 검색어를 세이프서치가 활성화되도록 설정된 상태에서 입력하도록 하며 사용자가 이 설정을 바꾸지 못하도록 합니다.
 
@@ -1754,7 +1773,7 @@
       이 정책이 설정되지 않으면 네트워크 예측이 사용 설정되지만, 사용자가 변경할 수 있습니다.</translation>
 <translation id="6658245400435704251">업데이트를 처음 서버로 푸시한 시점부터 기기가 몇 초까지 임의로 업데이트의 다운로드를 지연시킬 수 있는지 지정합니다. 기기가 이 시간의 일부를 일반 시계 시간 기준으로, 그리고 나머지 시간을 업데이트 확인 횟수 기준으로 지연시킵니다. 모든 경우, 기기가 고착되어 업데이트 다운로드를 계속 기다리지 않도록 분산의 상한이 일정 시간으로 제한되어 있습니다.</translation>
 <translation id="6689792153960219308">하드웨어 상태 보고</translation>
-<translation id="6698071416141001300">비밀번호 재사용으로 인해 위험 계정에 대해 비밀번호 보호 경고가 실행됨</translation>
+<translation id="6698071416141001300">비밀번호가 재사용되어 위험 계정에 관한 비밀번호 보호 경고가 실행됨</translation>
 <translation id="6699880231565102694">원격 액세스 호스트를 위한 2단계 인증 사용</translation>
 <translation id="6724842112053619797">이 설정을 사용하면 북마크, 데이터 자동완성, 비밀번호 등 <ph name="PRODUCT_NAME" /> 프로필에 저장된 설정이 로밍 사용자 프로필 폴더나 <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" /> 정책을 통해 관리자가 지정한 위치에 저장된 파일에도 작성됩니다. 이 정책을 사용하면 클라우드 동기화는 사용 중지됩니다.
 
@@ -1762,6 +1781,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> 정책은 모든 데이터 동기화를 사용 중지하며 RoamingProfileSupportEnabled를 무시합니다.</translation>
 <translation id="6735701345096330595">언어 맞춤법 검사 강제 사용</translation>
+<translation id="673699536430961464">이 설정은 사용자가 <ph name="PRODUCT_OS_NAME" /> 기기에 로그인한 후 브라우저 창의 콘텐츠 영역 내에서 Google 계정 사이에 전환하도록 허용합니다.
+
+      이 정책을 False로 설정하면 시크릿 모드가 아닌 브라우저 콘텐츠 영역에서 다른 계정에 로그인할 수 없습니다.
+
+      이 정책을 설정하지 않거나 True로 설정하면 기본 동작이 사용되어 브라우저 콘텐츠 영역에서 다른 계정에 로그인할 수 있습니다. 단, 어린이 계정은 시크릿 모드가 아닌 콘텐츠 영역에서 차단됩니다.
+
+      시크릿 모드를 통해 다른 계정에 로그인하지 못하도록 하려면 IncognitoModeAvailability 정책을 사용하여 시크릿 모드를 차단해 보세요.
+
+      참고: 사용자가 쿠키를 차단하면 인증되지 않은 상태로 Google 서비스에 액세스할 수 있습니다.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> 플러그인 실행을 허용할 사이트를 지정하는 URL 패턴 목록을 설정하도록 허용합니다.
 
           이 정책을 설정하지 않으면 'DefaultPluginsSetting' 정책(설정된 경우) 또는 사용자 개인 설정의 전체 기본값이 모든 사이트에 사용됩니다.</translation>
@@ -1771,6 +1799,7 @@
 <translation id="6786967369487349613">로밍 프로필 디렉토리를 설정합니다.</translation>
 <translation id="6810445994095397827">이 사이트에서 자바스크립트 차단</translation>
 <translation id="681446116407619279">지원되는 인증 스키마</translation>
+<translation id="6835883744948188639">사용자에게 재실행하는 것이 좋다는 메시지를 반복하여 표시</translation>
 <translation id="685769593149966548">YouTube에 강력 제한 모드 사용</translation>
 <translation id="687046793986382807">이 정책은 <ph name="PRODUCT_NAME" /> 버전 35를 기준으로 지원이 중단되었습니다.
 
@@ -2291,7 +2320,7 @@
       이 정책이 설정되어 있지 않거나 사용 중지되어 있으면 사용자가 사용 중지하지 않는 한 PDF 플러그인을 사용하여 PDF 파일이 열립니다.</translation>
 <translation id="8402079500086185021">항상 외부 앱으로 PDF 파일 열기</translation>
 <translation id="8412312801707973447">온라인 OCSP/CRL 확인 수행 여부</translation>
-<translation id="841977920223099909">비밀번호 보호 경고 트리거</translation>
+<translation id="841977920223099909">비밀번호 보호 경고 실행</translation>
 <translation id="8424255554404582727">기본 디스플레이 회전 설정, 재부팅할 때마다 다시 적용됨</translation>
 <translation id="8426231401662877819">화면을 시계 방향으로 90도 회전</translation>
 <translation id="8451988835943702790">새 탭 페이지를 홈페이지로 사용</translation>
@@ -2350,7 +2379,7 @@
           이 정책을 설정하지 않으면 서버가 인트라넷에 있는 경우 <ph name="PRODUCT_NAME" />이(가) 감지하여 IWA 요청에만 응답합니다. 서버가 인트라넷으로 감지된 경우 <ph name="PRODUCT_NAME" />이(가) IWA 요청을 무시합니다.</translation>
 <translation id="8672321184841719703">자동 업데이트 버전 타겟팅</translation>
 <translation id="867410340948518937">U2F(범용 2차 요소)</translation>
-<translation id="8685024486845674965">비밀번호 재사용으로 인해 비밀번호 보호 경고 실행됨</translation>
+<translation id="8685024486845674965">비밀번호가 재사용되어 비밀번호 보호 경고가 실행됨</translation>
 <translation id="8693243869659262736">내장 DNS 클라이언트 사용</translation>
 <translation id="8704831857353097849">사용할 수 없는 플러그인 목록</translation>
 <translation id="8711086062295757690">해당 검색 공급자로 검색할 때 검색주소창에서 사용되는 단축키 키워드를 지정합니다.
@@ -2387,7 +2416,7 @@
       정책이 설정되지 않았거나 잘못 설정되어 있으면 위치가 신고되지 않습니다.</translation>
 <translation id="8818768076343557335">이동통신망을 사용하지 않는 모든 네트워크의 네트워크 활동을 예측합니다.
           (50에서 중지되고 52에서 삭제됩니다. 52가 넘은 경우 값을 1로 설정해도 0으로 처리됩니다. 모든 네트워크 연결 시 네트워크 활동을 예측합니다.)</translation>
-<translation id="8825782996899863372">피싱 페이지에서의 비밀번호 재사용으로 인해 비밀번호 보호 경고 실행됨</translation>
+<translation id="8825782996899863372">피싱 페이지에서 비밀번호가 재사용되어 비밀번호 보호 경고가 실행됨</translation>
 <translation id="8828766846428537606"><ph name="PRODUCT_NAME" />PRODUCT_NAME의 기본 홈페이지를 설정하고 사용자가 변경하지 못하게 합니다. 사용자의 홈페이지 설정은 홈페이지를 새 탭 페이지로 지정하거나 URL로 설정하여 홈페이지 URL을 지정하는 경우에만 완전히 잠깁니다. 홈페이지 URL을 지정하지 않아도 사용자는 계속 'chrome://newtab'을 지정하여 홈페이지를 새 탭 페이지로 설정할 수 있습니다.</translation>
 <translation id="8833109046074170275">기본 GAIA 절차에 따라 인증</translation>
 <translation id="8838303810937202360"><ph name="PRODUCT_OS_NAME" />은(는) 하나의 기기를 같이 사용하는 여러 사용자가 설치하는 앱 및 확장 프로그램을 캐시하여 각 사용자가 다시 다운로드할 필요가 없게 합니다.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 30ec679..24c93e6 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -253,6 +253,7 @@
       <ph name="PRODUCT_OS_NAME" />-ന് സേവന നിബന്ധനകൾ ഡൗൺലോഡുചെയ്യാനാകുന്ന രീതിയിൽ നയം ഒരു URL-ൽ സജ്ജീകരിക്കുക. സേവന നിബന്ധനകൾ മൈം തര വാചകമോ/സാധാരണ വാചകമോ ആയി പ്രവർത്തിക്കാനാകുന്ന സാധാരണ വാചകമായിരിക്കണം. മാർക്കപ്പ് അനുവദിക്കില്ല.</translation>
 <translation id="1750315445671978749">എല്ലാ ഡൗൺലോഡുകളും ബ്ലോക്കുചെയ്യുക</translation>
 <translation id="1781356041596378058">ഈ നയം Android ഡെവലപ്പർ ഓപ്‌ഷനുകളിലേക്കുള്ള ആക്‌സസിനെയും നിയന്ത്രിക്കുന്നു. ഈ നയം 'ശരി' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഡെവലപ്പർ ഓപ്‌ഷനുകൾ ആക്‌സസ് ചെയ്യാനാവില്ല. ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയോ സജ്ജമാക്കാതെ വിടുകയോ ആണെങ്കിൽ, Android ക്രമീകരണ ആപ്പിലെ ബിൽഡ് നമ്പറിൽ ഏഴ് തവണ ടാപ്പുചെയ്യുന്നതിലൂടെ ഉപയോക്താക്കൾക്ക് ഡെവലപ്പർ ഓപ്‌ഷനുകൾ ആക്‌സസ് ചെയ്യാം.</translation>
+<translation id="1797233582739332495">വീണ്ടും സമാരംഭിക്കൽ  ആവശ്യമാണെന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള നിര്‍ദ്ദേശം ഉപയോക്താവിനെ കാണിക്കുക</translation>
 <translation id="1803646570632580723">ലോഞ്ചറിൽ കാണിക്കുന്നതിനുള്ള പിൻ ചെയ്‌ത അപ്ലിക്കേഷനുകളുടെ ലിസ്റ്റ്</translation>
 <translation id="1808715480127969042">ഈ സൈറ്റുകളില്‍ കുക്കികള്‍ തടയുക</translation>
 <translation id="1827523283178827583">സ്ഥിരപ്പെടുത്തിയ പ്രോക്സി സെര്‍വറുകള്‍ ഉപയോഗിക്കുക</translation>
@@ -342,6 +343,11 @@
 
           ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ, നാലു സ്‌കീമുകളും ഉപയോഗിക്കുന്നതാണ്.</translation>
 <translation id="2067011586099792101">ഉള്ളടക്ക പാക്കുകളുടെ പുറത്തുള്ള സൈറ്റുകളിലേക്ക് ആക്‌സസ്സ് തടയുക</translation>
+<translation id="2070270043919235595">തീർച്ചപ്പെടുത്താത്ത അപ്‌ഡേറ്റ് പ്രയോഗിക്കാൻ <ph name="PRODUCT_NAME" /> വീണ്ടും സമാരംഭിക്കേണ്ടതുണ്ട് എന്ന് ഉപയോക്താക്കളെ അറിയിക്കുക.
+
+      ബ്രൗസർ വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്യുന്നുണ്ടെന്നോ അത് ആവശ്യമാണെന്നോ ഉപയോക്താവിനെ അറിയിക്കാൻ, ഈ നയ ക്രമീകരണം അറിയിപ്പുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു. സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഇതിന്റെ മെനുവിലെ സൂക്ഷ്‌മമായ മാറ്റങ്ങളിലൂടെ വീണ്ടും സമാരംഭിക്കൽ ആവശ്യമാണെന്ന് <ph name="PRODUCT_NAME" /> ഉപയോക്താവിനോട് സൂചിപ്പിക്കുന്നു. 'ശുപാർശ ചെയ്‌തു' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്‌തിരിക്കുന്നതായി ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. വീണ്ടും സമാരംഭിക്കൽ നീട്ടിവെക്കാനായി ഉപയോക്താവിന് ഈ മുന്നറിയിപ്പ് നിരാകരിക്കാനാവും. 'ആവശ്യമാണ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, അറിയിപ്പ് കാലാവധി കഴിഞ്ഞാൽ, ബ്രൗസർ വീണ്ടും സമാരംഭിക്കൽ നിർബന്ധിതമാകുമെന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള മുന്നറിയിപ്പ് ഉപയോക്താവിനെ കാണിക്കും. ഡിഫോൾട്ടായി ഏഴ് ദിവസമാണ് ഇതിന്റെ കാലാവധി, മാത്രമല്ല <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> നയ ക്രമീകരണം വഴി ഇത് കോണ്‍ഫിഗര്‍ ചെയ്‌തേക്കാം.
+
+      വീണ്ടും സമാരംഭിക്കലിനെ തുടർന്ന് ഉപയോക്താവിന്റെ സെഷൻ പുനഃസ്ഥാപിക്കപ്പെടും.</translation>
 <translation id="2077129598763517140">ലഭ്യമാകുമ്പോൾ ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തൽ ഉപയോഗിക്കുക</translation>
 <translation id="2077273864382355561">ബാറ്ററി പവറിൽ പ്രവർത്തിക്കുമ്പോൾ സ്‌ക്രീൻ ഓഫ് ആകുന്നതിന്റെ കാലതാമസം</translation>
 <translation id="2082205219176343977">ഉപകരണത്തിന് അനുവദനീയമായ കുറഞ്ഞ Chrome പതിപ്പ് കോണ്‍ഫിഗര്‍ ചെയ്യുക.</translation>
@@ -397,6 +403,9 @@
       ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, ഈ ക്രമീകരണം അടിസ്ഥാനമാക്കി അതിവേഗ അൺലോക്ക് ഉപയോഗിക്കുന്ന ഉപയോക്താക്കളോട് ലോക്ക് സ്‌ക്രീനിൽ അവരുടെ പാസ്‌വേഡ് നൽകാൻ അഭ്യർത്ഥിക്കും.
 
       ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ, അതിവേഗ അൺലോക്ക് ഉപയോഗിക്കുന്ന ഉപയോക്താക്കളോട് ലോക്ക് സ്‌ക്രീനിൽ ഓരോ ദിവസവും അവരുടെ പാസ്‌വേഡ് നൽകാൻ അഭ്യർത്ഥിക്കും.</translation>
+<translation id="2188722565665306629">തീർച്ചപ്പെടുത്താത്ത അപ്‌ഡേറ്റ് പ്രയോഗിക്കാൻ, <ph name="PRODUCT_NAME" /> വീണ്ടും സമാരംഭിക്കൽ അറിയിപ്പുകൾ കാണിച്ചിരിക്കുന്ന സമയ പരിധി സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
+
+      മില്ലി സെക്കൻഡിൽ സമയ പരിധി നിയന്ത്രിക്കാനായി ഈ നയ ക്രമീകരണം ഉപയോഗിക്കാം, അപ്‌ഡേറ്റിനായി <ph name="PRODUCT_NAME" /> വീണ്ടും സമാരംഭിക്കേണ്ടതുണ്ടെന്ന് (അല്ലെങ്കിൽ <ph name="PRODUCT_OS_NAME" /> പുനരാരംഭിക്കേണ്ടതുണ്ട്) അത് ഉപയോക്താവിനെ കാലഗതി പ്രകാരം അറിയിക്കും. ഈ കാലയളവിൽ, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> നയ ക്രമീകരണത്തിന്റെ അടിസ്ഥാനത്തിൽ അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതിന്റെ ആവശ്യകതയെ കുറിച്ച് ആവർത്തിച്ച് ഉപയോക്താവിനെ അറിയിക്കും. സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ട് സമയ പരിധിയായ 604800000 മില്ലി സെക്കൻഡുകൾ (ഒരാഴ്‌ച) ഉപയോഗിക്കപ്പെടും.</translation>
 <translation id="2194470398825717446">ഈ നയം M61-ൽ അവസാനിപ്പിച്ചതിനാൽ പകരം EcryptfsMigrationStrategy ഉപയോഗിക്കുക.
 
       ecryptfs ഉപയോഗിച്ച് ഷിപ്പുചെയ്‌‌ത ഒരു ഉപകരണം എങ്ങനെ പ്രവർത്തിക്കണമെന്നും, ext4 എന്‍ക്രിപ്ഷനിലേക്ക് സംക്രമണം നടത്തേണ്ടത് ആവശ്യമാണെന്നും വ്യക്തമാക്കുന്നു.
@@ -622,6 +631,13 @@
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> ഫയലുകളുടെ അപ്ലിക്കേഷനിൽ ഡ്രൈവ് പ്രവർത്തനരഹിതമാക്കുന്നു</translation>
 <translation id="268577405881275241">ഡാറ്റ കംപ്രഷൻ പ്രോക്‌സി സവിശേഷത പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2710534340210290498">ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് സ്‌ക്രീൻ ലോക്കുചെയ്യാൻ കഴിയില്ല (ഉപയോക്തൃ സെഷനിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യാൻ മാത്രമേ കഴിയൂ). ഈ ക്രമീകരണം 'ശരി' എന്ന് സജ്ജമാക്കുകയോ സജ്ജമാക്കാതെ വിടുകയോ ചെയ്യുകയാണെങ്കിൽ, ഒരു പാസ്‌വേഡ് ഉപയോഗിച്ച് വിശ്വാസ്യത ഉറപ്പാക്കിയ ഉപയോക്താക്കൾക്കേ സ്‌ക്രീൻ ലോക്കുചെയ്യാൻ കഴിയൂ.</translation>
+<translation id="2726613915126661822">Chrome OS-ൽ വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ അനുവദിക്കണോ എന്നത് നിയന്ത്രിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
+
+      നയം 'ശരി' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ ഉപകരണം അനുവദനീയമായിരിക്കും.
+      നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ ഉപകരണം അനുവദനീയമായിരിക്കില്ല.
+      ഈ നയം 'തെറ്റ്' ആയി മാറ്റപ്പെടുമ്പോൾ, പുതിയ വെർച്വൽ മെഷീനുകൾ ആരംഭിക്കാൻ ഇത് പ്രയോഗിക്കുന്നു, എന്നാൽ നിലവിൽ റൺ ചെയ്യുന്ന വെർച്വൽ മെഷീനുകളെ ഷട്ട് ഡൗൺ ചെയ്യുകയുമില്ല.
+      മാനേജ് ചെയ്യപ്പെട്ട ഉപകരണത്തിൽ ഈ നയം സജ്ജീകരിക്കാത്തപ്പോൾ, വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ ഉപകരണം അനുവദിക്കില്ല.
+      മാനേജ് ചെയ്യപ്പെടാത്ത ഉപകരണങ്ങൾ വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ അനുവദിക്കും.</translation>
 <translation id="2731627323327011390">ARC-ആപ്‌സിനുള്ള <ph name="PRODUCT_OS_NAME" /> സർട്ടിഫിക്കറ്റുകളുടെ ഉപയോഗം പ്രവർത്തനരഹിതമാക്കുക</translation>
 <translation id="2742843273354638707">പുതിയ ടാബ് പേജിൽ നിന്നും <ph name="PRODUCT_OS_NAME" /> അപ്ലിക്കേഷൻ ലോഞ്ചറിൽ നിന്നും Chrome വെബ് സ്റ്റോർ അപ്ലിക്കേഷനും അടിക്കുറിപ്പ് ലിങ്കും മറയ്‌ക്കുക.
 
@@ -868,6 +884,7 @@
           ഈ നയം ഓപ്‌ഷണലാണ്. സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, പുതിയ ടാബ് പേജൊന്നും ലഭിക്കില്ല.
 
           'DefaultSearchProviderEnabled' നയം പ്രവർത്തനക്ഷമമെങ്കിൽ മാത്രമേ ഈ നയം ബാധകമാകൂ.</translation>
+<translation id="3465852069254497664">ബ്രൗസർ വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്യുന്നു എന്നോ ആവശ്യമാണ് എന്നോ ഉപയോക്താവിനെ അറിയിക്കുക</translation>
 <translation id="346731943813722404">പവർ മാനേജുമെന്റ് കാലതാമസങ്ങളും സെഷൻ ദൈർഘ്യ പരിധിയും പ്രവർത്തിച്ചുതുടങ്ങേണ്ടത് ഒരു സെഷനിലെ ആദ്യ ഉപയോക്തൃ പ്രവർത്തനം നീരിക്ഷിച്ചതിനുശേഷം മാത്രമാണോയെന്നത് വ്യക്തമാക്കുന്നു.
 
           ഈ നയം True എന്ന് സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ, പവർ മാനേജുമെന്റ് കാലതാമസങ്ങളും സെഷൻ ദൈർഘ്യ പരിധിയും ഒരു സെഷനിലെ ആദ്യ ഉപയോക്തൃ പ്രവർത്തനം നീരിക്ഷിക്കപ്പെടുന്നതുവരെ പ്രവർത്തിച്ചുതുടങ്ങില്ല.
@@ -916,6 +933,7 @@
 <translation id="3734995764843493369">എല്ലാ ദിവസവും പാസ്‌വേഡ് നൽകേണ്ടതുണ്ട് (24 മണിക്കൂർ)</translation>
 <translation id="3736879847913515635">ഉപയോക്തൃ മാനേജറിൽ വ്യക്തിയെ ചേർക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="3737544779868348650">ഉപകരണ നെറ്റ്‌വർക്ക് ഹോസ്റ്റുനാമം</translation>
+<translation id="3740754010292550733">വീണ്ടും സമാരംഭിക്കൽ അറിയിപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനായി സമയ പരിധി സജ്ജീകരിക്കുക</translation>
 <translation id="3750220015372671395">ഈ സൈറ്റുകളിൽ കീ സൃഷ്‌ടിക്കൽ ബ്ലോക്കുചെയ്യുക</translation>
 <translation id="375266612405883748">ഈ മെഷീനിലെ വിദൂര ആക്‌സസ്സ് ഹോസ്‌റ്റ് ഉപയോഗിക്കുന്ന UDP പോർട്ട് പരിധി പരിമിതപ്പെടുത്തുന്നു.
 
@@ -1617,7 +1635,7 @@
 
       നയത്തിന്റെ അറിയിപ്പുകളെ പ്ലാറ്റ്‌ഫോം പിന്തുണയ്‌ക്കുന്നുണ്ടെങ്കിൽ, നയം മാറുമ്പോഴെല്ലാം നയത്തിന്റെ അറിയിപ്പുകൾ സ്വയം പുതുക്കിയെടുക്കാൻ നിർബന്ധിക്കുകയും അതിലൂടെ അനാവശ്യമായി ഇടയ്‌ക്കിടെയുള്ള പുതുക്കിയെടുക്കലുകൾക്കും സാധ്യതയുള്ളതിനാൽ, പുതുക്കിയെടുക്കാനുള്ള കാലയളവ് 24 മണിക്കൂറായി (എല്ലാ ഡിഫോൾട്ടുകളും ഈ നയത്തിന്റെ മൂല്യവും അവഗണിച്ചുകൊണ്ട്) സജ്ജമാക്കുകയും ചെയ്യുമെന്നത് ശ്രദ്ധിക്കുക.</translation>
 <translation id="5530347722229944744">അപകടകരമാകാൻ സാധ്യതയുള്ള ഡൗൺലോഡുകൾ ബ്ലോക്കുചെയ്യുക</translation>
-<translation id="5530586312297447592">ഫിഷിംഗ് പേജിലെ പാസ്‌വേഡ് പുനരുപയോഗിച്ച്, പാസ്‍വേഡ് പരിരക്ഷ വഴി അപകടസാധ്യതാ അക്കൗണ്ട് ഫ്ലാഗ് ചെയ്യൽ ട്രിഗര്‍ ചെയ്തു.</translation>
+<translation id="5530586312297447592">ഫിഷിംഗ് പേജിലെ പാസ്‌വേഡ് പുനരുപയോഗിച്ച്, പാസ്‍വേഡ് പരിരക്ഷ വഴി അപകടസാധ്യതാ അക്കൗണ്ട് ഫ്ലാഗ് ചെയ്യൽ ട്രിഗര്‍ ചെയ്തു</translation>
 <translation id="5535973522252703021">Kerberos ഡെലിഗേഷന്‍ സെര്‍വര്‍ അനുമതിലിസ്റ്റ്</translation>
 <translation id="555077880566103058"><ph name="FLASH_PLUGIN_NAME" /> പ്ലഗിൻ റൺ ചെയ്യുന്നതിന് എല്ലാ സൈറ്റുകളെയും അനുവദിക്കുക</translation>
 <translation id="5559079916187891399">ഈ നയം Android ആപ്‌സുകൾക്ക് ബാധകമല്ല.</translation>
@@ -1766,6 +1784,7 @@
          നിങ്ങൾ ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, വലിയ കഴ്‌സർ പ്രവർത്തനക്ഷമമോ പ്രവർത്തനരഹിതമോ ആക്കുന്നതിലൂടെ ഉപയോക്താക്കൾക്ക് താൽക്കാലികമായി ഇത് റദ്ദാക്കാനാവും. എന്നിരുന്നാലും, ഉപയോക്താക്കളുടെ ചോയിസ് സ്ഥിരമായുള്ളതല്ല, ലോഗിൻ സ്‌ക്രീൻ ഒരു പുതിയ പേജ് കാണിക്കുമ്പോഴൊക്കെയും അല്ലെങ്കിൽ ഉപയോക്താവ് ലോഗിൻ സ്‌ക്രീനിൽ ഒരുമിനിറ്റ് നിഷ്‌ക്രിയമായി കാണപ്പെടുമ്പോഴൊക്കെയും സ്ഥിരമായത് പുനഃസ്ഥാപിക്കപ്പെടുന്നു.
 
          ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, ലോഗിൻ സ്‌ക്രീൻ ആദ്യമായി കാണിക്കുമ്പോൾ വലിയ കഴ്‌സർ പ്രവർത്തനരഹിതമാകുന്നു. ഉപയോക്താക്കൾക്ക് ഏതുസമയത്തും വലിയ കഴ്‌സർ പ്രവർത്തനക്ഷമമോ പ്രവർത്തനരഹിതമോ ആക്കാനാകും, ഒപ്പം ലോഗിൻ സ്‌ക്രീനിലെ ഇതിന്റെ നില ഉപയോക്താക്കൾക്കിടയിൽ സ്ഥിരമായിരിക്കും.</translation>
+<translation id="5929855945144989709">Chrome OS-ൽ വെർച്വൽ മെഷീനുകൾ റൺ ചെയ്യാൻ ഉപകരണങ്ങളെ അനുവദിക്കുക</translation>
 <translation id="5932767795525445337">Android ആപ്പുകൾ പിൻ ചെയ്യാൻ, ഈ നയവും ഉപയോഗിക്കാവുന്നതാണ്.</translation>
 <translation id="5936622343001856595">Google വെബ് തിരയലിലെ SafeSearch ഉപയോഗിച്ച് ചെയ്യേണ്ട തിരയൽ ചോദ്യങ്ങളെ നിർബന്ധമായി സജീവമാക്കുകയും ഉപയോക്താക്കൾ ഈ ക്രമീകരണം മാറ്റുന്നത് തടയുകയും ചെയ്യുന്നു.
 
@@ -2021,7 +2040,7 @@
 <translation id="6655763070877154624">ഇൻസ്‌റ്റന്റ് ടെതറിംഗ് ഉപയോഗിക്കുന്നത് അനുവദിക്കുന്നു.</translation>
 <translation id="6658245400435704251">സെർവറിലേക്ക് ആദ്യമായി അപ്‌ഡേറ്റ് നീക്കപ്പെട്ട സമയത്തിന് ശേഷം, ആ അപ്‌ഡേറ്റിന്റെ ഡൗൺലോഡിനെ യാദൃശ്ചികമായി ഒരു ഉപകരണം, എത്ര നിമിഷങ്ങളോളം കാലതാമസം വരുത്താം എന്ന് സൂചിപ്പിക്കുന്നു. ഉപകരണം, ഈ കാലതാമസ സമയത്തിന്റെ ഒരു ഭാഗം ചുവർ ഘടികാരത്തിന്റെ അടിസ്ഥാനത്തിൽ കാലതാമസം വരുത്താം, അപ്‌ഡേറ്റ് പരിശോധനകളുടെ എണ്ണത്തെ അടിസ്ഥാനമാക്കിയാണ് ഉപകരണം ബാക്കിയുള്ള ഭാഗം കാലതാമസം വരുത്തുന്നത്. എന്ത് സാഹചര്യമായാലും, ശാശ്വതമായി ഒരു അപ്‌ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യുന്നതിനായി കാത്തിരിക്കുന്ന തരത്തിൽ ഉപകരണം സ്‌തംഭിച്ചുപോകാതിരിക്കുന്നതിനായി ഒരു സ്ഥിര അളവ് സമയത്തിലേക്ക് സ്‌കാറ്റർ നിർബന്ധിതമാക്കപ്പെടുന്നു.</translation>
 <translation id="6689792153960219308">ഹാർഡ്‌വെയർ നില റിപ്പോർട്ട് ചെയ്യുക</translation>
-<translation id="6698071416141001300">പാസ്‌വേഡ് പുനരുപയോഗിച്ച്, പാസ്‍വേഡ് പരിരക്ഷ വഴി അപകടസാധ്യതാ അക്കൗണ്ട് ഫ്ലാഗ് ചെയ്യൽ ട്രിഗര്‍ ചെയ്തു.</translation>
+<translation id="6698071416141001300">പാസ്‌വേഡ് പുനരുപയോഗിച്ച്, പാസ്‍വേഡ് പരിരക്ഷ വഴി അപകടസാധ്യതാ അക്കൗണ്ട് ഫ്ലാഗ് ചെയ്യൽ ട്രിഗര്‍ ചെയ്തു</translation>
 <translation id="6699880231565102694">വിദൂര ആക്‌സസ്സ് ഹോസ്റ്റുകൾക്കായി ഇരട്ട-വസ്‌തുതാ പ്രാമാണീകരണം പ്രാപ്‌തമാക്കുക</translation>
 <translation id="6724842112053619797">റോമിംഗ് ഉപയോക്തൃ പ്രൊഫൈൽ ഫോൾഡറിലോ <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" /> നയം വഴി അഡ്‌മിനിസ്‌ട്രേറ്റർ നൽകിയ ലൊക്കേഷനിലോ സൂക്ഷിച്ചിട്ടുള്ള ഒരു ഫയലിൽ, ബുക്ക്‌മാർക്കുകൾ, സ്വയമേവ പൂരിപ്പിക്കുന്ന വിവരങ്ങൾ, പാസ്‌വേഡുകൾ എന്നിവ പോലെ <ph name="PRODUCT_NAME" /> പ്രൊഫൈലുകളിൽ സൂക്ഷിച്ചിരിക്കുന്ന ക്രമീകരണവും റൈറ്റുചെയ്യും. ഈ നയം പ്രവർത്തനസജ്ജമാക്കുമ്പോൾ ക്ലൗഡ് സമന്വയിപ്പിക്കൽ പ്രവർത്തനരഹിതമാക്കുന്നു.
 
@@ -2029,6 +2048,15 @@
 
       ഈ <ph name="SYNC_DISABLED_POLICY_NAME" /> നയം എല്ലാ ഡാറ്റ സമന്വയിപ്പിക്കലും പ്രവർത്തനരഹിതമാക്കുകയും, RoamingProfileSupportEnabled അസാധുവാക്കുകയും ചെയ്യുന്നു.</translation>
 <translation id="6735701345096330595">ഭാഷകളുടെ അക്ഷര‌പ്പിശക് പരിശോധന പ്രവർത്തനക്ഷമമാക്കുന്നത് നിർബന്ധിക്കുക</translation>
+<translation id="673699536430961464">ഉപയോക്താക്കൾ <ph name="PRODUCT_OS_NAME" /> ഉപകരണത്തിലേക്ക് സൈൻ ഇൻ ചെയ്ത ശേഷം, അവരുടെ ബ്രൗസർ വിൻഡോയുടെ ഉള്ളടക്ക ഏരിയയ്‌ക്കുള്ളിൽ, Google അക്കൗണ്ടുകൾക്കിടയിൽ മാറാൻ ഉപയോക്താക്കളെ ഈ ക്രമീകരണം അനുവദിക്കുന്നു.
+
+      ഈ നയം 'തെറ്റ്' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, അദൃശ്യമല്ലാത്ത ബ്രൗസർ ഉള്ളടക്ക ഏരിയയിൽ നിന്ന് മറ്റൊരു അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദിക്കപ്പെടില്ല.
+
+      ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ 'ശരി' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ, ഡിഫോൾട്ട് പെരുമാറ്റം ഉപയോഗിക്കപ്പെടും: ബ്രൗസർ ഉള്ളടക്ക ഏരിയയിൽ നിന്ന് മറ്റൊരു അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദിക്കപ്പെടും, എന്നാൽ കുട്ടികളുടെ അക്കൗണ്ടുകളുടെ കാര്യത്തിൽ അദൃശ്യമല്ലാത്ത ഉള്ളടക്ക ഏരിയയിൽ നിന്ന് സൈൻ ഇൻ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്യപ്പെടും.
+
+     അദൃശ്യ മോഡ് വഴി മറ്റൊരു അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദിക്കപ്പെടില്ല, IncognitoModeAvailability നയം ഉപയോഗിച്ച് ആ മോഡ് ബ്ലോക്ക് ചെയ്യുന്ന കാര്യം പരിഗണിക്കുക.
+
+      ഉപയോക്താക്കൾക്ക് അവരുടെ കുക്കികൾ ബ്ലോക്ക് ചെയ്‌ത്, പ്രാമാണീകരിക്കാത്ത നിലയിൽ Google സേവനങ്ങൾ ആക്സസ് ചെയ്യാനാവുമെന്നത് ശ്രദ്ധിക്കുക.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> പ്ലഗിൻ റൺ ചെയ്യാൻ അനുവദിക്കപ്പെട്ടിട്ടുള്ള സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്‌റ്റ് സജ്ജീകരിക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു.
 
           ഈ നയം സജ്ജമാക്കാതെ വിട്ടിരിക്കുകയാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള സ്ഥിര മൂല്യം ഉപയോഗിക്കപ്പെടും;  'DefaultPluginsSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക.</translation>
@@ -2038,6 +2066,7 @@
 <translation id="6786967369487349613">റോമിംഗ് പ്രൊഫൈൽ ഡയറക്‌റ്ററി സജ്ജമാക്കുക</translation>
 <translation id="6810445994095397827">ഈ സൈറ്റുകളില്‍ JavaScript തടയുക</translation>
 <translation id="681446116407619279">പ്രാമാണീകരണ സ്കീമുകള്‍ പിന്തുണയ്ക്കുന്നു</translation>
+<translation id="6835883744948188639">വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്‌തിരിക്കുന്നു എന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള നിര്‍ദ്ദേശം ഉപയോക്താവിനെ കാണിക്കുക</translation>
 <translation id="685769593149966548">YouTube-ൽ കർശന നിയന്ത്രിത മോഡ് പ്രവർത്തനത്തിൽ വരുത്തുക</translation>
 <translation id="687046793986382807"><ph name="PRODUCT_NAME" /> പതിപ്പ് 35 മുതൽ ഈ നയം റദ്ദാക്കി.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index fbbd6850..f8af05a 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -105,7 +105,7 @@
 
       हे धोरण असत्य वर सेट केल्‍यास, <ph name="PRODUCT_NAME" /> अतिथी प्रोफाईल प्रारंभ करण्यास अनुमती देणार नाही.</translation>
 <translation id="1363275621236827384">हार्डवेअर प्रोफाइलसाठी Quirks सर्व्हरवर क्वेरी सक्षम करा</translation>
-<translation id="1387596372902085462">Symantec Corporation च्या Legacy PKI Infrastructure मध्ये विश्वास करणे चालू करायचे की नाही</translation>
+<translation id="1387596372902085462">Symantec Corporation च्या Legacy PKI Infrastructure वर विश्वास ठेवणे चालू करायचे की, नाही</translation>
 <translation id="1393485621820363363">एंटरप्राइझ डीव्हाइस प्रिंटर सुरू केले</translation>
 <translation id="1397855852561539316">डीफॉल्ट शोध प्रदाता सू‍चना URL</translation>
 <translation id="1426410128494586442">होय</translation>
@@ -243,6 +243,7 @@
       धोरण एका URL वर सेट केले जावे ज्यावरून <ph name="PRODUCT_OS_NAME" /> सेवा अटी डाउनलोड करू शकते. MIME प्रकारच्या मजकूर/साध्या रुपात दिलेल्या सेवा अटी ह्या साधा मजकूर असणे आवश्यक आहे. कोणत्याही मार्कअपला अनुमती नाही.</translation>
 <translation id="1750315445671978749">सर्व डाउनलोड ब्लॉक करा</translation>
 <translation id="1781356041596378058">हे धोरण Android विकासक पर्यायांमधील प्रवेश देखील नियंत्रित करते. आपण हे धोरण सत्य वर सेट केल्यास, वापरकर्ते विकासक पर्यायांमध्ये प्रवेश करू शकत नाहीत. आपण हे धोरण असत्यवर सेट केल्यास किंवा ते अनसेट केलेले ठेवल्यास, वापरकर्ते Android सेटिंग्ज अॅप मधील बिल्ड क्रमांकावर सात वेळा टॅप करून विकासक पर्यायांमध्ये प्रवेश करू शकतात.</translation>
+<translation id="1797233582739332495">रीलाँच करणे आवश्यक असल्याचे दाखवणार्‍या वापरकर्त्यास एक आवर्त सूचना दाखवा</translation>
 <translation id="1803646570632580723">लाँचर मध्‍ये दर्शविण्‍यासाठी पिन केलेल्या अनुप्रयोगांची सूची</translation>
 <translation id="1808715480127969042">या साइटवरील कुकीज अवरोधित करा </translation>
 <translation id="1827523283178827583">निश्चित केलेले प्रॉक्सी सर्व्हर वापरा</translation>
@@ -325,6 +326,11 @@
 
           हे धोरण सेट न केलेले ठेवल्यास, सर्व चार योजना वापरल्या जातील.</translation>
 <translation id="2067011586099792101">सामग्री पॅक बाहेरील साइटवर प्रवेश अवरोधित करा</translation>
+<translation id="2070270043919235595">प्रलंबित अपडेट लागू करण्यासाठी <ph name="PRODUCT_NAME" /> रीलाँच करणे आवश्यक असल्याचे वापरकर्त्यांना सूचित करा.
+
+      ब्राउझर रीलाँच करण्याची शिफारस केली आहे किंवा आवश्यक आहे हे वापरकर्त्यास सूचित कण्यासाठी ही धोरण सेटिंग सूचना सुरू करते. सेट केले नसल्यास, मेनूमध्ये थोडे बदल करून रीलाँच करणे आवश्यक असल्याचे <ph name="PRODUCT_NAME" /> वापरकर्त्याला सूचित करते. 'शिफारस केली' वर सेट केले असल्यास, रीलाँचची शिफारस केली आहे ही आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. रीलाँच स्थगित करण्यासाठी वापरकर्ता ही चेतावणी डिसमिस करू शकतो. 'आवश्यक' वर सेट केले असल्यास, सूचना कालावधी संपल्यावर ब्राउझर रीलाँचला जबरदस्ती केली जाईल असे सूचित करणारी आवर्ती चेतावणी वापरकर्त्याला दाखवली जाईल. हा कालावधी बाय डिफॉल्ट सात दिवसांचा आहे आणि <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> धोरण सेटिंगमधून कॉन्फिगर केला जाऊ शकतो.
+
+      वापरकर्त्याच्या सत्राने खालील रीलाँच रीस्टोअर केला आहे.</translation>
 <translation id="2077129598763517140">उपलब्ध असेल तेव्हा हार्डवेअर ऍक्सीलरेशन वापरा</translation>
 <translation id="2077273864382355561">बॅटरी उर्जेवर चालताना स्क्रीन बंद विलंब</translation>
 <translation id="2082205219176343977">डिव्हाइससाठी किमान अनुमती असलेली Chrome आवृत्ती कॉन्फिगर करा.</translation>
@@ -376,6 +382,9 @@
       हे सेटिंग कॉन्फिगर केले असल्यास, द्रुत अनलॉक वापरत असलेल्या वापरकर्त्यांना या सेटिंगवर आधारित लॉक स्क्रीनवर त्यांचे संंकेतशब्द एंटर करण्याची विनंती केली जाईल.
 
       हे सेटिंग कॉन्फिगर केले नसल्यास, द्रुत अनलॉक वापरणार्‍या वापरकर्त्यांना दर दिवशी लॉक स्क्रीनवर त्यांचा संंकेतशब्द एंटर करण्याची विनंती केली जाईल.</translation>
+<translation id="2188722565665306629">तुम्हाला कालावधी सेट करण्याची अनुमती देतो ज्यानुसार प्रलंबित अपडेट दाखवण्यासाठी <ph name="PRODUCT_NAME" /> रीलाँच सूचना दाखवल्या आहेत.
+
+      कालावधी मिलीसेकंदांमध्ये नियंत्रित करण्यासाठी ही धोरण सेटिंग वापरली जाऊ शकते, ज्यानुसार वापरकर्त्याला हळूहळू कळवले जाते की, अपडेटसाठी <ph name="PRODUCT_NAME" /> रीलाँच करणे आवश्यक आहे (किंंवा <ph name="PRODUCT_OS_NAME" /> रीस्टार्ट करणे आवश्यक आहे). या कालावधीत, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> धोरणाच्या सेटिंगवर आधारित अपडेटची आवश्यकता वापरकर्त्याला वारंवार कळवली जाते. सेट न केल्यास, ६०४८००००० मिलीसेकंदांचा डिफॉल्ट कालावधी (एक आठवडा) वापरला जातो.</translation>
 <translation id="2194470398825717446">हे धोरण M61 मध्ये कालबाह्य झाले आहे, कृपया त्याऐवजी EcryptfsMigrationStrategy धोरण वापरा.
 
       ecryptfs सोबत पाठवलेल्या डिव्हाइसने कसे काम करावे आणि ext4 एंक्रिप्शनवर संक्रमणाची आवश्यकता असते हे निर्दिष्ट करते.
@@ -600,6 +609,13 @@
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> फायली अॅप मध्ये ड्राइव्ह अक्षम करते</translation>
 <translation id="268577405881275241">डेटा संक्षेप प्रॉक्सी वैशिष्ट्य सक्षम करा</translation>
 <translation id="2710534340210290498">ही सेटिंग असत्य वर सेट केली असल्यास, वापरकर्ते स्क्रीन लॉक करू शकणार नाहीत (केवळ वापरकर्ता सत्रातून साइनिंग आउट केल्यावर शक्य होईल). ही सेटिंग सत्य वर सेट केली असल्यास, जे वापरकर्ते पासवर्डद्वारे प्रमाणित आहेत ते स्क्रीन लॉक करू शकतील.</translation>
+<translation id="2726613915126661822">आभासी मशीनना Chrome OS वर रन होण्याची अनुमती आहे की, नाही हे नियंत्रित करण्याची तुम्हाला अनुमती देते.
+
+      हे धोरण सत्य वर सेट केल्यास, आभासी मशीन रन करण्याची डिव्हाइस अनुमती देते.
+      हे धोरण असत्य वर सेट केल्यास, आभासी मशीन रन करण्याची डिव्हाइस अनुमती देत नाही.
+      हे धोरण असत्य वर सेट केल्यावर, ते नवीन आभासी मशीन सुरू करण्यास लागू होते पण आभासी मशीन या आधीपासून चालत असलेल्या आभासी मशीन बंद करत नाहीत.
+      हे धोरण व्यवस्थापित डिव्हाइसवर सेट केलेले नसताना, डिव्हाइसला आभासी मशीन रन करण्याची अनुमती असणार नाही.
+      अव्यवस्थापित डिव्हाइसना आभासी मशीन रन करण्याची अनुमती आहे.</translation>
 <translation id="2731627323327011390">ARC-अॅप्स वर <ph name="PRODUCT_OS_NAME" /> प्रमाणपत्रांचा वापर अक्षम करा</translation>
 <translation id="2742843273354638707">नवीन टॅब पृष्ठावरील आणि <ph name="PRODUCT_OS_NAME" /> अ‍ॅप लाँचरवरील Chrome वेब स्टोअर अ‍ॅप आणि फूटर दुवा लपवा.
 
@@ -848,6 +864,7 @@
           हे धोरण पर्यायी आहे. सेट केले नसल्यास, कोणतेही नवीन टॅब पृष्ठ प्रदान केले जाणार नाही.
 
           'DefaultSearchProviderEnabled' धोरण सक्षम केले असल्यासच या धोरणास महत्त्व दिले जाते.</translation>
+<translation id="3465852069254497664">ब्राउझर रीलाँच करण्याची शिफारस केली आहे किंवा आवश्यक आहे याबद्दल वापरकर्त्याला सूचित करा</translation>
 <translation id="346731943813722404">सामर्थ्य व्यवस्थापन विलंब आणि सत्र लांबी मर्यादेने सत्रामध्ये प्रथम वापरकर्ता क्रियाकलापाचे निरीक्षण केले गेल्यानंतर फक्त चालणे प्रारंभ करावे किंवा नाही हे निर्दिष्ट करते.
 
           हे धोरण सत्य वर सेट केल्यास, सत्रामध्ये प्रथम वापरकर्ता क्रियाकलापाचे निरीक्षण केले गेल्यानंतर सामर्थ्य व्यवस्थापन विलंब आणि सत्र मर्यादा लांबी चालणे प्रारंभ करत नाही.
@@ -900,6 +917,7 @@
 <translation id="3734995764843493369">दररोज पासवर्ड टाकणे आवश्यक आहे (24 तास).</translation>
 <translation id="3736879847913515635">वापरकर्ता व्यवस्थापकामध्ये व्यक्ती जोडणे सक्षम करा</translation>
 <translation id="3737544779868348650">डिव्हाइस नेटवर्क होस्ट नाव</translation>
+<translation id="3740754010292550733">अपडेट रीलाँच करण्यासाठी कालावधी सेट करा</translation>
 <translation id="3750220015372671395">या साइटवर की निर्मिती अवरोधित करा</translation>
 <translation id="375266612405883748">या मशीनमधील रिमोट अॅक्सेस होस्टद्वारे वापरलेल्या UDP पोर्ट श्रेणी प्रतिबंधित करते.
 
@@ -1759,6 +1777,7 @@
           आपण हे धोरण सेट केल्यास, वापरकर्ते मोठा कर्सर सक्षम करून किंवा अक्षम करून तो तात्पुरता अधिलिखित करू शकतात. तथापि, वापरकर्त्याची निवड कायम रहात नाही आणि लॉगिन स्क्रीन एक नवीन दर्शविते तेव्हा किंवा एका मिनिटासाठी लॉगिन स्क्रीनवर वापरकर्ता निष्क्रिय असतो तेव्हा डीफॉल्ट पुनर्संचयित केले जाते.
 
           हे धोरण सेट न करता सोडल्यास, जेव्हा लॉगिन स्क्रीन प्रथम दर्शविली जाते तेव्हा मोठा कर्सर अक्षम होतो. वापरकर्ते कोणत्याही वेळी मोठा कर्सर सक्षम किंवा अक्षम करू शकतात आणि लॉगिन स्क्रीनवरील त्याची स्थिती वापरकर्त्यांमध्ये कायम रहाते.</translation>
+<translation id="5929855945144989709">Chrome OS वर आभासी मशीन रन करण्याची डिव्हाइसला अनुमती द्या</translation>
 <translation id="5932767795525445337">हे धोरण Android अ‍ॅप्स पिन करण्यासाठीदेखील वापरले जाऊ शकते.</translation>
 <translation id="5936622343001856595">Google वेब शोध मधील क्वेरी सक्रियवर सेट केलेल्या सुरक्षितशोधासह पूर्ण केले जाण्यावर भर देते आणि वापरकर्त्यांना हे सेटिंग बदलण्यापासून प्रतिबंधित करते.
 
@@ -2015,6 +2034,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> धोरण RoamingProfileSupportEnabled ला अधिलिखित करून, सर्व डेटा सिंक्रोनायझेशन बंद करेल.</translation>
 <translation id="6735701345096330595">शब्‍दलेखन भाषा जाणीवपूर्वक चालू करा</translation>
+<translation id="673699536430961464">ही सेटिंग वापरकर्त्यांनी <ph name="PRODUCT_OS_NAME" /> डिव्हाइस वर साइन इन केल्यावर त्यांच्या ब्राउझर विंडोच्या आशयातील विभागामध्ये Google खात्यांदरम्यान स्विच करण्याची अनुमती देते.
+
+      ही सेटिंग असत्य वर सेट केली असल्यास, गुप्त नसलेल्या ब्राउझर आशय क्षेत्रामधून भिन्न खात्यामध्ये साइन इन करण्याची अनुमती दिली जाणार नाही.
+
+      हे धोरण सेट केले नसल्यास किंवा सत्यवर सेट केले असल्यास, डिफॉल्ट स्थिती वापरली जाईल: ब्राउझर आशय क्षेत्रामधून भिन्न खात्यामध्ये साइन करण्याची अनुमती दिली जाणार नाही, फक्त लहान मुलांची खाती वगळता ज्यात ते गुप्त नसलेल्या आशय क्षेत्रासाठी ब्लॉक केले जाईल.
+
+      गुप्त मोड वापरून भिन्न खात्यामध्ये साइन इन करण्याची अनुमती न मिळाल्यास, गुप्तमोडउपलब्धता धोरण वापरून तो मोड ब्लॉक करण्याचा विचार करा.
+
+      लक्षात ठेवा वापरकर्ते त्यांच्या कुकीज ब्लॉक करून अप्रमाणित स्थितीमध्ये Google सेवा अ‍ॅक्सेस करू शकतील.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> प्लगइन चालवण्याची परवानगी असलेल्या साइटचा उल्लेख करणार्‍या url पॅटर्नची सूची सेट करण्याची तुम्हाला परवानगी देते.
 
           हे धोरण सेट न करता ठेवल्यास, 'DefaultPluginsSetting' धोरण सेट केले असल्यास त्यातून किंवा वापरकर्त्यांच्या वैयक्तिक काँफिगरेशनमधून सर्व साइटसाठी सर्वंकष डीफॉल्ट मूल्य वापरण्‍यात येईल.</translation>
@@ -2024,6 +2052,7 @@
 <translation id="6786967369487349613">रोमिंग प्रोफाइल निर्देशिका सेट करा</translation>
 <translation id="6810445994095397827">या साइटवरील JavaScript अवरोधित करा  </translation>
 <translation id="681446116407619279">समर्थित प्रमाणीकरण योजना</translation>
+<translation id="6835883744948188639">रीलाँच करण्याची शिफारस केली असल्याचे दाखवणार्‍या वापरकर्त्यास एक आवर्त सूचना दाखवा</translation>
 <translation id="685769593149966548">YouTube साठी काटेकोर प्रतिबंधित मोडची अंमलबजावणी करा</translation>
 <translation id="687046793986382807">हे धोरण <ph name="PRODUCT_NAME" /> आवृत्ती 35 प्रमाणे पुनर्निर्देशित केले गेले आहे.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 9c96e86..450c4070 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -289,11 +289,11 @@
 
           Jika dasar ini dibiarkan tanpa ditetapkan, kesemua empat skim akan digunakan.</translation>
 <translation id="2067011586099792101">Sekat akses ke tapak web di luar pek kandungan</translation>
-<translation id="2070270043919235595">Maklumkan pengguna bahawa <ph name="PRODUCT_NAME" /> mesti dilancarkan semula untuk menggunakan kemas kini yang belum selesai.
+<translation id="2070270043919235595">Maklumi pengguna bahawa <ph name="PRODUCT_NAME" /> mesti dilancarkan semula untuk menggunakan kemas kini yang belum selesai.
 
       Tetapan dasar ini mendayakan pemberitahuan untuk memaklumi pengguna bahawa pelancaran semula penyemak imbas adalah disyorkan atau diperlukan. Jika tidak ditetapkan, <ph name="PRODUCT_NAME" /> menunjukkan kepada pengguna bahawa pelancaran semula diperlukan melalui sedikit perubahan kepada menunya. Jika ditetapkan kepada 'Disyorkan', amaran berulang akan ditunjukkan kepada pengguna bahawa pelancaran semula disyorkan. Pengguna boleh menolak amaran ini untuk menunda pelancaran semula. Jika ditetapkan kepada 'Diperlukan', amaran berulang akan ditunjukkan kepada pengguna yang menunjukkan bahawa pelancaran semula penyemak imbas akan dipaksa selepas tempoh pemberitahuan tamat. Tempoh ini ialah 7 hari secara lalai dan boleh dikonfigurasikan melalui tetapan dasar <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
 
-      The user's session is restored following the relaunch.</translation>
+      Sesi pengguna dipulihkan selepas pelancaran semula.</translation>
 <translation id="2077129598763517140">Gunakan pecutan perkakasan apabila tersedia</translation>
 <translation id="2077273864382355561">Kelewatan pemadaman skrin apabila dijalankan dengan kuasa bateri</translation>
 <translation id="2082205219176343977">Konfigurasikan versi Chrome minimum yang dibenarkan untuk peranti ini.</translation>
@@ -338,9 +338,9 @@
       Jika tetapan ini dikonfigurasikan, pengguna yang menggunakan buka kunci pantas akan diminta memasukkan kata laluan mereka pada kunci skrin bergantung pada tetapan ini.
 
       Jika tetapan ini tidak dikonfigurasikan, pengguna yang menggunakan buka kunci pantas akan diminta memasukkan kata laluan mereka pada kunci skrin setiap hari.</translation>
-<translation id="2188722565665306629">Membolehkan anda menetapkan tempoh masa untuk pemberitahuan pelancaran semula <ph name="PRODUCT_NAME" /> ditunjukkan bagi menggunakan kemas kini yang belum selesai.
+<translation id="2188722565665306629">Membolehkan anda menetapkan jangka masa untuk pemberitahuan pelancaran semula <ph name="PRODUCT_NAME" /> ditunjukkan bagi menggunakan kemas kini yang belum selesai.
 
-      Tetapan dasar ini boleh digunakan untuk mengawal tempoh masa pengguna dimaklumi secara progresif dalam milisaat berkenaan <ph name="PRODUCT_NAME" /> yang perlu dilancarkan semula (atau <ph name="PRODUCT_OS_NAME" /> mesti dimulakan semula) untuk dikemas kini. Dalam tempoh masa ini, pengguna akan dimaklumi berulang kali tentang keperluan kemas kini berdasarkan tetapan dasar <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Jika dasar ini tidak ditetapkan, tempoh lalai ialah 604800000 milisaat (satu minggu) akan digunakan.</translation>
+      Tetapan dasar ini boleh digunakan untuk mengawal jangka masa pengguna dimaklumi secara progresif dalam milisaat berkenaan <ph name="PRODUCT_NAME" /> yang perlu dilancarkan semula (atau <ph name="PRODUCT_OS_NAME" /> mesti dimulakan semula) untuk dikemas kini. Dalam jangka masa ini, pengguna akan dimaklumi berulang kali tentang keperluan kemas kini berdasarkan tetapan dasar <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Jika dasar ini tidak ditetapkan, tempoh lalai ialah 604800000 milisaat (satu minggu) akan digunakan.</translation>
 <translation id="2194470398825717446">Dasar ini ditamatkan dalam M61, sila gunakan EcryptfsMigrationStrategy.
 
       Menentukan gelagat peranti yang dihantar dengan ecryptfs dan memerlukan peralihan kepada penyulitan ext4.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index db5440a..0a6f888 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -206,6 +206,7 @@
       Het beleid moet op een URL worden ingesteld vanaf waar de Servicevoorwaarden door <ph name="PRODUCT_OS_NAME" /> kunnen worden gedownload. De Servicevoorwaarden moeten platte tekst zijn die als tekst met MIME-type/plat wordt weergegeven. Er is geen opmaak toegestaan.</translation>
 <translation id="1750315445671978749">Alle downloads blokkeren</translation>
 <translation id="1781356041596378058">Met dit beleid wordt ook de toegang tot de ontwikkelaarsopties van Android beheerd. Als je dit beleid instelt op True (Waar), hebben gebruikers geen toegang tot ontwikkelaarsopties. Als je dit beleid instelt op False (Onwaar) of niet instelt, hebben gebruikers toegang tot ontwikkelaarsopties door zeven keer op het buildnummer te tikken in de app Instellingen van Android.</translation>
+<translation id="1797233582739332495">Toon de gebruiker een terugkerende prompt om aan te geven dat een herstart is vereist</translation>
 <translation id="1803646570632580723">Lijst met vastgezette apps om weer te geven in het opstartprogramma</translation>
 <translation id="1808715480127969042">Cookies blokkeren op deze sites</translation>
 <translation id="1827523283178827583">Vaste proxyservers gebruiken</translation>
@@ -284,6 +285,11 @@
 
           Als dit beleid niet is ingesteld, worden alle vier de schema's gebruikt.</translation>
 <translation id="2067011586099792101">Toegang blokkeren naar sites die zich niet in inhoudspakketten bevinden</translation>
+<translation id="2070270043919235595">Laat gebruikers weten dat <ph name="PRODUCT_NAME" /> opnieuw moet worden gestart om een update toe te passen.
+
+      Met deze beleidsinstelling worden meldingen ingeschakeld waarmee de gebruiker op de hoogte wordt gebracht dat een herstart van de browser wordt aanbevolen of is vereist. Als dit niet is ingesteld, ziet de gebruiker een melding in <ph name="PRODUCT_NAME" /> dat een herstart is vereist via kleine wijzigingen in het menu. Als dit is ingesteld op Aanbevolen, wordt er een herhaalde waarschuwing weergeven om de gebruiker te laten weten dat een herstart wordt aanbevolen. De gebruiker kan deze waarschuwing negeren om de herstart uit te stellen. Als dit is ingesteld op Vereist, wordt er een herhaalde waarschuwing weergegeven om de gebruiker te laten weten dat een herstart van de browser wordt afgedwongen zodra de meldingsperiode is verstreken. Deze periode is standaard zeven dagen en kan worden ingesteld via de beleidsinstelling voor <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      De sessie van de gebruiker wordt na de herstart hersteld.</translation>
 <translation id="2077129598763517140">Hardwareversnelling gebruiken indien beschikbaar</translation>
 <translation id="2077273864382355561">Vertraging van scherm uitschakelen wanneer op de batterij wordt gewerkt</translation>
 <translation id="2082205219176343977">Configureer de minimaal toegestane Chrome-versie voor het apparaat.</translation>
@@ -330,6 +336,9 @@
           Als deze instelling is ingeschakeld, wordt gebruikers die de functie voor snel ontgrendelen gebruiken, op basis van deze instelling gevraagd hun wachtwoord op te geven voor het vergrendelingsscherm.
 
           Als deze instelling niet is geconfigureerd, wordt gebruikers die de functie voor snel ontgrendelen gebruiken, elke dag gevraagd hun wachtwoord voor het vergrendelingsscherm op te geven.</translation>
+<translation id="2188722565665306629">Hiermee kun je de periode instellen waarin herstartmeldingen voor <ph name="PRODUCT_NAME" /> worden weergegeven om een update toe te passen.
+
+      Met deze beleidsinstellingen kun je de periode tot op de milliseconde nauwkeurig bepalen waarin een gebruiker op progressieve wijze wordt geïnformeerd dat <ph name="PRODUCT_NAME" /> opnieuw moet worden gestart (of dat <ph name="PRODUCT_OS_NAME" /> opnieuw moet worden gestart) om een update toe te passen. De gebruiker wordt gedurende deze periode herhaaldelijk geïnformeerd over de update op basis van de instelling van het <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />-beleid. Als dit niet is ingesteld, wordt de standaardperiode van 604.800.000 milliseconden (één week) gehanteerd.</translation>
 <translation id="2194470398825717446">Dit beleid is beëindigd in M61. Gebruik EcryptfsMigrationStrategy.
 
       Geeft aan hoe een apparaat zich moet gedragen dat is geleverd met eCryptfs en moet worden overgezet naar ext4-versleuteling.
@@ -532,6 +541,13 @@
           Dit beleid wordt alleen gerespecteerd als het beleid 'DefaultSearchProviderEnabled' is ingeschakeld.</translation>
 <translation id="2682225790874070339">Schakelt Drive uit in de app Bestanden van <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">De proxyfunctie voor het comprimeren van gegevens inschakelen</translation>
+<translation id="2726613915126661822">Hiermee kun je aangeven of virtuele machines al dan niet mogen worden uitgevoerd op Chrome OS.
+
+      Als het beleid is ingesteld op True (Waar), mogen virtuele machines worden uitgevoerd op het apparaat.
+      Als het beleid is ingesteld op False (Onwaar), mogen er geen virtuele machines worden uitgevoerd op het apparaat.
+      Als dit beleid wordt gewijzigd naar False (Onwaar), wordt dit toegepast op nieuwe virtuele machines, maar worden reeds uitgevoerde virtuele machines niet uitgeschakeld.
+      Als dit beleid niet is ingesteld op een beheerd apparaat, mogen er geen virtuele machines worden uitgevoerd op het apparaat.
+      Virtuele machines mogen worden uitgevoerd op onbeheerde apparaten.</translation>
 <translation id="2731627323327011390">Gebruik van certificaten van <ph name="PRODUCT_OS_NAME" /> voor ARC-apps uitschakelen</translation>
 <translation id="2742843273354638707">De app en voettekstlink voor de Chrome Web Store verbergen op de pagina 'Nieuw tabblad' en in de App Launcher van <ph name="PRODUCT_OS_NAME" />.
 
@@ -755,6 +771,7 @@
           Dit beleid is optioneel. Als het niet wordt ingesteld, wordt er geen nieuwe tabbladpagina weergegeven.
 
           Dit beleid wordt alleen gerespecteerd als het beleid 'DefaultSearchProviderEnabled' is ingeschakeld.</translation>
+<translation id="3465852069254497664">Laat een gebruiker weten dat een herstart van de browser wordt aanbevolen of is vereist</translation>
 <translation id="346731943813722404">Hiermee wordt aangegeven of vertragingen in energiebeheer en de limiet voor sessielengte pas moeten worden gestart nadat de eerste gebruikersactiviteit in een sessie is gedetecteerd.
 
           Als dit beleid is ingesteld op 'True', worden vertragingen in energiebeheer en de limiet voor sessielengte pas gestart nadat de eerste gebruikersactiviteit in een sessie is gedetecteerd.
@@ -788,6 +805,7 @@
 <translation id="3711895659073496551">Onderbreken</translation>
 <translation id="3736879847913515635">'Persoon toevoegen' inschakelen in gebruikersbeheer</translation>
 <translation id="3737544779868348650">Hostnaam van apparaat in netwerk</translation>
+<translation id="3740754010292550733">Stel de periode in voor meldingen over een herstart na updates</translation>
 <translation id="3750220015372671395">Het genereren van sleutels op deze sites blokkeren</translation>
 <translation id="3756011779061588474">Ontwikkelaarsmodus blokkeren</translation>
 <translation id="3758089716224084329">Hiermee kun je de proxyserver specificeren die door <ph name="PRODUCT_NAME" /> wordt gebruikt en wordt voorkomen dat gebruikers proxyinstellingen kunnen aanpassen.
@@ -1374,7 +1392,7 @@
 
       Houd er rekening mee dat als het platform beleidsmeldingen ondersteunt, de vernieuwingsvertraging wordt ingesteld op 24 uur (hierbij worden alle standaardinstellingen en de waarde van dit beleid genegeerd) omdat beleidsmeldingen naar verwachting automatisch een vernieuwing afdwingen wanneer het beleid wordt gewijzigd, waardoor frequentere vernieuwingen overbodig zijn.</translation>
 <translation id="5530347722229944744">Potentieel gevaarlijke downloads blokkeren</translation>
-<translation id="5530586312297447592">Accountmarkering wegens wachtwoordbeveiligingsrisico wordt geactiveerd bij hergebruik van een wachtwoord op een phishing-pagina</translation>
+<translation id="5530586312297447592">Accountmarkering wegens wachtwoordbeveiligingsrisico wordt geactiveerd bij hergebruik van een wachtwoord op een phishingpagina</translation>
 <translation id="5535973522252703021">Witte lijst voor Kerberos-delegatieserver</translation>
 <translation id="555077880566103058">Alle sites toestaan om de <ph name="FLASH_PLUGIN_NAME" />-plug-in automatisch uit te voeren</translation>
 <translation id="5559079916187891399">Dit beleid is niet van invloed op Android-apps.</translation>
@@ -1501,6 +1519,7 @@
           Als je dit beleid instelt, kunnen gebruikers dit tijdelijk negeren door de grote muisaanwijzer in of uit te schakelen. De keuze van de gebruiker is echter niet permanent en de standaardinstelling wordt hersteld wanneer het inlogscherm opnieuw wordt weergegeven of als de gebruiker gedurende een minuut niet actief is op het inlogscherm.
 
           Als dit beleid niet is ingesteld, wordt de grote muisaanwijzer uitgeschakeld wanneer het inlogscherm voor de eerste keer wordt weergegeven. Gebruikers kunnen de grote muisaanwijzer op elk moment in- of uitschakelen en de status op het inlogscherm is van toepassing op alle gebruikers.</translation>
+<translation id="5929855945144989709">Sta apparaten toe virtuele machines uit te voeren op Chrome OS</translation>
 <translation id="5932767795525445337">Dit beleid kan ook worden gebruikt om Android-apps vast te zetten.</translation>
 <translation id="5936622343001856595">Hiermee wordt afgedwongen dat zoekopdrachten in Google Zoeken worden uitgevoerd met SafeSearch ingesteld op 'actief' en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen.
 
@@ -1756,6 +1775,15 @@
 
       Met het beleid <ph name="SYNC_DISABLED_POLICY_NAME" /> wordt alle gegevenssynchronisatie uitgeschakeld (RoamingProfileSupportEnabled wordt overschreven).</translation>
 <translation id="6735701345096330595">Inschakelen van spellingcontrole voor talen afdwingen</translation>
+<translation id="673699536430961464">Deze instelling biedt gebruikers de mogelijkheid om in het contentgedeelte van hun browservenster tussen Google-accounts te schakelen nadat ze zijn ingelogd op hun <ph name="PRODUCT_OS_NAME" />-apparaat.
+
+      Als dit beleid is ingesteld op False (Onwaar), is het niet mogelijk om vanuit het contentgedeelte van een niet-incognito browservenster in te loggen op een ander account.
+
+      Als dit beleid niet is ingesteld of is ingesteld op True (Waar), wordt het standaardgedrag gebruikt. Het is dan wel toegestaan om vanuit het contentgedeelte van de browser in te loggen op een ander account, met uitzondering van onderliggende accounts. Hiervoor geldt dat er niet vanuit het contentgedeelte van een niet-incognito browservenster kan worden ingelogd op een ander account.
+
+      Als je niet wilt dat er in de incognitomodus kan worden ingelogd op een ander account, kun je deze modus eventueel blokkeren met het beleid IncognitoModeAvailability.
+
+      Gebruikers met een niet-bevoegde status kunnen toegang krijgen tot Google-services door cookies te blokkeren.</translation>
 <translation id="6757438632136860443">Hiermee kun je een lijst met URL-patronen opgeven voor sites die de <ph name="FLASH_PLUGIN_NAME" />-plug-in mogen uitvoeren.
 
           Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Je vindt deze in het beleid 'DefaultPluginsSetting' (als dit is ingesteld), of in de persoonlijke configuratie van de gebruiker.</translation>
@@ -1765,6 +1793,7 @@
 <translation id="6786967369487349613">De map voor roaming-profielen instellen</translation>
 <translation id="6810445994095397827">JavaScript blokkeren op deze sites</translation>
 <translation id="681446116407619279">Ondersteunde authenticatieschema's</translation>
+<translation id="6835883744948188639">Toon de gebruiker een terugkerende prompt om aan te geven dat een herstart wordt aanbevolen</translation>
 <translation id="685769593149966548">Strenge 'Beperkte modus' voor YouTube afdwingen</translation>
 <translation id="687046793986382807">Dit beleid wordt niet meer gebruikt sinds <ph name="PRODUCT_NAME" /> versie 35.
 
@@ -2372,7 +2401,7 @@
       Als het beleid niet is ingesteld of is ingesteld op 'False', wordt de locatie niet gerapporteerd.</translation>
 <translation id="8818768076343557335">Netwerkacties voorspellen op elk netwerk dat niet mobiel is.
           (Beëindigd in 50, verwijderd in 52. Als na 52 waarde 1 is ingesteld, wordt deze waarde verwerkt als 0 - netwerkacties voorspellen voor elke netwerkverbinding.)</translation>
-<translation id="8825782996899863372">Waarschuwing voor wachtwoordbeveiliging wordt geactiveerd bij hergebruik van een wachtwoord op een phishing-pagina</translation>
+<translation id="8825782996899863372">Waarschuwing voor wachtwoordbeveiliging wordt geactiveerd bij hergebruik van een wachtwoord op een phishingpagina</translation>
 <translation id="8828766846428537606">Hiermee wordt de standaard homepage in <ph name="PRODUCT_NAME" /> geconfigureerd en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen.
 
       De instellingen voor de homepage worden alleen volledig voor de gebruiker vergrendeld als je de pagina 'Nieuw tabblad' als de homepage selecteert of als je zelf een URL voor de homepage specificeert. Als je geen URL voor de homepage opgeeft, kan de gebruiker nog steeds de pagina 'Nieuw tabblad' als homepage instellen door 'chrome://newtab' op te geven.</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 1a3f68f..846ef8a 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -210,6 +210,7 @@
       Denne innnstillingen må konfigureres med en nettadresse der <ph name="PRODUCT_OS_NAME" /> kan laste ned vilkårene. Vilkårene må være i ren tekst, levert som MIME-typen tekst/ren. Det er ikke tillatt med koding.</translation>
 <translation id="1750315445671978749">Blokkér alle nedlastinger</translation>
 <translation id="1781356041596378058">Denne regelen kontrollerer også tilgangen til utvikleralternativene for Android. Hvis du angir denne regelen som «true» (sann), fjerner du brukernes tilgang til utvikleralternativene. Hvis du angir denne regelen som «false» (usann) eller ikke angir den, kan brukere få tilgang til utvikleralternativene ved å trykke sju ganger på delversjonsnummeret i appen for Android-innstillinger.</translation>
+<translation id="1797233582739332495">Vis brukeren en gjentakende melding om at omstart kreves</translation>
 <translation id="1803646570632580723">Liste over programmer som er festet i programlisten</translation>
 <translation id="1808715480127969042">Blokkér informasjonskapsler på disse nettstedene</translation>
 <translation id="1827523283178827583">Bruk faste proxytjenere</translation>
@@ -286,6 +287,11 @@
 
           Hvis denne regelen ikke angis, brukes alle de fire skjemaene.</translation>
 <translation id="2067011586099792101">Blokkér tilgang til nettsteder som ikke inngår i innholdspakker</translation>
+<translation id="2070270043919235595">Varsle brukere om at <ph name="PRODUCT_NAME" /> må startes på nytt på grunn av en oppdatering som ikke er installert ennå.
+
+      Denne regelen aktiverer varsler for å informere brukeren om at nettleseren må eller bør startes på nytt. Hvis regelen ikke er angitt, varsler <ph name="PRODUCT_NAME" /> brukeren om at det er nødvendig med en omstart ved hjelp av diskrete endringer i menyen. Hvis regelen er angitt som «Recommended» (anbefalt), ser brukeren en gjentakende advarsel om at en omstart er anbefalt. Brukeren kan avvise advarselen for å utsette omstarten. Hvis regelen er angitt som «Required» (obligatorisk), ser brukeren en gjentakende advarsel om at en tvungen omstart utføres når varselperioden er utløpt. Denne perioden er som standard 7 dager og kan konfigureres via regelen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Brukerens økt gjenopprettes etter omstarten.</translation>
 <translation id="2077129598763517140">Bruk maskinvareakselerasjon når det er tilgjengelig</translation>
 <translation id="2077273864382355561">Forsinkelse for avslått skjerm når enheten kjører på batteristrøm</translation>
 <translation id="2082205219176343977">Konfigurer minimum tillatt Chrome-versjon for enheten.</translation>
@@ -330,6 +336,9 @@
       Hvis denne innstillingen er konfigurert, kan brukere som bruker hurtigopplåsing, bli bedt om å skrive inn passordet sitt på låseskjermen. Dette avhenger imidlertid av hvilken innstilling som er valgt.
 
       Hvis denne innstillingen ikke konfigureres, blir brukere som bruker hurtigopplåsing, bedt om å skrive inn passordet sitt på låseskjermen hver dag.</translation>
+<translation id="2188722565665306629">Lar deg angi tidsperioden varslene om omstart av <ph name="PRODUCT_NAME" /> skal vises i når det finnes en oppdatering som ikke er installert ennå.
+
+      Denne regelen kan brukes til å styre tidsperioden (i millisekunder) brukeren skal informeres om at <ph name="PRODUCT_NAME" /> (eller <ph name="PRODUCT_OS_NAME" />) må startes på nytt på grunn av en oppdatering. I denne tidsperioden blir brukeren gjentatte ganger informert om at oppdateringen må installeres. Dette er basert på innstillingen i regelen <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Hvis denne regelen ikke er angitt, brukes standardperioden på 604 800 000 millisekunder (én uke).</translation>
 <translation id="2194470398825717446">Denne regelen er avviklet i M61. Bruk EcryptfsMigrationStrategy i stedet.
 
       Spesifiserer hvordan enheter som har blitt levert med eCryptfs, og som må gå over til ext4-kryptering, bør oppføre seg.
@@ -393,7 +402,7 @@
       Innstillingen må angis i millisekunder.</translation>
 <translation id="237494535617297575">Gjør at du kan angi en liste over nettadressemønstre som spesifiserer hvilke nettsteder som får vise varsler. Hvis denne retningslinjen ikke angis, brukes den globale verdien for alle nettsteder, enten fra retningslinjen DefaultNotificationsSetting hvis den er angitt, eller av brukerens egen konfigurasjon hvis den nevnte retningslinjen ikke er angitt.</translation>
 <translation id="2386362615870139244">Tillat låser for skjermaktivering</translation>
-<translation id="2411817661175306360">Advarsel om passordbeskyttelse er slått av</translation>
+<translation id="2411817661175306360">Advarselen om passordbeskyttelse er slått av</translation>
 <translation id="2411919772666155530">Blokkér varsler på disse nettstedene</translation>
 <translation id="2418507228189425036">Slår av lagringen av nettleserloggen i <ph name="PRODUCT_NAME" /> og hindrer brukerne i å endre denne innstillingen.
 
@@ -524,6 +533,13 @@
           Denne retningslinjen tas til etterretning bare hvis retningslinjen DefaultSearchProviderEnabled er aktivert.</translation>
 <translation id="2682225790874070339">Deaktiverer Google Disk i Filer-appen for <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Aktiver proxy-tjenerfunksjonen for datakomprimering</translation>
+<translation id="2726613915126661822">Lar deg styre om virtuelle maskiner kan kjøre i Chrome OS.
+
+      Hvis regelen er angitt som True (sann), kan enheten kjøre virtuelle maskiner.
+      Hvis regelen er angitt som False (usann), kan ikke enheten kjøre virtuelle maskiner.
+      Når denne regelen endres til False (usann), gjelder det for nye virtuelle maskiner. Virtuelle maskiner som allerede kjører, blir imidlertid ikke slått av.
+      Når denne regelen ikke er angitt på en administrert enhet, kan ikke enheten kjøre virtuelle maskiner.
+      Ikke-administrerte enheter kan ikke kjøre virtuelle maskiner.</translation>
 <translation id="2731627323327011390">Slå av bruken av <ph name="PRODUCT_OS_NAME" />-sertifikater for ARC-apper</translation>
 <translation id="2742843273354638707">Skjul Chrome Nettmarked-appen og linken fra ny fane-siden og <ph name="PRODUCT_OS_NAME" /> OS-appvelgeren.
 
@@ -738,6 +754,7 @@
           Denne innstillingen er valgfri. Hvis den ikke angis, leveres ingen nye fane-side.
 
           Denne innstillingen etterfølges bare dersom «DefaultSearchProviderEnabled» er aktivert.</translation>
+<translation id="3465852069254497664">Varsle en bruker om at nettleseren bør eller må startes på nytt</translation>
 <translation id="346731943813722404">Angi hvorvidt tidtaking av strømstyringsforsinkelser og grense for øktens varighet bare skal begynne å løpe etter brukerens første aktivitet i en økt.
 
           Hvis innstillingen er satt til True, begynner ikke tidtakingen av strømstyringsforsinkelser og øktens varighet å løpe før etter at brukerens første aktivitet i en økt er registrert.
@@ -771,6 +788,7 @@
 <translation id="3711895659073496551">Suspender</translation>
 <translation id="3736879847913515635">Slå på «Legg til person» i brukeradministreringen</translation>
 <translation id="3737544779868348650">Vertsnavn for enheten på nettverket</translation>
+<translation id="3740754010292550733">Angi perioden for varsler for omstart på grunn av en oppdatering</translation>
 <translation id="3750220015372671395">Blokkér nøkkelgenerering på disse nettstedene</translation>
 <translation id="3756011779061588474">Blokkering av utviklermodus</translation>
 <translation id="3758089716224084329">Lar deg spesifisere hvilken proxy-tjener som brukes av <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre proxy-innstillingene.
@@ -997,7 +1015,7 @@
 
       Alle Google-kontoer på enheten sammenlignes med mønstrene som er lagret i denne regelen, for å avgjøre synligheten for kontoene i <ph name="PRODUCT_NAME" />. En konto er synlig hvis kontonavnet stemmer overens med et av mønstrene på listen. Ellers er den skjult.
 
-      Bruk jokertegnet «*» for å få treff på ingen eller flere vilkårlige tegn. Escape-tegnet er «\», så for å få treff på «*» eller «\» som faktiske tegn, må du sette en «\» foran dem.
+      Bruk jokertegnet «*» for å få treff på null eller flere vilkårlige tegn. Escape-tegnet er «\», så for å få treff på «*» eller «\» som faktiske tegn, må du sette en «\» foran dem.
 
       Hvis denne regelen ikke er angitt, er alle Google-kontoer synlige i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="436581050240847513">Rapportér nettverksgrensesnitt for enheten</translation>
@@ -1070,7 +1088,7 @@
 
           For å få en fullstendig beskrivelse over mulige innstilinger samt strukturen i denne regelen, gå til https://www.chromium.org/administrators/policy-list-3/extension-settings-full
           </translation>
-<translation id="4554651132977135445">Behandlingsmodus med tilbakekobling for brukerretningslinjer</translation>
+<translation id="4554651132977135445">Behandlingsmodus med tilbakekobling for brukerinnstillinger</translation>
 <translation id="4555850956567117258">Slå på ekstern attestasjon for brukeren</translation>
 <translation id="4557134566541205630">Nettadresse for ny fane for standard søkeleverandør</translation>
 <translation id="4600786265870346112">Aktiver stor markør</translation>
@@ -1472,6 +1490,7 @@
           Hvis du angir denne innstillingen, kan brukere midlertidig overstyre den ved å aktivere eller deaktivere den store musepekeren. Brukerens valg er imidlertid ikke permanent, og standardinnstillingen gjenopprettes når påloggingssiden vises på nytt eller brukeren har vært inaktiv på påloggingssiden i ett minutt.
 
           Hvis denne innstillingen ikke angis, deaktiveres den store musepekeren når påloggingsskjermen vises for første gang. Brukere kan aktivere eller deaktivere den store musepekeren når som helst, og dens status på påloggingssiden forblir den samme mellom brukere.</translation>
+<translation id="5929855945144989709">Tillat enheter å kjøre virtuelle maskiner i Chrome OS</translation>
 <translation id="5932767795525445337">Disse reglene kan også brukes til å feste Android-apper.</translation>
 <translation id="5936622343001856595">Tvinger søkene i Google Nettsøk til å gjennomføres med Sikkert Søk aktivert, og hindrer brukere fra å endre denne innstillingen.
 
@@ -1542,7 +1561,7 @@
 <translation id="602728333950205286">Umiddelbar nettadresse for standard søkeleverandør</translation>
 <translation id="6029950823657977211">
       MERK: Dette er en eksperimentell regel som kan føre til at funksjonaliteten ikke fungerer som den skal!
-      Denne regelen gjelder for påloggingsskjermen. Se også «IsolateOrigins»-regelen, som gjelder for brukerøkten. Vi anbefaler å bruke samme verdi for begge reglene..
+      Denne regelen gjelder for påloggingsskjermen. Se også «IsolateOrigins»-regelen, som gjelder for brukerøkten. Vi anbefaler å bruke samme verdi for begge reglene.
       Hvis regelen er aktivert, kjøres hver av de navngitte opprinnelsene
       i en kommadelt liste i sin egen prosess. Da isoleres også
       opprinnelser som har navn basert på underdomener. Hvis for eksempel
@@ -1728,6 +1747,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" />-regelen deaktiverer all datasynkronisering og overstyrer RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Tving aktivering av språk med stavekontroll</translation>
+<translation id="673699536430961464">Denne innstillingen lar brukere bytte mellom Google-kontoer i innholdsområdet i nettleservinduet når de har logget på <ph name="PRODUCT_OS_NAME" />-enhetene sine.
+
+      Hvis regelen er angitt som False (usann), kan ikke brukerne logge på andre kontoer i innholdsområdet hvis nettleseren ikke er i inkognitomodus.
+
+      Hvis regelen ikke er angitt eller er angitt som True (sann), brukes standardinnstillingen, det vil si at det er tillatt å logge på andre kontoer i innholdsområdet i nettleseren. Dette gjelder imidlertid ikke for underkontoer, der det blokkeres for innholdsområder som ikke er i inkognitomodus.
+
+      Hvis det ikke skal være lov å logge på andre kontoer i inkognitomodus, kan du blokkere denne modusen i IncognitoModeAvailability-regelen.
+
+      Vær oppmerksom på at brukerne kan få tilgang til Google-tjenester uten autentisering ved å blokkere informasjonskapsler.</translation>
 <translation id="6757438632136860443">Lar deg angi en liste med nettadressemønstre for å spesifisere nettsteder hvor <ph name="FLASH_PLUGIN_NAME" />-programtillegget skal kunne kjøres automatisk.
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettsteder. Denne verdien hentes fra «DefaultPluginsSetting»-regelen hvis den er angitt, eller fra brukerens personlige konfigurasjon hvis den ikke er angitt.</translation>
@@ -1737,6 +1765,7 @@
 <translation id="6786967369487349613">Angir katalogen for roamingprofiler</translation>
 <translation id="6810445994095397827">Blokkér JavaScript på disse nettstedene</translation>
 <translation id="681446116407619279">Støttede autentiseringssystemer</translation>
+<translation id="6835883744948188639">Vis brukeren en gjentakende melding om at omstart anbefales</translation>
 <translation id="685769593149966548">Fremtvinger bruk av strengt nivå for Begrenset innhold-modus på YouTube</translation>
 <translation id="687046793986382807">Disse retningslinjene ble avviklet fra og med versjon 35 av <ph name="PRODUCT_NAME" />.
 
@@ -2485,11 +2514,11 @@
 <translation id="930930237275114205">Angi <ph name="PRODUCT_FRAME_NAME" />-katalog for brukerdata</translation>
 <translation id="934390688529359269">Slår på tvunget pålogging for <ph name="PRODUCT_NAME" /></translation>
 <translation id="944817693306670849">Angi størrelse på diskbuffer</translation>
-<translation id="9775893229076211">Lar deg styre hva som utløser kontorapportering om passordbeskyttelse i fare. Merking om kontoer der passordbeskyttelse er i fare, betyr at Google informeres om at denne kontoen står i fare for å bli kapret.
+<translation id="9775893229076211">Lar deg styre hva som utløser kontovarsling om passordbeskyttelse i fare. Kontovarsling om passordbeskyttelse i fare, betyr at Google informeres om at denne kontoen står i fare for å bli kapret.
 
-      Hvis denne regelen er angitt som «PasswordProtectionRiskOff», blir det ikke utløst noen merking av kontoer der passordbeskyttelsen er i fare.
-      Hvis denne regelen er angitt som «PasswordProtectionRiskOnPasswordReuse», blir det utløst merking av kontoer der passordbeskyttelsen er i fare, når brukerne bruker Google-passord om igjen på nettsteder som ikke er på godkjenningslisten.
-      Hvis denne regelen er angitt som «PasswordProtectionRiskOnPhishingReuse», blir det utløst merking av kontoer der passordbeskyttelsen er i fare, når brukerne bruker Google-passord om igjen på nettsteder som driver med nettfisking.
-      Hvis denne regelen ikke er angitt, blir det utløst merking av kontoer der passordbeskyttelsen er i fare, når brukerne bruker Google-passord om igjen på nettsteder som driver med nettfisking. Men brukerne kan endre dette.</translation>
+      Hvis denne regelen er angitt som «PasswordProtectionRiskOff», blir det ikke utløst noen kontovarsling om passordbeskyttelse i fare.
+      Hvis denne regelen er angitt som «PasswordProtectionRiskOnPasswordReuse», blir det utløst kontovarsling om passordbeskyttelse i fare når brukerne bruker Google-passord om igjen på nettsteder som ikke er på godkjenningslisten.
+      Hvis denne regelen er angitt som «PasswordProtectionRiskOnPhishingReuse», blir det utløst kontovarsling om passordbeskyttelse i fare når brukerne bruker Google-passord om igjen på nettsteder som driver med nettfisking.
+      Hvis denne regelen ikke er angitt, blir det utløst kontovarsling om passordbeskyttelse i fare når brukerne bruker Google-passord om igjen på nettsteder som driver med nettfisking. Men brukerne kan endre dette.</translation>
 <translation id="982497069985795632">Aktiver stavekontrollen</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index e3a90aa4..3bdd688 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -209,6 +209,7 @@
       Politica trebuie setată la o adresă URL de la care <ph name="PRODUCT_OS_NAME" /> poate descărca Termenii și condițiile. Termenii și condițiile trebuie să fie în format de text simplu, de tip MIME text/plain. Nu se permite limbajul de markup.</translation>
 <translation id="1750315445671978749">Blochează toate descărcările</translation>
 <translation id="1781356041596378058">Această politică controlează și accesul la Opțiunile pentru dezvoltatori Android. Dacă această politică este activată, utilizatorii nu pot accesa Opțiunile pentru dezvoltatori. Dacă această politică este dezactivată sau nu este configurată, utilizatorii pot accesa Opțiunile pentru dezvoltatori atingând de șapte ori numărul versiunii din aplicația Setări Android.</translation>
+<translation id="1797233582739332495">Afișează utilizatorului o solicitare recurentă prin care se indică faptul că relansarea este obligatorie</translation>
 <translation id="1803646570632580723">Listare aplicații fixate de afișat în lansator</translation>
 <translation id="1808715480127969042">Blochează cookie-urile de pe aceste site-uri</translation>
 <translation id="1827523283178827583">Utilizează servere proxy fixe</translation>
@@ -281,6 +282,11 @@
 
           Dacă politica nu este configurată, vor fi utilizate toate cele patru scheme.</translation>
 <translation id="2067011586099792101">Se blochează accesul la site-urile din afara pachetelor de conținut</translation>
+<translation id="2070270043919235595">Notifică utilizatorul că produsul <ph name="PRODUCT_NAME" /> trebuie relansat pentru aplicarea unei actualizări în așteptare.
+
+      Setarea acestei politici activează notificările care informează utilizatorul că este recomandată sau necesară relansarea browserului. Dacă politica nu este setată, produsul <ph name="PRODUCT_NAME" /> îi arată utilizatorului că este necesară o relansare prin schimbări subtile aduse meniului. Dacă politica este setată la „Recomandat”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea este recomandată. Utilizatorul poate să respingă avertizarea pentru a amâna relansarea. Dacă politica este setată la „Obligatoriu”, utilizatorului i se va afișa o avertizare recurentă prin care se indică faptul că relansarea browserului va fi obligatorie după încheierea perioadei de notificare. În mod prestabilit, această perioadă este de șapte zile și poate fi configurată prin setarea politicii pentru <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Sesiunea utilizatorului este restabilită după relansare.</translation>
 <translation id="2077129598763517140">Utilizează accelerarea hardware când este disponibilă</translation>
 <translation id="2077273864382355561">Interval până la oprirea ecranului la funcționarea pe baterie</translation>
 <translation id="2082205219176343977">Configurează versiunea Chrome minimă acceptată pentru dispozitiv.</translation>
@@ -325,6 +331,9 @@
           Dacă setarea este configurată, utilizatorilor care folosesc deblocarea rapidă li se va solicita să își introducă parola pe ecranul de blocare, în funcție de această setare.
 
           Dacă setarea nu este configurată, utilizatorilor care folosesc deblocarea rapidă li se va solicita să își introducă parola pe ecranul de blocare în fiecare zi.</translation>
+<translation id="2188722565665306629">Îți permite să setezi perioada în care se afișează notificările de relansare pentru <ph name="PRODUCT_NAME" /> pentru a aplica o actualizare în așteptare.
+
+      Setarea acestei politici poate fi folosită pentru a controla perioada, în milisecunde, în care utilizatorul este informat treptat că produsul <ph name="PRODUCT_NAME" /> trebuie relansat (sau produsul <ph name="PRODUCT_OS_NAME" /> trebuie repornit) pentru o actualizare. În această perioadă, utilizatorul va fi informat în mod repetat despre necesitatea unei actualizări pe baza setării politicii produsului <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Dacă aceasta nu este setată, se folosește perioada prestabilită de 604800000 milisecunde (o săptămână).</translation>
 <translation id="2194470398825717446">Politica nu mai este dezvoltată în M61, folosește EcryptfsMigrationStrategy.
 
       Specifică modul în care trebuie să se comporte un dispozitiv care a fost livrat cu ecryptfs și necesită trecerea la criptarea ext4.
@@ -513,6 +522,13 @@
 <translation id="267596348720209223">Specifică codificările de caractere acceptate de furnizorul de căutare. Codificările reprezintă nume ale paginilor cu coduri cum ar fi UTF-8, GB2312 și ISO-8859-1. Acestea sunt încercate în ordinea furnizată. Politica este opțională. Dacă nu este setată, va fi utilizată codificarea standard, care este UTF-8. Această politică este urmată numai în cazul în care este activată politica „DefaultSearchProviderEnabled”.</translation>
 <translation id="2682225790874070339">Dezactivează Drive în aplicația Fișiere din <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Activează funcția proxy de comprimare a datelor</translation>
+<translation id="2726613915126661822">Îți permite să controlezi dacă mașinile virtuale au permisiunea de a rula în sistemul de operare Chrome.
+
+      Dacă politica este setată la True, dispozitivul are permisiunea de a rula mașini virtuale.
+      Dacă politica este setată la False, dispozitivul nu are permisiunea de a rula mașini virtuale.
+      Când este schimbată la False, politica se aplică pentru noile mașini virtuale, dar nu închide mașinile virtuale care rulează deja.
+      Când această politică nu este setată pe un dispozitiv gestionat, dispozitivul nu avea permisiunea să ruleze mașini virtuale.
+      Dispozitivele care nu sunt gestionate au permisiunea de a rula mașini virtuale.</translation>
 <translation id="2731627323327011390">Dezactivează folosirea certificatelor <ph name="PRODUCT_OS_NAME" /> pentru aplicațiile ARC</translation>
 <translation id="2742843273354638707">Ascunde aplicația Magazin web Chrome și linkul notei de subsol din pagina Filă nouă și din lansatorul de aplicații pentru <ph name="PRODUCT_OS_NAME" />.
 
@@ -730,6 +746,7 @@
           Politica este opțională. Dacă nu este configurată, nu va fi furnizată o pagină Filă nouă.
 
           Politica este urmată numai dacă este activată politica „DefaultSearchProviderEnabled”.</translation>
+<translation id="3465852069254497664">Notifică utilizatorul că relansarea browserului este recomandată sau necesară</translation>
 <translation id="346731943813722404">Indică dacă întârzierile din managementul alimentării cu energie și limita de durată a sesiunii trebuie să înceapă să ruleze numai după ce a fost detectată prima activitate a utilizatorului într-o sesiune.
 
           Dacă politica este activată, întârzierile din managementul alimentării cu energie și limita de durată a sesiunii nu încep să ruleze decât după ce a fost detectată prima activitate a utilizatorului într-o sesiune.
@@ -763,6 +780,7 @@
 <translation id="3711895659073496551">Suspendați</translation>
 <translation id="3736879847913515635">Activează adăugarea de persoane în managerul de utilizatori</translation>
 <translation id="3737544779868348650">Numele de gazdă al rețelei dispozitivului</translation>
+<translation id="3740754010292550733">Setează perioada pentru notificările privind actualizarea relansărilor</translation>
 <translation id="3750220015372671395">Blochează generarea cheilor pe aceste site-uri</translation>
 <translation id="3756011779061588474">Blocați modul pentru dezvoltatori</translation>
 <translation id="3758089716224084329">Îți permite să specifici serverul proxy folosit de <ph name="PRODUCT_NAME" /> și împiedică utilizatorii să modifice setările de proxy.
@@ -1447,6 +1465,7 @@
           Dacă această politică este configurată, utilizatorii o pot ignora temporar, activând sau dezactivând cursorul mare. Totuși, alegerea utilizatorului nu este definitivă și se revine la setările prestabilite de fiecare dată când este afișat din nou ecranul de conectare sau când utilizatorul este inactiv pe ecranul de conectare timp de un minut.
 
           Dacă această politică nu este configurată, cursorul mare este dezactivat la afișarea inițială a ecranului de conectare. Utilizatorii pot oricând să activeze sau să dezactiveze cursorul mare, iar starea sa pe ecranul de conectare persistă de la un utilizator la altul.</translation>
+<translation id="5929855945144989709">Permite dispozitivelor să ruleze mașini virtuale în sistemul de operare Chrome</translation>
 <translation id="5932767795525445337">Această politică poate fi folosită și pentru a fixa aplicațiile Android.</translation>
 <translation id="5936622343001856595">Forțează activarea Căutării sigure pentru interogările de pe Căutarea Google pe web și nu permite utilizatorilor să modifice această setare.
 
@@ -1690,6 +1709,15 @@
 
       Politica <ph name="SYNC_DISABLED_POLICY_NAME" /> dezactivează integral sincronizarea datelor, ignorând RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Forțează activarea verificării ortografice pentru limbi</translation>
+<translation id="673699536430961464">Această setare le permite utilizatorilor să comute între conturile Google, în zona de conținut a ferestrei de browser, după ce se conectează la dispozitivul <ph name="PRODUCT_OS_NAME" />.
+
+      Dacă politica este setată la false, nu va fi permisă conectarea la alt cont din zona de conținut a unui browser non-incognito.
+
+      Dacă politica nu este configurată sau este setată la true, se va folosi comportamentul prestabilit: va fi permisă conectarea la alt cont din zona de conținut a browser-ului, cu excepția conturilor copiilor, unde zona de conținut non-incognito va fi blocată.
+
+      În cazul în care conectarea la alt cont nu este permisă în modul incognito, îți recomandăm să blochezi acest mod prin folosirea politicii IncognitoModeAvailability.
+
+      Reține că utilizatorii vor putea să acceseze serviciile Google într-o stare neautentificată prin blocarea cookie-urilor.</translation>
 <translation id="6757438632136860443">Îți permite să setezi o listă de șabloane de adrese URL care specifică site-urile care au permisiunea să ruleze pluginul <ph name="FLASH_PLUGIN_NAME" />.
 
           Dacă această politică nu este configurată, va fi folosită valoarea prestabilită la nivel global pentru toate site-urile, fie din politica „DefaultCookiesSetting”, în cazul în care aceasta este configurată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
@@ -1699,6 +1727,7 @@
 <translation id="6786967369487349613">Setează locația profilului de roaming</translation>
 <translation id="6810445994095397827">Blochează JavaScript de pe aceste site-uri</translation>
 <translation id="681446116407619279">Scheme de autentificare acceptate</translation>
+<translation id="6835883744948188639">Afișează utilizatorului o solicitare recurentă prin care se indică faptul că relansarea este recomandată</translation>
 <translation id="685769593149966548">Impune Modul restricționat strict pentru YouTube</translation>
 <translation id="687046793986382807">Această politică a fost retrasă începând cu <ph name="PRODUCT_NAME" /> versiunea 35.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 92b0622..e64a898 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -87,7 +87,7 @@
 
       Если правило отключено (значение False), <ph name="PRODUCT_NAME" /> не поддерживает вход через гостевой профиль.</translation>
 <translation id="1363275621236827384">Разрешить аппаратным профилям отправлять запросы на сервер Quirks</translation>
-<translation id="1387596372902085462">Считать устаревшую инфраструктуру открытых ключей Symantec Corporation надежной</translation>
+<translation id="1387596372902085462">Считать ли устаревшую инфраструктуру открытых ключей Symantec Corporation надежной</translation>
 <translation id="1393485621820363363">Принтеры, доступные на устройствах компании</translation>
 <translation id="1397855852561539316">URL используемой по умолчанию поисковой системы для запроса подсказок</translation>
 <translation id="1426410128494586442">Да</translation>
@@ -198,6 +198,7 @@
 Правило должно быть задано в виде URL, с которого <ph name="PRODUCT_OS_NAME" /> будет скачивать Условия использования. Файл с Условиями использования должен быть текстовым, с типом MIME "text/plain" и без какой-либо разметки.</translation>
 <translation id="1750315445671978749">Блокировать все скачивания</translation>
 <translation id="1781356041596378058">Это правило также контролирует доступ к режиму разработчика Android. Если установить для правила значение True, пользователи потеряют доступ к режиму разработчика. Если установить для правила значение False или не задать значение, пользователи смогут получить доступ к режиму разработчика, нажав на номер сборки в настройках Android семь раз.</translation>
+<translation id="1797233582739332495">Уведомлять пользователя о необходимости перезапустить браузер</translation>
 <translation id="1803646570632580723">Список прикрепленных приложений в панели запуска</translation>
 <translation id="1808715480127969042">Блокировать файлы cookie на этих сайтах</translation>
 <translation id="1827523283178827583">Использовать фиксированные прокси-серверы</translation>
@@ -270,6 +271,11 @@
 
           Если правило не настроено, используются все четыре схемы.</translation>
 <translation id="2067011586099792101">Блокировать доступ для сайтов, не включенных в пакеты контента</translation>
+<translation id="2070270043919235595">Уведомлять пользователя о том, что для установки обновления необходимо перезапустить <ph name="PRODUCT_NAME" />.
+
+      Это правило разрешает уведомлять пользователя о том, что перезапуск браузера рекомендован или необходим. Если значение не задано, пользователь сможет узнать о необходимости перезапуска по небольшим изменениям в меню <ph name="PRODUCT_NAME" />. Если установить, что перезапуск рекомендуется, пользователь будет получать уведомление, но действие можно будет откладывать. Если установить, что перезапуск необходим, пользователь будет получать предупреждение о том, что браузер перезапустится автоматически, когда истечет срок показа уведомлений. По умолчанию он равен семи дням и может быть изменен через настройки правила <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      После перезапуска сеанс пользователя восстанавливается.</translation>
 <translation id="2077129598763517140">Использовать аппаратное ускорение (при наличии)</translation>
 <translation id="2077273864382355561">Задержка отключения экрана при работе от батареи</translation>
 <translation id="2082205219176343977">Настройка версии Chrome, минимально допустимой для устройства</translation>
@@ -314,6 +320,9 @@
           Если этот параметр настроен, запрос пароля будет появляться в соответствии с заданным периодом времени.
 
           Если параметр не настроен, потребуется ежедневно вводить пароль, чтобы пользоваться быстрой разблокировкой.</translation>
+<translation id="2188722565665306629">Позволяет установить период, в течение которого пользователю будут показываться уведомления о том, что для установки обновления необходимо перезапустить <ph name="PRODUCT_NAME" />.
+
+      Это правило позволяет установить срок показа уведомлений о необходимости перезапуска <ph name="PRODUCT_NAME" /> или <ph name="PRODUCT_OS_NAME" /> для установки обновления. Период указывается в миллисекундах. На его протяжении пользователь будет получать напоминания о необходимости установить обновление, при этом учитываются настройки правила <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Если значение не указано, используется срок по умолчанию длительностью 604800000 мс (одна неделя).</translation>
 <translation id="2194470398825717446">Это правило перестало поддерживаться в M61, используйте вместо него EcryptfsMigrationStrategy.
 
       Определяет порядок работы устройства при переходе с шифрования ecryptfs на ext4.
@@ -500,6 +509,13 @@
 <translation id="267596348720209223">Задает кодировку текста, поддерживаемую поисковой системой. Кодировки – это названия кодовых страниц, например UTF-8, GB2312 или ISO-8859-1. Они применяются в том порядке, в котором перечислены. Это правило необязательно: если оно не настроено, по умолчанию используется кодировка UTF-8. Оно действует, только если активно правило DefaultSearchProviderEnabled.</translation>
 <translation id="2682225790874070339">Отключить Google Диск в приложении "Файлы" <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Использовать прокси-сервер для сжатия данных</translation>
+<translation id="2726613915126661822">Позволяет разрешать или запрещать запуск виртуальных машин в Chrome OS.
+
+      Если указано значение True, то устройству разрешено запускать виртуальные машины.
+      Если указано значение False, то устройству запрещено это делать.
+      При смене значения на False настройки начинают применяться к новым виртуальным машинам, не останавливая работу уже запущенных.
+      Если правило не задано на управляемом устройстве, то ему запрещено запускать виртуальные машины.
+      Устройствам, которые не управляются удаленно, разрешено запускать виртуальные машины.</translation>
 <translation id="2731627323327011390">Запретить приложениям ARC использовать сертификаты <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="2742843273354638707">Удаляет приложение из Интернет-магазина Chrome и ссылку на него со страницы быстрого доступа и с панели запуска приложений <ph name="PRODUCT_OS_NAME" />.
 
@@ -711,6 +727,7 @@
           Это правило может использоваться по усмотрению пользователей. Если его значение не задано, страница быстрого доступа не будет указана.
 
           Это правило применяется только совместно с правилом "DefaultSearchProviderEnabled".</translation>
+<translation id="3465852069254497664">Уведомлять пользователя о том, что рекомендуется или требуется перезапустить браузер</translation>
 <translation id="346731943813722404">Определяет, следует ли начинать отсчет времени для параметров электропитания и регистрировать начало сеанса лишь после того, как система зафиксирует первое действие пользователя.
 
           Если выбрано значение TRUE, время бездействия для таких настроек электропитания, как отключение дисплея и перевод устройства в спящий режим, и лимит продолжительности сеанса начнут отсчитываться после первого действия в системе.
@@ -744,6 +761,7 @@
 <translation id="3711895659073496551">Спящий режим</translation>
 <translation id="3736879847913515635">Разрешить добавлять людей через диспетчер пользователей</translation>
 <translation id="3737544779868348650">Имя хоста устройства</translation>
+<translation id="3740754010292550733">Установить срок показа уведомлений о перезапуске, необходимом для обновления</translation>
 <translation id="3750220015372671395">Блокировать создание ключей на этих сайтах</translation>
 <translation id="3756011779061588474">Блокировать режим разработчика</translation>
 <translation id="3758089716224084329">Позволяет задать прокси-сервер для сервиса "<ph name="PRODUCT_NAME" />" и запретить пользователям менять его настройки.
@@ -1417,6 +1435,7 @@
           Если правило задано, пользователи могут временно включать и отключать большой курсор. Вносимые пользователями изменения кратковременны: при следующем появлении экрана входа или бездействии пользователя на экране входа в течение одной минуты применяется настройка по умолчанию.
 
           Если значение правила не задано, при первом переходе на экран входа большой курсор будет отключен. Пользователи могут его в любое время включить и отключить, а его статус будет виден всем пользователям на экране входа.</translation>
+<translation id="5929855945144989709">Позволять устройствам запускать виртуальные машины в Chrome OS</translation>
 <translation id="5932767795525445337">С помощью этого правила также можно закрепить приложения для Android на панели запуска.</translation>
 <translation id="5936622343001856595">Запросы в Веб-поиске Google всегда будут выполняться с использованием Безопасного поиска, и пользователи не смогут менять эту настройку.
 
@@ -1660,6 +1679,15 @@
 
       Правило <ph name="SYNC_DISABLED_POLICY_NAME" /> отключает синхронизацию всех данных, изменяя правило RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Принудительная проверка правописания для определенных языков</translation>
+<translation id="673699536430961464">Позволяет переключаться между несколькими аккаунтами Google в браузере после входа в аккаунт на устройстве <ph name="PRODUCT_OS_NAME" />.
+
+      Если указать значение False, вход в другие аккаунты будет запрещен везде, кроме окон в режиме инкогнито.
+
+      Если не настраивать правило или указать значение True, пользователи смогут входить в другие аккаунты в браузере (в детские аккаунты – только в режиме инкогнито).
+
+      Если вы хотите запретить вход в другие аккаунты в режиме инкогнито, заблокируйте его с помощью правила IncognitoModeAvailability.
+
+      Обратите внимание, что пользователи могут получить доступ к сервисам Google без аутентификации, заблокировав файлы cookie.</translation>
 <translation id="6757438632136860443">Позволяет задать список шаблонов URL для сайтов, которым разрешено запускать плагин <ph name="FLASH_PLUGIN_NAME" />.
 
           Если это правило не настроено, то для всех сайтов используется глобальное значение по умолчанию из правила DefaultPluginsSetting (если оно задано, в противном случае применяется пользовательская конфигурация).</translation>
@@ -1669,6 +1697,7 @@
 <translation id="6786967369487349613">Указать каталог для перемещаемого профиля</translation>
 <translation id="6810445994095397827">Блокировать JavaScript на этих сайтах</translation>
 <translation id="681446116407619279">Поддерживаемые протоколы аутентификации</translation>
+<translation id="6835883744948188639">Уведомлять пользователя о том, что рекомендуется перезапустить браузер</translation>
 <translation id="685769593149966548">Обязательное использование строгого Безопасного режима для YouTube</translation>
 <translation id="687046793986382807">Это правило не действует в <ph name="PRODUCT_NAME" />, начиная с версии 35.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index d7ff7d8..3bae2032 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -210,6 +210,7 @@
       Pravilnik naj bo nastavljen na URL, s katerega lahko <ph name="PRODUCT_OS_NAME" /> prenese pogoje storitve. Ti morajo biti v obliki navadnega besedila vrste MIME in brez označevanja.</translation>
 <translation id="1750315445671978749">Blokiraj vse prenose</translation>
 <translation id="1781356041596378058">Ta pravilnik prav tako nadzira dostop do možnosti za razvijalce za Android. Če ta pravilnik omogočite, uporabniki ne morejo dostopati do možnosti za razvijalce. Če ta pravilnik onemogočite ali ga ne nastavite, uporabniki lahko dostopajo do možnosti za razvijalce, tako da se v aplikaciji Nastavitve za Android sedemkrat dotaknejo številke gradnje.</translation>
+<translation id="1797233582739332495">Uporabniku prikaži ponavljajoč se poziv, ki obvešča, da je potreben vnovičen zagon</translation>
 <translation id="1803646570632580723">Seznam pripetih aplikacij v zaganjalniku</translation>
 <translation id="1808715480127969042">Blokiraj piškotke na teh mestih</translation>
 <translation id="1827523283178827583">Uporabi fiksne strežnike proxy</translation>
@@ -288,6 +289,11 @@
 
           Če ta pravilnik ni nastavljen, bodo uporabljeni vsi štirje načini.</translation>
 <translation id="2067011586099792101">Blokira dostop do spletnih mest zunaj paketov vsebine</translation>
+<translation id="2070270043919235595">Obvesti uporabnike, da je treba zaradi uveljavitve posodobitve na čakanju zagnati brskalnik <ph name="PRODUCT_NAME" />.
+
+      Ta nastavitev pravilnika omogoči obvestila, ki uporabnika obvestijo, da je priporočen ali obvezen vnovičen zagon brskalnika. Če pravilnik ni nastavljen, brskalnik <ph name="PRODUCT_NAME" /> uporabnika glede potrebnega vnovičnega zagona obvesti prek manjših sprememb menija. Če je pravilnik nastavljen na »Recommended«, je uporabniku prikazano ponavljajoče se opozorilo, da je priporočen vnovičen zagon. Uporabnik lahko opozorilo opusti in tako odloži vnovičen zagon. Če je pravilnik nastavljen na »Required«, je uporabniku prikazano ponavljajoče se opozorilo, da bo po izteku obdobja za obveščanje vsiljen vnovičen zagon brskalnika. To obdobje privzeto traja sedem dni in ga je mogoče konfigurirati v nastavitvi pravilnika <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Uporabniška seja je po vnovičnem zagonu obnovljena.</translation>
 <translation id="2077129598763517140">Uporabi strojno pospeševanje, če je na voljo</translation>
 <translation id="2077273864382355561">Časovni zamik izklopa zaslona ob napajanju iz akumulatorja</translation>
 <translation id="2082205219176343977">Konfiguriranje najmanjše dovoljene različice Chroma za napravo.</translation>
@@ -332,6 +338,9 @@
           Če je ta nastavitev konfigurirana, bodo morali uporabniki, ki uporabljajo hitro odklepanje, na zaklenjenem zaslonu vnesti geslo glede na to nastavitev.
 
           Če ta nastavitev ni konfigurirana, bodo morali uporabniki, ki uporabljajo hitro odklepanje, na zaklenjenem zaslonu vnesti geslo vsak dan.</translation>
+<translation id="2188722565665306629">Omogoči nastavitev časovnega obdobja, v katerem so prikazana obvestila o vnovičnem zagonu brskalnika <ph name="PRODUCT_NAME" /> zaradi uveljavitve posodobitve na čakanju.
+
+      S to nastavitvijo pravilnika je mogoče v milisekundah nadzirati časovno obdobje, v katerem je uporabnik postopno obveščan, da mora zaradi posodobitve znova zagnati brskalnik <ph name="PRODUCT_NAME" /> (ali operacijski sistem <ph name="PRODUCT_OS_NAME" />). V tem časovnem obdobju je uporabnik postopno obveščan glede potrebe po posodobitvi na podlagi nastavitve pravilnika <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Če pravilnik ni nastavljen, se kot privzeto časovno obdobje uporabi 604.800.000 milisekund (en teden).</translation>
 <translation id="2194470398825717446">Ta pravilnik je zastarel v različici M61, uporabite EcryptfsMigrationStrategy.
 
       Določa, kako naj deluje naprava, ki je bila dobavljena z ecryptfs in mora preiti na šifriranje ext4.
@@ -536,6 +545,13 @@
           Ta pravilnik velja le, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation>
 <translation id="2682225790874070339">Onemogoči Google Drive v aplikaciji Datoteke za <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Omogoči funkcijo stiskanja podatkov v strežniku proxy</translation>
+<translation id="2726613915126661822">Omogoči nadziranje, ali je v sistemu OS Chrome dovoljeno izvajanje navideznih računalnikov.
+
+      Če je pravilnik nastavljen na »True«, je v napravi dovoljeno izvajanje navideznih računalnikov.
+      Če pravilnik nastavljen na »False«, v napravi ni dovoljeno izvajanje navideznih računalnikov.
+      Ko je nastavitev pravilnika spremenjena na »False«, se uporabi pri zagonu novih navideznih računalnikov, navideznih računalnikov, ki se že izvajajo, pa ne zaustavi.
+      Če ta pravilnik ni nastavljen v upravljani napravi, v napravi ni dovoljeno izvajanje navideznih računalnikov.
+      V napravah, ki niso upravljane, je dovoljeno izvajanje navideznih računalnikov.</translation>
 <translation id="2731627323327011390">Onemogočanje uporabe potrdil sistema <ph name="PRODUCT_OS_NAME" /> aplikacijam ARC</translation>
 <translation id="2742843273354638707">Skrivanje aplikacije Spletna trgovina Chrome in povezave v nogi na strani »Nov zavihek« in v zaganjalniku aplikacij v sistemu <ph name="PRODUCT_OS_NAME" />.
 
@@ -759,6 +775,7 @@
           Ta pravilnik je izbiren. Če ni nastavljen, ne bo novega zavihka s povezavami.
 
           Ta pravilnik se upošteva samo, če je omogočen pravilnik »DefaultSearchProviderEnabled«.</translation>
+<translation id="3465852069254497664">Obveščanje uporabnika, da je priporočen ali obvezen vnovičen zagon brskalnika</translation>
 <translation id="346731943813722404">Določa, ali naj se zakasnitve upravljanja porabe in omejitev dolžine seje začnejo izvajati šele po prvi zaznani dejavnosti uporabnika v seji.
 
           Če je pravilnik nastavljen na »True«, se zakasnitve upravljanja porabe in omejitev dolžine seje ne začnejo izvajati, dokler v seji ni zaznana prva dejavnost uporabnika.
@@ -792,6 +809,7 @@
 <translation id="3711895659073496551">Prekinitev</translation>
 <translation id="3736879847913515635">Omogočanje dodajanja oseb v upravitelju uporabnikov</translation>
 <translation id="3737544779868348650">Ime gostitelja omrežja naprave</translation>
+<translation id="3740754010292550733">Nastavitev časovnega obdobja za obveščanje o vnovičnem zagonu zaradi posodobitve</translation>
 <translation id="3750220015372671395">Blokiraj ustvarjanje ključev na teh spletnih mestih</translation>
 <translation id="3756011779061588474">Blokiranje načina za razvijalce</translation>
 <translation id="3758089716224084329">Omogoča nastavitev strežnika proxy, ki ga uporablja <ph name="PRODUCT_NAME" />, in preprečuje uporabnikom spreminjanje nastavitev strežnika proxy.
@@ -1516,6 +1534,7 @@
           Če pravilnik nastavite, ga lahko uporabniki začasno preglasijo tako, da omogočijo ali onemogočijo velik kazalec, vendar ta nastavitev ni trajna, pri čemer se privzeta nastavitev obnovi vsakič, ko je ponovno prikazan prijavni zaslon ali kadar je uporabnik eno minuto nedejaven na prijavnem zaslonu.
 
           Če pravilnika ne nastavite, je velik kazalec onemogočen, ko je prvič prikazan prijavni zaslon. Uporabniki lahko kadar koli omogočijo ali onemogočijo velik kazalec, pri čemer se njegovo stanje na prijavnem zaslonu ohrani med uporabniki.</translation>
+<translation id="5929855945144989709">V napravah je dovoljeno izvajanje navideznih računalnikov v sistemu OS Chrome</translation>
 <translation id="5932767795525445337">Ta pravilnik je prav tako mogoče uporabiti za pripenjanje aplikacij za Android.</translation>
 <translation id="5936622343001856595">Uveljavi izvajanje poizvedb v Google Spletnem iskanju z aktiviranim Google Varnim iskanjem in uporabnikom prepreči spreminjanje te nastavitve.
 
@@ -1771,6 +1790,15 @@
 
       Pravilnik <ph name="SYNC_DISABLED_POLICY_NAME" /> onemogoči vso sinhronizacijo podatkov in preglasi pravilnik RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Vsiljeno preverjanje črkovanja jezikov</translation>
+<translation id="673699536430961464">Ta nastavitev uporabnikom po prijavi v napravo <ph name="PRODUCT_OS_NAME" /> omogoča preklop med Google Računi na območju z vsebino v oknu brskalnika.
+
+      Če je ta pravilnik nastavljen na »false«, prijava v drug račun na območju z vsebino brskalnika z beleženjem zgodovine ne bo dovoljena.
+
+      Če ta pravilnik ni nastavljen ali je nastavljen na »true«, se uporabi privzeto delovanje: prijava v drug račun na območju z vsebino brskalnika bo dovoljena z izjemo računov za otroke, pri katerih je to blokirano za območje z vsebino brskalnika z beleženjem zgodovine.
+
+      Če prijava v drug račun ne bi smela biti dovoljena v načinu brez beleženja zgodovine, blokirajte ta način s pravilnikom »IncognitoModeAvailability«.
+
+      Upoštevajte, da bodo lahko uporabniki z blokiranjem piškotkov dostopali do Googlovih storitev v stanju brez preverjanja pristnosti.</translation>
 <translation id="6757438632136860443">Omogoča nastavitev seznama vzorcev URL-jev, ki določa, katerim spletnim mestom je dovoljeno izvajanje vtičnika <ph name="FLASH_PLUGIN_NAME" />.
 
           Če ta pravilnik ni nastavljen, se za vsa spletna mesta uporabi globalna privzeta vrednost iz pravilnika »DefaultPluginsSetting«, kadar je ta pravilnik nastavljen, sicer pa iz osebnih nastavitev uporabnika.</translation>
@@ -1780,6 +1808,7 @@
 <translation id="6786967369487349613">Nastavitev imenika za profil za gostovanje</translation>
 <translation id="6810445994095397827">Blokiraj JavaScript na teh mestih</translation>
 <translation id="681446116407619279">Podprti načini preverjanja pristnosti</translation>
+<translation id="6835883744948188639">Uporabniku prikaži ponavljajoč se poziv, ki obvešča, da je priporočen vnovičen zagon</translation>
 <translation id="685769593149966548">Uveljavitev Strogo omejenega načina v YouTubu</translation>
 <translation id="687046793986382807">Ta pravilnik je zastaral in se ne uporablja več od različice 35 brskalnika <ph name="PRODUCT_NAME" />.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 94967bbc..18ad06f4 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -209,6 +209,7 @@
       Смернице треба да буду подешене на URL адресу са које <ph name="PRODUCT_OS_NAME" /> може да преузме Услове коришћења услуге. Услови коришћења услуге морају да буду чисти текст, приказан као текст MIME типа/чисти. Није дозвољено никакво означавање.</translation>
 <translation id="1750315445671978749">Блокирај сва преузимања</translation>
 <translation id="1781356041596378058">Ове смернице такође контролишу приступ Android опцијама за програмере. Ако ове смернице подесите на „тачно“, корисници неће имати приступ опцијама за програмере. Ако ове смернице подесите на „нетачно“ или их оставите неподешене, корисници ће моћи да приступе опцијама за програмере тако што ће додирнути број верзије у апликацији Android подешавања седам пута.</translation>
+<translation id="1797233582739332495">Приказуј кориснику упит који се понавља у коме је наведено да је поновно покретање потребно</translation>
 <translation id="1803646570632580723">Листа закачених апликација које треба приказати у покретачу</translation>
 <translation id="1808715480127969042">Блокирај колачиће на овим сајтовима</translation>
 <translation id="1827523283178827583">Користи фиксне прокси сервере</translation>
@@ -287,6 +288,11 @@
 
           Ако не подесите ове смернице, користиће се све четири шеме.</translation>
 <translation id="2067011586099792101">Блокирај приступ сајтовима изван пакета садржаја</translation>
+<translation id="2070270043919235595">Обавести кориснике да <ph name="PRODUCT_NAME" /> мора да се поново покрене да би се применило ажурирање на чекању.
+
+      Ово подешавање смерница омогућава обавештавање корисника да се препоручује или је потребно поновно покретање прегледача. Ако се не подеси, <ph name="PRODUCT_NAME" /> указује кориснику незнатним променама менија да је поновно покретање потребно. Ако се изабере подешавање „Препоручено“, кориснику ће се приказивати упозорење да се поновно покретање препоручује. Корисник може да одбаци ово упозорење да би одложио поновно покретање. Ако се изабере подешавање „Обавезно“, кориснику ће се приказивати упозорење да ће се прегледач принудно поново покренути када истекне период за обавештење. Подразумевано трајање тог периода је седам дана и може да се конфигурише преко подешавања смерница <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Корисникова сесија се обнавља после поновног покретања.</translation>
 <translation id="2077129598763517140">Користи хардверско убрзање када је доступно</translation>
 <translation id="2077273864382355561">Време до искључивања екрана када се користи батерија</translation>
 <translation id="2082205219176343977">Конфигуришу најстарију дозвољену верзију Chrome-а за уређај.</translation>
@@ -331,6 +337,9 @@
           Ако је ово подешавање конфигурисано, од корисника који користе брзо откључавање ће се захтевати да унесу лозинку на закључаном екрану у складу са овим подешавањем.
 
           Ако ово подешавање није конфигурисано, од корисника који користе брзо откључавање ће се захтевати да унесу лозинку на закључаном екрану сваког дана.</translation>
+<translation id="2188722565665306629">Омогућава вам да подесите временски период током којег се приказују обавештења о поновном покретању <ph name="PRODUCT_NAME" />-а да би се применило ажурирање на чекању.
+
+      То подешавање смерница може да се користи за конролу временског периода, у милисекундама, током којег корисник све чешће добија обавештење да <ph name="PRODUCT_NAME" /> мора поново да се покрене (или да <ph name="PRODUCT_OS_NAME" /> мора да се рестартује) због ажурирања. Током тог временског периода, корисник ће стално добијати обавештење да је потребно ажурирање на основу подешавања смерница <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Ако се не подеси, користи се подразумевани период од 604800000 милисекунди (недељу дана).</translation>
 <translation id="2194470398825717446">Ове смернице су застареле у M61, уместо њих користите EcryptfsMigrationStrategy.
 
       Наводи како треба да се понаша уређај који сте добили уз ecryptfs и како треба да пређе на шифровање ext4.
@@ -533,6 +542,13 @@
           Ове смернице се поштују само ако су смернице „DefaultSearchProviderEnabled„ омогућене.</translation>
 <translation id="2682225790874070339">Онемогући Диск <ph name="PRODUCT_OS_NAME" /> у апликацији Датотеке</translation>
 <translation id="268577405881275241">Омогући функцију проксија за компресију података</translation>
+<translation id="2726613915126661822">Омогућава вам да контролишете да ли виртуелне машине смеју да се покрећу на Chrome ОС-у.
+
+      Ако се смернице подесе на Тачно, уређај може да покреће виртуелне машине.
+      Ако се смернице подесе на Нетачно, уређај неће смети да покреће виртуелне машине.
+      Када се смернице промене на Нетачно, то важи за покретање нових виртуелних машина, али не искључује виртуелне машине које већ раде.
+      Када се ове смернице не подесе на управљаном уређају, тај уређај неће смети да покреће виртуелне машине.
+      Уређаји којима се не управља смеју да покрећу виртуелне машине.</translation>
 <translation id="2731627323327011390">Онемогућите коришћење <ph name="PRODUCT_OS_NAME" /> сертификата за ARC апликације</translation>
 <translation id="2742843273354638707">Крију апликацију Chrome веб-продавница и линк подножја на страници Нова картица и у покретачу <ph name="PRODUCT_OS_NAME" /> апликација.
 
@@ -756,6 +772,7 @@
           Ове смернице су опционалне. Ако не буду подешене, неће бити приказана никаква страница Нова картица.
 
           Ове смернице се поштују само ако су омогућене смернице „DefaultSearchProviderEnabled“.</translation>
+<translation id="3465852069254497664">Обавести корисника да се препоручује или захтева поновно покретање прегледача</translation>
 <translation id="346731943813722404">Наводи да ли кашњења у управљању напајањем и ограничење дужине сесије треба да се покрећу само након прве активности корисника у сесији.
 
           Ако се ове смернице поставе на вредност True, кашњења у управљању напајањем и ограничење дужине сесије се покрећу тек након прве активности корисника у сесији.
@@ -789,6 +806,7 @@
 <translation id="3711895659073496551">Искључи</translation>
 <translation id="3736879847913515635">Омогући додавање особа у менаџер корисника</translation>
 <translation id="3737544779868348650">Име хоста мреже уређаја</translation>
+<translation id="3740754010292550733">Подеси период за обавештења о поновном покретању због ажурирања</translation>
 <translation id="3750220015372671395">Блокирај генерисање шифара на овим сајтовима</translation>
 <translation id="3756011779061588474">Блокирање режима програмера</translation>
 <translation id="3758089716224084329">Омогућава вам да наведете прокси сервер који <ph name="PRODUCT_NAME" /> користи и спречава кориснике да мењају подешавања проксија.
@@ -1506,6 +1524,7 @@
           Ако подесите ове смернице, корисници ће привремено моћи да их замене ако омогуће или онемогуће велики курсор. Међутим, избор корисника неће бити трајан и подразумевано подешавање ће бити враћено кад год се екран за пријављивање поново прикаже или када корисник буде неактиван на екрану за пријављивање у периоду од једног минута.
 
           Ако не подесите ове смернице, велики курсор ће бити онемогућен када се екран за пријављивање прикаже по први пут. Корисници ће моћи да омогуће или онемогуће велики курсор у било ком тренутку и његов статус на екрану за пријављивање ће бити трајан за кориснике.</translation>
+<translation id="5929855945144989709">Дозволи уређајима да порећу виртуелне машине на Chrome ОС-у</translation>
 <translation id="5932767795525445337">Ове смернице можете да користите и да бисте закачили Android апликације.</translation>
 <translation id="5936622343001856595">Омогућава принудно обављање Google веб-претраге са активираном Сигурном претрагом и онемогућава да корисници промене ово подешавање.
 
@@ -1757,6 +1776,15 @@
 
       Смернице <ph name="SYNC_DISABLED_POLICY_NAME" /> онемогућавају сваку синхронизацију података, замењујући RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Принудно омогућавају језике за проверу правописа</translation>
+<translation id="673699536430961464">Ово подешавање омогућава корисницима да мењају Google налоге у области садржаја прозора прегледача када се пријаве на <ph name="PRODUCT_OS_NAME" /> уређај.
+
+      Ако подесите смернице на Нетачно, пријављивање на неки други налог из области садржаја прегледача који није у режиму без архивирања неће бити дозвољено.
+
+      Ако не подесите ове смернице или их подесите на Тачно, користиће се подразумевано понашање: пријављивање на неки други налог из области садржаја прегледача ће бити дозвољено, осим за дечје налоге где ће бити блокирано за област садржаја прегледача који није у режиму без архивирања.
+
+      У случају да пријављивање на неки други налог не треба дозволити помоћу режима без архивирања, размотрите блокирање тог режима помоћу смерница IncognitoModeAvailability.
+
+      Имајте у видуда ће корисници моћи да приступају Google услугама без провере идентитета ако блокирају колачиће.</translation>
 <translation id="6757438632136860443">Омогућавају вам да подесите листу образаца URL-ова који наводе сајтове којима је дозвољено да покрећу додатну компоненту <ph name="FLASH_PLUGIN_NAME" />.
 
           Ако не подесите ове смернице, за све сајтове ћемо користити глобалну подразумевану вредност или из смерница „DefaultPluginsSetting“ ако су оне подешене или, ако нису, из личне конфигурације корисника.</translation>
@@ -1766,6 +1794,7 @@
 <translation id="6786967369487349613">Подешавање директоријума роминг профила</translation>
 <translation id="6810445994095397827">Блокирај JavaScript на овим сајтовима</translation>
 <translation id="681446116407619279">Подржане шеме провере аутентичности</translation>
+<translation id="6835883744948188639">Приказуј кориснику упит који се понавља у коме је наведено да се поновно покретање препоручује</translation>
 <translation id="685769593149966548">Примењује Строги ограничени режим за YouTube</translation>
 <translation id="687046793986382807">Ове смернице су повучене од <ph name="PRODUCT_NAME" /> верзије 35.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index d4ffded..34ab056 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -27,7 +27,7 @@
       När principen har ställts in visas inloggningsskärmen alltid på det språk som har angetts först i principen (definitionen ges i form av en lista så att principen ska vara kompatibel med framtida versioner). Om principen inte har ställts in eller om en tom lista har angetts visas inloggningsskärmen på det språk som användes vid den senaste användarsessionen. Om principen har ställts in på ett ogiltigt värde används reservspråkkoden (för närvarande en-US) för inloggningsskärmen.</translation>
 <translation id="1062011392452772310">Aktivera fjärrattestering för enheten</translation>
 <translation id="1062407476771304334">Ersätt</translation>
-<translation id="109166998561583554">Lösenordsskyddets utlösare om att kontot är utsatt för risk visas</translation>
+<translation id="109166998561583554">Lösenordsskyddets utlösare för när en varning om att kontot är utsatt för risk ska visas</translation>
 <translation id="1093082332347834239">Om inställningen är aktiverad körs fjärrhjälpsvärden i en process med behörigheter för <ph name="UIACCESS_PERMISSION_NAME" />. Det innebär att fjärranvändare kan interagera med fönster som öppnats med högre behörighet på den lokala användarens dator.
 
           Om inställningen är inaktiverad eller inte konfigurerad körs fjärrhjälpsvärden i användarens kontext och fjärranvändare kan inte interagera med fönster som öppnats med högre behörighet på datorn.</translation>
@@ -211,6 +211,7 @@
       Den här policyn ska ställas in på en webbadress som <ph name="PRODUCT_OS_NAME" /> kan ladda ned användarvillkoren från. Användarvillkoren måste vara oformaterad text av MIME-typ. Ingen kod får användas.</translation>
 <translation id="1750315445671978749">Blockera alla nedladdningar</translation>
 <translation id="1781356041596378058">Den här principen styr även tillgången till Androids utvecklaralternativ. Om principen är inställd på sant kan användarna inte öppna utvecklaralternativen. Om principen är inställd på falskt eller lämnas utan inställning kan användarna öppna utvecklaralternativen genom att trycka sju gånger på versionsnumret i appen Inställningar i Android.</translation>
+<translation id="1797233582739332495">Visa användaren ett återkommande meddelande om att omstart krävs</translation>
 <translation id="1803646570632580723">Lista över fasta appar som ska visas i startfönstret</translation>
 <translation id="1808715480127969042">Blockera cookies på dessa webbplatser</translation>
 <translation id="1827523283178827583">Använd fasta proxyservrar</translation>
@@ -289,6 +290,11 @@
 
           Om principen inte anges används alla fyra.</translation>
 <translation id="2067011586099792101">Blockera åtkomst till webbplatser utanför innehållspaket</translation>
+<translation id="2070270043919235595">Meddela användarna att <ph name="PRODUCT_NAME" /> måste startas om eftersom en uppdatering väntar.
+
+      Med den här principen kan användaren få en avisering om att webbläsaren bör eller måste startas om. Om principen lämnas utan inställning framgår det av en diskret ändring i menyn i <ph name="PRODUCT_NAME" /> att omstart krävs. Med inställningen Rekommenderas visas ett återkommande meddelande för användaren att en omstart rekommenderas. Användaren kan ignorera meddelandet och skjuta upp omstarten. Med inställningen Krävs visas ett återkommande meddelande om att webbläsaren kommer att startas om efter en viss tid. Tidsperioden är sju dagar som standard och kan konfigureras via principen <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" />.
+
+      Användarens session återställs efter omstarten.</translation>
 <translation id="2077129598763517140">Använd maskinvaruacceleration när det är tillgängligt</translation>
 <translation id="2077273864382355561">Skärmavstängningstid när enheten drivs av batteriet</translation>
 <translation id="2082205219176343977">Konfigurera lägsta tillåtna Chrome-version för enheten.</translation>
@@ -333,6 +339,9 @@
           Om inställningen konfigureras uppmanas användaren att ange lösenord på låsskärmen beroende på inställningen.
 
           Om inställningen inte konfigureras uppmanas användaren att ange lösenord på låsskärmen varje dag.</translation>
+<translation id="2188722565665306629">Gör att du kan ställa in under hur lång tid som uppmaningar om att starta om <ph name="PRODUCT_NAME" /> ska visas när en uppdatering väntar.
+
+      Med den här principen kan du ställa in under hur lång tid (i millisekunder) som användaren ska få upprepade aviseringar om att <ph name="PRODUCT_NAME" /> (eller <ph name="PRODUCT_OS_NAME" />) behöver startas om på grund av en uppdatering. Under den tiden visas upprepade uppmaningar att starta om för användaren utifrån principen <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" />. Om principen lämnas utan inställning används standardperioden 604 800 000 millisekunder (en vecka).</translation>
 <translation id="2194470398825717446">Den här principen har fasats ut i M61. Använd EcryptfsMigrationStrategy i stället.
 
       Anger beteendet för en enhet som levererades med ecryptfs och måste övergå till ext4-kryptering.
@@ -537,6 +546,13 @@
           Policyn används bara om policyn DefaultSearchProviderEnabled är aktiverad.</translation>
 <translation id="2682225790874070339">Inaktiverar Drive i appen Filer i <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="268577405881275241">Aktivera proxyfunktionen för datakomprimering</translation>
+<translation id="2726613915126661822">Låter dig styra om virtuella maskiner får köras eller inte i Chrome OS.
+
+      Om principen är inställd på Sant får virtuella maskiner köras på enheten.
+      Om principen är inställd på Falskt får virtuella maskiner inte köras på enheten.
+      När principen ändras till Falskt gäller den vid försök att starta nya virtuella maskiner, men virtuella maskiner som redan körs avslutas inte.
+      Om principen lämnas utan inställning på en hanterad enhet får virtuella maskiner inte köras på den.
+      Virtuella maskiner får köras på enheter som inte hanteras.</translation>
 <translation id="2731627323327011390">Inaktivera användning av <ph name="PRODUCT_OS_NAME" />-certifikat för ARC-appar</translation>
 <translation id="2742843273354638707">Dölj appen Chrome Web Store och länken i sidfoten från den nya fliksidan och startprogrammet för <ph name="PRODUCT_OS_NAME" />.
 
@@ -760,6 +776,7 @@
           Policyn är valfri. Om den inte anges tillhandahålls ingen ny fliksida.
 
           Policyn följs endast om policyn DefaultSearchProviderEnabled är aktiverad.</translation>
+<translation id="3465852069254497664">Meddela användaren att webbläsaren bör eller måste startas om</translation>
 <translation id="346731943813722404">Anger om fördröjningar i energisparfunktionen och begränsningar i sessionslängden endast ska användas efter att den första användaraktiviteten har observerats i en session.
 
           Om Sant har angetts för den här policyn börjar inte fördröjningar i energisparfunktionen och begränsningar i sessionslängden förrän den första användaraktiviteten har observerats i sessionen.
@@ -793,6 +810,7 @@
 <translation id="3711895659073496551">Stäng av</translation>
 <translation id="3736879847913515635">Gör att en person kan läggas till i användarhanteraren</translation>
 <translation id="3737544779868348650">Värdnamn för enhetsnätverk</translation>
+<translation id="3740754010292550733">Ange under hur lång tid som aviseringar om omstart ska visas vid uppdatering</translation>
 <translation id="3750220015372671395">Blockera nyckelgenerering på dessa webbplatser</translation>
 <translation id="3756011779061588474">Blockera utvecklarläget</translation>
 <translation id="3758089716224084329">Med den här principen kan du ange vilken proxyserver som används av <ph name="PRODUCT_NAME" /> och förhindra att användare ändrar sina proxyinställningar.
@@ -1520,6 +1538,7 @@
           Om du ställer in detta alternativ kan användarna temporärt åsidosätta det genom att aktivera eller inaktivera den stora markören. Men det val användaren gör sparas inte, och standardvärdet återställs när inloggningsskärmen visas nästa gång eller om användaren inte gör något på inloggningsskärmen under en hel minut.
 
           Om den här principen inte anges är den stora markören inaktiverad när inloggningsskärmen visas för första gången. Användarna kan aktivera eller inaktivera den stora markören när som helst, och dess status på inloggningsskärmen sparas för olika användare.</translation>
+<translation id="5929855945144989709">Tillåt att virtuella maskiner körs i Chrome OS</translation>
 <translation id="5932767795525445337">Du kan även använda principen till att fästa Android-appar.</translation>
 <translation id="5936622343001856595">Tvingar sökfrågor i Googles webbsökning att genomföras med SafeSearch aktiverat och förhindrar att användarna ändrar inställningen.
 
@@ -1775,6 +1794,15 @@
 
       Principen <ph name="SYNC_DISABLED_POLICY_NAME" /> inaktiverar all synkronisering av data och åsidosätter RoamingProfileSupportEnabled.</translation>
 <translation id="6735701345096330595">Aktivera alltid språk för stavningskontroll</translation>
+<translation id="673699536430961464">Den här inställningen gör så att användarna kan byta Google-konto i webbläsarens innehållsområde när de har loggat in på <ph name="PRODUCT_OS_NAME" />-enheten.
+
+      Om principen har ställts in på falskt är det inte tillåtet att logga in med ett annat konto via ett innehållsområde i webbläsaren utom i inkognitofönster.
+
+      Om principen har lämnats utan inställning eller ställts in på sant används standardförfarandet, d.v.s. det är tillåtet att logga in med ett annat konto via innehållsområdet i webbläsaren utom för barnkonton, där inloggning blockeras i alla innehållsområden utom inkognitofönster.
+
+      Om det inte ska vara tillåtet att logga in på ett annat konto via inkognitoläget kan du blockera det läget med principen IncognitoModeAvailability.
+
+      Observera att användarna kan nå Googles tjänster utan autentisering genom att blockera cookies.</translation>
 <translation id="6757438632136860443">Låter dig ange en lista med webbadressmönster som definierar på vilka webbplatser pluginprogrammet för <ph name="FLASH_PLUGIN_NAME" /> får köras.
 
           Om den här principen inte anges används det globala standardvärdet för alla webbplatser. Värdet hämtas antingen från principen DefaultPluginsSetting, om den har ställts in, eller från användarens egna inställningar.</translation>
@@ -1784,6 +1812,7 @@
 <translation id="6786967369487349613">Ange roamingprofilkatalogen</translation>
 <translation id="6810445994095397827">Blockera JavaScript på dessa webbplatser</translation>
 <translation id="681446116407619279">Autentiseringsscheman som stöds</translation>
+<translation id="6835883744948188639">Visa användaren ett återkommande meddelande om att omstart rekommenderas</translation>
 <translation id="685769593149966548">Gör strikt begränsat läge på YouTube obligatoriskt</translation>
 <translation id="687046793986382807">Denna princip används inte från och med <ph name="PRODUCT_NAME" /> version 35. 
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index bafffd7..6736577b 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -201,6 +201,7 @@
       இந்தக் கொள்கை <ph name="PRODUCT_OS_NAME" /> சேவை விதிமுறைகளைப் பதிவிறக்கும் URL க்கு அமைக்கப்படும். சேவை விதிமுறைகளானது எளிய உரையாகவும், MIME வகை உரை/எளிதாக வழங்கப்பட வேண்டும். எந்த மார்க்-அப்பும் அனுமதிக்கப்படவில்லை.</translation>
 <translation id="1750315445671978749">எல்லாப் பதிவிறக்கங்களையும் தடு</translation>
 <translation id="1781356041596378058">Android டெவெலப்பர் விருப்பங்களுக்கான அணுகலையும் இந்தக் கொள்கை கட்டுப்படுத்தும். இந்தக் கொள்கையை “சரி” என அமைத்தால், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியாது. இந்தக் கொள்கையை “தவறு” என அமைத்தாலோ அல்லது அமைக்காமல் விட்டாலோ, Android அமைப்புகள் பயன்பாட்டில் இருக்கும் பதிப்பு எண்ணை ஏழு முறை தட்டுவதன் மூலம், பயனர்களால் டெவெலப்பர் விருப்பங்களை அணுக முடியும்.</translation>
+<translation id="1797233582739332495">மீண்டும் தொடங்குவது தேவையானது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் அறிவிப்பைப் பயனருக்குக் காட்டு</translation>
 <translation id="1803646570632580723">தொடக்கத்தில் காண்பிப்பதற்கான பின்செய்யப்பட்ட பயன்பாடுகளின் பட்டியல்</translation>
 <translation id="1808715480127969042">இந்த தளங்களில் குக்கீகளைத் தடு </translation>
 <translation id="1827523283178827583">நிலையான ப்ராக்ஸி சேவையகங்களைப் பயன்படுத்து</translation>
@@ -273,6 +274,11 @@
 
           இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், நான்கு திட்டங்களுமே பயன்படுத்தப்படும்.</translation>
 <translation id="2067011586099792101">உள்ளடக்கத் தொகுப்புகளுக்கு வெளியே உள்ள தளங்களுக்கான அணுகலைத் தடு</translation>
+<translation id="2070270043919235595">நிலுவையிலுள்ள புதுப்பிப்பைப் பயன்படுத்துவதற்கு, <ph name="PRODUCT_NAME" /> மீண்டும் தொடங்கப்பட வேண்டும் என்பதைப் பயனர்களுக்கு அறிவிக்கும்.
+
+      இந்தக் கொள்கை அமைப்பானது உலாவியை மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுவதா அல்லது தேவையானதா என்பதைப் பயனருக்குத் தெரிவிப்பதற்கு அறிவிப்புகளை இயக்குகிறது. இதை அமைக்கவில்லை எனில், அதன் மெனுவில் நுட்பமான மாற்றங்கள் செய்வதன் வழியாக மீண்டும் தொடங்க வேண்டும் என்பதைப் பயனருக்கு <ph name="PRODUCT_NAME" /> அறிவிக்கும். "பரிந்துரைக்கப்படுவது" என அமைத்தால், மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் எச்சரிக்கை பயனருக்குக் காட்டப்படும். மீண்டும் தொடங்குவதை ஒத்திவைக்க, இந்த எச்சரிக்கையைப் பயனர் நிராகரிக்கலாம். "தேவையானது" என அமைத்தால், அறிவிப்புக் காலம் கடந்த பிறகு, உலாவி மறுதொடக்கமானது கட்டாயமாகச் செய்யப்படும் என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் எச்சரிக்கை பயனருக்குக் காட்டப்படும். இந்த அறிவிப்புக் காலம் என்பது ஏழு நாட்கள் ஆகும். <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> கொள்கை அமைப்பு மூலம் அதை உள்ளமைக்கலாம்.
+
+      மீண்டும் தொடங்கிய பிறகு, பயனரின் அமர்வு மீட்டமைக்கப்படும்.</translation>
 <translation id="2077129598763517140">கிடைக்கும்போது வன்பொருளின் முடுக்கத்தைப் பயன்படுத்தவும்</translation>
 <translation id="2077273864382355561">பேட்டரி சக்தியில் இயங்கும்போது திரை முடக்கம் தாமதமாகும்</translation>
 <translation id="2082205219176343977">சாதனத்திற்கு அனுமதிக்கப்படும் குறைந்தபட்ச Chrome பதிப்பை உள்ளமை.</translation>
@@ -311,6 +317,9 @@
           இந்த அமைப்பு உள்ளமைக்கப்பட்டால், விரைந்து திறக்கும் அம்சத்தைப் பயன்படுத்தும் பயனர்களிடம், இந்த அமைப்பைச் சார்ந்து பூட்டுத் திரையில் அவர்களின் கடவுச்சொற்களை உள்ளிடும்படி கேட்கப்படும்.
 
           இந்த அமைப்பு உள்ளமைக்கப்படவில்லை எனில், விரைந்து திறக்கும் அம்சத்தைப் பயன்படுத்தும் பயனர்களிடம், தினந்தோறும் பூட்டுத் திரையில் கடவுச்சொல்லை உள்ளிடும்படி கேட்கப்படும்.</translation>
+<translation id="2188722565665306629">நிலுவையிலுள்ள புதுப்பிப்பைப் பயன்படுத்துவதற்கு, <ph name="PRODUCT_NAME" />ஐ மீண்டும் தொடங்குவதற்கான அறிவிப்புகளைக் காட்டுவதற்குக் கால அளவை அமைக்க அனுமதிக்கும்.
+
+      புதுப்பிப்புக்காக <ph name="PRODUCT_NAME" /> மீண்டும் தொடங்கப்பட வேண்டும் (அல்லது <ph name="PRODUCT_OS_NAME" /> மீண்டும் தொடங்கப்பட வேண்டும்) என்பது பயனருக்கு அறிவிக்கப்படுவதற்கு, இந்த கொள்கை அமைப்பைப் பயன்படுத்தி, மில்லிவினாடிகளில் கால அளவைக் கட்டுப்படுத்தலாம். இந்தக் கால அளவின்போது, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> கொள்கை அமைப்பின் அடிப்படையில் புதுப்பிப்புக்கான தேவை குறித்து பயனருக்குத் தொடர்ச்சியாக அறிவிக்கப்படும். அமைக்கப்படவில்லை எனில், இயல்பான கால அளவான 604800000 மில்லிவினாடிகள் (ஒரு வாரம்) பயன்படுத்தப்படும்.</translation>
 <translation id="2194470398825717446">இந்தக் கொள்கையானது M61 இல் தடுக்கப்பட்டது. அதற்குப் பதிலாக EcryptfsMigrationStrategyஐப் பயன்படுத்தவும்.
 
       ecryptfs உடன் ஷிப் செய்யப்பட்ட, ext4 என்கிரிப்ஷனுக்கு மாற வேண்டிய சாதனம் எப்படிச் செயல்பட வேண்டும் என்பதைக் குறிப்பிடுகிறது.
@@ -499,6 +508,13 @@
 <translation id="267596348720209223">தேடல் வழங்குநரால் எழுத்துக் குறியாக்கங்கள் ஆதரவளிப்பதைக் குறிப்பிடுகிறது. குறியாக்கங்கள், UTF-8, GB2312 மற்றும் ISO-8859-1 போன்ற பக்கப் பெயர்களால் குறிப்பிடப்படும். அவை, வழங்கப்பட்டுள்ள வரிசையில் முயற்சிக்கின்றன. இந்தக் கொள்கை, விருப்பத்தேர்வுக்குரியது. அது அமைக்கப்படவில்லை எனில், இயல்புநிலையான UTF-8 பயன்படுத்தப்படும். 'DefaultSearchProviderEnabled' செயலாக்கப்பட்டுள்ளதெனில் மட்டுமே, இந்தக் கொள்கை ஆதரிக்கப்படும்.</translation>
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> கோப்புகள் பயன்பாட்டில் இயக்ககத்தை முடக்குகிறது</translation>
 <translation id="268577405881275241">தரவு சுருக்க ப்ராக்ஸி அம்சத்தை இயக்கு</translation>
+<translation id="2726613915126661822">Chrome OS இல் விர்ச்சுவல் சாதனங்கள் இயங்குவதற்கு அனுமதிக்கப்படுமா என்பதைக் கட்டுப்படுத்த அனுமதிக்கும்.
+
+      "சரி" என கொள்கை அமைக்கப்பட்டால், விர்ச்சுவல் சாதனங்களை இயக்குவதற்குச் சாதனம் அனுமதிக்கப்படும்.
+      "தவறு" என கொள்கை அமைக்கப்பட்டால், விர்ச்சுவல் சாதனங்களை இயக்குவதற்குச் சாதனம் அனுமதிக்கப்படாது.
+      தவறு என கொள்கை மாற்றப்பட்டால், புதிய விர்ச்சுவல் சாதனங்களைத் தொடங்குவதற்குப் பொருந்தும் ஆனால், ஏற்கனவே இயங்கிக் கொண்டிருக்கும் விர்ச்சுவல் சாதனங்களை முடக்காது.
+      நிர்வகிக்கப்படும் சாதனத்தில் இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், விர்ச்சுவல் சாதனங்களை இயக்குவதற்குச் சாதனம் அனுமதிக்கப்படாது.
+      நிர்வகிக்கப்படாத சாதனங்கள், விர்ச்சுவல் சாதனங்களை இயக்குவதற்கு அனுமதிக்கப்படும்.</translation>
 <translation id="2731627323327011390">ARC பயன்பாடுகளில் <ph name="PRODUCT_OS_NAME" /> சான்றிதழ்களின் உபயோகத்தை முடக்கு</translation>
 <translation id="2742843273354638707">புதிய தாவல் பக்கத்திலிருந்தும், <ph name="PRODUCT_OS_NAME" /> பயன்பாட்டுத் துவக்கியிலிருந்தும், Chrome இணைய அங்காடி பயன்பாடு மற்றும் அடிக்குறிப்பு இணைப்பை மறைக்கவும்.
 
@@ -714,6 +730,7 @@
           இந்தக் கொள்கை விருப்பமானது. அமைக்கப்படவில்லை எனில், புதிய தாவல் பக்கம் வழங்கப்படாது.
 
           'DefaultSearchProviderEnabled' கொள்கை இயக்கப்பட்டிருந்தால் மட்டுமே இந்தக் கொள்கை மதிப்பிற்குரியதாக இருக்கும்.</translation>
+<translation id="3465852069254497664">உலாவியை மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது அல்லது தேவையானது என்பதைப் பயனருக்கு அறிவிப்பு செய்</translation>
 <translation id="346731943813722404">ஆற்றல் மேலாண்மை தாமதங்கள் மற்றும் அமர்வு நீளத்தின் வரம்பானது அமர்வில் பயனரின் முதல் செயல்பாட்டைக் கண்காணித்தப் பிறகு மட்டுமே இயங்குதலைத் தொடங்க வேண்டுமா என்பதைக் குறிப்பிடுகிறது.
 
           இந்தக் கொள்கையானது சரி என அமைக்கப்பட்டால், அமர்வில் பயனரின் முதல் செயல்பாடுக் கண்காணிக்கப்படும் வரையில் ஆற்றல் மேலாண்மை தாமதங்கள் மற்றும் அமர்வு நீளத்தின் வரம்பு தொடங்கப்படாது.
@@ -747,6 +764,7 @@
 <translation id="3711895659073496551">இடைநிறுத்தப்பட்டது</translation>
 <translation id="3736879847913515635">பயனர் நிர்வாகியில் பயனரைச் சேர்ப்பதை இயக்கு</translation>
 <translation id="3737544779868348650">சாதன நெட்வொர்க் ஹோஸ்ட்பெயர்</translation>
+<translation id="3740754010292550733">மீண்டும் தொடங்குவது குறித்த புதுப்பிப்பு அறிவிப்புகளுக்கான கால அளவை அமை</translation>
 <translation id="3750220015372671395">இந்தத் தளங்களில் விசை உருவாக்கத்தைத் தடு</translation>
 <translation id="3756011779061588474">டெவலப்பர் பயன்முறையைத் தடு</translation>
 <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> பயன்படுத்தும் ப்ராக்ஸி சேவையகத்தைக் குறிப்பிட உங்களை அனுமதித்து, ப்ராக்ஸி அமைப்புகளை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கும்.
@@ -1422,6 +1440,7 @@
           இந்தக் கொள்கையை நீங்கள் அமைத்தால், பெரிய இடஞ்சுட்டியை இயக்குவது அல்லது முடக்குவதன்மூலம் பயனர்கள் தற்காலிகமாக இதை மேலெழுதலாம். எனினும், பயனரின் விருப்பம் நிலையானது இல்லை என்பதால், உள்நுழைவுத் திரை புதிதாக காண்பிக்கப்படும்போதும் அல்லது உள்நுழைவுத் திரையில் பயனர் ஒரு நிமிடம் செயலற்ற நிலையில் இருக்கும்போதும் இயல்புநிலை மீட்டமைக்கப்படும்.
 
           இந்தக் கொள்கை அமைக்கப்படாமல் விட்டால், உள்நுழைவுத் திரை முதலில் காண்பிக்கப்படும்போது பெரிய இடஞ்சுட்டி முடக்கப்படும். பயனர்களுக்கு இடையில் நிலையாக இருந்தால் பெரிய இடஞ்சுட்டியையும் மற்றும் அதன் நிலையையும் பயனர்கள் எந்த நேரத்திலும் இயக்கலாம் அல்லது முடக்கலாம்.</translation>
+<translation id="5929855945144989709">Chrome OS இல் விர்ச்சுவல் சாதனங்களை இயக்குவதற்கு, சாதனங்களை அனுமதி</translation>
 <translation id="5932767795525445337">Android பயன்பாடுகளைப் பொருத்தவும் இந்தக் கொள்கையைப் பயன்படுத்தலாம்.</translation>
 <translation id="5936622343001856595">Google இணையத் தேடலில் வினவல்கள் செயலாக்கப்பட பாதுகாப்புத் தேடலைச் செயலில் அமைக்க வேண்டும், பயனர்கள் இந்த அமைப்பை மாற்றுவதையும் தடுக்க வேண்டும்.
 
@@ -1661,6 +1680,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> கொள்கையானது RoamingProfileSupportEnabledஐ மீறிச் செயல்பட்டு, எல்லாத் தரவு ஒத்திசைவையும் முடக்கும்.</translation>
 <translation id="6735701345096330595">மொழிகளுக்கான எழுத்துச்சரிபார்ப்பைக் கட்டாயப்படுத்தி இயக்கு</translation>
+<translation id="673699536430961464">இந்த அமைப்பானது பயனர்கள், தங்களின் <ph name="PRODUCT_OS_NAME" /> சாதனத்தில் உள்நுழைந்த பின்னர், அவர்களின் உலாவிச் சாளரத்தின் உள்ளடக்கப் பகுதிக்குள் Google கணக்குகளுக்கு இடையே மாற அனுமதிக்கும்.
+
+      இந்தக் கொள்கை "வேண்டாம்" என அமைக்கப்பட்டால், மறைநிலை அல்லாத உலாவியின் உள்ளடக்கப் பகுதியிலிருந்து வேறு கணக்கில் உள்நுழைவது அனுமதிக்கப்படாது.
+
+      இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ அல்லது "சரி" என அமைக்கப்பட்டாலோ, இயல்புச் செயல்பாடு பயன்படுத்தப்படும்: குழந்தைக் கணக்குகள் தவிர்த்து (மறைநிலை அல்லாத உள்ளடக்கப் பகுதியில் தடுக்கப்படும்) உலாவியின் உள்ளடக்கப் பகுதியிலிருந்து வேறு கணக்கில் உள்நுழைவது அனுமதிக்கப்படும்.
+
+     மறைநிலையில் வேறு கணக்கில் உள்நுழைவது அனுமதிக்கப்படக் கூடாது எனில், IncognitoModeAvailability கொள்கையைப் பயன்படுத்தி அந்த முறையைத் தடுக்கும்படி பரிந்துரைக்கிறோம்.
+
+      தங்கள் குக்கீகளைத் தடுப்பதன் மூலம், அங்கீகரிக்கப்படாத நிலையில் பயனர்களால் Google சேவைகளை அணுக முடியும் என்பதை நினைவில் கொள்ளவும்.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> செருகுநிரலை இயங்க அனுமதிக்கும் தளங்களைக் குறிப்பிடும் url பட்டியலை அமைக்க உங்களை அனுமதிக்கும்.
 
           இந்தக் கொள்கையை அமைக்கவில்லை எனில், இயல்புநிலை மதிப்பு எல்லாத் தளங்களுக்கும் பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு, 'DefaultPluginsSetting' கொள்கையாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) அல்லது பயனரின் தனிப்பட்ட உள்ளமைவாகவோ இருக்கும்.</translation>
@@ -1670,6 +1698,7 @@
 <translation id="6786967369487349613">ரோமிங் சுயவிவரக் கோப்பகத்தை அமை</translation>
 <translation id="6810445994095397827">இந்த தளங்களில் JavaScript ஐத் தடு </translation>
 <translation id="681446116407619279">ஆதரிக்கப்படும் அங்கீகாரத் திட்டங்கள்</translation>
+<translation id="6835883744948188639">மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் அறிவிப்பைப் பயனருக்குக் காட்டு</translation>
 <translation id="685769593149966548">YouTube இல் கண்டிப்புக் கட்டுப்பாட்டுப் பயன்முறையைக் கட்டாயப்படுத்து</translation>
 <translation id="687046793986382807">இந்தக் கொள்கையானது <ph name="PRODUCT_NAME" /> பதிப்பு 35 இல் முடிந்தது.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index c3957ad..f651717 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -126,7 +126,7 @@
 <translation id="1438739959477268107">డిఫాల్ట్ కీ ఉత్పాదన సెట్టింగ్</translation>
 <translation id="1454846751303307294">మిమ్మల్ని JavaScriptను అమలుచేయడానికి అనుమతించని సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేసేందుకు అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలేస్తే 'DefaultJavaScriptSetting'ను సెట్ చేస్తే దాని నుండి లేదా ఇతరత్రా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి సార్వజనీన డిఫాల్ట్ విలువ అన్ని సైట్‌లకు ఉపయోగించబడుతుంది.</translation>
 <translation id="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" /> క్లయింట్‌లు):</translation>
-<translation id="1457305643416399820">పాస్‌వర్డ్ రక్షణ ప్రమాదంలో ఉన్న ఖాతా ఫ్లాగింగ్ ఆఫ్ అయింది</translation>
+<translation id="1457305643416399820">పాస్‌వర్డ్ రక్షణ ప్రమాదంలో ఉన్న ఖాతా ఫ్లాగింగ్ ఆఫ్‌లో ఉంది</translation>
 <translation id="1458547592473993238">ఈ విధానం నిలిపివేయబడింది. దయచేసి Flash ప్లగిన్ యొక్క అందుబాటును నియంత్రించడానికి <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" />ని మరియు PDF ఫైల్‌లను తెరిచేందుకు ఏకీకరించిన PDF వ్యూయర్‌ని ఉపయోగించాలా లేదా అనేది నియంత్రించడానికి <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />ని ఉపయోగించండి.
 
 <ph name="PRODUCT_NAME" />లో ఆపివేయబడిన ప్లగిన్‌ల జాబితాని పేర్కొంటుంది మరియు వినియోగదారులు ఈ సెట్టింగ్‌ని మార్చడాన్ని నిరోధిస్తుంది.
@@ -252,6 +252,7 @@
       విధానాన్ని <ph name="PRODUCT_OS_NAME" /> సేవా నిబంధనలను డౌన్‌లోడ్ చేయగల URLకు సెట్ చేయాలి. సేవా నిబంధనలు MIME రకం వచనం/సాదా అందించబడిన విధంగా సాదా వచనంగా ఉండాలి. మార్కప్ అనుమతించబడదు.</translation>
 <translation id="1750315445671978749">అన్ని డౌన్‌లోడ్‌లను బ్లాక్ చేయి</translation>
 <translation id="1781356041596378058">అలాగే, ఈ విధానం Android డెవలపర్ ఎంపికలకు కూడా ప్రాప్యతను నియంత్రిస్తుంది. మీరు ఈ విధానాన్ని ఒప్పుకి సెట్ చేస్తే, వినియోగదారులు డెవలపర్ ఎంపికలను ప్రాప్యత చేయలేరు. మీరు ఈ విధానాన్ని తప్పుకి సెట్ చేసినా లేదా ఏదీ సెట్ చేయకపోయినా, Android సెట్టింగ్‌ల అనువర్తనంలో బిల్డ్ సంఖ్యపై ఏడుసార్లు నొక్కడం ద్వారా వినియోగదారులు డెవలపర్ ఎంపికలను ప్రాప్యత చేయగలరు.</translation>
+<translation id="1797233582739332495">పునఃప్రారంభం అవసరమని సూచించే పునరావృత ప్రాంప్ట్‌ను వినియోగదారుకు చూపండి</translation>
 <translation id="1803646570632580723">లాంచర్‌లో చూపడానికి పిన్ చేసిన అనువర్తనాల జాబితా</translation>
 <translation id="1808715480127969042">ఈ సైట్‌లలో కుక్కీలని బ్లాక్ చెయ్యి</translation>
 <translation id="1827523283178827583">స్థిర పరిచిన ప్రాక్సీ సర్వర్‌లని ఉపయోగించండి</translation>
@@ -335,6 +336,11 @@
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, మొత్తం నాలుగు స్కీమ్‌లు ఉపయోగించబడతాయి.</translation>
 <translation id="2067011586099792101">కంటెంట్ ప్యాక్‌లకు వెలుపల ఉన్న సైట్‌లకు ప్రాప్యతను బ్లాక్ చేయండి</translation>
+<translation id="2070270043919235595">పెండింగ్‌లో ఉన్న అప్‌డేట్‌ను వర్తింపచేయడానికి <ph name="PRODUCT_NAME" /> పునఃప్రారంభించబడాలని వినియోగదారులకు తెలియజేయండి.
+
+      ఈ విధాన సెట్టింగ్ బ్రౌజర్ పునఃప్రారంభం సిఫార్సు చేయబడిన లేదా అవసరమైనది వినియోగదారుకు తెలియజేయడానికి నోటిఫికేషన్‌లను ప్రారంభిస్తుంది. సెట్ చేయకపోతే, <ph name="PRODUCT_NAME" /> దాని మెనూకు సూక్ష్మ మార్పుల ద్వారా పునఃప్రారంభం అవసరమవుతుందని వినియోగదారుకు సూచిస్తుంది. సిఫార్సు చేయబడినది' అని సెట్ చేసినట్లయితే, ఒక పునరావృత హెచ్చరిక వినియోగదారుకు పునఃప్రారంభం గురించి సిఫార్సు చేయబడుతుంది. పునఃప్రారంభించటానికి వాయిదా వేయడానికి వినియోగదారు ఈ హెచ్చరికను తిరస్కరించవచ్చు. అవసరం' అని సెట్ చేసినట్లయితే, నోటిఫికేషన్ వ్యవధి గడిచినప్పుడు బ్రౌజర్ పునఃప్రారంభం కావచ్చని సూచించే వినియోగదారుకు పునరావృత హెచ్చరిక చూపబడుతుంది. ఈ సమయం డిఫాల్ట్‌గా ఏడు రోజులు, మరియు <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> విధాన సెట్టింగ్ ద్వారా కాన్ఫిగర్ చేయబడవచ్చు.
+
+      పునఃప్రారంభం తరువాత వినియోగదారు యొక్క సెషన్ పునరుద్ధరించబడుతుంది.</translation>
 <translation id="2077129598763517140">హార్డ్‌వేర్ త్వరితం అందుబాటులో ఉన్నప్పుడు ఉపయోగించు</translation>
 <translation id="2077273864382355561">బ్యాటరీ శక్తితో అమలవుతున్నప్పుడు స్క్రీన్ ఆపివేత ఆలస్యం</translation>
 <translation id="2082205219176343977">పరికరం కోసం అనుమతించబడిన కనిష్ట Chrome వెర్షన్‌ని కాన్ఫిగర్ చేయండి.</translation>
@@ -386,6 +392,9 @@
           ఈ సెట్టింగ్ కాన్ఫిగర్ చేస్తే, త్వరిత అన్‌లాక్‌ను ఉపయోగించే వినియోగదారులు ఈ సెట్టింగ్‌పై ఆధారపడి లాక్ స్క్రీన్‌లో వారి పాస్‌వర్డ్‌లను నమోదు చేయమని అభ్యర్థించబడతారు.
 
           ఈ సెట్టింగ్ కాన్ఫిగర్ చేయకుంటే, త్వరిత అన్‌లాక్‌ను ఉపయోగిస్తున్న వినియోగదారులు లాక్ స్క్రీన్‌లో వారి పాస్‌వర్డ్‌ను ప్రతి రోజూ నమోదు చేయమని అభ్యర్థించబడతారు.</translation>
+<translation id="2188722565665306629"><ph name="PRODUCT_NAME" /> పునఃప్రారంభ నోటిఫికేషన్‌లు పెండింగ్‌లో ఉన్న అప్‌డేట్‌ను వర్తింపజేసినట్లు చూపే సమయ వ్యవధిని సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది.
+
+ఈ విధాన సెట్టింగ్ మిల్లీసెకన్లలో, కాల వ్యవధిని నియంత్రించడానికి ఉపయోగించబడుతుంది, పైగా అప్‌డేట్ కోసం <ph name="PRODUCT_NAME" /> పునఃప్రారంభించబడాలి (లేదా <ph name="PRODUCT_OS_NAME" /> పునఃప్రారంభించబడాలి) వినియోగదారుని క్రమక్రమంగా తెలియజేయబడుతుంది. ఈ కాల వ్యవధిలో, <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> విధానం యొక్క సెట్టింగ్ ఆధారంగా అప్‌డేట్ కోసం వినియోగదారుకు పదేపదే తెలియజేయబడుతుంది. సెట్ చేయకపోతే, 604800000 మిల్లీసెకన్లు (ఒక వారం) యొక్క డిఫాల్ట్ కాలం ఉపయోగించబడుతుంది.</translation>
 <translation id="2194470398825717446">ఈ విధానం M61లో నిలిపివేయబడింది, దయచేసి బదులుగా EcryptfsMigrationStrategyని ఉపయోగించండి.
 
       ecryptfsతో పాటు అందించబడిన మరియు ext4 ఎన్‌క్రిప్షన్‌కు మార్పిడి అవసరమైన పరికరం ఎలా ప్రవర్తించాలో నిర్దేశిస్తుంది.
@@ -466,7 +475,7 @@
       ఈ విధానాన్ని మిల్లీసెకన్లలో పేర్కొనాలి.</translation>
 <translation id="237494535617297575">ప్రకటనలను ప్రదర్శించడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలి పెట్టినది అయితే అన్ని సైట్‌లకు సార్వజనీన డిఫాల్ట్ విలువ ఇది సెట్ చేయబడి ఉంటే 'DefaultNotificationsSetting' విధానం నుండి లేదా చేయబడకపోతే వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి ఉపయోగించబడుతుంది.</translation>
 <translation id="2386362615870139244">స్క్రీన్‌ను సాధారణ స్థితికి తీసుకువచ్చే లాక్‌లను అనుమతించండి</translation>
-<translation id="2411817661175306360">పాస్‌వర్డ్ రక్షణ హెచ్చరిక ఆఫ్ అయింది</translation>
+<translation id="2411817661175306360">పాస్‌వర్డ్ రక్షణ హెచ్చరిక ఆఫ్‌లో ఉంది</translation>
 <translation id="2411919772666155530">ఈ సైట్‌లలో ప్రకటనలను నిరోధించండి</translation>
 <translation id="2418507228189425036"><ph name="PRODUCT_NAME" /> బ్రౌజర్ చరిత్రను సేవ్ చేయడం ఆపివేస్తుంది మరియు వినియోగదారులు ఈ సెట్టింగ్‌ను మార్చకుండా నిరోధిస్తుంది.
 
@@ -601,6 +610,13 @@
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" /> ఫైల్‌ల అనువర్తనంలో డిస్క్‌ని నిలిపివేస్తుంది</translation>
 <translation id="268577405881275241">డేటా కుదింపు ప్రాక్సీ లక్షణాన్ని ప్రారంభించండి</translation>
 <translation id="2710534340210290498">ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, వినియోగదారులు స్క్రీన్‌ను లాక్ చేయలేరు (వినియోగదారు సెషన్ నుండి సైన్ అవుట్ చేయడం మాత్రమే సాధ్యమవుతుంది). ఈ సెట్టింగ్‌ను ఒప్పుకు సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలివేస్తే, పాస్‌వర్డ్ కలిగి ఉండే వినియోగదారులు స్క్రీన్‌ను లాక్ చేయగలరు.</translation>
+<translation id="2726613915126661822">Chrome OSలో వర్చువల్ మిషన్‌లను అమలు చేయడానికి అనుమతించాలో లేదో నియంత్రించడానికి మిమ్మల్ని అనుమతిస్తుంది.
+
+      విధానం ఒప్పుకు సెట్ చేస్తే, పరికరం వర్చువల్ మిషన్‌లను అమలు చేయడానికి అనుమతించబడుతుంది.
+      విధానాన్ని తప్పుకు సెట్ చేస్తే, పరికరం వర్చువల్ మిషన్‌లను అమలు చేయడానికి అనుమతించబడదు.
+      ఈ విధానం తప్పుకు మార్చబడినప్పుడు, ఇది కొత్త వర్చువల్ మిషన్‌లను ప్రారంభించటానికి వర్తిస్తుంది కానీ ఇప్పటికే నడుస్తున్న వర్చువల్ మిషన్‌లను షట్ డౌన్ చేయదు.
+      నిర్వహించే పరికరంలో ఈ విధానం సెట్ చేయబడనప్పుడు, పరికరం వర్చువల్ మిషన్‌లను అమలు చేయడానికి అనుమతించబడదు.
+      నిర్వహించని పరికరాలు వర్చువల్ మిషన్‌లను నడపటానికి అనుమతించబడతాయి.</translation>
 <translation id="2731627323327011390">ARC అనువర్తనాలకు <ph name="PRODUCT_OS_NAME" /> ప్రమాణపత్రాల వినియోగాన్ని నిలిపివేయండి</translation>
 <translation id="2742843273354638707">కొత్త ట్యాబ్ పేజీ మరియు <ph name="PRODUCT_OS_NAME" /> అనువర్తన లాంచర్‌లో Chrome వెబ్ స్టోర్ అనువర్తనాన్ని మరియు ఫుటర్ లింక్‌ను దాచిపెడుతుంది.
 
@@ -840,6 +856,7 @@
           ఈ విధానం ఐచ్ఛికం. సెట్ చేయకపోతే, కొత్త ట్యాబ్ పేజీ అందించబడదు.
 
           'DefaultSearchProviderEnabled' విధానం ప్రారంభించబడితే మాత్రమే ఈ విధానం గౌరవించబడుతుంది.</translation>
+<translation id="3465852069254497664">బ్రౌజర్ పునఃప్రారంభం గురించి సిఫార్సు చేయబడిన లేదా అవసరమైన ఒక వినియోగదారుకు తెలియజేయండి</translation>
 <translation id="346731943813722404">సెషన్‌లో ప్రథమ వినియోగదారు కార్యాచరణను గుర్తించిన తర్వాత మాత్రమే శక్తి నిర్వహణ ఆలస్యాలు మరియు సెషన్ వ్యవధి పరిమితి ప్రారంభమవ్వాలంటే పేర్కొంటుంది.
 
           ఈ విధానం ఒప్పుకి సెట్ చేసి ఉంటే, సెషన్‌లో ప్రథమ వినియోగదారు కార్యాచరణ గుర్తించబడే వరకు శక్తి నిర్వహణ ఆలస్యాలు మరియు సెషన్ వ్యవధి పరిమితి అమలు ప్రారంభించబడదు.
@@ -888,6 +905,7 @@
 <translation id="3734995764843493369">పాస్‌వర్డ్ నమోదు ప్రతి రోజు (24 గంటలకు) అవసరమవుతుంది</translation>
 <translation id="3736879847913515635">వినియోగదారు నిర్వాహికిలో వ్యక్తిని జోడించు ఎంపికను ప్రారంభించండి</translation>
 <translation id="3737544779868348650">పరికర నెట్‌వర్క్ హోస్ట్‌పేరు</translation>
+<translation id="3740754010292550733">పునఃప్రారంభం నోటిఫికేషన్‌ల అప్‌డేట్ కోసం వ్యవధిని సెట్ చేయండి</translation>
 <translation id="3750220015372671395">ఈ సైట్‌ల్లో కీ ఉత్పాదనను బ్లాక్ చేయండి</translation>
 <translation id="375266612405883748">ఈ మెషీన్‌లో రిమోట్ ప్రాప్యత హోస్ట్ ద్వారా ఉపయోగించబడే UDP పోర్ట్ పరిధిని పరిమితం చేస్తుంది.
 
@@ -1712,6 +1730,7 @@
           మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు పెద్ద కర్సర్‌ను ప్రారంభించడం లేదా నిలిపివేయడం ద్వారా దీన్ని తాత్కాలికంగా భర్తీ చేయవచ్చు. అయితే, వినియోగదారు ఎంపిక స్థిరమైనది కాదు మరియు లాగిన్ స్క్రీన్‌లో క్రొత్తది చూపబడినప్పుడు లేదా వినియోగదారు నిమిషం పాటు లాగిన్ స్క్రీన్‌లో నిష్క్రియంగా ఉన్నప్పుడు డిఫాల్ట్ స్థితి పునరుద్ధరించబడుతుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, లాగిన్ స్క్రీన్ మొదట చూపబడినప్పుడు పెద్ద కర్సర్ నిలిపివేయబడుతుంది. వినియోగదారులు ఎప్పుడైనా పెద్ద కర్సర్‌ను ప్రారంభించవచ్చు లేదా నిలిపివేయవచ్చు మరియు లాగిన్ స్క్రీన్‌లో దాని స్థితి వినియోగదారులకు స్థిరంగా ఉంటుంది.</translation>
+<translation id="5929855945144989709">Chrome OSలో వర్చువల్ మిషన్‌లను అమలు చేయడానికి పరికరాలను అనుమతించండి</translation>
 <translation id="5932767795525445337">Android యాప్‌లను పిన్ చేసేందుకు కూడా ఈ విధానాన్ని ఉపయోగించవచ్చు.</translation>
 <translation id="5936622343001856595">Google వెబ్ శోధనలో ప్రశ్నలను సురక్షిత శోధనను సక్రియానికి సెట్ చేసి అమలు చేసే విధంగా నిర్బంధిస్తుంది మరియు వినియోగదారులు ఈ సెట్టింగ్‌ను మార్చకుండా నిరోధిస్తుంది.
 
@@ -1968,6 +1987,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> విధానం RoamingProfileSupportEnabledను భర్తీ చేస్తూ మొత్తం డేటా సమకాలీకరణను నిలిపివేస్తుంది.</translation>
 <translation id="6735701345096330595">అక్షరదోష తనిఖీ భాషలను నిర్బంధంగా ప్రారంభించండి</translation>
+<translation id="673699536430961464">ఈ సెట్టింగ్ వలన వినియోగదారులు వారి <ph name="PRODUCT_OS_NAME" /> పరికరంలో సైన్ ఇన్ చేసిన తర్వాత వారి బ్రౌజర్ విండోలలోని కంటెంట్ ప్రదేశంలో Google ఖాతాల మధ్య మారడానికి అనుమతించబడతారు.
+
+      ఒకవేళ ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, అజ్ఞాతేతర బ్రౌజర్ కంటెంట్ ప్రదేశంలో వేరే ఖాతాకు సైన్ ఇన్ చేయడం అనుమతించబడదు.
+
+      ఒకవేళ ఈ విధానాన్ని సెట్ చేయకున్నా లేదా ఒప్పుకు సెట్ చేసినా, డిఫాల్ట్ ప్రవర్తన ఉపయోగించబడుతుంది: బ్రౌజర్ కంటెంట్ ప్రదేశంలో వేరే ఖాతాకు సైన్ ఇన్ చేయడం అనుమతించబడుతుంది, కానీ పిల్లల ఖాతాలకు మాత్రం అనుమతించబడదు, అజ్ఞాతేతర కంటెంట్ ప్రదేశంలో బ్లాక్ చేయబడుతుంది.
+
+      ఒకవేళ అజ్ఞాత మోడ్ ద్వారా వేరే ఖాతాకు సైన్ ఇన్ చేయడం అనుమతించకూడదనుకుంటే, IncognitoModeAvailability విధానాన్ని ఉపయోగించి ఆ మోడ్‌ను నిరోధించడం పరిశీలించండి.
+
+      వినియోగదారులు వారి కుక్కీలను నిరోధించడం ద్వారా ప్రామాణీకరించబడని స్థితిలో Google సేవలను యాక్సెస్ చేయగలరని గమనించండి.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> ప్లగిన్‌ని అమలు చేయడానికి అనుమతి ఉన్న సైట్‌లను పేర్కొనడం కోసం url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుంటే, 'DefaultPluginsSetting' విధానం సెట్ చేయబడి ఉంటే దాని నుండి లేదా వినియోగదారు యొక్క వ్యక్తిగత కాన్ఫిగరేషన్ నుండి సార్వజనీన డిఫాల్ట్ విలువ సైట్‌ల కోసం ఉపయోగించబడుతుంది.</translation>
@@ -1977,6 +2005,7 @@
 <translation id="6786967369487349613">రోమింగ్ ప్రొఫైల్ డైరెక్టరీని సెట్ చేయండి</translation>
 <translation id="6810445994095397827">ఈ సైట్‌లలో JavaScriptని బ్లాక్ చెయ్యి</translation>
 <translation id="681446116407619279">మద్దతిచ్చే ప్రామాణీకరణ పథకాలు</translation>
+<translation id="6835883744948188639">పునఃప్రారంభం సిఫార్సును సూచించే పునరావృత ప్రాంప్ట్‌ను వినియోగదారుకు చూపండి</translation>
 <translation id="685769593149966548">YouTube కోసం ఖచ్చిత పరిమిత మోడ్‌ను అమలు చేయండి</translation>
 <translation id="687046793986382807">ఈ విధానం <ph name="PRODUCT_NAME" /> సంస్కరణ 35కి గడువు ముగిసింది.
 
@@ -2218,7 +2247,7 @@
 <translation id="7529100000224450960">పాపప్‌లను తెరవడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలి పెడితే, అన్ని సైట్‌లకు సార్వజనీన డిఫాల్ట్ విలువ ఇది సెట్ చేయబడి ఉంటే 'DefaultCookiesSetting' విధానం నుండి లేదా చేయబడకపోతే వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి ఉపయోగించబడుతుంది.</translation>
 <translation id="7529144158022474049">స్వీయ నవీకరణ స్కాటర్ కారకం</translation>
 <translation id="7534199150025803530">ఈ విధానం Android Google డిస్క్ అనువర్తనంపై ఎలాంటి ప్రభావం చూపదు. మీరు సెల్యులార్ కనెక్షన్‌ల్లో Google డిస్క్ వినియోగాన్ని నిరోధించాలనుకుంటే, మీరు Android Google డిస్క్ అనువర్తనం యొక్క ఇన్‌స్టాలేషన్‌ను అనుమతించకూడదు.</translation>
-<translation id="7547549430720182663">విలీనం చేయి</translation>
+<translation id="7547549430720182663">విలీనం చేయండి</translation>
 <translation id="7553535237300701827">ఈ విధానం సెట్ చేయబడినప్పుడు, లాగిన్ ప్రామాణీకరణ విధానం సెట్టింగ్‌ విలువపై ఆధారపడి కింద పేర్కొన్న విధానాల్లో ఏదో ఒకదానిలో ఉంటుంది:
 
       GAIAకి సెట్ చేస్తే, లాగిన్ సాధారణ GAIA ప్రామాణీకరణ విధానం ద్వారా చేయబడుతుంది.
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index e1ffefd0..fb8b2be 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -213,6 +213,7 @@
       Politika, <ph name="PRODUCT_OS_NAME" /> tarafından Hizmet Şartları'nın indirilebileceği bir URL'ye ayarlanmalıdır. Hizmet Şartları'nda düz metin kullanılmalı, MIME türü metin/düz olarak sunulmalıdır. Herhangi bir işaretleme kullanılamaz.</translation>
 <translation id="1750315445671978749">Tüm indirmeleri engelle</translation>
 <translation id="1781356041596378058">Ayrıca bu politika Android Geliştirici Seçenekleri'ne erişimi de kontrol eder. Bu politikayı doğru (true) seçeneğine ayarlarsanız kullanıcılar Geliştirici Seçenekleri'ne erişemez. Bu politikayı yanlış (false) seçeneğine ayarlar veya ayarlamadan bırakırsanız kullanıcılar, Android ayarları uygulamasında derleme numarasına yedi kez dokunarak Geliştirici Seçenekleri'ne erişebilir.</translation>
+<translation id="1797233582739332495">Kullanıcıya yeniden başlatmanın gerektiğini belirten yinelenen bir istem gösterme</translation>
 <translation id="1803646570632580723">Başlatıcıda gösterilecek sabitlenmiş uygulamalar listesi</translation>
 <translation id="1808715480127969042">Bu sitelerdeki çerezleri engelle</translation>
 <translation id="1827523283178827583">Sabit proxy sunucuları kullan</translation>
@@ -291,6 +292,11 @@
 
           Bu politika ayarlanmadan bırakılırsa dört şema da kullanılır.</translation>
 <translation id="2067011586099792101">İçerik paketlerinin dışındaki sitelere erişimi engelle</translation>
+<translation id="2070270043919235595">Kullanıcılara, bekleyen bir güncellemeyi uygulamak için <ph name="PRODUCT_NAME" /> uygulamasının yeniden başlatılması gerektiğini bildirin.
+
+      Bu politika ayarı, kullanıcıya tarayıcının yeniden başlatılmasının önerildiği veya gerektiği bilgisini verecek bildirimleri etkinleştirir. Bir değer ayarlanmazsa <ph name="PRODUCT_NAME" />, menüsündeki küçük değişiklikler aracılığıyla kullanıcıya uygulamanın yeniden başlatılması gerektiğini belirtir. "Önerilen" seçeneği ayarlanırsa, kullanıcıya uygulamayı yeniden başlatmasının önerildiği yinelenen bir uyarı ile bildirilir. Kullanıcı, yeniden başlatmayı ertelemek için bu uyarıyı kapatabilir. "Zorunlu" değeri ayarlanırsa kullanıcıya, bildirim dönemi geçtikten sonra tarayıcının yeniden başlatılmasının zorlanacağını belirten yinelenen bir uyarı gösterilir. Bu dönem varsayılan olarak yedi gündür ve <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> politika ayarı aracılığıyla yapılandırılabilir.
+
+      Yeniden başlatmanın ardından kullanıcı oturumu yeniden açılır.</translation>
 <translation id="2077129598763517140">Kullanılabilir olduğunda donanım hızlandırmayı kullan</translation>
 <translation id="2077273864382355561">Pil gücüyle çalışırken ekran kapatma gecikmesi</translation>
 <translation id="2082205219176343977">Cihaz için izin verilen minimum Chrome sürümünü yapılandır.</translation>
@@ -335,6 +341,9 @@
           Bu ayar yapılandırılırsa, hızlı kilit açmayı kullanan kullanıcılardan kilit ekranında şifrelerini bu ayara göre girmeleri istenir.
 
           Bu ayar yapılandırılmazsa, hızlı kilit açmayı kullanan kullanıcılardan kilit ekranında şifrelerini her gün girmeleri istenir.</translation>
+<translation id="2188722565665306629">Bekleyen bir güncellemenin uygulanması için <ph name="PRODUCT_NAME" /> uygulamasını yeniden başlatılmasıyla ilgili bildirimlerin gösterileceği dönemi ayarlamanıza olanak tanır.
+
+      Bu politika ayarı, kullanıcıya bir güncelleme için <ph name="PRODUCT_NAME" /> uygulamasının (veya <ph name="PRODUCT_OS_NAME" /> işletim sisteminin) yeniden başlatılması gerektiği bilgisinin kademeli olarak verileceği dönemi milisaniye cinsinden kontrol etmek için kullanılabilir. Bu dönem boyunca, kullanıcıya <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> politikasının ayarına dayalı olarak bir güncelleme gerektiği konusunda tekrarlanan şekilde bilgi verilir. Bir değer ayarlanmazsa, varsayılan olarak 604.800.000 milisaniye (bir hafta) değeri kullanılır.</translation>
 <translation id="2194470398825717446">Bu politika M61'de kullanımdan kaldırılmıştır, onun yerine lütfen EcryptfsMigrationStrategy'yi kullanın.
 
       Ecryptfs koduyla gönderilen ve ext4 şifrelemesine geçmesi gereken bir cihazın nasıl davranması gerektiğini belirtir.
@@ -537,6 +546,13 @@
           Bu politika, yalnızca 'DefaultSearchProviderEnabled' politikası etkinleştirilirse dikkate alınır.</translation>
 <translation id="2682225790874070339"><ph name="PRODUCT_OS_NAME" />, Files uygulamasında Drive'ı devre dışı bırakır</translation>
 <translation id="268577405881275241">Veri sıkıştırma proxy özelliğini etkinleştir</translation>
+<translation id="2726613915126661822">Chrome OS'te sanal makinelerin çalıştırılmasına izin verilip verilmediğini kontrol etmenize olanak tanır.
+
+      Politika Doğru (True) değerine ayarlanırsa cihazın sanal makineler çalıştırmasına izin verilir.
+      Politika Yanlış (False) değerine ayarlanırsa cihazın sanal makineler çalıştırmasına izin verilmez.
+      Bu politika Yanlış (False) olarak değiştirildiğinde, ayar yeni sanal makinelerin başlatılmasında geçerli olur, ancak halihazırda çalıştırılmakta olan sanal makineleri kapatmaz.
+      Yönetilen bir cihazda bu politika ayarlanmadığında, cihazın sanal makineler çalıştırmasına izin verilmez.
+      Yönetilmeyen cihazların sanal makineler çalıştırmasına izin verilir.</translation>
 <translation id="2731627323327011390">ARC uygulamalarına ilişkin <ph name="PRODUCT_OS_NAME" /> sertifikalarının kullanımını devre dışı bırak</translation>
 <translation id="2742843273354638707">Chrome Web Mağazası uygulamasını ve alt bilgi bağlantısını Yeni Sekme Sayfası'nda ve <ph name="PRODUCT_OS_NAME" /> uygulama başlatıcısında gizle.
 
@@ -757,6 +773,7 @@
           Bu politika isteğe bağlıdır. Ayarlanmazsa hiçbir yeni sekme sayfası sağlanmaz.
 
           Bu politika sadece "DefaultSearchProviderEnabled" politikası etkinleştirilmişse geçerli olur.</translation>
+<translation id="3465852069254497664">Kullanıcıya tarayıcının yeniden başlatılmasının önerildiğini veya gerektiğini bildirme</translation>
 <translation id="346731943813722404">Bir oturumda güç yönetimi gecikmelerinin ve oturum süresi sınırının sadece kullanıcı ilk etkinliğinin gözlenmesinden sonra çalışmaya başlayıp başlamayacağını belirler.
 
           Bu politika Doğru seçeneğine ayarlanırsa bir oturumda güç yönetimi gecikmeleri ve oturum süresi sınırı kullanıcının ilk etkinliğinin gözlenmesine kadar çalışmaya başlamaz.
@@ -790,6 +807,7 @@
 <translation id="3711895659073496551">Askıya al</translation>
 <translation id="3736879847913515635">Kullanıcı yöneticisinde kişi eklemeyi etkinleştir</translation>
 <translation id="3737544779868348650">Cihaz ağı ana makine adı</translation>
+<translation id="3740754010292550733">Güncelleme yeniden başlatma bildirimlerinin dönemini ayarlama</translation>
 <translation id="3750220015372671395">Bu sitelerde anahtar oluşturmayı engelle</translation>
 <translation id="3756011779061588474">Geliştirici modunu engelle</translation>
 <translation id="3758089716224084329"><ph name="PRODUCT_NAME" /> tarafından kullanılan proxy sunucuyu belirtmenize olanak tanır ve kullanıcıların proxy ayarlarını değiştirmelerini önler.
@@ -1523,6 +1541,7 @@
           Bu politikayı ayarlarsanız, kullanıcılar büyük imleci etkinleştirip veya devre dışı bırakıp geçici olarak bu politikayı geçersiz kılabilir. Ancak, kullanıcının seçimi kalıcı değildir ve giriş ekranı yeniden gösterildiğinde veya kullanıcı giriş ekranında bir dakika boşta kalırsa varsayılan değer geri yüklenir.
 
           Bu politika ayarlanmadan bırakılırsa, giriş ekranı ilk kez gösterildiğinde büyük imleç devre dışıdır. Kullanıcılar büyük imleci her zaman etkinleştirebilir veya devre dışı bırakabilir ve giriş ekranındaki imlecin durumu kullanıcılar arasında kalıcıdır.</translation>
+<translation id="5929855945144989709">Cihazların Chrome OS'te sanal makineler çalıştırmasına izin verme</translation>
 <translation id="5932767795525445337">Bu politika, Android uygulamalarını sabitlemek için de kullanılabilir.</translation>
 <translation id="5936622343001856595">Google Web Araması'ndaki sorguların Güvenli Arama etkinleştirilmiş olarak yapılmasını sağlar ve kullanıcıların bu ayarı değiştirmesini önler.
 
@@ -1778,6 +1797,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> politikası, RoamingProfileSupportEnabled'ı geçersiz kılarak tüm veri senkronizasyonunu devre dışı bırakır.</translation>
 <translation id="6735701345096330595">Yazım denetimi dillerini etkinleştirmeye zorla</translation>
+<translation id="673699536430961464">Bu ayar, kullanıcıların <ph name="PRODUCT_OS_NAME" /> cihazlarında oturum açtıktan sonra tarayıcı pencerelerinin içerik alanındaki Google Hesapları arasında geçiş yapmalarına olanak tanır.
+
+      Bu politika yanlış (false) değerine ayarlanırsa, gizli modda olmayan tarayıcı içerik alanından farklı bir hesapta oturum açılmasına izin verilmez.
+
+      Bu politika ayarlanmazsa veya doğru (true) değerine ayarlanırsa, varsayılan davranış kullanılır: Tarayıcı içerik alanından farklı bir hesapta oturum açılmasına izin verilir, ancak çocukların hesaplarında gizli modda olmayan içerik alanından farklı bir hesapta oturum açılamaz.
+
+      Gizli mod kullanılarak farklı bir hesapta oturum açılmasına izin verilmemesi halinde IncognitoModeAvailability politikasını kullanarak ilgili modu engelleme seçeneğini değerlendirebilirsiniz.
+
+       Kullanıcıların, çerezleri engelleyerek kimlik doğrulaması yapmadan Google hizmetlerine erişebileceğini unutmayın.</translation>
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> eklentisini çalıştırmasına izin verilen siteleri belirten URL kalıplarının listesini ayarlamanıza izin verir.
 
           Bu politika ayarlanmadan bırakılırsa tüm siteler için ya "DefaultPluginsSetting" politikasından gelen (ayarlanmışsa) ya da kullanıcının kişisel yapılandırmasından gelen global varsayılan değer kullanılır.</translation>
@@ -1787,6 +1815,7 @@
 <translation id="6786967369487349613">Dolaşım profili dizinini ayarlayın</translation>
 <translation id="6810445994095397827">Bu sitelerde JavaScript'i engelle</translation>
 <translation id="681446116407619279">Desteklenen kimlik doğrulama şemaları</translation>
+<translation id="6835883744948188639">Kullanıcıya yeniden başlatmanın önerildiğini belirten yinelenen bir istem gösterme</translation>
 <translation id="685769593149966548">YouTube için Yüksek Düzey Kısıtlı Mod'u zorunlu kıl</translation>
 <translation id="687046793986382807">Bu politika, <ph name="PRODUCT_NAME" /> sürüm 35 itibarı ile kullanımdan kaldırılmıştır.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index f6a69070..eb356fa 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -195,6 +195,7 @@
       该政策的值应设置为供 <ph name="PRODUCT_OS_NAME" />下载服务条款的网址。该服务条款必须是纯文本,以 MIME 纯文本形式提供,不允许进行任何标记。</translation>
 <translation id="1750315445671978749">拦截所有下载内容</translation>
 <translation id="1781356041596378058">此政策亦用于控制对 Android 开发者选项的访问。如果此政策设为 true,用户将无法访问开发者选项。如果此政策设为 false 或未设置,用户只需在 Android 的“设置”应用中连续点按 7 次版本号即可访问开发者选项。</translation>
+<translation id="1797233582739332495">显示要求用户重新启动浏览器的周期性提示</translation>
 <translation id="1803646570632580723">要在启动程序中显示的固定应用的列表</translation>
 <translation id="1808715480127969042">在这些网站上阻止 Cookie</translation>
 <translation id="1827523283178827583">使用固定的代理服务器</translation>
@@ -267,6 +268,11 @@
 
           如果此政策未设置,系统将使用所有这四种方案。</translation>
 <translation id="2067011586099792101">禁止访问非内容包内的网站</translation>
+<translation id="2070270043919235595">通知用户必须重新启动 <ph name="PRODUCT_NAME" /> 以应用尚未应用的更新。
+
+      此政策设置用于启用建议或要求用户重新启动浏览器的通知功能。如果此政策未设置,<ph name="PRODUCT_NAME" /> 会通过菜单的细微变化来提示用户需要重新启动。如果此政策设为“推荐”,系统将会显示建议用户重新启动浏览器的周期性警告。用户可以关闭该警告来推迟重新启动。如果此政策设为“必须”,系统将会显示周期性警告,以便让用户知道系统将于通知期结束后强制重新启动浏览器。该通知期会默认设为 7 天,不过可以通过 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策设置进行配置。
+
+      浏览器重新启动后,将会恢复用户会话。</translation>
 <translation id="2077129598763517140">使用硬件加速模式(如果可用)</translation>
 <translation id="2077273864382355561">使用电源供电时的屏幕关闭延迟时间</translation>
 <translation id="2082205219176343977">为设备配置允许使用的最低 Chrome 版本。</translation>
@@ -305,6 +311,9 @@
           如果此设置已配置,系统将会根据此设置的值要求那些使用“快速解锁”的用户在锁定屏幕上输入密码。
 
           如果此设置未配置,系统每天都会要求那些使用“快速解锁”的用户在锁定屏幕上输入密码。</translation>
+<translation id="2188722565665306629">可让您设置系统显示 <ph name="PRODUCT_NAME" /> 重新启动通知(提示用户应用尚未应用的更新)的时间段。
+
+      此政策设置可用于控制该时间段的时长(以毫秒为单位),系统将在该时间段内循序渐进地通知用户必须重新启动 <ph name="PRODUCT_NAME" />(或 <ph name="PRODUCT_OS_NAME" />)以进行更新。在该时间段内,系统将会根据 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策的设置重复提示用户需要进行更新。如果此政策未设置,系统将会使用 604800000 毫秒(1 周)的默认时长。</translation>
 <translation id="2194470398825717446">我们在 M61 中弃用了此政策,请改用 EcryptfsMigrationStrategy。
 
       用于指定内置了 ecryptfs 且需要转换为采用 ext4 加密功能的设备的行为方式。
@@ -491,6 +500,13 @@
 <translation id="267596348720209223">指定搜索服务提供商支持的字符编码。编码是指类似于 UTF-8、GB2312 和 ISO-8859-1 的代码页名称,并按此顺序进行尝试。此政策是可选的,如果未设置,将使用默认值 UTF-8。要实施此政策,必须先启用“DefaultSearchProviderEnabled”政策。</translation>
 <translation id="2682225790874070339">在<ph name="PRODUCT_OS_NAME" />的“文件”应用中停用Google云端硬盘</translation>
 <translation id="268577405881275241">启用数据压缩代理功能</translation>
+<translation id="2726613915126661822">可让您控制是否允许在 Chrome 操作系统上运行虚拟机。
+
+      如果此政策设为 True,则设备可以运行虚拟机。
+      如果此政策设为 False,则设备将无法运行虚拟机。
+      当此政策更改为 False 时,将会导致无法启动新的虚拟机,但已在运行的虚拟机将不会被关闭。
+      如果受管理设备上未设置此政策,则设备将无法运行虚拟机。
+      不受管理的设备可以运行虚拟机。</translation>
 <translation id="2731627323327011390">禁止 ARC 应用使用 <ph name="PRODUCT_OS_NAME" /> 证书</translation>
 <translation id="2742843273354638707">在“打开新的标签页”页面和 <ph name="PRODUCT_OS_NAME" />应用启动器中不显示“Chrome 网上应用店”应用和页脚链接。
 
@@ -702,6 +718,7 @@
           该政策为可选政策。如果未设置,将不会提供任何新标签页。
 
           该政策只有在启用了“DefaultSearchProviderEnabled”政策的情况下才有效。</translation>
+<translation id="3465852069254497664">通知用户系统建议或要求重新启动浏览器</translation>
 <translation id="346731943813722404">指定是否仅在会话内察觉到首个用户活动后才开始计算电源管理延迟和会话长度限制。
 
           如果该政策设置为 True,电源管理延迟和会话长度限制将在会话内察觉到首个用户活动后才开始计算。
@@ -735,6 +752,7 @@
 <translation id="3711895659073496551">暂停</translation>
 <translation id="3736879847913515635">允许通过用户管理器添加用户</translation>
 <translation id="3737544779868348650">设备网络主机名</translation>
+<translation id="3740754010292550733">设置显示浏览器重新启动通知(提示用户应用更新)的时间段</translation>
 <translation id="3750220015372671395">禁止在这些网站上使用密钥生成功能</translation>
 <translation id="3756011779061588474">禁止开发者模式</translation>
 <translation id="3758089716224084329">可让您指定 <ph name="PRODUCT_NAME" /> 使用的代理服务器,并禁止用户更改代理设置。
@@ -1391,6 +1409,7 @@
           如果您设置了此政策,那么用户将可通过启用或停用大号光标暂时覆盖此政策。不过,用户选择的设置并不是永久有效的;只要登录屏幕重新显示或用户在登录屏幕上停止操作一段时间,系统即会恢复默认设置。
 
           如果未设置此政策,则登录屏幕初次显示时会停用大号光标。用户可以随时启用或停用大号光标,并且其在登录屏幕上的启用或停用状态对于各用户均有效。</translation>
+<translation id="5929855945144989709">允许设备在 Chrome 操作系统上运行虚拟机</translation>
 <translation id="5932767795525445337">此政策也可用于固定 Android 应用。</translation>
 <translation id="5936622343001856595">在安全搜索被设置为激活的状态下强制在 Google 网页搜索中执行查询,并禁止用户更改此设置。
 
@@ -1630,6 +1649,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> 政策会停用所有数据同步,并会替换 RoamingProfileSupportEnabled。</translation>
 <translation id="6735701345096330595">强制检查语言拼写</translation>
+<translation id="673699536430961464">您可以通过此设置允许用户在登录其 <ph name="PRODUCT_OS_NAME" />设备后从浏览器窗口的内容区域切换 Google 帐号。
+
+      如果此政策设为 false,将不允许用户从处于非无痕模式的浏览器内容区域切换帐号。
+
+      如果此政策设为 true 或未设置,系统将会遵从默认行为:将允许用户从浏览器的内容区域切换帐号(切换到未成年人帐号除外,因为系统将阻止从处于非无痕模式的内容区域登录未成年人帐号)。
+
+      如果不应允许通过无痕模式切换帐号,建议使用 IncognitoModeAvailability 政策屏蔽该模式。
+
+      请注意,通过阻止 Google 服务的 Cookie,用户将能够在未经身份验证的情况下访问 Google 服务。</translation>
 <translation id="6757438632136860443">可让您设置一系列网址格式,以用于指定允许哪些网站运行 <ph name="FLASH_PLUGIN_NAME" /> 插件。
 
           如果未设置此政策,系统将会对所有网站使用“DefaultPluginsSetting”政策中的全局默认值(倘若已设置“DefaultPluginsSetting”政策),或使用用户个人配置中的全局默认值(倘若未设置“DefaultPluginsSetting”政策)。</translation>
@@ -1639,6 +1667,7 @@
 <translation id="6786967369487349613">设置漫游个人资料目录</translation>
 <translation id="6810445994095397827">在这些网站上阻止 JavaScript</translation>
 <translation id="681446116407619279">支持的身份验证方案</translation>
+<translation id="6835883744948188639">显示建议用户重新启动浏览器的周期性提示</translation>
 <translation id="685769593149966548">强制启用 YouTube“严格”受限模式</translation>
 <translation id="687046793986382807">此政策自35版<ph name="PRODUCT_NAME" />起已停止使用。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 99c0ee5..add5bfbb 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -208,6 +208,7 @@
       你需將政策設為可供 <ph name="PRODUCT_OS_NAME" /> 下載《服務條款》的網址。《服務條款》需為純文字內容,以 MIME 類型 text/plain 提供。不允許任何標記。</translation>
 <translation id="1750315445671978749">封鎖所有下載作業</translation>
 <translation id="1781356041596378058">這項政策也可以控制 Android 開發人員選項的存取權。如果將這項政策設為 true,使用者將無法存取開發人員選項。如果將這項政策設為 false 或不予設定,使用者只要在 Android 設定應用程式中輕觸版本號碼 7 次,即可存取開發人員選項。</translation>
+<translation id="1797233582739332495">顯示週期性提示,要求使用者重新啟動瀏覽器</translation>
 <translation id="1803646570632580723">要顯示在啟動器中的固定應用程式清單</translation>
 <translation id="1808715480127969042">封鎖這些網站的 Cookie</translation>
 <translation id="1827523283178827583">使用固定的 Proxy 伺服器</translation>
@@ -280,6 +281,11 @@
 
           如果未設定這項政策,系統將全部採用以上 4 種機制。</translation>
 <translation id="2067011586099792101">禁止存取內容套件以外的網站</translation>
+<translation id="2070270043919235595">通知使用者 <ph name="PRODUCT_NAME" /> 必須重新啟動才能套用待安裝的更新。
+
+      這項政策設定可啟用通知,藉此建議或要求使用者重新啟動瀏覽器。如果不予設定,<ph name="PRODUCT_NAME" /> 會以細微的選單變更讓使用者知道瀏覽器需要重新啟動。如果設為「Recommended」(建議),瀏覽器會定期顯示警告,建議使用者重新啟動。如果不想立即重新啟動,使用者可以關閉這項警告。如果設為「Required」(必要),瀏覽器會定期顯示警告,告知使用者瀏覽器將於通知期過後強制重新啟動。通知期預設為七天,可透過 <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> 政策設定加以設定。
+
+      使用者的工作階段會在瀏覽器重新啟動後恢復。</translation>
 <translation id="2077129598763517140">在可用時使用硬體加速</translation>
 <translation id="2077273864382355561">在電池供電環境下執行時的螢幕關閉延遲時間</translation>
 <translation id="2082205219176343977">設定裝置的最低 Chrome 版本限制。</translation>
@@ -324,6 +330,9 @@
           如果指定這項設定,系統會根據這項設定的值要求快速解鎖功能使用者在鎖定畫面中輸入密碼。
 
           如果未指定這項設定,系統則會每天要求快速解鎖功能使用者在鎖定畫面中輸入密碼。</translation>
+<translation id="2188722565665306629">讓你設定要顯示 <ph name="PRODUCT_NAME" /> 重新啟動通知 (為了套用待安裝的更新) 的時間範圍。
+
+      這項設定可用於控制時間範圍 (以毫秒為單位),透過定期通知讓使用者瞭解 <ph name="PRODUCT_NAME" /> 必須重新啟動 (或者 <ph name="PRODUCT_OS_NAME" />必須重新啟動) 才能套用更新。在此期間內,系統會根據 <ph name="RELAUNCH_NOTIFICATION_POLICY_NAME" /> 政策的設定持續告知使用者必須進行更新。如果不予設定,則會使用 604800000 毫秒 (一週) 做為預設的時間範圍。</translation>
 <translation id="2194470398825717446">M61 已淘汰這項政策,請改用 EcryptfsMigrationStrategy。
 
       針對採用 eCryptfs 檔案系統且需要轉換成 Ext4 加密系統的裝置指定相關行為。
@@ -510,6 +519,13 @@
 <translation id="267596348720209223">指定搜尋引擎支援的字元編碼。編碼就是 UTF-8、GB2312 和 ISO-8859-1 等字碼頁名稱。系統會以提供的順序來測試。這項政策是選擇性的,如果未設定,預設會使用的是 UTF-8。只有在啟用「DefaultSearchProviderEnabled」政策時,系統才會遵循這項政策。</translation>
 <translation id="2682225790874070339">停用 <ph name="PRODUCT_OS_NAME" />「檔案」應用程式中的雲端硬碟</translation>
 <translation id="268577405881275241">啟用資料壓縮 Proxy 功能</translation>
+<translation id="2726613915126661822">讓你控制虛擬機器能否在 Chrome 作業系統上運作。
+
+      如果將這項政策設為 True,裝置將可以執行虛擬機器。
+      如果將這項政策設為 False,裝置將無法執行虛擬機器。
+      當這項政策變更為 False 時,會禁止裝置啟動新的虛擬機器,但不會關閉已在執行中的虛擬機器。
+      在受管理的裝置上,如果不設定這項政策,裝置將無法執行虛擬機器。
+      未受管理的裝置則可執行虛擬機器。</translation>
 <translation id="2731627323327011390">禁止 ARC 應用程式使用「<ph name="PRODUCT_OS_NAME" />」憑證</translation>
 <translation id="2742843273354638707">在新分頁和 <ph name="PRODUCT_OS_NAME" />應用程式啟動畫面中隱藏 Chrome 線上應用程式商店和底端連結。
 
@@ -727,6 +743,7 @@
           這項政策是選擇性的,如果未設定,系統將不會提供新分頁。
 
           只有在啟用「DefaultSearchProviderEnabled」時,系統才會遵循這項政策。</translation>
+<translation id="3465852069254497664">透過通知建議或要求使用者重新啟動瀏覽器</translation>
 <translation id="346731943813722404">指定是否延遲管理電源,以及是否在發現工作階段中產生第一個使用者活動後,才開始執行工作階段長度限制。
 
           如果這項政策設為 True,系統會延遲管理電源,並且在發現工作階段中產生第一個使用者活動後,才會開始執行工作階段長度限制。
@@ -760,6 +777,7 @@
 <translation id="3711895659073496551">暫停</translation>
 <translation id="3736879847913515635">允許在使用者管理工具中新增使用者</translation>
 <translation id="3737544779868348650">裝置網路主機名稱</translation>
+<translation id="3740754010292550733">設定更新重新啟動通知期</translation>
 <translation id="3750220015372671395">禁止在這些網站上使用金鑰產生功能</translation>
 <translation id="3756011779061588474">封鎖開發人員模式</translation>
 <translation id="3758089716224084329">允許你指定 <ph name="PRODUCT_NAME" /> 使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。
@@ -1426,6 +1444,7 @@
           如果你設定了這項政策,使用者可以暫時覆寫這項政策,只要啟用或停用大型游標即可。但使用者的選擇並非永久性,只要系統再次顯示登入畫面或使用者在登入畫面閒置了一段時間,系統就會還原預設值。
 
           如果你未設定這項政策,則系統會在初次顯示登入畫面時停用大型游標。使用者隨時都可以啟用或停用大型游標,而大型游標在登入畫面的狀態則視使用者的選擇而定 (均為永久性)。</translation>
+<translation id="5929855945144989709">允許裝置在 Chrome 作業系統上執行虛擬機器</translation>
 <translation id="5932767795525445337">這項政策也可用於固定 Android 應用程式。</translation>
 <translation id="5936622343001856595">強制啟用安全搜尋服務,處理 Google 網頁搜尋中的查詢,並且防止使用者變更這項設定。
 
@@ -1658,6 +1677,15 @@
 
       <ph name="SYNC_DISABLED_POLICY_NAME" /> 政策會停用所有資料同步處理功能,並覆寫 RoamingProfileSupportEnabled。</translation>
 <translation id="6735701345096330595">強制執行拼字檢查的語言</translation>
+<translation id="673699536430961464">如果啟用這項設定,使用者在登入 <ph name="PRODUCT_OS_NAME" />裝置後,將可在瀏覽器視窗的內容區域中切換 Google 帳戶。
+
+      如果將這項政策設為 false,就無法透過非無痕式瀏覽器內容區域登入其他帳戶。
+
+      如果將這項政策設為 true 或不予設定,就會採用預設行為:使用者可透過瀏覽器內容區域登入其他帳戶,但無法透過非無痕式內容區域登入子帳戶。
+
+      如要禁止透過無痕模式登入其他帳戶,建議你使用 IncognitoModeAvailability 政策封鎖該模式。
+
+      請注意,使用者只要封鎖 Google 服務的 Cookie,即可在未經驗證狀態下存取 Google 服務。</translation>
 <translation id="6757438632136860443">允許你設定網址模式清單,指定允許執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式的網站。
 
           如未設定這項政策,系統會從「DefaultPluginsSetting」政策 (如果有設定的話) 或使用者的個人設定,將通用預設值套用至所有網站。</translation>
@@ -1667,6 +1695,7 @@
 <translation id="6786967369487349613">設定漫遊設定檔目錄</translation>
 <translation id="6810445994095397827">封鎖這些網站的 JavaScript</translation>
 <translation id="681446116407619279">支援的驗證機制</translation>
+<translation id="6835883744948188639">顯示週期性提示,建議使用者重新啟動瀏覽器</translation>
 <translation id="685769593149966548">強制執行高度的 YouTube 嚴格篩選模式</translation>
 <translation id="687046793986382807">我們已於 <ph name="PRODUCT_NAME" /> 35 版中移除這項政策。
 
diff --git a/components/quirks/quirks_manager.cc b/components/quirks/quirks_manager.cc
index f883745..7b927d5f 100644
--- a/components/quirks/quirks_manager.cc
+++ b/components/quirks/quirks_manager.cc
@@ -13,6 +13,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/task_scheduler/task_traits.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/quirks/pref_names.h"
@@ -57,12 +59,11 @@
 
 QuirksManager::QuirksManager(
     std::unique_ptr<Delegate> delegate,
-    scoped_refptr<base::TaskRunner> task_runner,
     PrefService* local_state,
     scoped_refptr<net::URLRequestContextGetter> url_context_getter)
     : waiting_for_login_(true),
       delegate_(std::move(delegate)),
-      task_runner_(task_runner),
+      task_runner_(base::CreateTaskRunnerWithTraits({base::MayBlock()})),
       local_state_(local_state),
       url_context_getter_(url_context_getter),
       weak_ptr_factory_(this) {}
@@ -75,11 +76,10 @@
 // static
 void QuirksManager::Initialize(
     std::unique_ptr<Delegate> delegate,
-    scoped_refptr<base::TaskRunner> task_runner,
     PrefService* local_state,
     scoped_refptr<net::URLRequestContextGetter> url_context_getter) {
-  manager_ = new QuirksManager(std::move(delegate), task_runner, local_state,
-                               url_context_getter);
+  manager_ =
+      new QuirksManager(std::move(delegate), local_state, url_context_getter);
 }
 
 // static
diff --git a/components/quirks/quirks_manager.h b/components/quirks/quirks_manager.h
index d5a90a7..f1ea85de 100644
--- a/components/quirks/quirks_manager.h
+++ b/components/quirks/quirks_manager.h
@@ -78,7 +78,6 @@
 
   static void Initialize(
       std::unique_ptr<Delegate> delegate,
-      scoped_refptr<base::TaskRunner> task_runner,
       PrefService* local_state,
       scoped_refptr<net::URLRequestContextGetter> url_context_getter);
   static void Shutdown();
@@ -118,7 +117,6 @@
 
  private:
   QuirksManager(std::unique_ptr<Delegate> delegate,
-                scoped_refptr<base::TaskRunner> task_runner,
                 PrefService* local_state,
                 scoped_refptr<net::URLRequestContextGetter> url_context_getter);
   ~QuirksManager();
diff --git a/components/safe_browsing/common/BUILD.gn b/components/safe_browsing/common/BUILD.gn
index 1a6203a..71e84fd8 100644
--- a/components/safe_browsing/common/BUILD.gn
+++ b/components/safe_browsing/common/BUILD.gn
@@ -2,15 +2,13 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//chrome/common/features.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 
 source_set("common") {
   sources = [
     "safebrowsing_constants.cc",
     "safebrowsing_constants.h",
-    "safebrowsing_message_generator.cc",
-    "safebrowsing_message_generator.h",
-    "safebrowsing_messages.h",
     "safebrowsing_switches.cc",
     "safebrowsing_switches.h",
     "utils.cc",
@@ -66,4 +64,9 @@
     "//services/network/public/mojom",
     "//url/mojom:url_mojom_gurl",
   ]
+
+  enabled_features = []
+  if (safe_browsing_mode == 1) {
+    enabled_features += [ "full_safe_browsing" ]
+  }
 }
diff --git a/components/safe_browsing/common/safe_browsing.mojom b/components/safe_browsing/common/safe_browsing.mojom
index 6da9d15..02c4ca8 100644
--- a/components/safe_browsing/common/safe_browsing.mojom
+++ b/components/safe_browsing/common/safe_browsing.mojom
@@ -103,3 +103,27 @@
   // Renderer returns part of the DOM to be used in a threat report.
   GetThreatDOMDetails() => (array<ThreatDOMDetailsNode> nodes);
 };
+
+[EnableIf=full_safe_browsing]
+interface PhishingDetector {
+  // Tells the renderer to begin phishing detection for the given toplevel URL
+  // which it has started loading
+  StartPhishingDetection(url.mojom.Url url);
+};
+
+[EnableIf=full_safe_browsing]
+interface PhishingDetectorClient {
+  // Inform the browser that the client-side phishing detector running in the
+  // renderer is done classifying the current URL.  If the URL is phishing
+  // the request proto will have |is_phishing()| set to true.
+  // TODO(noelutz): we may want to create custom ParamTraits for MessageLite to
+  // have a generic way to send protocol messages over IPC.
+  PhishingDetectionDone(string request_proto);
+};
+
+interface PhishingModelSetter {
+  // A classification model for client-side phishing detection.
+  // The string is an encoded safe_browsing::ClientSideModel protocol buffer, or
+  // empty to disable client-side phishing detection for this renderer.
+  SetPhishingModel(string model);
+};
diff --git a/components/safe_browsing/common/safebrowsing_message_generator.cc b/components/safe_browsing/common/safebrowsing_message_generator.cc
deleted file mode 100644
index 0ed1b08..0000000
--- a/components/safe_browsing/common/safebrowsing_message_generator.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.
-
-// Get basic type definitions.
-#define IPC_MESSAGE_IMPL
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-
-// Generate constructors.
-#include "ipc/struct_constructor_macros.h"
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-
-// Generate destructors.
-#include "ipc/struct_destructor_macros.h"
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-
-// Generate param traits write methods.
-#include "ipc/param_traits_write_macros.h"
-namespace IPC {
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-}  // namespace IPC
-
-// Generate param traits read methods.
-#include "ipc/param_traits_read_macros.h"
-namespace IPC {
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-}  // namespace IPC
-
-// Generate param traits log methods.
-#include "ipc/param_traits_log_macros.h"
-namespace IPC {
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
-}  // namespace IPC
diff --git a/components/safe_browsing/common/safebrowsing_message_generator.h b/components/safe_browsing/common/safebrowsing_message_generator.h
deleted file mode 100644
index 8141e6d9c..0000000
--- a/components/safe_browsing/common/safebrowsing_message_generator.h
+++ /dev/null
@@ -1,7 +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.
-
-// Multiply-included file, hence no include guard.
-
-#include "components/safe_browsing/common/safebrowsing_messages.h"
diff --git a/components/safe_browsing/common/safebrowsing_messages.h b/components/safe_browsing/common/safebrowsing_messages.h
deleted file mode 100644
index e7aa6d2..0000000
--- a/components/safe_browsing/common/safebrowsing_messages.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2011 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.
-
-// Multiply-included message file, so no include guard.
-
-#include <stdint.h>
-#include <string>
-#include <vector>
-
-#include "ipc/ipc_message_macros.h"
-#include "url/gurl.h"
-#include "url/ipc/url_param_traits.h"
-
-#define IPC_MESSAGE_START SafeBrowsingMsgStart
-
-#if defined(FULL_SAFE_BROWSING)
-// Inform the browser that the client-side phishing detector running in the
-// renderer is done classifying the current URL.  If the URL is phishing
-// the request proto will have |is_phishing()| set to true.
-// TODO(noelutz): we may want to create custom ParamTraits for MessageLite to
-// have a generic way to send protocol messages over IPC.
-IPC_MESSAGE_ROUTED1(SafeBrowsingHostMsg_PhishingDetectionDone,
-                    std::string /* encoded ClientPhishingRequest proto */)
-#endif
-
-// SafeBrowsing client-side detection messages sent from the browser to the
-// renderer.
-
-#if defined(FULL_SAFE_BROWSING)
-// A classification model for client-side phishing detection.
-// The string is an encoded safe_browsing::ClientSideModel protocol buffer, or
-// empty to disable client-side phishing detection for this renderer.
-IPC_MESSAGE_CONTROL1(SafeBrowsingMsg_SetPhishingModel,
-                     std::string /* encoded ClientSideModel proto */)
-
-// Tells the renderer to begin phishing detection for the given toplevel URL
-// which it has started loading.
-IPC_MESSAGE_ROUTED1(SafeBrowsingMsg_StartPhishingDetection,
-                    GURL)
-#endif
diff --git a/components/sessions/core/base_session_service.cc b/components/sessions/core/base_session_service.cc
index 3e76628..4d113ac 100644
--- a/components/sessions/core/base_session_service.cc
+++ b/components/sessions/core/base_session_service.cc
@@ -133,7 +133,7 @@
   // opportunity to append more commands.
   delegate_->OnWillSaveCommands();
 
-  if (pending_commands_.empty())
+  if (pending_commands_.empty() && !pending_reset_)
     return;
 
   // We create a new vector which will receive all elements from the
diff --git a/components/sessions/core/in_memory_tab_restore_service.cc b/components/sessions/core/in_memory_tab_restore_service.cc
index cdc31f19..bfbf7ae 100644
--- a/components/sessions/core/in_memory_tab_restore_service.cc
+++ b/components/sessions/core/in_memory_tab_restore_service.cc
@@ -46,6 +46,11 @@
   helper_.ClearEntries();
 }
 
+void InMemoryTabRestoreService::DeleteNavigationEntries(
+    const DeletionPredicate& predicate) {
+  helper_.DeleteNavigationEntries(predicate);
+}
+
 const TabRestoreService::Entries& InMemoryTabRestoreService::entries() const {
   return helper_.entries();
 }
diff --git a/components/sessions/core/in_memory_tab_restore_service.h b/components/sessions/core/in_memory_tab_restore_service.h
index c6174c3..b2ca707 100644
--- a/components/sessions/core/in_memory_tab_restore_service.h
+++ b/components/sessions/core/in_memory_tab_restore_service.h
@@ -39,6 +39,7 @@
   void BrowserClosing(LiveTabContext* context) override;
   void BrowserClosed(LiveTabContext* context) override;
   void ClearEntries() override;
+  void DeleteNavigationEntries(const DeletionPredicate& predicate) override;
   const Entries& entries() const override;
   std::vector<LiveTab*> RestoreMostRecentEntry(
       LiveTabContext* context) override;
diff --git a/components/sessions/core/persistent_tab_restore_service.cc b/components/sessions/core/persistent_tab_restore_service.cc
index d074399..13a51be 100644
--- a/components/sessions/core/persistent_tab_restore_service.cc
+++ b/components/sessions/core/persistent_tab_restore_service.cc
@@ -352,6 +352,7 @@
 
   // TabRestoreServiceHelper::Observer:
   void OnClearEntries() override;
+  void OnNavigationEntriesDeleted() override;
   void OnRestoreEntryById(SessionID::id_type id,
                           Entries::const_iterator entry_iterator) override;
   void OnAddEntry() override;
@@ -533,10 +534,16 @@
 
   // Schedule a pending reset so that we nuke the file on next write.
   base_session_service_->set_pending_reset(true);
+  base_session_service_->StartSaveTimer();
+}
 
-  // Schedule a command, otherwise if there are no pending commands Save does
-  // nothing.
-  base_session_service_->ScheduleCommand(CreateRestoredEntryCommand(1));
+void PersistentTabRestoreService::Delegate::OnNavigationEntriesDeleted() {
+  // Rewrite all entries.
+  entries_to_write_ = tab_restore_service_helper_->entries().size();
+
+  // Schedule a pending reset so that we nuke the file on next write.
+  base_session_service_->set_pending_reset(true);
+  base_session_service_->StartSaveTimer();
 }
 
 void PersistentTabRestoreService::Delegate::OnRestoreEntryById(
@@ -1120,6 +1127,12 @@
   helper_.ClearEntries();
 }
 
+void PersistentTabRestoreService::DeleteNavigationEntries(
+    const DeletionPredicate& predicate) {
+  DCHECK(IsLoaded());
+  helper_.DeleteNavigationEntries(predicate);
+}
+
 const TabRestoreService::Entries& PersistentTabRestoreService::entries() const {
   return helper_.entries();
 }
diff --git a/components/sessions/core/persistent_tab_restore_service.h b/components/sessions/core/persistent_tab_restore_service.h
index 9d2eaa86..206ca4ae 100644
--- a/components/sessions/core/persistent_tab_restore_service.h
+++ b/components/sessions/core/persistent_tab_restore_service.h
@@ -35,6 +35,7 @@
   void BrowserClosing(LiveTabContext* context) override;
   void BrowserClosed(LiveTabContext* context) override;
   void ClearEntries() override;
+  void DeleteNavigationEntries(const DeletionPredicate& predicate) override;
   const Entries& entries() const override;
   std::vector<LiveTab*> RestoreMostRecentEntry(
       LiveTabContext* context) override;
diff --git a/components/sessions/core/session_backend.cc b/components/sessions/core/session_backend.cc
index 07a807f9..0f276e1 100644
--- a/components/sessions/core/session_backend.cc
+++ b/components/sessions/core/session_backend.cc
@@ -231,7 +231,8 @@
       !AppendCommandsToFile(current_session_file_.get(), commands)) {
     current_session_file_.reset(nullptr);
   }
-  empty_file_ = false;
+  if (!commands.empty())
+    empty_file_ = false;
 }
 
 void SessionBackend::ReadLastSessionCommands(
diff --git a/components/sessions/core/tab_restore_service.h b/components/sessions/core/tab_restore_service.h
index 47bd404..5a84024 100644
--- a/components/sessions/core/tab_restore_service.h
+++ b/components/sessions/core/tab_restore_service.h
@@ -143,6 +143,8 @@
   };
 
   typedef std::list<std::unique_ptr<Entry>> Entries;
+  typedef base::RepeatingCallback<bool(const SerializedNavigationEntry& entry)>
+      DeletionPredicate;
 
   ~TabRestoreService() override;
 
@@ -169,6 +171,10 @@
   // of tabs has changed.
   virtual void ClearEntries() = 0;
 
+  // Removes all SerializedNavigationEntries matching |predicate| and notifies
+  // observers the list of tabs has changed.
+  virtual void DeleteNavigationEntries(const DeletionPredicate& predicate) = 0;
+
   // Returns the entries, ordered with most recently closed entries at the
   // front.
   virtual const Entries& entries() const = 0;
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc
index a18f3bc..89c61dabad 100644
--- a/components/sessions/core/tab_restore_service_helper.cc
+++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -34,6 +34,8 @@
 
 void TabRestoreServiceHelper::Observer::OnClearEntries() {}
 
+void TabRestoreServiceHelper::Observer::OnNavigationEntriesDeleted() {}
+
 void TabRestoreServiceHelper::Observer::OnRestoreEntryById(
     SessionID::id_type id,
     Entries::const_iterator entry_iterator) {
@@ -140,6 +142,78 @@
   NotifyTabsChanged();
 }
 
+bool TabRestoreServiceHelper::DeleteFromTab(const DeletionPredicate& predicate,
+                                            Tab* tab) {
+  std::vector<SerializedNavigationEntry> new_navigations;
+  int deleted_navigations = 0;
+  for (auto& navigation : tab->navigations) {
+    if (predicate.Run(navigation)) {
+      // If the current navigation is deleted, remove this tab.
+      if (tab->current_navigation_index == navigation.index())
+        return true;
+      deleted_navigations++;
+    } else {
+      // Adjust indices according to number of deleted navigations.
+      if (tab->current_navigation_index == navigation.index())
+        tab->current_navigation_index -= deleted_navigations;
+      navigation.set_index(navigation.index() - deleted_navigations);
+      new_navigations.push_back(std::move(navigation));
+    }
+  }
+  tab->navigations = std::move(new_navigations);
+  DCHECK(tab->navigations.empty() || ValidateTab(*tab));
+  return tab->navigations.empty();
+}
+
+bool TabRestoreServiceHelper::DeleteFromWindow(
+    const DeletionPredicate& predicate,
+    Window* window) {
+  std::vector<std::unique_ptr<Tab>> new_tabs;
+  int deleted_tabs = 0;
+  for (auto& tab : window->tabs) {
+    if (DeleteFromTab(predicate, tab.get())) {
+      if (window->selected_tab_index == tab->tabstrip_index)
+        window->selected_tab_index = 0;
+      deleted_tabs++;
+    } else {
+      // Adjust indices according to number of deleted tabs.
+      if (window->tabs[window->selected_tab_index] == tab)
+        window->selected_tab_index -= deleted_tabs;
+      if (tab->tabstrip_index >= 0)
+        tab->tabstrip_index -= deleted_tabs;
+      new_tabs.push_back(std::move(tab));
+    }
+  }
+  window->tabs = std::move(new_tabs);
+  DCHECK(window->tabs.empty() || ValidateWindow(*window));
+  return window->tabs.empty();
+}
+
+void TabRestoreServiceHelper::DeleteNavigationEntries(
+    const DeletionPredicate& predicate) {
+  Entries new_entries;
+  for (std::unique_ptr<Entry>& entry : entries_) {
+    switch (entry->type) {
+      case TabRestoreService::TAB: {
+        Tab* tab = static_cast<Tab*>(entry.get());
+        if (!DeleteFromTab(predicate, tab))
+          new_entries.push_back(std::move(entry));
+        break;
+      }
+      case TabRestoreService::WINDOW: {
+        Window* window = static_cast<Window*>(entry.get());
+        if (!DeleteFromWindow(predicate, window))
+          new_entries.push_back(std::move(entry));
+        break;
+      }
+    }
+  }
+  entries_ = std::move(new_entries);
+  if (observer_)
+    observer_->OnNavigationEntriesDeleted();
+  NotifyTabsChanged();
+}
+
 const TabRestoreService::Entries& TabRestoreServiceHelper::entries() const {
   return entries_;
 }
diff --git a/components/sessions/core/tab_restore_service_helper.h b/components/sessions/core/tab_restore_service_helper.h
index 1d503b08..abeb588d 100644
--- a/components/sessions/core/tab_restore_service_helper.h
+++ b/components/sessions/core/tab_restore_service_helper.h
@@ -31,6 +31,7 @@
 class SESSIONS_EXPORT TabRestoreServiceHelper
     : public base::trace_event::MemoryDumpProvider {
  public:
+  typedef TabRestoreService::DeletionPredicate DeletionPredicate;
   typedef TabRestoreService::Entries Entries;
   typedef TabRestoreService::Entry Entry;
   typedef TabRestoreService::Tab Tab;
@@ -44,6 +45,9 @@
     // Invoked before the entries are cleared.
     virtual void OnClearEntries();
 
+    // Invoked when navigations from entries have been deleted.
+    virtual void OnNavigationEntriesDeleted();
+
     // Invoked before the entry is restored. |entry_iterator| points to the
     // entry corresponding to the session identified by |id|.
     virtual void OnRestoreEntryById(SessionID::id_type id,
@@ -78,6 +82,8 @@
   void BrowserClosing(LiveTabContext* context);
   void BrowserClosed(LiveTabContext* context);
   void ClearEntries();
+  void DeleteNavigationEntries(const DeletionPredicate& predicate);
+
   const Entries& entries() const;
   std::vector<LiveTab*> RestoreMostRecentEntry(LiveTabContext* context);
   std::unique_ptr<Tab> RemoveTabEntryById(SessionID::id_type id);
@@ -144,6 +150,15 @@
   // Validates all the tabs in a window, plus the window's active tab index.
   static bool ValidateWindow(const Window& window);
 
+  // Removes all navigation entries matching |predicate| from |tab|.
+  // Returns true if |tab| should be deleted because it is empty.
+  static bool DeleteFromTab(const DeletionPredicate& predicate, Tab* tab);
+
+  // Removes all navigation entries matching |predicate| from tabs in |window|.
+  // Returns true if |window| should be deleted because it is empty.
+  static bool DeleteFromWindow(const DeletionPredicate& predicate,
+                               Window* window);
+
   // Returns true if |tab| is one we care about restoring.
   bool IsTabInteresting(const Tab& tab);
 
diff --git a/components/sessions/core/tab_restore_service_observer.h b/components/sessions/core/tab_restore_service_observer.h
index 7ddd644a..96bb9ba 100644
--- a/components/sessions/core/tab_restore_service_observer.h
+++ b/components/sessions/core/tab_restore_service_observer.h
@@ -16,7 +16,7 @@
 class SESSIONS_EXPORT TabRestoreServiceObserver {
  public:
   // Sent when the set of entries changes in some way.
-  virtual void TabRestoreServiceChanged(TabRestoreService* service) = 0;
+  virtual void TabRestoreServiceChanged(TabRestoreService* service) {}
 
   // Sent to all remaining Observers when TabRestoreService's
   // destructor is run.
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 4fd871d..1cbd24a 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -47,7 +47,7 @@
 <translation id="1264126396475825575">S'ha capturat un informe d'error (<ph name="CRASH_TIME" />) (encara no s'ha penjat ni ignorat)</translation>
 <translation id="1270502636509132238">Mètode de recollida</translation>
 <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation>
-<translation id="1294154142200295408">Variacions a la línia d'ordres</translation>
+<translation id="1294154142200295408">Variacions de la línia d'ordres</translation>
 <translation id="129553762522093515">Tancades recentment</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />Esborreu les galetes<ph name="END_LINK" /></translation>
 <translation id="1333989956347591814">És possible que la teva activitat <ph name="BEGIN_EMPHASIS" />continuï sent visible<ph name="END_EMPHASIS" /> en:
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index d012b92..8579203 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -47,7 +47,7 @@
 <translation id="1264126396475825575"><ph name="CRASH_TIME" /> वाजता क्रॅश अहवाल कॅप्चर केला (अद्याप अपलोड केलेला नाही किंवा दुर्लक्ष केले)</translation>
 <translation id="1270502636509132238">घेण्याची पद्धत</translation>
 <translation id="1285320974508926690">या साइटचा कधीही भाषांतर करु नका</translation>
-<translation id="1294154142200295408">कमांड लाइन फरक</translation>
+<translation id="1294154142200295408">विविध कमांड-लाइन</translation>
 <translation id="129553762522093515">अलीकडे बंद केलेले</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />आपल्या कुकीज साफ करून पहा<ph name="END_LINK" /></translation>
 <translation id="1333989956347591814">आपले पुढील क्रियाकलाप <ph name="BEGIN_EMPHASIS" />अद्याप दिसतील<ph name="END_EMPHASIS" />:
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 5e0653b..83d34de 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -1027,7 +1027,7 @@
 <translation id="9039213469156557790">Ta strona zawiera także niezabezpieczone zasoby. Podczas przesyłania mogą je wyświetlić inni użytkownicy, a osoby atakujące mogą je zmodyfikować, by zmienić sposób działania strony.</translation>
 <translation id="9049981332609050619">Podjęto próbę nawiązania połączenia z witryną <ph name="DOMAIN" />, jednak serwer przedstawił nieprawidłowy certyfikat.</translation>
 <translation id="9050666287014529139">Hasło</translation>
-<translation id="9065203028668620118">Edycja</translation>
+<translation id="9065203028668620118">Edytuj</translation>
 <translation id="9069693763241529744">Zablokowane przez rozszerzenie</translation>
 <translation id="9076283476770535406">Może zawierać treści dla dorosłych</translation>
 <translation id="9078964945751709336">Potrzebujemy więcej informacji</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index c0801fb..0594ba43d 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -47,7 +47,7 @@
 <translation id="1264126396475825575">當機報告擷取時間:<ph name="CRASH_TIME" /> (尚未上傳或略過)</translation>
 <translation id="1270502636509132238">取件方式</translation>
 <translation id="1285320974508926690">一律不翻譯此網站</translation>
-<translation id="1294154142200295408">指令列變化版本</translation>
+<translation id="1294154142200295408">命令列變化版本</translation>
 <translation id="129553762522093515">最近關閉的分頁</translation>
 <translation id="129863573139666797"><ph name="BEGIN_LINK" />試試看清除 Cookie<ph name="END_LINK" /></translation>
 <translation id="1333989956347591814">以下各方<ph name="BEGIN_EMPHASIS" />可能仍會看到<ph name="END_EMPHASIS" />你的活動:
diff --git a/components/sync_sessions/BUILD.gn b/components/sync_sessions/BUILD.gn
index b251775a..8752d9a 100644
--- a/components/sync_sessions/BUILD.gn
+++ b/components/sync_sessions/BUILD.gn
@@ -11,6 +11,8 @@
     "lost_navigations_recorder.h",
     "open_tabs_ui_delegate.cc",
     "open_tabs_ui_delegate.h",
+    "open_tabs_ui_delegate_impl.cc",
+    "open_tabs_ui_delegate_impl.h",
     "session_data_type_controller.cc",
     "session_data_type_controller.h",
     "sessions_global_id_mapper.cc",
@@ -19,8 +21,6 @@
     "sessions_sync_manager.h",
     "sync_sessions_client.cc",
     "sync_sessions_client.h",
-    "sync_sessions_metrics.cc",
-    "sync_sessions_metrics.h",
     "synced_session.cc",
     "synced_session.h",
     "synced_session_tracker.cc",
@@ -57,8 +57,8 @@
 static_library("test_support") {
   testonly = true
   sources = [
-    "fake_sync_sessions_client.cc",
-    "fake_sync_sessions_client.h",
+    "mock_sync_sessions_client.cc",
+    "mock_sync_sessions_client.h",
     "session_sync_test_helper.cc",
     "session_sync_test_helper.h",
   ]
@@ -67,6 +67,7 @@
     ":sync_sessions",
     "//base",
     "//components/sync",
+    "//testing/gmock",
     "//testing/gtest",
     "//url",
   ]
@@ -79,10 +80,10 @@
   sources = [
     "favicon_cache_unittest.cc",
     "lost_navigations_recorder_unittest.cc",
+    "open_tabs_ui_delegate_impl_unittest.cc",
     "session_data_type_controller_unittest.cc",
     "sessions_global_id_mapper_unittest.cc",
     "sessions_sync_manager_unittest.cc",
-    "sync_sessions_metrics_unittest.cc",
     "synced_session_tracker_unittest.cc",
     "tab_node_pool_unittest.cc",
     "task_tracker_unittest.cc",
diff --git a/components/sync_sessions/fake_sync_sessions_client.cc b/components/sync_sessions/fake_sync_sessions_client.cc
deleted file mode 100644
index 3ef4ae0..0000000
--- a/components/sync_sessions/fake_sync_sessions_client.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync_sessions/fake_sync_sessions_client.h"
-#include "components/sync_sessions/local_session_event_router.h"
-
-#include "url/gurl.h"
-
-namespace sync_sessions {
-
-FakeSyncSessionsClient::FakeSyncSessionsClient() {}
-FakeSyncSessionsClient::~FakeSyncSessionsClient() {}
-
-bookmarks::BookmarkModel* FakeSyncSessionsClient::GetBookmarkModel() {
-  return nullptr;
-}
-
-favicon::FaviconService* FakeSyncSessionsClient::GetFaviconService() {
-  return nullptr;
-}
-
-history::HistoryService* FakeSyncSessionsClient::GetHistoryService() {
-  return nullptr;
-}
-
-bool FakeSyncSessionsClient::ShouldSyncURL(const GURL& url) const {
-  return url.is_valid();
-}
-
-SyncedWindowDelegatesGetter*
-FakeSyncSessionsClient::GetSyncedWindowDelegatesGetter() {
-  return nullptr;
-}
-
-LocalSessionEventRouter* FakeSyncSessionsClient::GetLocalSessionEventRouter() {
-  return nullptr;
-}
-
-}  // namespace sync_sessions
diff --git a/components/sync_sessions/fake_sync_sessions_client.h b/components/sync_sessions/fake_sync_sessions_client.h
deleted file mode 100644
index acffdce..0000000
--- a/components/sync_sessions/fake_sync_sessions_client.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_SESSIONS_FAKE_SYNC_SESSIONS_CLIENT_H_
-#define COMPONENTS_SYNC_SESSIONS_FAKE_SYNC_SESSIONS_CLIENT_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "components/sync_sessions/sync_sessions_client.h"
-
-namespace sync_sessions {
-
-// Fake implementation of a SyncSessionsClient for testing.
-class FakeSyncSessionsClient : public SyncSessionsClient {
- public:
-  FakeSyncSessionsClient();
-  ~FakeSyncSessionsClient() override;
-
-  // SyncSessionsClient:
-  bookmarks::BookmarkModel* GetBookmarkModel() override;
-  favicon::FaviconService* GetFaviconService() override;
-  history::HistoryService* GetHistoryService() override;
-  bool ShouldSyncURL(const GURL& url) const override;
-  SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() override;
-  LocalSessionEventRouter* GetLocalSessionEventRouter() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FakeSyncSessionsClient);
-};
-
-}  // namespace sync_sessions
-
-#endif  // COMPONENTS_SYNC_SESSIONS_FAKE_SYNC_SESSIONS_CLIENT_H_
diff --git a/components/sync_sessions/mock_sync_sessions_client.cc b/components/sync_sessions/mock_sync_sessions_client.cc
new file mode 100644
index 0000000..d6bc31e
--- /dev/null
+++ b/components/sync_sessions/mock_sync_sessions_client.cc
@@ -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.
+
+#include "components/sync_sessions/mock_sync_sessions_client.h"
+#include "components/sync_sessions/local_session_event_router.h"
+
+namespace sync_sessions {
+
+MockSyncSessionsClient::MockSyncSessionsClient() {
+  ON_CALL(*this, ShouldSyncURL(testing::_))
+      .WillByDefault(testing::Return(true));
+}
+
+MockSyncSessionsClient::~MockSyncSessionsClient() {}
+
+}  // namespace sync_sessions
diff --git a/components/sync_sessions/mock_sync_sessions_client.h b/components/sync_sessions/mock_sync_sessions_client.h
new file mode 100644
index 0000000..c2c20c5
--- /dev/null
+++ b/components/sync_sessions/mock_sync_sessions_client.h
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SYNC_SESSIONS_MOCK_SYNC_SESSIONS_CLIENT_H_
+#define COMPONENTS_SYNC_SESSIONS_MOCK_SYNC_SESSIONS_CLIENT_H_
+
+#include "components/sync_sessions/sync_sessions_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "url/gurl.h"
+
+namespace sync_sessions {
+
+class MockSyncSessionsClient : public SyncSessionsClient {
+ public:
+  // By default, ShouldSyncURL() always returns true.
+  MockSyncSessionsClient();
+  ~MockSyncSessionsClient() override;
+
+  MOCK_METHOD0(GetBookmarkModel, bookmarks::BookmarkModel*());
+  MOCK_METHOD0(GetFaviconService, favicon::FaviconService*());
+  MOCK_METHOD0(GetHistoryService, history::HistoryService*());
+  MOCK_CONST_METHOD1(ShouldSyncURL, bool(const GURL& url));
+  MOCK_METHOD0(GetSyncedWindowDelegatesGetter, SyncedWindowDelegatesGetter*());
+  MOCK_METHOD0(GetLocalSessionEventRouter, LocalSessionEventRouter*());
+};
+
+}  // namespace sync_sessions
+
+#endif  // COMPONENTS_SYNC_SESSIONS_MOCK_SYNC_SESSIONS_CLIENT_H_
diff --git a/components/sync_sessions/open_tabs_ui_delegate_impl.cc b/components/sync_sessions/open_tabs_ui_delegate_impl.cc
new file mode 100644
index 0000000..8295bbe8
--- /dev/null
+++ b/components/sync_sessions/open_tabs_ui_delegate_impl.cc
@@ -0,0 +1,112 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/sync_sessions/open_tabs_ui_delegate_impl.h"
+
+#include <algorithm>
+
+#include "components/sync_sessions/favicon_cache.h"
+#include "components/sync_sessions/sync_sessions_client.h"
+#include "components/sync_sessions/synced_session_tracker.h"
+
+namespace sync_sessions {
+namespace {
+
+// Comparator function for use with std::sort that will sort tabs by
+// descending timestamp (i.e., most recent first).
+bool TabsRecencyComparator(const sessions::SessionTab* t1,
+                           const sessions::SessionTab* t2) {
+  return t1->timestamp > t2->timestamp;
+}
+
+// Comparator function for use with std::sort that will sort sessions by
+// descending modified_time (i.e., most recent first).
+bool SessionsRecencyComparator(const SyncedSession* s1,
+                               const SyncedSession* s2) {
+  return s1->modified_time > s2->modified_time;
+}
+
+}  // namespace
+
+OpenTabsUIDelegateImpl::OpenTabsUIDelegateImpl(
+    const SyncSessionsClient* sessions_client,
+    const SyncedSessionTracker* session_tracker,
+    const FaviconCache* favicon_cache,
+    const DeleteForeignSessionCallback& delete_foreign_session_cb)
+    : sessions_client_(sessions_client),
+      session_tracker_(session_tracker),
+      favicon_cache_(favicon_cache),
+      delete_foreign_session_cb_(delete_foreign_session_cb) {}
+
+OpenTabsUIDelegateImpl::~OpenTabsUIDelegateImpl() {}
+
+bool OpenTabsUIDelegateImpl::GetSyncedFaviconForPageURL(
+    const std::string& page_url,
+    scoped_refptr<base::RefCountedMemory>* favicon_png) const {
+  return favicon_cache_->GetSyncedFaviconForPageURL(GURL(page_url),
+                                                    favicon_png);
+}
+
+bool OpenTabsUIDelegateImpl::GetAllForeignSessions(
+    std::vector<const SyncedSession*>* sessions) {
+  if (!session_tracker_->LookupAllForeignSessions(
+          sessions, SyncedSessionTracker::PRESENTABLE))
+    return false;
+  std::sort(sessions->begin(), sessions->end(), SessionsRecencyComparator);
+  return true;
+}
+
+bool OpenTabsUIDelegateImpl::GetForeignSession(
+    const std::string& tag,
+    std::vector<const sessions::SessionWindow*>* windows) {
+  return session_tracker_->LookupSessionWindows(tag, windows);
+}
+
+bool OpenTabsUIDelegateImpl::GetForeignTab(const std::string& tag,
+                                           const SessionID::id_type tab_id,
+                                           const sessions::SessionTab** tab) {
+  const sessions::SessionTab* synced_tab = nullptr;
+  bool success = session_tracker_->LookupSessionTab(tag, tab_id, &synced_tab);
+  if (success)
+    *tab = synced_tab;
+  return success;
+}
+
+bool OpenTabsUIDelegateImpl::GetForeignSessionTabs(
+    const std::string& tag,
+    std::vector<const sessions::SessionTab*>* tabs) {
+  std::vector<const sessions::SessionWindow*> windows;
+  if (!session_tracker_->LookupSessionWindows(tag, &windows))
+    return false;
+
+  // Prune those tabs that are not syncable or are NewTabPage, then sort them
+  // from most recent to least recent, independent of which window the tabs were
+  // from.
+  for (size_t j = 0; j < windows.size(); ++j) {
+    const sessions::SessionWindow* window = windows[j];
+    for (size_t t = 0; t < window->tabs.size(); ++t) {
+      sessions::SessionTab* const tab = window->tabs[t].get();
+      if (tab->navigations.empty())
+        continue;
+      const sessions::SerializedNavigationEntry& current_navigation =
+          tab->navigations.at(tab->normalized_navigation_index());
+      if (!sessions_client_->ShouldSyncURL(current_navigation.virtual_url()))
+        continue;
+      tabs->push_back(tab);
+    }
+  }
+  std::sort(tabs->begin(), tabs->end(), TabsRecencyComparator);
+  return true;
+}
+
+void OpenTabsUIDelegateImpl::DeleteForeignSession(const std::string& tag) {
+  delete_foreign_session_cb_.Run(tag);
+}
+
+bool OpenTabsUIDelegateImpl::GetLocalSession(
+    const SyncedSession** local_session) {
+  return session_tracker_->LookupLocalSession(local_session);
+}
+
+}  // namespace sync_sessions
diff --git a/components/sync_sessions/open_tabs_ui_delegate_impl.h b/components/sync_sessions/open_tabs_ui_delegate_impl.h
new file mode 100644
index 0000000..3c69844
--- /dev/null
+++ b/components/sync_sessions/open_tabs_ui_delegate_impl.h
@@ -0,0 +1,63 @@
+// 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_SYNC_SESSIONS_OPEN_TABS_UI_DELEGATE_IMPL_H_
+#define COMPONENTS_SYNC_SESSIONS_OPEN_TABS_UI_DELEGATE_IMPL_H_
+
+#include <string>
+#include <vector>
+
+#include "components/sync_sessions/open_tabs_ui_delegate.h"
+
+namespace sync_sessions {
+
+class FaviconCache;
+class SyncSessionsClient;
+class SyncedSessionTracker;
+
+class OpenTabsUIDelegateImpl : public OpenTabsUIDelegate {
+ public:
+  using DeleteForeignSessionCallback =
+      base::RepeatingCallback<void(const std::string&)>;
+
+  // |sessions_client|, |session_tracker| and |favicon_cache| must not be null
+  // and must outlive this object. |delete_foreign_session_cb| allows to
+  // forward calls to DeleteForeignSession() which this class doesn't implement.
+  OpenTabsUIDelegateImpl(
+      const SyncSessionsClient* sessions_client,
+      const SyncedSessionTracker* session_tracker,
+      const FaviconCache* favicon_cache,
+      const DeleteForeignSessionCallback& delete_foreign_session_cb);
+  ~OpenTabsUIDelegateImpl() override;
+
+  // OpenTabsUIDelegate implementation.
+  bool GetSyncedFaviconForPageURL(
+      const std::string& pageurl,
+      scoped_refptr<base::RefCountedMemory>* favicon_png) const override;
+  bool GetAllForeignSessions(
+      std::vector<const SyncedSession*>* sessions) override;
+  bool GetForeignSession(
+      const std::string& tag,
+      std::vector<const sessions::SessionWindow*>* windows) override;
+  bool GetForeignTab(const std::string& tag,
+                     SessionID::id_type tab_id,
+                     const sessions::SessionTab** tab) override;
+  bool GetForeignSessionTabs(
+      const std::string& tag,
+      std::vector<const sessions::SessionTab*>* tabs) override;
+  void DeleteForeignSession(const std::string& tag) override;
+  bool GetLocalSession(const SyncedSession** local_session) override;
+
+ private:
+  const SyncSessionsClient* const sessions_client_;
+  const SyncedSessionTracker* session_tracker_;
+  const FaviconCache* favicon_cache_;
+  DeleteForeignSessionCallback delete_foreign_session_cb_;
+
+  DISALLOW_COPY_AND_ASSIGN(OpenTabsUIDelegateImpl);
+};
+
+}  // namespace sync_sessions
+
+#endif  // COMPONENTS_SYNC_SESSIONS_OPEN_TABS_UI_DELEGATE_IMPL_H_
diff --git a/components/sync_sessions/open_tabs_ui_delegate_impl_unittest.cc b/components/sync_sessions/open_tabs_ui_delegate_impl_unittest.cc
new file mode 100644
index 0000000..6859f26
--- /dev/null
+++ b/components/sync_sessions/open_tabs_ui_delegate_impl_unittest.cc
@@ -0,0 +1,174 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/sync_sessions/open_tabs_ui_delegate_impl.h"
+
+#include <vector>
+
+#include "base/time/time.h"
+#include "components/sessions/core/serialized_navigation_entry_test_helper.h"
+#include "components/sync_sessions/mock_sync_sessions_client.h"
+#include "components/sync_sessions/synced_session_tracker.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace sync_sessions {
+namespace {
+
+using sessions::SessionTab;
+using testing::ElementsAre;
+using testing::Field;
+using testing::Pointee;
+using testing::Property;
+
+const char kSessionTag1[] = "foreign1";
+const char kSessionTag2[] = "foreign2";
+const char kSessionTag3[] = "foreign3";
+const SessionID::id_type kWindowId1 = 1;
+const SessionID::id_type kWindowId2 = 2;
+const SessionID::id_type kWindowId3 = 3;
+const SessionID::id_type kTabId1 = 111;
+const SessionID::id_type kTabId2 = 222;
+const SessionID::id_type kTabId3 = 333;
+
+void IngnoreForeignSessionDeletion(const std::string& session_tag) {}
+
+class OpenTabsUIDelegateImplTest : public testing::Test {
+ protected:
+  OpenTabsUIDelegateImplTest()
+      : session_tracker_(&mock_sync_sessions_client_),
+        delegate_(&mock_sync_sessions_client_,
+                  &session_tracker_,
+                  /*favicon_cache=*/nullptr,
+                  base::BindRepeating(&IngnoreForeignSessionDeletion)) {}
+
+  testing::NiceMock<MockSyncSessionsClient> mock_sync_sessions_client_;
+  SyncedSessionTracker session_tracker_;
+  OpenTabsUIDelegateImpl delegate_;
+};
+
+TEST_F(OpenTabsUIDelegateImplTest, ShouldSortSessions) {
+  const base::Time kTime0 = base::Time::Now();
+
+  // Create three sessions, with one window and tab each.
+  session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
+  session_tracker_.GetTab(kSessionTag1, kTabId1)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url1", "title1"));
+  session_tracker_.GetSession(kSessionTag1)->modified_time =
+      kTime0 + base::TimeDelta::FromSeconds(3);
+
+  session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
+  session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
+  session_tracker_.GetTab(kSessionTag2, kTabId2)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url2", "title2"));
+  session_tracker_.GetSession(kSessionTag2)->modified_time =
+      kTime0 + base::TimeDelta::FromSeconds(1);
+
+  session_tracker_.PutWindowInSession(kSessionTag3, kWindowId3);
+  session_tracker_.PutTabInWindow(kSessionTag3, kWindowId3, kTabId3);
+  session_tracker_.GetTab(kSessionTag3, kTabId3)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url3", "title3"));
+  session_tracker_.GetSession(kSessionTag3)->modified_time =
+      kTime0 + base::TimeDelta::FromSeconds(2);
+
+  std::vector<const SyncedSession*> sessions;
+  EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
+  EXPECT_THAT(sessions,
+              ElementsAre(Field(&SyncedSession::session_tag, kSessionTag1),
+                          Field(&SyncedSession::session_tag, kSessionTag3),
+                          Field(&SyncedSession::session_tag, kSessionTag2)));
+}
+
+TEST_F(OpenTabsUIDelegateImplTest, ShouldSortTabs) {
+  const base::Time kTime0 = base::Time::Now();
+  session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
+  session_tracker_.PutWindowInSession(kSessionTag1, kWindowId2);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId2, kTabId2);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId2, kTabId3);
+
+  sessions::SessionTab* tab1 = session_tracker_.GetTab(kSessionTag1, kTabId1);
+  tab1->navigations.push_back(
+      sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+          "http://url1", "title1"));
+  tab1->timestamp = kTime0 + base::TimeDelta::FromSeconds(3);
+
+  sessions::SessionTab* tab2 = session_tracker_.GetTab(kSessionTag1, kTabId2);
+  tab2->navigations.push_back(
+      sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+          "http://url1", "title1"));
+  tab2->timestamp = kTime0 + base::TimeDelta::FromSeconds(1);
+
+  sessions::SessionTab* tab3 = session_tracker_.GetTab(kSessionTag1, kTabId3);
+  tab3->navigations.push_back(
+      sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+          "http://url1", "title1"));
+  tab3->timestamp = kTime0 + base::TimeDelta::FromSeconds(2);
+
+  std::vector<const SessionTab*> tabs;
+  EXPECT_TRUE(delegate_.GetForeignSessionTabs(kSessionTag1, &tabs));
+  EXPECT_THAT(tabs,
+              ElementsAre(Pointee(Field(&SessionTab::tab_id,
+                                        Property(&SessionID::id, kTabId1))),
+                          Pointee(Field(&SessionTab::tab_id,
+                                        Property(&SessionID::id, kTabId3))),
+                          Pointee(Field(&SessionTab::tab_id,
+                                        Property(&SessionID::id, kTabId2)))));
+}
+
+TEST_F(OpenTabsUIDelegateImplTest, ShouldSkipNonPresentable) {
+  // Create two sessions, with one window and tab each, but only the second
+  // contains a navigation.
+  session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
+  session_tracker_.GetTab(kSessionTag1, kTabId1);
+
+  session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
+  session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
+  session_tracker_.GetTab(kSessionTag2, kTabId2)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url2", "title2"));
+
+  std::vector<const SyncedSession*> sessions;
+  EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
+  EXPECT_THAT(sessions,
+              ElementsAre(Field(&SyncedSession::session_tag, kSessionTag2)));
+}
+
+TEST_F(OpenTabsUIDelegateImplTest, ShouldSkipNonSyncableTabs) {
+  ON_CALL(mock_sync_sessions_client_, ShouldSyncURL(GURL("http://url1")))
+      .WillByDefault(testing::Return(false));
+
+  // Create two sessions, with one window and tab each. The first of the two
+  // contains a URL that should not be synced.
+  session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
+  session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
+  session_tracker_.GetTab(kSessionTag1, kTabId1)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url1", "title1"));
+
+  session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
+  session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
+  session_tracker_.GetTab(kSessionTag2, kTabId2)
+      ->navigations.push_back(
+          sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
+              "http://url2", "title2"));
+
+  std::vector<const SyncedSession*> sessions;
+  EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
+  EXPECT_THAT(sessions,
+              ElementsAre(Field(&SyncedSession::session_tag, kSessionTag2)));
+}
+
+}  // namespace
+}  // namespace sync_sessions
diff --git a/components/sync_sessions/session_data_type_controller_unittest.cc b/components/sync_sessions/session_data_type_controller_unittest.cc
index befdf25..c265124 100644
--- a/components/sync_sessions/session_data_type_controller_unittest.cc
+++ b/components/sync_sessions/session_data_type_controller_unittest.cc
@@ -19,7 +19,7 @@
 #include "components/sync/device_info/local_device_info_provider_mock.h"
 #include "components/sync/driver/fake_sync_client.h"
 #include "components/sync/driver/sync_api_component_factory_mock.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
+#include "components/sync_sessions/mock_sync_sessions_client.h"
 #include "components/sync_sessions/synced_window_delegate.h"
 #include "components/sync_sessions/synced_window_delegates_getter.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -82,21 +82,6 @@
   SyncedWindowDelegateMap delegates_;
 };
 
-class TestSyncSessionsClient : public FakeSyncSessionsClient {
- public:
-  SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() override {
-    return synced_window_getter_;
-  }
-
-  void SetSyncedWindowDelegatesGetter(
-      SyncedWindowDelegatesGetter* synced_window_getter) {
-    synced_window_getter_ = synced_window_getter;
-  }
-
- private:
-  SyncedWindowDelegatesGetter* synced_window_getter_;
-};
-
 class SessionDataTypeControllerTest : public testing::Test,
                                       public syncer::FakeSyncClient {
  public:
@@ -110,7 +95,7 @@
   PrefService* GetPrefService() override { return &prefs_; }
 
   SyncSessionsClient* GetSyncSessionsClient() override {
-    return sync_sessions_client_.get();
+    return &mock_sync_sessions_client_;
   }
 
   void SetUp() override {
@@ -119,10 +104,10 @@
 
     synced_window_delegate_ = std::make_unique<MockSyncedWindowDelegate>();
     synced_window_getter_ = std::make_unique<MockSyncedWindowDelegatesGetter>();
-    sync_sessions_client_ = std::make_unique<TestSyncSessionsClient>();
     synced_window_getter_->Add(synced_window_delegate_.get());
-    sync_sessions_client_->SetSyncedWindowDelegatesGetter(
-        synced_window_getter_.get());
+
+    ON_CALL(mock_sync_sessions_client_, GetSyncedWindowDelegatesGetter())
+        .WillByDefault(testing::Return(synced_window_getter_.get()));
 
     local_device_ = std::make_unique<LocalDeviceInfoProviderMock>(
         "cache_guid", "Wayne Gretzky's Hacking Box", "Chromium 10k",
@@ -188,7 +173,7 @@
   std::unique_ptr<MockSyncedWindowDelegate> synced_window_delegate_;
   std::unique_ptr<MockSyncedWindowDelegatesGetter> synced_window_getter_;
   syncer::SyncApiComponentFactoryMock profile_sync_factory_;
-  std::unique_ptr<TestSyncSessionsClient> sync_sessions_client_;
+  testing::NiceMock<MockSyncSessionsClient> mock_sync_sessions_client_;
   std::unique_ptr<LocalDeviceInfoProviderMock> local_device_;
   std::unique_ptr<SessionDataTypeController> controller_;
 
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc
index cb6b9d6..e4970c8d 100644
--- a/components/sync_sessions/sessions_sync_manager.cc
+++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -50,20 +50,6 @@
 // stale and becomes a candidate for garbage collection.
 const int kDefaultStaleSessionThresholdDays = 14;  // 2 weeks.
 
-// Comparator function for use with std::sort that will sort tabs by
-// descending timestamp (i.e., most recent first).
-bool TabsRecencyComparator(const sessions::SessionTab* t1,
-                           const sessions::SessionTab* t2) {
-  return t1->timestamp > t2->timestamp;
-}
-
-// Comparator function for use with std::sort that will sort sessions by
-// descending modified_time (i.e., most recent first).
-bool SessionsRecencyComparator(const SyncedSession* s1,
-                               const SyncedSession* s2) {
-  return s1->modified_time > s2->modified_time;
-}
-
 std::string TabNodeIdToTag(const std::string& machine_tag, int tab_node_id) {
   CHECK_GT(tab_node_id, TabNodePool::kInvalidTabNodeID)
       << "https://crbug.com/639009";
@@ -131,6 +117,12 @@
       favicon_cache_(sessions_client->GetFaviconService(),
                      sessions_client->GetHistoryService(),
                      kMaxSyncFavicons),
+      open_tabs_ui_delegate_(
+          sessions_client,
+          &session_tracker_,
+          &favicon_cache_,
+          base::BindRepeating(&SessionsSyncManager::DeleteForeignSessionFromUI,
+                              base::Unretained(this))),
       local_tab_pool_out_of_sync_(true),
       sync_prefs_(sync_prefs),
       local_device_(local_device),
@@ -692,13 +684,6 @@
   return list;
 }
 
-bool SessionsSyncManager::GetLocalSession(const SyncedSession** local_session) {
-  if (current_machine_tag().empty())
-    return false;
-  *local_session = session_tracker_.GetSession(current_machine_tag());
-  return true;
-}
-
 syncer::SyncError SessionsSyncManager::ProcessSyncChanges(
     const base::Location& from_here,
     const syncer::SyncChangeList& change_list) {
@@ -780,15 +765,6 @@
   }
 }
 
-bool SessionsSyncManager::GetAllForeignSessions(
-    std::vector<const SyncedSession*>* sessions) {
-  if (!session_tracker_.LookupAllForeignSessions(
-          sessions, SyncedSessionTracker::PRESENTABLE))
-    return false;
-  std::sort(sessions->begin(), sessions->end(), SessionsRecencyComparator);
-  return true;
-}
-
 bool SessionsSyncManager::InitFromSyncModel(
     const syncer::SyncDataList& sync_data,
     syncer::SyncChangeList* new_changes) {
@@ -1099,18 +1075,6 @@
   }
 }
 
-bool SessionsSyncManager::GetSyncedFaviconForPageURL(
-    const std::string& page_url,
-    scoped_refptr<base::RefCountedMemory>* favicon_png) const {
-  return favicon_cache_.GetSyncedFaviconForPageURL(GURL(page_url), favicon_png);
-}
-
-void SessionsSyncManager::DeleteForeignSession(const std::string& tag) {
-  syncer::SyncChangeList changes;
-  DeleteForeignSessionInternal(tag, &changes);
-  sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
-}
-
 void SessionsSyncManager::DeleteForeignSessionInternal(
     const std::string& tag,
     syncer::SyncChangeList* change_output) {
@@ -1133,6 +1097,12 @@
     sessions_updated_callback_.Run();
 }
 
+void SessionsSyncManager::DeleteForeignSessionFromUI(const std::string& tag) {
+  syncer::SyncChangeList changes;
+  DeleteForeignSessionInternal(tag, &changes);
+  sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
+}
+
 bool SessionsSyncManager::DisassociateForeignSession(
     const std::string& foreign_session_tag) {
   DCHECK_NE(foreign_session_tag, current_machine_tag());
@@ -1140,49 +1110,6 @@
   return session_tracker_.DeleteForeignSession(foreign_session_tag);
 }
 
-bool SessionsSyncManager::GetForeignSession(
-    const std::string& tag,
-    std::vector<const sessions::SessionWindow*>* windows) {
-  return session_tracker_.LookupSessionWindows(tag, windows);
-}
-
-bool SessionsSyncManager::GetForeignSessionTabs(
-    const std::string& tag,
-    std::vector<const sessions::SessionTab*>* tabs) {
-  std::vector<const sessions::SessionWindow*> windows;
-  if (!session_tracker_.LookupSessionWindows(tag, &windows))
-    return false;
-
-  // Prune those tabs that are not syncable or are NewTabPage, then sort them
-  // from most recent to least recent, independent of which window the tabs were
-  // from.
-  for (size_t j = 0; j < windows.size(); ++j) {
-    const sessions::SessionWindow* window = windows[j];
-    for (size_t t = 0; t < window->tabs.size(); ++t) {
-      sessions::SessionTab* const tab = window->tabs[t].get();
-      if (tab->navigations.empty())
-        continue;
-      const sessions::SerializedNavigationEntry& current_navigation =
-          tab->navigations.at(tab->normalized_navigation_index());
-      if (!sessions_client_->ShouldSyncURL(current_navigation.virtual_url()))
-        continue;
-      tabs->push_back(tab);
-    }
-  }
-  std::sort(tabs->begin(), tabs->end(), TabsRecencyComparator);
-  return true;
-}
-
-bool SessionsSyncManager::GetForeignTab(const std::string& tag,
-                                        const SessionID::id_type tab_id,
-                                        const sessions::SessionTab** tab) {
-  const sessions::SessionTab* synced_tab = nullptr;
-  bool success = session_tracker_.LookupSessionTab(tag, tab_id, &synced_tab);
-  if (success)
-    *tab = synced_tab;
-  return success;
-}
-
 void SessionsSyncManager::AssociateRestoredPlaceholderTab(
     const SyncedTabDelegate& tab_delegate,
     SessionID::id_type new_tab_id,
@@ -1299,6 +1226,10 @@
   return &global_id_mapper_;
 }
 
+OpenTabsUIDelegate* SessionsSyncManager::GetOpenTabsUIDelegate() {
+  return &open_tabs_ui_delegate_;
+}
+
 SyncedWindowDelegatesGetter*
 SessionsSyncManager::synced_window_delegates_getter() const {
   return sessions_client_->GetSyncedWindowDelegatesGetter();
diff --git a/components/sync_sessions/sessions_sync_manager.h b/components/sync_sessions/sessions_sync_manager.h
index 18a95fc..dbf4862 100644
--- a/components/sync_sessions/sessions_sync_manager.h
+++ b/components/sync_sessions/sessions_sync_manager.h
@@ -27,7 +27,7 @@
 #include "components/sync_sessions/favicon_cache.h"
 #include "components/sync_sessions/local_session_event_router.h"
 #include "components/sync_sessions/lost_navigations_recorder.h"
-#include "components/sync_sessions/open_tabs_ui_delegate.h"
+#include "components/sync_sessions/open_tabs_ui_delegate_impl.h"
 #include "components/sync_sessions/sessions_global_id_mapper.h"
 #include "components/sync_sessions/synced_session.h"
 #include "components/sync_sessions/synced_session_tracker.h"
@@ -59,7 +59,6 @@
 // Contains all logic for associating the Chrome sessions model and
 // the sync sessions model.
 class SessionsSyncManager : public syncer::SyncableService,
-                            public OpenTabsUIDelegate,
                             public LocalSessionEventHandler {
  public:
   SessionsSyncManager(SyncSessionsClient* sessions_client,
@@ -82,24 +81,6 @@
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
 
-  // OpenTabsUIDelegate implementation.
-  bool GetSyncedFaviconForPageURL(
-      const std::string& pageurl,
-      scoped_refptr<base::RefCountedMemory>* favicon_png) const override;
-  bool GetAllForeignSessions(
-      std::vector<const SyncedSession*>* sessions) override;
-  bool GetForeignSession(
-      const std::string& tag,
-      std::vector<const sessions::SessionWindow*>* windows) override;
-  bool GetForeignTab(const std::string& tag,
-                     SessionID::id_type tab_id,
-                     const sessions::SessionTab** tab) override;
-  bool GetForeignSessionTabs(
-      const std::string& tag,
-      std::vector<const sessions::SessionTab*>* tabs) override;
-  void DeleteForeignSession(const std::string& tag) override;
-  bool GetLocalSession(const SyncedSession** local_session) override;
-
   // LocalSessionEventHandler implementation.
   void OnLocalTabModified(SyncedTabDelegate* modified_tab) override;
   void OnFaviconsChanged(const std::set<GURL>& page_urls,
@@ -121,6 +102,8 @@
 
   SessionsGlobalIdMapper* GetGlobalIdMapper();
 
+  OpenTabsUIDelegate* GetOpenTabsUIDelegate();
+
  private:
   friend class extensions::ExtensionSessionsTest;
   friend class SessionsSyncManagerTest;
@@ -190,6 +173,9 @@
   void DeleteForeignSessionInternal(const std::string& tag,
                                     syncer::SyncChangeList* change_output);
 
+  // Same as above but it also notifies the processor.
+  void DeleteForeignSessionFromUI(const std::string& tag);
+
   // Used to populate a session header from the session specifics header
   // provided.
   void PopulateSyncedSessionFromSpecifics(
@@ -300,6 +286,7 @@
   SyncedSessionTracker session_tracker_;
   FaviconCache favicon_cache_;
   SessionsGlobalIdMapper global_id_mapper_;
+  OpenTabsUIDelegateImpl open_tabs_ui_delegate_;
 
   // Tracks whether our local representation of which sync nodes map to what
   // tabs (belonging to the current local session) is inconsistent.  This can
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc
index 89f869e2..000408ef 100644
--- a/components/sync_sessions/sessions_sync_manager_unittest.cc
+++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -16,7 +16,7 @@
 #include "components/sync/driver/fake_sync_client.h"
 #include "components/sync/driver/sync_api_component_factory.h"
 #include "components/sync/model/sync_error_factory_mock.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
+#include "components/sync_sessions/mock_sync_sessions_client.h"
 #include "components/sync_sessions/session_sync_test_helper.h"
 #include "components/sync_sessions/sync_sessions_client.h"
 #include "components/sync_sessions/synced_tab_delegate.h"
@@ -482,45 +482,23 @@
   LocalSessionEventHandler* handler_ = nullptr;
 };
 
-// Provides ability to override SyncedWindowDelegatesGetter.
-// All other calls are passed through to the original FakeSyncSessionsClient.
-class SyncSessionsClientShim : public FakeSyncSessionsClient {
- public:
-  explicit SyncSessionsClientShim(
-      SyncedWindowDelegatesGetter* synced_window_getter)
-      : synced_window_getter_(synced_window_getter) {}
-  ~SyncSessionsClientShim() override {}
-
-  SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() override {
-    // The idea here is to allow the test code override the default
-    // SyncedWindowDelegatesGetter provided by |sync_sessions_client_|.
-    // If |synced_window_getter_| is explicitly set, return it; otherwise return
-    // the default one provided by |sync_sessions_client_|.
-    return synced_window_getter_;
-  }
-
- private:
-  SyncedWindowDelegatesGetter* synced_window_getter_;
-};
-
 }  // namespace
 
 class SessionsSyncManagerTest : public testing::Test {
  protected:
-  SessionsSyncManagerTest() {}
-
   void SetUp() override {
+    ON_CALL(mock_sync_sessions_client_, GetSyncedWindowDelegatesGetter())
+        .WillByDefault(testing::Return(&window_getter_));
+
     local_device_ = std::make_unique<LocalDeviceInfoProviderMock>(
         "cache_guid", "Wayne Gretzky's Hacking Box", "Chromium 10k",
         "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id");
     sync_client_ = std::make_unique<syncer::FakeSyncClient>();
-    sessions_client_shim_ =
-        std::make_unique<SyncSessionsClientShim>(&window_getter_);
     sync_prefs_ =
         std::make_unique<syncer::SyncPrefs>(sync_client_->GetPrefService());
     router_ = std::make_unique<DummyRouter>();
     manager_ = std::make_unique<SessionsSyncManager>(
-        sessions_client_shim(), sync_prefs_.get(), local_device_.get(),
+        &mock_sync_sessions_client_, sync_prefs_.get(), local_device_.get(),
         router_.get(),
         base::Bind(&SessionNotificationObserver::NotifyOfUpdate,
                    base::Unretained(&observer_)),
@@ -548,9 +526,6 @@
   LocalDeviceInfoProvider* local_device() { return local_device_.get(); }
   SessionNotificationObserver* observer() { return &observer_; }
   syncer::SyncPrefs* sync_prefs() { return sync_prefs_.get(); }
-  SyncSessionsClient* sessions_client_shim() {
-    return sessions_client_shim_.get();
-  }
   SyncedWindowDelegatesGetter* window_getter() { return &window_getter_; }
 
   void InitWithSyncDataTakeOutput(const SyncDataList& initial_data,
@@ -793,7 +768,7 @@
 
  private:
   std::unique_ptr<syncer::FakeSyncClient> sync_client_;
-  std::unique_ptr<SyncSessionsClientShim> sessions_client_shim_;
+  testing::NiceMock<MockSyncSessionsClient> mock_sync_sessions_client_;
   std::unique_ptr<syncer::SyncPrefs> sync_prefs_;
   SessionNotificationObserver observer_;
   std::unique_ptr<DummyRouter> router_;
@@ -1203,7 +1178,8 @@
   EXPECT_TRUE(FilterOutLocalHeaderChanges(&output)->empty());
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(tab_list1);
@@ -1234,7 +1210,8 @@
 
   // Check that this machine's data is not included in the foreign windows.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_FALSE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
 
   VerifyLocalHeaderChange(out[0], 0, 0);
   VerifyLocalTabChange(out[1], tab->GetEntryCount(), kBaz1);
@@ -1281,7 +1258,8 @@
 
   // Verify foreign data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(tab_list1);
   helper()->VerifySyncedSession(kTag1, session_reference,
@@ -1343,7 +1321,8 @@
 
   // Check that the foreign session was associated and retrieve the data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   ASSERT_EQ(
       4U,
@@ -1364,7 +1343,8 @@
   manager()->ProcessSyncChanges(FROM_HERE, changes);
   changes.clear();
 
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   std::vector<std::vector<SessionID::id_type>> meta2_reference;
   meta2_reference.push_back(tag2_tab_list);
   ASSERT_EQ(2U, foreign_sessions.size());
@@ -1388,7 +1368,8 @@
   AddTabsToChangeList(tabs1, SyncChange::ACTION_UPDATE, &removal);
   manager()->ProcessSyncChanges(FROM_HERE, removal);
 
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(2U, foreign_sessions.size());
   ASSERT_EQ(
       3U,
@@ -1403,9 +1384,11 @@
   SyncChangeList changes;
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_FALSE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   manager()->DeleteForeignSessionInternal(kTag1, &changes);
-  ASSERT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_FALSE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   EXPECT_TRUE(changes.empty());
 
   // Fill an instance of session specifics with a foreign session's data.
@@ -1421,12 +1404,14 @@
        iter != tabs.end(); ++iter) {
     manager()->UpdateTrackerWithSpecifics(*iter, base::Time());
   }
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
 
   // Now delete the foreign session.
   manager()->DeleteForeignSessionInternal(kTag1, &changes);
-  EXPECT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
+  EXPECT_FALSE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
 
   EXPECT_EQ(5U, changes.size());
   ASSERT_TRUE(AllOfChangesAreType(changes, SyncChange::ACTION_DELETE));
@@ -1464,7 +1449,8 @@
 
   // Check that the foreign session was associated and retrieve the data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(tab_list1);
@@ -1502,7 +1488,8 @@
 
   // Check that the foreign session was associated and retrieve the data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   ASSERT_EQ(2U, foreign_sessions[0]->windows.size());
   ASSERT_EQ(
@@ -1521,7 +1508,8 @@
 
   // Check that the foreign session was associated and retrieve the data.
   foreign_sessions.clear();
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   ASSERT_EQ(1U, foreign_sessions[0]->windows.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
@@ -1585,7 +1573,8 @@
   manager()->ProcessSyncChanges(FROM_HERE, changes);
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
 
   changes.clear();
@@ -1593,7 +1582,8 @@
   changes.push_back(MakeRemoteChange(meta, SyncChange::ACTION_DELETE));
   manager()->ProcessSyncChanges(FROM_HERE, changes);
 
-  EXPECT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
+  EXPECT_FALSE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
 }
 
 TEST_F(SessionsSyncManagerTest, ProcessForeignDeleteTabs) {
@@ -1648,7 +1638,8 @@
   manager()->ProcessSyncChanges(FROM_HERE, changes);
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(update_list);
@@ -2062,7 +2053,8 @@
   output.clear();
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(3U, foreign_sessions.size());
   EXPECT_EQ(newest_time, foreign_sessions[0]->modified_time);
   EXPECT_EQ(newest_time, foreign_sessions[1]->modified_time);
@@ -2100,7 +2092,8 @@
 
   // Check that the foreign session was associated and retrieve the data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(2U, foreign_sessions.size());
   foreign_sessions.clear();
 
@@ -2114,7 +2107,8 @@
               SyncDataLocal(output[i].sync_data()).GetTag());
   }
 
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(tab_list2);
@@ -2175,7 +2169,8 @@
 
   // Although we have 3 foreign sessions, only 1 is valid/clean enough.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   foreign_sessions.clear();
 
@@ -2213,13 +2208,15 @@
 
   // Check that the foreign session was associated and retrieve the data.
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   foreign_sessions.clear();
 
   // Verify the now non-stale session does not get deleted.
   manager()->DoGarbageCollection();
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(1U, foreign_sessions.size());
   std::vector<std::vector<SessionID::id_type>> session_reference;
   session_reference.push_back(tab_list1);
@@ -2274,7 +2271,7 @@
 
   observer()->Reset();
   ASSERT_FALSE(observer()->notified_of_update());
-  manager()->DeleteForeignSession(tag);
+  manager()->GetOpenTabsUIDelegate()->DeleteForeignSession(tag);
   ASSERT_TRUE(observer()->notified_of_update());
 }
 
@@ -2392,7 +2389,8 @@
   InitWithSyncDataTakeOutput(initial_data, &output);
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
 
   const std::vector<std::unique_ptr<sessions::SessionTab>>& window_tabs =
       foreign_sessions[0]->windows.find(0)->second->wrapped_window.tabs;
@@ -2430,7 +2428,8 @@
   InitWithSyncDataTakeOutput(initial_data, &output);
 
   std::vector<const SyncedSession*> foreign_sessions;
-  ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
+  ASSERT_TRUE(manager()->GetOpenTabsUIDelegate()->GetAllForeignSessions(
+      &foreign_sessions));
   ASSERT_EQ(2U, foreign_sessions.size());
   ASSERT_GT(foreign_sessions[0]->modified_time,
             foreign_sessions[1]->modified_time);
@@ -2470,7 +2469,8 @@
   InitWithSyncDataTakeOutput(initial_data, &output);
 
   std::vector<const sessions::SessionTab*> tabs;
-  ASSERT_TRUE(manager()->GetForeignSessionTabs(kTag1, &tabs));
+  ASSERT_TRUE(
+      manager()->GetOpenTabsUIDelegate()->GetForeignSessionTabs(kTag1, &tabs));
   // Assert that the size matches the total number of tabs and that the order
   // is from most recent to least.
   ASSERT_EQ(tab_list1.size() + tab_list2.size(), tabs.size());
diff --git a/components/sync_sessions/sync_sessions_metrics.cc b/components/sync_sessions/sync_sessions_metrics.cc
deleted file mode 100644
index b5cf37e3..0000000
--- a/components/sync_sessions/sync_sessions_metrics.cc
+++ /dev/null
@@ -1,61 +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 "components/sync_sessions/sync_sessions_metrics.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/time/time.h"
-#include "components/sessions/core/session_types.h"
-#include "components/sync_sessions/sessions_sync_manager.h"
-#include "components/sync_sessions/synced_session.h"
-
-namespace sync_sessions {
-
-// static
-void SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-    SessionsSyncManager* sessions_sync_manager) {
-  if (sessions_sync_manager != nullptr) {
-    std::vector<const SyncedSession*> foreign_sessions;
-    sessions_sync_manager->GetAllForeignSessions(&foreign_sessions);
-    base::Time best(MaxTabTimestamp(foreign_sessions));
-    base::Time now(base::Time::Now());
-    // Don't emit metrics if the foreign tab is timestamped in the future. While
-    // the timestamp is set on a different machine, and we may lose some
-    // fraction of metrics to clock skew, we don't want the potential to have
-    // bad machines with clocks many hours off causing lots of seemingly 0
-    // second entries.
-    if (base::Time::UnixEpoch() < best && best <= now) {
-      UMA_HISTOGRAM_CUSTOM_COUNTS(
-          "Sync.YoungestForeignTabAgeOnNTP", (now - best).InSeconds(), 1,
-          base::TimeDelta::FromDays(14).InSeconds(), 100);
-    }
-  }
-}
-
-// static
-base::Time SyncSessionsMetrics::MaxTabTimestamp(
-    const std::vector<const SyncedSession*>& sessions) {
-  // While Sessions are ordered by recency, windows and tabs are not. Because
-  // the timestamp of sessions are updated when windows/tabs are removed, we
-  // only need to search until all the remaining sessions are older than the
-  // most recent tab we've found so far.
-  base::Time best(base::Time::UnixEpoch());
-  for (const SyncedSession* session : sessions) {
-    if (session->modified_time < best) {
-      break;
-    }
-    for (const auto& key_value : session->windows) {
-      for (const auto& tab : key_value.second->wrapped_window.tabs) {
-        best = std::max(best, tab->timestamp);
-      }
-    }
-  }
-  return best;
-}
-
-}  // namespace sync_sessions
diff --git a/components/sync_sessions/sync_sessions_metrics.h b/components/sync_sessions/sync_sessions_metrics.h
deleted file mode 100644
index 90770b4..0000000
--- a/components/sync_sessions/sync_sessions_metrics.h
+++ /dev/null
@@ -1,42 +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 COMPONENTS_SYNC_SESSIONS_SYNC_SESSIONS_METRICS_H_
-#define COMPONENTS_SYNC_SESSIONS_SYNC_SESSIONS_METRICS_H_
-
-#include <vector>
-
-namespace base {
-class Time;
-}  // namespace base
-
-namespace sync_sessions {
-
-class SessionsSyncManager;
-struct SyncedSession;
-
-class SyncSessionsMetrics {
- public:
-  // Records via an UMA histogram the age of the youngest foreign tab the given
-  // manager is aware of. No attempt is made to aquire a more recent version of
-  // world. If anything goes wrong, such as the manager being null, no foreign
-  // session present, or a foreign tab with a timestamp in the future then no
-  // metric is emitted.
-  static void RecordYoungestForeignTabAgeOnNTP(
-      SessionsSyncManager* sessions_sync_manager);
-
- private:
-  friend class SyncSessionsMetricsTest;
-
-  // Returns the highest timestamp for any tab in the given sessions. Note that
-  // sessions should be sorted by timestamp, and session timestamps should
-  // always be greater or equal to children window/tab timestamps. No navigation
-  // timestamps are checked.
-  static base::Time MaxTabTimestamp(
-      const std::vector<const SyncedSession*>& sessions);
-};
-
-}  // namespace sync_sessions
-
-#endif  // COMPONENTS_SYNC_SESSIONS_SYNC_SESSIONS_METRICS_H_
diff --git a/components/sync_sessions/sync_sessions_metrics_unittest.cc b/components/sync_sessions/sync_sessions_metrics_unittest.cc
deleted file mode 100644
index 4e06278a..0000000
--- a/components/sync_sessions/sync_sessions_metrics_unittest.cc
+++ /dev/null
@@ -1,209 +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 "components/sync_sessions/sync_sessions_metrics.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/test/histogram_tester.h"
-#include "base/time/time.h"
-#include "components/sessions/core/session_types.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
-#include "components/sync_sessions/sessions_sync_manager.h"
-#include "components/sync_sessions/synced_session.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using sessions::SessionWindow;
-using sessions::SessionTab;
-using base::Time;
-using base::TimeDelta;
-
-namespace sync_sessions {
-
-namespace {
-
-class FakeSessionsSyncManager : public SessionsSyncManager {
- public:
-  FakeSessionsSyncManager(SyncSessionsClient* sessions_client,
-                          std::vector<std::unique_ptr<SyncedSession>>* sessions)
-      : SessionsSyncManager(sessions_client,
-                            nullptr,
-                            nullptr,
-                            nullptr,
-                            base::Closure(),
-                            base::Closure()),
-        sessions_(sessions) {}
-
-  bool GetAllForeignSessions(
-      std::vector<const SyncedSession*>* sessions) override {
-    for (auto& session : *sessions_) {
-      sessions->push_back(session.get());
-    }
-    return true;
-  }
-
- private:
-  std::vector<std::unique_ptr<SyncedSession>>* sessions_;
-};
-
-Time SecondsFromEpoch(int seconds) {
-  return Time::UnixEpoch() + TimeDelta::FromSeconds(seconds);
-}
-
-}  // namespace
-
-class SyncSessionsMetricsTest : public ::testing::Test {
- protected:
-  SyncSessionsMetricsTest() : fake_manager_(&fake_client_, &sessions_) {}
-
-  // Sets the tab/window/session timestamps and creates anything needed. The new
-  // calls in here are safe because the session/window objects are going to
-  // delete all their children when their destructors are invoked.
-  void PushTab(size_t tabIndex, int windowIndex, Time timestamp) {
-    // First add sessions/windows as necessary.
-    while (tabIndex >= sessions_.size()) {
-      sessions_.push_back(std::make_unique<SyncedSession>());
-    }
-    if (sessions_[tabIndex]->windows.find(windowIndex) ==
-        sessions_[tabIndex]->windows.end()) {
-      sessions_[tabIndex]->windows[windowIndex] =
-          std::make_unique<SyncedSessionWindow>();
-    }
-
-    sessions_[tabIndex]->modified_time =
-        std::max(sessions_[tabIndex]->modified_time, timestamp);
-    sessions_[tabIndex]->windows[windowIndex]->wrapped_window.timestamp =
-        std::max(
-            sessions_[tabIndex]->windows[windowIndex]->wrapped_window.timestamp,
-            timestamp);
-    sessions_[tabIndex]->windows[windowIndex]->wrapped_window.tabs.push_back(
-        std::make_unique<SessionTab>());
-    sessions_[tabIndex]
-        ->windows[windowIndex]
-        ->wrapped_window.tabs.back()
-        ->timestamp = timestamp;
-  }
-
-  // Removes the last tab at the given indexes. The idexes provided should be
-  // valid for existing data, this method does not check their validity. Windows
-  // are not cleaned up/removed if they're left with 0 tabs.
-  void PopTab(size_t tabIndex, int windowIndex, Time timestamp) {
-    sessions_[tabIndex]->modified_time =
-        std::max(sessions_[tabIndex]->modified_time, timestamp);
-    sessions_[tabIndex]->windows[windowIndex]->wrapped_window.timestamp =
-        std::max(
-            sessions_[tabIndex]->windows[windowIndex]->wrapped_window.timestamp,
-            timestamp);
-    sessions_[tabIndex]->windows[windowIndex]->wrapped_window.tabs.pop_back();
-  }
-
-  // Runs MaxTabTimestamp on the current sessions data.
-  Time MaxTabTimestamp() {
-    std::vector<const SyncedSession*> typed_sessions;
-    for (auto& session : sessions_) {
-      typed_sessions.push_back(session.get());
-    }
-    return SyncSessionsMetrics::MaxTabTimestamp(typed_sessions);
-  }
-
-  SessionsSyncManager* get_sessions_sync_manager() { return &fake_manager_; }
-
- private:
-  std::vector<std::unique_ptr<SyncedSession>> sessions_;
-  FakeSyncSessionsClient fake_client_;
-  FakeSessionsSyncManager fake_manager_;
-};
-
-TEST_F(SyncSessionsMetricsTest, NoWindows) {
-  ASSERT_EQ(Time::UnixEpoch(), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, NoTabs) {
-  PushTab(0, 0, SecondsFromEpoch(1));
-  PopTab(0, 0, SecondsFromEpoch(2));
-  ASSERT_EQ(Time::UnixEpoch(), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, OneTab) {
-  PushTab(0, 0, SecondsFromEpoch(1));
-  ASSERT_EQ(SecondsFromEpoch(1), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, MultipleTabs) {
-  PushTab(0, 0, SecondsFromEpoch(1));
-  PushTab(0, 0, SecondsFromEpoch(3));
-  PushTab(0, 0, SecondsFromEpoch(2));
-  ASSERT_EQ(SecondsFromEpoch(3), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, MultipleWindows) {
-  PushTab(0, 1, SecondsFromEpoch(1));
-  PushTab(0, 2, SecondsFromEpoch(3));
-  PushTab(0, 3, SecondsFromEpoch(2));
-  ASSERT_EQ(SecondsFromEpoch(3), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, OrderedSessions) {
-  PushTab(0, 0, SecondsFromEpoch(3));
-  PushTab(1, 0, SecondsFromEpoch(2));
-  PushTab(2, 0, SecondsFromEpoch(1));
-  ASSERT_EQ(SecondsFromEpoch(3), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, NonOrderedSessions) {
-  // While 2 is not the max, it should give up when it sees the tab at index 1.
-  // This is breaking the assumptions of the logic we're testing, and thus we
-  // expect to return an incorrect ansewr. What this test is really verifying
-  // is that the logic that finds the most recent timestamp is is exiting early
-  // instead of inefficiently examining all foreign tabs.
-  PushTab(0, 0, SecondsFromEpoch(2));
-  PushTab(1, 0, SecondsFromEpoch(1));
-  PushTab(2, 0, SecondsFromEpoch(3));
-  ASSERT_EQ(SecondsFromEpoch(2), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, OrderedSessionsWithDeletedTab) {
-  // Tab/window with index 0 is going to be the most recent, but the recent tab
-  // was removed. The algorithm should continue on and find the tab in index 1.
-  PushTab(0, 0, SecondsFromEpoch(1));
-  PushTab(0, 0, SecondsFromEpoch(4));
-  PopTab(0, 0, SecondsFromEpoch(5));
-  PushTab(1, 0, SecondsFromEpoch(3));
-  PushTab(2, 0, SecondsFromEpoch(2));
-  ASSERT_EQ(SecondsFromEpoch(3), MaxTabTimestamp());
-}
-
-TEST_F(SyncSessionsMetricsTest, SkipEmitNoManager) {
-  base::HistogramTester histogram_tester;
-  PushTab(0, 0, Time::Now() - TimeDelta::FromHours(1));
-  SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(nullptr);
-  histogram_tester.ExpectTotalCount("Sync.YoungestForeignTabAgeOnNTP", 0);
-}
-
-TEST_F(SyncSessionsMetricsTest, SkipEmitNoSessions) {
-  base::HistogramTester histogram_tester;
-  SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-      get_sessions_sync_manager());
-  histogram_tester.ExpectTotalCount("Sync.YoungestForeignTabAgeOnNTP", 0);
-}
-
-TEST_F(SyncSessionsMetricsTest, SkipEmitInvalidTimestamp) {
-  base::HistogramTester histogram_tester;
-  // Foreign session is far in the future, it should be ignored.
-  PushTab(0, 0, Time::Now() + TimeDelta::FromHours(1));
-  SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-      get_sessions_sync_manager());
-  histogram_tester.ExpectTotalCount("Sync.YoungestForeignTabAgeOnNTP", 0);
-}
-
-TEST_F(SyncSessionsMetricsTest, EmitNormalCase) {
-  base::HistogramTester histogram_tester;
-  PushTab(0, 0, Time::Now() - TimeDelta::FromHours(1));
-  SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP(
-      get_sessions_sync_manager());
-  histogram_tester.ExpectTotalCount("Sync.YoungestForeignTabAgeOnNTP", 1);
-}
-
-}  // namespace sync_sessions
diff --git a/components/sync_sessions/synced_session_tracker_unittest.cc b/components/sync_sessions/synced_session_tracker_unittest.cc
index a1b060f..60102cb 100644
--- a/components/sync_sessions/synced_session_tracker_unittest.cc
+++ b/components/sync_sessions/synced_session_tracker_unittest.cc
@@ -8,7 +8,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
-#include "components/sync_sessions/fake_sync_sessions_client.h"
+#include "components/sync_sessions/mock_sync_sessions_client.h"
 #include "components/sync_sessions/synced_tab_delegate.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -21,7 +21,6 @@
 namespace {
 
 const char kValidUrl[] = "http://www.example.com";
-const char kInvalidUrl[] = "invalid.url";
 const char kTag[] = "tag";
 const char kTag2[] = "tag2";
 const char kTag3[] = "tag3";
@@ -101,8 +100,10 @@
                      << unmapped_tab_count;
   }
 
+  MockSyncSessionsClient* GetSyncSessionsClient() { return &sessions_client_; }
+
  private:
-  FakeSyncSessionsClient sessions_client_;
+  testing::NiceMock<MockSyncSessionsClient> sessions_client_;
   SyncedSessionTracker tracker_;
 };
 
@@ -144,6 +145,10 @@
 }
 
 TEST_F(SyncedSessionTrackerTest, LookupAllForeignSessions) {
+  const char kInvalidUrl[] = "invalid.url";
+  ON_CALL(*GetSyncSessionsClient(), ShouldSyncURL(GURL(kInvalidUrl)))
+      .WillByDefault(testing::Return(false));
+
   std::vector<const SyncedSession*> sessions;
   ASSERT_FALSE(GetTracker()->LookupAllForeignSessions(
       &sessions, SyncedSessionTracker::PRESENTABLE));
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
index e1b7cd72..7948a45 100644
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
@@ -416,7 +416,7 @@
 }
 
 void VariationsService::DoActualFetch() {
-  DoFetchFromURL(variations_server_url_);
+  DoFetchFromURL(variations_server_url_, false);
 }
 
 bool VariationsService::StoreSeed(const std::string& seed_data,
@@ -451,7 +451,7 @@
   return state_manager_->CreateLowEntropyProvider();
 }
 
-bool VariationsService::DoFetchFromURL(const GURL& url) {
+bool VariationsService::DoFetchFromURL(const GURL& url, bool is_http_retry) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsFetchingEnabled());
 
@@ -499,9 +499,8 @@
     // Tell the server that delta-compressed seeds are supported.
     enable_deltas = true;
     // Get the seed only if its serial number doesn't match what we have.
-    // If the fetch is being done over HTTP, encrypt the If-None-Match header.
-    if (!url.SchemeIs(url::kHttpsScheme) &&
-        base::FeatureList::IsEnabled(kHttpRetryFeature)) {
+    // If the fetch is an HTTP retry, encrypt the If-None-Match header.
+    if (is_http_retry) {
       if (!EncryptString(serial_number, &serial_number)) {
         pending_seed_request_.reset();
         return false;
@@ -614,7 +613,7 @@
     if (was_https && !insecure_variations_server_url_.is_empty()) {
       // When re-trying via HTTP, return immediately. OnURLFetchComplete() will
       // be called with the result of that retry.
-      if (DoFetchFromURL(insecure_variations_server_url_))
+      if (DoFetchFromURL(insecure_variations_server_url_, true))
         return;
     }
     // It's common for the very first fetch attempt to fail (e.g. the network
diff --git a/components/variations/service/variations_service.h b/components/variations/service/variations_service.h
index f3e8dc6..838fbd0 100644
--- a/components/variations/service/variations_service.h
+++ b/components/variations/service/variations_service.h
@@ -244,8 +244,9 @@
   };
 
   // Attempts a seed fetch from the set |url|. Returns true if the fetch was
-  // started successfully, false otherwise.
-  bool DoFetchFromURL(const GURL& url);
+  // started successfully, false otherwise. |is_http_retry| should be true if
+  // this is a retry over HTTP, false otherwise.
+  bool DoFetchFromURL(const GURL& url, bool is_http_retry);
 
   // Calls FetchVariationsSeed once and repeats this periodically. See
   // implementation for details on the period.
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc
index d60dd76..707dc27 100644
--- a/components/viz/service/display/display.cc
+++ b/components/viz/service/display/display.cc
@@ -763,7 +763,7 @@
           ? 0
           : total_area_saved_in_px * 100 /
                 total_quad_area_shown_wo_occlusion_px);
-  UMA_HISTOGRAM_COUNTS_1000(
+  UMA_HISTOGRAM_COUNTS_10000(
       "Compositing.Display.Draw.Occlusion.Drawing.Area.Saved",
       total_area_saved_in_px);
 }
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc
index 80bb3b77..9a4d63e 100644
--- a/content/app/content_main_runner.cc
+++ b/content/app/content_main_runner.cc
@@ -15,7 +15,7 @@
 
 #include "base/allocator/allocator_check.h"
 #include "base/allocator/allocator_extension.h"
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/at_exit.h"
 #include "base/base_switches.h"
 #include "base/command_line.h"
diff --git a/content/app/strings/translations/content_strings_bg.xtb b/content/app/strings/translations/content_strings_bg.xtb
index e3b8a69..c767e2fa 100644
--- a/content/app/strings/translations/content_strings_bg.xtb
+++ b/content/app/strings/translations/content_strings_bg.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Предаване</translation>
 <translation id="5546461542133609677">пускане на звука</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Докоснете два пъти стрелката наляво или надясно, за да пропуснете 10 сек</translation>
 <translation id="5641012560118721995">поставяне на възпроизвеждането на пауза</translation>
 <translation id="5643186887447432888">бутон</translation>
 <translation id="5677946354068040947">още опции</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">времеви плъзгач за аудиозаписа</translation>
 <translation id="648732519525291180">инструмент за избор на час</translation>
 <translation id="6550675742724504774">Опции</translation>
+<translation id="6564313821541007458">Гледате в режим „Картина в картината“</translation>
 <translation id="658823671542763450">вход за цял екран</translation>
 <translation id="663493177488814956">емисия</translation>
 <translation id="6637586476836377253">регистрационен файл</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">списък с дефиниции</translation>
 <translation id="8597182159515967513">заглавие</translation>
 <translation id="8613126697340063924">управление на отдалеченото възпроизвеждане</translation>
+<translation id="8741316211671074806">Картина в картината</translation>
 <translation id="8750798805984357768">Моля, изберете една от тези опции.</translation>
 <translation id="8785498733064193001">начало на възпроизвеждането</translation>
 <translation id="8845239796550121995">В момента се предава към телевизора ви</translation>
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb
index 04c2665..21bb9a2 100644
--- a/content/app/strings/translations/content_strings_bn.xtb
+++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">কাস্ট করুন</translation>
 <translation id="5546461542133609677">সশব্দ</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">১০সেকেন্ড এগিয়ে অথবা পিছিয়ে যাওয়ার জন্য ডান অথবা বাঁ দিকের বোতামে ডবল ট্যাপ করুন</translation>
 <translation id="5641012560118721995">প্লেব্যাক বিরতি</translation>
 <translation id="5643186887447432888">বোতাম</translation>
 <translation id="5677946354068040947">আরও বিকল্প</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">অডিও সময় স্ক্রাবার</translation>
 <translation id="648732519525291180">সময় চয়নকারি</translation>
 <translation id="6550675742724504774">বিকল্পসমূহ</translation>
+<translation id="6564313821541007458">এখন ছবির-মধ্যে-ছবি মোডে</translation>
 <translation id="658823671542763450">পূর্ণ স্ক্রীনে প্রবেশ করুন</translation>
 <translation id="663493177488814956">ফিড</translation>
 <translation id="6637586476836377253">লগ</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">সংজ্ঞার তালিকা</translation>
 <translation id="8597182159515967513">শিরোনাম</translation>
 <translation id="8613126697340063924">রিমোট প্লেব্যাক নিয়ন্ত্রণ করুন</translation>
+<translation id="8741316211671074806">ছবির-মধ্যে-ছবি</translation>
 <translation id="8750798805984357768">দয়া করে বিকল্পগুলির একটি নির্বাচন করুন৷</translation>
 <translation id="8785498733064193001">প্লেব্যাক শুরু করুন</translation>
 <translation id="8845239796550121995">এখন আপনার TV তে কাস্ট করা হচ্ছে</translation>
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb
index 76a97f75..3dc39f7 100644
--- a/content/app/strings/translations/content_strings_ca.xtb
+++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Emet</translation>
 <translation id="5546461542133609677">activa el so</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Fes doble toc a l'esquerra o a la dreta per saltar 10 s</translation>
 <translation id="5641012560118721995">pausa la reproducció</translation>
 <translation id="5643186887447432888">botó</translation>
 <translation id="5677946354068040947">més opcions</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">barra de moment de l'àudio</translation>
 <translation id="648732519525291180">selector d'hora</translation>
 <translation id="6550675742724504774">Opcions</translation>
+<translation id="6564313821541007458">Ara en el mode de pantalla en pantalla</translation>
 <translation id="658823671542763450">passa a pantalla completa</translation>
 <translation id="663493177488814956">El meu tauler</translation>
 <translation id="6637586476836377253">registre</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">llista de definicions</translation>
 <translation id="8597182159515967513">Encapçalament</translation>
 <translation id="8613126697340063924">reproducció amb comandament</translation>
+<translation id="8741316211671074806">Pantalla en pantalla</translation>
 <translation id="8750798805984357768">Seleccioneu una d'aquestes opcions.</translation>
 <translation id="8785498733064193001">inicia la reproducció</translation>
 <translation id="8845239796550121995">S'està emetent al televisor</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb
index df394f8..bc5dc6c 100644
--- a/content/app/strings/translations/content_strings_cs.xtb
+++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Odeslat</translation>
 <translation id="5546461542133609677">zapnout zvuk</translation>
 <translation id="561939826962581046">čas</translation>
+<translation id="5630795885300617244">Dvojitým klepnutím na šipku vlevo nebo vpravo přeskočíte o 10 s</translation>
 <translation id="5641012560118721995">pozastavit přehrávání</translation>
 <translation id="5643186887447432888">tlačítko</translation>
 <translation id="5677946354068040947">další možnosti</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">posuvník času zvuku</translation>
 <translation id="648732519525291180">výběr času</translation>
 <translation id="6550675742724504774">Možnosti</translation>
+<translation id="6564313821541007458">Je aktivní režim obrazu v obraze</translation>
 <translation id="658823671542763450">přejít do režimu celé obrazovky</translation>
 <translation id="663493177488814956">zdroj</translation>
 <translation id="6637586476836377253">protokol</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">seznam definic</translation>
 <translation id="8597182159515967513">záhlaví</translation>
 <translation id="8613126697340063924">ovládání vzdáleného přehrávání</translation>
+<translation id="8741316211671074806">Obraz v obraze</translation>
 <translation id="8750798805984357768">Vyberte jednu z těchto možností.</translation>
 <translation id="8785498733064193001">zahájit přehrávání</translation>
 <translation id="8845239796550121995">Odesílání do televize</translation>
diff --git a/content/app/strings/translations/content_strings_de.xtb b/content/app/strings/translations/content_strings_de.xtb
index 1adf8a4..5a7c5be 100644
--- a/content/app/strings/translations/content_strings_de.xtb
+++ b/content/app/strings/translations/content_strings_de.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Übertragen</translation>
 <translation id="5546461542133609677">Ton an</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Tippen Sie links oder rechts doppelt, um 10 s zu überspringen</translation>
 <translation id="5641012560118721995">Wiedergabe anhalten</translation>
 <translation id="5643186887447432888">Schaltfläche</translation>
 <translation id="5677946354068040947">weitere Optionen</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">Audio-Zeitachse</translation>
 <translation id="648732519525291180">Uhrzeitauswahl</translation>
 <translation id="6550675742724504774">Optionen</translation>
+<translation id="6564313821541007458">Jetzt im Bild-in-Bild-Modus</translation>
 <translation id="658823671542763450">Vollbildmodus aktivieren</translation>
 <translation id="663493177488814956">Feed</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">Definitionsliste</translation>
 <translation id="8597182159515967513">Kopfzeile</translation>
 <translation id="8613126697340063924">Remote-Wiedergabe steuern</translation>
+<translation id="8741316211671074806">Bild im Bild</translation>
 <translation id="8750798805984357768">Wählen Sie eine dieser Optionen aus.</translation>
 <translation id="8785498733064193001">Wiedergabe starten</translation>
 <translation id="8845239796550121995">Wird gerade auf Ihren Fernseher gestreamt</translation>
diff --git a/content/app/strings/translations/content_strings_es-419.xtb b/content/app/strings/translations/content_strings_es-419.xtb
index 1ba1029..78a08757 100644
--- a/content/app/strings/translations/content_strings_es-419.xtb
+++ b/content/app/strings/translations/content_strings_es-419.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Transmitir</translation>
 <translation id="5546461542133609677">desactivar silencio</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Presiona dos veces a la derecha o izquierda para omitir 10 s</translation>
 <translation id="5641012560118721995">pausar reproducción</translation>
 <translation id="5643186887447432888">botón</translation>
 <translation id="5677946354068040947">más opciones</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">control deslizante de duración del audio</translation>
 <translation id="648732519525291180">selector de hora</translation>
 <translation id="6550675742724504774">Opciones</translation>
+<translation id="6564313821541007458">Ahora en modo de pantalla en pantalla</translation>
 <translation id="658823671542763450">ingresar a pantalla completa</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">rgstr</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">lista de definiciones</translation>
 <translation id="8597182159515967513">cabecera</translation>
 <translation id="8613126697340063924">controlar la reproducción remota</translation>
+<translation id="8741316211671074806">Pantalla en pantalla</translation>
 <translation id="8750798805984357768">Selecciona una de estas opciones.</translation>
 <translation id="8785498733064193001">comenzar la reproducción</translation>
 <translation id="8845239796550121995">Transmitiendo a tu TV</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb
index da6693b5..4e8c477b 100644
--- a/content/app/strings/translations/content_strings_es.xtb
+++ b/content/app/strings/translations/content_strings_es.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Enviar</translation>
 <translation id="5546461542133609677">activar sonido</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Toca dos veces a la derecha o a la izquierda para saltar 10 segundos</translation>
 <translation id="5641012560118721995">pausar reproducción</translation>
 <translation id="5643186887447432888">botón</translation>
 <translation id="5677946354068040947">más opciones</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">control deslizante de duración de audio</translation>
 <translation id="648732519525291180">selector de hora</translation>
 <translation id="6550675742724504774">Configuración</translation>
+<translation id="6564313821541007458">Modo de imagen en imagen</translation>
 <translation id="658823671542763450">activar pantalla completa</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">registro</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">lista de definiciones</translation>
 <translation id="8597182159515967513">cabecera</translation>
 <translation id="8613126697340063924">reproducción de control remoto</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8750798805984357768">Selecciona una de estas opciones</translation>
 <translation id="8785498733064193001">iniciar reproducción</translation>
 <translation id="8845239796550121995">Se está enviando contenido a tu TV</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb
index f8729bb..33cf5d2 100644
--- a/content/app/strings/translations/content_strings_et.xtb
+++ b/content/app/strings/translations/content_strings_et.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Ülekanne</translation>
 <translation id="5546461542133609677">vaigistuse tühistamine</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">10 sekundi võrra kerimiseks topeltpuudutage vasakul või paremal</translation>
 <translation id="5641012560118721995">taasesituse peatamine</translation>
 <translation id="5643186887447432888">nupp</translation>
 <translation id="5677946354068040947">rohkem valikuid</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">heli ajamõõdik</translation>
 <translation id="648732519525291180">kellaaja valija</translation>
 <translation id="6550675742724504774">Valikud</translation>
+<translation id="6564313821541007458">Nüüd režiimis Pilt pildis</translation>
 <translation id="658823671542763450">kuvamine täisekraanil</translation>
 <translation id="663493177488814956">voog</translation>
 <translation id="6637586476836377253">logi</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">definitsioonide loend</translation>
 <translation id="8597182159515967513">pealkiri</translation>
 <translation id="8613126697340063924">kaugesituse juhtimine</translation>
+<translation id="8741316211671074806">Pilt pildis</translation>
 <translation id="8750798805984357768">Tehke üks nendest valikutest.</translation>
 <translation id="8785498733064193001">taasesituse alustamine</translation>
 <translation id="8845239796550121995">Kantakse nüüd üle telerisse</translation>
diff --git a/content/app/strings/translations/content_strings_fi.xtb b/content/app/strings/translations/content_strings_fi.xtb
index 319e8731..4c444fa4 100644
--- a/content/app/strings/translations/content_strings_fi.xtb
+++ b/content/app/strings/translations/content_strings_fi.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Lähetä</translation>
 <translation id="5546461542133609677">peruuta mykistys</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Ohita 10 sekuntia kaksoisnapauttamalla vasemmalle tai oikealle.</translation>
 <translation id="5641012560118721995">keskeytä toisto</translation>
 <translation id="5643186887447432888">painike</translation>
 <translation id="5677946354068040947">lisäasetukset</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">äänen ajan liukusäädin</translation>
 <translation id="648732519525291180">ajan valitsin</translation>
 <translation id="6550675742724504774">Asetukset</translation>
+<translation id="6564313821541007458">Kuva kuvassa ‑tila nyt käytössä</translation>
 <translation id="658823671542763450">siirry koko näytön tilaan</translation>
 <translation id="663493177488814956">fiidi</translation>
 <translation id="6637586476836377253">loki</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">määritelmäluettelo</translation>
 <translation id="8597182159515967513">otsikko</translation>
 <translation id="8613126697340063924">hallinnoi etätoistoa</translation>
+<translation id="8741316211671074806">Kuva kuvassa</translation>
 <translation id="8750798805984357768">Valitse yksi vaihtoehdoista.</translation>
 <translation id="8785498733064193001">aloita toisto</translation>
 <translation id="8845239796550121995">Suoratoistetaan televisioosi</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb
index d365cc9..6694a3810 100644
--- a/content/app/strings/translations/content_strings_fr.xtb
+++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Caster</translation>
 <translation id="5546461542133609677">réactiver le son</translation>
 <translation id="561939826962581046">horodatage</translation>
+<translation id="5630795885300617244">Appuyez deux fois à gauche/droite pour reculer/avancer de 10 s</translation>
 <translation id="5641012560118721995">interrompre la lecture</translation>
 <translation id="5643186887447432888">bouton</translation>
 <translation id="5677946354068040947">plus d'options</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">curseur durée audio</translation>
 <translation id="648732519525291180">outil de sélection de l'heure</translation>
 <translation id="6550675742724504774">Options</translation>
+<translation id="6564313821541007458">Mode PIP (Picture-in-Picture) activé</translation>
 <translation id="658823671542763450">activer le mode plein écran</translation>
 <translation id="663493177488814956">flux</translation>
 <translation id="6637586476836377253">journal</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">liste de définitions</translation>
 <translation id="8597182159515967513">en-tête</translation>
 <translation id="8613126697340063924">contrôler la lecture à distance</translation>
+<translation id="8741316211671074806">Picture in Picture</translation>
 <translation id="8750798805984357768">Veuillez sélectionner l'une de ces options.</translation>
 <translation id="8785498733064193001">commencer la lecture</translation>
 <translation id="8845239796550121995">En cours de diffusion sur votre téléviseur</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb
index 8331cde..bac0dca 100644
--- a/content/app/strings/translations/content_strings_gu.xtb
+++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">કાસ્ટ કરો</translation>
 <translation id="5546461542133609677">અનમ્યૂટ કરો</translation>
 <translation id="561939826962581046">સમય</translation>
+<translation id="5630795885300617244">10 સેકન્ડ છોડવા માટે ડાબે અથવા જમણે બે વાર ટૅપ કરો</translation>
 <translation id="5641012560118721995">પ્લેબેક થોભાવો</translation>
 <translation id="5643186887447432888">બટન</translation>
 <translation id="5677946354068040947">વધુ વિકલ્પો</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ઑડિઓ સમય સ્ક્રબર</translation>
 <translation id="648732519525291180">સમય પીકર</translation>
 <translation id="6550675742724504774">વિકલ્પો</translation>
+<translation id="6564313821541007458">હાલમાં ચિત્ર-માં-ચિત્ર મોડમાં</translation>
 <translation id="658823671542763450">પૂર્ણ સ્ક્રીનમાં દાખલ થાઓ</translation>
 <translation id="663493177488814956">ફીડ</translation>
 <translation id="6637586476836377253">લૉગ</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">વિવરણ સૂચિ</translation>
 <translation id="8597182159515967513">મથાળું</translation>
 <translation id="8613126697340063924">રિમોટ પ્લેબેકનું નિયંત્રણ કરો</translation>
+<translation id="8741316211671074806">ચિત્ર-માં-ચિત્ર</translation>
 <translation id="8750798805984357768">કૃપા કરીને આ વિકલ્પોમાંથી કોઈ એક પસંદ કરો.</translation>
 <translation id="8785498733064193001">પ્લેબૅક શરૂ કરો</translation>
 <translation id="8845239796550121995">હમણાં તમારા TV પર કાસ્ટ કરી રહ્યાં છીએ</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb
index 4ce37b2..bc6bdfe1 100644
--- a/content/app/strings/translations/content_strings_hi.xtb
+++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">कास्‍ट करें</translation>
 <translation id="5546461542133609677">अनम्यूट करें</translation>
 <translation id="561939826962581046">समय</translation>
+<translation id="5630795885300617244">10 सेकंड आगे या पीछे जाने के लिए बाएं या दाएं पर दो बार टैप करें</translation>
 <translation id="5641012560118721995">प्लेबैक रोकें</translation>
 <translation id="5643186887447432888">बटन</translation>
 <translation id="5677946354068040947">अधिक विकल्प</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ऑडियो समय स्क्रबर</translation>
 <translation id="648732519525291180">समय पिकर</translation>
 <translation id="6550675742724504774">विकल्प</translation>
+<translation id="6564313821541007458">अब पिक्चर में पिक्चर मोड में</translation>
 <translation id="658823671542763450">पूर्ण स्क्रीन में प्रवेश करें</translation>
 <translation id="663493177488814956">फ़ीड</translation>
 <translation id="6637586476836377253">लॉग</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">परिभाषा सूची</translation>
 <translation id="8597182159515967513">हेडिंग</translation>
 <translation id="8613126697340063924">दूरस्थ प्लेबैक नियंत्रित करें</translation>
+<translation id="8741316211671074806">पिक्चर में पिक्चर</translation>
 <translation id="8750798805984357768">कृपया इनमें से कोई विकल्प चुनें.</translation>
 <translation id="8785498733064193001">प्लेबैक शुरू करें</translation>
 <translation id="8845239796550121995">अब आपके टीवी पर कास्ट हो रहा है</translation>
diff --git a/content/app/strings/translations/content_strings_hu.xtb b/content/app/strings/translations/content_strings_hu.xtb
index c774cc5..d851255 100644
--- a/content/app/strings/translations/content_strings_hu.xtb
+++ b/content/app/strings/translations/content_strings_hu.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Küldés</translation>
 <translation id="5546461542133609677">némítás feloldása</translation>
 <translation id="561939826962581046">idő</translation>
+<translation id="5630795885300617244">A jobb/bal oldalon duplán koppintva ugorhat előre/vissza 10 másodpercet</translation>
 <translation id="5641012560118721995">lejátszás szüneteltetése</translation>
 <translation id="5643186887447432888">gomb</translation>
 <translation id="5677946354068040947">további beállítások</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">hang idővonalának vezérlője</translation>
 <translation id="648732519525291180">időválasztó</translation>
 <translation id="6550675742724504774">Beállítások</translation>
+<translation id="6564313821541007458">Most kép a képben módban van</translation>
 <translation id="658823671542763450">teljes képernyős nézet</translation>
 <translation id="663493177488814956">hírcsatorna</translation>
 <translation id="6637586476836377253">napló</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">definíciós lista</translation>
 <translation id="8597182159515967513">fejléc</translation>
 <translation id="8613126697340063924">távoli lejátszás kezelése</translation>
+<translation id="8741316211671074806">Kép a képben</translation>
 <translation id="8750798805984357768">Kérjük, válassza ki az egyik opciót.</translation>
 <translation id="8785498733064193001">lejátszás indítása</translation>
 <translation id="8845239796550121995">Átküldés a tévére folyamatban</translation>
diff --git a/content/app/strings/translations/content_strings_it.xtb b/content/app/strings/translations/content_strings_it.xtb
index e08ec5b..ccf9901 100644
--- a/content/app/strings/translations/content_strings_it.xtb
+++ b/content/app/strings/translations/content_strings_it.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Trasmetti</translation>
 <translation id="5546461542133609677">riattiva audio</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Tocca due volte verso sinistra o destra per saltare di 10 secondi</translation>
 <translation id="5641012560118721995">sospendi riproduzione</translation>
 <translation id="5643186887447432888">pulsante</translation>
 <translation id="5677946354068040947">altre opzioni</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">dispositivo di scorrimento durata audio</translation>
 <translation id="648732519525291180">selettore di ora</translation>
 <translation id="6550675742724504774">Opzioni</translation>
+<translation id="6564313821541007458">Ora in modalità picture in picture</translation>
 <translation id="658823671542763450">passa a schermo intero</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">elenco di definizioni</translation>
 <translation id="8597182159515967513">intestazione</translation>
 <translation id="8613126697340063924">gestisci riproduzione remota</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8750798805984357768">Seleziona una di queste opzioni.</translation>
 <translation id="8785498733064193001">inizia riproduzione</translation>
 <translation id="8845239796550121995">Ora in fase di trasmissione alla TV</translation>
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb
index 480878f..39ba980 100644
--- a/content/app/strings/translations/content_strings_ja.xtb
+++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">キャスト</translation>
 <translation id="5546461542133609677">ミュートを解除</translation>
 <translation id="561939826962581046">日時</translation>
+<translation id="5630795885300617244">左または右をダブルタップして 10 秒スキップします</translation>
 <translation id="5641012560118721995">再生を一時停止</translation>
 <translation id="5643186887447432888">ボタン</translation>
 <translation id="5677946354068040947">その他のオプション</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">オーディオ再生バー</translation>
 <translation id="648732519525291180">時間選択ツール</translation>
 <translation id="6550675742724504774">オプション</translation>
+<translation id="6564313821541007458">ピクチャー イン ピクチャー モードで表示中です</translation>
 <translation id="658823671542763450">全画面表示</translation>
 <translation id="663493177488814956">フィード</translation>
 <translation id="6637586476836377253">ログ</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">定義リスト</translation>
 <translation id="8597182159515967513">見出し</translation>
 <translation id="8613126697340063924">リモート再生をコントロール</translation>
+<translation id="8741316211671074806">ピクチャー イン ピクチャー</translation>
 <translation id="8750798805984357768">これらのオプションから 1 つ選択してください。</translation>
 <translation id="8785498733064193001">再生を開始</translation>
 <translation id="8845239796550121995">テレビにキャストしています</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb
index 518d454..5cfc0960 100644
--- a/content/app/strings/translations/content_strings_ko.xtb
+++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">전송</translation>
 <translation id="5546461542133609677">음소거 해제</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">10초를 건너뛰려면 왼쪽이나 오른쪽을 두 번 탭하세요.</translation>
 <translation id="5641012560118721995">재생 일시중지</translation>
 <translation id="5643186887447432888">버튼</translation>
 <translation id="5677946354068040947">옵션 더보기</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">오디오 시간 스크러버</translation>
 <translation id="648732519525291180">시간 선택기</translation>
 <translation id="6550675742724504774">옵션</translation>
+<translation id="6564313821541007458">PIP 모드입니다.</translation>
 <translation id="658823671542763450">전체화면 열기</translation>
 <translation id="663493177488814956">피드</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">정의 목록</translation>
 <translation id="8597182159515967513">항목</translation>
 <translation id="8613126697340063924">원격 재생 제어</translation>
+<translation id="8741316211671074806">PIP 모드</translation>
 <translation id="8750798805984357768">다음 옵션 중 하나를 선택하세요.</translation>
 <translation id="8785498733064193001">재생 시작</translation>
 <translation id="8845239796550121995">TV로 전송 중</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb
index bb766a0..66589c2 100644
--- a/content/app/strings/translations/content_strings_ml.xtb
+++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">കാസ്‌റ്റുചെയ്യുക</translation>
 <translation id="5546461542133609677">ശബ്‌ദമുള്ളതാക്കുക</translation>
 <translation id="561939826962581046">സമയം</translation>
+<translation id="5630795885300617244">10 സെക്കൻഡ് ഒഴിവാക്കാൻ ഇടത്തോട്ടോ വലത്തോട്ടോ രണ്ടുതവണ ടാപ്പ് ചെയ്യുക</translation>
 <translation id="5641012560118721995">പ്ലേബാക്ക് താൽക്കാലികമായി നിർത്തുക</translation>
 <translation id="5643186887447432888">ബട്ടൺ</translation>
 <translation id="5677946354068040947">കൂടുതൽ ഓപ്‌ഷനുകൾ</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ഓഡിയോ സമയ സ്‌ക്രബർ</translation>
 <translation id="648732519525291180">സമയ പിക്കർ</translation>
 <translation id="6550675742724504774">ഓപ്ഷനുകൾ</translation>
+<translation id="6564313821541007458">ഇപ്പോൾ ചിത്രത്തിനുള്ളിലെ ചിത്രം മോഡിൽ</translation>
 <translation id="658823671542763450">പൂർണ്ണ സ്‌ക്രീനിലേക്ക് പോവുക</translation>
 <translation id="663493177488814956">ഫീഡ്</translation>
 <translation id="6637586476836377253">ലോഗ്</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">നിർവചന ലിസ്റ്റ്</translation>
 <translation id="8597182159515967513">തലക്കെട്ട്</translation>
 <translation id="8613126697340063924">വിദൂര പ്ലേബാക്ക് നിയന്ത്രിക്കുക</translation>
+<translation id="8741316211671074806">ചിത്രത്തിനുള്ളിലെ ചിത്രം</translation>
 <translation id="8750798805984357768">ഈ ഓപ്ഷനുകളിലൊന്ന് ദയവായി തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="8785498733064193001">പ്ലേബാക്ക് ആരംഭിക്കുക</translation>
 <translation id="8845239796550121995">ഇപ്പോൾ നിങ്ങളുടെ ടിവിയിൽ കാസ്‌റ്റുചെയ്യുന്നു</translation>
diff --git a/content/app/strings/translations/content_strings_mr.xtb b/content/app/strings/translations/content_strings_mr.xtb
index a0461c7..15380ce 100644
--- a/content/app/strings/translations/content_strings_mr.xtb
+++ b/content/app/strings/translations/content_strings_mr.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">कास्ट करा</translation>
 <translation id="5546461542133609677">सशब्द करा</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">10 सेकंद वगळण्यासाठी डावीकडे किंवा उजवीकडे दोनदा टॅप करा</translation>
 <translation id="5641012560118721995">प्लेबॅकला विराम द्या</translation>
 <translation id="5643186887447432888">बटण</translation>
 <translation id="5677946354068040947">अधिक पर्याय</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ऑडिओ वेळ स्क्रबर</translation>
 <translation id="648732519525291180">वेळ निवडक</translation>
 <translation id="6550675742724504774">पर्याय</translation>
+<translation id="6564313821541007458">आता चित्रात-चित्र मोडमध्ये</translation>
 <translation id="658823671542763450">पूर्ण स्क्रीन एंटर करा</translation>
 <translation id="663493177488814956">फीड</translation>
 <translation id="6637586476836377253">लॉग</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">परिभाषा सूची</translation>
 <translation id="8597182159515967513">शीर्षलेख</translation>
 <translation id="8613126697340063924">दूरस्थ प्लेबॅक नियंत्रित करा</translation>
+<translation id="8741316211671074806">चित्रात-चित्र</translation>
 <translation id="8750798805984357768">कृपया या पर्यायांपैकी एक निवडा.</translation>
 <translation id="8785498733064193001">प्लेबॅक आरंभ करा</translation>
 <translation id="8845239796550121995">आता तुमच्या टिव्हीवर कास्ट करत आहे</translation>
diff --git a/content/app/strings/translations/content_strings_nl.xtb b/content/app/strings/translations/content_strings_nl.xtb
index dd11e10..256f9a2 100644
--- a/content/app/strings/translations/content_strings_nl.xtb
+++ b/content/app/strings/translations/content_strings_nl.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5546461542133609677">dempen opheffen</translation>
 <translation id="561939826962581046">tijd</translation>
+<translation id="5630795885300617244">Dubbeltik links of rechts om 10 seconden over te slaan</translation>
 <translation id="5641012560118721995">afspelen onderbreken</translation>
 <translation id="5643186887447432888">knop</translation>
 <translation id="5677946354068040947">meer opties</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">scrollbar met audiotijd</translation>
 <translation id="648732519525291180">tijdkiezer</translation>
 <translation id="6550675742724504774">Opties</translation>
+<translation id="6564313821541007458">Nu in scherm-in-scherm-modus</translation>
 <translation id="658823671542763450">volledig scherm openen</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">logboek</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">definitielijst</translation>
 <translation id="8597182159515967513">kop</translation>
 <translation id="8613126697340063924">afspelen bedienen op afstand</translation>
+<translation id="8741316211671074806">Scherm-in-scherm</translation>
 <translation id="8750798805984357768">Selecteer een van deze opties.</translation>
 <translation id="8785498733064193001">afspelen starten</translation>
 <translation id="8845239796550121995">Wordt nu gecast naar je tv</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb
index 396d5188..46de87f 100644
--- a/content/app/strings/translations/content_strings_no.xtb
+++ b/content/app/strings/translations/content_strings_no.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5546461542133609677">slå på lyden</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Dobbelttrykk på venstre eller høyre side for å hoppe 10 sekunder</translation>
 <translation id="5641012560118721995">stopp avspillingen midlertidig</translation>
 <translation id="5643186887447432888">knapp</translation>
 <translation id="5677946354068040947">flere alternativer</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">lydtidslinje</translation>
 <translation id="648732519525291180">klokkeslettvelger</translation>
 <translation id="6550675742724504774">Alternativer</translation>
+<translation id="6564313821541007458">Nå i bilde-i-bilde-modus</translation>
 <translation id="658823671542763450">gå til fullskjermmodus</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">logg</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">definisjonsliste</translation>
 <translation id="8597182159515967513">overskrift</translation>
 <translation id="8613126697340063924">kontrollér ekstern avspilling</translation>
+<translation id="8741316211671074806">Bilde-i-bilde</translation>
 <translation id="8750798805984357768">Velg ett av følgende alternativer.</translation>
 <translation id="8785498733064193001">start avspillingen</translation>
 <translation id="8845239796550121995">Caster til TV-en nå</translation>
diff --git a/content/app/strings/translations/content_strings_ro.xtb b/content/app/strings/translations/content_strings_ro.xtb
index 54b960d..59eedb6 100644
--- a/content/app/strings/translations/content_strings_ro.xtb
+++ b/content/app/strings/translations/content_strings_ro.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Proiectează</translation>
 <translation id="5546461542133609677">activați sunetul</translation>
 <translation id="561939826962581046">oră</translation>
+<translation id="5630795885300617244">Atinge de două ori spre stânga sau spre dreapta pentru a derula cu 10 secunde</translation>
 <translation id="5641012560118721995">întrerupeți redarea</translation>
 <translation id="5643186887447432888">buton</translation>
 <translation id="5677946354068040947">mai multe opțiuni</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">glisor redare audio</translation>
 <translation id="648732519525291180">selector oră</translation>
 <translation id="6550675742724504774">Opțiuni</translation>
+<translation id="6564313821541007458">Ești acum în modul picture-in-picture</translation>
 <translation id="658823671542763450">deschideți în ecran complet</translation>
 <translation id="663493177488814956">feed</translation>
 <translation id="6637586476836377253">jurnal</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">listă de definiții</translation>
 <translation id="8597182159515967513">antet</translation>
 <translation id="8613126697340063924">controlează redarea la distanță</translation>
+<translation id="8741316211671074806">Picture-in-Picture</translation>
 <translation id="8750798805984357768">Selectează una dintre aceste opțiuni.</translation>
 <translation id="8785498733064193001">începeți redarea</translation>
 <translation id="8845239796550121995">Acum se proiectează pe televizor</translation>
diff --git a/content/app/strings/translations/content_strings_ru.xtb b/content/app/strings/translations/content_strings_ru.xtb
index ece878ca..4638df2 100644
--- a/content/app/strings/translations/content_strings_ru.xtb
+++ b/content/app/strings/translations/content_strings_ru.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5546461542133609677">включение звука</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">Чтобы пропустить 10 секунд, нажмите дважды слева или справа.</translation>
 <translation id="5641012560118721995">пауза</translation>
 <translation id="5643186887447432888">кнопка</translation>
 <translation id="5677946354068040947">дополнительные параметры</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">полоса воспроизведения</translation>
 <translation id="648732519525291180">окно выбора даты</translation>
 <translation id="6550675742724504774">Параметры</translation>
+<translation id="6564313821541007458">В режиме "Картинка в картинке"</translation>
 <translation id="658823671542763450">полноэкранный режим</translation>
 <translation id="663493177488814956">лента</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">список описаний</translation>
 <translation id="8597182159515967513">заголовок</translation>
 <translation id="8613126697340063924">управлять воспроизведением на удаленных устройствах</translation>
+<translation id="8741316211671074806">Картинка в картинке</translation>
 <translation id="8750798805984357768">Выберите один из вариантов.</translation>
 <translation id="8785498733064193001">начать воспроизведение</translation>
 <translation id="8845239796550121995">Транслируется на телевизор</translation>
diff --git a/content/app/strings/translations/content_strings_sl.xtb b/content/app/strings/translations/content_strings_sl.xtb
index e135574..af6716e2 100644
--- a/content/app/strings/translations/content_strings_sl.xtb
+++ b/content/app/strings/translations/content_strings_sl.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Predvajanje</translation>
 <translation id="5546461542133609677">vklop zvoka</translation>
 <translation id="561939826962581046">čas</translation>
+<translation id="5630795885300617244">Dvakrat se dotaknite levo ali desno, da preskočite 10 s</translation>
 <translation id="5641012560118721995">začasna ustavitev predvajanja</translation>
 <translation id="5643186887447432888">gumb</translation>
 <translation id="5677946354068040947">več možnosti</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">časovni krmilnik za predvajanje zvoka</translation>
 <translation id="648732519525291180">izbirnik ure</translation>
 <translation id="6550675742724504774">Možnosti</translation>
+<translation id="6564313821541007458">Izbran je način slike v sliki</translation>
 <translation id="658823671542763450">prehod v celozaslonski način</translation>
 <translation id="663493177488814956">vir</translation>
 <translation id="6637586476836377253">dnevn</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">seznam opredelitev</translation>
 <translation id="8597182159515967513">naslov</translation>
 <translation id="8613126697340063924">upravljanje oddaljenega predvajanja</translation>
+<translation id="8741316211671074806">Slika v sliki</translation>
 <translation id="8750798805984357768">Izberite eno od teh možnosti.</translation>
 <translation id="8785498733064193001">začetek predvajanja</translation>
 <translation id="8845239796550121995">Predvajanje na televizorju</translation>
diff --git a/content/app/strings/translations/content_strings_sr.xtb b/content/app/strings/translations/content_strings_sr.xtb
index e284efc..9893f4f 100644
--- a/content/app/strings/translations/content_strings_sr.xtb
+++ b/content/app/strings/translations/content_strings_sr.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Пребацуј</translation>
 <translation id="5546461542133609677">укључите звук</translation>
 <translation id="561939826962581046">време</translation>
+<translation id="5630795885300617244">Двапут додирните лево или десно да бисте прескочили 10 сек</translation>
 <translation id="5641012560118721995">паузирајте репродукцију</translation>
 <translation id="5643186887447432888">дугме</translation>
 <translation id="5677946354068040947">још опција</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">клизач за трајање аудио-садржаја</translation>
 <translation id="648732519525291180">бирач времена</translation>
 <translation id="6550675742724504774">Опције</translation>
+<translation id="6564313821541007458">Сада у режиму Слика у слици</translation>
 <translation id="658823671542763450">пређите на режим целог екрана</translation>
 <translation id="663493177488814956">фид</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">листа дефиниција</translation>
 <translation id="8597182159515967513">наслов</translation>
 <translation id="8613126697340063924">контролишите репродукцију на удаљеном уређају</translation>
+<translation id="8741316211671074806">Слика у слици</translation>
 <translation id="8750798805984357768">Изаберите неку од ових опција.</translation>
 <translation id="8785498733064193001">започните репродукцију</translation>
 <translation id="8845239796550121995">Тренутно се пребацује на ТВ</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb
index 5d7521e..5eb61db 100644
--- a/content/app/strings/translations/content_strings_sv.xtb
+++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Casta</translation>
 <translation id="5546461542133609677">visa</translation>
 <translation id="561939826962581046">tid</translation>
+<translation id="5630795885300617244">Hoppa över 10 s genom att trycka snabbt två gånger till vänster/höger</translation>
 <translation id="5641012560118721995">pausa uppspelning</translation>
 <translation id="5643186887447432888">knapp</translation>
 <translation id="5677946354068040947">fler alternativ</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">tidsreglage för ljud</translation>
 <translation id="648732519525291180">tidsväljare</translation>
 <translation id="6550675742724504774">Alternativ</translation>
+<translation id="6564313821541007458">Visas i läget bild-i-bild</translation>
 <translation id="658823671542763450">visa i helskärm</translation>
 <translation id="663493177488814956">flöde</translation>
 <translation id="6637586476836377253">logg</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">definitionslista</translation>
 <translation id="8597182159515967513">rubrik</translation>
 <translation id="8613126697340063924">styra fjärruppspelning</translation>
+<translation id="8741316211671074806">Bild i bild</translation>
 <translation id="8750798805984357768">Välj ett av följande alternativ.</translation>
 <translation id="8785498733064193001">starta uppspelning</translation>
 <translation id="8845239796550121995">Castar nu till TV:n</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb
index c08c9e3..5373e141 100644
--- a/content/app/strings/translations/content_strings_ta.xtb
+++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">அனுப்பு</translation>
 <translation id="5546461542133609677">ஒலி இயக்கு</translation>
 <translation id="561939826962581046">நேரம்</translation>
+<translation id="5630795885300617244">10வி தவிர்க்க, இடது அல்லது வலதுபுறம் இருமுறை தட்டவும்</translation>
 <translation id="5641012560118721995">மறுஇயக்கத்தை இடைநிறுத்து</translation>
 <translation id="5643186887447432888">பொத்தான்</translation>
 <translation id="5677946354068040947">கூடுதல் விருப்பங்கள் பொத்தான்</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ஆடியோ நேர ஸ்கிரப்பர்</translation>
 <translation id="648732519525291180">நேரம் தேர்ந்தெடுப்பான்</translation>
 <translation id="6550675742724504774">விருப்பத்தேர்வுகள்</translation>
+<translation id="6564313821541007458">இப்போது பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையில் உள்ளது</translation>
 <translation id="658823671542763450">முழுத்திரைக்குச் செல்</translation>
 <translation id="663493177488814956">ஊட்டம்</translation>
 <translation id="6637586476836377253">பதிவு</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">விளக்கப் பட்டியல்</translation>
 <translation id="8597182159515967513">தலைப்பு</translation>
 <translation id="8613126697340063924">தொலைநிலை இயக்கத்தைக் கட்டுப்படுத்தவும்</translation>
+<translation id="8741316211671074806">பிக்ச்சர்-இன்-பிக்ச்சர்</translation>
 <translation id="8750798805984357768">தயவுசெய்து இந்த விருப்பங்களில் ஒன்றைத் தேர்ந்தெடுங்கள்.</translation>
 <translation id="8785498733064193001">மறுஇயக்கத்தைத் தொடங்கு</translation>
 <translation id="8845239796550121995">டிவிக்கு அனுப்புகிறது</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb
index 4de8bd2..1c5d44f8 100644
--- a/content/app/strings/translations/content_strings_te.xtb
+++ b/content/app/strings/translations/content_strings_te.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5546461542133609677">అన్‌మ్యూట్ చేయి</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">10సె దాటవేయడానికి రెండుసార్లు ఎడమ లేదా కుడివైపుకి నొక్కండి</translation>
 <translation id="5641012560118721995">ప్లేబ్యాక్‌ను పాజ్ చేయి</translation>
 <translation id="5643186887447432888">బటన్</translation>
 <translation id="5677946354068040947">మరిన్ని ఎంపికలు</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ఆడియో సమయ స్క్రబ్బర్</translation>
 <translation id="648732519525291180">సమయం ఎంపిక</translation>
 <translation id="6550675742724504774">ఎంపికలు</translation>
+<translation id="6564313821541007458">ఇప్పుడు చిత్రంలో చిత్రం మోడ్‌లో ఉంది</translation>
 <translation id="658823671542763450">పూర్తి స్క్రీన్‌లోకి ప్రవేశించు</translation>
 <translation id="663493177488814956">ఫీడ్</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">నిర్వచన జాబితా</translation>
 <translation id="8597182159515967513">శీర్షిక</translation>
 <translation id="8613126697340063924">రిమోట్ ప్లేబ్యాక్‌ను నియంత్రిస్తుంది</translation>
+<translation id="8741316211671074806">చిత్రంలో చిత్రం</translation>
 <translation id="8750798805984357768">దయచేసి ఈ ఎంపికలలో ఒకదాన్ని ఎంచుకోండి.</translation>
 <translation id="8785498733064193001">ప్లేబ్యాక్‌ను ప్రారంభించు</translation>
 <translation id="8845239796550121995">ఇప్పుడు మీ టీవీలో ప్రసారం చేస్తోంది</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb
index f76978c..cfe8f03 100644
--- a/content/app/strings/translations/content_strings_tr.xtb
+++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">Yayınla</translation>
 <translation id="5546461542133609677">sesi aç</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">10 sn. atlamak için sola veya sağa iki kez dokunun</translation>
 <translation id="5641012560118721995">oynatmayı duraklat</translation>
 <translation id="5643186887447432888">düğme</translation>
 <translation id="5677946354068040947">diğer seçenekler</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">ses zaman çizelgesi temizleyici</translation>
 <translation id="648732519525291180">zaman seçici</translation>
 <translation id="6550675742724504774">Seçenekler</translation>
+<translation id="6564313821541007458">Şimdi Pencere içinde Pencere modunda</translation>
 <translation id="658823671542763450">tam ekrana geç</translation>
 <translation id="663493177488814956">kartlar</translation>
 <translation id="6637586476836377253">log</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">tanım listesi</translation>
 <translation id="8597182159515967513">başlık</translation>
 <translation id="8613126697340063924">uzaktan oynatmayı kontrol et</translation>
+<translation id="8741316211671074806">Pencere İçinde Pencere</translation>
 <translation id="8750798805984357768">Lütfen bu seçeneklerden birini belirleyin.</translation>
 <translation id="8785498733064193001">oynatmayı başlat</translation>
 <translation id="8845239796550121995">Şimdi TV'nize yayınlanıyor</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb
index fb41a90..b582ad3 100644
--- a/content/app/strings/translations/content_strings_zh-CN.xtb
+++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">投射</translation>
 <translation id="5546461542133609677">取消静音</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">在左侧或右侧点按两次即可跳过 10 秒</translation>
 <translation id="5641012560118721995">暂停播放</translation>
 <translation id="5643186887447432888">按钮</translation>
 <translation id="5677946354068040947">更多选项</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">音频时间进度条</translation>
 <translation id="648732519525291180">时间选择器</translation>
 <translation id="6550675742724504774">选项</translation>
+<translation id="6564313821541007458">现为画中画模式</translation>
 <translation id="658823671542763450">进入全屏模式</translation>
 <translation id="663493177488814956">Feed</translation>
 <translation id="6637586476836377253">日志</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">定义列表</translation>
 <translation id="8597182159515967513">标题</translation>
 <translation id="8613126697340063924">控制远程播放</translation>
+<translation id="8741316211671074806">画中画</translation>
 <translation id="8750798805984357768">请从这些选项中选择一个。</translation>
 <translation id="8785498733064193001">开始播放</translation>
 <translation id="8845239796550121995">现在正投射到您的电视上</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb
index 084b513..90b27cd 100644
--- a/content/app/strings/translations/content_strings_zh-TW.xtb
+++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -105,6 +105,7 @@
 <translation id="5537725057119320332">投放</translation>
 <translation id="5546461542133609677">取消靜音</translation>
 <translation id="561939826962581046">time</translation>
+<translation id="5630795885300617244">輕觸兩下左側或右側可跳過 10 秒</translation>
 <translation id="5641012560118721995">暫停播放</translation>
 <translation id="5643186887447432888">按鈕</translation>
 <translation id="5677946354068040947">更多選項</translation>
@@ -123,6 +124,7 @@
 <translation id="6404546809543547843">音訊時間點拖曳工具</translation>
 <translation id="648732519525291180">時間選擇器</translation>
 <translation id="6550675742724504774">選項</translation>
+<translation id="6564313821541007458">目前在子母畫面模式中</translation>
 <translation id="658823671542763450">進入全螢幕</translation>
 <translation id="663493177488814956">資訊提供</translation>
 <translation id="6637586476836377253">紀錄</translation>
@@ -173,6 +175,7 @@
 <translation id="8583702881314752957">定義清單</translation>
 <translation id="8597182159515967513">標題</translation>
 <translation id="8613126697340063924">控制遠端播放</translation>
+<translation id="8741316211671074806">子母畫面</translation>
 <translation id="8750798805984357768">請選取其中一個選項。</translation>
 <translation id="8785498733064193001">開始播放</translation>
 <translation id="8845239796550121995">正在投放到電視上</translation>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 55ae5ac..81102b9 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -691,8 +691,6 @@
     "download/base_file.h",
     "download/base_file_posix.cc",
     "download/base_file_win.cc",
-    "download/download_create_info.cc",
-    "download/download_create_info.h",
     "download/download_destination_observer.h",
     "download/download_file.h",
     "download/download_file_factory.cc",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.cc b/content/browser/accessibility/accessibility_tree_formatter_win.cc
index b7af54ee..3d33fbb 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_win.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_win.cc
@@ -314,7 +314,7 @@
     if (child_variant.type() == VT_DISPATCH) {
       dispatch = V_DISPATCH(child_variant.ptr());
     } else if (child_variant.type() == VT_I4) {
-      HRESULT hr = node->get_accChild(child_variant, dispatch.GetAddressOf());
+      hr = node->get_accChild(child_variant, dispatch.GetAddressOf());
       if (FAILED(hr)) {
         child_dict->SetString("error",
                               base::ASCIIToUTF16("[Error retrieving child]"));
diff --git a/content/browser/android/web_contents_observer_proxy.cc b/content/browser/android/web_contents_observer_proxy.cc
index 8b6c63b..2aa3ab1 100644
--- a/content/browser/android/web_contents_observer_proxy.cc
+++ b/content/browser/android/web_contents_observer_proxy.cc
@@ -199,6 +199,11 @@
   Java_WebContentsObserverProxy_navigationEntryCommitted(env, java_observer_);
 }
 
+void WebContentsObserverProxy::NavigationEntriesDeleted() {
+  JNIEnv* env = AttachCurrentThread();
+  Java_WebContentsObserverProxy_navigationEntriesDeleted(env, java_observer_);
+}
+
 void WebContentsObserverProxy::DidAttachInterstitialPage() {
   JNIEnv* env = AttachCurrentThread();
   Java_WebContentsObserverProxy_didAttachInterstitialPage(env, java_observer_);
diff --git a/content/browser/android/web_contents_observer_proxy.h b/content/browser/android/web_contents_observer_proxy.h
index 4b39b1e..2278b03 100644
--- a/content/browser/android/web_contents_observer_proxy.h
+++ b/content/browser/android/web_contents_observer_proxy.h
@@ -51,6 +51,7 @@
   void DocumentLoadedInFrame(RenderFrameHost* render_frame_host) override;
   void NavigationEntryCommitted(
       const LoadCommittedDetails& load_details) override;
+  void NavigationEntriesDeleted() override;
   void WebContentsDestroyed() override;
   void DidAttachInterstitialPage() override;
   void DidDetachInterstitialPage() override;
diff --git a/content/browser/appcache/appcache_internals_ui.cc b/content/browser/appcache/appcache_internals_ui.cc
index f6f494a3..b5f06aba 100644
--- a/content/browser/appcache/appcache_internals_ui.cc
+++ b/content/browser/appcache/appcache_internals_ui.cc
@@ -294,10 +294,10 @@
         appcache_service_->storage()->CreateResponseReader(
             GURL(response_enquiry.manifest_url), response_enquiry.response_id));
 
-    reader->ReadData(
-        response_data.get(), amount_to_read,
-        base::Bind(&Proxy::OnResponseDataReadComplete, this, response_enquiry,
-                   response_info, base::Passed(&reader), response_data));
+    reader->ReadData(response_data.get(), amount_to_read,
+                     base::BindOnce(&Proxy::OnResponseDataReadComplete, this,
+                                    response_enquiry, response_info,
+                                    base::Passed(&reader), response_data));
   } else {
     OnResponseDataReadComplete(response_enquiry, nullptr, nullptr, nullptr, -1);
   }
diff --git a/content/browser/appcache/appcache_quota_client_unittest.cc b/content/browser/appcache/appcache_quota_client_unittest.cc
index 7ffe479b..9168b16 100644
--- a/content/browser/appcache/appcache_quota_client_unittest.cc
+++ b/content/browser/appcache/appcache_quota_client_unittest.cc
@@ -81,15 +81,14 @@
                            StorageType type) {
     client->GetOriginUsage(
         origin, type,
-        base::Bind(&AppCacheQuotaClientTest::OnGetOriginUsageComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&AppCacheQuotaClientTest::OnGetOriginUsageComplete,
+                       weak_factory_.GetWeakPtr()));
   }
 
   void AsyncGetOriginsForType(storage::QuotaClient* client, StorageType type) {
     client->GetOriginsForType(
-        type,
-        base::Bind(&AppCacheQuotaClientTest::OnGetOriginsComplete,
-                   weak_factory_.GetWeakPtr()));
+        type, base::BindOnce(&AppCacheQuotaClientTest::OnGetOriginsComplete,
+                             weak_factory_.GetWeakPtr()));
   }
 
   void AsyncGetOriginsForHost(storage::QuotaClient* client,
@@ -97,8 +96,8 @@
                               const std::string& host) {
     client->GetOriginsForHost(
         type, host,
-        base::Bind(&AppCacheQuotaClientTest::OnGetOriginsComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&AppCacheQuotaClientTest::OnGetOriginsComplete,
+                       weak_factory_.GetWeakPtr()));
   }
 
   void AsyncDeleteOriginData(storage::QuotaClient* client,
@@ -106,8 +105,8 @@
                              const url::Origin& origin) {
     client->DeleteOriginData(
         origin, type,
-        base::Bind(&AppCacheQuotaClientTest::OnDeleteOriginDataComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&AppCacheQuotaClientTest::OnDeleteOriginDataComplete,
+                       weak_factory_.GetWeakPtr()));
   }
 
   void SetUsageMapEntry(const url::Origin& origin, int64_t usage) {
diff --git a/content/browser/appcache/appcache_response_unittest.cc b/content/browser/appcache/appcache_response_unittest.cc
index 524c4a66..d0c9162 100644
--- a/content/browser/appcache/appcache_response_unittest.cc
+++ b/content/browser/appcache/appcache_response_unittest.cc
@@ -190,19 +190,19 @@
     EXPECT_FALSE(writer_->IsWritePending());
     expected_write_result_ = GetHttpResponseInfoSize(head);
     write_info_buffer_ = new HttpResponseInfoIOBuffer(head);
-    writer_->WriteInfo(write_info_buffer_.get(),
-                       base::Bind(&AppCacheResponseTest::OnWriteInfoComplete,
-                                  base::Unretained(this)));
+    writer_->WriteInfo(
+        write_info_buffer_.get(),
+        base::BindOnce(&AppCacheResponseTest::OnWriteInfoComplete,
+                       base::Unretained(this)));
   }
 
   void WriteResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) {
     EXPECT_FALSE(writer_->IsWritePending());
     write_buffer_ = io_buffer;
     expected_write_result_ = buf_len;
-    writer_->WriteData(write_buffer_.get(),
-                       buf_len,
-                       base::Bind(&AppCacheResponseTest::OnWriteComplete,
-                                  base::Unretained(this)));
+    writer_->WriteData(write_buffer_.get(), buf_len,
+                       base::BindOnce(&AppCacheResponseTest::OnWriteComplete,
+                                      base::Unretained(this)));
   }
 
   void WriteResponseMetadata(scoped_refptr<IOBuffer> io_buffer, int buf_len) {
@@ -219,10 +219,9 @@
     EXPECT_FALSE(reader_->IsReadPending());
     read_buffer_ = io_buffer;
     expected_read_result_ = buf_len;
-    reader_->ReadData(read_buffer_.get(),
-                      buf_len,
-                      base::Bind(&AppCacheResponseTest::OnReadComplete,
-                                 base::Unretained(this)));
+    reader_->ReadData(read_buffer_.get(), buf_len,
+                      base::BindOnce(&AppCacheResponseTest::OnReadComplete,
+                                     base::Unretained(this)));
   }
 
   // AppCacheResponseReader / Writer completion callbacks
@@ -340,8 +339,8 @@
     EXPECT_FALSE(reader_->IsReadPending());
     read_info_buffer_ = new HttpResponseInfoIOBuffer();
     reader_->ReadInfo(read_info_buffer_.get(),
-                      base::Bind(&AppCacheResponseTest::OnReadInfoComplete,
-                                 base::Unretained(this)));
+                      base::BindOnce(&AppCacheResponseTest::OnReadInfoComplete,
+                                     base::Unretained(this)));
     EXPECT_TRUE(reader_->IsReadPending());
     expected_read_result_ = net::ERR_CACHE_MISS;
   }
@@ -349,10 +348,9 @@
   void ReadNonExistentData() {
     EXPECT_FALSE(reader_->IsReadPending());
     read_buffer_ = new IOBuffer(kBlockSize);
-    reader_->ReadData(read_buffer_.get(),
-                      kBlockSize,
-                      base::Bind(&AppCacheResponseTest::OnReadComplete,
-                                 base::Unretained(this)));
+    reader_->ReadData(read_buffer_.get(), kBlockSize,
+                      base::BindOnce(&AppCacheResponseTest::OnReadComplete,
+                                     base::Unretained(this)));
     EXPECT_TRUE(reader_->IsReadPending());
     expected_read_result_ = net::ERR_CACHE_MISS;
   }
@@ -616,10 +614,9 @@
     EXPECT_FALSE(reader_->IsReadPending());
     read_buffer_ = new IOBuffer(kBlockSize);
     expected_read_result_ = 0;
-    reader_->ReadData(read_buffer_.get(),
-                      kBlockSize,
-                      base::Bind(&AppCacheResponseTest::OnReadComplete,
-                                 base::Unretained(this)));
+    reader_->ReadData(read_buffer_.get(), kBlockSize,
+                      base::BindOnce(&AppCacheResponseTest::OnReadComplete,
+                                     base::Unretained(this)));
   }
 
   void ReadRange() {
@@ -668,11 +665,11 @@
 
     // Push tasks in reverse order
     PushNextTaskAsImmediate(
-        base::Bind(&AppCacheResponseTest::ReadInBlocksImmediately,
-                   base::Unretained(this)));
+        base::BindOnce(&AppCacheResponseTest::ReadInBlocksImmediately,
+                       base::Unretained(this)));
     PushNextTaskAsImmediate(
-        base::Bind(&AppCacheResponseTest::WriteOutBlocksImmediately,
-                   base::Unretained(this)));
+        base::BindOnce(&AppCacheResponseTest::WriteOutBlocksImmediately,
+                       base::Unretained(this)));
 
     // Get them going.
     ScheduleNextTask();
@@ -683,8 +680,8 @@
     written_response_id_ = writer_->response_id();
     for (int i = 0; i < kNumBlocks; ++i) {
       PushNextTaskAsImmediate(
-          base::Bind(&AppCacheResponseTest::WriteOneBlock,
-                     base::Unretained(this), kNumBlocks - i));
+          base::BindOnce(&AppCacheResponseTest::WriteOneBlock,
+                         base::Unretained(this), kNumBlocks - i));
     }
     ScheduleNextTask();
   }
@@ -695,16 +692,16 @@
         GURL(), written_response_id_));
     for (int i = 0; i < kNumBlocks; ++i) {
       PushNextTaskAsImmediate(
-          base::Bind(&AppCacheResponseTest::ReadOneBlockImmediately,
-                     base::Unretained(this),
-          kNumBlocks - i));
+          base::BindOnce(&AppCacheResponseTest::ReadOneBlockImmediately,
+                         base::Unretained(this), kNumBlocks - i));
     }
     ScheduleNextTask();
   }
 
   void ReadOneBlockImmediately(int block_number) {
-    PushNextTaskAsImmediate(base::Bind(&AppCacheResponseTest::VerifyOneBlock,
-                                       base::Unretained(this), block_number));
+    PushNextTaskAsImmediate(
+        base::BindOnce(&AppCacheResponseTest::VerifyOneBlock,
+                       base::Unretained(this), block_number));
     ReadResponseBody(new IOBuffer(kBlockSize), kBlockSize);
   }
 
diff --git a/content/browser/appcache/appcache_service_impl.cc b/content/browser/appcache/appcache_service_impl.cc
index 06f166f..163feb5 100644
--- a/content/browser/appcache/appcache_service_impl.cc
+++ b/content/browser/appcache/appcache_service_impl.cc
@@ -336,8 +336,8 @@
   info_buffer_ = new HttpResponseInfoIOBuffer();
   response_reader_->ReadInfo(
       info_buffer_.get(),
-      base::Bind(&CheckResponseHelper::OnReadInfoComplete,
-                 base::Unretained(this)));
+      base::BindOnce(&CheckResponseHelper::OnReadInfoComplete,
+                     base::Unretained(this)));
 }
 
 void AppCacheServiceImpl::CheckResponseHelper::OnReadInfoComplete(int result) {
@@ -353,10 +353,9 @@
   // Start reading the data.
   data_buffer_ = new net::IOBuffer(kIOBufferSize);
   response_reader_->ReadData(
-      data_buffer_.get(),
-      kIOBufferSize,
-      base::Bind(&CheckResponseHelper::OnReadDataComplete,
-                 base::Unretained(this)));
+      data_buffer_.get(), kIOBufferSize,
+      base::BindOnce(&CheckResponseHelper::OnReadDataComplete,
+                     base::Unretained(this)));
 }
 
 void AppCacheServiceImpl::CheckResponseHelper::OnReadDataComplete(int result) {
@@ -364,10 +363,9 @@
     // Keep reading until we've read thru everything or failed to read.
     amount_data_read_ += result;
     response_reader_->ReadData(
-        data_buffer_.get(),
-        kIOBufferSize,
-        base::Bind(&CheckResponseHelper::OnReadDataComplete,
-                   base::Unretained(this)));
+        data_buffer_.get(), kIOBufferSize,
+        base::BindOnce(&CheckResponseHelper::OnReadDataComplete,
+                       base::Unretained(this)));
     return;
   }
 
diff --git a/content/browser/appcache/appcache_storage.cc b/content/browser/appcache/appcache_storage.cc
index 58b1e85..55b5765 100644
--- a/content/browser/appcache/appcache_storage.cc
+++ b/content/browser/appcache/appcache_storage.cc
@@ -60,8 +60,8 @@
     return;
   reader_.reset(storage_->CreateResponseReader(manifest_url_, response_id_));
   reader_->ReadInfo(info_buffer_.get(),
-                    base::Bind(&ResponseInfoLoadTask::OnReadComplete,
-                               base::Unretained(this)));
+                    base::BindOnce(&ResponseInfoLoadTask::OnReadComplete,
+                                   base::Unretained(this)));
 }
 
 void AppCacheStorage::ResponseInfoLoadTask::OnReadComplete(int result) {
diff --git a/content/browser/appcache/appcache_storage_impl_unittest.cc b/content/browser/appcache/appcache_storage_impl_unittest.cc
index 3621b0d..480ffa86 100644
--- a/content/browser/appcache/appcache_storage_impl_unittest.cc
+++ b/content/browser/appcache/appcache_storage_impl_unittest.cc
@@ -1609,8 +1609,8 @@
     if (phase == 1) {
       // We should not find anything for the online namespace.
       PushNextTask(
-          base::Bind(&AppCacheStorageImplTest::Verify_ExclusionNotFound,
-                     base::Unretained(this), kOnlineNamespace, 2));
+          base::BindOnce(&AppCacheStorageImplTest::Verify_ExclusionNotFound,
+                         base::Unretained(this), kOnlineNamespace, 2));
       storage()->FindResponseForMainRequest(
           kOnlineNamespace, GURL(), delegate());
       return;
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc
index 3e64448..83e4def 100644
--- a/content/browser/appcache/appcache_subresource_url_factory.cc
+++ b/content/browser/appcache/appcache_subresource_url_factory.cc
@@ -59,7 +59,7 @@
         host_(appcache_host),
         weak_factory_(this) {
     DCHECK_CURRENTLY_ON(BrowserThread::IO);
-    remote_binding_.set_connection_error_handler(base::Bind(
+    remote_binding_.set_connection_error_handler(base::BindOnce(
         &SubresourceLoader::OnConnectionError, base::Unretained(this)));
     base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
diff --git a/content/browser/appcache/appcache_update_job.cc b/content/browser/appcache/appcache_update_job.cc
index 21c8faa..10630d9 100644
--- a/content/browser/appcache/appcache_update_job.cc
+++ b/content/browser/appcache/appcache_update_job.cc
@@ -706,8 +706,8 @@
           new HttpResponseInfoIOBuffer(manifest_response_info_.release()));
       manifest_response_writer_->WriteInfo(
           io_buffer.get(),
-          base::Bind(&AppCacheUpdateJob::OnManifestInfoWriteComplete,
-                     base::Unretained(this)));
+          base::BindOnce(&AppCacheUpdateJob::OnManifestInfoWriteComplete,
+                         base::Unretained(this)));
     }
   } else {
     VLOG(1) << "Request error: " << net_error
@@ -737,10 +737,9 @@
     scoped_refptr<net::StringIOBuffer> io_buffer(
         new net::StringIOBuffer(manifest_data_));
     manifest_response_writer_->WriteData(
-        io_buffer.get(),
-        manifest_data_.length(),
-        base::Bind(&AppCacheUpdateJob::OnManifestDataWriteComplete,
-                   base::Unretained(this)));
+        io_buffer.get(), manifest_data_.length(),
+        base::BindOnce(&AppCacheUpdateJob::OnManifestDataWriteComplete,
+                       base::Unretained(this)));
   } else {
     HandleCacheFailure(
         AppCacheErrorDetails("Failed to write the manifest headers to storage",
@@ -923,8 +922,8 @@
   read_manifest_buffer_ = new net::IOBuffer(kAppCacheFetchBufferSize);
   manifest_response_reader_->ReadData(
       read_manifest_buffer_.get(), kAppCacheFetchBufferSize,
-      base::Bind(&AppCacheUpdateJob::OnManifestDataReadComplete,
-                 base::Unretained(this)));  // async read
+      base::BindOnce(&AppCacheUpdateJob::OnManifestDataReadComplete,
+                     base::Unretained(this)));  // async read
 }
 
 void AppCacheUpdateJob::OnManifestDataReadComplete(int result) {
@@ -932,8 +931,8 @@
     loaded_manifest_data_.append(read_manifest_buffer_->data(), result);
     manifest_response_reader_->ReadData(
         read_manifest_buffer_.get(), kAppCacheFetchBufferSize,
-        base::Bind(&AppCacheUpdateJob::OnManifestDataReadComplete,
-                   base::Unretained(this)));  // read more
+        base::BindOnce(&AppCacheUpdateJob::OnManifestDataReadComplete,
+                       base::Unretained(this)));  // read more
   } else {
     read_manifest_buffer_ = nullptr;
     manifest_response_reader_.reset();
diff --git a/content/browser/appcache/appcache_update_url_fetcher.cc b/content/browser/appcache/appcache_update_url_fetcher.cc
index 527d30d..f364e70 100644
--- a/content/browser/appcache/appcache_update_url_fetcher.cc
+++ b/content/browser/appcache/appcache_update_url_fetcher.cc
@@ -112,7 +112,7 @@
             new net::HttpResponseInfo(request_->GetResponseInfo())));
     response_writer_->WriteInfo(
         io_buffer.get(),
-        base::Bind(&URLFetcher::OnWriteComplete, base::Unretained(this)));
+        base::BindOnce(&URLFetcher::OnWriteComplete, base::Unretained(this)));
   } else {
     ReadResponseData();
   }
@@ -195,7 +195,7 @@
       DCHECK(response_writer_.get());
       response_writer_->WriteData(
           buffer, bytes_read,
-          base::Bind(&URLFetcher::OnWriteComplete, base::Unretained(this)));
+          base::BindOnce(&URLFetcher::OnWriteComplete, base::Unretained(this)));
       return false;  // wait for async write completion to continue reading
     default:
       NOTREACHED();
diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc
index 92f5e83..7add0b0 100644
--- a/content/browser/appcache/appcache_url_loader_job.cc
+++ b/content/browser/appcache/appcache_url_loader_job.cc
@@ -313,9 +313,9 @@
   uint32_t bytes_to_read =
       std::min<uint32_t>(num_bytes, info_->response_data_size());
 
-  reader_->ReadData(
-      buffer.get(), bytes_to_read,
-      base::Bind(&AppCacheURLLoaderJob::OnReadComplete, GetDerivedWeakPtr()));
+  reader_->ReadData(buffer.get(), bytes_to_read,
+                    base::BindOnce(&AppCacheURLLoaderJob::OnReadComplete,
+                                   GetDerivedWeakPtr()));
 }
 
 void AppCacheURLLoaderJob::NotifyCompleted(int error_code) {
diff --git a/content/browser/appcache/appcache_url_request_job.cc b/content/browser/appcache/appcache_url_request_job.cc
index 6460fbfa..c68a8a6 100644
--- a/content/browser/appcache/appcache_url_request_job.cc
+++ b/content/browser/appcache/appcache_url_request_job.cc
@@ -287,8 +287,8 @@
   DCHECK_NE(buf_size, 0);
   DCHECK(!reader_->IsReadPending());
   reader_->ReadData(buf, buf_size,
-                    base::Bind(&AppCacheURLRequestJob::OnReadComplete,
-                               base::Unretained(this)));
+                    base::BindOnce(&AppCacheURLRequestJob::OnReadComplete,
+                                   base::Unretained(this)));
   return net::ERR_IO_PENDING;
 }
 
diff --git a/content/browser/appcache/appcache_url_request_job_unittest.cc b/content/browser/appcache/appcache_url_request_job_unittest.cc
index 4a907b9..f8413977 100644
--- a/content/browser/appcache/appcache_url_request_job_unittest.cc
+++ b/content/browser/appcache/appcache_url_request_job_unittest.cc
@@ -358,28 +358,27 @@
     write_info_buffer_ = new HttpResponseInfoIOBuffer(head);
     writer_->WriteInfo(
         write_info_buffer_.get(),
-        base::Bind(&AppCacheURLRequestJobTest::OnWriteInfoComplete,
-                   base::Unretained(this)));
+        base::BindOnce(&AppCacheURLRequestJobTest::OnWriteInfoComplete,
+                       base::Unretained(this)));
   }
 
   void WriteResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) {
     EXPECT_FALSE(writer_->IsWritePending());
     write_buffer_ = io_buffer;
     expected_write_result_ = buf_len;
-    writer_->WriteData(write_buffer_.get(),
-                       buf_len,
-                       base::Bind(&AppCacheURLRequestJobTest::OnWriteComplete,
-                                  base::Unretained(this)));
+    writer_->WriteData(
+        write_buffer_.get(), buf_len,
+        base::BindOnce(&AppCacheURLRequestJobTest::OnWriteComplete,
+                       base::Unretained(this)));
   }
 
   void ReadResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) {
     EXPECT_FALSE(reader_->IsReadPending());
     read_buffer_ = io_buffer;
     expected_read_result_ = buf_len;
-    reader_->ReadData(read_buffer_.get(),
-                      buf_len,
-                      base::Bind(&AppCacheURLRequestJobTest::OnReadComplete,
-                                 base::Unretained(this)));
+    reader_->ReadData(read_buffer_.get(), buf_len,
+                      base::BindOnce(&AppCacheURLRequestJobTest::OnReadComplete,
+                                     base::Unretained(this)));
   }
 
   // AppCacheResponseReader / Writer completion callbacks
diff --git a/content/browser/appcache/mock_appcache_storage.cc b/content/browser/appcache/mock_appcache_storage.cc
index 0422108..b9ff16c7 100644
--- a/content/browser/appcache/mock_appcache_storage.cc
+++ b/content/browser/appcache/mock_appcache_storage.cc
@@ -50,7 +50,7 @@
 }
 
 void MockAppCacheStorage::GetAllInfo(Delegate* delegate) {
-  ScheduleTask(base::Bind(
+  ScheduleTask(base::BindOnce(
       &MockAppCacheStorage::ProcessGetAllInfo, weak_factory_.GetWeakPtr(),
       base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
 }
@@ -59,7 +59,7 @@
   DCHECK(delegate);
   AppCache* cache = working_set_.GetCache(id);
   if (ShouldCacheLoadAppearAsync(cache)) {
-    ScheduleTask(base::Bind(
+    ScheduleTask(base::BindOnce(
         &MockAppCacheStorage::ProcessLoadCache, weak_factory_.GetWeakPtr(), id,
         base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
     return;
@@ -72,7 +72,7 @@
   DCHECK(delegate);
   AppCacheGroup* group = working_set_.GetGroup(manifest_url);
   if (ShouldGroupLoadAppearAsync(group)) {
-    ScheduleTask(base::Bind(
+    ScheduleTask(base::BindOnce(
         &MockAppCacheStorage::ProcessLoadOrCreateGroup,
         weak_factory_.GetWeakPtr(), manifest_url,
         base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
@@ -87,11 +87,11 @@
   DCHECK(group && delegate && newest_cache);
 
   // Always make this operation look async.
-  ScheduleTask(
-      base::Bind(&MockAppCacheStorage::ProcessStoreGroupAndNewestCache,
-                 weak_factory_.GetWeakPtr(), base::WrapRefCounted(group),
-                 base::WrapRefCounted(newest_cache),
-                 base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
+  ScheduleTask(base::BindOnce(
+      &MockAppCacheStorage::ProcessStoreGroupAndNewestCache,
+      weak_factory_.GetWeakPtr(), base::WrapRefCounted(group),
+      base::WrapRefCounted(newest_cache),
+      base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
 }
 
 void MockAppCacheStorage::FindResponseForMainRequest(
@@ -101,10 +101,10 @@
   // Note: MockAppCacheStorage does not respect the preferred_manifest_url.
 
   // Always make this operation look async.
-  ScheduleTask(
-      base::Bind(&MockAppCacheStorage::ProcessFindResponseForMainRequest,
-                 weak_factory_.GetWeakPtr(), url,
-                 base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
+  ScheduleTask(base::BindOnce(
+      &MockAppCacheStorage::ProcessFindResponseForMainRequest,
+      weak_factory_.GetWeakPtr(), url,
+      base::WrapRefCounted(GetOrCreateDelegateReference(delegate))));
 }
 
 void MockAppCacheStorage::FindResponseForSubRequest(
@@ -147,11 +147,11 @@
   DCHECK(group && delegate);
 
   // Always make this method look async.
-  ScheduleTask(
-      base::Bind(&MockAppCacheStorage::ProcessMakeGroupObsolete,
-                 weak_factory_.GetWeakPtr(), base::WrapRefCounted(group),
-                 base::WrapRefCounted(GetOrCreateDelegateReference(delegate)),
-                 response_code));
+  ScheduleTask(base::BindOnce(
+      &MockAppCacheStorage::ProcessMakeGroupObsolete,
+      weak_factory_.GetWeakPtr(), base::WrapRefCounted(group),
+      base::WrapRefCounted(GetOrCreateDelegateReference(delegate)),
+      response_code));
 }
 
 void MockAppCacheStorage::StoreEvictionTimes(AppCacheGroup* group) {
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc
index 1d1f5df9..fd899d77 100644
--- a/content/browser/background_fetch/background_fetch_context.cc
+++ b/content/browser/background_fetch/background_fetch_context.cc
@@ -250,7 +250,7 @@
     CleanupRegistration(registration_id, {});
 
     event_dispatcher_.DispatchBackgroundFetchAbortEvent(
-        registration_id, base::Bind(&base::DoNothing));
+        registration_id, base::BindOnce(&base::DoNothing));
   } else {
     data_manager_.GetSettledFetchesForRegistration(
         registration_id,
@@ -278,21 +278,23 @@
   if (background_fetch_succeeded) {
     event_dispatcher_.DispatchBackgroundFetchedEvent(
         registration_id, std::move(settled_fetches),
-        base::Bind(&BackgroundFetchContext::CleanupRegistration,
-                   weak_factory_.GetWeakPtr(), registration_id,
-                   // The blob uuid is sent as part of |settled_fetches|. Bind
-                   // |blob_data_handles| to the callback to keep them alive
-                   // until the waitUntil event is resolved.
-                   std::move(blob_data_handles)));
+        base::BindOnce(
+            &BackgroundFetchContext::CleanupRegistration,
+            weak_factory_.GetWeakPtr(), registration_id,
+            // The blob uuid is sent as part of |settled_fetches|. Bind
+            // |blob_data_handles| to the callback to keep them alive
+            // until the waitUntil event is resolved.
+            std::move(blob_data_handles)));
   } else {
     event_dispatcher_.DispatchBackgroundFetchFailEvent(
         registration_id, std::move(settled_fetches),
-        base::Bind(&BackgroundFetchContext::CleanupRegistration,
-                   weak_factory_.GetWeakPtr(), registration_id,
-                   // The blob uuid is sent as part of |settled_fetches|. Bind
-                   // |blob_data_handles| to the callback to keep them alive
-                   // until the waitUntil event is resolved.
-                   std::move(blob_data_handles)));
+        base::BindOnce(
+            &BackgroundFetchContext::CleanupRegistration,
+            weak_factory_.GetWeakPtr(), registration_id,
+            // The blob uuid is sent as part of |settled_fetches|. Bind
+            // |blob_data_handles| to the callback to keep them alive
+            // until the waitUntil event is resolved.
+            std::move(blob_data_handles)));
   }
 }
 
@@ -317,8 +319,8 @@
   // as a fallback in that case, and deletes the registration on next startup.
   registration_notifier_->AddGarbageCollectionCallback(
       registration_id.unique_id(),
-      base::Bind(&BackgroundFetchContext::LastObserverGarbageCollected,
-                 weak_factory_.GetWeakPtr(), registration_id));
+      base::BindOnce(&BackgroundFetchContext::LastObserverGarbageCollected,
+                     weak_factory_.GetWeakPtr(), registration_id));
 }
 
 void BackgroundFetchContext::LastObserverGarbageCollected(
diff --git a/content/browser/background_fetch/background_fetch_data_manager.cc b/content/browser/background_fetch/background_fetch_data_manager.cc
index 89fa341d..f15fbd5 100644
--- a/content/browser/background_fetch/background_fetch_data_manager.cc
+++ b/content/browser/background_fetch/background_fetch_data_manager.cc
@@ -159,8 +159,8 @@
       FROM_HERE, BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
       // Normally weak pointers must be obtained on the IO thread, but it's ok
       // here as the factory cannot be destroyed before the constructor ends.
-      base::Bind(&BackgroundFetchDataManager::Cleanup,
-                 weak_ptr_factory_.GetWeakPtr()));
+      base::BindOnce(&BackgroundFetchDataManager::Cleanup,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void BackgroundFetchDataManager::Cleanup() {
diff --git a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
index 1c9f5c0..b9b6e35 100644
--- a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
@@ -197,8 +197,8 @@
         ->context_wrapper()
         ->GetRegistrationUserDataByKeyPrefix(
             service_worker_registration_id, key_prefix,
-            base::Bind(&DidGetRegistrationUserDataByKeyPrefix,
-                       run_loop.QuitClosure(), &data));
+            base::BindOnce(&DidGetRegistrationUserDataByKeyPrefix,
+                           run_loop.QuitClosure(), &data));
     run_loop.Run();
 
     return data;
diff --git a/content/browser/background_fetch/background_fetch_test_base.cc b/content/browser/background_fetch/background_fetch_test_base.cc
index f5fd904..a455fc5 100644
--- a/content/browser/background_fetch/background_fetch_test_base.cc
+++ b/content/browser/background_fetch/background_fetch_test_base.cc
@@ -113,8 +113,8 @@
     base::RunLoop run_loop;
     embedded_worker_test_helper_.context()->storage()->FindRegistrationForId(
         service_worker_registration_id, origin_.GetURL(),
-        base::Bind(&DidFindServiceWorkerRegistration,
-                   &service_worker_registration, run_loop.QuitClosure()));
+        base::BindOnce(&DidFindServiceWorkerRegistration,
+                       &service_worker_registration, run_loop.QuitClosure()));
 
     run_loop.Run();
   }
diff --git a/content/browser/background_fetch/storage/cleanup_task.cc b/content/browser/background_fetch/storage/cleanup_task.cc
index a95ef5b..5a2e517 100644
--- a/content/browser/background_fetch/storage/cleanup_task.cc
+++ b/content/browser/background_fetch/storage/cleanup_task.cc
@@ -27,8 +27,8 @@
 
 void CleanupTask::Start() {
   service_worker_context()->GetUserDataForAllRegistrationsByKeyPrefix(
-      kRegistrationKeyPrefix, base::Bind(&CleanupTask::DidGetRegistrations,
-                                         weak_factory_.GetWeakPtr()));
+      kRegistrationKeyPrefix, base::BindOnce(&CleanupTask::DidGetRegistrations,
+                                             weak_factory_.GetWeakPtr()));
 }
 
 void CleanupTask::DidGetRegistrations(
@@ -42,8 +42,8 @@
 
   service_worker_context()->GetUserDataForAllRegistrationsByKeyPrefix(
       kActiveRegistrationUniqueIdKeyPrefix,
-      base::Bind(&CleanupTask::DidGetActiveUniqueIds,
-                 weak_factory_.GetWeakPtr(), registration_data));
+      base::BindOnce(&CleanupTask::DidGetActiveUniqueIds,
+                     weak_factory_.GetWeakPtr(), registration_data));
 }
 
 void CleanupTask::DidGetActiveUniqueIds(
diff --git a/content/browser/background_fetch/storage/create_registration_task.cc b/content/browser/background_fetch/storage/create_registration_task.cc
index e949232..20bb337d 100644
--- a/content/browser/background_fetch/storage/create_registration_task.cc
+++ b/content/browser/background_fetch/storage/create_registration_task.cc
@@ -40,8 +40,8 @@
   service_worker_context()->GetRegistrationUserData(
       registration_id_.service_worker_registration_id(),
       {ActiveRegistrationUniqueIdKey(registration_id_.developer_id())},
-      base::Bind(&CreateRegistrationTask::DidGetUniqueId,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&CreateRegistrationTask::DidGetUniqueId,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void CreateRegistrationTask::DidGetUniqueId(
diff --git a/content/browser/background_fetch/storage/delete_registration_task.cc b/content/browser/background_fetch/storage/delete_registration_task.cc
index 09653f9..0663fc47 100644
--- a/content/browser/background_fetch/storage/delete_registration_task.cc
+++ b/content/browser/background_fetch/storage/delete_registration_task.cc
@@ -55,8 +55,8 @@
   // Get the registration |developer_id| to check it was deactivated.
   service_worker_context()->GetRegistrationUserData(
       service_worker_registration_id_, {RegistrationKey(unique_id_)},
-      base::Bind(&DeleteRegistrationTask::DidGetRegistration,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&DeleteRegistrationTask::DidGetRegistration,
+                     weak_factory_.GetWeakPtr()));
 #else
   DidGetRegistration({}, SERVICE_WORKER_OK);
 #endif  // DCHECK_IS_ON()
@@ -74,7 +74,7 @@
       service_worker_context()->GetRegistrationUserData(
           service_worker_registration_id_,
           {ActiveRegistrationUniqueIdKey(registration_proto.developer_id())},
-          base::Bind(&DCheckRegistrationNotActive, unique_id_));
+          base::BindOnce(&DCheckRegistrationNotActive, unique_id_));
     } else {
       NOTREACHED()
           << "Database is corrupt";  // TODO(crbug.com/780027): Nuke it.
diff --git a/content/browser/background_fetch/storage/get_developer_ids_task.cc b/content/browser/background_fetch/storage/get_developer_ids_task.cc
index 9de40d9d..03b9c849 100644
--- a/content/browser/background_fetch/storage/get_developer_ids_task.cc
+++ b/content/browser/background_fetch/storage/get_developer_ids_task.cc
@@ -29,8 +29,8 @@
 void GetDeveloperIdsTask::Start() {
   service_worker_context()->GetRegistrationUserKeysAndDataByKeyPrefix(
       service_worker_registration_id_, {kActiveRegistrationUniqueIdKeyPrefix},
-      base::Bind(&GetDeveloperIdsTask::DidGetUniqueIds,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&GetDeveloperIdsTask::DidGetUniqueIds,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void GetDeveloperIdsTask::DidGetUniqueIds(
diff --git a/content/browser/background_fetch/storage/get_registration_task.cc b/content/browser/background_fetch/storage/get_registration_task.cc
index dd779bf..57c46f9 100644
--- a/content/browser/background_fetch/storage/get_registration_task.cc
+++ b/content/browser/background_fetch/storage/get_registration_task.cc
@@ -34,8 +34,8 @@
   service_worker_context()->GetRegistrationUserData(
       service_worker_registration_id_,
       {ActiveRegistrationUniqueIdKey(developer_id_)},
-      base::Bind(&GetRegistrationTask::DidGetUniqueId,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&GetRegistrationTask::DidGetUniqueId,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void GetRegistrationTask::DidGetUniqueId(const std::vector<std::string>& data,
@@ -50,8 +50,8 @@
       DCHECK_EQ(1u, data.size());
       service_worker_context()->GetRegistrationUserData(
           service_worker_registration_id_, {RegistrationKey(data[0])},
-          base::Bind(&GetRegistrationTask::DidGetRegistration,
-                     weak_factory_.GetWeakPtr()));
+          base::BindOnce(&GetRegistrationTask::DidGetRegistration,
+                         weak_factory_.GetWeakPtr()));
       return;
     case DatabaseStatus::kFailed:
       std::move(callback_).Run(
diff --git a/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc b/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc
index d665c8b..c6156f179 100644
--- a/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc
+++ b/content/browser/background_fetch/storage/mark_registration_for_deletion_task.cc
@@ -33,8 +33,8 @@
       registration_id_.service_worker_registration_id(),
       {ActiveRegistrationUniqueIdKey(registration_id_.developer_id()),
        RegistrationKey(registration_id_.unique_id())},
-      base::Bind(&MarkRegistrationForDeletionTask::DidGetActiveUniqueId,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&MarkRegistrationForDeletionTask::DidGetActiveUniqueId,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void MarkRegistrationForDeletionTask::DidGetActiveUniqueId(
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index b28c0a5..5c8ad0c 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -41,7 +41,6 @@
 #include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
 #include "base/task_scheduler/task_scheduler.h"
 #include "base/task_scheduler/task_traits.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -852,12 +851,6 @@
 }
 
 int BrowserMainLoop::PreCreateThreads() {
-  // SequencedWorkerPool shouldn't be enabled yet. It should be enabled below by
-  // either |parts_|->PreCreateThreads() or
-  // base::SequencedWorkerPool::EnableForProcess().
-  // TODO(fdoray): Uncomment this line.
-  // DCHECK(!base::SequencedWorkerPool::IsEnabled());
-
   if (parts_) {
     TRACE_EVENT0("startup",
         "BrowserMainLoop::CreateThreads:PreCreateThreads");
@@ -865,13 +858,6 @@
     result_code_ = parts_->PreCreateThreads();
   }
 
-  // Enable SequencedWorkerPool if |parts_|->PreCreateThreads() hasn't enabled
-  // it.
-  // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler
-  // redirection experiment concludes https://crbug.com/622400.
-  if (!base::SequencedWorkerPool::IsEnabled())
-    base::SequencedWorkerPool::EnableForProcess();
-
   InitializeMemoryManagementComponent();
 
 #if defined(OS_MACOSX)
@@ -1039,8 +1025,6 @@
         *task_scheduler_init_params.get());
   }
 
-  base::SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess();
-
   TRACE_EVENT_BEGIN1("startup", "BrowserMainLoop::CreateThreads:start",
                      "Thread", "BrowserThread::PROCESS_LAUNCHER");
 
diff --git a/content/browser/browser_main_runner.cc b/content/browser/browser_main_runner.cc
index 1fa7023..b9abae7 100644
--- a/content/browser/browser_main_runner.cc
+++ b/content/browser/browser_main_runner.cc
@@ -14,6 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/run_loop.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "base/trace_event/heap_profiler_allocation_context_tracker.h"
@@ -28,7 +29,6 @@
 #include "content/public/browser/tracing_controller.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/main_function_params.h"
-#include "third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "third_party/skia/include/core/SkGraphics.h"
 #include "ui/base/ime/input_method_initializer.h"
 
@@ -75,8 +75,8 @@
       const base::TimeTicks start_time_step1 = base::TimeTicks::Now();
 
       if (parameters.command_line.HasSwitch(switches::kSamplingHeapProfiler)) {
-        blink::SamplingHeapProfiler* profiler =
-            blink::SamplingHeapProfiler::GetInstance();
+        base::SamplingHeapProfiler* profiler =
+            base::SamplingHeapProfiler::GetInstance();
         unsigned sampling_interval = 0;
         bool parsed =
             base::StringToUint(parameters.command_line.GetSwitchValueASCII(
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc
index f1fce06e..f6c6ef3 100644
--- a/content/browser/cache_storage/cache_storage_cache.cc
+++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -535,7 +535,6 @@
   base::CheckedNumeric<uint64_t> safe_side_data_size = 0;
   for (const auto& operation : operations) {
     if (operation.operation_type == CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT) {
-      safe_space_required += operation.request.blob_size;
       safe_space_required += operation.response.blob_size;
       safe_side_data_size += operation.response.side_data_blob_size;
     }
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index f31677e7..cf3c05c 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -410,7 +410,7 @@
 
 void CacheStorageManager::DeleteOriginData(const url::Origin& origin) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DeleteOriginData(origin, base::Bind(&EmptyQuotaStatusCallback));
+  DeleteOriginData(origin, base::BindOnce(&EmptyQuotaStatusCallback));
 }
 
 void CacheStorageManager::DeleteOriginDidClose(
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 99d6046b..89ae302 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -491,8 +491,9 @@
   int64_t GetOriginUsage(const url::Origin& origin) {
     base::RunLoop loop;
     cache_manager_->GetOriginUsage(
-        origin, base::Bind(&CacheStorageManagerTest::UsageCallback,
-                           base::Unretained(this), base::Unretained(&loop)));
+        origin,
+        base::BindOnce(&CacheStorageManagerTest::UsageCallback,
+                       base::Unretained(this), base::Unretained(&loop)));
     loop.Run();
     return callback_usage_;
   }
@@ -1717,8 +1718,8 @@
     base::RunLoop loop;
     quota_client_->GetOriginUsage(
         origin, StorageType::kTemporary,
-        base::Bind(&CacheStorageQuotaClientTest::QuotaUsageCallback,
-                   base::Unretained(this), base::Unretained(&loop)));
+        base::BindOnce(&CacheStorageQuotaClientTest::QuotaUsageCallback,
+                       base::Unretained(this), base::Unretained(&loop)));
     loop.Run();
     return callback_quota_usage_;
   }
@@ -1727,8 +1728,8 @@
     base::RunLoop loop;
     quota_client_->GetOriginsForType(
         StorageType::kTemporary,
-        base::Bind(&CacheStorageQuotaClientTest::OriginsCallback,
-                   base::Unretained(this), base::Unretained(&loop)));
+        base::BindOnce(&CacheStorageQuotaClientTest::OriginsCallback,
+                       base::Unretained(this), base::Unretained(&loop)));
     loop.Run();
     return callback_origins_.size();
   }
@@ -1737,8 +1738,8 @@
     base::RunLoop loop;
     quota_client_->GetOriginsForHost(
         StorageType::kTemporary, host,
-        base::Bind(&CacheStorageQuotaClientTest::OriginsCallback,
-                   base::Unretained(this), base::Unretained(&loop)));
+        base::BindOnce(&CacheStorageQuotaClientTest::OriginsCallback,
+                       base::Unretained(this), base::Unretained(&loop)));
     loop.Run();
     return callback_origins_.size();
   }
@@ -1747,8 +1748,8 @@
     base::RunLoop loop;
     quota_client_->DeleteOriginData(
         origin, StorageType::kTemporary,
-        base::Bind(&CacheStorageQuotaClientTest::DeleteOriginCallback,
-                   base::Unretained(this), base::Unretained(&loop)));
+        base::BindOnce(&CacheStorageQuotaClientTest::DeleteOriginCallback,
+                       base::Unretained(this), base::Unretained(&loop)));
     loop.Run();
     return callback_status_ == blink::mojom::QuotaStatusCode::kOk;
   }
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
index f4775b4..05f9a5f 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -159,7 +159,7 @@
   gl->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData());
   context_provider_->ContextSupport()->SignalSyncToken(
       sync_token,
-      base::Bind(
+      base::BindOnce(
           &OffscreenBrowserCompositorOutputSurface::OnSwapBuffersComplete,
           weak_ptr_factory_.GetWeakPtr(), frame.latency_info, ++swap_id_));
 }
diff --git a/content/browser/compositor/reflector_impl.cc b/content/browser/compositor/reflector_impl.cc
index 31544bd..7630024 100644
--- a/content/browser/compositor/reflector_impl.cc
+++ b/content/browser/compositor/reflector_impl.cc
@@ -164,7 +164,7 @@
                                           mailbox_->holder().texture_target,
                                           mailbox_->holder().sync_token),
         viz::SingleReleaseCallback::Create(
-            base::Bind(ReleaseMailbox, mailbox_)),
+            base::BindOnce(ReleaseMailbox, mailbox_)),
         source_size);
     layer_data->needs_set_mailbox = false;
   } else {
diff --git a/content/browser/devtools/devtools_io_context.cc b/content/browser/devtools/devtools_io_context.cc
index 9963700..24a756c 100644
--- a/content/browser/devtools/devtools_io_context.cc
+++ b/content/browser/devtools/devtools_io_context.cc
@@ -305,7 +305,7 @@
   is_binary_ = !IsTextMimeType(blob_handle_->content_type());
   open_callback_ = std::move(callback);
   blob_handle_->RunOnConstructionComplete(
-      base::Bind(&BlobStream::OnBlobConstructionComplete, this));
+      base::BindOnce(&BlobStream::OnBlobConstructionComplete, this));
 }
 
 void BlobStream::OnBlobConstructionComplete(storage::BlobStatus status) {
@@ -380,7 +380,7 @@
   int bytes_read;
   BlobReader::Status status =
       blob_reader_->Read(io_buf_.get(), request.max_size, &bytes_read,
-                         base::Bind(&BlobStream::OnReadComplete, this));
+                         base::BindOnce(&BlobStream::OnReadComplete, this));
   if (status == BlobReader::Status::IO_PENDING)
     return;
   // This is for uniformity with the asynchronous case.
@@ -429,7 +429,7 @@
   DCHECK(!blob_reader_);
   blob_reader_ = blob_handle_->CreateReader();
   BlobReader::Status status = blob_reader_->CalculateSize(
-      base::Bind(&BlobStream::OnCalculateSizeComplete, this));
+      base::BindOnce(&BlobStream::OnCalculateSizeComplete, this));
   if (status != BlobReader::Status::IO_PENDING) {
     OnCalculateSizeComplete(status == BlobReader::Status::NET_ERROR
                                 ? blob_reader_->net_error()
diff --git a/content/browser/devtools/protocol/memory_handler.cc b/content/browser/devtools/protocol/memory_handler.cc
index 1238db97..bfdff51 100644
--- a/content/browser/devtools/protocol/memory_handler.cc
+++ b/content/browser/devtools/protocol/memory_handler.cc
@@ -5,9 +5,9 @@
 #include "content/browser/devtools/protocol/memory_handler.h"
 
 #include "base/memory/memory_pressure_listener.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "base/strings/stringprintf.h"
 #include "content/public/common/content_features.h"
-#include "third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h"
 
 namespace content {
 namespace protocol {
@@ -26,8 +26,8 @@
     std::unique_ptr<Memory::SamplingProfile>* out_profile) {
   std::unique_ptr<Array<Memory::SamplingProfileNode>> samples =
       Array<Memory::SamplingProfileNode>::create();
-  std::vector<blink::SamplingHeapProfiler::Sample> raw_samples =
-      blink::SamplingHeapProfiler::GetInstance()->GetSamples(0);
+  std::vector<base::SamplingHeapProfiler::Sample> raw_samples =
+      base::SamplingHeapProfiler::GetInstance()->GetSamples(0);
 
   for (auto& sample : raw_samples) {
     std::unique_ptr<Array<String>> stack = Array<String>::create();
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index c72e2fb1..ee6ee4d9 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -147,8 +147,8 @@
                            bool last_chance) {
   context->FindReadyRegistrationForId(
       registration_id, origin,
-      base::Bind(&DidFindRegistrationForDispatchSyncEventOnIO, sync_context,
-                 tag, last_chance));
+      base::BindOnce(&DidFindRegistrationForDispatchSyncEventOnIO, sync_context,
+                     tag, last_chance));
 }
 
 }  // namespace
@@ -221,7 +221,8 @@
     return CreateDomainNotEnabledErrorResponse();
   if (!context_)
     return CreateContextErrorResponse();
-  context_->UnregisterServiceWorker(GURL(scope_url), base::Bind(&ResultNoOp));
+  context_->UnregisterServiceWorker(GURL(scope_url),
+                                    base::BindOnce(&ResultNoOp));
   return Response::OK();
 }
 
diff --git a/content/browser/download/download_file_impl.cc b/content/browser/download/download_file_impl.cc
index 4041ffc6..407fc1c 100644
--- a/content/browser/download/download_file_impl.cc
+++ b/content/browser/download/download_file_impl.cc
@@ -14,8 +14,8 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
+#include "components/download/public/common/download_create_info.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_destination_observer.h"
 #include "content/browser/download/download_interrupt_reasons_utils.h"
 #include "content/browser/download/download_stats.h"
@@ -79,9 +79,9 @@
       std::make_unique<mojo::Binding<download::mojom::DownloadStreamClient>>(
           this, std::move(stream_handle_->client_request));
   binding_->set_connection_error_handler(
-      base::Bind(&DownloadFileImpl::SourceStream::OnStreamCompleted,
-                 base::Unretained(this),
-                 download::mojom::NetworkRequestStatus::USER_CANCELED));
+      base::BindOnce(&DownloadFileImpl::SourceStream::OnStreamCompleted,
+                     base::Unretained(this),
+                     download::mojom::NetworkRequestStatus::USER_CANCELED));
   handle_watcher_ = std::make_unique<mojo::SimpleWatcher>(
       FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC);
 }
diff --git a/content/browser/download/download_file_unittest.cc b/content/browser/download/download_file_unittest.cc
index bf946415..20159b8 100644
--- a/content/browser/download/download_file_unittest.cc
+++ b/content/browser/download/download_file_unittest.cc
@@ -18,9 +18,9 @@
 #include "base/test/test_file_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_destination_observer.h"
 #include "content/browser/download/download_file_impl.h"
 #include "content/browser/download/download_request_handle.h"
diff --git a/content/browser/download/download_item_factory.h b/content/browser/download/download_item_factory.h
index 64d3f90..7d6ef5ee 100644
--- a/content/browser/download/download_item_factory.h
+++ b/content/browser/download/download_item_factory.h
@@ -21,14 +21,17 @@
 
 namespace base {
 class FilePath;
-}
+}  // namespace base
+
+namespace download {
+struct DownloadCreateInfo;
+class DownloadRequestHandleInterface;
+}  // namespace download
 
 namespace content {
 
 class DownloadItemImpl;
 class DownloadItemImplDelegate;
-class DownloadRequestHandleInterface;
-struct DownloadCreateInfo;
 
 class DownloadItemFactory {
 public:
@@ -66,7 +69,7 @@
   virtual DownloadItemImpl* CreateActiveItem(
       DownloadItemImplDelegate* delegate,
       uint32_t download_id,
-      const DownloadCreateInfo& info) = 0;
+      const download::DownloadCreateInfo& info) = 0;
 
   virtual DownloadItemImpl* CreateSavePageItem(
       DownloadItemImplDelegate* delegate,
@@ -74,7 +77,8 @@
       const base::FilePath& path,
       const GURL& url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle) = 0;
+      std::unique_ptr<download::DownloadRequestHandleInterface>
+          request_handle) = 0;
 };
 
 }  // namespace content
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
index d9fd2b4f..86ce644 100644
--- a/content/browser/download/download_item_impl.cc
+++ b/content/browser/download/download_item_impl.cc
@@ -43,7 +43,6 @@
 #include "components/download/public/common/download_danger_type.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_url_parameters.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_file.h"
 #include "content/browser/download/download_interrupt_reasons_utils.h"
 #include "content/browser/download/download_item_impl_delegate.h"
@@ -355,13 +354,12 @@
          state_ == CANCELLED_INTERNAL);
   DCHECK(base::IsValidGUID(guid_));
   Init(false /* not actively downloading */, TYPE_HISTORY_IMPORT);
-  AttachDownloadItemData();
 }
 
 // Constructing for a regular download:
 DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate,
                                    uint32_t download_id,
-                                   const DownloadCreateInfo& info)
+                                   const download::DownloadCreateInfo& info)
     : request_info_(info.url_chain,
                     info.referrer_url,
                     info.site_url,
@@ -409,7 +407,7 @@
     const base::FilePath& path,
     const GURL& url,
     const std::string& mime_type,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle)
     : request_info_(url),
       guid_(base::GenerateGUID()),
       download_id_(download_id),
@@ -422,10 +420,9 @@
       is_updating_observers_(false),
       weak_ptr_factory_(this) {
   job_ = DownloadJobFactory::CreateJob(this, std::move(request_handle),
-                                       DownloadCreateInfo(), true);
+                                       download::DownloadCreateInfo(), true);
   delegate_->Attach();
   Init(true /* actively downloading */, TYPE_SAVE_PAGE_AS);
-  AttachDownloadItemData();
 }
 
 DownloadItemImpl::~DownloadItemImpl() {
@@ -1167,10 +1164,6 @@
   return download::ResumeMode::IMMEDIATE_CONTINUE;
 }
 
-void DownloadItemImpl::AttachDownloadItemData() {
-  DownloadItemUtils::AttachInfo(this, GetBrowserContext(), GetWebContents());
-}
-
 BrowserContext* DownloadItemImpl::GetBrowserContext() const {
   return delegate_->GetBrowserContext();
 }
@@ -1180,13 +1173,11 @@
   // paths that might be used by download::DownloadItems created from history
   // import. Currently such items have null request_handle_s, where other items
   // (regular and SavePackage downloads) have actual objects off the pointer.
-  if (job_)
-    return job_->GetWebContents();
-  return nullptr;
+  return DownloadItemUtils::GetWebContents(this);
 }
 
 void DownloadItemImpl::UpdateValidatorsOnResumption(
-    const DownloadCreateInfo& new_create_info) {
+    const download::DownloadCreateInfo& new_create_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(RESUMING_INTERNAL, state_);
   DCHECK(!new_create_info.url_chain.empty());
@@ -1410,8 +1401,8 @@
 // We're starting the download.
 void DownloadItemImpl::Start(
     std::unique_ptr<DownloadFile> file,
-    std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-    const DownloadCreateInfo& new_create_info) {
+    std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
+    const download::DownloadCreateInfo& new_create_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!download_file_.get());
   DVLOG(20) << __func__ << "() this=" << DebugString(true);
@@ -1423,7 +1414,6 @@
   if (job_->IsParallelizable()) {
     RecordParallelizableDownloadCount(START_COUNT, IsParallelDownloadEnabled());
   }
-  AttachDownloadItemData();
 
   deferred_interrupt_reason_ = download::DOWNLOAD_INTERRUPT_REASON_NONE;
 
diff --git a/content/browser/download/download_item_impl.h b/content/browser/download/download_item_impl.h
index cca695d..002727c 100644
--- a/content/browser/download/download_item_impl.h
+++ b/content/browser/download/download_item_impl.h
@@ -17,18 +17,21 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/resume_mode.h"
 #include "content/browser/download/download_destination_observer.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
 namespace content {
+class BrowserContext;
 class DownloadFile;
 class DownloadItemImplDelegate;
 class DownloadJob;
+class WebContents;
 
 // See download_item.h for usage.
 class CONTENT_EXPORT DownloadItemImpl : public download::DownloadItem,
@@ -182,7 +185,7 @@
   // |net_log| is constructed externally for our use.
   DownloadItemImpl(DownloadItemImplDelegate* delegate,
                    uint32_t id,
-                   const DownloadCreateInfo& info);
+                   const download::DownloadCreateInfo& info);
 
   // Constructing for the "Save Page As..." feature:
   // |net_log| is constructed externally for our use.
@@ -192,7 +195,7 @@
       const base::FilePath& path,
       const GURL& url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle);
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle);
 
   ~DownloadItemImpl() override;
 
@@ -287,9 +290,10 @@
   // parameters. It may be different from the DownloadCreateInfo used to create
   // the download::DownloadItem if Start() is being called in response for a
   // download resumption request.
-  virtual void Start(std::unique_ptr<DownloadFile> download_file,
-                     std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-                     const DownloadCreateInfo& new_create_info);
+  virtual void Start(
+      std::unique_ptr<DownloadFile> download_file,
+      std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
+      const download::DownloadCreateInfo& new_create_info);
 
   // Needed because of intertwining with DownloadManagerImpl -------------------
 
@@ -592,7 +596,7 @@
   // Update origin information based on the response to a download resumption
   // request. Should only be called if the resumption request was successful.
   virtual void UpdateValidatorsOnResumption(
-      const DownloadCreateInfo& new_create_info);
+      const download::DownloadCreateInfo& new_create_info);
 
   // Notify observers that this item is being removed by the user.
   void NotifyRemoved();
@@ -602,9 +606,6 @@
   // INTERRUPTED state.
   download::ResumeMode GetResumeMode() const;
 
-  // Helper method to attach additional information to the DownloadItem.
-  void AttachDownloadItemData();
-
   // Helper method to get WebContents and BrowserContext of the DownloadItem.
   WebContents* GetWebContents() const;
   BrowserContext* GetBrowserContext() const;
diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc
index 238fab3..d3ea641c 100644
--- a/content/browser/download/download_item_impl_unittest.cc
+++ b/content/browser/download/download_item_impl_unittest.cc
@@ -22,14 +22,14 @@
 #include "base/test/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/download_url_parameters.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_destination_observer.h"
 #include "content/browser/download/download_file_factory.h"
 #include "content/browser/download/download_item_impl_delegate.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/mock_download_file.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_features.h"
@@ -121,14 +121,11 @@
   std::unique_ptr<TestBrowserContext> browser_context_;
 };
 
-class MockRequestHandle : public DownloadRequestHandleInterface {
+class MockRequestHandle : public download::DownloadRequestHandleInterface {
  public:
-  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
-  MOCK_CONST_METHOD0(GetDownloadManager, DownloadManager*());
-  MOCK_CONST_METHOD0(PauseRequest, void());
-  MOCK_CONST_METHOD0(ResumeRequest, void());
-  MOCK_CONST_METHOD1(CancelRequest, void(bool));
-  MOCK_CONST_METHOD0(DebugString, std::string());
+  MOCK_METHOD0(PauseRequest, void());
+  MOCK_METHOD0(ResumeRequest, void());
+  MOCK_METHOD1(CancelRequest, void(bool));
 };
 
 class TestDownloadItemObserver : public download::DownloadItem::Observer {
@@ -268,7 +265,7 @@
             base::test::ScopedTaskEnvironment::MainThreadType::UI,
             base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED),
         next_download_id_(download::DownloadItem::kInvalidId + 1) {
-    create_info_.reset(new DownloadCreateInfo());
+    create_info_.reset(new download::DownloadCreateInfo());
     create_info_->save_info = std::unique_ptr<download::DownloadSaveInfo>(
         new download::DownloadSaveInfo());
     create_info_->save_info->prompt_for_save_location = false;
@@ -277,7 +274,7 @@
   }
 
   DownloadItemImpl* CreateDownloadItemWithCreateInfo(
-      std::unique_ptr<DownloadCreateInfo> info) {
+      std::unique_ptr<download::DownloadCreateInfo> info) {
     DownloadItemImpl* download = new DownloadItemImpl(
         mock_delegate(), next_download_id_++, *(info.get()));
     allocated_downloads_[download] = base::WrapUnique(download);
@@ -407,7 +404,7 @@
     *return_path = path;
   }
 
-  DownloadCreateInfo* create_info() { return create_info_.get(); }
+  download::DownloadCreateInfo* create_info() { return create_info_.get(); }
 
   BrowserContext* browser_context() { return &browser_context_; }
 
@@ -418,7 +415,7 @@
   StrictMock<MockDelegate> mock_delegate_;
   std::map<download::DownloadItem*, std::unique_ptr<download::DownloadItem>>
       allocated_downloads_;
-  std::unique_ptr<DownloadCreateInfo> create_info_;
+  std::unique_ptr<download::DownloadCreateInfo> create_info_;
   uint32_t next_download_id_ = download::DownloadItem::kInvalidId + 1;
   TestBrowserContext browser_context_;
 };
@@ -613,7 +610,7 @@
   TestDownloadItemObserver observer(item);
   MockDownloadFile* mock_download_file(new MockDownloadFile);
   std::unique_ptr<DownloadFile> download_file(mock_download_file);
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle(
+  std::unique_ptr<download::DownloadRequestHandleInterface> request_handle(
       new NiceMock<MockRequestHandle>);
 
   EXPECT_CALL(*mock_download_file, Initialize(_, _, _, _));
@@ -1166,7 +1163,7 @@
   std::unique_ptr<DownloadFile> download_file(mock_download_file);
   DownloadItemImpl* item = CreateDownloadItem();
   EXPECT_CALL(*mock_download_file, Initialize(_, _, _, _));
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle(
+  std::unique_ptr<download::DownloadRequestHandleInterface> request_handle(
       new NiceMock<MockRequestHandle>);
   EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
   item->Start(std::move(download_file), std::move(request_handle),
@@ -1228,7 +1225,7 @@
   // DownloadFile and DownloadRequestHandleInterface objects aren't created for
   // failed downloads.
   std::unique_ptr<DownloadFile> null_download_file;
-  std::unique_ptr<DownloadRequestHandleInterface> null_request_handle;
+  std::unique_ptr<download::DownloadRequestHandleInterface> null_request_handle;
   DownloadTargetCallback download_target_callback;
   EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
       .WillOnce(SaveArg<1>(&download_target_callback));
@@ -2244,8 +2241,6 @@
         file_(new ::testing::StrictMock<MockDownloadFile>()),
         request_handle_(new ::testing::StrictMock<MockRequestHandle>()) {
     DCHECK_EQ(GetParam().size(), static_cast<unsigned>(kEventCount));
-    EXPECT_CALL(*request_handle_, GetWebContents())
-        .WillRepeatedly(Return(nullptr));
   }
 
  protected:
diff --git a/content/browser/download/download_job.cc b/content/browser/download/download_job.cc
index 54afa497..9ca3e92 100644
--- a/content/browser/download/download_job.cc
+++ b/content/browser/download/download_job.cc
@@ -14,7 +14,7 @@
 
 DownloadJob::DownloadJob(
     DownloadItemImpl* download_item,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle)
     : download_item_(download_item),
       request_handle_(std::move(request_handle)),
       is_paused_(false),
@@ -60,10 +60,6 @@
     request_handle_->ResumeRequest();
 }
 
-WebContents* DownloadJob::GetWebContents() const {
-  return request_handle_ ? request_handle_->GetWebContents() : nullptr;
-}
-
 void DownloadJob::Start(
     DownloadFile* download_file_,
     const DownloadFile::InitializeCallback& callback,
diff --git a/content/browser/download/download_job.h b/content/browser/download/download_job.h
index c474f0a2..8c8c7462 100644
--- a/content/browser/download/download_job.h
+++ b/content/browser/download/download_job.h
@@ -9,23 +9,23 @@
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "content/browser/byte_stream.h"
 #include "content/browser/download/download_file.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/common/content_export.h"
 
 namespace content {
 
 class DownloadItemImpl;
-class WebContents;
 
 // DownloadJob lives on UI thread and subclasses implement actual download logic
 // and interact with DownloadItemImpl.
 // The base class is a friend class of DownloadItemImpl.
 class CONTENT_EXPORT DownloadJob {
  public:
-  DownloadJob(DownloadItemImpl* download_item,
-              std::unique_ptr<DownloadRequestHandleInterface> request_handle);
+  DownloadJob(
+      DownloadItemImpl* download_item,
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle);
   virtual ~DownloadJob();
 
   // Download operations.
@@ -40,13 +40,6 @@
 
   bool is_paused() const { return is_paused_; }
 
-  // Return the WebContents associated with the download. Usually used to
-  // associate a browser window for any UI that needs to be displayed to the
-  // user.
-  // Or return nullptr if the download is not associated with an active
-  // WebContents.
-  WebContents* GetWebContents() const;
-
   // Returns whether the download is parallelizable. The download may not send
   // parallel requests as it can be disabled through flags.
   virtual bool IsParallelizable() const;
@@ -75,7 +68,7 @@
 
   // Used to perform operations on network request.
   // Can be null on interrupted download.
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle_;
+  std::unique_ptr<download::DownloadRequestHandleInterface> request_handle_;
 
  private:
   // If the download progress is paused by the user.
diff --git a/content/browser/download/download_job_factory.cc b/content/browser/download/download_job_factory.cc
index 0c7e01e3..27dcda8 100644
--- a/content/browser/download/download_job_factory.cc
+++ b/content/browser/download/download_job_factory.cc
@@ -21,7 +21,7 @@
 namespace {
 
 // Returns if the download can be parallelized.
-bool IsParallelizableDownload(const DownloadCreateInfo& create_info,
+bool IsParallelizableDownload(const download::DownloadCreateInfo& create_info,
                               DownloadItemImpl* download_item) {
   // To enable parallel download, following conditions need to be satisfied.
   // 1. Feature |kParallelDownloading| enabled.
@@ -92,8 +92,8 @@
 // static
 std::unique_ptr<DownloadJob> DownloadJobFactory::CreateJob(
     DownloadItemImpl* download_item,
-    std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-    const DownloadCreateInfo& create_info,
+    std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
+    const download::DownloadCreateInfo& create_info,
     bool is_save_package_download) {
   if (is_save_package_download) {
     return std::make_unique<SavePackageDownloadJob>(download_item,
diff --git a/content/browser/download/download_job_factory.h b/content/browser/download/download_job_factory.h
index fba48956..d1db0dd 100644
--- a/content/browser/download/download_job_factory.h
+++ b/content/browser/download/download_job_factory.h
@@ -8,21 +8,24 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "content/browser/download/download_create_info.h"
+#include "components/download/public/common/download_create_info.h"
+
+namespace download {
+class DownloadRequestHandleInterface;
+}
 
 namespace content {
 
 class DownloadItemImpl;
 class DownloadJob;
-class DownloadRequestHandleInterface;
 
 // Factory class to create different kinds of DownloadJob.
 class DownloadJobFactory {
  public:
   static std::unique_ptr<DownloadJob> CreateJob(
       DownloadItemImpl* download_item,
-      std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-      const DownloadCreateInfo& create_info,
+      std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
+      const download::DownloadCreateInfo& create_info,
       bool is_save_package_download);
 
  private:
diff --git a/content/browser/download/download_job_impl.cc b/content/browser/download/download_job_impl.cc
index 0697da3d..e344a854e 100644
--- a/content/browser/download/download_job_impl.cc
+++ b/content/browser/download/download_job_impl.cc
@@ -8,7 +8,7 @@
 
 DownloadJobImpl::DownloadJobImpl(
     DownloadItemImpl* download_item,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
     bool is_parallizable)
     : DownloadJob(download_item, std::move(request_handle)),
       is_parallizable_(is_parallizable) {}
diff --git a/content/browser/download/download_job_impl.h b/content/browser/download/download_job_impl.h
index 0f5585f99..d96d0bc 100644
--- a/content/browser/download/download_job_impl.h
+++ b/content/browser/download/download_job_impl.h
@@ -16,7 +16,7 @@
  public:
   DownloadJobImpl(
       DownloadItemImpl* download_item,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
       bool is_parallizable);
   ~DownloadJobImpl() override;
 
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 84cb0e1..9b86fe1 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -25,15 +25,17 @@
 #include "build/build_config.h"
 #include "components/download/downloader/in_progress/download_entry.h"
 #include "components/download/downloader/in_progress/in_progress_cache_impl.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/download_url_parameters.h"
 #include "content/browser/byte_stream.h"
 #include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_file.h"
 #include "content/browser/download/download_file_factory.h"
 #include "content/browser/download/download_item_factory.h"
 #include "content/browser/download/download_item_impl.h"
+#include "content/browser/download/download_resource_handler.h"
 #include "content/browser/download/download_stats.h"
 #include "content/browser/download/download_task_runner.h"
 #include "content/browser/download/download_utils.h"
@@ -47,6 +49,7 @@
 #include "content/common/throttling_url_loader.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/download_item_utils.h"
 #include "content/public/browser/download_manager_delegate.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
@@ -108,9 +111,9 @@
     download::DownloadInterruptReason reason,
     base::WeakPtr<DownloadManagerImpl> download_manager) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  std::unique_ptr<DownloadCreateInfo> failed_created_info(
-      new DownloadCreateInfo(base::Time::Now(),
-                             base::WrapUnique(new download::DownloadSaveInfo)));
+  std::unique_ptr<download::DownloadCreateInfo> failed_created_info(
+      new download::DownloadCreateInfo(
+          base::Time::Now(), base::WrapUnique(new download::DownloadSaveInfo)));
   failed_created_info->url_chain.push_back(params->url());
   failed_created_info->result = reason;
   std::unique_ptr<ByteStreamReader> empty_byte_stream;
@@ -200,10 +203,6 @@
     return nullptr;
   }
 
-  ResourceRequestInfo::WebContentsGetter getter = base::BindRepeating(
-      WebContentsImpl::FromRenderFrameHostID, params->render_process_host_id(),
-      params->render_frame_host_routing_id());
-
   network::mojom::URLLoaderFactory* url_loader_factory =
       url_loader_factory_getter->GetNetworkFactory();
   if (params->url().SchemeIs(url::kBlobScheme)) {
@@ -219,8 +218,8 @@
   return DownloadManagerImpl::UniqueUrlDownloadHandlerPtr(
       ResourceDownloader::BeginDownload(download_manager, std::move(params),
                                         std::move(request), url_loader_factory,
-                                        getter, site_url, tab_url,
-                                        tab_referrer_url, download_id, false)
+                                        site_url, tab_url, tab_referrer_url,
+                                        download_id, false)
           .release());
 }
 
@@ -265,9 +264,10 @@
         opened, last_access_time, transient, received_slices);
   }
 
-  DownloadItemImpl* CreateActiveItem(DownloadItemImplDelegate* delegate,
-                                     uint32_t download_id,
-                                     const DownloadCreateInfo& info) override {
+  DownloadItemImpl* CreateActiveItem(
+      DownloadItemImplDelegate* delegate,
+      uint32_t download_id,
+      const download::DownloadCreateInfo& info) override {
     return new DownloadItemImpl(delegate, download_id, info);
   }
 
@@ -277,7 +277,8 @@
       const base::FilePath& path,
       const GURL& url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle) override {
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle)
+      override {
     return new DownloadItemImpl(delegate, download_id, path, url, mime_type,
                                 std::move(request_handle));
   }
@@ -366,10 +367,11 @@
 
 DownloadItemImpl* DownloadManagerImpl::CreateActiveItem(
     uint32_t id,
-    const DownloadCreateInfo& info) {
+    const download::DownloadCreateInfo& info) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!base::ContainsKey(downloads_, id));
   DownloadItemImpl* download = item_factory_->CreateActiveItem(this, id, info);
+
   downloads_[id] = base::WrapUnique(download);
   downloads_by_guid_[download->GetGuid()] = download;
   return download;
@@ -492,21 +494,22 @@
   delegate_ = nullptr;
 }
 
-bool DownloadManagerImpl::InterceptDownload(const DownloadCreateInfo& info) {
-  WebContents* web_contents =
-      info.request_handle ? info.request_handle->GetWebContents() : nullptr;
+bool DownloadManagerImpl::InterceptDownload(
+    const download::DownloadCreateInfo& info) {
+  WebContents* web_contents = WebContentsImpl::FromRenderFrameHostID(
+      info.render_process_id, info.render_frame_id);
   if (!delegate_ ||
       !delegate_->InterceptDownloadIfApplicable(
           info.url(), info.mime_type, info.request_origin, web_contents)) {
     return false;
   }
-
-  info.request_handle->CancelRequest(false);
+  if (info.request_handle)
+    info.request_handle->CancelRequest(false);
   return true;
 }
 
 void DownloadManagerImpl::StartDownload(
-    std::unique_ptr<DownloadCreateInfo> info,
+    std::unique_ptr<download::DownloadCreateInfo> info,
     std::unique_ptr<DownloadManager::InputStream> stream,
     const download::DownloadUrlParameters::OnStartedCallback& on_started) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -541,7 +544,7 @@
 }
 
 void DownloadManagerImpl::StartDownloadWithId(
-    std::unique_ptr<DownloadCreateInfo> info,
+    std::unique_ptr<download::DownloadCreateInfo> info,
     std::unique_ptr<DownloadManager::InputStream> stream,
     const download::DownloadUrlParameters::OnStartedCallback& on_started,
     bool new_download,
@@ -560,7 +563,8 @@
       // If the download is no longer known to the DownloadManager, then it was
       // removed after it was resumed. Ignore. If the download is cancelled
       // while resuming, then also ignore the request.
-      info->request_handle->CancelRequest(true);
+      if (info->request_handle)
+        info->request_handle->CancelRequest(true);
       if (!on_started.is_null())
         on_started.Run(nullptr,
                        download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED);
@@ -571,6 +575,10 @@
     }
     download = item_iterator->second.get();
   }
+  DownloadItemUtils::AttachInfo(
+      download, GetBrowserContext(),
+      WebContentsImpl::FromRenderFrameHostID(info->render_process_id,
+                                             info->render_frame_id));
 
   base::FilePath default_download_directory;
 #if defined(USE_X11)
@@ -680,13 +688,16 @@
     const base::FilePath& main_file_path,
     const GURL& page_url,
     const std::string& mime_type,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+    int render_process_id,
+    int render_frame_id,
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
     const ukm::SourceId ukm_source_id,
     const DownloadItemImplCreated& item_created) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   GetNextId(base::Bind(
       &DownloadManagerImpl::CreateSavePackageDownloadItemWithId,
       weak_factory_.GetWeakPtr(), main_file_path, page_url, mime_type,
+      render_process_id, render_frame_id,
       base::Passed(std::move(request_handle)), ukm_source_id, item_created));
 }
 
@@ -694,7 +705,9 @@
     const base::FilePath& main_file_path,
     const GURL& page_url,
     const std::string& mime_type,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+    int render_process_id,
+    int render_frame_id,
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
     const ukm::SourceId ukm_source_id,
     const DownloadItemImplCreated& item_created,
     uint32_t id) {
@@ -703,6 +716,9 @@
   DCHECK(!base::ContainsKey(downloads_, id));
   DownloadItemImpl* download_item = item_factory_->CreateSavePageItem(
       this, id, main_file_path, page_url, mime_type, std::move(request_handle));
+  DownloadItemUtils::AttachInfo(download_item, GetBrowserContext(),
+                                WebContentsImpl::FromRenderFrameHostID(
+                                    render_process_id, render_frame_id));
   downloads_[download_item->GetId()] = base::WrapUnique(download_item);
   DCHECK(!base::ContainsKey(downloads_by_guid_, download_item->GetGuid()));
   downloads_by_guid_[download_item->GetGuid()] = download_item;
@@ -837,6 +853,7 @@
 
   const GURL& url = resource_request->url;
   const std::string& method = resource_request->method;
+
   ResourceRequestInfo::WebContentsGetter web_contents_getter =
       base::BindRepeating(WebContents::FromFrameTreeNodeId, frame_tree_node_id);
 
@@ -940,6 +957,7 @@
       start_time, end_time, etag, last_modified, received_bytes, total_bytes,
       hash, state, danger_type, interrupt_reason, opened, last_access_time,
       transient, received_slices);
+  DownloadItemUtils::AttachInfo(item, GetBrowserContext(), nullptr);
   downloads_[id] = base::WrapUnique(item);
   downloads_by_guid_[guid] = item;
   for (auto& observer : observers_)
@@ -1021,7 +1039,7 @@
 }
 
 void DownloadManagerImpl::OnUrlDownloadStarted(
-    std::unique_ptr<DownloadCreateInfo> download_create_info,
+    std::unique_ptr<download::DownloadCreateInfo> download_create_info,
     std::unique_ptr<DownloadManager::InputStream> stream,
     const download::DownloadUrlParameters::OnStartedCallback& callback) {
   StartDownload(std::move(download_create_info), std::move(stream), callback);
@@ -1080,11 +1098,21 @@
   if (!is_download_allowed)
     return;
 
+  int render_process_id = -1;
+  int render_frame_id = -1;
+  WebContents* web_contents = web_contents_getter.Run();
+  if (web_contents) {
+    RenderFrameHost* render_frame_host = web_contents->GetMainFrame();
+    if (render_frame_host) {
+      render_process_id = render_frame_host->GetProcess()->GetID();
+      render_frame_id = render_frame_host->GetRoutingID();
+    }
+  }
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&DownloadManagerImpl::CreateDownloadHandlerForNavigation,
-                     weak_factory_.GetWeakPtr(), web_contents_getter,
-                     std::move(resource_request), std::move(url_chain),
+                     weak_factory_.GetWeakPtr(), std::move(resource_request),
+                     render_process_id, render_frame_id, std::move(url_chain),
                      suggested_filename, std::move(response),
                      std::move(cert_status),
                      std::move(url_loader_client_endpoints)));
@@ -1093,8 +1121,9 @@
 // static
 void DownloadManagerImpl::CreateDownloadHandlerForNavigation(
     base::WeakPtr<DownloadManagerImpl> download_manager,
-    ResourceRequestInfo::WebContentsGetter web_contents_getter,
     std::unique_ptr<network::ResourceRequest> resource_request,
+    int render_process_id,
+    int render_frame_id,
     std::vector<GURL> url_chain,
     const base::Optional<std::string>& suggested_filename,
     scoped_refptr<network::ResourceResponse> response,
@@ -1104,9 +1133,9 @@
 
   std::unique_ptr<ResourceDownloader> resource_downloader =
       ResourceDownloader::InterceptNavigationResponse(
-          download_manager, std::move(resource_request),
-          std::move(web_contents_getter), std::move(url_chain),
-          suggested_filename, std::move(response), std::move(cert_status),
+          download_manager, std::move(resource_request), render_process_id,
+          render_frame_id, std::move(url_chain), suggested_filename,
+          std::move(response), std::move(cert_status),
           std::move(url_loader_client_endpoints));
 
   BrowserThread::PostTask(
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h
index 4869d439..f969895 100644
--- a/content/browser/download/download_manager_impl.h
+++ b/content/browser/download/download_manager_impl.h
@@ -32,11 +32,14 @@
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 
+namespace download {
+class DownloadRequestHandleInterface;
+}
+
 namespace content {
 class DownloadFileFactory;
 class DownloadItemFactory;
 class DownloadItemImpl;
-class DownloadRequestHandleInterface;
 class ResourceContext;
 
 class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
@@ -61,7 +64,9 @@
       const base::FilePath& main_file_path,
       const GURL& page_url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+      int render_process_id,
+      int render_frame_id,
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
       const ukm::SourceId ukm_source_id,
       const DownloadItemImplCreated& item_created);
 
@@ -70,7 +75,7 @@
   DownloadManagerDelegate* GetDelegate() const override;
   void Shutdown() override;
   void GetAllDownloads(DownloadVector* result) override;
-  void StartDownload(std::unique_ptr<DownloadCreateInfo> info,
+  void StartDownload(std::unique_ptr<download::DownloadCreateInfo> info,
                      std::unique_ptr<DownloadManager::InputStream> stream,
                      const download::DownloadUrlParameters::OnStartedCallback&
                          on_started) override;
@@ -124,7 +129,7 @@
 
   // UrlDownloadHandler::Delegate implementation.
   void OnUrlDownloadStarted(
-      std::unique_ptr<DownloadCreateInfo> download_create_info,
+      std::unique_ptr<download::DownloadCreateInfo> download_create_info,
       std::unique_ptr<DownloadManager::InputStream> stream,
       const download::DownloadUrlParameters::OnStartedCallback& callback)
       override;
@@ -168,7 +173,7 @@
   friend class DownloadTest;
 
   void StartDownloadWithId(
-      std::unique_ptr<DownloadCreateInfo> info,
+      std::unique_ptr<download::DownloadCreateInfo> info,
       std::unique_ptr<DownloadManager::InputStream> stream,
       const download::DownloadUrlParameters::OnStartedCallback& on_started,
       bool new_download,
@@ -178,19 +183,21 @@
       const base::FilePath& main_file_path,
       const GURL& page_url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
+      int render_process_id,
+      int render_frame_id,
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
       const ukm::SourceId ukm_source_id,
       const DownloadItemImplCreated& on_started,
       uint32_t id);
 
   // Intercepts the download to another system if applicable. Returns true if
   // the download was intercepted.
-  bool InterceptDownload(const DownloadCreateInfo& info);
+  bool InterceptDownload(const download::DownloadCreateInfo& info);
 
   // Create a new active item based on the info.  Separate from
   // StartDownload() for testing.
   DownloadItemImpl* CreateActiveItem(uint32_t id,
-                                     const DownloadCreateInfo& info);
+                                     const download::DownloadCreateInfo& info);
 
   // Get next download id. |callback| is called on the UI thread and may
   // be called synchronously.
@@ -243,8 +250,9 @@
   // regular document loader. Must be called on the IO thread.
   static void CreateDownloadHandlerForNavigation(
       base::WeakPtr<DownloadManagerImpl> download_manager,
-      ResourceRequestInfo::WebContentsGetter web_contents_getter,
       std::unique_ptr<network::ResourceRequest> resource_request,
+      int render_process_id,
+      int render_frame_id,
       std::vector<GURL> url_chain,
       const base::Optional<std::string>& suggested_filename,
       scoped_refptr<network::ResourceResponse> response,
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index 3be190b..9e297fe 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -24,15 +24,15 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_file_factory.h"
 #include "content/browser/download/download_item_factory.h"
 #include "content/browser/download/download_item_impl.h"
 #include "content/browser/download/download_item_impl_delegate.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/mock_download_file.h"
 #include "content/browser/download/mock_download_item_impl.h"
 #include "content/public/browser/browser_context.h"
@@ -71,12 +71,6 @@
 
 namespace {
 
-// Matches a DownloadCreateInfo* that points to the same object as |info| and
-// has a |default_download_directory| that matches |download_directory|.
-MATCHER_P2(DownloadCreateInfoWithDefaultPath, info, download_directory, "") {
-  return arg == info && arg->default_download_directory == download_directory;
-}
-
 class MockDownloadManagerDelegate : public DownloadManagerDelegate {
  public:
   MockDownloadManagerDelegate();
@@ -160,16 +154,18 @@
       bool transient,
       const std::vector<download::DownloadItem::ReceivedSlice>& received_slices)
       override;
-  DownloadItemImpl* CreateActiveItem(DownloadItemImplDelegate* delegate,
-                                     uint32_t download_id,
-                                     const DownloadCreateInfo& info) override;
+  DownloadItemImpl* CreateActiveItem(
+      DownloadItemImplDelegate* delegate,
+      uint32_t download_id,
+      const download::DownloadCreateInfo& info) override;
   DownloadItemImpl* CreateSavePageItem(
       DownloadItemImplDelegate* delegate,
       uint32_t download_id,
       const base::FilePath& path,
       const GURL& url,
       const std::string& mime_type,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle) override;
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle)
+      override;
 
  private:
   std::map<uint32_t, MockDownloadItemImpl*> items_;
@@ -250,7 +246,7 @@
 DownloadItemImpl* MockDownloadItemFactory::CreateActiveItem(
     DownloadItemImplDelegate* delegate,
     uint32_t download_id,
-    const DownloadCreateInfo& info) {
+    const download::DownloadCreateInfo& info) {
   DCHECK(items_.find(download_id) == items_.end());
 
   MockDownloadItemImpl* result =
@@ -280,7 +276,7 @@
     const base::FilePath& path,
     const GURL& url,
     const std::string& mime_type,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle) {
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle) {
   DCHECK(items_.find(download_id) == items_.end());
 
   MockDownloadItemImpl* result =
@@ -458,20 +454,19 @@
 
   // Returns download id.
   MockDownloadItemImpl& AddItemToManager() {
-    DownloadCreateInfo info;
+    download::DownloadCreateInfo info;
 
     // Args are ignored except for download id, so everything else can be
     // null.
     uint32_t id = next_download_id_;
     ++next_download_id_;
-    info.request_handle.reset(new DownloadRequestHandle);
     download_manager_->CreateActiveItem(id, info);
     DCHECK(mock_download_item_factory_->GetItem(id));
     MockDownloadItemImpl& item(*mock_download_item_factory_->GetItem(id));
     // Satisfy expectation.  If the item is created in StartDownload(),
     // we call Start on it immediately, so we need to set that expectation
     // in the factory.
-    std::unique_ptr<DownloadRequestHandleInterface> req_handle;
+    std::unique_ptr<download::DownloadRequestHandleInterface> req_handle;
     item.Start(std::unique_ptr<DownloadFile>(), std::move(req_handle), info);
     DCHECK(id < download_urls_.size());
     EXPECT_CALL(item, GetURL()).WillRepeatedly(ReturnRef(download_urls_[id]));
@@ -554,7 +549,8 @@
 TEST_F(DownloadManagerTest, StartDownload) {
   SetHasObserverCalls(true);
 
-  std::unique_ptr<DownloadCreateInfo> info(new DownloadCreateInfo);
+  std::unique_ptr<download::DownloadCreateInfo> info(
+      new download::DownloadCreateInfo);
   std::unique_ptr<ByteStreamReader> stream(new MockByteStreamReader);
   uint32_t local_id(5);  // Random value
   base::FilePath download_path(FILE_PATH_LITERAL("download/path"));
diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc
index cbab0980..27f52a5 100644
--- a/content/browser/download/download_request_core.cc
+++ b/content/browser/download/download_request_core.cc
@@ -17,9 +17,9 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_item.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_interrupt_reasons_utils.h"
 #include "content/browser/download/download_manager_impl.h"
 #include "content/browser/download/download_request_handle.h"
@@ -210,13 +210,14 @@
     stream_writer_->RegisterCallback(base::Closure());
 }
 
-std::unique_ptr<DownloadCreateInfo>
+std::unique_ptr<download::DownloadCreateInfo>
 DownloadRequestCore::CreateDownloadCreateInfo(
     download::DownloadInterruptReason result) {
   DCHECK(!started_);
   started_ = true;
-  std::unique_ptr<DownloadCreateInfo> create_info(
-      new DownloadCreateInfo(base::Time::Now(), std::move(save_info_)));
+  std::unique_ptr<download::DownloadCreateInfo> create_info(
+      new download::DownloadCreateInfo(base::Time::Now(),
+                                       std::move(save_info_)));
 
   if (result == download::DOWNLOAD_INTERRUPT_REASON_NONE)
     create_info->remote_address = request()->GetSocketAddress().host();
@@ -253,7 +254,7 @@
         request()->response_headers()->response_code());
   }
 
-  std::unique_ptr<DownloadCreateInfo> create_info =
+  std::unique_ptr<download::DownloadCreateInfo> create_info =
       CreateDownloadCreateInfo(result);
   if (result != download::DOWNLOAD_INTERRUPT_REASON_NONE) {
     delegate_->OnStart(std::move(create_info),
@@ -428,7 +429,7 @@
   // OnResponseCompleted() called without OnResponseStarted(). This should only
   // happen when the request was aborted.
   DCHECK_NE(reason, download::DOWNLOAD_INTERRUPT_REASON_NONE);
-  std::unique_ptr<DownloadCreateInfo> create_info =
+  std::unique_ptr<download::DownloadCreateInfo> create_info =
       CreateDownloadCreateInfo(reason);
   std::unique_ptr<ByteStreamReader> empty_byte_stream;
   delegate_->OnStart(std::move(create_info), std::move(empty_byte_stream),
diff --git a/content/browser/download/download_request_core.h b/content/browser/download/download_request_core.h
index 86109f4c..2aa46a6c 100644
--- a/content/browser/download/download_request_core.h
+++ b/content/browser/download/download_request_core.h
@@ -20,6 +20,10 @@
 #include "content/browser/loader/resource_handler.h"
 #include "services/device/public/interfaces/wake_lock.mojom.h"
 
+namespace download {
+struct DownloadCreateInfo;
+}  // namespace download
+
 namespace net {
 class HttpResponseHeaders;
 class URLRequest;
@@ -29,7 +33,6 @@
 namespace content {
 class ByteStreamReader;
 class ByteStreamWriter;
-struct DownloadCreateInfo;
 
 // This class encapsulates the core logic for reading data from a URLRequest and
 // writing it into a ByteStream. It's common to both DownloadResourceHandler and
@@ -43,7 +46,7 @@
    public:
     virtual void OnReadyToRead() = 0;
     virtual void OnStart(
-        std::unique_ptr<DownloadCreateInfo> download_create_info,
+        std::unique_ptr<download::DownloadCreateInfo> download_create_info,
         std::unique_ptr<ByteStreamReader> stream_reader,
         const download::DownloadUrlParameters::OnStartedCallback& callback) = 0;
   };
@@ -61,7 +64,7 @@
   // Should be called when the URLRequest::Delegate receives OnResponseStarted.
   // Invokes Delegate::OnStart() with download start parameters. The
   // |override_mime_type| is used as the MIME type for the download when
-  // constructing a DownloadCreateInfo object.
+  // constructing a download::DownloadCreateInfo object.
   bool OnResponseStarted(const std::string& override_mime_type);
 
   // Should be called to handle a redirect. The caller should only allow the
@@ -117,14 +120,14 @@
   net::URLRequest* request() const { return request_; }
 
  private:
-  std::unique_ptr<DownloadCreateInfo> CreateDownloadCreateInfo(
+  std::unique_ptr<download::DownloadCreateInfo> CreateDownloadCreateInfo(
       download::DownloadInterruptReason result);
 
   Delegate* delegate_;
   net::URLRequest* request_;
 
   // "Passthrough" fields. These are only kept here so that they can be used to
-  // populate the DownloadCreateInfo when the time comes.
+  // populate the download::DownloadCreateInfo when the time comes.
   std::unique_ptr<download::DownloadSaveInfo> save_info_;
   uint32_t download_id_;
   std::string guid_;
diff --git a/content/browser/download/download_request_handle.cc b/content/browser/download/download_request_handle.cc
index 7be9691..b0d9032 100644
--- a/content/browser/download/download_request_handle.cc
+++ b/content/browser/download/download_request_handle.cc
@@ -12,8 +12,6 @@
 
 namespace content {
 
-DownloadRequestHandleInterface::~DownloadRequestHandleInterface() {}
-
 DownloadRequestHandle::DownloadRequestHandle(
     const DownloadRequestHandle& other) = default;
 
@@ -32,29 +30,19 @@
   return web_contents_getter_.is_null() ? nullptr : web_contents_getter_.Run();
 }
 
-DownloadManager* DownloadRequestHandle::GetDownloadManager() const {
-  WebContents* web_contents = GetWebContents();
-  if (web_contents == nullptr)
-    return nullptr;
-  BrowserContext* context = web_contents->GetBrowserContext();
-  if (context == nullptr)
-    return nullptr;
-  return BrowserContext::GetDownloadManager(context);
-}
-
-void DownloadRequestHandle::PauseRequest() const {
+void DownloadRequestHandle::PauseRequest() {
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&DownloadResourceHandler::PauseRequest, handler_));
 }
 
-void DownloadRequestHandle::ResumeRequest() const {
+void DownloadRequestHandle::ResumeRequest() {
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&DownloadResourceHandler::ResumeRequest, handler_));
 }
 
-void DownloadRequestHandle::CancelRequest(bool user_cancel) const {
+void DownloadRequestHandle::CancelRequest(bool user_cancel) {
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&DownloadResourceHandler::CancelRequest, handler_));
diff --git a/content/browser/download/download_request_handle.h b/content/browser/download/download_request_handle.h
index 8fbbc10..8dfba21 100644
--- a/content/browser/download/download_request_handle.h
+++ b/content/browser/download/download_request_handle.h
@@ -7,39 +7,20 @@
 
 #include "base/compiler_specific.h"
 #include "base/memory/weak_ptr.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "content/browser/download/download_resource_handler.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/resource_request_info.h"
 
 namespace content {
-class DownloadManager;
 class WebContents;
 
 // A handle used by the download system for operations on the URLRequest
 // or objects conditional on it (e.g. WebContentsImpl).
 // This class needs to be copyable, so we can pass it across threads and not
 // worry about lifetime or const-ness.
-//
-// DownloadRequestHandleInterface is defined for mocking purposes.
-class CONTENT_EXPORT DownloadRequestHandleInterface {
- public:
-  virtual ~DownloadRequestHandleInterface();
-
-  // These functions must be called on the UI thread.
-  virtual WebContents* GetWebContents() const = 0;
-  virtual DownloadManager* GetDownloadManager() const = 0;
-
-  // Pauses or resumes the matching URL request.
-  virtual void PauseRequest() const = 0;
-  virtual void ResumeRequest() const = 0;
-
-  // Cancels the request.
-  virtual void CancelRequest(bool user_cancel) const = 0;
-};
-
-
 class CONTENT_EXPORT DownloadRequestHandle
-    : public DownloadRequestHandleInterface {
+    : public download::DownloadRequestHandleInterface {
  public:
   DownloadRequestHandle(const DownloadRequestHandle& other);
   ~DownloadRequestHandle() override;
@@ -57,12 +38,12 @@
                         const content::ResourceRequestInfo::WebContentsGetter&
                             web_contents_getter);
 
-  // Implement DownloadRequestHandleInterface interface.
-  WebContents* GetWebContents() const override;
-  DownloadManager* GetDownloadManager() const override;
-  void PauseRequest() const override;
-  void ResumeRequest() const override;
-  void CancelRequest(bool user_cancel) const override;
+  WebContents* GetWebContents() const;
+
+  // download::DownloadRequestHandleInterface interface.
+  void PauseRequest() override;
+  void ResumeRequest() override;
+  void CancelRequest(bool user_cancel) override;
 
  private:
   base::WeakPtr<DownloadResourceHandler> handler_;
diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_resource_handler.cc
index e0708f0..ef5f792 100644
--- a/content/browser/download/download_resource_handler.cc
+++ b/content/browser/download/download_resource_handler.cc
@@ -11,9 +11,9 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_interrupt_reasons_utils.h"
 #include "content/browser/download/download_manager_impl.h"
 #include "content/browser/download/download_request_handle.h"
@@ -43,7 +43,7 @@
 // Static function in order to prevent any accidental accesses to
 // DownloadResourceHandler members from the UI thread.
 static void StartOnUIThread(
-    std::unique_ptr<DownloadCreateInfo> info,
+    std::unique_ptr<download::DownloadCreateInfo> info,
     std::unique_ptr<DownloadResourceHandler::DownloadTabInfo> tab_info,
     std::unique_ptr<ByteStreamReader> stream,
     int render_process_id,
@@ -64,8 +64,12 @@
       frame_host = frame_tree_node->current_frame_host();
   }
 
-  DownloadManager* download_manager =
-      info->request_handle->GetDownloadManager();
+  DownloadManager* download_manager = nullptr;
+  if (frame_host) {
+    download_manager = BrowserContext::GetDownloadManager(
+        frame_host->GetProcess()->GetBrowserContext());
+  }
+
   if (!download_manager || !frame_host) {
     // NULL in unittests or if the page closed right after starting the
     // download.
@@ -82,6 +86,8 @@
   info->tab_referrer_url = tab_info->tab_referrer_url;
   info->ukm_source_id = tab_info->ukm_source_id;
   info->site_url = frame_host->GetSiteInstance()->GetSiteURL();
+  info->render_process_id = frame_host->GetProcess()->GetID();
+  info->render_frame_id = frame_host->GetRoutingID();
 
   download_manager->StartDownload(
       std::move(info),
@@ -246,7 +252,7 @@
 }
 
 void DownloadResourceHandler::OnStart(
-    std::unique_ptr<DownloadCreateInfo> create_info,
+    std::unique_ptr<download::DownloadCreateInfo> create_info,
     std::unique_ptr<ByteStreamReader> stream_reader,
     const download::DownloadUrlParameters::OnStartedCallback& callback) {
   // If the user cancels the download, then don't call start. Instead ignore the
diff --git a/content/browser/download/download_resource_handler.h b/content/browser/download/download_resource_handler.h
index 045e236..39f1982b 100644
--- a/content/browser/download/download_resource_handler.h
+++ b/content/browser/download/download_resource_handler.h
@@ -15,17 +15,21 @@
 #include "components/download/public/common/download_url_parameters.h"
 #include "content/browser/download/download_request_core.h"
 #include "content/browser/loader/resource_handler.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 
+namespace download {
+struct DownloadCreateInfo;
+}  // namespace download
+
 namespace net {
 class URLRequest;
 }  // namespace net
 
 namespace content {
 class ByteStreamReader;
-struct DownloadCreateInfo;
 class ResourceController;
 
 // Forwards data to the download thread.
@@ -101,10 +105,11 @@
   ~DownloadResourceHandler() override;
 
   // DownloadRequestCore::Delegate
-  void OnStart(std::unique_ptr<DownloadCreateInfo> download_create_info,
-               std::unique_ptr<ByteStreamReader> stream_reader,
-               const download::DownloadUrlParameters::OnStartedCallback&
-                   callback) override;
+  void OnStart(
+      std::unique_ptr<download::DownloadCreateInfo> download_create_info,
+      std::unique_ptr<ByteStreamReader> stream_reader,
+      const download::DownloadUrlParameters::OnStartedCallback& callback)
+      override;
   void OnReadyToRead() override;
 
   // Stores information about the download that must be acquired on the UI
diff --git a/content/browser/download/download_response_handler.cc b/content/browser/download/download_response_handler.cc
index a75e543..38ecf38 100644
--- a/content/browser/download/download_response_handler.cc
+++ b/content/browser/download/download_response_handler.cc
@@ -113,12 +113,12 @@
     OnResponseStarted(download::mojom::DownloadStreamHandlePtr());
 }
 
-std::unique_ptr<DownloadCreateInfo>
+std::unique_ptr<download::DownloadCreateInfo>
 DownloadResponseHandler::CreateDownloadCreateInfo(
     const network::ResourceResponseHead& head) {
   // TODO(qinmin): instead of using NetLogWithSource, introduce new logging
   // class for download.
-  auto create_info = std::make_unique<DownloadCreateInfo>(
+  auto create_info = std::make_unique<download::DownloadCreateInfo>(
       base::Time::Now(), std::move(save_info_));
 
   download::DownloadInterruptReason result =
diff --git a/content/browser/download/download_response_handler.h b/content/browser/download/download_response_handler.h
index b6007df..6e27568 100644
--- a/content/browser/download/download_response_handler.h
+++ b/content/browser/download/download_response_handler.h
@@ -7,18 +7,19 @@
 
 #include <vector>
 
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_source.h"
 #include "components/download/public/common/download_stream.mojom.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/public/common/referrer.h"
 #include "net/cert/cert_status_flags.h"
 #include "services/network/public/cpp/resource_response.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 
-namespace content {
-
+namespace download {
 struct DownloadCreateInfo;
-struct DownloadSaveInfo;
+}  // namespace download
+
+namespace content {
 
 // This class is responsible for handling the server response for a download.
 // It passes the DataPipeConsumerHandle and completion status to the download
@@ -30,7 +31,7 @@
   class Delegate {
    public:
     virtual void OnResponseStarted(
-        std::unique_ptr<DownloadCreateInfo> download_create_info,
+        std::unique_ptr<download::DownloadCreateInfo> download_create_info,
         download::mojom::DownloadStreamHandlePtr stream_handle) = 0;
     virtual void OnReceiveRedirect() = 0;
   };
@@ -64,7 +65,7 @@
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
-  std::unique_ptr<DownloadCreateInfo> CreateDownloadCreateInfo(
+  std::unique_ptr<download::DownloadCreateInfo> CreateDownloadCreateInfo(
       const network::ResourceResponseHead& head);
 
   // Helper method that is called when response is received.
@@ -73,7 +74,7 @@
 
   Delegate* const delegate_;
 
-  std::unique_ptr<DownloadCreateInfo> create_info_;
+  std::unique_ptr<download::DownloadCreateInfo> create_info_;
 
   bool started_;
 
diff --git a/content/browser/download/download_utils.cc b/content/browser/download/download_utils.cc
index 5497764..a8d00ff 100644
--- a/content/browser/download/download_utils.cc
+++ b/content/browser/download/download_utils.cc
@@ -11,10 +11,10 @@
 #include "base/task_scheduler/post_task.h"
 #include "components/download/downloader/in_progress/download_entry.h"
 #include "components/download/downloader/in_progress/in_progress_cache.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_save_info.h"
 #include "components/download/public/common/download_url_parameters.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_interrupt_reasons_utils.h"
 #include "content/browser/download/download_stats.h"
 #include "content/browser/loader/upload_data_stream_builder.h"
@@ -396,7 +396,7 @@
 }
 
 void HandleResponseHeaders(const net::HttpResponseHeaders* headers,
-                           DownloadCreateInfo* create_info) {
+                           download::DownloadCreateInfo* create_info) {
   if (!headers)
     return;
 
diff --git a/content/browser/download/download_utils.h b/content/browser/download/download_utils.h
index fae91c0..93235ad 100644
--- a/content/browser/download/download_utils.h
+++ b/content/browser/download/download_utils.h
@@ -13,6 +13,7 @@
 #include "net/http/http_response_headers.h"
 
 namespace download {
+struct DownloadCreateInfo;
 struct DownloadEntry;
 struct DownloadSaveInfo;
 class DownloadUrlParameters;
@@ -34,7 +35,6 @@
 
 class BrowserContext;
 class ResourceContext;
-struct DownloadCreateInfo;
 
 // Handle the url request completion status and return the interrupt reasons.
 // |cert_status| is ignored if error_code is not net::ERR_ABORTED.
@@ -63,7 +63,7 @@
 // Parse response headers and update |create_info| accordingly.
 CONTENT_EXPORT void HandleResponseHeaders(
     const net::HttpResponseHeaders* headers,
-    DownloadCreateInfo* create_info);
+    download::DownloadCreateInfo* create_info);
 
 // Get the entry based on |guid| from in progress cache.
 CONTENT_EXPORT base::Optional<download::DownloadEntry> GetInProgressEntry(
diff --git a/content/browser/download/download_worker.cc b/content/browser/download/download_worker.cc
index 0e6df5d..f98b571 100644
--- a/content/browser/download/download_worker.cc
+++ b/content/browser/download/download_worker.cc
@@ -4,8 +4,9 @@
 
 #include "content/browser/download/download_worker.h"
 
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
-#include "content/browser/download/download_create_info.h"
+#include "content/browser/byte_stream.h"
 #include "content/browser/download/download_utils.h"
 #include "content/browser/download/resource_downloader.h"
 #include "content/public/browser/web_contents.h"
@@ -34,10 +35,6 @@
   int status_;
 };
 
-WebContents* GetEmptyWebContents() {
-  return nullptr;
-}
-
 std::unique_ptr<UrlDownloadHandler, BrowserThread::DeleteOnIOThread>
 CreateUrlDownloadHandler(
     std::unique_ptr<download::DownloadUrlParameters> params,
@@ -51,9 +48,8 @@
     return std::unique_ptr<ResourceDownloader, BrowserThread::DeleteOnIOThread>(
         ResourceDownloader::BeginDownload(
             delegate, std::move(params), std::move(request),
-            url_loader_factory_getter->GetNetworkFactory(),
-            base::BindRepeating(&GetEmptyWebContents), GURL(), GURL(), GURL(),
-            download::DownloadItem::kInvalidId, true)
+            url_loader_factory_getter->GetNetworkFactory(), GURL(), GURL(),
+            GURL(), download::DownloadItem::kInvalidId, true)
             .release());
   } else {
     // Build the URLRequest, BlobDataHandle is hold in original request for
@@ -118,7 +114,7 @@
 }
 
 void DownloadWorker::OnUrlDownloadStarted(
-    std::unique_ptr<DownloadCreateInfo> create_info,
+    std::unique_ptr<download::DownloadCreateInfo> create_info,
     std::unique_ptr<DownloadManager::InputStream> input_stream,
     const download::DownloadUrlParameters::OnStartedCallback& callback) {
   // |callback| is not used in subsequent requests.
diff --git a/content/browser/download/download_worker.h b/content/browser/download/download_worker.h
index d299305..9a84008 100644
--- a/content/browser/download/download_worker.h
+++ b/content/browser/download/download_worker.h
@@ -9,8 +9,8 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/download_url_parameters.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/url_downloader.h"
 #include "content/browser/url_loader_factory_getter.h"
 #include "content/common/content_export.h"
@@ -55,7 +55,7 @@
  private:
   // UrlDownloader::Delegate implementation.
   void OnUrlDownloadStarted(
-      std::unique_ptr<DownloadCreateInfo> create_info,
+      std::unique_ptr<download::DownloadCreateInfo> create_info,
       std::unique_ptr<DownloadManager::InputStream> input_stream,
       const download::DownloadUrlParameters::OnStartedCallback& callback)
       override;
@@ -79,7 +79,7 @@
   bool is_user_cancel_;
 
   // Used to control the network request. Live on UI thread.
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle_;
+  std::unique_ptr<download::DownloadRequestHandleInterface> request_handle_;
 
   // Used to handle the url request. Live and die on IO thread.
   std::unique_ptr<UrlDownloadHandler, BrowserThread::DeleteOnIOThread>
diff --git a/content/browser/download/mock_download_item_impl.h b/content/browser/download/mock_download_item_impl.h
index 7c01268..4ac8831 100644
--- a/content/browser/download/mock_download_item_impl.h
+++ b/content/browser/download/mock_download_item_impl.h
@@ -10,10 +10,10 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "content/browser/download/download_create_info.h"
+#include "components/download/public/common/download_create_info.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "content/browser/download/download_file.h"
 #include "content/browser/download/download_item_impl.h"
-#include "content/browser/download/download_request_handle.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace content {
@@ -49,13 +49,15 @@
     NOTREACHED();
   }
   MOCK_METHOD0(OnDownloadedFileRemoved, void());
-  void Start(std::unique_ptr<DownloadFile> download_file,
-             std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-             const DownloadCreateInfo& create_info) override {
+  void Start(
+      std::unique_ptr<DownloadFile> download_file,
+      std::unique_ptr<download::DownloadRequestHandleInterface> req_handle,
+      const download::DownloadCreateInfo& create_info) override {
     MockStart(download_file.get(), req_handle.get());
   }
 
-  MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*));
+  MOCK_METHOD2(MockStart,
+               void(DownloadFile*, download::DownloadRequestHandleInterface*));
 
   MOCK_METHOD0(Remove, void());
   MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*));
diff --git a/content/browser/download/mock_download_job.h b/content/browser/download/mock_download_job.h
index c267d83..ac9c7b7b 100644
--- a/content/browser/download/mock_download_job.h
+++ b/content/browser/download/mock_download_job.h
@@ -38,7 +38,6 @@
   MOCK_CONST_METHOD0(PercentComplete, int());
   MOCK_CONST_METHOD0(CurrentSpeed, int64_t());
   MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta* remaining));
-  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
   MOCK_CONST_METHOD1(DebugString, std::string(bool));
 };
 
diff --git a/content/browser/download/parallel_download_job.cc b/content/browser/download/parallel_download_job.cc
index ef0b03e..aee4791 100644
--- a/content/browser/download/parallel_download_job.cc
+++ b/content/browser/download/parallel_download_job.cc
@@ -10,7 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
-#include "content/browser/download/download_create_info.h"
+#include "components/download/public/common/download_create_info.h"
 #include "content/browser/download/download_stats.h"
 #include "content/browser/download/download_utils.h"
 #include "content/browser/download/parallel_download_utils.h"
@@ -29,8 +29,8 @@
 
 ParallelDownloadJob::ParallelDownloadJob(
     DownloadItemImpl* download_item,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle,
-    const DownloadCreateInfo& create_info)
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
+    const download::DownloadCreateInfo& create_info)
     : DownloadJobImpl(download_item, std::move(request_handle), true),
       initial_request_offset_(create_info.offset),
       initial_received_slices_(download_item->GetReceivedSlices()),
diff --git a/content/browser/download/parallel_download_job.h b/content/browser/download/parallel_download_job.h
index a4a7e691..14d16be 100644
--- a/content/browser/download/parallel_download_job.h
+++ b/content/browser/download/parallel_download_job.h
@@ -25,8 +25,8 @@
  public:
   ParallelDownloadJob(
       DownloadItemImpl* download_item,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
-      const DownloadCreateInfo& create_info);
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
+      const download::DownloadCreateInfo& create_info);
   ~ParallelDownloadJob() override;
 
   // DownloadJobImpl implementation.
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/content/browser/download/parallel_download_job_unittest.cc
index ce6ce60..dc2364b1 100644
--- a/content/browser/download/parallel_download_job_unittest.cc
+++ b/content/browser/download/parallel_download_job_unittest.cc
@@ -31,14 +31,12 @@
 
 namespace {
 
-class MockDownloadRequestHandle : public DownloadRequestHandleInterface {
+class MockDownloadRequestHandle
+    : public download::DownloadRequestHandleInterface {
  public:
-  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
-  MOCK_CONST_METHOD0(GetDownloadManager, DownloadManager*());
-  MOCK_CONST_METHOD0(PauseRequest, void());
-  MOCK_CONST_METHOD0(ResumeRequest, void());
-  MOCK_CONST_METHOD1(CancelRequest, void(bool));
-  MOCK_CONST_METHOD0(DebugString, std::string());
+  MOCK_METHOD0(PauseRequest, void());
+  MOCK_METHOD0(ResumeRequest, void());
+  MOCK_METHOD1(CancelRequest, void(bool));
 };
 
 class MockDownloadDestinationObserver : public DownloadDestinationObserver {
@@ -72,8 +70,8 @@
  public:
   ParallelDownloadJobForTest(
       DownloadItemImpl* download_item,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle,
-      const DownloadCreateInfo& create_info,
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle,
+      const download::DownloadCreateInfo& create_info,
       int request_count,
       int64_t min_slice_size,
       int min_remaining_time)
@@ -144,7 +142,7 @@
     EXPECT_CALL(*download_item_, GetReceivedSlices())
         .WillRepeatedly(ReturnRef(received_slices_));
 
-    DownloadCreateInfo info;
+    download::DownloadCreateInfo info;
     info.offset = initial_request_offset;
     info.total_bytes = content_length;
     std::unique_ptr<MockDownloadRequestHandle> request_handle =
@@ -177,8 +175,8 @@
       std::unique_ptr<MockDownloadRequestHandle> request_handle) {
     UrlDownloadHandler::Delegate* delegate =
         static_cast<UrlDownloadHandler::Delegate*>(worker);
-    std::unique_ptr<DownloadCreateInfo> create_info =
-        std::make_unique<DownloadCreateInfo>();
+    std::unique_ptr<download::DownloadCreateInfo> create_info =
+        std::make_unique<download::DownloadCreateInfo>();
     create_info->request_handle = std::move(request_handle);
     delegate->OnUrlDownloadStarted(
         std::move(create_info),
diff --git a/content/browser/download/parallel_download_utils.h b/content/browser/download/parallel_download_utils.h
index 783f9bf..63b36a2 100644
--- a/content/browser/download/parallel_download_utils.h
+++ b/content/browser/download/parallel_download_utils.h
@@ -7,8 +7,8 @@
 
 #include <vector>
 
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_item.h"
-#include "content/browser/download/download_create_info.h"
 #include "content/browser/download/download_file_impl.h"
 #include "content/common/content_export.h"
 
diff --git a/content/browser/download/resource_downloader.cc b/content/browser/download/resource_downloader.cc
index 8b287b77..e3a3c28a 100644
--- a/content/browser/download/resource_downloader.cc
+++ b/content/browser/download/resource_downloader.cc
@@ -9,7 +9,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "content/browser/blob_storage/blob_url_loader_factory.h"
 #include "content/browser/download/download_utils.h"
-#include "content/public/browser/render_frame_host.h"
+
 #include "content/public/browser/web_contents.h"
 
 namespace network {
@@ -58,44 +58,20 @@
   std::move(callback_).Run(status);
 }
 
-// This class is only used for providing the WebContents to DownloadItemImpl.
-class RequestHandle : public DownloadRequestHandleInterface {
- public:
-  explicit RequestHandle(const ResourceRequestInfo::WebContentsGetter& getter)
-      : web_contents_getter_(getter) {}
-  RequestHandle(RequestHandle&& other)
-      : web_contents_getter_(other.web_contents_getter_) {}
-
-  // DownloadRequestHandleInterface
-  WebContents* GetWebContents() const override {
-    return web_contents_getter_.Run();
-  }
-
-  DownloadManager* GetDownloadManager() const override { return nullptr; }
-  void PauseRequest() const override {}
-  void ResumeRequest() const override {}
-  void CancelRequest(bool user_cancel) const override {}
-
- private:
-  ResourceRequestInfo::WebContentsGetter web_contents_getter_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestHandle);
-};
-
 // static
 std::unique_ptr<ResourceDownloader> ResourceDownloader::BeginDownload(
     base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
     std::unique_ptr<download::DownloadUrlParameters> params,
     std::unique_ptr<network::ResourceRequest> request,
     network::mojom::URLLoaderFactory* url_loader_factory,
-    const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& site_url,
     const GURL& tab_url,
     const GURL& tab_referrer_url,
     uint32_t download_id,
     bool is_parallel_request) {
   auto downloader = std::make_unique<ResourceDownloader>(
-      delegate, std::move(request), web_contents_getter, site_url, tab_url,
+      delegate, std::move(request), params->render_process_host_id(),
+      params->render_frame_host_routing_id(), site_url, tab_url,
       tab_referrer_url, download_id);
 
   downloader->Start(url_loader_factory, std::move(params), is_parallel_request);
@@ -107,15 +83,16 @@
 ResourceDownloader::InterceptNavigationResponse(
     base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
     std::unique_ptr<network::ResourceRequest> resource_request,
-    const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
+    int render_process_id,
+    int render_frame_id,
     std::vector<GURL> url_chain,
     const base::Optional<std::string>& suggested_filename,
     const scoped_refptr<network::ResourceResponse>& response,
     net::CertStatus cert_status,
     network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints) {
   auto downloader = std::make_unique<ResourceDownloader>(
-      delegate, std::move(resource_request), web_contents_getter, GURL(),
-      GURL(), GURL(), download::DownloadItem::kInvalidId);
+      delegate, std::move(resource_request), render_process_id, render_frame_id,
+      GURL(), GURL(), GURL(), download::DownloadItem::kInvalidId);
   downloader->InterceptResponse(std::move(response), std::move(url_chain),
                                 suggested_filename, cert_status,
                                 std::move(url_loader_client_endpoints));
@@ -125,7 +102,8 @@
 ResourceDownloader::ResourceDownloader(
     base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
     std::unique_ptr<network::ResourceRequest> resource_request,
-    const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
+    int render_process_id,
+    int render_frame_id,
     const GURL& site_url,
     const GURL& tab_url,
     const GURL& tab_referrer_url,
@@ -133,7 +111,8 @@
     : delegate_(delegate),
       resource_request_(std::move(resource_request)),
       download_id_(download_id),
-      web_contents_getter_(web_contents_getter),
+      render_process_id_(render_process_id),
+      render_frame_id_(render_frame_id),
       site_url_(site_url),
       tab_url_(tab_url),
       tab_referrer_url_(tab_referrer_url),
@@ -210,15 +189,15 @@
 }
 
 void ResourceDownloader::OnResponseStarted(
-    std::unique_ptr<DownloadCreateInfo> download_create_info,
+    std::unique_ptr<download::DownloadCreateInfo> download_create_info,
     download::mojom::DownloadStreamHandlePtr stream_handle) {
   download_create_info->download_id = download_id_;
   download_create_info->guid = guid_;
   download_create_info->site_url = site_url_;
   download_create_info->tab_url = tab_url_;
   download_create_info->tab_referrer_url = tab_referrer_url_;
-  download_create_info->request_handle.reset(
-      new RequestHandle(web_contents_getter_));
+  download_create_info->render_process_id = render_process_id_;
+  download_create_info->render_frame_id = render_frame_id_;
 
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
diff --git a/content/browser/download/resource_downloader.h b/content/browser/download/resource_downloader.h
index 99b0899e..bd20c49 100644
--- a/content/browser/download/resource_downloader.h
+++ b/content/browser/download/resource_downloader.h
@@ -7,12 +7,11 @@
 
 #include "content/browser/download/download_response_handler.h"
 #include "content/browser/download/url_download_handler.h"
-#include "content/browser/url_loader_factory_getter.h"
-#include "content/public/browser/resource_request_info.h"
 #include "content/public/browser/ssl_status.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
 
 namespace content {
 
@@ -26,7 +25,6 @@
       std::unique_ptr<download::DownloadUrlParameters> download_url_parameters,
       std::unique_ptr<network::ResourceRequest> request,
       network::mojom::URLLoaderFactory* url_loader_factory,
-      const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
       const GURL& site_url,
       const GURL& tab_url,
       const GURL& tab_referrer_url,
@@ -39,26 +37,27 @@
   static std::unique_ptr<ResourceDownloader> InterceptNavigationResponse(
       base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
       std::unique_ptr<network::ResourceRequest> resource_request,
-      const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
+      int render_process_id,
+      int render_frame_id,
       std::vector<GURL> url_chain,
       const base::Optional<std::string>& suggested_filename,
       const scoped_refptr<network::ResourceResponse>& response,
       net::CertStatus cert_status,
       network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints);
 
-  ResourceDownloader(
-      base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
-      std::unique_ptr<network::ResourceRequest> resource_request,
-      const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
-      const GURL& site_url,
-      const GURL& tab_url,
-      const GURL& tab_referrer_url,
-      uint32_t download_id);
+  ResourceDownloader(base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
+                     std::unique_ptr<network::ResourceRequest> resource_request,
+                     int render_process_id,
+                     int render_frame_id,
+                     const GURL& site_url,
+                     const GURL& tab_url,
+                     const GURL& tab_referrer_url,
+                     uint32_t download_id);
   ~ResourceDownloader() override;
 
   // DownloadResponseHandler::Delegate
   void OnResponseStarted(
-      std::unique_ptr<DownloadCreateInfo> download_create_info,
+      std::unique_ptr<download::DownloadCreateInfo> download_create_info,
       download::mojom::DownloadStreamHandlePtr stream_handle) override;
   void OnReceiveRedirect() override;
 
@@ -102,8 +101,9 @@
   // Callback to run after download starts.
   download::DownloadUrlParameters::OnStartedCallback callback_;
 
-  // Used to get WebContents in browser process.
-  ResourceRequestInfo::WebContentsGetter web_contents_getter_;
+  // Frame and process id associated with the request.
+  int render_process_id_;
+  int render_frame_id_;
 
   // Site URL for the site instance that initiated the download.
   GURL site_url_;
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index f49c834..11bfa9a 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -24,6 +24,7 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/filename_generation/filename_generation.h"
 #include "components/url_formatter/url_formatter.h"
 #include "content/browser/bad_message.h"
@@ -124,19 +125,16 @@
 
 // Request handle for SavePackage downloads. Currently doesn't support
 // pause/resume, but returns a WebContents.
-class SavePackageRequestHandle : public DownloadRequestHandleInterface {
+class SavePackageRequestHandle
+    : public download::DownloadRequestHandleInterface {
  public:
   explicit SavePackageRequestHandle(base::WeakPtr<SavePackage> save_package)
       : save_package_(save_package) {}
 
   // DownloadRequestHandleInterface
-  WebContents* GetWebContents() const override {
-    return save_package_.get() ? save_package_->web_contents() : nullptr;
-  }
-  DownloadManager* GetDownloadManager() const override { return nullptr; }
-  void PauseRequest() const override {}
-  void ResumeRequest() const override {}
-  void CancelRequest(bool user_cancel) const override {
+  void PauseRequest() override {}
+  void ResumeRequest() override {}
+  void CancelRequest(bool user_cancel) override {
     if (save_package_.get() && !save_package_->canceled())
       save_package_->Cancel(user_cancel, false);
   }
@@ -276,17 +274,20 @@
     return false;
   }
 
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle(
+  std::unique_ptr<download::DownloadRequestHandleInterface> request_handle(
       new SavePackageRequestHandle(AsWeakPtr()));
 
   // The download manager keeps ownership but adds us as an observer.
   ukm::SourceId ukm_source_id = ukm::UkmRecorder::GetNewSourceID();
   DownloadUkmHelper::UpdateSourceURL(ukm::UkmRecorder::Get(), ukm_source_id,
                                      web_contents());
+
+  RenderFrameHost* frame_host = web_contents()->GetMainFrame();
   download_manager_->CreateSavePackageDownloadItem(
       saved_main_file_path_, page_url_,
       ((save_type_ == SAVE_PAGE_TYPE_AS_MHTML) ? "multipart/related"
                                                : "text/html"),
+      frame_host->GetProcess()->GetID(), frame_host->GetRoutingID(),
       std::move(request_handle), std::move(ukm_source_id),
       base::Bind(&SavePackage::InitWithDownloadItem, AsWeakPtr(),
                  download_created_callback));
diff --git a/content/browser/download/save_package_download_job.cc b/content/browser/download/save_package_download_job.cc
index c5a9b539..0b15a2ff 100644
--- a/content/browser/download/save_package_download_job.cc
+++ b/content/browser/download/save_package_download_job.cc
@@ -8,7 +8,7 @@
 
 SavePackageDownloadJob::SavePackageDownloadJob(
     DownloadItemImpl* download_item,
-    std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+    std::unique_ptr<download::DownloadRequestHandleInterface> request_handle)
     : DownloadJob(download_item, std::move(request_handle)) {}
 
 SavePackageDownloadJob::~SavePackageDownloadJob() = default;
diff --git a/content/browser/download/save_package_download_job.h b/content/browser/download/save_package_download_job.h
index fb1bf7f..b624d0c0 100644
--- a/content/browser/download/save_package_download_job.h
+++ b/content/browser/download/save_package_download_job.h
@@ -6,9 +6,9 @@
 #define CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_DOWNLOAD_JOB_H_
 
 #include "base/macros.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "content/browser/download/download_item_impl.h"
 #include "content/browser/download/download_job.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/common/content_export.h"
 
 namespace content {
@@ -17,7 +17,7 @@
  public:
   SavePackageDownloadJob(
       DownloadItemImpl* download_item,
-      std::unique_ptr<DownloadRequestHandleInterface> request_handle);
+      std::unique_ptr<download::DownloadRequestHandleInterface> request_handle);
   ~SavePackageDownloadJob() override;
 
   // DownloadJob implementation.
diff --git a/content/browser/download/url_download_handler.h b/content/browser/download/url_download_handler.h
index 385ce32..c80f7c5 100644
--- a/content/browser/download/url_download_handler.h
+++ b/content/browser/download/url_download_handler.h
@@ -9,9 +9,11 @@
 #include "content/browser/byte_stream.h"
 #include "content/public/browser/download_manager.h"
 
-namespace content {
-
+namespace download {
 struct DownloadCreateInfo;
+}  // namespace download
+
+namespace content {
 
 // Class for handling the download of a url. Implemented by child classes.
 class CONTENT_EXPORT UrlDownloadHandler {
@@ -20,7 +22,7 @@
   class CONTENT_EXPORT Delegate {
    public:
     virtual void OnUrlDownloadStarted(
-        std::unique_ptr<DownloadCreateInfo> download_create_info,
+        std::unique_ptr<download::DownloadCreateInfo> download_create_info,
         std::unique_ptr<DownloadManager::InputStream> input_stream,
         const download::DownloadUrlParameters::OnStartedCallback& callback) = 0;
     // Called after the connection is cancelled or finished.
diff --git a/content/browser/download/url_downloader.cc b/content/browser/download/url_downloader.cc
index 54275ab..e6d93a0a 100644
--- a/content/browser/download/url_downloader.cc
+++ b/content/browser/download/url_downloader.cc
@@ -9,11 +9,11 @@
 #include "base/macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
+#include "components/download/public/common/download_request_handle_interface.h"
 #include "components/download/public/common/download_url_parameters.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_request_handle.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/io_buffer.h"
 #include "net/base/load_flags.h"
@@ -24,7 +24,8 @@
 
 namespace content {
 
-class UrlDownloader::RequestHandle : public DownloadRequestHandleInterface {
+class UrlDownloader::RequestHandle
+    : public download::DownloadRequestHandleInterface {
  public:
   RequestHandle(base::WeakPtr<UrlDownloader> downloader,
                 scoped_refptr<base::SequencedTaskRunner> downloader_task_runner)
@@ -40,17 +41,15 @@
   }
 
   // DownloadRequestHandleInterface
-  WebContents* GetWebContents() const override { return nullptr; }
-  DownloadManager* GetDownloadManager() const override { return nullptr; }
-  void PauseRequest() const override {
+  void PauseRequest() override {
     downloader_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&UrlDownloader::PauseRequest, downloader_));
   }
-  void ResumeRequest() const override {
+  void ResumeRequest() override {
     downloader_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&UrlDownloader::ResumeRequest, downloader_));
   }
-  void CancelRequest(bool user_cancel) const override {
+  void CancelRequest(bool user_cancel) override {
     downloader_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&UrlDownloader::CancelRequest, downloader_));
   }
@@ -218,7 +217,7 @@
 }
 
 void UrlDownloader::OnStart(
-    std::unique_ptr<DownloadCreateInfo> create_info,
+    std::unique_ptr<download::DownloadCreateInfo> create_info,
     std::unique_ptr<ByteStreamReader> stream_reader,
     const download::DownloadUrlParameters::OnStartedCallback& callback) {
   create_info->request_handle.reset(new RequestHandle(
diff --git a/content/browser/download/url_downloader.h b/content/browser/download/url_downloader.h
index d95363c4..c058081f1 100644
--- a/content/browser/download/url_downloader.h
+++ b/content/browser/download/url_downloader.h
@@ -17,9 +17,12 @@
 #include "net/url_request/redirect_info.h"
 #include "net/url_request/url_request.h"
 
+namespace download {
+struct DownloadCreateInfo;
+}  // namespace download
+
 namespace content {
 class ByteStreamReader;
-struct DownloadCreateInfo;
 
 class UrlDownloader : public net::URLRequest::Delegate,
                       public DownloadRequestCore::Delegate,
@@ -54,10 +57,11 @@
   void ResponseCompleted(int net_error);
 
   // DownloadRequestCore::Delegate
-  void OnStart(std::unique_ptr<DownloadCreateInfo> download_create_info,
-               std::unique_ptr<ByteStreamReader> stream_reader,
-               const download::DownloadUrlParameters::OnStartedCallback&
-                   callback) override;
+  void OnStart(
+      std::unique_ptr<download::DownloadCreateInfo> download_create_info,
+      std::unique_ptr<ByteStreamReader> stream_reader,
+      const download::DownloadUrlParameters::OnStartedCallback& callback)
+      override;
   void OnReadyToRead() override;
 
   void PauseRequest();
diff --git a/content/browser/file_url_loader_factory.cc b/content/browser/file_url_loader_factory.cc
index b6882f3..1bbeafd3 100644
--- a/content/browser/file_url_loader_factory.cc
+++ b/content/browser/file_url_loader_factory.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <string>
 #include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/files/file.h"
@@ -89,17 +90,20 @@
     : public network::mojom::URLLoader,
       public net::DirectoryLister::DirectoryListerDelegate {
  public:
-  static void CreateAndStart(const base::FilePath& profile_path,
-                             const network::ResourceRequest& request,
-                             network::mojom::URLLoaderRequest loader,
-                             network::mojom::URLLoaderClientPtrInfo client_info,
-                             std::unique_ptr<FileURLLoaderObserver> observer) {
+  static void CreateAndStart(
+      const base::FilePath& profile_path,
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      network::mojom::URLLoaderClientPtrInfo client_info,
+      std::unique_ptr<FileURLLoaderObserver> observer,
+      scoped_refptr<net::HttpResponseHeaders> response_headers) {
     // Owns itself. Will live as long as its URLLoader and URLLoaderClientPtr
     // bindings are alive - essentially until either the client gives up or all
     // file data has been sent to it.
     auto* file_url_loader = new FileURLDirectoryLoader;
     file_url_loader->Start(profile_path, request, std::move(loader),
-                           std::move(client_info), std::move(observer));
+                           std::move(client_info), std::move(observer),
+                           std::move(response_headers));
   }
 
   // network::mojom::URLLoader:
@@ -118,7 +122,8 @@
              const network::ResourceRequest& request,
              network::mojom::URLLoaderRequest loader,
              network::mojom::URLLoaderClientPtrInfo client_info,
-             std::unique_ptr<content::FileURLLoaderObserver> observer) {
+             std::unique_ptr<content::FileURLLoaderObserver> observer,
+             scoped_refptr<net::HttpResponseHeaders> response_headers) {
     binding_.Bind(std::move(loader));
     binding_.set_connection_error_handler(base::BindOnce(
         &FileURLDirectoryLoader::OnConnectionError, base::Unretained(this)));
@@ -392,7 +397,7 @@
       new_request.url = directory_url;
       FileURLDirectoryLoader::CreateAndStart(
           profile_path, new_request, binding_.Unbind(), client.PassInterface(),
-          std::move(observer));
+          std::move(observer), std::move(extra_response_headers));
       MaybeDeleteSelf();
       return;
     }
@@ -449,8 +454,16 @@
       observer->OnStart();
 
     base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+    net::Error net_error = net::FileErrorToNetError(file.error_details());
     if (observer)
-      observer->OnOpenComplete(net::FileErrorToNetError(file.error_details()));
+      observer->OnOpenComplete(net_error);
+    if (!file.IsValid()) {
+      if (observer)
+        observer->OnDoneReading();
+      client->OnComplete(network::URLLoaderCompletionStatus(net_error));
+      MaybeDeleteSelf();
+      return;
+    }
     char initial_read_buffer[net::kMaxBytesToSniff];
     int initial_read_result =
         file.ReadAtCurrentPos(initial_read_buffer, net::kMaxBytesToSniff);
@@ -461,7 +474,7 @@
         observer->OnBytesRead(nullptr, 0u, read_error);
         observer->OnDoneReading();
       }
-      net::Error net_error = net::FileErrorToNetError(read_error);
+      net_error = net::FileErrorToNetError(read_error);
       client->OnComplete(network::URLLoaderCompletionStatus(net_error));
       return;
     } else if (observer) {
@@ -536,6 +549,11 @@
               : net::ForceSniffFileUrlsForHtml::kDisabled,
           &head.mime_type);
     }
+    if (head.headers) {
+      head.headers->AddHeader(
+          base::StringPrintf("%s: %s", net::HttpRequestHeaders::kContentType,
+                             head.mime_type.c_str()));
+    }
     client->OnReceiveResponse(head, base::nullopt, nullptr);
     client->OnStartLoadingResponseBody(std::move(pipe.consumer_handle));
     client_ = std::move(client);
@@ -619,7 +637,7 @@
         FROM_HERE,
         base::BindOnce(&FileURLDirectoryLoader::CreateAndStart, profile_path_,
                        request, std::move(loader), client.PassInterface(),
-                       std::unique_ptr<FileURLLoaderObserver>()));
+                       std::unique_ptr<FileURLLoaderObserver>(), nullptr));
   } else {
     task_runner_->PostTask(
         FROM_HERE,
diff --git a/content/browser/fileapi/fileapi_message_filter.cc b/content/browser/fileapi/fileapi_message_filter.cc
index 84ce7fe..3eb75cf 100644
--- a/content/browser/fileapi/fileapi_message_filter.cc
+++ b/content/browser/fileapi/fileapi_message_filter.cc
@@ -604,7 +604,7 @@
           context_->default_file_task_runner());
     }
     file_ref->AddFinalReleaseCallback(
-        base::Bind(&RevokeFilePermission, process_id_));
+        base::BindOnce(&RevokeFilePermission, process_id_));
   }
 
   if (file_ref.get()) {
diff --git a/content/browser/frame_host/frame_service_base_unittest.cc b/content/browser/frame_host/frame_service_base_unittest.cc
index 027c4fc..37b2bc3b 100644
--- a/content/browser/frame_host/frame_service_base_unittest.cc
+++ b/content/browser/frame_host/frame_service_base_unittest.cc
@@ -79,8 +79,8 @@
   void CreateEchoImpl(RenderFrameHost* rfh) {
     DCHECK(!is_echo_impl_alive_);
     new EchoImpl(rfh, mojo::MakeRequest(&echo_ptr_),
-                 base::Bind(&FrameServiceBaseTest::OnEchoImplDestructed,
-                            base::Unretained(this)));
+                 base::BindOnce(&FrameServiceBaseTest::OnEchoImplDestructed,
+                                base::Unretained(this)));
     is_echo_impl_alive_ = true;
   }
 
diff --git a/content/browser/frame_host/navigation_controller_delegate.h b/content/browser/frame_host/navigation_controller_delegate.h
index dd3c8ef..1b9f0c9 100644
--- a/content/browser/frame_host/navigation_controller_delegate.h
+++ b/content/browser/frame_host/navigation_controller_delegate.h
@@ -49,6 +49,7 @@
       const EntryChangedDetails& change_details) = 0;
   virtual void NotifyNavigationListPruned(
       const PrunedDetails& pruned_details) = 0;
+  virtual void NotifyNavigationEntriesDeleted() = 0;
   virtual void SetHistoryOffsetAndLength(int history_offset,
                                          int history_length) = 0;
   virtual void ActivateAndShowRepostFormWarningDialog() = 0;
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index f255e305..ff1d3fc 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -1818,6 +1818,33 @@
   last_committed_entry_index_ = 0;
 }
 
+void NavigationControllerImpl::DeleteNavigationEntries(
+    const DeletionPredicate& deletionPredicate) {
+  // It is up to callers to check the invariants before calling this.
+  CHECK(CanPruneAllButLastCommitted());
+  std::vector<int> delete_indices;
+  for (size_t i = 0; i < entries_.size(); i++) {
+    if (i != static_cast<size_t>(last_committed_entry_index_) &&
+        deletionPredicate.Run(*entries_[i])) {
+      delete_indices.push_back(i);
+    }
+  }
+  if (delete_indices.empty())
+    return;
+
+  if (delete_indices.size() == GetEntryCount() - 1U) {
+    PruneAllButLastCommitted();
+  } else {
+    // Do the deletion in reverse to preserve indices.
+    for (auto it = delete_indices.rbegin(); it != delete_indices.rend(); ++it) {
+      RemoveEntryAtIndex(*it);
+    }
+    delegate_->SetHistoryOffsetAndLength(last_committed_entry_index_,
+                                         GetEntryCount());
+  }
+  delegate()->NotifyNavigationEntriesDeleted();
+}
+
 void NavigationControllerImpl::ClearAllScreenshots() {
   screenshot_manager_->ClearAllScreenshots();
 }
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h
index 3071ec9..d3be697 100644
--- a/content/browser/frame_host/navigation_controller_impl.h
+++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -90,6 +90,9 @@
                              bool replace_entry) override;
   bool CanPruneAllButLastCommitted() override;
   void PruneAllButLastCommitted() override;
+  void DeleteNavigationEntries(
+      const DeletionPredicate& deletionPredicate) override;
+
   void ClearAllScreenshots() override;
 
   // Whether this is the initial navigation in an unmodified new tab.  In this
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index afe3b404..e4d999a 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/gtest_util.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -229,6 +230,10 @@
     last_navigation_entry_pruned_details_ = details;
   }
 
+  void NavigationEntriesDeleted() override {
+    navigation_entries_deleted_counter_++;
+  }
+
   const GURL& navigated_url() const {
     return navigated_url_;
   }
@@ -260,6 +265,7 @@
   size_t navigation_entry_committed_counter_ = 0;
   size_t navigation_entry_changed_counter_ = 0;
   size_t navigation_list_pruned_counter_ = 0;
+  size_t navigation_entries_deleted_counter_ = 0;
   PrunedDetails last_navigation_entry_pruned_details_;
   ReloadType last_reload_type_;
 };
@@ -4316,6 +4322,57 @@
   EXPECT_EQ(url3, other_controller.GetEntryAtIndex(2)->GetURL());
 }
 
+// Tests DeleteNavigationEntries.
+TEST_F(NavigationControllerTest, DeleteNavigationEntries) {
+  NavigationControllerImpl& controller = controller_impl();
+
+  const GURL url1("http://foo/1");
+  const GURL url2("http://foo/2");
+  const GURL url3("http://foo/3");
+  const GURL url4("http://foo/4");
+  const GURL url5("http://foo/5");
+
+  NavigateAndCommit(url1);
+  NavigateAndCommit(url2);
+  NavigateAndCommit(url3);
+  NavigateAndCommit(url4);
+  NavigateAndCommit(url5);
+
+  // Delete nothing.
+  controller.DeleteNavigationEntries(base::BindRepeating(
+      [](const content::NavigationEntry& entry) { return false; }));
+  EXPECT_EQ(0U, navigation_entries_deleted_counter_);
+  ASSERT_EQ(5, controller.GetEntryCount());
+  ASSERT_EQ(4, controller.GetCurrentEntryIndex());
+
+  // Delete url2 and url4.
+  contents()->ExpectSetHistoryOffsetAndLength(2, 3);
+  controller.DeleteNavigationEntries(
+      base::BindLambdaForTesting([&](const content::NavigationEntry& entry) {
+        return entry.GetURL() == url2 || entry.GetURL() == url4;
+      }));
+  EXPECT_EQ(1U, navigation_entries_deleted_counter_);
+  ASSERT_EQ(3, controller.GetEntryCount());
+  ASSERT_EQ(2, controller.GetCurrentEntryIndex());
+  EXPECT_EQ(url1, controller.GetEntryAtIndex(0)->GetURL());
+  EXPECT_EQ(url3, controller.GetEntryAtIndex(1)->GetURL());
+  EXPECT_EQ(url5, controller.GetEntryAtIndex(2)->GetURL());
+  EXPECT_TRUE(controller.CanGoBack());
+
+  // Delete url1 and url3.
+  contents()->ExpectSetHistoryOffsetAndLength(0, 1);
+  controller.DeleteNavigationEntries(base::BindRepeating(
+      [](const content::NavigationEntry& entry) { return true; }));
+  EXPECT_EQ(2U, navigation_entries_deleted_counter_);
+  ASSERT_EQ(1, controller.GetEntryCount());
+  ASSERT_EQ(0, controller.GetCurrentEntryIndex());
+  EXPECT_EQ(url5, controller.GetEntryAtIndex(0)->GetURL());
+  EXPECT_FALSE(controller.CanGoBack());
+
+  // No pruned notifications should be send.
+  EXPECT_EQ(0U, navigation_list_pruned_counter_);
+}
+
 // Tests CopyStateFromAndPrune with 3 urls in source, 1 in dest,
 // when the max entry count is 3.  We should prune one entry.
 TEST_F(NavigationControllerTest, CopyStateFromAndPruneMaxEntries) {
diff --git a/content/browser/frame_host/navigation_handle_impl_browsertest.cc b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
index cbf107e..9849432 100644
--- a/content/browser/frame_host/navigation_handle_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
@@ -144,6 +144,13 @@
 // next navigation. New instances are needed to wait for further navigations.
 class TestNavigationThrottleInstaller : public WebContentsObserver {
  public:
+  enum Method {
+    WILL_START_REQUEST,
+    WILL_REDIRECT_REQUEST,
+    WILL_FAIL_REQUEST,
+    WILL_PROCESS_RESPONSE,
+  };
+
   TestNavigationThrottleInstaller(
       WebContents* web_contents,
       NavigationThrottle::ThrottleCheckResult will_start_result,
@@ -160,6 +167,38 @@
         weak_factory_(this) {}
   ~TestNavigationThrottleInstaller() override {}
 
+  // Installs a TestNavigationThrottle whose |method| method will return
+  // |result|. All other methods will return NavigationThrottle::PROCEED.
+  static std::unique_ptr<TestNavigationThrottleInstaller> CreateForMethod(
+      WebContents* web_contents,
+      Method method,
+      NavigationThrottle::ThrottleCheckResult result) {
+    NavigationThrottle::ThrottleCheckResult will_start_result =
+        NavigationThrottle::PROCEED;
+    auto will_redirect_result = will_start_result;
+    auto will_fail_result = will_start_result;
+    auto will_process_result = will_start_result;
+
+    switch (method) {
+      case WILL_START_REQUEST:
+        will_start_result = result;
+        break;
+      case WILL_REDIRECT_REQUEST:
+        will_redirect_result = result;
+        break;
+      case WILL_FAIL_REQUEST:
+        will_fail_result = result;
+        break;
+      case WILL_PROCESS_RESPONSE:
+        will_process_result = result;
+        break;
+    }
+
+    return std::make_unique<TestNavigationThrottleInstaller>(
+        web_contents, will_start_result, will_redirect_result, will_fail_result,
+        will_process_result);
+  }
+
   TestNavigationThrottle* navigation_throttle() { return navigation_throttle_; }
 
   void WaitForThrottleWillStart() {
@@ -393,6 +432,37 @@
     SetupCrossSiteRedirector(embedded_test_server());
     ASSERT_TRUE(embedded_test_server()->Start());
   }
+
+  // Installs a NavigationThrottle whose |method| method will return a
+  // ThrottleCheckResult with |action|, net::ERR_BLOCKED_BY_CLIENT and
+  // a custom error page. Navigates to |url|, checks that the navigation
+  // committed and that the custom error page is being shown.
+  void InstallThrottleAndTestNavigationCommittedWithErrorPage(
+      const GURL& url,
+      NavigationThrottle::ThrottleAction action,
+      TestNavigationThrottleInstaller::Method method) {
+    auto installer = TestNavigationThrottleInstaller::CreateForMethod(
+        shell()->web_contents(), method,
+        NavigationThrottle::ThrottleCheckResult(
+            action, net::ERR_BLOCKED_BY_CLIENT,
+            base::StringPrintf("<html><body>%s</body><html>",
+                               kBodyTextContent)));
+
+    NavigationHandleObserver observer(shell()->web_contents(), url);
+
+    EXPECT_FALSE(NavigateToURL(shell(), url));
+
+    EXPECT_TRUE(observer.has_committed());
+    EXPECT_TRUE(observer.is_error());
+
+    std::string result;
+    const std::string javascript =
+        "domAutomationController.send(document.body.textContent)";
+    content::RenderFrameHost* rfh = shell()->web_contents()->GetMainFrame();
+    ASSERT_TRUE(
+        content::ExecuteScriptAndExtractString(rfh, javascript, &result));
+    EXPECT_EQ(kBodyTextContent, result);
+  }
 };
 
 class NavigationHandleImplDownloadBrowserTest
@@ -1987,35 +2057,136 @@
   EXPECT_TRUE(observer.was_redirected());
 }
 
-IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest,
-                       ThrottleFailureWithErrorPageContent) {
+// Set of tests that check the various NavigationThrottle events can be used
+// with custom error pages.
+class NavigationHandleImplThrottleResultWithErrorPageBrowserTest
+    : public NavigationHandleImplBrowserTest,
+      public ::testing::WithParamInterface<NavigationThrottle::ThrottleAction> {
+};
+
+IN_PROC_BROWSER_TEST_P(
+    NavigationHandleImplThrottleResultWithErrorPageBrowserTest,
+    WillStartRequest) {
+  NavigationThrottle::ThrottleAction action = GetParam();
+
+  if (action == NavigationThrottle::CANCEL_AND_IGNORE) {
+    // There is no support for CANCEL_AND_IGNORE and a custom error page.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
+    // This can only be returned from sub frame navigations.
+    return;
+  }
+
+  if (action == NavigationThrottle::PROCEED ||
+      action == NavigationThrottle::DEFER) {
+    // Neither is relevant for what we want to test i.e. error pages.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_RESPONSE) {
+    // BLOCK_RESPONSE can't be used with WillStartRequest.
+    return;
+  }
+
+  GURL url(embedded_test_server()->GetURL("/title1.html"));
+  InstallThrottleAndTestNavigationCommittedWithErrorPage(
+      url, action, TestNavigationThrottleInstaller::WILL_START_REQUEST);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    NavigationHandleImplThrottleResultWithErrorPageBrowserTest,
+    WillRedirectRequest) {
+  NavigationThrottle::ThrottleAction action = GetParam();
+
+  if (action == NavigationThrottle::CANCEL_AND_IGNORE) {
+    // There is no support for CANCEL_AND_IGNORE and a custom error page.
+    return;
+  }
+
+  if (action == NavigationThrottle::PROCEED ||
+      action == NavigationThrottle::DEFER) {
+    // Neither is relevant for what we want to test i.e. error pages.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
+    // This can only be returned from sub frame navigations.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_RESPONSE) {
+    // BLOCK_RESPONSE can't be used with WillRedirectRequest.
+    return;
+  }
+
+  GURL url(embedded_test_server()->GetURL("/cross-site/foo.com/title1.html"));
+  InstallThrottleAndTestNavigationCommittedWithErrorPage(
+      url, action, TestNavigationThrottleInstaller::WILL_REDIRECT_REQUEST);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    NavigationHandleImplThrottleResultWithErrorPageBrowserTest,
+    WillFailRequest) {
+  NavigationThrottle::ThrottleAction action = GetParam();
+
+  if (action == NavigationThrottle::PROCEED ||
+      action == NavigationThrottle::DEFER) {
+    // Neither is relevant for what we want to test i.e. error pages.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_REQUEST ||
+      action == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
+    // BLOCK_REQUEST, BLOCK_REQUEST_AND_COLLAPSE, can't be used with
+    // WillFailRequest.
+    return;
+  }
+
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
   ASSERT_TRUE(https_server.Start());
-  GURL url(https_server.GetURL("/title1.html"));
 
-  NavigationThrottle::ThrottleCheckResult cancel_result = {
-      NavigationThrottle::CANCEL, net::ERR_CERT_COMMON_NAME_INVALID,
-      base::StringPrintf("<html><body>%s</body><html>", kBodyTextContent)};
-
-  NavigationHandleObserver observer(shell()->web_contents(), url);
-  TestNavigationThrottleInstaller installer(
-      shell()->web_contents(), NavigationThrottle::PROCEED,
-      NavigationThrottle::PROCEED, cancel_result, NavigationThrottle::PROCEED);
-
-  EXPECT_FALSE(NavigateToURL(shell(), url));
-
-  EXPECT_TRUE(observer.has_committed());
-  EXPECT_TRUE(observer.is_error());
-
-  std::string result;
-  const std::string javascript =
-      "domAutomationController.send(document.body.textContent)";
-  content::RenderFrameHost* rfh = shell()->web_contents()->GetMainFrame();
-  ASSERT_TRUE(content::ExecuteScriptAndExtractString(rfh, javascript, &result));
-  EXPECT_EQ(kBodyTextContent, result);
+  const GURL url = https_server.GetURL("/title1.html");
+  InstallThrottleAndTestNavigationCommittedWithErrorPage(
+      url, action, TestNavigationThrottleInstaller::WILL_FAIL_REQUEST);
 }
 
+IN_PROC_BROWSER_TEST_P(
+    NavigationHandleImplThrottleResultWithErrorPageBrowserTest,
+    WillProcessResponse) {
+  NavigationThrottle::ThrottleAction action = GetParam();
+
+  if (action == NavigationThrottle::CANCEL_AND_IGNORE) {
+    // There is no support for CANCEL_AND_IGNORE and a custom error page.
+    return;
+  }
+
+  if (action == NavigationThrottle::PROCEED ||
+      action == NavigationThrottle::DEFER) {
+    // Neither is relevant for what we want to test i.e. error pages.
+    return;
+  }
+
+  if (action == NavigationThrottle::BLOCK_REQUEST ||
+      action == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
+    // BLOCK_REQUEST and BLOCK_REQUEST_AND_COLLAPSE can't be used with
+    // WillProcessResponse.
+    return;
+  }
+
+  GURL url(embedded_test_server()->GetURL("/title1.html"));
+  InstallThrottleAndTestNavigationCommittedWithErrorPage(
+      url, action, TestNavigationThrottleInstaller::WILL_PROCESS_RESPONSE);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    /* no prefix */,
+    NavigationHandleImplThrottleResultWithErrorPageBrowserTest,
+    testing::Range(NavigationThrottle::ThrottleAction::FIRST,
+                   NavigationThrottle::ThrottleAction::LAST));
+
 // The set of tests...
 // * NavigationHandleImplDownloadBrowserTest.AllowedResourceDownloaded
 // * NavigationHandleImplDownloadBrowserTest.AllowedResourceNotDownloaded
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 0f10ebe8..cc193622 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -502,7 +502,7 @@
     // it by OnRequestFailed().
     CreateNavigationHandle();
     OnRequestFailedInternal(false, net::ERR_BLOCKED_BY_CLIENT, base::nullopt,
-                            false);
+                            false, base::nullopt);
 
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
@@ -516,7 +516,8 @@
     // Create a navigation handle so that the correct error code can be set on
     // it by OnRequestFailed().
     CreateNavigationHandle();
-    OnRequestFailedInternal(false, net::ERR_ABORTED, base::nullopt, false);
+    OnRequestFailedInternal(false, net::ERR_ABORTED, base::nullopt, false,
+                            base::nullopt);
 
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
@@ -966,15 +967,18 @@
   RenderFrameDevToolsAgentHost::OnNavigationRequestFailed(*this, net_error);
 
   NavigationRequest::OnRequestFailedInternal(has_stale_copy_in_cache, net_error,
-                                             ssl_info, false);
+                                             ssl_info, false, base::nullopt);
 }
 
 void NavigationRequest::OnRequestFailedInternal(
     bool has_stale_copy_in_cache,
     int net_error,
     const base::Optional<net::SSLInfo>& ssl_info,
-    bool skip_throttles) {
+    bool skip_throttles,
+    const base::Optional<std::string>& error_page_content) {
   DCHECK(state_ == STARTED || state_ == RESPONSE_STARTED);
+  DCHECK(!(net_error == net::ERR_ABORTED && error_page_content.has_value()));
+
   // TODO(https://crbug.com/757633): Check that ssl_info.has_value() if
   // net_error is a certificate error.
   TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationRequest", this,
@@ -1032,7 +1036,7 @@
   if (skip_throttles) {
     // The NavigationHandle shouldn't be notified about renderer-debug URLs.
     // They will be handled by the renderer process.
-    CommitErrorPage(render_frame_host, base::nullopt);
+    CommitErrorPage(render_frame_host, error_page_content);
   } else {
     // Check if the navigation should be allowed to proceed.
     navigation_handle_->WillFailRequest(
@@ -1070,8 +1074,7 @@
              result.net_error_code() == net::ERR_BLOCKED_BY_ADMINISTRATOR);
     }
     // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE.
-    else if ((result.action() == NavigationThrottle::CANCEL ||
-              result.action() == NavigationThrottle::CANCEL_AND_IGNORE)) {
+    else if (result.action() == NavigationThrottle::CANCEL_AND_IGNORE) {
       DCHECK_EQ(result.net_error_code(), net::ERR_ABORTED);
     }
 #endif
@@ -1084,7 +1087,8 @@
         BrowserThread::UI, FROM_HERE,
         base::BindOnce(&NavigationRequest::OnRequestFailedInternal,
                        weak_factory_.GetWeakPtr(), false,
-                       result.net_error_code(), base::nullopt, true));
+                       result.net_error_code(), base::nullopt, true,
+                       result.error_page_content()));
 
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
@@ -1196,9 +1200,10 @@
   if (result.action() == NavigationThrottle::CANCEL_AND_IGNORE ||
       result.action() == NavigationThrottle::CANCEL) {
     // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE if needed.
-    DCHECK_EQ(net::ERR_ABORTED, result.net_error_code());
-    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt,
-                            true);
+    DCHECK(result.action() == NavigationThrottle::CANCEL ||
+           result.net_error_code() == net::ERR_ABORTED);
+    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, true,
+                            result.error_page_content());
 
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
@@ -1209,8 +1214,8 @@
       result.action() == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
     DCHECK(result.net_error_code() == net::ERR_BLOCKED_BY_CLIENT ||
            result.net_error_code() == net::ERR_BLOCKED_BY_ADMINISTRATOR);
-    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt,
-                            true);
+    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, true,
+                            result.error_page_content());
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
     return;
@@ -1300,12 +1305,17 @@
   if (result.action() == NavigationThrottle::CANCEL_AND_IGNORE ||
       result.action() == NavigationThrottle::CANCEL ||
       !response_should_be_rendered_) {
-    int net_error = result.net_error_code();
-    if (!response_should_be_rendered_)
-      net_error = net::ERR_ABORTED;
     // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE.
-    DCHECK_EQ(net::ERR_ABORTED, net_error);
-    OnRequestFailedInternal(false, net_error, base::nullopt, true);
+    if (!response_should_be_rendered_) {
+      OnRequestFailedInternal(false, net::ERR_ABORTED, base::nullopt, true,
+                              base::nullopt);
+      return;
+    }
+
+    DCHECK(result.action() == NavigationThrottle::CANCEL ||
+           result.net_error_code() == net::ERR_ABORTED);
+    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, true,
+                            result.error_page_content());
 
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
@@ -1314,8 +1324,8 @@
 
   if (result.action() == NavigationThrottle::BLOCK_RESPONSE) {
     DCHECK_EQ(net::ERR_BLOCKED_BY_RESPONSE, result.net_error_code());
-    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt,
-                            true);
+    OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, true,
+                            result.error_page_content());
     // DO NOT ADD CODE after this. The previous call to OnRequestFailed has
     // destroyed the NavigationRequest.
     return;
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h
index 19dd784..3f6d454 100644
--- a/content/browser/frame_host/navigation_request.h
+++ b/content/browser/frame_host/navigation_request.h
@@ -244,11 +244,14 @@
   void OnRequestStarted(base::TimeTicks timestamp) override;
 
   // A version of OnRequestFailed() that allows skipping throttles, to be used
-  // when a request failed due to a throttle result itself.
-  void OnRequestFailedInternal(bool has_stale_copy_in_cache,
-                               int net_error,
-                               const base::Optional<net::SSLInfo>& ssl_info,
-                               bool skip_throttles);
+  // when a request failed due to a throttle result itself. |error_page_content|
+  // is only used when |skip_throttles| is true.
+  void OnRequestFailedInternal(
+      bool has_stale_copy_in_cache,
+      int net_error,
+      const base::Optional<net::SSLInfo>& ssl_info,
+      bool skip_throttles,
+      const base::Optional<std::string>& error_page_content);
 
   // Called when the NavigationThrottles have been checked by the
   // NavigationHandle.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 4fe80314..5956e65 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -369,8 +369,8 @@
 
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
-      base::Bind(&ResourceSchedulerFilter::OnDidCommitMainframeNavigation,
-                 render_process_id, params.render_view_routing_id));
+      base::BindOnce(&ResourceSchedulerFilter::OnDidCommitMainframeNavigation,
+                     render_process_id, params.render_view_routing_id));
 }
 
 bool IsOutOfProcessNetworkService() {
diff --git a/content/browser/histogram_controller.cc b/content/browser/histogram_controller.cc
index da0031cb..100d8863 100644
--- a/content/browser/histogram_controller.cc
+++ b/content/browser/histogram_controller.cc
@@ -115,9 +115,9 @@
     content::mojom::ChildHistogramFetcherPtr child_histogram_fetcher) {
   // Broken pipe means remove this from the map. The map size is a proxy for
   // the number of known processes
-  child_histogram_fetcher.set_connection_error_handler(
-      base::Bind(&HistogramController::RemoveChildHistogramFetcherInterface<T>,
-                 base::Unretained(this), base::Unretained(host)));
+  child_histogram_fetcher.set_connection_error_handler(base::BindOnce(
+      &HistogramController::RemoveChildHistogramFetcherInterface<T>,
+      base::Unretained(this), base::Unretained(host)));
   GetChildHistogramFetcherMap<T>()[host] = std::move(child_histogram_fetcher);
 }
 
diff --git a/content/browser/indexed_db/indexed_db_internals_ui.cc b/content/browser/indexed_db/indexed_db_internals_ui.cc
index db14ed0..1ad9af6 100644
--- a/content/browser/indexed_db/indexed_db_internals_ui.cc
+++ b/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -363,8 +363,8 @@
   base::PostTaskWithTraits(FROM_HERE,
                            {base::MayBlock(), base::TaskPriority::BACKGROUND,
                             base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
-                           base::Bind(base::IgnoreResult(&base::DeleteFile),
-                                      std::move(temp_dir_), true));
+                           base::BindOnce(base::IgnoreResult(&base::DeleteFile),
+                                          std::move(temp_dir_), true));
 }
 
 void IndexedDBInternalsUI::OnDownloadStarted(
diff --git a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
index abab87d..61a4ef4e4 100644
--- a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
@@ -82,8 +82,8 @@
     usage_ = -1;
     client->GetOriginUsage(
         origin, type,
-        base::Bind(&IndexedDBQuotaClientTest::OnGetOriginUsageComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&IndexedDBQuotaClientTest::OnGetOriginUsageComplete,
+                       weak_factory_.GetWeakPtr()));
     RunAllTasksUntilIdle();
     EXPECT_GT(usage_, -1);
     return usage_;
@@ -93,9 +93,8 @@
                                                  StorageType type) {
     origins_.clear();
     client->GetOriginsForType(
-        type,
-        base::Bind(&IndexedDBQuotaClientTest::OnGetOriginsComplete,
-                   weak_factory_.GetWeakPtr()));
+        type, base::BindOnce(&IndexedDBQuotaClientTest::OnGetOriginsComplete,
+                             weak_factory_.GetWeakPtr()));
     RunAllTasksUntilIdle();
     return origins_;
   }
@@ -105,10 +104,9 @@
                                                  const std::string& host) {
     origins_.clear();
     client->GetOriginsForHost(
-        type,
-        host,
-        base::Bind(&IndexedDBQuotaClientTest::OnGetOriginsComplete,
-                   weak_factory_.GetWeakPtr()));
+        type, host,
+        base::BindOnce(&IndexedDBQuotaClientTest::OnGetOriginsComplete,
+                       weak_factory_.GetWeakPtr()));
     RunAllTasksUntilIdle();
     return origins_;
   }
@@ -119,8 +117,8 @@
     delete_status_ = blink::mojom::QuotaStatusCode::kUnknown;
     client->DeleteOriginData(
         origin, type,
-        base::Bind(&IndexedDBQuotaClientTest::OnDeleteOriginComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&IndexedDBQuotaClientTest::OnDeleteOriginComplete,
+                       weak_factory_.GetWeakPtr()));
     RunAllTasksUntilIdle();
     return delete_status_;
   }
diff --git a/content/browser/loader/redirect_to_file_resource_handler.cc b/content/browser/loader/redirect_to_file_resource_handler.cc
index 9a47991..a6ce3d0b 100644
--- a/content/browser/loader/redirect_to_file_resource_handler.cc
+++ b/content/browser/loader/redirect_to_file_resource_handler.cc
@@ -77,7 +77,7 @@
     DCHECK(handler_);
     int result = file_stream_->Write(
         buf, buf_len,
-        base::Bind(&Writer::DidWriteToFile, base::Unretained(this)));
+        base::BindOnce(&Writer::DidWriteToFile, base::Unretained(this)));
     if (result == net::ERR_IO_PENDING)
       is_writing_ = true;
     return result;
@@ -106,8 +106,8 @@
 
   void CloseAndDelete() {
     DCHECK(!is_writing_);
-    int result = file_stream_->Close(base::Bind(&Writer::DidClose,
-                                                base::Unretained(this)));
+    int result = file_stream_->Close(
+        base::BindOnce(&Writer::DidClose, base::Unretained(this)));
     if (result != net::ERR_IO_PENDING)
       DidClose(result);
   }
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index e7b9e8f..729100d 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -1264,17 +1264,14 @@
   } else {
     // Initialize the service worker handler for the request. We don't use
     // ServiceWorker for synchronous loads to avoid renderer deadlocks.
-    const ServiceWorkerMode service_worker_mode =
-        is_sync_load
-            ? ServiceWorkerMode::NONE
-            : static_cast<ServiceWorkerMode>(request_data.service_worker_mode);
+    const bool skip_service_worker =
+        is_sync_load || request_data.skip_service_worker;
     ServiceWorkerRequestHandler::InitializeHandler(
         new_request.get(), requester_info->service_worker_context(),
         blob_context, child_id, request_data.service_worker_provider_id,
-        service_worker_mode != ServiceWorkerMode::ALL,
-        request_data.fetch_request_mode, request_data.fetch_credentials_mode,
-        request_data.fetch_redirect_mode, request_data.fetch_integrity,
-        request_data.keepalive,
+        skip_service_worker, request_data.fetch_request_mode,
+        request_data.fetch_credentials_mode, request_data.fetch_redirect_mode,
+        request_data.fetch_integrity, request_data.keepalive,
         static_cast<ResourceType>(request_data.resource_type),
         static_cast<RequestContextType>(
             request_data.fetch_request_context_type),
@@ -1484,8 +1481,7 @@
   // reference to the temp file that outlives the url loaded that it was
   // loaded with to keep the file (and permissions) alive.
   reference->AddFinalReleaseCallback(
-      base::Bind(&RemoveDownloadFileFromChildSecurityPolicy,
-                 child_id));
+      base::BindOnce(&RemoveDownloadFileFromChildSecurityPolicy, child_id));
 }
 
 void ResourceDispatcherHostImpl::UnregisterDownloadedTempFile(
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 5596260..854858d 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -613,9 +613,8 @@
   explicit ShareableFileReleaseWaiter(const base::FilePath& path) {
     scoped_refptr<ShareableFileReference> file =
         ShareableFileReference::Get(path);
-    file->AddFinalReleaseCallback(
-        base::Bind(&ShareableFileReleaseWaiter::Released,
-                   base::Unretained(this)));
+    file->AddFinalReleaseCallback(base::BindOnce(
+        &ShareableFileReleaseWaiter::Released, base::Unretained(this)));
   }
 
   void Wait() {
diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc
index eb0225b..38a7b1773 100644
--- a/content/browser/loader/resource_loader_unittest.cc
+++ b/content/browser/loader/resource_loader_unittest.cc
@@ -337,16 +337,17 @@
  private:
   int InitInternal(const net::NetLogWithSource& net_log) override {
     SetSize(size_);
-    stream_.Init(base::Bind(&NonChunkedUploadDataStream::OnInitCompleted,
-                            base::Unretained(this)),
+    stream_.Init(base::BindOnce(&NonChunkedUploadDataStream::OnInitCompleted,
+                                base::Unretained(this)),
                  net_log);
     return net::OK;
   }
 
   int ReadInternal(net::IOBuffer* buf, int buf_len) override {
-    return stream_.Read(buf, buf_len,
-                        base::Bind(&NonChunkedUploadDataStream::OnReadCompleted,
-                                   base::Unretained(this)));
+    return stream_.Read(
+        buf, buf_len,
+        base::BindOnce(&NonChunkedUploadDataStream::OnReadCompleted,
+                       base::Unretained(this)));
   }
 
   void ResetInternal() override { stream_.Reset(); }
diff --git a/content/browser/media/cdm_storage_impl.cc b/content/browser/media/cdm_storage_impl.cc
index 5b4be43..dd19f2bd 100644
--- a/content/browser/media/cdm_storage_impl.cc
+++ b/content/browser/media/cdm_storage_impl.cc
@@ -145,8 +145,8 @@
   file_system_context_->OpenPluginPrivateFileSystem(
       origin().GetURL(), storage::kFileSystemTypePluginPrivate, fsid,
       cdm_file_system_id_, storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
-      base::Bind(&CdmStorageImpl::OnFileSystemOpened,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&CdmStorageImpl::OnFileSystemOpened,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void CdmStorageImpl::OnFileSystemOpened(base::File::Error error) {
diff --git a/content/browser/media/cdm_storage_impl_unittest.cc b/content/browser/media/cdm_storage_impl_unittest.cc
index b7e0dbc..07ebf471 100644
--- a/content/browser/media/cdm_storage_impl_unittest.cc
+++ b/content/browser/media/cdm_storage_impl_unittest.cc
@@ -78,8 +78,8 @@
     DVLOG(3) << __func__;
 
     cdm_storage_->Open(
-        name, base::Bind(&CdmStorageTest::OpenDone, base::Unretained(this),
-                         status, file, cdm_file));
+        name, base::BindOnce(&CdmStorageTest::OpenDone, base::Unretained(this),
+                             status, file, cdm_file));
     RunAndWaitForResult();
     return file->IsValid();
   }
@@ -88,9 +88,9 @@
              const std::vector<uint8_t>& data,
              base::File* file) {
     bool status;
-    cdm_file->OpenFileForWriting(base::Bind(&CdmStorageTest::FileOpenedForWrite,
-                                            base::Unretained(this), cdm_file,
-                                            data, file, &status));
+    cdm_file->OpenFileForWriting(
+        base::BindOnce(&CdmStorageTest::FileOpenedForWrite,
+                       base::Unretained(this), cdm_file, data, file, &status));
     RunAndWaitForResult();
     return status;
   }
@@ -123,8 +123,8 @@
     int bytes_written = file_to_write.Write(
         0, reinterpret_cast<const char*>(data.data()), bytes_to_write);
     *status = bytes_to_write == bytes_written;
-    cdm_file->CommitWrite(
-        base::Bind(&CdmStorageTest::WriteDone, base::Unretained(this), file));
+    cdm_file->CommitWrite(base::BindOnce(&CdmStorageTest::WriteDone,
+                                         base::Unretained(this), file));
   }
 
   void WriteDone(base::File* file, base::File new_file_for_reading) {
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc
index 6071f44..5686dc1 100644
--- a/content/browser/network_service_client.cc
+++ b/content/browser/network_service_client.cc
@@ -66,9 +66,9 @@
         browser_context->GetResourceContext();
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&SSLClientAuthDelegate::CreateSSLClientAuthHandler,
-                   base::Unretained(this), resource_context,
-                   web_contents_getter));
+        base::BindOnce(&SSLClientAuthDelegate::CreateSSLClientAuthHandler,
+                       base::Unretained(this), resource_context,
+                       web_contents_getter));
   }
   ~SSLClientAuthDelegate() override {}
 
diff --git a/content/browser/notifications/notification_event_dispatcher_impl.cc b/content/browser/notifications/notification_event_dispatcher_impl.cc
index dc750b2..3b593eb 100644
--- a/content/browser/notifications/notification_event_dispatcher_impl.cc
+++ b/content/browser/notifications/notification_event_dispatcher_impl.cc
@@ -177,9 +177,9 @@
 
   service_worker_context->FindReadyRegistrationForId(
       notification_database_data.service_worker_registration_id, origin,
-      base::Bind(&DispatchNotificationEventOnRegistration,
-                 notification_database_data, notification_context,
-                 notification_action_callback, dispatch_error_callback));
+      base::BindOnce(&DispatchNotificationEventOnRegistration,
+                     notification_database_data, notification_context,
+                     notification_action_callback, dispatch_error_callback));
 }
 
 // Reads the data associated with the |notification_id| belonging to |origin|
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc
index 2184fe7a6..83db315 100644
--- a/content/browser/notifications/notification_message_filter.cc
+++ b/content/browser/notifications/notification_message_filter.cc
@@ -171,9 +171,10 @@
   // Get the service worker scope.
   service_worker_context_->FindReadyRegistrationForId(
       service_worker_registration_id, origin,
-      base::Bind(&NotificationMessageFilter::DidFindServiceWorkerRegistration,
-                 weak_factory_io_.GetWeakPtr(), request_id, origin,
-                 notification_data, notification_resources, notification_id));
+      base::BindOnce(
+          &NotificationMessageFilter::DidFindServiceWorkerRegistration,
+          weak_factory_io_.GetWeakPtr(), request_id, origin, notification_data,
+          notification_resources, notification_id));
 }
 
 void NotificationMessageFilter::DidFindServiceWorkerRegistration(
diff --git a/content/browser/oop_browsertest.cc b/content/browser/oop_browsertest.cc
new file mode 100644
index 0000000..aadcb33
--- /dev/null
+++ b/content/browser/oop_browsertest.cc
@@ -0,0 +1,95 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/command_line.h"
+#include "content/public/browser/readback_types.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "content/shell/browser/shell.h"
+#include "gpu/config/gpu_switches.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/ui_base_switches.h"
+#include "ui/compositor/compositor_switches.h"
+#include "ui/gl/gl_switches.h"
+
+namespace content {
+namespace {
+
+class OOPBrowserTest : public ContentBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    ContentBrowserTest::SetUpCommandLine(command_line);
+    command_line->AppendSwitch(switches::kEnableGpuRasterization);
+    command_line->AppendSwitch(switches::kEnablePixelOutputInTests);
+    command_line->AppendSwitch(switches::kEnableOOPRasterization);
+
+    bool use_gpu_in_tests = true;
+#if defined(USE_AURA)
+    use_gpu_in_tests = !command_line->HasSwitch(switches::kMus);
+#endif
+    if (use_gpu_in_tests)
+      command_line->AppendSwitch(switches::kUseGpuInTests);
+  }
+
+  void GetSnapshot(const base::Closure& done_cb,
+                   const SkBitmap& bitmap,
+                   ReadbackResponse response) {
+    ASSERT_EQ(response, ReadbackResponse::READBACK_SUCCESS);
+    snapshot_ = bitmap;
+    done_cb.Run();
+  }
+
+  void VerifyVisualStateUpdated(const base::Closure& done_cb,
+                                bool visual_state_updated) {
+    ASSERT_TRUE(visual_state_updated);
+    done_cb.Run();
+  }
+
+  SkBitmap snapshot_;
+};
+
+// This test calls into system GL which is not instrumented with MSAN.
+#if !defined(MEMORY_SANITIZER)
+IN_PROC_BROWSER_TEST_F(OOPBrowserTest, Basic) {
+  // Create a div to ensure we don't use solid color quads.
+  GURL url = GURL(
+      "data:text/html,"
+      "<style>div{background-color:blue; width:100; height:100;}</style>"
+      "<body bgcolor=blue><div></div></body>");
+  NavigateToURLBlockUntilNavigationsComplete(shell(), url, 1);
+  shell()->web_contents()->GetMainFrame()->InsertVisualStateCallback(base::Bind(
+      &OOPBrowserTest::VerifyVisualStateUpdated, base::Unretained(this),
+      base::MessageLoop::QuitWhenIdleClosure()));
+  content::RunMessageLoop();
+
+  auto* rwh = shell()->web_contents()->GetRenderViewHost()->GetWidget();
+  ASSERT_TRUE(rwh->GetView()->IsSurfaceAvailableForCopy());
+  rwh->GetView()->CopyFromSurface(
+      gfx::Rect(), gfx::Size(),
+      base::Bind(&OOPBrowserTest::GetSnapshot, base::Unretained(this),
+                 base::MessageLoop::QuitWhenIdleClosure()),
+      kN32_SkColorType);
+  content::RunMessageLoop();
+
+  EXPECT_GT(snapshot_.width(), 0);
+  EXPECT_GT(snapshot_.height(), 0);
+  for (int i = 0; i < snapshot_.width(); ++i) {
+    for (int j = 0; j < snapshot_.height(); ++j) {
+      ASSERT_EQ(snapshot_.getColor(i, j), SK_ColorBLUE);
+    }
+  }
+};
+#endif
+
+}  // namespace
+}  // namespace content
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc
index 1e64f15..51207ef 100644
--- a/content/browser/payments/payment_app_content_unittest_base.cc
+++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -162,7 +162,7 @@
   EXPECT_FALSE(registration->waiting_version());
   EXPECT_FALSE(registration->installing_version());
   registration->active_version()->StopWorker(
-      base::Bind(&StopWorkerCallback, &called));
+      base::BindOnce(&StopWorkerCallback, &called));
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(called);
 
diff --git a/content/browser/payments/payment_app_database.cc b/content/browser/payments/payment_app_database.cc
index 1069edc3..ba8cf8e 100644
--- a/content/browser/payments/payment_app_database.cc
+++ b/content/browser/payments/payment_app_database.cc
@@ -136,9 +136,10 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix(
-      kPaymentAppPrefix, base::Bind(&PaymentAppDatabase::DidReadAllPaymentApps,
-                                    weak_ptr_factory_.GetWeakPtr(),
-                                    base::Passed(std::move(callback))));
+      kPaymentAppPrefix,
+      base::BindOnce(&PaymentAppDatabase::DidReadAllPaymentApps,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DeletePaymentInstrument(
@@ -149,7 +150,7 @@
 
   service_worker_context_->FindReadyRegistrationForPattern(
       scope,
-      base::Bind(
+      base::BindOnce(
           &PaymentAppDatabase::DidFindRegistrationToDeletePaymentInstrument,
           weak_ptr_factory_.GetWeakPtr(), instrument_key,
           base::Passed(std::move(callback))));
@@ -163,7 +164,7 @@
 
   service_worker_context_->FindReadyRegistrationForPattern(
       scope,
-      base::Bind(
+      base::BindOnce(
           &PaymentAppDatabase::DidFindRegistrationToReadPaymentInstrument,
           weak_ptr_factory_.GetWeakPtr(), instrument_key,
           base::Passed(std::move(callback))));
@@ -175,9 +176,9 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   service_worker_context_->FindReadyRegistrationForPattern(
-      scope, base::Bind(&PaymentAppDatabase::DidFindRegistrationToGetKeys,
-                        weak_ptr_factory_.GetWeakPtr(),
-                        base::Passed(std::move(callback))));
+      scope, base::BindOnce(&PaymentAppDatabase::DidFindRegistrationToGetKeys,
+                            weak_ptr_factory_.GetWeakPtr(),
+                            base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::HasPaymentInstrument(
@@ -187,8 +188,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   service_worker_context_->FindReadyRegistrationForPattern(
-      scope,
-      base::Bind(&PaymentAppDatabase::DidFindRegistrationToHasPaymentInstrument,
+      scope, base::BindOnce(
+                 &PaymentAppDatabase::DidFindRegistrationToHasPaymentInstrument,
                  weak_ptr_factory_.GetWeakPtr(), instrument_key,
                  base::Passed(std::move(callback))));
 }
@@ -211,7 +212,7 @@
   } else {
     service_worker_context_->FindReadyRegistrationForPattern(
         scope,
-        base::Bind(
+        base::BindOnce(
             &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
             weak_ptr_factory_.GetWeakPtr(), instrument_key,
             base::Passed(std::move(instrument)), std::string(),
@@ -234,7 +235,7 @@
 
   service_worker_context_->FindReadyRegistrationForPattern(
       scope,
-      base::Bind(
+      base::BindOnce(
           &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
           weak_ptr_factory_.GetWeakPtr(), instrument_key,
           base::Passed(std::move(instrument)), icon,
@@ -263,8 +264,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   service_worker_context_->FindReadyRegistrationForPattern(
-      scope,
-      base::Bind(&PaymentAppDatabase::DidFindRegistrationToWritePaymentAppInfo,
+      scope, base::BindOnce(
+                 &PaymentAppDatabase::DidFindRegistrationToWritePaymentAppInfo,
                  weak_ptr_factory_.GetWeakPtr(), user_hint,
                  base::Passed(std::move(callback)),
                  base::Passed(std::move(app_info))));
@@ -334,7 +335,7 @@
 
   service_worker_context_->FindReadyRegistrationForPattern(
       scope,
-      base::Bind(
+      base::BindOnce(
           &PaymentAppDatabase::DidFindRegistrationToClearPaymentInstruments,
           weak_ptr_factory_.GetWeakPtr(), scope,
           base::Passed(std::move(callback))));
@@ -346,7 +347,7 @@
 
   service_worker_context_->FindReadyRegistrationForPattern(
       scope,
-      base::Bind(
+      base::BindOnce(
           &PaymentAppDatabase::DidFindRegistrationToSetPaymentAppUserHint,
           weak_ptr_factory_.GetWeakPtr(), user_hint));
 }
@@ -361,9 +362,9 @@
 
   service_worker_context_->GetRegistrationUserDataByKeyPrefix(
       registration->id(), CreatePaymentAppKey(registration->pattern().spec()),
-      base::Bind(&PaymentAppDatabase::DidGetPaymentAppInfoToSetUserHint,
-                 weak_ptr_factory_.GetWeakPtr(), user_hint, registration->id(),
-                 registration->pattern()));
+      base::BindOnce(&PaymentAppDatabase::DidGetPaymentAppInfoToSetUserHint,
+                     weak_ptr_factory_.GetWeakPtr(), user_hint,
+                     registration->id(), registration->pattern()));
 }
 
 void PaymentAppDatabase::DidGetPaymentAppInfoToSetUserHint(
@@ -527,9 +528,10 @@
 
   service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix(
       kPaymentInstrumentPrefix,
-      base::Bind(&PaymentAppDatabase::DidReadAllPaymentInstruments,
-                 weak_ptr_factory_.GetWeakPtr(), base::Passed(std::move(apps)),
-                 base::Passed(std::move(callback))));
+      base::BindOnce(&PaymentAppDatabase::DidReadAllPaymentInstruments,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Passed(std::move(apps)),
+                     base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DidReadAllPaymentInstruments(
@@ -582,9 +584,9 @@
 
   service_worker_context_->GetRegistrationUserData(
       registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
-      base::Bind(&PaymentAppDatabase::DidFindPaymentInstrument,
-                 weak_ptr_factory_.GetWeakPtr(), registration->id(),
-                 instrument_key, base::Passed(std::move(callback))));
+      base::BindOnce(&PaymentAppDatabase::DidFindPaymentInstrument,
+                     weak_ptr_factory_.GetWeakPtr(), registration->id(),
+                     instrument_key, base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DidFindPaymentInstrument(
@@ -631,9 +633,9 @@
 
   service_worker_context_->GetRegistrationUserData(
       registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
-      base::Bind(&PaymentAppDatabase::DidReadPaymentInstrument,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 base::Passed(std::move(callback))));
+      base::BindOnce(&PaymentAppDatabase::DidReadPaymentInstrument,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DidReadPaymentInstrument(
@@ -670,9 +672,9 @@
 
   service_worker_context_->GetRegistrationUserDataByKeyPrefix(
       registration->id(), {kPaymentInstrumentKeyInfoPrefix},
-      base::Bind(&PaymentAppDatabase::DidGetKeysOfPaymentInstruments,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 base::Passed(std::move(callback))));
+      base::BindOnce(&PaymentAppDatabase::DidGetKeysOfPaymentInstruments,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DidGetKeysOfPaymentInstruments(
@@ -707,9 +709,9 @@
 
   service_worker_context_->GetRegistrationUserData(
       registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
-      base::Bind(&PaymentAppDatabase::DidHasPaymentInstrument,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 base::Passed(std::move(callback))));
+      base::BindOnce(&PaymentAppDatabase::DidHasPaymentInstrument,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Passed(std::move(callback))));
 }
 
 void PaymentAppDatabase::DidHasPaymentInstrument(
diff --git a/content/browser/payments/payment_app_installer.cc b/content/browser/payments/payment_app_installer.cc
index 4d3429f..d01fb93 100644
--- a/content/browser/payments/payment_app_installer.cc
+++ b/content/browser/payments/payment_app_installer.cc
@@ -67,7 +67,8 @@
     }
     service_worker_context->RegisterServiceWorker(
         sw_url, option,
-        base::Bind(&SelfDeleteInstaller::OnRegisterServiceWorkerResult, this));
+        base::BindOnce(&SelfDeleteInstaller::OnRegisterServiceWorkerResult,
+                       this));
   }
 
   void onServiceWorkerRegistration(
@@ -148,7 +149,7 @@
     payment_app_context->payment_app_database()
         ->SetPaymentAppInfoForRegisteredServiceWorker(
             registration_id, instrument_key, name, enabled_methods,
-            base::Bind(&SelfDeleteInstaller::OnSetPaymentAppInfo, this));
+            base::BindOnce(&SelfDeleteInstaller::OnSetPaymentAppInfo, this));
   }
 
   void OnSetPaymentAppInfo(payments::mojom::PaymentHandlerStatus status) {
diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc
index 396fbfc..747297f 100644
--- a/content/browser/push_messaging/push_messaging_manager.cc
+++ b/content/browser/push_messaging/push_messaging_manager.cc
@@ -345,8 +345,8 @@
   service_worker_context_->GetRegistrationUserData(
       registration_id,
       {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey},
-      base::Bind(&PushMessagingManager::DidCheckForExistingRegistration,
-                 weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data)));
+      base::BindOnce(&PushMessagingManager::DidCheckForExistingRegistration,
+                     weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data)));
 }
 
 void PushMessagingManager::DidCheckForExistingRegistration(
@@ -399,8 +399,9 @@
     int64_t registration_id = data.service_worker_registration_id;
     service_worker_context_->GetRegistrationUserData(
         registration_id, {kPushSenderIdServiceWorkerKey},
-        base::Bind(&PushMessagingManager::DidGetSenderIdFromStorage,
-                   weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data)));
+        base::BindOnce(&PushMessagingManager::DidGetSenderIdFromStorage,
+                       weak_factory_io_to_io_.GetWeakPtr(),
+                       base::Passed(&data)));
   }
 }
 
@@ -692,10 +693,10 @@
 
   service_worker_context_->GetRegistrationUserData(
       service_worker_registration_id, {kPushSenderIdServiceWorkerKey},
-      base::Bind(&PushMessagingManager::UnsubscribeHavingGottenSenderId,
-                 weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&callback),
-                 service_worker_registration_id,
-                 service_worker_registration->pattern().GetOrigin()));
+      base::BindOnce(&PushMessagingManager::UnsubscribeHavingGottenSenderId,
+                     weak_factory_io_to_io_.GetWeakPtr(),
+                     base::Passed(&callback), service_worker_registration_id,
+                     service_worker_registration->pattern().GetOrigin()));
 }
 
 void PushMessagingManager::UnsubscribeHavingGottenSenderId(
@@ -802,9 +803,9 @@
   service_worker_context_->GetRegistrationUserData(
       service_worker_registration_id,
       {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey},
-      base::Bind(&PushMessagingManager::DidGetSubscription,
-                 weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&callback),
-                 service_worker_registration_id));
+      base::BindOnce(&PushMessagingManager::DidGetSubscription,
+                     weak_factory_io_to_io_.GetWeakPtr(),
+                     base::Passed(&callback), service_worker_registration_id));
 }
 
 void PushMessagingManager::DidGetSubscription(
diff --git a/content/browser/renderer_host/media/audio_input_stream_handle.cc b/content/browser/renderer_host/media/audio_input_stream_handle.cc
index 202e20c..5468a9bd 100644
--- a/content/browser/renderer_host/media/audio_input_stream_handle.cc
+++ b/content/browser/renderer_host/media/audio_input_stream_handle.cc
@@ -49,17 +49,15 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-void AudioInputStreamHandle::OnCreated(
-    mojo::ScopedSharedBufferHandle shared_buffer,
-    mojo::ScopedHandle socket_descriptor,
-    bool initially_muted) {
+void AudioInputStreamHandle::OnCreated(media::mojom::AudioDataPipePtr data_pipe,
+                                       bool initially_muted) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(client_);
   DCHECK(deleter_callback_)
       << "|deleter_callback_| was called, but |this| hasn't been destructed!";
-  client_->StreamCreated(
-      std::move(stream_ptr_), std::move(stream_client_request_),
-      std::move(shared_buffer), std::move(socket_descriptor), initially_muted);
+  client_->StreamCreated(std::move(stream_ptr_),
+                         std::move(stream_client_request_),
+                         std::move(data_pipe), initially_muted);
 }
 
 void AudioInputStreamHandle::CallDeleter() {
diff --git a/content/browser/renderer_host/media/audio_input_stream_handle.h b/content/browser/renderer_host/media/audio_input_stream_handle.h
index 4f57adf..83f27e17 100644
--- a/content/browser/renderer_host/media/audio_input_stream_handle.h
+++ b/content/browser/renderer_host/media/audio_input_stream_handle.h
@@ -10,6 +10,7 @@
 #include "base/sequence_checker.h"
 #include "content/common/content_export.h"
 #include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
+#include "media/mojo/interfaces/audio_data_pipe.mojom.h"
 #include "media/mojo/interfaces/audio_input_stream.mojom.h"
 #include "media/mojo/services/mojo_audio_input_stream.h"
 #include "mojo/public/cpp/system/buffer.h"
@@ -33,9 +34,7 @@
   ~AudioInputStreamHandle();
 
  private:
-  void OnCreated(mojo::ScopedSharedBufferHandle shared_buffer,
-                 mojo::ScopedHandle socket_descriptor,
-                 bool initially_muted);
+  void OnCreated(media::mojom::AudioDataPipePtr, bool initially_muted);
 
   void CallDeleter();
 
diff --git a/content/browser/renderer_host/media/audio_input_stream_handle_unittest.cc b/content/browser/renderer_host/media/audio_input_stream_handle_unittest.cc
index 1a95520..2d2cd3c 100644
--- a/content/browser/renderer_host/media/audio_input_stream_handle_unittest.cc
+++ b/content/browser/renderer_host/media/audio_input_stream_handle_unittest.cc
@@ -48,8 +48,7 @@
 
   void StreamCreated(media::mojom::AudioInputStreamPtr input_stream,
                      media::mojom::AudioInputStreamClientRequest client_request,
-                     mojo::ScopedSharedBufferHandle shared_buffer,
-                     mojo::ScopedHandle socket_descriptor,
+                     media::mojom::AudioDataPipePtr data_pipe,
                      bool initially_muted) override {
     input_stream_ = std::move(input_stream);
     client_request_ = std::move(client_request);
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
index 8504a813..49fe8927 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
@@ -295,7 +295,7 @@
     quit_closure_ = run_loop.QuitClosure();
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(
+        base::BindOnce(
             &MediaStreamUIProxyFeaturePolicyTest::GetResultForRequestOnIOThread,
             base::Unretained(this), base::Passed(&request)));
     run_loop.Run();
@@ -337,7 +337,7 @@
     proxy_ = MediaStreamUIProxy::CreateForTests(&delegate_);
     proxy_->RequestAccess(
         std::move(request),
-        base::Bind(
+        base::BindOnce(
             &MediaStreamUIProxyFeaturePolicyTest::FinishedGetResultOnIOThread,
             base::Unretained(this)));
   }
@@ -348,8 +348,8 @@
     proxy_.reset();
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
-        base::Bind(&MediaStreamUIProxyFeaturePolicyTest::FinishedGetResult,
-                   base::Unretained(this), devices, result));
+        base::BindOnce(&MediaStreamUIProxyFeaturePolicyTest::FinishedGetResult,
+                       base::Unretained(this), devices, result));
   }
 
   void FinishedGetResult(const MediaStreamDevices& devices,
diff --git a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc
index f2d2892..8e6d66b9 100644
--- a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc
+++ b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory_unittest.cc
@@ -78,8 +78,7 @@
 
   void StreamCreated(media::mojom::AudioInputStreamPtr input_stream,
                      media::mojom::AudioInputStreamClientRequest client_request,
-                     mojo::ScopedSharedBufferHandle shared_buffer,
-                     mojo::ScopedHandle socket_descriptor,
+                     media::mojom::AudioDataPipePtr data_pipe,
                      bool initially_muted) override {
     Created();
   }
diff --git a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc
index f6940e2..58404d6 100644
--- a/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc
+++ b/content/browser/renderer_host/media/render_frame_audio_output_stream_factory_unittest.cc
@@ -171,8 +171,7 @@
   MockClient() {}
   ~MockClient() override {}
 
-  void StreamCreated(mojo::ScopedSharedBufferHandle handle1,
-                     mojo::ScopedHandle handle2) {
+  void StreamCreated(media::mojom::AudioDataPipePtr data_pipe) {
     was_called_ = true;
   }
 
diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
index 7bffbb0..e354d976 100644
--- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
+++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
@@ -52,8 +52,8 @@
     // is signaled.
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&VideoCaptureGpuJpegDecoder::DestroyDecoderOnIOThread,
-                   base::Unretained(this), &event));
+        base::BindOnce(&VideoCaptureGpuJpegDecoder::DestroyDecoderOnIOThread,
+                       base::Unretained(this), &event));
     event.Wait();
   }
 }
@@ -79,10 +79,10 @@
     return;
   }
 
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&RequestGPUInfoOnIOThread, base::ThreadTaskRunnerHandle::Get(),
-                 weak_ptr_factory_.GetWeakPtr()));
+  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                          base::BindOnce(&RequestGPUInfoOnIOThread,
+                                         base::ThreadTaskRunnerHandle::Get(),
+                                         weak_ptr_factory_.GetWeakPtr()));
 }
 
 VideoCaptureGpuJpegDecoder::STATUS VideoCaptureGpuJpegDecoder::GetStatus()
@@ -191,9 +191,9 @@
 
   // base::Unretained is safe because |decoder_| is deleted on the IO thread.
   BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::Bind(&media::JpegDecodeAccelerator::Decode,
-                                     base::Unretained(decoder_.get()),
-                                     in_buffer, std::move(out_frame)));
+                          base::BindOnce(&media::JpegDecodeAccelerator::Decode,
+                                         base::Unretained(decoder_.get()),
+                                         in_buffer, std::move(out_frame)));
 }
 
 void VideoCaptureGpuJpegDecoder::VideoFrameReady(int32_t bitstream_buffer_id) {
@@ -274,8 +274,8 @@
 
   task_runner->PostTask(
       FROM_HERE,
-      base::Bind(&VideoCaptureGpuJpegDecoder::FinishInitialization, weak_this,
-                 base::Passed(remote_decoder.PassInterface())));
+      base::BindOnce(&VideoCaptureGpuJpegDecoder::FinishInitialization,
+                     weak_this, base::Passed(remote_decoder.PassInterface())));
 }
 
 void VideoCaptureGpuJpegDecoder::FinishInitialization(
@@ -292,11 +292,11 @@
     // base::Unretained is safe because |decoder_| is deleted on the IO thread.
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&media::JpegDecodeAccelerator::InitializeAsync,
-                   base::Unretained(decoder_.get()), this,
-                   media::BindToCurrentLoop(base::Bind(
-                       &VideoCaptureGpuJpegDecoder::OnInitializationDone,
-                       weak_ptr_factory_.GetWeakPtr()))));
+        base::BindOnce(&media::JpegDecodeAccelerator::InitializeAsync,
+                       base::Unretained(decoder_.get()), this,
+                       media::BindToCurrentLoop(base::Bind(
+                           &VideoCaptureGpuJpegDecoder::OnInitializationDone,
+                           weak_ptr_factory_.GetWeakPtr()))));
   } else {
     OnInitializationDone(false);
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index d9d2029f..fa17a3ca 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1248,8 +1248,8 @@
     ack.has_damage = false;
     OnDidNotProduceFrame(ack);
   } else {
-    delegated_frame_host_->SubmitCompositorFrame(local_surface_id,
-                                                 std::move(frame));
+    delegated_frame_host_->SubmitCompositorFrame(
+        local_surface_id, std::move(frame), std::move(hit_test_region_list));
     frame_evictor_->SwappedFrame(!host_->is_hidden());
     AcknowledgeBeginFrame(ack);
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 94d70d2..cf41758 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -1438,7 +1438,7 @@
       frame.metadata.page_scale_factor == frame.metadata.min_page_scale_factor;
 
   browser_compositor_->GetDelegatedFrameHost()->SubmitCompositorFrame(
-      local_surface_id, std::move(frame), nullptr);
+      local_surface_id, std::move(frame), std::move(hit_test_region_list));
 
   UpdateDisplayVSyncParameters();
 }
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index aff224cb..236349e 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1435,7 +1435,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       embedded_test_server()->GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   const base::string16 title1 = base::ASCIIToUTF16("save-data=on");
@@ -1449,7 +1449,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       embedded_test_server()->GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -1479,7 +1479,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       embedded_test_server()->GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   const base::string16 title = base::ASCIIToUTF16("PASS");
@@ -1498,7 +1498,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       embedded_test_server()->GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -1524,7 +1524,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       embedded_test_server()->GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   NavigateToURLBlockUntilNavigationsComplete(
@@ -1536,7 +1536,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       embedded_test_server()->GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -1552,7 +1552,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       embedded_test_server()->GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   const base::string16 title1 = base::ASCIIToUTF16("reload=false");
@@ -1570,7 +1570,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       embedded_test_server()->GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -1622,7 +1622,8 @@
         scope, blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         worker_url, options,
-        base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+        base::BindOnce(&ExpectResultAndRun, true,
+                       base::Bind(&base::DoNothing)));
     observer->Wait();
   }
 
@@ -2331,7 +2332,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       https_server.GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   const base::string16 title = base::ASCIIToUTF16("Title");
@@ -2352,7 +2353,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       https_server.GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -2369,7 +2370,7 @@
       blink::mojom::ServiceWorkerUpdateViaCache::kImports);
   public_context()->RegisterServiceWorker(
       embedded_test_server()->GetURL(kWorkerUrl), options,
-      base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+      base::BindOnce(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
   observer->Wait();
 
   const base::string16 title = base::ASCIIToUTF16("Title");
@@ -2388,7 +2389,7 @@
   base::RunLoop run_loop;
   public_context()->UnregisterServiceWorker(
       embedded_test_server()->GetURL(kPageUrl),
-      base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
   run_loop.Run();
 }
 
@@ -2469,8 +2470,8 @@
                             const base::Closure& continuation) {
     wrapper()->FindReadyRegistrationForDocument(
         document_url,
-        base::Bind(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO2,
-                   base::Unretained(this), status, continuation));
+        base::BindOnce(&ServiceWorkerBlackBoxBrowserTest::FindRegistrationOnIO2,
+                       base::Unretained(this), status, continuation));
   }
 
   void FindRegistrationOnIO2(
@@ -2509,7 +2510,7 @@
     base::RunLoop run_loop;
     public_context()->UnregisterServiceWorker(
         embedded_test_server()->GetURL("/"),
-        base::Bind(&ExpectResultAndRun, false, run_loop.QuitClosure()));
+        base::BindOnce(&ExpectResultAndRun, false, run_loop.QuitClosure()));
     run_loop.Run();
   }
 
@@ -2521,7 +2522,7 @@
         blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         embedded_test_server()->GetURL("/does/not/exist"), options,
-        base::Bind(&ExpectResultAndRun, false, run_loop.QuitClosure()));
+        base::BindOnce(&ExpectResultAndRun, false, run_loop.QuitClosure()));
     run_loop.Run();
   }
   EXPECT_EQ(0, CountRenderProcessHosts());
@@ -2534,7 +2535,7 @@
         blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         embedded_test_server()->GetURL(kWorkerUrl), options,
-        base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+        base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
     run_loop.Run();
   }
   EXPECT_EQ(1, CountRenderProcessHosts());
@@ -2548,7 +2549,7 @@
         blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         embedded_test_server()->GetURL(kWorkerUrl), options,
-        base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+        base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
     run_loop.Run();
   }
 
@@ -2561,7 +2562,7 @@
     base::RunLoop run_loop;
     public_context()->UnregisterServiceWorker(
         embedded_test_server()->GetURL(kScope),
-        base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+        base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
     run_loop.Run();
   }
   EXPECT_GE(1, CountRenderProcessHosts()) << "Unregistering doesn't stop the "
@@ -2824,8 +2825,8 @@
     blob_data_handle_ = std::move(blob_data_handle);
     blob_reader_ = blob_data_handle_->CreateReader();
     const storage::BlobReader::Status status = blob_reader_->CalculateSize(
-        base::Bind(&self::OnBlobReaderCalculateSizeCallback, this, result,
-                   continuation));
+        base::BindOnce(&self::OnBlobReaderCalculateSizeCallback, this, result,
+                       continuation));
 
     ASSERT_NE(storage::BlobReader::Status::NET_ERROR, status);
     if (status == storage::BlobReader::Status::DONE)
@@ -2891,7 +2892,8 @@
         blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         embedded_test_server()->GetURL(kWorkerUrl), options,
-        base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+        base::BindOnce(&ExpectResultAndRun, true,
+                       base::Bind(&base::DoNothing)));
     observer->Wait();
   }
 
@@ -3013,7 +3015,8 @@
         blink::mojom::ServiceWorkerUpdateViaCache::kImports);
     public_context()->RegisterServiceWorker(
         cross_origin_server_.GetURL(script), options,
-        base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
+        base::BindOnce(&ExpectResultAndRun, true,
+                       base::Bind(&base::DoNothing)));
     observer->Wait();
   }
 
diff --git a/content/browser/service_worker/service_worker_cache_writer.cc b/content/browser/service_worker/service_worker_cache_writer.cc
index a45dfed..dceaa611 100644
--- a/content/browser/service_worker/service_worker_cache_writer.cc
+++ b/content/browser/service_worker/service_worker_cache_writer.cc
@@ -435,8 +435,8 @@
   scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
       new AsyncOnlyCompletionCallbackAdaptor(run_callback));
   reader->ReadInfo(
-      buf, base::Bind(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
-                      adaptor));
+      buf, base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
+                          adaptor));
   adaptor->set_async(true);
   return adaptor->result();
 }
@@ -451,8 +451,8 @@
       new AsyncOnlyCompletionCallbackAdaptor(run_callback));
   reader->ReadData(
       buf, buf_len,
-      base::Bind(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
-                 adaptor));
+      base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
+                     adaptor));
   adaptor->set_async(true);
   return adaptor->result();
 }
@@ -466,8 +466,8 @@
   scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
       new AsyncOnlyCompletionCallbackAdaptor(run_callback));
   writer->WriteInfo(
-      buf, base::Bind(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
-                      adaptor));
+      buf, base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
+                          adaptor));
   adaptor->set_async(true);
   return adaptor->result();
 }
@@ -482,8 +482,8 @@
       new AsyncOnlyCompletionCallbackAdaptor(run_callback));
   writer->WriteData(
       buf, buf_len,
-      base::Bind(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
-                 adaptor));
+      base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
+                     adaptor));
   adaptor->set_async(true);
   return adaptor->result();
 }
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index ba2c32b..bee0571 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -737,8 +737,8 @@
     return;
   was_service_worker_registered_ = false;
   storage()->GetAllRegistrationsInfos(
-      base::Bind(&ClearAllServiceWorkersHelper::DidGetAllRegistrations, helper,
-                 AsWeakPtr()));
+      base::BindOnce(&ClearAllServiceWorkersHelper::DidGetAllRegistrations,
+                     helper, AsWeakPtr()));
 }
 
 void ServiceWorkerContextCore::CheckHasServiceWorker(
@@ -746,10 +746,10 @@
     const GURL& other_url,
     ServiceWorkerContext::CheckHasServiceWorkerCallback callback) {
   storage()->FindRegistrationForDocument(
-      url,
-      base::Bind(&ServiceWorkerContextCore::
-                     DidFindRegistrationForCheckHasServiceWorker,
-                 AsWeakPtr(), other_url, base::Passed(std::move(callback))));
+      url, base::BindOnce(&ServiceWorkerContextCore::
+                              DidFindRegistrationForCheckHasServiceWorker,
+                          AsWeakPtr(), other_url,
+                          base::Passed(std::move(callback))));
 }
 
 void ServiceWorkerContextCore::UpdateVersionFailureCount(
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index c20eab6..10f0068 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -238,12 +238,9 @@
   EXPECT_EQ(registration_id, notifications_[0].registration_id);
 
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_OK,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -290,12 +287,9 @@
   EXPECT_EQ(registration_id, notifications_[0].registration_id);
 
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_ERROR_NOT_FOUND,
-                 false /* expect_waiting */,
-                 false /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_NOT_FOUND,
+                     false /* expect_waiting */, false /* expect_active */));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -342,8 +336,8 @@
 
   context()->storage()->FindRegistrationForId(
       registration_id, pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
-                 false /* expect_waiting */, true /* expect_active */));
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -373,12 +367,9 @@
   ASSERT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_ERROR_NOT_FOUND,
-                 false /* expect_waiting */,
-                 false /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_NOT_FOUND,
+                     false /* expect_waiting */, false /* expect_active */));
   base::RunLoop().RunUntilIdle();
 
   ASSERT_EQ(2u, notifications_.size());
@@ -467,34 +458,22 @@
   ASSERT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
-      registration_id1,
-      origin1_p1.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_ERROR_NOT_FOUND,
-                 false /* expect_waiting */,
-                 false /* expect_active */));
+      registration_id1, origin1_p1.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_NOT_FOUND,
+                     false /* expect_waiting */, false /* expect_active */));
   context()->storage()->FindRegistrationForId(
-      registration_id2,
-      origin1_p2.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_ERROR_NOT_FOUND,
-                 false /* expect_waiting */,
-                 false /* expect_active */));
+      registration_id2, origin1_p2.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_NOT_FOUND,
+                     false /* expect_waiting */, false /* expect_active */));
   context()->storage()->FindRegistrationForId(
-      registration_id3,
-      origin2_p1.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_OK,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id3, origin2_p1.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
 
   context()->storage()->FindRegistrationForId(
-      registration_id4,
-      origin3_p1.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_OK,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id4, origin3_p1.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
 
   base::RunLoop().RunUntilIdle();
 
@@ -745,12 +724,9 @@
   EXPECT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_OK,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
   content::RunAllTasksUntilIdle();
 
   // Next handle id should be 1 (the next call should return 2) because
@@ -763,19 +739,16 @@
   // operation should be aborted.
   context()->storage()->FindRegistrationForId(
       registration_id, pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_ABORT,
-                 false /* expect_waiting */, true /* expect_active */));
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_ABORT,
+                     false /* expect_waiting */, true /* expect_active */));
   content::RunAllTasksUntilIdle();
 
   // The context started over and the storage was re-initialized, so the
   // registration should not be found.
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_ERROR_NOT_FOUND,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_NOT_FOUND,
+                     false /* expect_waiting */, true /* expect_active */));
   content::RunAllTasksUntilIdle();
 
   called = false;
@@ -787,12 +760,9 @@
   EXPECT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
-      registration_id,
-      pattern.GetOrigin(),
-      base::Bind(&ExpectRegisteredWorkers,
-                 SERVICE_WORKER_OK,
-                 false /* expect_waiting */,
-                 true /* expect_active */));
+      registration_id, pattern.GetOrigin(),
+      base::BindOnce(&ExpectRegisteredWorkers, SERVICE_WORKER_OK,
+                     false /* expect_waiting */, true /* expect_active */));
   content::RunAllTasksUntilIdle();
 
   // The new context should take over next handle id. ID 2 should have been
diff --git a/content/browser/service_worker/service_worker_context_watcher.cc b/content/browser/service_worker/service_worker_context_watcher.cc
index 21a2d71b..08006a83 100644
--- a/content/browser/service_worker/service_worker_context_watcher.cc
+++ b/content/browser/service_worker/service_worker_context_watcher.cc
@@ -60,7 +60,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (is_stopped_)
     return;
-  context_->GetAllRegistrations(base::Bind(
+  context_->GetAllRegistrations(base::BindOnce(
       &ServiceWorkerContextWatcher::OnStoredRegistrationsOnIOThread, this));
 }
 
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 5efbe67c..af724f0 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -296,8 +296,8 @@
   provider_host_->SetDocumentUrl(stripped_url_);
   provider_host_->SetTopmostFrameUrl(site_for_cookies);
   context_->storage()->FindRegistrationForDocument(
-      stripped_url_, base::Bind(&self::DidLookupRegistrationForMainResource,
-                                weak_factory_.GetWeakPtr()));
+      stripped_url_, base::BindOnce(&self::DidLookupRegistrationForMainResource,
+                                    weak_factory_.GetWeakPtr()));
 }
 
 void ServiceWorkerControlleeRequestHandler::
@@ -460,8 +460,9 @@
     // Update failed. Look up the registration again since the original
     // registration was possibly unregistered in the meantime.
     context_->storage()->FindRegistrationForDocument(
-        stripped_url_, base::Bind(&self::DidLookupRegistrationForMainResource,
-                                  weak_factory_.GetWeakPtr()));
+        stripped_url_,
+        base::BindOnce(&self::DidLookupRegistrationForMainResource,
+                       weak_factory_.GetWeakPtr()));
     return;
   }
   DCHECK_EQ(original_registration->id(), registration_id);
@@ -491,8 +492,9 @@
     // continue with the incumbent version.
     // In case unregister job may have run, look up the registration again.
     context_->storage()->FindRegistrationForDocument(
-        stripped_url_, base::Bind(&self::DidLookupRegistrationForMainResource,
-                                  weak_factory_.GetWeakPtr()));
+        stripped_url_,
+        base::BindOnce(&self::DidLookupRegistrationForMainResource,
+                       weak_factory_.GetWeakPtr()));
     return;
   }
   version->RegisterStatusChangeCallback(
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h
index dd40476..bc29bfc 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.h
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -19,7 +19,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "url/gurl.h"
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index b5b8608..8715cd126 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -25,7 +25,6 @@
 #include "content/public/browser/resource_context.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/test/mock_resource_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/test/test_content_browser_client.h"
@@ -179,9 +178,8 @@
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->storage()->StoreRegistration(
-      registration_.get(),
-      version_.get(),
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      registration_.get(), version_.get(),
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
 
   // Conduct a main resource load.
@@ -209,9 +207,8 @@
   version_->SetStatus(ServiceWorkerVersion::INSTALLED);
   registration_->SetWaitingVersion(version_);
   context()->storage()->StoreRegistration(
-      registration_.get(),
-      version_.get(),
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      registration_.get(), version_.get(),
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
 
   // Conduct a main resource load.
@@ -271,9 +268,8 @@
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->storage()->StoreRegistration(
-      registration_.get(),
-      version_.get(),
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      registration_.get(), version_.get(),
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
   version_ = nullptr;
   registration_ = nullptr;
@@ -307,7 +303,7 @@
   registration_->SetActiveVersion(version_);
   context()->storage()->StoreRegistration(
       registration_.get(), version_.get(),
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
 
   // Conduct a main resource load to set the controller.
@@ -344,7 +340,7 @@
   registration_->SetActiveVersion(version_);
   context()->storage()->StoreRegistration(
       registration_.get(), version_.get(),
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
 
   ServiceWorkerRequestTestResources main_test_resources(
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
index c87fc25..3a80eb5 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
@@ -217,7 +217,7 @@
     ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
     context()->storage()->StoreRegistration(
         registration_.get(), version_.get(),
-        base::Bind(&SaveStatusCallback, &called, &status));
+        base::BindOnce(&SaveStatusCallback, &called, &status));
     base::RunLoop().RunUntilIdle();
     EXPECT_TRUE(called);
     EXPECT_EQ(SERVICE_WORKER_OK, status);
@@ -333,7 +333,7 @@
   bool called = false;
   ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_ABORT;
   version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
-                        base::Bind(&SaveStatusCallback, &called, &status));
+                        base::BindOnce(&SaveStatusCallback, &called, &status));
   base::RunLoop().RunUntilIdle();
 
   EXPECT_TRUE(called);
@@ -388,13 +388,13 @@
   bool called = false;
   ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
   version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
-                        base::Bind(&SaveStatusCallback, &called, &status));
+                        base::BindOnce(&SaveStatusCallback, &called, &status));
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(called);
   EXPECT_EQ(SERVICE_WORKER_OK, status);
   version_->StartRequestWithCustomTimeout(
       ServiceWorkerMetrics::EventType::ACTIVATE,
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback),
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback),
       base::TimeDelta::FromSeconds(10), ServiceWorkerVersion::KILL_ON_TIMEOUT);
 
   // Advance clock by a couple seconds.
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 6c566e8..0f776066 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -693,7 +693,7 @@
   // for the service worker navigation preload request.
   request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
   request.priority = original_request->priority();
-  request.service_worker_mode = static_cast<int>(ServiceWorkerMode::NONE);
+  request.skip_service_worker = true;
   request.do_not_prompt_for_login = true;
   request.render_frame_id = original_info->GetRenderFrameID();
   request.is_main_frame = original_info->IsMainFrame();
@@ -758,8 +758,7 @@
   // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle
   // for the service worker navigation preload request.
   resource_request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
-  resource_request.service_worker_mode =
-      static_cast<int>(ServiceWorkerMode::NONE);
+  resource_request.skip_service_worker = true;
   resource_request.do_not_prompt_for_login = true;
   DCHECK(net::HttpUtil::IsValidHeaderValue(
       version_->navigation_preload_state().header));
diff --git a/content/browser/service_worker/service_worker_handle.cc b/content/browser/service_worker/service_worker_handle.cc
index 7f6190e0..a7229346 100644
--- a/content/browser/service_worker/service_worker_handle.cc
+++ b/content/browser/service_worker/service_worker_handle.cc
@@ -13,7 +13,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/common/browser_side_navigation_policy.h"
-#include "content/public/common/service_worker_modes.h"
 
 namespace content {
 
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender.cc b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
index 5b182b4..39e66c4 100644
--- a/content/browser/service_worker/service_worker_installed_scripts_sender.cc
+++ b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
@@ -97,8 +97,9 @@
 
   void Start() {
     auto info_buf = base::MakeRefCounted<HttpResponseInfoIOBuffer>();
-    reader_->ReadInfo(info_buf.get(), base::Bind(&Sender::OnReadInfoComplete,
-                                                 AsWeakPtr(), info_buf));
+    reader_->ReadInfo(
+        info_buf.get(),
+        base::BindOnce(&Sender::OnReadInfoComplete, AsWeakPtr(), info_buf));
   }
 
  private:
@@ -203,7 +204,7 @@
         base::MakeRefCounted<network::NetToMojoIOBuffer>(
             body_pending_write_.get());
     reader_->ReadData(buffer.get(), num_bytes,
-                      base::Bind(&Sender::OnResponseDataRead, AsWeakPtr()));
+                      base::BindOnce(&Sender::OnResponseDataRead, AsWeakPtr()));
   }
 
   void OnResponseDataRead(int read_bytes) {
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index f20cdda..22d1e1c 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -221,7 +221,7 @@
     const GetRegistrationsCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   context->GetAllRegistrations(
-      base::Bind(DidGetStoredRegistrationsOnIOThread, context, callback));
+      base::BindOnce(DidGetStoredRegistrationsOnIOThread, context, callback));
 }
 
 void DidGetRegistrations(
@@ -499,7 +499,7 @@
   }
 
   base::OnceCallback<void(ServiceWorkerStatusCode)> callback =
-      base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id);
+      base::BindOnce(OperationCompleteCallback, AsWeakPtr(), callback_id);
   StopWorkerWithId(context, version_id, std::move(callback));
 }
 
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index 05f4a87..82e7492 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -925,13 +925,12 @@
       new HttpResponseInfoIOBuffer(info.release());
 
   int rv = -1234;
-  writer->WriteInfo(info_buffer.get(), base::Bind(&OnIOComplete, &rv));
+  writer->WriteInfo(info_buffer.get(), base::BindOnce(&OnIOComplete, &rv));
   RunNestedUntilIdle();
   EXPECT_LT(0, rv);
 
   rv = -1234;
-  writer->WriteData(body, length,
-                    base::Bind(&OnIOComplete, &rv));
+  writer->WriteData(body, length, base::BindOnce(&OnIOComplete, &rv));
   RunNestedUntilIdle();
   EXPECT_EQ(length, rv);
 }
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h
index 71c9fe0..709266f 100644
--- a/content/browser/service_worker/service_worker_metrics.h
+++ b/content/browser/service_worker/service_worker_metrics.h
@@ -17,7 +17,6 @@
 #include "content/common/service_worker/embedded_worker.mojom.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/browser/service_worker_context.h"
-#include "content/public/common/service_worker_modes.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "ui/base/page_transition_types.h"
 
diff --git a/content/browser/service_worker/service_worker_navigation_handle.cc b/content/browser/service_worker/service_worker_navigation_handle.cc
index 19e46863..2bc87a22 100644
--- a/content/browser/service_worker/service_worker_navigation_handle.cc
+++ b/content/browser/service_worker/service_worker_navigation_handle.cc
@@ -8,7 +8,6 @@
 #include "content/browser/service_worker/service_worker_navigation_handle_core.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/common/service_worker_modes.h"
 
 namespace content {
 
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h
index a3d930f4..4187669e 100644
--- a/content/browser/service_worker/service_worker_provider_host.h
+++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -27,7 +27,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job.cc b/content/browser/service_worker/service_worker_read_from_cache_job.cc
index 466c55c..e90ad63 100644
--- a/content/browser/service_worker/service_worker_read_from_cache_job.cc
+++ b/content/browser/service_worker/service_worker_read_from_cache_job.cc
@@ -117,9 +117,10 @@
   DCHECK(!reader_->IsReadPending());
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("ServiceWorker", "ReadRawData", this,
                                     "buf_size", buf_size);
-  reader_->ReadData(buf, buf_size,
-                    base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete,
-                               weak_factory_.GetWeakPtr()));
+  reader_->ReadData(
+      buf, buf_size,
+      base::BindOnce(&ServiceWorkerReadFromCacheJob::OnReadComplete,
+                     weak_factory_.GetWeakPtr()));
   return net::ERR_IO_PENDING;
 }
 
@@ -140,8 +141,8 @@
   http_info_io_buffer_ = new HttpResponseInfoIOBuffer;
   reader_->ReadInfo(
       http_info_io_buffer_.get(),
-      base::Bind(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete,
+                     weak_factory_.GetWeakPtr()));
 }
 
 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const {
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc b/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
index d16d273..493088c 100644
--- a/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
@@ -147,7 +147,7 @@
     ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
     context()->storage()->StoreRegistration(
         registration_.get(), version_.get(),
-        base::Bind(&DidStoreRegistration, &status, run_loop.QuitClosure()));
+        base::BindOnce(&DidStoreRegistration, &status, run_loop.QuitClosure()));
     run_loop.Run();
     return status;
   }
@@ -157,7 +157,7 @@
     ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
     context()->storage()->FindRegistrationForId(
         registration_->id(), registration_->pattern().GetOrigin(),
-        base::Bind(&DidFindRegistration, &status, run_loop.QuitClosure()));
+        base::BindOnce(&DidFindRegistration, &status, run_loop.QuitClosure()));
     run_loop.Run();
     return status;
   }
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index 91f7208..95e2dd8 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -227,18 +227,16 @@
   if (existing_registration->GetNewestVersion()->script_url() == script_url_ &&
       existing_registration->update_via_cache() == update_via_cache_) {
     // "Set registration.[[Uninstalling]] to false."
-    existing_registration->AbortPendingClear(base::Bind(
+    existing_registration->AbortPendingClear(base::BindOnce(
         &ServiceWorkerRegisterJob::ContinueWithRegistrationForSameScriptUrl,
-        weak_factory_.GetWeakPtr(),
-        existing_registration));
+        weak_factory_.GetWeakPtr(), existing_registration));
     return;
   }
 
   if (existing_registration->is_uninstalling()) {
-    existing_registration->AbortPendingClear(base::Bind(
+    existing_registration->AbortPendingClear(base::BindOnce(
         &ServiceWorkerRegisterJob::ContinueWithUninstallingRegistration,
-        weak_factory_.GetWeakPtr(),
-        existing_registration));
+        weak_factory_.GetWeakPtr(), existing_registration));
     return;
   }
 
diff --git a/content/browser/service_worker/service_worker_registration_object_host.cc b/content/browser/service_worker/service_worker_registration_object_host.cc
index 11e8b976..8d18858e 100644
--- a/content/browser/service_worker/service_worker_registration_object_host.cc
+++ b/content/browser/service_worker/service_worker_registration_object_host.cc
@@ -10,7 +10,6 @@
 #include "content/browser/service_worker/service_worker_handle.h"
 #include "content/browser/service_worker/service_worker_provider_host.h"
 #include "content/common/service_worker/service_worker_utils.h"
-#include "content/public/common/service_worker_modes.h"
 #include "net/http/http_util.h"
 #include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
 
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index 80638b3..a62f452 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -40,11 +40,11 @@
 
 int CreateInflightRequest(ServiceWorkerVersion* version) {
   version->StartWorker(ServiceWorkerMetrics::EventType::PUSH,
-                       base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+                       base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
   base::RunLoop().RunUntilIdle();
   return version->StartRequest(
       ServiceWorkerMetrics::EventType::PUSH,
-      base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+      base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
 }
 
 static void SaveStatusCallback(bool* called,
@@ -395,8 +395,9 @@
     version_2->set_fetch_handler_existence(
         ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
     registration_->SetWaitingVersion(version_2);
-    version_2->StartWorker(ServiceWorkerMetrics::EventType::INSTALL,
-                           base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+    version_2->StartWorker(
+        ServiceWorkerMetrics::EventType::INSTALL,
+        base::BindOnce(&ServiceWorkerUtils::NoOpStatusCallback));
     version_2->SetStatus(ServiceWorkerVersion::INSTALLED);
 
     // Set it to activate when ready. The original version should still be
diff --git a/content/browser/service_worker/service_worker_request_handler.cc b/content/browser/service_worker/service_worker_request_handler.cc
index 2003ecb..a0892b3 100644
--- a/content/browser/service_worker/service_worker_request_handler.cc
+++ b/content/browser/service_worker/service_worker_request_handler.cc
@@ -24,7 +24,6 @@
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/origin_util.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/common/url_constants.h"
 #include "ipc/ipc_message.h"
 #include "net/base/url_util.h"
diff --git a/content/browser/service_worker/service_worker_request_handler.h b/content/browser/service_worker/service_worker_request_handler.h
index 6aa331f..ef6d7d2 100644
--- a/content/browser/service_worker/service_worker_request_handler.h
+++ b/content/browser/service_worker/service_worker_request_handler.h
@@ -18,7 +18,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "net/url_request/url_request_job_factory.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
diff --git a/content/browser/service_worker/service_worker_script_url_loader.cc b/content/browser/service_worker/service_worker_script_url_loader.cc
index bcba735f..3ab29b7 100644
--- a/content/browser/service_worker/service_worker_script_url_loader.cc
+++ b/content/browser/service_worker/service_worker_script_url_loader.cc
@@ -314,8 +314,8 @@
     scoped_refptr<HttpResponseInfoIOBuffer> info_buffer) {
   net::Error error = cache_writer_->MaybeWriteHeaders(
       info_buffer.get(),
-      base::Bind(&ServiceWorkerScriptURLLoader::OnWriteHeadersComplete,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&ServiceWorkerScriptURLLoader::OnWriteHeadersComplete,
+                     weak_factory_.GetWeakPtr()));
   if (error == net::ERR_IO_PENDING) {
     // OnWriteHeadersComplete() will be called asynchronously.
     return;
@@ -413,9 +413,10 @@
   // successfully wrote to the data pipe (i.e., |bytes_written|).
   net::Error error = cache_writer_->MaybeWriteData(
       buffer.get(), base::strict_cast<size_t>(bytes_written),
-      base::Bind(&ServiceWorkerScriptURLLoader::OnWriteDataComplete,
-                 weak_factory_.GetWeakPtr(),
-                 base::WrapRefCounted(pending_buffer.get()), bytes_written));
+      base::BindOnce(&ServiceWorkerScriptURLLoader::OnWriteDataComplete,
+                     weak_factory_.GetWeakPtr(),
+                     base::WrapRefCounted(pending_buffer.get()),
+                     bytes_written));
   if (error == net::ERR_IO_PENDING) {
     // OnWriteDataComplete() will be called asynchronously.
     return;
diff --git a/content/browser/service_worker/service_worker_unregister_job.cc b/content/browser/service_worker/service_worker_unregister_job.cc
index f68db8e..76e053b 100644
--- a/content/browser/service_worker/service_worker_unregister_job.cc
+++ b/content/browser/service_worker/service_worker_unregister_job.cc
@@ -35,9 +35,8 @@
 
 void ServiceWorkerUnregisterJob::Start() {
   context_->storage()->FindRegistrationForPattern(
-      pattern_,
-      base::Bind(&ServiceWorkerUnregisterJob::OnRegistrationFound,
-                 weak_factory_.GetWeakPtr()));
+      pattern_, base::BindOnce(&ServiceWorkerUnregisterJob::OnRegistrationFound,
+                               weak_factory_.GetWeakPtr()));
 }
 
 void ServiceWorkerUnregisterJob::Abort() {
diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h
index c4d18bd52..9d25a9c 100644
--- a/content/browser/service_worker/service_worker_url_request_job.h
+++ b/content/browser/service_worker/service_worker_url_request_job.h
@@ -28,7 +28,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "net/http/http_byte_range.h"
 #include "net/url_request/url_request.h"
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index 0d9f381..248c923 100644
--- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -39,7 +39,6 @@
 #include "content/public/common/browser_side_navigation_policy.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/test/mock_resource_context.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc b/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
index 5cfb9b2..a5f668ca 100644
--- a/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
@@ -216,8 +216,9 @@
   void Start() {
     info_buffer_ = new HttpResponseInfoIOBuffer();
     io_buffer_ = new net::IOBuffer(kBlockSize);
-    reader_->ReadInfo(info_buffer_.get(),
-                      base::Bind(&ResponseVerifier::OnReadInfoComplete, this));
+    reader_->ReadInfo(
+        info_buffer_.get(),
+        base::BindOnce(&ResponseVerifier::OnReadInfoComplete, this));
     bytes_read_ = 0;
   }
 
@@ -235,8 +236,9 @@
   }
 
   void ReadSomeData() {
-    reader_->ReadData(io_buffer_.get(), kBlockSize,
-                      base::Bind(&ResponseVerifier::OnReadDataComplete, this));
+    reader_->ReadData(
+        io_buffer_.get(), kBlockSize,
+        base::BindOnce(&ResponseVerifier::OnReadDataComplete, this));
   }
 
   void OnReadDataComplete(int result) {
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index a22a210..d1ad8e549 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -246,9 +246,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   dom_storage_context->GetSessionStorageUsage(
-      base::Bind(&OnSessionStorageUsageInfo, dom_storage_context,
-                 special_storage_policy, origin_matcher,
-                 callback));
+      base::BindOnce(&OnSessionStorageUsageInfo, dom_storage_context,
+                     special_storage_policy, origin_matcher, callback));
 }
 
 base::WeakPtr<storage::BlobStorageContext> BlobStorageContextGetterForStorage(
diff --git a/content/browser/storage_partition_impl_map.cc b/content/browser/storage_partition_impl_map.cc
index f1e60fa..4c2b8867 100644
--- a/content/browser/storage_partition_impl_map.cc
+++ b/content/browser/storage_partition_impl_map.cc
@@ -476,11 +476,9 @@
       it->second->ClearData(
           // All except shader cache.
           ~StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE,
-          StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
-          GURL(),
-          StoragePartition::OriginMatcherFunction(),
-          base::Time(), base::Time::Max(),
-          base::Bind(&base::DoNothing));
+          StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL, GURL(),
+          StoragePartition::OriginMatcherFunction(), base::Time(),
+          base::Time::Max(), base::BindOnce(&base::DoNothing));
       if (!config.in_memory) {
         paths_to_keep.push_back(it->second->GetPath());
       }
diff --git a/content/browser/tracing/background_memory_tracing_observer_unittest.cc b/content/browser/tracing/background_memory_tracing_observer_unittest.cc
index 013da385..68762c7 100644
--- a/content/browser/tracing/background_memory_tracing_observer_unittest.cc
+++ b/content/browser/tracing/background_memory_tracing_observer_unittest.cc
@@ -4,7 +4,7 @@
 
 #include "content/browser/tracing/background_memory_tracing_observer.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/message_loop/message_loop.h"
diff --git a/content/browser/tracing/tracing_controller_impl_data_endpoint.cc b/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
index f452c25..5ce323d 100644
--- a/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
+++ b/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
@@ -68,15 +68,16 @@
   void ReceiveTraceChunk(std::unique_ptr<std::string> chunk) override {
     background_task_runner_->PostTask(
         FROM_HERE,
-        base::Bind(&FileTraceDataEndpoint::ReceiveTraceChunkOnBlockingThread,
-                   this, base::Passed(std::move(chunk))));
+        base::BindOnce(
+            &FileTraceDataEndpoint::ReceiveTraceChunkOnBlockingThread, this,
+            base::Passed(std::move(chunk))));
   }
 
   void ReceiveTraceFinalContents(
       std::unique_ptr<const base::DictionaryValue>) override {
     background_task_runner_->PostTask(
         FROM_HERE,
-        base::Bind(&FileTraceDataEndpoint::CloseOnBlockingThread, this));
+        base::BindOnce(&FileTraceDataEndpoint::CloseOnBlockingThread, this));
   }
 
  private:
diff --git a/content/browser/utility_process_host_impl.cc b/content/browser/utility_process_host_impl.cc
index 76d1915..4f683c2 100644
--- a/content/browser/utility_process_host_impl.cc
+++ b/content/browser/utility_process_host_impl.cc
@@ -315,9 +315,6 @@
       switches::kUseFakeDeviceForMediaStream,
       switches::kUseFileForFakeVideoCapture,
       switches::kUseMockCertVerifierForTesting,
-#if defined(OS_WIN)
-      switches::kForceMediaFoundationVideoCapture,
-#endif  // defined(OS_WIN)
       switches::kUtilityStartupDialog,
       switches::kUseGL,
 #if defined(OS_ANDROID)
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index adcee3b..3db465b 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4573,6 +4573,11 @@
     observer.NavigationListPruned(pruned_details);
 }
 
+void WebContentsImpl::NotifyNavigationEntriesDeleted() {
+  for (auto& observer : observers_)
+    observer.NavigationEntriesDeleted();
+}
+
 void WebContentsImpl::OnAssociatedInterfaceRequest(
     RenderFrameHost* render_frame_host,
     const std::string& interface_name,
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 493edbc1..6bf997b 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -805,6 +805,7 @@
   void NotifyNavigationEntryChanged(
       const EntryChangedDetails& change_details) override;
   void NotifyNavigationListPruned(const PrunedDetails& pruned_details) override;
+  void NotifyNavigationEntriesDeleted() override;
 
   // Invoked before a form repost warning is shown.
   void NotifyBeforeFormRepostWarningShow() override;
diff --git a/content/browser/webrtc/webrtc_image_capture_browsertest.cc b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
index e2ab80a..a034c7e7 100644
--- a/content/browser/webrtc/webrtc_image_capture_browsertest.cc
+++ b/content/browser/webrtc/webrtc_image_capture_browsertest.cc
@@ -140,9 +140,22 @@
                      TargetVideoCaptureImplementation>> {
  public:
   WebRtcImageCaptureSucceedsBrowserTest() {
-    if (std::get<1>(GetParam()).use_video_capture_service) {
-      scoped_feature_list_.InitAndEnableFeature(features::kMojoVideoCapture);
+    std::vector<base::Feature> features_to_enable;
+    std::vector<base::Feature> features_to_disable;
+    if (std::get<1>(GetParam()).use_video_capture_service)
+      features_to_enable.push_back(features::kMojoVideoCapture);
+    else
+      features_to_disable.push_back(features::kMojoVideoCapture);
+#if defined(OS_WIN)
+    if (std::get<2>(GetParam()) ==
+        TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION) {
+      features_to_enable.push_back(media::kMediaFoundationVideoCapture);
+    } else {
+      features_to_disable.push_back(media::kMediaFoundationVideoCapture);
     }
+#endif
+    scoped_feature_list_.InitWithFeatures(features_to_enable,
+                                          features_to_disable);
   }
 
   ~WebRtcImageCaptureSucceedsBrowserTest() override = default;
@@ -156,16 +169,6 @@
       ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kUseFakeDeviceForMediaStream));
     }
-
-#if defined(OS_WIN)
-    if (std::get<2>(GetParam()) ==
-        TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION) {
-      base::CommandLine::ForCurrentProcess()->AppendSwitch(
-          switches::kForceMediaFoundationVideoCapture);
-      ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kForceMediaFoundationVideoCapture));
-    }
-#endif
   }
 
   bool RunImageCaptureTestCase(const std::string& command) override {
diff --git a/content/common/media/renderer_audio_input_stream_factory.mojom b/content/common/media/renderer_audio_input_stream_factory.mojom
index f74174a4..01a060f 100644
--- a/content/common/media/renderer_audio_input_stream_factory.mojom
+++ b/content/common/media/renderer_audio_input_stream_factory.mojom
@@ -4,6 +4,7 @@
 
 module content.mojom;
 
+import "media/mojo/interfaces/audio_data_pipe.mojom";
 import "media/mojo/interfaces/audio_input_stream.mojom";
 import "media/mojo/interfaces/audio_parameters.mojom";
 import "media/mojo/interfaces/media_types.mojom";
@@ -31,6 +32,6 @@
   StreamCreated(
       media.mojom.AudioInputStream stream,
       media.mojom.AudioInputStreamClient& client_request,
-      handle<shared_buffer> shared_buffer, handle socket_descriptor,
+      media.mojom.AudioDataPipe data_pipe,
       bool initially_muted);
 };
diff --git a/content/common/navigation_params.h b/content/common/navigation_params.h
index f23c5d13..b31ba53 100644
--- a/content/common/navigation_params.h
+++ b/content/common/navigation_params.h
@@ -17,12 +17,12 @@
 #include "content/common/content_export.h"
 #include "content/common/content_security_policy/csp_disposition_enum.h"
 #include "content/common/frame_message_enums.h"
+#include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/appcache_info.h"
 #include "content/public/common/page_state.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/request_context_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "net/url_request/redirect_info.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/cpp/resource_response_info.h"
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h
index db8a05e..ebc2ab1 100644
--- a/content/common/resource_messages.h
+++ b/content/common/resource_messages.h
@@ -17,7 +17,6 @@
 #include "content/common/content_param_traits_macros.h"
 #include "content/common/navigation_params.h"
 #include "content/public/common/common_param_traits.h"
-#include "content/public/common/service_worker_modes.h"
 #include "ipc/ipc_message_macros.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_response_info.h"
@@ -34,9 +33,6 @@
 #undef IPC_MESSAGE_EXPORT
 #define IPC_MESSAGE_EXPORT CONTENT_EXPORT
 
-IPC_ENUM_TRAITS_MAX_VALUE(content::ServiceWorkerMode,
-                          content::ServiceWorkerMode::LAST)
-
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebMixedContentContextType,
                           blink::WebMixedContentContextType::kLast)
 
diff --git a/content/common/service_worker/service_worker_fetch_request.typemap b/content/common/service_worker/service_worker_fetch_request.typemap
index 9cdce63..b5bf9009 100644
--- a/content/common/service_worker/service_worker_fetch_request.typemap
+++ b/content/common/service_worker/service_worker_fetch_request.typemap
@@ -7,7 +7,6 @@
 public_headers = [
   "//content/common/service_worker/service_worker_types.h",
   "//content/public/common/request_context_type.h",
-  "//content/public/common/service_worker_modes.h",
   "//storage/common/blob_storage/blob_handle.h",
   "//storage/common/storage_common_export.h",
 ]
diff --git a/content/common/service_worker/service_worker_fetch_request_mojom_traits.cc b/content/common/service_worker/service_worker_fetch_request_mojom_traits.cc
index a17e1deb..28378ab 100644
--- a/content/common/service_worker/service_worker_fetch_request_mojom_traits.cc
+++ b/content/common/service_worker/service_worker_fetch_request_mojom_traits.cc
@@ -207,12 +207,11 @@
     Read(blink::mojom::FetchAPIRequestDataView data,
          content::ServiceWorkerFetchRequest* out) {
   std::unordered_map<std::string, std::string> headers;
-  base::Optional<std::string> blob_uuid;
   if (!data.ReadMode(&out->mode) ||
       !data.ReadRequestContextType(&out->request_context_type) ||
       !data.ReadFrameType(&out->frame_type) || !data.ReadUrl(&out->url) ||
       !data.ReadMethod(&out->method) || !data.ReadHeaders(&headers) ||
-      !data.ReadBlobUuid(&blob_uuid) || !data.ReadReferrer(&out->referrer) ||
+      !data.ReadReferrer(&out->referrer) ||
       !data.ReadCredentialsMode(&out->credentials_mode) ||
       !data.ReadRedirectMode(&out->redirect_mode) ||
       !data.ReadIntegrity(&out->integrity) ||
@@ -220,15 +219,16 @@
     return false;
   }
 
-  out->is_main_resource_load = data.is_main_resource_load();
-  out->headers.insert(headers.begin(), headers.end());
-  if (blob_uuid) {
-    out->blob_uuid = blob_uuid.value();
-    out->blob_size = data.blob_size();
-  }
+  // content::ServiceWorkerFetchRequest doesn't support request body.
+  base::Optional<std::string> blob_uuid;
+  if (data.ReadBlobUuid(&blob_uuid) && blob_uuid && !blob_uuid->empty())
+    return false;
   blink::mojom::BlobPtr blob = data.TakeBlob<blink::mojom::BlobPtr>();
   if (blob)
-    out->blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob));
+    return false;
+
+  out->is_main_resource_load = data.is_main_resource_load();
+  out->headers.insert(headers.begin(), headers.end());
   out->cache_mode = data.cache_mode();
   out->keepalive = data.keepalive();
   out->is_reload = data.is_reload();
diff --git a/content/common/service_worker/service_worker_fetch_request_mojom_traits.h b/content/common/service_worker/service_worker_fetch_request_mojom_traits.h
index 269fd314..449c4ca 100644
--- a/content/common/service_worker/service_worker_fetch_request_mojom_traits.h
+++ b/content/common/service_worker/service_worker_fetch_request_mojom_traits.h
@@ -62,20 +62,21 @@
     return request.headers;
   }
 
+  // content::ServiceWorkerFetchRequest does not support the request body.
   static const std::string& blob_uuid(
       const content::ServiceWorkerFetchRequest& request) {
-    return request.blob_uuid;
+    return base::EmptyString();
   }
 
+  // content::ServiceWorkerFetchRequest does not support the request body.
   static uint64_t blob_size(const content::ServiceWorkerFetchRequest& request) {
-    return request.blob_size;
+    return 0;
   }
 
+  // content::ServiceWorkerFetchRequest does not support the request body.
   static blink::mojom::BlobPtr blob(
       const content::ServiceWorkerFetchRequest& request) {
-    if (!request.blob)
-      return nullptr;
-    return request.blob->Clone();
+    return nullptr;
   }
 
   static const content::Referrer& referrer(
diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h
index 38428874b..a5b84405 100644
--- a/content/common/service_worker/service_worker_messages.h
+++ b/content/common/service_worker/service_worker_messages.h
@@ -47,9 +47,6 @@
   IPC_STRUCT_TRAITS_MEMBER(url)
   IPC_STRUCT_TRAITS_MEMBER(method)
   IPC_STRUCT_TRAITS_MEMBER(headers)
-  IPC_STRUCT_TRAITS_MEMBER(blob_uuid)
-  IPC_STRUCT_TRAITS_MEMBER(blob_size)
-  IPC_STRUCT_TRAITS_MEMBER(blob)
   IPC_STRUCT_TRAITS_MEMBER(referrer)
   IPC_STRUCT_TRAITS_MEMBER(credentials_mode)
   IPC_STRUCT_TRAITS_MEMBER(redirect_mode)
diff --git a/content/common/service_worker/service_worker_types.cc b/content/common/service_worker/service_worker_types.cc
index 31945d7..632db93 100644
--- a/content/common/service_worker/service_worker_types.cc
+++ b/content/common/service_worker/service_worker_types.cc
@@ -4,7 +4,6 @@
 
 #include "content/common/service_worker/service_worker_types.h"
 
-#include "content/public/common/service_worker_modes.h"
 #include "net/base/load_flags.h"
 #include "storage/common/blob_storage/blob_handle.h"
 
@@ -48,7 +47,6 @@
 size_t ServiceWorkerFetchRequest::EstimatedStructSize() {
   size_t size = sizeof(ServiceWorkerFetchRequest);
   size += url.spec().size();
-  size += blob_uuid.size();
   size += client_id.size();
 
   for (const auto& key_and_value : headers) {
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h
index f4ed53e..7495911 100644
--- a/content/common/service_worker/service_worker_types.h
+++ b/content/common/service_worker/service_worker_types.h
@@ -17,7 +17,6 @@
 #include "content/common/content_export.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/request_context_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "third_party/WebKit/common/page/page_visibility_state.mojom.h"
@@ -50,8 +49,9 @@
 extern const char kFetchScriptError[];
 
 // Constants for invalid identifiers.
-static const int64_t kInvalidServiceWorkerResourceId = -1;
 static const int kInvalidEmbeddedWorkerThreadId = -1;
+static const int kInvalidServiceWorkerProviderId = -1;
+static const int64_t kInvalidServiceWorkerResourceId = -1;
 
 // The HTTP cache is bypassed for Service Worker scripts if the last network
 // fetch occurred over 24 hours ago.
@@ -97,9 +97,6 @@
   GURL url;
   std::string method;
   ServiceWorkerHeaderMap headers;
-  std::string blob_uuid;
-  uint64_t blob_size = 0;
-  scoped_refptr<storage::BlobHandle> blob;
   Referrer referrer;
   network::mojom::FetchCredentialsMode credentials_mode =
       network::mojom::FetchCredentialsMode::kOmit;
diff --git a/content/common/service_worker/service_worker_utils.h b/content/common/service_worker/service_worker_utils.h
index e5767ba..86b288d7 100644
--- a/content/common/service_worker/service_worker_utils.h
+++ b/content/common/service_worker/service_worker_utils.h
@@ -12,7 +12,6 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "net/http/http_request_headers.h"
 #include "third_party/WebKit/public/mojom/service_worker/service_worker_error_type.mojom.h"
 #include "url/gurl.h"
diff --git a/content/common/throttling_url_loader.cc b/content/common/throttling_url_loader.cc
index 63970b6..fc8c821 100644
--- a/content/common/throttling_url_loader.cc
+++ b/content/common/throttling_url_loader.cc
@@ -250,7 +250,7 @@
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   network::mojom::URLLoaderClientPtr client;
   client_binding_.Bind(mojo::MakeRequest(&client), std::move(task_runner));
-  client_binding_.set_connection_error_handler(base::Bind(
+  client_binding_.set_connection_error_handler(base::BindOnce(
       &ThrottlingURLLoader::OnClientConnectionError, base::Unretained(this)));
 
   DCHECK(factory);
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn
index ec0a681..5504b50 100644
--- a/content/gpu/BUILD.gn
+++ b/content/gpu/BUILD.gn
@@ -106,6 +106,10 @@
     deps += [ "//sandbox" ]
   }
 
+  if (is_linux || is_mac) {
+    deps += [ "//sandbox" ]
+  }
+
   if (use_x11) {
     deps += [
       "//ui/events/platform/x11",
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 51838a2..1b63c59 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -120,7 +120,6 @@
     "java/src/org/chromium/content/browser/ContentNfcDelegate.java",
     "java/src/org/chromium/content/browser/ContentVideoView.java",
     "java/src/org/chromium/content/browser/ContentVideoViewEmbedder.java",
-    "java/src/org/chromium/content/browser/ContentView.java",
     "java/src/org/chromium/content/browser/ContentViewCoreImpl.java",
     "java/src/org/chromium/content/browser/ContentViewRenderView.java",
     "java/src/org/chromium/content/browser/ContentViewStatics.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
index 1297b98b..d32833a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
@@ -188,6 +188,14 @@
 
     @Override
     @CalledByNative
+    public void navigationEntriesDeleted() {
+        for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
+            mObserversIterator.next().navigationEntriesDeleted();
+        }
+    }
+
+    @Override
+    @CalledByNative
     public void didAttachInterstitialPage() {
         for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
             mObserversIterator.next().didAttachInterstitialPage();
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
index 5f66f1b..37d0ace 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
@@ -135,6 +135,11 @@
     public void navigationEntryCommitted() {}
 
     /**
+     * Called when navigation entries were removed.
+     */
+    public void navigationEntriesDeleted() {}
+
+    /**
      * Called when an interstitial page gets attached to the tab content.
      */
     public void didAttachInterstitialPage() {}
diff --git a/content/public/browser/download_manager.h b/content/public/browser/download_manager.h
index 490bc69..82b861f 100644
--- a/content/public/browser/download_manager.h
+++ b/content/public/browser/download_manager.h
@@ -46,12 +46,15 @@
 
 class GURL;
 
+namespace download {
+struct DownloadCreateInfo;
+}  // namespace download
+
 namespace content {
 
 class BrowserContext;
 class ByteStreamReader;
 class DownloadManagerDelegate;
-struct DownloadCreateInfo;
 
 // Browser's download manager: manages all downloads and destination view.
 class CONTENT_EXPORT DownloadManager : public base::SupportsUserData::Data {
@@ -124,7 +127,7 @@
   // Returns the id assigned to the download.  If the DownloadCreateInfo
   // specifies an id, that id will be used.
   virtual void StartDownload(
-      std::unique_ptr<DownloadCreateInfo> info,
+      std::unique_ptr<download::DownloadCreateInfo> info,
       std::unique_ptr<InputStream> stream,
       const download::DownloadUrlParameters::OnStartedCallback& on_started) = 0;
 
diff --git a/content/public/browser/file_url_loader.h b/content/public/browser/file_url_loader.h
index 665d215d..c8a7ed8 100644
--- a/content/public/browser/file_url_loader.h
+++ b/content/public/browser/file_url_loader.h
@@ -15,8 +15,6 @@
 
 namespace content {
 
-struct ResourceRequest;
-
 class CONTENT_EXPORT FileURLLoaderObserver
     : public mojo::FileDataPipeProducer::Observer {
  public:
diff --git a/content/public/browser/frame_service_base.h b/content/public/browser/frame_service_base.h
index aad6a18..48b45ab 100644
--- a/content/public/browser/frame_service_base.h
+++ b/content/public/browser/frame_service_base.h
@@ -41,7 +41,7 @@
         binding_(this, std::move(request)) {
     // |this| owns |binding_|, so unretained is safe.
     binding_.set_connection_error_handler(
-        base::Bind(&FrameServiceBase::Close, base::Unretained(this)));
+        base::BindOnce(&FrameServiceBase::Close, base::Unretained(this)));
   }
 
  protected:
diff --git a/content/public/browser/navigation_controller.h b/content/public/browser/navigation_controller.h
index a6a619f..3bd12f4 100644
--- a/content/public/browser/navigation_controller.h
+++ b/content/public/browser/navigation_controller.h
@@ -46,6 +46,9 @@
 // exactly one NavigationController.
 class NavigationController {
  public:
+  typedef base::RepeatingCallback<bool(const content::NavigationEntry& entry)>
+      DeletionPredicate;
+
   // Load type used in LoadURLParams.
   //
   // A Java counterpart will be generated for this enum.
@@ -464,6 +467,13 @@
   // crash.
   virtual void PruneAllButLastCommitted() = 0;
 
+  // Removes all navigation entries matching |deletionPredicate| except the last
+  // commited entry.
+  // Callers must ensure |CanPruneAllButLastCommitted| returns true before
+  // calling this, or it will crash.
+  virtual void DeleteNavigationEntries(
+      const DeletionPredicate& deletionPredicate) = 0;
+
   // Clears all screenshots associated with navigation entries in this
   // controller. Useful to reduce memory consumption in low-memory situations.
   virtual void ClearAllScreenshots() = 0;
diff --git a/content/public/browser/navigation_throttle.h b/content/public/browser/navigation_throttle.h
index 54193d0..e1157c4 100644
--- a/content/public/browser/navigation_throttle.h
+++ b/content/public/browser/navigation_throttle.h
@@ -19,10 +19,12 @@
   // Represents what a NavigationThrottle can decide to do to a navigation. Note
   // that this enum is implicitly convertable to ThrottleCheckResult.
   enum ThrottleAction {
+    FIRST = 0,
+
     // The action proceeds. This can either mean the navigation continues (e.g.
     // for WillStartRequest) or that the navigation fails (e.g. for
     // WillFailRequest).
-    PROCEED,
+    PROCEED = FIRST,
 
     // Defers the navigation until the NavigationThrottle calls
     // NavigationHandle::Resume or NavigationHandle::CancelDeferredRequest. If
@@ -54,6 +56,8 @@
     // embedding restrictions like 'X-Frame-Options'). This result will only
     // be returned from WillProcessResponse.
     BLOCK_RESPONSE,
+
+    LAST = BLOCK_RESPONSE,
   };
 
   // ThrottleCheckResult, the return value for NavigationThrottle decision
diff --git a/content/public/browser/push_messaging_service.cc b/content/public/browser/push_messaging_service.cc
index 9f1dfa3..afab622 100644
--- a/content/public/browser/push_messaging_service.cc
+++ b/content/public/browser/push_messaging_service.cc
@@ -45,7 +45,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   service_worker_context_wrapper->GetRegistrationUserData(
       service_worker_registration_id, {key},
-      base::Bind(&CallStringCallbackFromIO, callback));
+      base::BindOnce(&CallStringCallbackFromIO, callback));
 }
 
 void ClearPushSubscriptionIdOnIO(
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index e3cf9a69..ca08f2f34 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -278,9 +278,14 @@
   // This normally happens as a result of a new navigation. It will be
   // followed by a NavigationEntryCommitted() call for the new page that
   // caused the pruning. It could also be a result of removing an item from
-  // the list to fix up after interstitials.
+  // the list to delete history or fix up after interstitials.
   virtual void NavigationListPruned(const PrunedDetails& pruned_details) {}
 
+  // Invoked when NavigationEntries have been deleted because of a history
+  // deletion. Observers should ensure that they remove all traces of the
+  // deleted entries.
+  virtual void NavigationEntriesDeleted() {}
+
   // Invoked when a NavigationEntry has changed.
   //
   // This will NOT be sent on navigation, interested parties should also
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index a766b5f..d5f15b42 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -215,7 +215,6 @@
     "screen_orientation_values.h",
     "send_zygote_child_ping_linux.h",
     "service_manager_connection.h",
-    "service_worker_modes.h",
     "shared_url_loader_factory.cc",
     "shared_url_loader_factory.h",
     "simple_connection_filter.cc",
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 36a2e108..0cbc4d3b 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -403,7 +403,7 @@
 // Use MojoAudioOutputIPC and RenderFrameAudioOutputStreamFactory rather than
 // AudioMessageFilter and AudioRendererHost.
 const base::Feature kUseMojoAudioOutputStreamFactory{
-    "UseMojoAudioOutputStreamFactory", base::FEATURE_DISABLED_BY_DEFAULT};
+    "UseMojoAudioOutputStreamFactory", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Controls whether vibrate requires user gesture.
 const base::Feature kVibrateRequiresUserGesture{
@@ -441,10 +441,6 @@
 const base::Feature kWebRtcEcdsaDefault{"WebRTC-EnableWebRtcEcdsa",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Use GpuMemoryBuffer backed VideoFrames in media streams.
-const base::Feature kWebRtcUseGpuMemoryBufferVideoFrames{
-    "WebRTC-UseGpuMemoryBufferVideoFrames", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enables HW H264 encoding on Android.
 const base::Feature kWebRtcHWH264Encoding{"WebRtcHWH264Encoding",
                                           base::FEATURE_ENABLED_BY_DEFAULT};
@@ -459,6 +455,10 @@
 #endif
 };
 
+// Enables negotiation of experimental multiplex codec in SDP.
+const base::Feature kWebRtcMultiplexCodec{"WebRTC-MultiplexCodec",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Fallback from hardware encoder (if available) to software, for WebRTC
 // screensharing that uses temporal scalability.
 const base::Feature kWebRtcScreenshareSwEncoding{
@@ -470,6 +470,10 @@
 const base::Feature kWebRtcUseEchoCanceller3{"WebRtcUseEchoCanceller3",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Use GpuMemoryBuffer backed VideoFrames in media streams.
+const base::Feature kWebRtcUseGpuMemoryBufferVideoFrames{
+    "WebRTC-UseGpuMemoryBufferVideoFrames", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls whether the WebUSB API is enabled:
 // https://wicg.github.io/webusb
 const base::Feature kWebUsb{"WebUSB", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index bda142c..c5ce405e 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -116,6 +116,7 @@
 CONTENT_EXPORT extern const base::Feature kWebRtcEcdsaDefault;
 CONTENT_EXPORT extern const base::Feature kWebRtcHWH264Encoding;
 CONTENT_EXPORT extern const base::Feature kWebRtcHWVP8Encoding;
+CONTENT_EXPORT extern const base::Feature kWebRtcMultiplexCodec;
 CONTENT_EXPORT extern const base::Feature kWebRtcScreenshareSwEncoding;
 CONTENT_EXPORT extern const base::Feature kWebRtcUseEchoCanceller3;
 CONTENT_EXPORT extern const base::Feature kWebRtcUseGpuMemoryBufferVideoFrames;
diff --git a/content/public/common/network_connection_tracker_unittest.cc b/content/public/common/network_connection_tracker_unittest.cc
index 3ee399c1..554d0d54 100644
--- a/content/public/common/network_connection_tracker_unittest.cc
+++ b/content/public/common/network_connection_tracker_unittest.cc
@@ -38,8 +38,8 @@
     network::mojom::ConnectionType type;
     base::RunLoop run_loop;
     bool sync = tracker_->GetConnectionType(
-        &type,
-        base::Bind(&TestNetworkConnectionObserver::GetConnectionTypeCallback,
+        &type, base::BindOnce(
+                   &TestNetworkConnectionObserver::GetConnectionTypeCallback,
                    &run_loop, &type));
     if (!sync)
       run_loop.Run();
@@ -93,8 +93,8 @@
     DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
     return tracker_->GetConnectionType(
         &connection_type_,
-        base::Bind(&ConnectionTypeGetter::OnGetConnectionType,
-                   base::Unretained(this)));
+        base::BindOnce(&ConnectionTypeGetter::OnGetConnectionType,
+                       base::Unretained(this)));
   }
 
   void WaitForConnectionType(
diff --git a/content/public/common/service_worker_modes.h b/content/public/common/service_worker_modes.h
deleted file mode 100644
index 39a93ce..0000000
--- a/content/public/common/service_worker_modes.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_COMMON_SERVICE_WORKER_MODES_H_
-#define CONTENT_PUBLIC_COMMON_SERVICE_WORKER_MODES_H_
-
-namespace content {
-
-// Indicates no service worker provider.
-static const int kInvalidServiceWorkerProviderId = -1;
-
-// Indicates whether service workers will receive fetch events for this request.
-// TODO(falken): This enum made more sense when there was a foreign fetch mode.
-// Find better names or fold this into a boolean.
-enum class ServiceWorkerMode {
-  // The relevant service worker, if any, will get a fetch event for this
-  // request.
-  ALL,
-  // No service worker will get events for this request.
-  NONE,
-  LAST = NONE
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_COMMON_SERVICE_WORKER_MODES_H_
diff --git a/content/public/common/service_worker_modes.typemap b/content/public/common/service_worker_modes.typemap
deleted file mode 100644
index d77a7bd3..0000000
--- a/content/public/common/service_worker_modes.typemap
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//content/public/common/service_worker_modes.mojom"
-public_headers = [ "//content/public/common/service_worker_modes.h" ]
-type_mappings = [
-  "blink.mojom.FetchCredentialsMode=::content::FetchCredentialsMode",
-  "blink.mojom.FetchRequestMode=::content::FetchRequestMode",
-]
diff --git a/content/public/renderer/associated_resource_fetcher.h b/content/public/renderer/associated_resource_fetcher.h
index 15c9a64..1da7666 100644
--- a/content/public/renderer/associated_resource_fetcher.h
+++ b/content/public/renderer/associated_resource_fetcher.h
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "content/common/content_export.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
-#include "third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/WebKit/public/platform/modules/fetch/fetch_api_request.mojom.h"
 
 class GURL;
 
@@ -42,8 +42,7 @@
   // the request, and the callback will never be run.
   static AssociatedResourceFetcher* Create(const GURL& url);
 
-  virtual void SetServiceWorkerMode(
-      blink::WebURLRequest::ServiceWorkerMode service_worker_mode) = 0;
+  virtual void SetSkipServiceWorker(bool skip_service_worker) = 0;
   virtual void SetCacheMode(blink::mojom::FetchCacheMode mode) = 0;
 
   // Associate the corresponding WebURLLoaderOptions to the loader. Must be
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index b89e00f..b9a7d1b3 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -21,7 +21,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/sys_info.h"
 #include "base/test/test_timeouts.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
@@ -128,13 +127,6 @@
   base::i18n::AllowMultipleInitializeCallsForTesting();
 
   embedded_test_server_ = std::make_unique<net::EmbeddedTestServer>();
-
-  // SequencedWorkerPool is enabled by default in tests (see
-  // base::TestSuite::Initialize). In browser tests, disable it and expect it
-  // to be re-enabled as part of BrowserMainLoop::PreCreateThreads().
-  // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler
-  // redirection experiment concludes https://crbug.com/622400.
-  base::SequencedWorkerPool::DisableForProcessForTesting();
 }
 
 BrowserTestBase::~BrowserTestBase() {
diff --git a/content/public/test/mock_download_manager.cc b/content/public/test/mock_download_manager.cc
index 19a7566..7210f74 100644
--- a/content/public/test/mock_download_manager.cc
+++ b/content/public/test/mock_download_manager.cc
@@ -4,8 +4,8 @@
 
 #include "content/public/test/mock_download_manager.h"
 
+#include "components/download/public/common/download_create_info.h"
 #include "content/browser/byte_stream.h"
-#include "content/browser/download/download_create_info.h"
 
 namespace content {
 
@@ -109,7 +109,7 @@
 MockDownloadManager::~MockDownloadManager() {}
 
 void MockDownloadManager::StartDownload(
-    std::unique_ptr<DownloadCreateInfo> info,
+    std::unique_ptr<download::DownloadCreateInfo> info,
     std::unique_ptr<DownloadManager::InputStream> stream,
     const download::DownloadUrlParameters::OnStartedCallback& callback) {
   MockStartDownload(info.get(), stream.get());
diff --git a/content/public/test/mock_download_manager.h b/content/public/test/mock_download_manager.h
index c4c003e..2006f33 100644
--- a/content/public/test/mock_download_manager.h
+++ b/content/public/test/mock_download_manager.h
@@ -100,13 +100,14 @@
   MOCK_METHOD1(Init, bool(BrowserContext* browser_context));
 
   // Gasket for handling scoped_ptr arguments.
-  void StartDownload(std::unique_ptr<DownloadCreateInfo> info,
+  void StartDownload(std::unique_ptr<download::DownloadCreateInfo> info,
                      std::unique_ptr<DownloadManager::InputStream> stream,
                      const download::DownloadUrlParameters::OnStartedCallback&
                          callback) override;
 
   MOCK_METHOD2(MockStartDownload,
-               void(DownloadCreateInfo*, DownloadManager::InputStream*));
+               void(download::DownloadCreateInfo*,
+                    DownloadManager::InputStream*));
   MOCK_METHOD3(RemoveDownloadsByURLAndTime,
                int(const base::Callback<bool(const GURL&)>& url_filter,
                    base::Time remove_begin,
diff --git a/content/public/test/service_worker_test_helpers.cc b/content/public/test/service_worker_test_helpers.cc
index b7142bc..f675c0f 100644
--- a/content/public/test/service_worker_test_helpers.cc
+++ b/content/public/test/service_worker_test_helpers.cc
@@ -100,9 +100,9 @@
   }
   auto* context_wrapper = static_cast<ServiceWorkerContextWrapper*>(context);
   context_wrapper->FindReadyRegistrationForPattern(
-      pattern,
-      base::Bind(&FoundReadyRegistration, base::RetainedRef(context_wrapper),
-                 base::Passed(&completion_callback_ui)));
+      pattern, base::BindOnce(&FoundReadyRegistration,
+                              base::RetainedRef(context_wrapper),
+                              base::Passed(&completion_callback_ui)));
 }
 
 }  // namespace content
diff --git a/content/public/test/simple_url_loader_test_helper.cc b/content/public/test/simple_url_loader_test_helper.cc
index 5dac16c..b3a804f 100644
--- a/content/public/test/simple_url_loader_test_helper.cc
+++ b/content/public/test/simple_url_loader_test_helper.cc
@@ -20,8 +20,8 @@
   DCHECK(!callback_created_);
   callback_created_ = true;
 
-  return base::Bind(&SimpleURLLoaderTestHelper::OnCompleteCallback,
-                    weak_ptr_factory_.GetWeakPtr());
+  return base::BindOnce(&SimpleURLLoaderTestHelper::OnCompleteCallback,
+                        weak_ptr_factory_.GetWeakPtr());
 }
 
 void SimpleURLLoaderTestHelper::WaitForCallback() {
diff --git a/content/public/test/slow_download_http_response.cc b/content/public/test/slow_download_http_response.cc
index dd207ad..c6c9d4fee 100644
--- a/content/public/test/slow_download_http_response.cc
+++ b/content/public/test/slow_download_http_response.cc
@@ -38,11 +38,11 @@
                           const net::test_server::SendCompleteCallback& done) {
   if (g_should_finish_download) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::Bind(&SendResponseBody, send, done, true),
+        FROM_HERE, base::BindOnce(&SendResponseBody, send, done, true),
         base::TimeDelta::FromMilliseconds(100));
   } else {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::Bind(&SendResponseBodyDone, send, done),
+        FROM_HERE, base::BindOnce(&SendResponseBodyDone, send, done),
         base::TimeDelta::FromMilliseconds(100));
   }
 }
diff --git a/content/public/test/test_download_http_response.cc b/content/public/test/test_download_http_response.cc
index 2665e34..069be2c 100644
--- a/content/public/test/test_download_http_response.cc
+++ b/content/public/test/test_download_http_response.cc
@@ -77,18 +77,19 @@
   params.on_pause_handler.Reset();
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(parameters.on_pause_handler,
-                 base::Bind(&OnResume, base::ThreadTaskRunnerHandle::Get(),
-                            base::Bind(&SendResponses, header, body,
-                                       starting_body_offset, std::move(params),
-                                       completion_callback, send))));
+      base::BindOnce(
+          parameters.on_pause_handler,
+          base::Bind(
+              &OnResume, base::ThreadTaskRunnerHandle::Get(),
+              base::Bind(&SendResponses, header, body, starting_body_offset,
+                         std::move(params), completion_callback, send))));
 }
 
 void OnResponseSentOnServerIOThread(
     const TestDownloadHttpResponse::OnResponseSentCallback& callback,
     std::unique_ptr<TestDownloadHttpResponse::CompletedRequest> request) {
   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(callback, base::Passed(&request)));
+                          base::BindOnce(callback, base::Passed(&request)));
 }
 
 // Send all responses to the client.
@@ -366,9 +367,10 @@
   if (!parameters_.injected_errors.empty() &&
       parameters_.injected_errors.front() < requested_range_end_ &&
       !parameters_.inject_error_cb.is_null()) {
-    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                            base::Bind(parameters_.inject_error_cb,
-                                       requested_range_begin_, body.size()));
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::BindOnce(parameters_.inject_error_cb, requested_range_begin_,
+                       body.size()));
   }
 
   SendResponses(header, body, requested_range_begin_, std::move(parameters_),
diff --git a/content/public/test/url_loader_interceptor.cc b/content/public/test/url_loader_interceptor.cc
index 0def72d7..69453f4 100644
--- a/content/public/test/url_loader_interceptor.cc
+++ b/content/public/test/url_loader_interceptor.cc
@@ -264,9 +264,10 @@
   if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources,
-                   base::Unretained(this), base::Passed(&request), process_id,
-                   base::Passed(&original_factory)));
+        base::BindOnce(
+            &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources,
+            base::Unretained(this), base::Passed(&request), process_id,
+            base::Passed(&original_factory)));
     return;
   }
 
diff --git a/content/renderer/accessibility/aom_content_ax_tree.cc b/content/renderer/accessibility/aom_content_ax_tree.cc
index 9315dd91..be0d0a1 100644
--- a/content/renderer/accessibility/aom_content_ax_tree.cc
+++ b/content/renderer/accessibility/aom_content_ax_tree.cc
@@ -8,6 +8,7 @@
 
 #include "content/common/ax_content_node_data.h"
 #include "content/renderer/accessibility/render_accessibility_impl.h"
+#include "third_party/WebKit/public/web/WebAXEnums.h"
 #include "ui/accessibility/ax_enum_util.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node.h"
@@ -74,6 +75,18 @@
   }
 }
 
+ax::mojom::Restriction GetCorrespondingRestrictionFlag(
+    blink::WebAOMBoolAttribute attr) {
+  switch (attr) {
+    case blink::WebAOMBoolAttribute::AOM_ATTR_DISABLED:
+      return ax::mojom::Restriction::kDisabled;
+    case blink::WebAOMBoolAttribute::AOM_ATTR_READONLY:
+      return ax::mojom::Restriction::kReadOnly;
+    default:
+      return ax::mojom::Restriction::kNone;
+  }
+}
+
 }  // namespace
 
 namespace content {
@@ -107,10 +120,25 @@
   ui::AXNode* node = tree_.GetFromId(ax_id);
   if (!node)
     return false;
+  if (attr == blink::WebAOMBoolAttribute::AOM_ATTR_DISABLED ||
+      attr == blink::WebAOMBoolAttribute::AOM_ATTR_READONLY) {
+    return GetRestrictionAttributeForAXNode(ax_id, attr, out_param);
+  }
   ax::mojom::BoolAttribute ax_attr = GetCorrespondingAXAttribute(attr);
   return node->data().GetBoolAttribute(ax_attr, out_param);
 }
 
+bool AomContentAxTree::GetCheckedStateForAXNode(int32_t ax_id,
+                                                blink::WebString* out_param) {
+  ui::AXNode* node = tree_.GetFromId(ax_id);
+  if (!node)
+    return false;
+  ax::mojom::CheckedState checked_state = static_cast<ax::mojom::CheckedState>(
+      node->data().GetIntAttribute(ax::mojom::IntAttribute::kCheckedState));
+  *out_param = blink::WebString::FromUTF8(ui::ToString(checked_state));
+  return true;
+}
+
 bool AomContentAxTree::GetIntAttributeForAXNode(int32_t ax_id,
                                                 blink::WebAOMIntAttribute attr,
                                                 int32_t* out_param) {
@@ -121,6 +149,23 @@
   return node->data().GetIntAttribute(ax_attr, out_param);
 }
 
+bool AomContentAxTree::GetRestrictionAttributeForAXNode(
+    int32_t ax_id,
+    blink::WebAOMBoolAttribute attr,
+    bool* out_param) {
+  ui::AXNode* node = tree_.GetFromId(ax_id);
+  if (!node)
+    return false;
+
+  // Disabled and readOnly are stored on the node data as an int attribute,
+  // which indicates which type of kRestriction applies.
+  ax::mojom::Restriction restriction = static_cast<ax::mojom::Restriction>(
+      node->data().GetIntAttribute(ax::mojom::IntAttribute::kRestriction));
+  ax::mojom::Restriction ax_attr = GetCorrespondingRestrictionFlag(attr);
+  *out_param = (restriction == ax_attr);
+  return true;
+}
+
 bool AomContentAxTree::GetStringAttributeForAXNode(
     int32_t ax_id,
     blink::WebAOMStringAttribute attr,
diff --git a/content/renderer/accessibility/aom_content_ax_tree.h b/content/renderer/accessibility/aom_content_ax_tree.h
index 3e920127..2d8f7df7 100644
--- a/content/renderer/accessibility/aom_content_ax_tree.h
+++ b/content/renderer/accessibility/aom_content_ax_tree.h
@@ -22,17 +22,19 @@
 
   // blink::WebComputedAXTree implementation.
   bool ComputeAccessibilityTree() override;
+
   bool GetBoolAttributeForAXNode(int32_t ax_id,
                                  blink::WebAOMBoolAttribute,
                                  bool* out_param) override;
   bool GetIntAttributeForAXNode(int32_t ax_id,
                                 blink::WebAOMIntAttribute,
                                 int32_t* out_param) override;
-  bool GetStringAttributeForAXNode(int32_t,
+  bool GetStringAttributeForAXNode(int32_t ax_id,
                                    blink::WebAOMStringAttribute,
                                    blink::WebString* out_param) override;
   bool GetRoleForAXNode(int32_t ax_id, blink::WebString* out_param) override;
-
+  bool GetCheckedStateForAXNode(int32_t ax_id,
+                                blink::WebString* out_param) override;
   bool GetParentIdForAXNode(int32_t ax_id, int32_t* out_param) override;
   bool GetFirstChildIdForAXNode(int32_t ax_id, int32_t* out_param) override;
   bool GetLastChildIdForAXNode(int32_t ax_id, int32_t* out_param) override;
@@ -41,6 +43,9 @@
   bool GetNextSiblingIdForAXNode(int32_t ax_id, int32_t* out_param) override;
 
  private:
+  bool GetRestrictionAttributeForAXNode(int32_t,
+                                        blink::WebAOMBoolAttribute,
+                                        bool* out_param);
   ui::AXTree tree_;
   RenderFrameImpl* render_frame_;
   DISALLOW_COPY_AND_ASSIGN(AomContentAxTree);
diff --git a/content/renderer/fetchers/associated_resource_fetcher_impl.cc b/content/renderer/fetchers/associated_resource_fetcher_impl.cc
index 655c8de..c21fa04 100644
--- a/content/renderer/fetchers/associated_resource_fetcher_impl.cc
+++ b/content/renderer/fetchers/associated_resource_fetcher_impl.cc
@@ -127,12 +127,12 @@
     loader_->Cancel();
 }
 
-void AssociatedResourceFetcherImpl::SetServiceWorkerMode(
-    blink::WebURLRequest::ServiceWorkerMode service_worker_mode) {
+void AssociatedResourceFetcherImpl::SetSkipServiceWorker(
+    bool skip_service_worker) {
   DCHECK(!request_.IsNull());
   DCHECK(!loader_);
 
-  request_.SetServiceWorkerMode(service_worker_mode);
+  request_.SetSkipServiceWorker(skip_service_worker);
 }
 
 void AssociatedResourceFetcherImpl::SetCacheMode(
diff --git a/content/renderer/fetchers/associated_resource_fetcher_impl.h b/content/renderer/fetchers/associated_resource_fetcher_impl.h
index 9d97747..d4af8f33 100644
--- a/content/renderer/fetchers/associated_resource_fetcher_impl.h
+++ b/content/renderer/fetchers/associated_resource_fetcher_impl.h
@@ -28,8 +28,7 @@
 class AssociatedResourceFetcherImpl : public AssociatedResourceFetcher {
  public:
   // AssociatedResourceFetcher implementation:
-  void SetServiceWorkerMode(
-      blink::WebURLRequest::ServiceWorkerMode service_worker_mode) override;
+  void SetSkipServiceWorker(bool skip_service_worker) override;
   void SetCacheMode(blink::mojom::FetchCacheMode mode) override;
   void SetLoaderOptions(
       const blink::WebAssociatedURLLoaderOptions& options) override;
diff --git a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc
index cd1ab3f..a9232a7 100644
--- a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc
+++ b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc
@@ -42,7 +42,7 @@
   // workers. This should ideally not happen or at least not all the time.
   // See https://crbug.com/448427
   if (request_context == WebURLRequest::kRequestContextFavicon)
-    fetcher_->SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+    fetcher_->SetSkipServiceWorker(true);
 
   fetcher_->SetCacheMode(cache_mode);
 
diff --git a/content/renderer/loader/request_extra_data.cc b/content/renderer/loader/request_extra_data.cc
index 6411f01..b9fce63a 100644
--- a/content/renderer/loader/request_extra_data.cc
+++ b/content/renderer/loader/request_extra_data.cc
@@ -5,7 +5,6 @@
 #include "content/renderer/loader/request_extra_data.h"
 
 #include "content/common/service_worker/service_worker_types.h"
-#include "content/public/common/service_worker_modes.h"
 #include "services/network/public/cpp/resource_request.h"
 
 using blink::WebString;
diff --git a/content/renderer/loader/resource_dispatcher_unittest.cc b/content/renderer/loader/resource_dispatcher_unittest.cc
index 63469e85..11c57e31 100644
--- a/content/renderer/loader/resource_dispatcher_unittest.cc
+++ b/content/renderer/loader/resource_dispatcher_unittest.cc
@@ -23,7 +23,6 @@
 #include "content/common/appcache_interfaces.h"
 #include "content/common/weak_wrapper_shared_url_loader_factory.h"
 #include "content/public/common/content_features.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/renderer/fixed_received_data.h"
 #include "content/public/renderer/request_peer.h"
 #include "content/public/renderer/resource_dispatcher_delegate.h"
diff --git a/content/renderer/loader/url_response_body_consumer_unittest.cc b/content/renderer/loader/url_response_body_consumer_unittest.cc
index a9fcde8..02a73d593 100644
--- a/content/renderer/loader/url_response_body_consumer_unittest.cc
+++ b/content/renderer/loader/url_response_body_consumer_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "content/common/weak_wrapper_shared_url_loader_factory.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/renderer/request_peer.h"
 #include "content/renderer/loader/request_extra_data.h"
 #include "content/renderer/loader/resource_dispatcher.h"
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index cc1152c..250b5f2 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -31,7 +31,6 @@
 #include "content/public/common/content_features.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/referrer.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/renderer/fixed_received_data.h"
 #include "content/public/renderer/request_peer.h"
 #include "content/renderer/loader/ftp_directory_listing_response_delegate.h"
@@ -682,8 +681,7 @@
   resource_request->should_reset_appcache = request.ShouldResetAppCache();
   resource_request->is_external_request = request.IsExternalRequest();
   resource_request->cors_preflight_policy = request.GetCORSPreflightPolicy();
-  resource_request->service_worker_mode =
-      static_cast<int>(GetServiceWorkerModeForWebURLRequest(request));
+  resource_request->skip_service_worker = request.GetSkipServiceWorker();
   resource_request->fetch_request_mode = request.GetFetchRequestMode();
   resource_request->fetch_credentials_mode = request.GetFetchCredentialsMode();
   resource_request->fetch_redirect_mode = request.GetFetchRedirectMode();
diff --git a/content/renderer/loader/web_url_request_util.cc b/content/renderer/loader/web_url_request_util.cc
index 9d3306a..f41221c 100644
--- a/content/renderer/loader/web_url_request_util.cc
+++ b/content/renderer/loader/web_url_request_util.cc
@@ -633,16 +633,6 @@
       request.GetRequestContext(), block_mixed_plugin_content);
 }
 
-STATIC_ASSERT_ENUM(ServiceWorkerMode::NONE,
-                   WebURLRequest::ServiceWorkerMode::kNone);
-STATIC_ASSERT_ENUM(ServiceWorkerMode::ALL,
-                   WebURLRequest::ServiceWorkerMode::kAll);
-
-ServiceWorkerMode GetServiceWorkerModeForWebURLRequest(
-    const WebURLRequest& request) {
-  return static_cast<ServiceWorkerMode>(request.GetServiceWorkerMode());
-}
-
 #undef STATIC_ASSERT_ENUM
 
 }  // namespace content
diff --git a/content/renderer/loader/web_url_request_util.h b/content/renderer/loader/web_url_request_util.h
index 1d5cdcfc..ac622e47 100644
--- a/content/renderer/loader/web_url_request_util.h
+++ b/content/renderer/loader/web_url_request_util.h
@@ -10,7 +10,6 @@
 #include "content/common/content_export.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
-#include "content/public/common/service_worker_modes.h"
 #include "net/http/http_request_headers.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
@@ -59,8 +58,6 @@
     const blink::WebURLRequest& request);
 blink::WebMixedContentContextType GetMixedContentContextTypeForWebURLRequest(
     const blink::WebURLRequest& request);
-ServiceWorkerMode GetServiceWorkerModeForWebURLRequest(
-    const blink::WebURLRequest& request);
 
 }  // namespace content
 
diff --git a/content/renderer/media/mojo_audio_input_ipc.cc b/content/renderer/media/mojo_audio_input_ipc.cc
index 0b38172..108fd7c 100644
--- a/content/renderer/media/mojo_audio_input_ipc.cc
+++ b/content/renderer/media/mojo_audio_input_ipc.cc
@@ -68,25 +68,24 @@
 void MojoAudioInputIPC::StreamCreated(
     media::mojom::AudioInputStreamPtr stream,
     media::mojom::AudioInputStreamClientRequest stream_client_request,
-    mojo::ScopedSharedBufferHandle shared_memory,
-    mojo::ScopedHandle socket,
+    media::mojom::AudioDataPipePtr data_pipe,
     bool initially_muted) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(delegate_);
-  DCHECK(socket.is_valid());
-  DCHECK(shared_memory.is_valid());
   DCHECK(!stream_);
   DCHECK(!stream_client_binding_.is_bound());
+
   stream_ = std::move(stream);
   stream_client_binding_.Bind(std::move(stream_client_request));
 
   base::PlatformFile socket_handle;
-  auto result = mojo::UnwrapPlatformFile(std::move(socket), &socket_handle);
+  auto result =
+      mojo::UnwrapPlatformFile(std::move(data_pipe->socket), &socket_handle);
   DCHECK_EQ(result, MOJO_RESULT_OK);
 
   base::SharedMemoryHandle memory_handle;
   mojo::UnwrappedSharedMemoryHandleProtection protection;
-  result = mojo::UnwrapSharedMemoryHandle(std::move(shared_memory),
+  result = mojo::UnwrapSharedMemoryHandle(std::move(data_pipe->shared_memory),
                                           &memory_handle, nullptr, &protection);
   DCHECK_EQ(result, MOJO_RESULT_OK);
   DCHECK_EQ(protection, mojo::UnwrappedSharedMemoryHandleProtection::kReadOnly);
diff --git a/content/renderer/media/mojo_audio_input_ipc.h b/content/renderer/media/mojo_audio_input_ipc.h
index 90853e2..329846b6 100644
--- a/content/renderer/media/mojo_audio_input_ipc.h
+++ b/content/renderer/media/mojo_audio_input_ipc.h
@@ -54,8 +54,7 @@
   void StreamCreated(
       media::mojom::AudioInputStreamPtr stream,
       media::mojom::AudioInputStreamClientRequest stream_client_request,
-      mojo::ScopedSharedBufferHandle shared_memory,
-      mojo::ScopedHandle socket,
+      media::mojom::AudioDataPipePtr data_pipe,
       bool initially_muted) override;
   void OnError() override;
   void OnMutedStateChanged(bool is_muted) override;
diff --git a/content/renderer/media/mojo_audio_input_ipc_unittest.cc b/content/renderer/media/mojo_audio_input_ipc_unittest.cc
index 9191ba52..b0f44bed 100644
--- a/content/renderer/media/mojo_audio_input_ipc_unittest.cc
+++ b/content/renderer/media/mojo_audio_input_ipc_unittest.cc
@@ -88,9 +88,11 @@
         base::CancelableSyncSocket::CreatePair(&socket_, &foreign_socket));
     factory_client_->StreamCreated(
         std::move(stream_ptr), mojo::MakeRequest(&stream_client_),
-        mojo::SharedBufferHandle::Create(kMemoryLength)
-            ->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY),
-        mojo::WrapPlatformFile(foreign_socket.Release()), initially_muted_);
+        {base::in_place,
+         mojo::SharedBufferHandle::Create(kMemoryLength)
+             ->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY),
+         mojo::WrapPlatformFile(foreign_socket.Release())},
+        initially_muted_);
   }
 
   MojoAudioInputIPC::StreamCreatorCB GetCallback() {
diff --git a/content/renderer/media/mojo_audio_output_ipc.cc b/content/renderer/media/mojo_audio_output_ipc.cc
index 1852ab9..ca51854 100644
--- a/content/renderer/media/mojo_audio_output_ipc.cc
+++ b/content/renderer/media/mojo_audio_output_ipc.cc
@@ -193,22 +193,21 @@
 }
 
 void MojoAudioOutputIPC::StreamCreated(
-    mojo::ScopedSharedBufferHandle shared_memory,
-    mojo::ScopedHandle socket) {
+    media::mojom::AudioDataPipePtr data_pipe) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(delegate_);
-  DCHECK(socket.is_valid());
-  DCHECK(shared_memory.is_valid());
 
   base::PlatformFile socket_handle;
-  auto result = mojo::UnwrapPlatformFile(std::move(socket), &socket_handle);
+  auto result =
+      mojo::UnwrapPlatformFile(std::move(data_pipe->socket), &socket_handle);
   DCHECK_EQ(result, MOJO_RESULT_OK);
 
   base::SharedMemoryHandle memory_handle;
   mojo::UnwrappedSharedMemoryHandleProtection protection;
   size_t memory_length = 0;
-  result = mojo::UnwrapSharedMemoryHandle(
-      std::move(shared_memory), &memory_handle, &memory_length, &protection);
+  result = mojo::UnwrapSharedMemoryHandle(std::move(data_pipe->shared_memory),
+                                          &memory_handle, &memory_length,
+                                          &protection);
   DCHECK_EQ(result, MOJO_RESULT_OK);
   DCHECK_EQ(protection,
             mojo::UnwrappedSharedMemoryHandleProtection::kReadWrite);
diff --git a/content/renderer/media/mojo_audio_output_ipc.h b/content/renderer/media/mojo_audio_output_ipc.h
index 836fb39..2f1309e 100644
--- a/content/renderer/media/mojo_audio_output_ipc.h
+++ b/content/renderer/media/mojo_audio_output_ipc.h
@@ -14,6 +14,7 @@
 #include "content/common/content_export.h"
 #include "content/common/media/renderer_audio_output_stream_factory.mojom.h"
 #include "media/audio/audio_output_ipc.h"
+#include "media/mojo/interfaces/audio_data_pipe.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
 namespace content {
@@ -68,8 +69,7 @@
                                    const media::AudioParameters& params,
                                    const std::string& device_id) const;
 
-  void StreamCreated(mojo::ScopedSharedBufferHandle shared_memory,
-                     mojo::ScopedHandle socket);
+  void StreamCreated(media::mojom::AudioDataPipePtr data_pipe);
 
   const FactoryAccessorCB factory_accessor_;
 
diff --git a/content/renderer/media/mojo_audio_output_ipc_unittest.cc b/content/renderer/media/mojo_audio_output_ipc_unittest.cc
index 6e7d20d..70f20ee 100644
--- a/content/renderer/media/mojo_audio_output_ipc_unittest.cc
+++ b/content/renderer/media/mojo_audio_output_ipc_unittest.cc
@@ -72,8 +72,9 @@
     base::CancelableSyncSocket foreign_socket;
     EXPECT_TRUE(
         base::CancelableSyncSocket::CreatePair(&socket_, &foreign_socket));
-    std::move(callback).Run(mojo::SharedBufferHandle::Create(kMemoryLength),
-                            mojo::WrapPlatformFile(foreign_socket.Release()));
+    std::move(callback).Run({base::in_place,
+                             mojo::SharedBufferHandle::Create(kMemoryLength),
+                             mojo::WrapPlatformFile(foreign_socket.Release())});
   }
 
   media::mojom::AudioOutputStreamClient* client() {
diff --git a/content/renderer/media/stream/media_stream_video_capturer_source_unittest.cc b/content/renderer/media/stream/media_stream_video_capturer_source_unittest.cc
index e189f67..e50fa27 100644
--- a/content/renderer/media/stream/media_stream_video_capturer_source_unittest.cc
+++ b/content/renderer/media/stream/media_stream_video_capturer_source_unittest.cc
@@ -53,7 +53,7 @@
   }
   void SetRunning(bool is_running) {
     blink::scheduler::GetSingleThreadTaskRunnerForTesting()->PostTask(
-        FROM_HERE, base::Bind(running_cb_, is_running));
+        FROM_HERE, base::BindOnce(running_cb_, is_running));
   }
   const media::VideoCaptureParams& capture_params() const {
     return capture_params_;
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
index ea0e40f..c968e31 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -68,6 +68,7 @@
 #include "third_party/webrtc/api/video_codecs/video_encoder_factory.h"
 #include "third_party/webrtc/api/videosourceproxy.h"
 #include "third_party/webrtc/media/engine/convert_legacy_video_factory.h"
+#include "third_party/webrtc/media/engine/multiplexcodecfactory.h"
 #include "third_party/webrtc/modules/video_coding/codecs/h264/include/h264.h"
 #include "third_party/webrtc/rtc_base/refcountedobject.h"
 #include "third_party/webrtc/rtc_base/ssladapter.h"
@@ -237,8 +238,9 @@
   jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
   signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
 
-  socket_factory_.reset(
-      new IpcPacketSocketFactory(p2p_socket_dispatcher_.get()));
+  // TODO(https://crbug.com/656607): Add proper annotation here.
+  socket_factory_.reset(new IpcPacketSocketFactory(
+      p2p_socket_dispatcher_.get(), NO_TRAFFIC_ANNOTATION_BUG_656607));
 
   std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
   std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
@@ -261,13 +263,25 @@
   // interface and let Chromium be responsible in what order video codecs are
   // listed, instead of using
   // cricket::ConvertVideoEncoderFactory/cricket::ConvertVideoDecoderFactory.
+  std::unique_ptr<webrtc::VideoEncoderFactory> webrtc_encoder_factory =
+      ConvertVideoEncoderFactory(std::move(encoder_factory));
+  std::unique_ptr<webrtc::VideoDecoderFactory> webrtc_decoder_factory =
+      ConvertVideoDecoderFactory(std::move(decoder_factory));
+
+  // Enable Multiplex codec in SDP optionally.
+  if (base::FeatureList::IsEnabled(features::kWebRtcMultiplexCodec)) {
+    webrtc_encoder_factory = base::MakeUnique<webrtc::MultiplexEncoderFactory>(
+        std::move(webrtc_encoder_factory));
+    webrtc_decoder_factory = base::MakeUnique<webrtc::MultiplexDecoderFactory>(
+        std::move(webrtc_decoder_factory));
+  }
+
   pc_factory_ = webrtc::CreatePeerConnectionFactory(
       worker_thread_ /* network thread */, worker_thread_, signaling_thread_,
       audio_device_.get(), CreateWebrtcAudioEncoderFactory(),
-      CreateWebrtcAudioDecoderFactory(),
-      cricket::ConvertVideoEncoderFactory(std::move(encoder_factory)),
-      cricket::ConvertVideoDecoderFactory(std::move(decoder_factory)),
-      nullptr /* audio_mixer */, nullptr /* audio_processing */);
+      CreateWebrtcAudioDecoderFactory(), std::move(webrtc_encoder_factory),
+      std::move(webrtc_decoder_factory), nullptr /* audio_mixer */,
+      nullptr /* audio_processing */);
   CHECK(pc_factory_.get());
 
   webrtc::PeerConnectionFactoryInterface::Options factory_options;
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
index 329f20f..6d0a555 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -1148,6 +1148,7 @@
   std::vector<StreamState> GetStreamStates(
       const WebRtcSetRemoteDescriptionObserver::States& states,
       const std::vector<RTCRtpReceiver*>& removed_receivers) {
+    states.CheckInvariants();
     std::vector<StreamState> stream_states;
     // The receiver's track belongs to all of its streams. A stream may be
     // associated with multiple tracks (multiple receivers).
@@ -1175,6 +1176,7 @@
         GetOrAddStreamStateForStream(*stream_ref, &stream_states);
       }
     }
+    states.CheckInvariants();
     return stream_states;
   }
 
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_adapter_map.cc b/content/renderer/media/webrtc/webrtc_media_stream_adapter_map.cc
index 7b97fed..9f8c9de 100644
--- a/content/renderer/media/webrtc/webrtc_media_stream_adapter_map.cc
+++ b/content/renderer/media/webrtc/webrtc_media_stream_adapter_map.cc
@@ -196,7 +196,7 @@
     // initialized and its secondary key is set.
     main_thread_->PostTask(
         FROM_HERE,
-        base::Bind(
+        base::BindOnce(
             &WebRtcMediaStreamAdapterMap::OnRemoteStreamAdapterInitialized,
             this,
             base::Passed(base::WrapUnique(new AdapterRef(
diff --git a/content/renderer/media/webrtc/webrtc_set_remote_description_observer.cc b/content/renderer/media/webrtc/webrtc_set_remote_description_observer.cc
index 479313f..0ebb644 100644
--- a/content/renderer/media/webrtc/webrtc_set_remote_description_observer.cc
+++ b/content/renderer/media/webrtc/webrtc_set_remote_description_observer.cc
@@ -37,6 +37,18 @@
   return *this;
 }
 
+void WebRtcSetRemoteDescriptionObserver::States::CheckInvariants() const {
+  // Invariants:
+  // - All receiver states have a stream ref
+  // - All receiver states refer to streams that are non-null.
+  for (auto& receiver_state : receiver_states) {
+    for (auto& stream_ref : receiver_state.stream_refs) {
+      CHECK(stream_ref);
+      CHECK(!stream_ref->adapter().web_stream().IsNull());
+    }
+  }
+}
+
 WebRtcSetRemoteDescriptionObserver::WebRtcSetRemoteDescriptionObserver() {}
 
 WebRtcSetRemoteDescriptionObserver::~WebRtcSetRemoteDescriptionObserver() {}
diff --git a/content/renderer/media/webrtc/webrtc_set_remote_description_observer.h b/content/renderer/media/webrtc/webrtc_set_remote_description_observer.h
index 83f71ac..1102c41 100644
--- a/content/renderer/media/webrtc/webrtc_set_remote_description_observer.h
+++ b/content/renderer/media/webrtc/webrtc_set_remote_description_observer.h
@@ -72,6 +72,8 @@
 
     // The receivers at the time of the event.
     std::vector<WebRtcReceiverState> receiver_states;
+    // Check that the invariants for this structure hold.
+    void CheckInvariants() const;
 
     DISALLOW_COPY_AND_ASSIGN(States);
   };
diff --git a/content/renderer/media_capture_from_element/html_audio_element_capturer_source.cc b/content/renderer/media_capture_from_element/html_audio_element_capturer_source.cc
index f6b4444..d6bf00c 100644
--- a/content/renderer/media_capture_from_element/html_audio_element_capturer_source.cc
+++ b/content/renderer/media_capture_from_element/html_audio_element_capturer_source.cc
@@ -44,8 +44,9 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   if (audio_source_ && !is_started_) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(&HtmlAudioElementCapturerSource::SetAudioCallback,
-                              weak_factory_.GetWeakPtr()));
+        FROM_HERE,
+        base::BindOnce(&HtmlAudioElementCapturerSource::SetAudioCallback,
+                       weak_factory_.GetWeakPtr()));
     is_started_ = true;
   }
   return is_started_;
diff --git a/content/renderer/p2p/ipc_socket_factory.cc b/content/renderer/p2p/ipc_socket_factory.cc
index 4c7c512..d38d76a 100644
--- a/content/renderer/p2p/ipc_socket_factory.cc
+++ b/content/renderer/p2p/ipc_socket_factory.cc
@@ -715,9 +715,10 @@
 }  // namespace
 
 IpcPacketSocketFactory::IpcPacketSocketFactory(
-    P2PSocketDispatcher* socket_dispatcher)
-    : socket_dispatcher_(socket_dispatcher) {
-}
+    P2PSocketDispatcher* socket_dispatcher,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation)
+    : socket_dispatcher_(socket_dispatcher),
+      traffic_annotation_(traffic_annotation) {}
 
 IpcPacketSocketFactory::~IpcPacketSocketFactory() {
 }
@@ -727,7 +728,7 @@
     uint16_t min_port,
     uint16_t max_port) {
   P2PSocketClientImpl* socket_client =
-      new P2PSocketClientImpl(socket_dispatcher_);
+      new P2PSocketClientImpl(socket_dispatcher_, traffic_annotation_);
   std::unique_ptr<IpcPacketSocket> socket(new IpcPacketSocket());
   if (!socket->Init(P2P_SOCKET_UDP, socket_client, local_address, min_port,
                     max_port, rtc::SocketAddress())) {
@@ -748,7 +749,7 @@
   P2PSocketType type = (opts & rtc::PacketSocketFactory::OPT_STUN) ?
       P2P_SOCKET_STUN_TCP_SERVER : P2P_SOCKET_TCP_SERVER;
   P2PSocketClientImpl* socket_client =
-      new P2PSocketClientImpl(socket_dispatcher_);
+      new P2PSocketClientImpl(socket_dispatcher_, traffic_annotation_);
   std::unique_ptr<IpcPacketSocket> socket(new IpcPacketSocket());
   if (!socket->Init(type, socket_client, local_address, min_port, max_port,
                     rtc::SocketAddress())) {
@@ -774,7 +775,7 @@
         P2P_SOCKET_STUN_TCP_CLIENT : P2P_SOCKET_TCP_CLIENT;
   }
   P2PSocketClientImpl* socket_client =
-      new P2PSocketClientImpl(socket_dispatcher_);
+      new P2PSocketClientImpl(socket_dispatcher_, traffic_annotation_);
   std::unique_ptr<IpcPacketSocket> socket(new IpcPacketSocket());
   if (!socket->Init(type, socket_client, local_address, 0, 0, remote_address))
     return nullptr;
diff --git a/content/renderer/p2p/ipc_socket_factory.h b/content/renderer/p2p/ipc_socket_factory.h
index 7ca81d61..8a7a1ff 100644
--- a/content/renderer/p2p/ipc_socket_factory.h
+++ b/content/renderer/p2p/ipc_socket_factory.h
@@ -10,6 +10,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "content/common/content_export.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "third_party/webrtc/p2p/base/packetsocketfactory.h"
 
 namespace content {
@@ -25,7 +26,8 @@
 class IpcPacketSocketFactory : public rtc::PacketSocketFactory {
  public:
   CONTENT_EXPORT explicit IpcPacketSocketFactory(
-      P2PSocketDispatcher* socket_dispatcher);
+      P2PSocketDispatcher* socket_dispatcher,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation);
   ~IpcPacketSocketFactory() override;
 
   rtc::AsyncPacketSocket* CreateUdpSocket(
@@ -47,6 +49,7 @@
 
  private:
   P2PSocketDispatcher* socket_dispatcher_;
+  const net::NetworkTrafficAnnotationTag traffic_annotation_;
 
   DISALLOW_COPY_AND_ASSIGN(IpcPacketSocketFactory);
 };
diff --git a/content/renderer/p2p/socket_client_impl.cc b/content/renderer/p2p/socket_client_impl.cc
index c59170d..4bc68c8 100644
--- a/content/renderer/p2p/socket_client_impl.cc
+++ b/content/renderer/p2p/socket_client_impl.cc
@@ -14,7 +14,6 @@
 #include "content/renderer/p2p/socket_dispatcher.h"
 #include "content/renderer/render_thread_impl.h"
 #include "crypto/random.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace {
 
@@ -29,13 +28,16 @@
 
 namespace content {
 
-P2PSocketClientImpl::P2PSocketClientImpl(P2PSocketDispatcher* dispatcher)
+P2PSocketClientImpl::P2PSocketClientImpl(
+    P2PSocketDispatcher* dispatcher,
+    const net::NetworkTrafficAnnotationTag& traffic_annotation)
     : dispatcher_(dispatcher),
       ipc_task_runner_(dispatcher->task_runner()),
       delegate_task_runner_(base::ThreadTaskRunnerHandle::Get()),
       socket_id_(0),
       delegate_(nullptr),
       state_(STATE_UNINITIALIZED),
+      traffic_annotation_(traffic_annotation),
       random_socket_id_(0),
       next_packet_id_(0) {
   crypto::RandBytes(&random_socket_id_, sizeof(random_socket_id_));
@@ -101,11 +103,9 @@
                                            uint64_t packet_id) {
   TRACE_EVENT_ASYNC_BEGIN0("p2p", "Send", packet_id);
 
-  // TODO(crbug.com/656607): Add proper annotation.
   dispatcher_->SendP2PMessage(new P2PHostMsg_Send(
       socket_id_, data, P2PPacketInfo(address, options, packet_id),
-      net::MutableNetworkTrafficAnnotationTag(
-          NO_TRAFFIC_ANNOTATION_BUG_656607)));
+      net::MutableNetworkTrafficAnnotationTag(traffic_annotation_)));
 }
 
 void P2PSocketClientImpl::SetOption(P2PSocketOption option,
@@ -181,7 +181,7 @@
   DCHECK_EQ(state_, STATE_OPEN);
 
   scoped_refptr<P2PSocketClientImpl> new_client =
-      new P2PSocketClientImpl(dispatcher_);
+      new P2PSocketClientImpl(dispatcher_, traffic_annotation_);
   new_client->socket_id_ = dispatcher_->RegisterClient(new_client.get());
   new_client->state_ = STATE_OPEN;
   new_client->delegate_task_runner_ = delegate_task_runner_;
diff --git a/content/renderer/p2p/socket_client_impl.h b/content/renderer/p2p/socket_client_impl.h
index eda1593..b447548 100644
--- a/content/renderer/p2p/socket_client_impl.h
+++ b/content/renderer/p2p/socket_client_impl.h
@@ -14,6 +14,7 @@
 #include "content/common/p2p_socket_type.h"
 #include "content/renderer/p2p/socket_client.h"
 #include "net/base/ip_endpoint.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -32,7 +33,9 @@
 // thread which is specified in Init().
 class P2PSocketClientImpl : public P2PSocketClient {
  public:
-  explicit P2PSocketClientImpl(P2PSocketDispatcher* dispatcher);
+  explicit P2PSocketClientImpl(
+      P2PSocketDispatcher* dispatcher,
+      const net::NetworkTrafficAnnotationTag& traffic_annotation);
 
   // Initialize socket of the specified |type| and connected to the
   // specified |address|. |address| matters only when |type| is set to
@@ -122,6 +125,7 @@
   int socket_id_;
   P2PSocketClientDelegate* delegate_;
   State state_;
+  const net::NetworkTrafficAnnotationTag traffic_annotation_;
 
   // These two fields are used to identify packets for tracing.
   uint32_t random_socket_id_;
diff --git a/content/renderer/pepper/pepper_compositor_host.cc b/content/renderer/pepper/pepper_compositor_host.cc
index e6e3168..a95a2984 100644
--- a/content/renderer/pepper/pepper_compositor_host.cc
+++ b/content/renderer/pepper/pepper_compositor_host.cc
@@ -286,7 +286,7 @@
           new_layer->texture->sync_token);
       texture_layer->SetTransferableResource(
           resource,
-          viz::SingleReleaseCallback::Create(base::Bind(
+          viz::SingleReleaseCallback::Create(base::BindOnce(
               &PepperCompositorHost::ResourceReleased,
               weak_factory_.GetWeakPtr(), new_layer->common.resource_id)));
       // TODO(penghuang): get a damage region from the application and
@@ -323,7 +323,7 @@
           bitmap->id(), bitmap->sequence_number(), PP_ToGfxSize(desc.size));
       image_layer->SetTransferableResource(
           resource,
-          viz::SingleReleaseCallback::Create(base::Bind(
+          viz::SingleReleaseCallback::Create(base::BindOnce(
               &PepperCompositorHost::ImageReleased, weak_factory_.GetWeakPtr(),
               new_layer->common.resource_id, base::Passed(&image_shm),
               base::Passed(&bitmap))));
diff --git a/content/renderer/pepper/pepper_graphics_2d_host.cc b/content/renderer/pepper/pepper_graphics_2d_host.cc
index a0150fe6..f8e5930 100644
--- a/content/renderer/pepper/pepper_graphics_2d_host.cc
+++ b/content/renderer/pepper/pepper_graphics_2d_host.cc
@@ -743,8 +743,8 @@
         std::move(gpu_mailbox), GL_LINEAR, texture_target,
         std::move(sync_token), size, overlay_candidate);
     *release_callback = viz::SingleReleaseCallback::Create(
-        base::Bind(&ReleaseTextureCallback, this->AsWeakPtr(),
-                   main_thread_context_, texture_id));
+        base::BindOnce(&ReleaseTextureCallback, this->AsWeakPtr(),
+                       main_thread_context_, texture_id));
     composited_output_modified_ = false;
     return true;
   }
@@ -771,7 +771,7 @@
 
   *transferable_resource = viz::TransferableResource::MakeSoftware(
       shared_bitmap->id(), shared_bitmap->sequence_number(), pixel_image_size);
-  *release_callback = viz::SingleReleaseCallback::Create(base::Bind(
+  *release_callback = viz::SingleReleaseCallback::Create(base::BindOnce(
       &PepperGraphics2DHost::ReleaseSoftwareCallback, this->AsWeakPtr(),
       base::Passed(&shared_bitmap), pixel_image_size));
   composited_output_modified_ = false;
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 4aef73d..88e7a2d 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -814,7 +814,7 @@
     return;
 
   std::unique_ptr<viz::SingleReleaseCallback> callback(
-      viz::SingleReleaseCallback::Create(base::Bind(
+      viz::SingleReleaseCallback::Create(base::BindOnce(
           &PepperPluginInstanceImpl::FinishedConsumingCommittedTexture,
           weak_factory_.GetWeakPtr(), committed_texture_,
           committed_texture_graphics_3d_)));
diff --git a/content/renderer/pepper/pepper_url_loader_host.cc b/content/renderer/pepper/pepper_url_loader_host.cc
index 3f41b5b..7fd6ab046 100644
--- a/content/renderer/pepper/pepper_url_loader_host.cc
+++ b/content/renderer/pepper/pepper_url_loader_host.cc
@@ -259,8 +259,7 @@
 
   // Requests from plug-ins must skip service workers, see the comment in
   // CreateWebURLRequest.
-  DCHECK_EQ(web_request.GetServiceWorkerMode(),
-            WebURLRequest::ServiceWorkerMode::kNone);
+  DCHECK(web_request.GetSkipServiceWorker());
 
   WebAssociatedURLLoaderOptions options;
   if (!has_universal_access_) {
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index 1b3c33f8..31304f28 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -203,8 +203,8 @@
   } else {
     // Wait for the command to complete on the GPU to allow for throttling.
     command_buffer_->SignalSyncToken(
-        sync_token, base::Bind(&PPB_Graphics3D_Impl::OnSwapBuffers,
-                               weak_ptr_factory_.GetWeakPtr()));
+        sync_token, base::BindOnce(&PPB_Graphics3D_Impl::OnSwapBuffers,
+                                   weak_ptr_factory_.GetWeakPtr()));
   }
 
   return PP_OK_COMPLETIONPENDING;
diff --git a/content/renderer/pepper/url_request_info_util.cc b/content/renderer/pepper/url_request_info_util.cc
index 5a169e6..b50ab70 100644
--- a/content/renderer/pepper/url_request_info_util.cc
+++ b/content/renderer/pepper/url_request_info_util.cc
@@ -182,7 +182,7 @@
   // origin checking logic that may get confused if service workers respond with
   // resources from another origin.
   // https://w3c.github.io/ServiceWorker/#implementer-concerns
-  dest->SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+  dest->SetSkipServiceWorker(true);
 
   const std::string& headers = data->headers;
   if (!headers.empty()) {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index e638940..bfe9214 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -6767,8 +6767,7 @@
   mojom::BeginNavigationParamsPtr begin_navigation_params =
       mojom::BeginNavigationParams::New(
           GetWebURLRequestHeadersAsString(info.url_request), load_flags,
-          info.url_request.GetServiceWorkerMode() !=
-              blink::WebURLRequest::ServiceWorkerMode::kAll,
+          info.url_request.GetSkipServiceWorker(),
           GetRequestContextTypeForWebURLRequest(info.url_request),
           GetMixedContentContextTypeForWebURLRequest(info.url_request),
           is_form_submission, searchable_form_url, searchable_form_encoding,
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 00f013b..0e5832e4 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -32,7 +32,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/simple_thread.h"
 #include "base/threading/thread_local.h"
 #include "base/threading/thread_restrictions.h"
@@ -1105,13 +1104,6 @@
 
   base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
 
-  // If this renderer doesn't run inside the browser process, enable
-  // SequencedWorkerPool. Otherwise, it should already have been enabled.
-  // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler
-  // redirection experiment concludes https://crbug.com/622400.
-  if (!command_line.HasSwitch(switches::kSingleProcess))
-    base::SequencedWorkerPool::EnableForProcess();
-
   GetConnector()->BindInterface(mojom::kBrowserServiceName,
                                 mojo::MakeRequest(&frame_sink_provider_));
 
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc
index 9e3946d..999b7dd 100644
--- a/content/renderer/render_thread_impl_browsertest.cc
+++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -19,7 +19,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/app/mojo/mojo_init.h"
 #include "content/common/in_process_child_thread_params.h"
@@ -169,12 +168,6 @@
   RenderThreadImplBrowserTest() : field_trial_list_(nullptr) {}
 
   void SetUp() override {
-    // SequencedWorkerPool is enabled by default in tests. Disable it for this
-    // test to avoid a DCHECK failure when RenderThreadImpl::Init enables it.
-    // TODO(fdoray): Remove this once the SequencedWorkerPool to TaskScheduler
-    // redirection experiment concludes https://crbug.com/622400.
-    base::SequencedWorkerPool::DisableForProcessForTesting();
-
     content_renderer_client_.reset(new ContentRendererClient());
     SetRendererClientForTesting(content_renderer_client_.get());
 
diff --git a/content/renderer/renderer_main.cc b/content/renderer/renderer_main.cc
index 5276d66..3d1a58c 100644
--- a/content/renderer/renderer_main.cc
+++ b/content/renderer/renderer_main.cc
@@ -14,6 +14,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/pending_task.h"
 #include "base/run_loop.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
@@ -32,7 +33,6 @@
 #include "content/renderer/renderer_main_platform_delegate.h"
 #include "media/media_features.h"
 #include "ppapi/features/features.h"
-#include "third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h"
 #include "third_party/skia/include/core/SkGraphics.h"
 #include "ui/base/ui_base_switches.h"
@@ -99,8 +99,8 @@
   const base::CommandLine& command_line = parameters.command_line;
 
   if (command_line.HasSwitch(switches::kSamplingHeapProfiler)) {
-    blink::SamplingHeapProfiler* profiler =
-        blink::SamplingHeapProfiler::GetInstance();
+    base::SamplingHeapProfiler* profiler =
+        base::SamplingHeapProfiler::GetInstance();
     unsigned sampling_interval = 0;
     bool parsed = base::StringToUint(
         command_line.GetSwitchValueASCII(switches::kSamplingHeapProfiler),
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 9b4b2d3..3f39647 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -249,14 +249,6 @@
     web_request->SetHeader(blink::WebString::FromUTF8(pair.first),
                            blink::WebString::FromUTF8(pair.second));
   }
-  if (!request.blob_uuid.empty()) {
-    DCHECK(request.blob);
-    mojo::ScopedMessagePipeHandle blob_pipe;
-    if (request.blob)
-      blob_pipe = request.blob->Clone().PassInterface().PassHandle();
-    web_request->SetBlob(blink::WebString::FromASCII(request.blob_uuid),
-                         request.blob_size, std::move(blob_pipe));
-  }
   web_request->SetReferrer(
       blink::WebString::FromUTF8(request.referrer.url.spec()),
       request.referrer.policy);
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 50aa8a3..46de26a 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -25,7 +25,6 @@
 #include "content/common/service_worker/service_worker_provider.mojom.h"
 #include "content/common/service_worker/service_worker_status_code.h"
 #include "content/common/service_worker/service_worker_types.h"
-#include "content/public/common/service_worker_modes.h"
 #include "ipc/ipc_listener.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "third_party/WebKit/public/mojom/blob/blob_registry.mojom.h"
diff --git a/content/renderer/service_worker/service_worker_network_provider.cc b/content/renderer/service_worker/service_worker_network_provider.cc
index a6fe44b8..7dc121f 100644
--- a/content/renderer/service_worker/service_worker_network_provider.cc
+++ b/content/renderer/service_worker/service_worker_network_provider.cc
@@ -64,20 +64,17 @@
     extra_data->set_service_worker_provider_id(provider_->provider_id());
 
     // If the provider does not have a controller at this point, the renderer
-    // expects the request to never be handled by a service worker,
-    // so set the ServiceWorkerMode to skip service workers here. Otherwise, a
-    // service worker that is in the process of becoming the controller (i.e.,
+    // expects the request to never be handled by a service worker, so call
+    // SetSkipServiceWorker() with true to skip service workers here. Otherwise,
+    // a service worker that is in the process of becoming the controller (i.e.,
     // via claim()) on the browser-side could handle the request and break the
     // assumptions of the renderer.
     if (request.GetFrameType() !=
             network::mojom::RequestContextFrameType::kTopLevel &&
         request.GetFrameType() !=
             network::mojom::RequestContextFrameType::kNested &&
-        !provider_->IsControlledByServiceWorker() &&
-        request.GetServiceWorkerMode() !=
-            blink::WebURLRequest::ServiceWorkerMode::kNone) {
-      request.SetServiceWorkerMode(
-          blink::WebURLRequest::ServiceWorkerMode::kNone);
+        !provider_->IsControlledByServiceWorker()) {
+      request.SetSkipServiceWorker(true);
     }
   }
 
@@ -122,11 +119,9 @@
       return nullptr;
 
     // S13nServiceWorker:
-    // If the service worker mode is not all, no need to intercept the request.
-    if (request.GetServiceWorkerMode() !=
-        blink::WebURLRequest::ServiceWorkerMode::kAll) {
+    // If GetSkipServiceWorker() returns true, no need to intercept the request.
+    if (request.GetSkipServiceWorker())
       return nullptr;
-    }
 
     // S13nServiceWorker:
     // Create our own SubresourceLoader to route the request
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index d620bbb5..d6e1525 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -66,8 +66,8 @@
     network::mojom::URLLoaderClientPtr ptr;
     binding_.Bind(mojo::MakeRequest(&ptr));
     binding_.set_connection_error_handler(
-        base::Bind(&HeaderRewritingURLLoaderClient::OnClientConnectionError,
-                   base::Unretained(this)));
+        base::BindOnce(&HeaderRewritingURLLoaderClient::OnClientConnectionError,
+                       base::Unretained(this)));
     return ptr;
   }
 
diff --git a/content/renderer/service_worker/web_service_worker_registration_impl.cc b/content/renderer/service_worker/web_service_worker_registration_impl.cc
index 9037a49..06b3bc3 100644
--- a/content/renderer/service_worker/web_service_worker_registration_impl.cc
+++ b/content/renderer/service_worker/web_service_worker_registration_impl.cc
@@ -260,8 +260,8 @@
   DCHECK(request.is_pending());
   binding_.Bind(std::move(request));
   binding_.set_connection_error_handler(
-      base::Bind(&WebServiceWorkerRegistrationImpl::OnConnectionError,
-                 base::Unretained(this)));
+      base::BindOnce(&WebServiceWorkerRegistrationImpl::OnConnectionError,
+                     base::Unretained(this)));
 }
 
 void WebServiceWorkerRegistrationImpl::OnConnectionError() {
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.cc b/content/renderer/service_worker/worker_fetch_context_impl.cc
index 665daa0b..d0bec22 100644
--- a/content/renderer/service_worker/worker_fetch_context_impl.cc
+++ b/content/renderer/service_worker/worker_fetch_context_impl.cc
@@ -75,11 +75,9 @@
     if (!GURL(request.Url()).SchemeIsHTTPOrHTTPS())
       return nullptr;
 
-    // If the service worker mode is not all, no need to intercept the request.
-    if (request.GetServiceWorkerMode() !=
-        blink::WebURLRequest::ServiceWorkerMode::kAll) {
+    // If GetSkipServiceWorker() returns true, no need to intercept the request.
+    if (request.GetSkipServiceWorker())
       return nullptr;
-    }
 
     // Create our own URLLoader to route the request to the controller service
     // worker.
@@ -180,13 +178,10 @@
   request.SetExtraData(std::move(extra_data));
   request.SetAppCacheHostID(appcache_host_id_);
 
-  if (!IsControlledByServiceWorker() &&
-      request.GetServiceWorkerMode() !=
-          blink::WebURLRequest::ServiceWorkerMode::kNone) {
+  if (!IsControlledByServiceWorker()) {
     // TODO(falken): Is still this needed? It used to set kForeign for foreign
     // fetch.
-    request.SetServiceWorkerMode(
-        blink::WebURLRequest::ServiceWorkerMode::kNone);
+    request.SetSkipServiceWorker(true);
   }
 }
 
diff --git a/content/renderer/service_worker/worker_fetch_context_impl.h b/content/renderer/service_worker/worker_fetch_context_impl.h
index e23c4f01..8137c70b 100644
--- a/content/renderer/service_worker/worker_fetch_context_impl.h
+++ b/content/renderer/service_worker/worker_fetch_context_impl.h
@@ -7,7 +7,6 @@
 
 #include "content/common/service_worker/service_worker_provider.mojom.h"
 #include "content/common/service_worker/service_worker_types.h"
-#include "content/public/common/service_worker_modes.h"
 #include "content/public/common/shared_url_loader_factory.h"
 #include "ipc/ipc_message.h"
 #include "mojo/public/cpp/bindings/binding.h"
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
index 8f9ffb8..64aecd42 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -90,17 +90,14 @@
     request.SetExtraData(std::move(extra_data));
     // If the provider does not have a controller at this point, the renderer
     // expects subresource requests to never be handled by a controlling service
-    // worker, so set the ServiceWorkerMode to skip service workers here.
+    // worker, so set |skip_service_worker| to skip service workers here.
     // Otherwise, a service worker that is in the process of becoming the
     // controller (i.e., via claim()) on the browser-side could handle the
     // request and break the assumptions of the renderer.
     if (request.GetRequestContext() !=
             blink::WebURLRequest::kRequestContextSharedWorker &&
-        !provider_->IsControlledByServiceWorker() &&
-        request.GetServiceWorkerMode() !=
-            blink::WebURLRequest::ServiceWorkerMode::kNone) {
-      request.SetServiceWorkerMode(
-          blink::WebURLRequest::ServiceWorkerMode::kNone);
+        !provider_->IsControlledByServiceWorker()) {
+      request.SetSkipServiceWorker(true);
     }
   }
 
diff --git a/content/shell/DEPS b/content/shell/DEPS
index ea40592ef..f6914b8 100644
--- a/content/shell/DEPS
+++ b/content/shell/DEPS
@@ -31,6 +31,7 @@
   # Content Shell can depend on more components than content/, since:
   #   1) it's an example browser
   #   2) it's not linked into the content library
+  "+components/content_view",
   "+components/crash",
   "+components/download/public/common",
   "+components/url_formatter",
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn
index 69117e78..277d949 100644
--- a/content/shell/android/BUILD.gn
+++ b/content/shell/android/BUILD.gn
@@ -64,6 +64,8 @@
     ":content_shell_java_resources",
     ":content_shell_manifest",
     "//base:base_java",
+    "//base:base_java_test_support",
+    "//components/content_view:content_view_java",
     "//content/public/android:content_java",
     "//device/geolocation:geolocation_java",
     "//media/base/android:media_java",
diff --git a/content/shell/android/java/src/org/chromium/content_shell/Shell.java b/content/shell/android/java/src/org/chromium/content_shell/Shell.java
index d60b0c5..3cde4851 100644
--- a/content/shell/android/java/src/org/chromium/content_shell/Shell.java
+++ b/content/shell/android/java/src/org/chromium/content_shell/Shell.java
@@ -27,9 +27,9 @@
 import org.chromium.base.Callback;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.content.browser.ActivityContentVideoViewEmbedder;
 import org.chromium.content.browser.ContentVideoViewEmbedder;
-import org.chromium.content.browser.ContentView;
 import org.chromium.content.browser.ContentViewCoreImpl;
 import org.chromium.content.browser.ContentViewRenderView;
 import org.chromium.content_public.browser.ActionModeCallbackHelper;
diff --git a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
index ca3f1db..f990095 100644
--- a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
+++ b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
@@ -23,14 +23,13 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.content.browser.ContentView;
+import org.chromium.components.content_view.ContentView;
 import org.chromium.content.browser.ContentViewCoreImpl;
 import org.chromium.content.browser.RenderCoordinates;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
 import org.chromium.content.browser.webcontents.WebContentsImpl;
-import org.chromium.content_public.browser.ContentViewCore;
 import org.chromium.content_public.browser.JavascriptInjector;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationController;
@@ -286,8 +285,7 @@
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
-                ContentView cv = ContentView.createContentView(
-                        getActivity(), getContentViewCore());
+                ContentView cv = ContentView.createContentView(getActivity(), getContentViewCore());
                 ((ViewGroup) getContentViewCore().getContainerView().getParent()).addView(cv);
                 getContentViewCore().setContainerView(cv);
                 getContentViewCore().setContainerViewInternals(cv);
diff --git a/content/shell/test_runner/test_plugin.cc b/content/shell/test_runner/test_plugin.cc
index 6c11398f..18c1077 100644
--- a/content/shell/test_runner/test_plugin.cc
+++ b/content/shell/test_runner/test_plugin.cc
@@ -296,14 +296,14 @@
   if (!mailbox_.IsZero()) {
     *resource = viz::TransferableResource::MakeGL(mailbox_, GL_LINEAR,
                                                   GL_TEXTURE_2D, sync_token_);
-    *release_callback =
-        viz::SingleReleaseCallback::Create(base::Bind(&IgnoreReleaseCallback));
+    *release_callback = viz::SingleReleaseCallback::Create(
+        base::BindOnce(&IgnoreReleaseCallback));
   } else if (shared_bitmap_) {
     *resource = viz::TransferableResource::MakeSoftware(
         shared_bitmap_->id(), shared_bitmap_->sequence_number(),
         gfx::Size(rect_.width, rect_.height));
     *release_callback = viz::SingleReleaseCallback::Create(
-        base::Bind(&ReleaseSharedMemory, base::Passed(&shared_bitmap_)));
+        base::BindOnce(&ReleaseSharedMemory, base::Passed(&shared_bitmap_)));
   }
   content_changed_ = false;
   return true;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 97336660..0e4e31c 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -773,6 +773,7 @@
     "../browser/net_info_browsertest.cc",
     "../browser/network_service_browsertest.cc",
     "../browser/network_service_restart_browsertest.cc",
+    "../browser/oop_browsertest.cc",
     "../browser/payments/payment_app_browsertest.cc",
     "../browser/pointer_lock_browsertest.cc",
     "../browser/pointer_lock_browsertest.h",
@@ -1652,7 +1653,7 @@
     ":content_unittests_catalog_source",
     ":test_interfaces",
     ":test_support",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//base/test:test_support",
     "//base/third_party/dynamic_annotations",
     "//cc",
diff --git a/content/test/appcache_test_helper.cc b/content/test/appcache_test_helper.cc
index 9f6c350..749d7620 100644
--- a/content/test/appcache_test_helper.cc
+++ b/content/test/appcache_test_helper.cc
@@ -55,8 +55,8 @@
   origins_ = origins;
   appcache_service->GetAllAppCacheInfo(
       appcache_info_.get(),
-      base::Bind(&AppCacheTestHelper::OnGotAppCacheInfo,
-                 base::Unretained(this)));
+      base::BindOnce(&AppCacheTestHelper::OnGotAppCacheInfo,
+                     base::Unretained(this)));
 
   // OnGotAppCacheInfo will quit the message loop.
   base::RunLoop().Run();
diff --git a/content/test/data/browsing_data/site_data.html b/content/test/data/browsing_data/site_data.html
index f4b9a17..ecb8fdc 100644
--- a/content/test/data/browsing_data/site_data.html
+++ b/content/test/data/browsing_data/site_data.html
@@ -113,10 +113,22 @@
       domAutomationController.send(hasStore);
     }
   }
+
+  function setHistory() {
+    history.pushState({}, "foo");
+    success_();
+  }
+
+  function hasHistory() {
+    domAutomationController.send(history.length > 1);
+  }
+
 </script>
 
 <body>
   This page is used to test creation and deletion of various site data types.
+  The functions are called from BrowsingDataRemoverBrowserTest::HasDataForType
+  and BrowsingDataRemoverBrowserTest::SetDataForType.
 </body>
 
 </html>
\ No newline at end of file
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index d2f862b0..398f74d 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -118,10 +118,6 @@
   def EXPERIMENTAL_CONDITIONALLY(x):
     return Types.EXPERIMENTAL in x
 
-  @staticmethod
-  def EXPERIMENTAL_CONDITIONALLY_OR_NOOP(x):
-    return Types.EXPERIMENTAL in x or Types.NOOP in x
-
 # Most of the bots live in the Chrome-GPU pool as defined here (Google
 # employees only, sorry):
 # https://chrome-internal.googlesource.com/infradata/config/+/master/configs/
@@ -1975,7 +1971,7 @@
     'tester_configs': [
       {
         # Only run the noop sleep test on experimental configs.
-        'predicate': Predicates.EXPERIMENTAL_CONDITIONALLY_OR_NOOP,
+        'predicate': Predicates.EXPERIMENTAL_CONDITIONALLY,
         'disabled_instrumentation_types': ['tsan'],
       },
     ],
@@ -2596,8 +2592,7 @@
   if 'tester_configs' in test_config:
     for tc in test_config['tester_configs']:
       pred = tc.get('predicate', Predicates.DEFAULT)
-      if (pred == Predicates.EXPERIMENTAL_CONDITIONALLY or \
-          pred == Predicates.EXPERIMENTAL_CONDITIONALLY_OR_NOOP):
+      if pred == Predicates.EXPERIMENTAL_CONDITIONALLY:
         return True
   return False
 
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index 28c2b0d8..c756f9ac 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -123,10 +123,6 @@
     self.Flaky('Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing',
                ['android'], bug=810006)
 
-    # Needs rebaseline. See crbug.com/806313
-    self.Fail('Pixel_CSSFilterEffects', ['mac'])
-    self.Fail('Pixel_CSSFilterEffects_NoOverlays', ['mac'])
-
     # TODO(kainino): temporary suppressions for pixel test rebaseline
     self.Fail('Pixel_2DCanvasWebGL', bug=812071)
     self.Fail('Pixel_IOSurface2DCanvasWebGL', bug=812071)
@@ -142,3 +138,4 @@
     self.Fail('Pixel_WebGLGreenTriangle_AA_NoAlpha', bug=812071)
     self.Fail('Pixel_WebGLGreenTriangle_NonChromiumImage_AA_Alpha', bug=812071)
     self.Fail('Pixel_WebGLGreenTriangle_NonChromiumImage_AA_NoAlpha', bug=812071)
+
diff --git a/content/utility/in_process_utility_thread.cc b/content/utility/in_process_utility_thread.cc
index 0a39045..e229e6b 100644
--- a/content/utility/in_process_utility_thread.cc
+++ b/content/utility/in_process_utility_thread.cc
@@ -34,8 +34,8 @@
   // We need to return right away or else the main thread that started us will
   // hang.
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&InProcessUtilityThread::InitInternal,
-                            base::Unretained(this)));
+      FROM_HERE, base::BindOnce(&InProcessUtilityThread::InitInternal,
+                                base::Unretained(this)));
 }
 
 void InProcessUtilityThread::CleanUp() {
diff --git a/device/vr/oculus/oculus_device.cc b/device/vr/oculus/oculus_device.cc
index 0a4cfb9..6ed77376 100644
--- a/device/vr/oculus/oculus_device.cc
+++ b/device/vr/oculus/oculus_device.cc
@@ -110,11 +110,11 @@
       base::BindOnce(&OculusDevice::OnRequestPresentResult,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback));
   render_loop_->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&OculusRenderLoop::RequestPresent,
-                                render_loop_->GetWeakPtr(),
-                                std::move(submit_client.PassInterface()),
-                                std::move(request), std::move(present_options),
-                                std::move(on_request_present_result)));
+      FROM_HERE,
+      base::BindOnce(&OculusRenderLoop::RequestPresent,
+                     render_loop_->GetWeakPtr(), submit_client.PassInterface(),
+                     std::move(request), std::move(present_options),
+                     std::move(on_request_present_result)));
 }
 
 void OculusDevice::OnRequestPresentResult(
diff --git a/docs/cipd.md b/docs/cipd.md
deleted file mode 100644
index d19bb6c..0000000
--- a/docs/cipd.md
+++ /dev/null
@@ -1,216 +0,0 @@
-# CIPD for chromium dependencies
-
-This document outlines how to use [CIPD][1] for managing binary dependencies in
-chromium.
-
-[TOC]
-
-## Adding a new CIPD dependency
-
-### 1. Set up a new directory for your dependency
-
-You'll first want somewhere in the repository in which your dependency will
-live. For third-party dependencies, this should typically be a subdirectory
-of `//third_party`. You'll need to add the same set of things to that
-directory that you'd add for a non-CIPD dependency -- OWNERS, README.chromium,
-etc.
-
-For example, if you want to add a package named `sample_cipd_dep`, you might
-create the following:
-
-```
-  third_party/
-    sample_cipd_dep/
-      LICENSE
-      OWNERS
-      README.chromium
-```
-
-For more on third-party dependencies, see [here][2].
-
-### 2. Acquire whatever you want to package
-
-Build it, download it, whatever. Once you've done that, lay it out
-in your local checkout the way you want it to be laid out in a typical
-checkout.
-
-Staying with the example from above, if you want to add a package named
-`sample_cipd_dep` that consists of two JARs, `foo.jar` and `bar.jar`, you might
-lay them out like so:
-
-```
-  third_party/
-    sample_cipd_dep/
-      ...
-      lib/
-        bar.jar
-        foo.jar
-```
-
-### 3. Create a cipd.yaml file
-
-CIPD knows how to create your package based on a .yaml file you provide to it.
-The .yaml file should take the following form:
-
-```
-# Comments are allowed.
-
-# The package name is required. Third-party chromium dependencies should
-# unsurprisingly all be prefixed with chromium/third_party/.
-package: chromium/third_party/sample_cipd_dep
-
-# The description is optional and is solely for the reader's benefit. It
-# isn't used in creating the CIPD package.
-description: A sample CIPD dependency.
-
-# The root is optional and, if unspecified, defaults to ".". It specifies the
-# root directory of the files and directories specified below in "data".
-#
-# You won't typically need to specify this explicitly.
-root: "."
-
-# The install mode is optional. If provided, it specifies how CIPD should
-# install a package: "copy", which will copy the contents of the package
-# to the installation directory; and "symlink", which will create symlinks
-# to the contents of the package in the CIPD root inside the installation
-# directory.
-#
-# You won't typically need to specify this explicitly.
-install_mode: "symlink"
-
-# The data is required and described what should be included in the CIPD
-# package.
-data:
-  # Data can include directories, files, or a version file.
-
-  - dir: "directory_name"
-
-    # Directories can include an optional "exclude" list of regexes.
-    # Files or directories within the given directory that match any of
-    # the provided regexes will not be included in the CIPD package.
-    exclude:
-      - .*\.pyc
-      - exclude_me
-      - keep_this/but_not_this
-
-  - file: keep_this_file.bin
-
-  # If included, CIPD will dump package version information to this path
-  # at package installation.
-  - version_file: CIPD_VERSION.json
-```
-
-For example, for `sample_cipd_dep`, we might write the following .yaml file:
-
-```
-package: chromium/third_party/sample_cipd_dep
-description: A sample CIPD dependency.
-data:
-  - file: bar.jar
-  - file: foo.jar
-```
-
-For more information about the package definition spec, see [the code][3].
-
-> **Note:** Committing the .yaml file to the repository isn't required,
-> but it is recommended. Doing so has benefits for visibility and ease of
-> future updates.
-
-### 4. Create your CIPD package
-
-To actually create your package, you'll need:
-
- - the cipd.yaml file (described above)
- - a package version. For third-party packages, this should typically include
-   the version of the third-party package itself. If you want to support future
-   modifications within a given version of a third-party package (e.g., if you
-   want to make chromium-specific changes), it's best to include a suffix with
-   a numerical component.
- - [permission](#permissions-in-cipd).
-
-Once you have those, you can create your package like so:
-
-```
-# Assuming that the third-party dependency in question is at version 1.2.3
-# and this is the first chromium revision of that version.
-$ cipd create --pkg-def cipd.yaml -tag version:1.2.3-cr0
-```
-
-### 5. Add your CIPD package to DEPS
-
-You can add your package to DEPS by adding an entry of the following form to
-the `deps` dict:
-
-```
-deps = {
-  # ...
-
-  # This is the installation directory.
-  'src/third_party/sample_cipd_dep': {
-
-    # In this example, we're only installing one package in this location,
-    # but installing multiple package in a location is supported.
-    'packages': [
-      {
-        'package': 'chromium/third_party/sample_cipd_dep',
-        'version': 'version:1.2.3-cr0',
-      },
-    ],
-
-    # As with git-based DEPS entries, 'condition' is optional.
-    'condition': 'checkout_android',
-    'dep_type': 'cipd',
-  },
-
-  # ...
-}
-```
-
-This will result in CIPD package `chromium/third_party/sample_cipd_dep` at
-`version:1.2.3-cr0` being installed in `src/third_party/sample_cipd_dep`
-(relative to the gclient root directory).
-
-## Updating a CIPD dependency
-
-To modify a CIPD dependency, follow steps 2, 3, and 4 above, then modify the
-version listed in DEPS.
-
-## Miscellaneous
-
-### Permissions in CIPD
-
-You can check a package's ACLs with `cipd acl-list`:
-
-```
-$ cipd acl-list chromium/third_party/sample_cipd_dep
-...
-```
-
-Permissions in CIPD are handled hierarchically. You can check entries higher
-in the package hierarcy with `cipd acl-list`, too:
-
-```
-$ cipd acl-list chromium
-...
-```
-
-By default, [cria/project-chromium-cipd-owners][4] own all CIPD packages
-under `chromium/`. If you're adding a package, talk to one of them.
-
-## Troubleshooting
-
- - **A file maintained by CIPD is missing, and gclient sync doesn't recreate it.**
-
-CIPD currently caches installation state. Modifying packages managed by CIPD
-will invalidate this cache in a way that CIPD doesn't detect - i.e., CIPD will
-assume that anything it installed is still installed, even if you deleted it.
-To clear the cache and force a full reinstallation, delete your
-`$SRC_ROOT/.cipd` directory.
-
-Note that there is a [bug](crbug.com/794764) on file to add a mode to CIPD
-that is not so trusting of its own cache.
-
-[1]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/
-[2]: /docs/adding_to_third_party.md
-[3]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/client/cipd/local/pkgdef.go
-[4]: https://chrome-infra-auth.appspot.com/auth/groups/project-chromium-cipd-owners
diff --git a/docs/testing/test_browser_dialog.md b/docs/testing/test_browser_dialog.md
index 270fc51c..e602652 100644
--- a/docs/testing/test_browser_dialog.md
+++ b/docs/testing/test_browser_dialog.md
@@ -77,16 +77,16 @@
 E.g. `FooUiTest.InvokeUi_default` should be listed. To show the UI
 interactively, run
 
-    $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke --interactive \
-      --ui=FooUiTest.InvokeUi_default
+    $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke \
+      --test-launcher-interactive --ui=FooUiTest.InvokeUi_default
 
 ### Implementation
 
 `BrowserUiTest.Invoke` searches for gtests that have "`InvokeUi_`"  in their
 names, so they can be collected in a list. Providing a `--ui` argument will
-invoke that test case in a subprocess. Including `--interactive` will set up an
-environment for that subprocess that allows interactivity, e.g., to take
-screenshots. The test ends once the UI is dismissed.
+invoke that test case in a subprocess. Including `--test-launcher-interactive`
+will set up an environment for that subprocess that allows interactivity, e.g.,
+to take screenshots. The test ends once the UI is dismissed.
 
 The `FooUiTest.InvokeUi_default` test case **will still be run in the usual
 browser_tests test suite**. Ensure it passes, and isn’t flaky. This will
@@ -274,7 +274,8 @@
 ```
 
 **$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke
---dialog=CardUnmaskPromptViewBrowserTest.InvokeUi_expired --interactive**
+--ui=CardUnmaskPromptViewBrowserTest.InvokeUi_expired
+--test-launcher-interactive**
 ```
 /*
  * Output as above, except the test are not interleaved, and the browser window
diff --git a/extensions/browser/blob_reader.cc b/extensions/browser/blob_reader.cc
index 1bbdab76..d4a4e2da 100644
--- a/extensions/browser/blob_reader.cc
+++ b/extensions/browser/blob_reader.cc
@@ -87,7 +87,8 @@
   std::unique_ptr<std::string> response(new std::string);
   int64_t first = 0, last = 0, length = 0;
   source->GetResponseAsString(response.get());
-  source->GetResponseHeaders()->GetContentRangeFor206(&first, &last, &length);
+  if (source->GetResponseHeaders())
+    source->GetResponseHeaders()->GetContentRangeFor206(&first, &last, &length);
   callback_.Run(std::move(response), length);
 
   delete this;
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index 42a6211..1f90d80 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -82,6 +82,7 @@
 #include "services/network/public/cpp/url_loader_completion_status.h"
 #include "url/url_util.h"
 
+using content::BrowserContext;
 using content::ResourceRequestInfo;
 using extensions::Extension;
 using extensions::SharedModuleInfo;
@@ -163,6 +164,8 @@
     const base::FilePath& directory,
     base::FilePath* file_path,
     base::Time* last_modified_time) {
+  // NOTE: ExtensionResource::GetFilePath() must be called on a sequence which
+  // tolerates blocking operations.
   *file_path = resource.GetFilePath();
   *last_modified_time = GetFileLastModifiedTime(*file_path);
   // While we're here, log the delta between extension directory
@@ -737,70 +740,19 @@
   DISALLOW_COPY_AND_ASSIGN(FileLoaderObserver);
 };
 
-void LoadExtensionResourceFromFileOnBackgroundSequence(
-    const network::ResourceRequest& request,
-    const std::string& extension_id,
-    const base::FilePath& directory_path,
-    const base::FilePath& relative_path,
-    network::mojom::URLLoaderRequest loader,
-    network::mojom::URLLoaderClientPtrInfo client_info,
-    scoped_refptr<ContentVerifyJob> verify_job,
-    scoped_refptr<net::HttpResponseHeaders> extra_response_headers) {
-  // NOTE: ExtensionResource::GetFilePath() must be called on a sequence which
-  // tolerates blocking operations.
-  ExtensionResource resource(extension_id, directory_path, relative_path);
-  network::mojom::URLLoaderClientPtr client;
-  client.Bind(std::move(client_info));
-
-  auto loader_observer =
-      std::make_unique<FileLoaderObserver>(std::move(verify_job));
-
-  network::ResourceRequest file_request = request;
-  file_request.url = net::FilePathToFileURL(resource.GetFilePath());
-  content::CreateFileURLLoader(file_request, std::move(loader),
-                               std::move(client), std::move(loader_observer),
-                               std::move(extra_response_headers));
-}
-
-void CreateVerifierAndLoadFile(
-    const network::ResourceRequest& request,
-    const std::string& extension_id,
-    const base::FilePath& directory_path,
-    const base::FilePath& relative_path,
-    network::mojom::URLLoaderRequest loader,
-    network::mojom::URLLoaderClientPtr client,
-    scoped_refptr<extensions::InfoMap> extension_info_map,
-    scoped_refptr<net::HttpResponseHeaders> extra_response_headers) {
-  scoped_refptr<ContentVerifyJob> verify_job;
-  ContentVerifier* verifier = extension_info_map->content_verifier();
-  if (verifier) {
-    verify_job =
-        verifier->CreateJobFor(extension_id, directory_path, relative_path);
-    if (verify_job)
-      verify_job->Start();
-  }
-
-  auto task_runner = base::CreateSequencedTaskRunnerWithTraits(
-      {base::MayBlock(), base::TaskPriority::BACKGROUND});
-  task_runner->PostTask(
-      FROM_HERE,
-      base::BindOnce(&LoadExtensionResourceFromFileOnBackgroundSequence,
-                     request, extension_id, directory_path, relative_path,
-                     std::move(loader), client.PassInterface(),
-                     std::move(verify_job), std::move(extra_response_headers)));
-}
-
 class ExtensionURLLoaderFactory : public network::mojom::URLLoaderFactory {
  public:
   // |frame_host| is the RenderFrameHost which is either being navigated or
   // loading a subresource. For navigation requests, |frame_url| is empty; for
   // subresource requests it's the URL of the currently committed navigation on
   // |frame_host|.
-  explicit ExtensionURLLoaderFactory(content::RenderFrameHost* frame_host,
-                                     const GURL& frame_url)
+  explicit ExtensionURLLoaderFactory(
+      content::RenderFrameHost* frame_host,
+      const GURL& frame_url,
+      scoped_refptr<extensions::InfoMap> extension_info_map)
       : frame_host_(frame_host),
         frame_url_(frame_url),
-        extension_info_map_(nullptr) {}
+        extension_info_map_(std::move(extension_info_map)) {}
   ~ExtensionURLLoaderFactory() override = default;
 
   // network::mojom::URLLoaderFactory:
@@ -812,34 +764,53 @@
                             network::mojom::URLLoaderClientPtr client,
                             const net::MutableNetworkTrafficAnnotationTag&
                                 traffic_annotation) override {
-    content::RenderProcessHost* process_host = frame_host_->GetProcess();
-    content::BrowserContext* browser_context =
-        process_host->GetBrowserContext();
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    const content::RenderProcessHost* process_host = frame_host_->GetProcess();
+    BrowserContext* browser_context = process_host->GetBrowserContext();
+
+    const std::string extension_id = request.url.host();
     ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context);
-    std::string extension_id = request.url.host();
-    const Extension* extension = registry->GetInstalledExtension(extension_id);
+    scoped_refptr<const Extension> extension =
+        registry->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING);
+    const ExtensionSet& enabled_extensions = registry->enabled_extensions();
+    const ProcessMap* process_map = ProcessMap::Get(browser_context);
+    bool incognito_enabled =
+        extensions::util::IsIncognitoEnabled(extension_id, browser_context);
 
     if (!AllowExtensionResourceLoad(
             request.url,
             static_cast<content::ResourceType>(request.resource_type),
             static_cast<ui::PageTransition>(request.transition_type),
-            process_host->GetID(), browser_context->IsOffTheRecord(), extension,
-            util::IsIncognitoEnabled(extension_id, browser_context),
-            registry->enabled_extensions(),
-            *ProcessMap::Get(browser_context))) {
+            process_host->GetID(), browser_context->IsOffTheRecord(),
+            extension.get(), incognito_enabled, enabled_extensions,
+            *process_map)) {
       client->OnComplete(
           network::URLLoaderCompletionStatus(net::ERR_BLOCKED_BY_CLIENT));
       return;
     }
 
     base::FilePath directory_path;
-    if (!GetDirectoryForExtensionURL(request.url, extension_id, extension,
+    if (!GetDirectoryForExtensionURL(request.url, extension_id, extension.get(),
                                      registry->disabled_extensions(),
                                      &directory_path)) {
       client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
+    LoadExtension(std::move(loader), request, std::move(client), extension,
+                  std::move(directory_path));
+  }
+
+  void Clone(network::mojom::URLLoaderFactoryRequest request) override {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+ private:
+  void LoadExtension(network::mojom::URLLoaderRequest loader,
+                     const network::ResourceRequest& request,
+                     network::mojom::URLLoaderClientPtr client,
+                     scoped_refptr<const Extension> extension,
+                     base::FilePath directory_path) {
     // Set up content security policy.
     std::string content_security_policy;
     bool send_cors_header = false;
@@ -849,7 +820,7 @@
           WebViewGuest::FromWebContents(
               content::WebContents::FromRenderFrameHost(frame_host_)) !=
           nullptr;
-      GetSecurityPolicyForURL(request.url, extension, is_web_view_request,
+      GetSecurityPolicyForURL(request.url, extension.get(), is_web_view_request,
                               &content_security_policy, &send_cors_header,
                               &follow_symlinks_anywhere);
     }
@@ -864,8 +835,8 @@
       head.headers = BuildHttpHeaders(content_security_policy,
                                       send_cors_headers, base::Time());
       std::string contents;
-      GenerateBackgroundPageContents(extension, &head.mime_type, &head.charset,
-                                     &contents);
+      GenerateBackgroundPageContents(extension.get(), &head.mime_type,
+                                     &head.charset, &contents);
       uint32_t size = base::saturated_cast<uint32_t>(contents.size());
       mojo::DataPipe pipe(size);
       MojoResult result = pipe.producer_handle->WriteData(
@@ -881,9 +852,18 @@
       return;
     }
 
-    // TODO(crbug.com/782025): Support component extension resource loading from
-    // the embedder's resource files. This would be the right place to try to
-    // resolve such resources, before we attempt to hit other files on disk.
+    // Component extension resources may be part of the embedder's resource
+    // files, for example component_extension_resources.pak in Chrome.
+    int resource_id = 0;
+    const base::FilePath bundle_resource_path =
+        ExtensionsBrowserClient::Get()->GetBundleResourcePath(
+            request, directory_path, &resource_id);
+    if (!bundle_resource_path.empty()) {
+      ExtensionsBrowserClient::Get()->LoadResourceFromResourceBundle(
+          request, std::move(loader), bundle_resource_path, resource_id,
+          content_security_policy, std::move(client), send_cors_header);
+      return;
+    }
 
     base::FilePath relative_path =
         file_util::ExtensionURLToRelativeFilePath(request.url);
@@ -899,15 +879,20 @@
 
     // Handle shared resources (extension A loading resources out of extension
     // B).
+    std::string extension_id = extension->id();
     std::string path = request.url.path();
     if (SharedModuleInfo::IsImportedPath(path)) {
       std::string new_extension_id;
       std::string new_relative_path;
       SharedModuleInfo::ParseImportedPath(path, &new_extension_id,
                                           &new_relative_path);
+      BrowserContext* browser_context =
+          frame_host_->GetProcess()->GetBrowserContext();
+      ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context);
       const Extension* new_extension =
           registry->enabled_extensions().GetByID(new_extension_id);
-      if (SharedModuleInfo::ImportsExtensionById(extension, new_extension_id) &&
+      if (SharedModuleInfo::ImportsExtensionById(extension.get(),
+                                                 new_extension_id) &&
           new_extension) {
         directory_path = new_extension->path();
         extension_id = new_extension_id;
@@ -922,29 +907,74 @@
     if (g_test_handler)
       g_test_handler->Run(&directory_path, &relative_path);
 
-    if (!extension_info_map_) {
-      extension_info_map_ =
-          extensions::ExtensionSystem::Get(browser_context)->info_map();
-    }
+    extensions::ExtensionResource resource(extension_id, directory_path,
+                                           relative_path);
+    if (follow_symlinks_anywhere)
+      resource.set_follow_symlinks_anywhere();
+
+    base::FilePath* read_file_path = new base::FilePath;
+    base::Time* last_modified_time = new base::Time();
+
+    scoped_refptr<ContentVerifier> content_verifier =
+        extension_info_map_->content_verifier();
+    base::PostTaskWithTraitsAndReply(
+        FROM_HERE, {base::MayBlock()},
+        base::BindOnce(&ReadResourceFilePathAndLastModifiedTime, resource,
+                       directory_path, base::Unretained(read_file_path),
+                       base::Unretained(last_modified_time)),
+        base::BindOnce(
+            &OnFilePathAndLastModifiedTimeRead, base::Owned(read_file_path),
+            base::Owned(last_modified_time), request, std::move(loader),
+            std::move(client), std::move(content_verifier), resource,
+            content_security_policy, send_cors_header));
+  }
+
+  static void OnFilePathAndLastModifiedTimeRead(
+      const base::FilePath* read_file_path,
+      const base::Time* last_modified_time,
+      network::ResourceRequest request,
+      network::mojom::URLLoaderRequest loader,
+      network::mojom::URLLoaderClientPtr client,
+      scoped_refptr<ContentVerifier> content_verifier,
+      const extensions::ExtensionResource& resource,
+      const std::string& content_security_policy,
+      bool send_cors_header) {
+    request.url = net::FilePathToFileURL(*read_file_path);
 
     content::BrowserThread::PostTask(
         content::BrowserThread::IO, FROM_HERE,
-        base::BindOnce(&CreateVerifierAndLoadFile, request, extension_id,
-                       directory_path, relative_path, std::move(loader),
-                       std::move(client), extension_info_map_,
-                       BuildHttpHeaders(content_security_policy,
-                                        send_cors_header, base::Time())));
+        base::BindOnce(
+            &StartVerifyJob, std::move(request), std::move(loader),
+            std::move(client), std::move(content_verifier), resource,
+            BuildHttpHeaders(content_security_policy, send_cors_header,
+                             *last_modified_time)));
   }
 
-  void Clone(network::mojom::URLLoaderFactoryRequest request) override {
-    bindings_.AddBinding(this, std::move(request));
+  static void StartVerifyJob(
+      network::ResourceRequest request,
+      network::mojom::URLLoaderRequest loader,
+      network::mojom::URLLoaderClientPtr client,
+      scoped_refptr<ContentVerifier> content_verifier,
+      const ExtensionResource& resource,
+      scoped_refptr<net::HttpResponseHeaders> response_headers) {
+    ContentVerifyJob* verify_job = nullptr;
+    if (content_verifier) {
+      verify_job = content_verifier->CreateJobFor(resource.extension_id(),
+                                                  resource.extension_root(),
+                                                  resource.relative_path());
+      if (verify_job)
+        verify_job->Start();
+    }
+
+    content::CreateFileURLLoader(
+        request, std::move(loader), std::move(client),
+        std::make_unique<FileLoaderObserver>(verify_job),
+        std::move(response_headers));
   }
 
- private:
   content::RenderFrameHost* const frame_host_;
   const GURL frame_url_;
   scoped_refptr<extensions::InfoMap> extension_info_map_;
-
   mojo::BindingSet<network::mojom::URLLoaderFactory> bindings_;
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionURLLoaderFactory);
@@ -1003,14 +1033,17 @@
 
 std::unique_ptr<network::mojom::URLLoaderFactory>
 CreateExtensionNavigationURLLoaderFactory(
-    content::RenderFrameHost* frame_host) {
-  return std::make_unique<ExtensionURLLoaderFactory>(frame_host, GURL());
+    content::RenderFrameHost* frame_host,
+    scoped_refptr<extensions::InfoMap> extension_info_map) {
+  return std::make_unique<ExtensionURLLoaderFactory>(
+      frame_host, GURL(), std::move(extension_info_map));
 }
 
 std::unique_ptr<network::mojom::URLLoaderFactory>
 MaybeCreateExtensionSubresourceURLLoaderFactory(
     content::RenderFrameHost* frame_host,
-    const GURL& frame_url) {
+    const GURL& frame_url,
+    scoped_refptr<extensions::InfoMap> extension_info_map) {
   // Ensure we have a non-empty URL so that the factory we create knows it's
   // only for subresources.
   CHECK(!frame_url.is_empty());
@@ -1021,7 +1054,8 @@
   // any extension's web accessible resources. For now we always create a
   // factory, because the loader itself correctly prevents disallowed resources
   // from loading in an invalid context.
-  return std::make_unique<ExtensionURLLoaderFactory>(frame_host, frame_url);
+  return std::make_unique<ExtensionURLLoaderFactory>(
+      frame_host, frame_url, std::move(extension_info_map));
 }
 
 }  // namespace extensions
diff --git a/extensions/browser/extension_protocols.h b/extensions/browser/extension_protocols.h
index d324978..4188fdc 100644
--- a/extensions/browser/extension_protocols.h
+++ b/extensions/browser/extension_protocols.h
@@ -56,7 +56,9 @@
 // Creates a new network::mojom::URLLoaderFactory implementation suitable for
 // handling navigation requests to extension URLs.
 std::unique_ptr<network::mojom::URLLoaderFactory>
-CreateExtensionNavigationURLLoaderFactory(content::RenderFrameHost* frame_host);
+CreateExtensionNavigationURLLoaderFactory(
+    content::RenderFrameHost* frame_host,
+    scoped_refptr<extensions::InfoMap> extension_info_map);
 
 // Attempts to create a network::mojom::URLLoaderFactory implementation suitable
 // for handling subresource requests for extension URLs from |frame_host|. May
@@ -65,7 +67,8 @@
 std::unique_ptr<network::mojom::URLLoaderFactory>
 MaybeCreateExtensionSubresourceURLLoaderFactory(
     content::RenderFrameHost* frame_host,
-    const GURL& frame_url);
+    const GURL& frame_url,
+    scoped_refptr<extensions::InfoMap> extension_info_map);
 
 }  // namespace extensions
 
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index 29a89cc7..7b5ff6b 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -141,6 +141,23 @@
       const std::string& content_security_policy,
       bool send_cors_header) = 0;
 
+  // Return the resource relative path and id for the given request.
+  virtual base::FilePath GetBundleResourcePath(
+      const network::ResourceRequest& request,
+      const base::FilePath& extension_resources_path,
+      int* resource_id) const = 0;
+
+  // Creates and starts a URLLoader to load an extension resource from the
+  // embedder's resource bundle (.pak) files. Used for component extensions.
+  virtual void LoadResourceFromResourceBundle(
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      const base::FilePath& resource_relative_path,
+      int resource_id,
+      const std::string& content_security_policy,
+      network::mojom::URLLoaderClientPtr client,
+      bool send_cors_header) = 0;
+
   // Returns true if the embedder wants to allow a chrome-extension:// resource
   // request coming from renderer A to access a resource in an extension running
   // in renderer B. For example, Chrome overrides this to provide support for
diff --git a/extensions/browser/test_extensions_browser_client.cc b/extensions/browser/test_extensions_browser_client.cc
index d0d5dff5..1975203 100644
--- a/extensions/browser/test_extensions_browser_client.cc
+++ b/extensions/browser/test_extensions_browser_client.cc
@@ -131,6 +131,26 @@
   return nullptr;
 }
 
+base::FilePath TestExtensionsBrowserClient::GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id) const {
+  *resource_id = 0;
+  return base::FilePath();
+}
+
+void TestExtensionsBrowserClient::LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header) {
+  // Should not be called because GetBundleResourcePath() returned empty path.
+  NOTREACHED() << "Resource is not from a bundle.";
+}
+
 bool TestExtensionsBrowserClient::AllowCrossRendererResourceLoad(
     const GURL& url,
     content::ResourceType resource_type,
diff --git a/extensions/browser/test_extensions_browser_client.h b/extensions/browser/test_extensions_browser_client.h
index 3afe7ea7..9e0210d 100644
--- a/extensions/browser/test_extensions_browser_client.h
+++ b/extensions/browser/test_extensions_browser_client.h
@@ -87,6 +87,19 @@
       const base::FilePath& directory_path,
       const std::string& content_security_policy,
       bool send_cors_header) override;
+  base::FilePath GetBundleResourcePath(
+      const network::ResourceRequest& request,
+      const base::FilePath& extension_resources_path,
+      int* resource_id) const override;
+  void LoadResourceFromResourceBundle(
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      const base::FilePath& resource_relative_path,
+      int resource_id,
+      const std::string& content_security_policy,
+      network::mojom::URLLoaderClientPtr client,
+      bool send_cors_header) override;
+
   bool AllowCrossRendererResourceLoad(const GURL& url,
                                       content::ResourceType resource_type,
                                       ui::PageTransition page_transition,
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
index 2b007fc..ffd47c1 100644
--- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
+++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
@@ -163,7 +163,7 @@
   // The plugin resource request should skip service workers since "plug-ins
   // may get their security origins from their own urls".
   // https://w3c.github.io/ServiceWorker/#implementer-concerns
-  request.SetServiceWorkerMode(blink::WebURLRequest::ServiceWorkerMode::kNone);
+  request.SetSkipServiceWorker(true);
   loader_->LoadAsynchronously(request, this);
 }
 
diff --git a/extensions/shell/browser/shell_extension_system.cc b/extensions/shell/browser/shell_extension_system.cc
index ad959ad..9d39b66 100644
--- a/extensions/shell/browser/shell_extension_system.cc
+++ b/extensions/shell/browser/shell_extension_system.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "apps/launcher.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
@@ -14,7 +15,6 @@
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
-#include "extensions/browser/api/app_runtime/app_runtime_api.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/info_map.h"
@@ -25,7 +25,6 @@
 #include "extensions/browser/runtime_data.h"
 #include "extensions/browser/service_worker_manager.h"
 #include "extensions/browser/value_store/value_store_factory_impl.h"
-#include "extensions/common/api/app_runtime.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/file_util.h"
 
@@ -110,8 +109,7 @@
   const Extension* extension = ExtensionRegistry::Get(browser_context_)
                                    ->enabled_extensions()
                                    .GetByID(extension_id);
-  AppRuntimeEventRouter::DispatchOnLaunchedEvent(browser_context_, extension,
-                                                 SOURCE_UNTRACKED, nullptr);
+  apps::LaunchPlatformApp(browser_context_, extension, SOURCE_UNTRACKED);
 }
 
 void ShellExtensionSystem::Shutdown() {
diff --git a/extensions/shell/browser/shell_extensions_browser_client.cc b/extensions/shell/browser/shell_extensions_browser_client.cc
index f17d26f7..f21f331 100644
--- a/extensions/shell/browser/shell_extensions_browser_client.cc
+++ b/extensions/shell/browser/shell_extensions_browser_client.cc
@@ -123,6 +123,25 @@
   return NULL;
 }
 
+base::FilePath ShellExtensionsBrowserClient::GetBundleResourcePath(
+    const network::ResourceRequest& request,
+    const base::FilePath& extension_resources_path,
+    int* resource_id) const {
+  *resource_id = 0;
+  return base::FilePath();
+}
+
+void ShellExtensionsBrowserClient::LoadResourceFromResourceBundle(
+    const network::ResourceRequest& request,
+    network::mojom::URLLoaderRequest loader,
+    const base::FilePath& resource_relative_path,
+    int resource_id,
+    const std::string& content_security_policy,
+    network::mojom::URLLoaderClientPtr client,
+    bool send_cors_header) {
+  NOTREACHED() << "Load resources from bundles not supported.";
+}
+
 bool ShellExtensionsBrowserClient::AllowCrossRendererResourceLoad(
     const GURL& url,
     content::ResourceType resource_type,
diff --git a/extensions/shell/browser/shell_extensions_browser_client.h b/extensions/shell/browser/shell_extensions_browser_client.h
index d79e83e..df7ee34 100644
--- a/extensions/shell/browser/shell_extensions_browser_client.h
+++ b/extensions/shell/browser/shell_extensions_browser_client.h
@@ -6,6 +6,8 @@
 #define EXTENSIONS_SHELL_BROWSER_SHELL_EXTENSIONS_BROWSER_CLIENT_H_
 
 #include <memory>
+#include <string>
+#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -57,6 +59,18 @@
       const base::FilePath& directory_path,
       const std::string& content_security_policy,
       bool send_cors_header) override;
+  base::FilePath GetBundleResourcePath(
+      const network::ResourceRequest& request,
+      const base::FilePath& extension_resources_path,
+      int* resource_id) const override;
+  void LoadResourceFromResourceBundle(
+      const network::ResourceRequest& request,
+      network::mojom::URLLoaderRequest loader,
+      const base::FilePath& resource_relative_path,
+      int resource_id,
+      const std::string& content_security_policy,
+      network::mojom::URLLoaderClientPtr client,
+      bool send_cors_header) override;
   bool AllowCrossRendererResourceLoad(const GURL& url,
                                       content::ResourceType resource_type,
                                       ui::PageTransition page_transition,
diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc
index 2a8a971..2413e80 100644
--- a/gin/array_buffer.cc
+++ b/gin/array_buffer.cc
@@ -43,90 +43,10 @@
   return malloc(length);
 }
 
-void* ArrayBufferAllocator::Reserve(size_t length) {
-#if BUILDFLAG(USE_PARTITION_ALLOC)
-  const bool commit = false;
-  return base::AllocPages(nullptr, length, base::kPageAllocationGranularity,
-                          base::PageInaccessible, base::PageTag::kChromium,
-                          commit);
-#elif defined(OS_POSIX)
-  int const access_flag = PROT_NONE;
-  void* const ret =
-      mmap(nullptr, length, access_flag, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-  if (ret == MAP_FAILED) {
-    return nullptr;
-  }
-  return ret;
-#else
-  DWORD const access_flag = PAGE_NOACCESS;
-  return VirtualAlloc(hint, length, MEM_RESERVE, access_flag);
-#endif
-}
-
 void ArrayBufferAllocator::Free(void* data, size_t length) {
   free(data);
 }
 
-void ArrayBufferAllocator::Free(void* data,
-                                size_t length,
-                                AllocationMode mode) {
-  switch (mode) {
-    case AllocationMode::kNormal:
-      Free(data, length);
-      return;
-    case AllocationMode::kReservation:
-#if BUILDFLAG(USE_PARTITION_ALLOC)
-      base::FreePages(data, length);
-#elif defined(OS_POSIX)
-      CHECK(!munmap(data, length));
-#else
-      CHECK(VirtualFree(data, 0, MEM_RELEASE));
-#endif
-      return;
-    default:
-      NOTREACHED();
-  }
-}
-
-void ArrayBufferAllocator::SetProtection(void* data,
-                                         size_t length,
-                                         Protection protection) {
-#if BUILDFLAG(USE_PARTITION_ALLOC)
-  switch (protection) {
-    case Protection::kNoAccess:
-      CHECK(base::SetSystemPagesAccess(data, length, base::PageInaccessible));
-      break;
-    case Protection::kReadWrite:
-      CHECK(base::SetSystemPagesAccess(data, length, base::PageReadWrite));
-      break;
-    default:
-      NOTREACHED();
-  }
-#elif defined(OS_POSIX)
-  switch (protection) {
-    case Protection::kNoAccess:
-      CHECK_EQ(0, mprotect(data, length, PROT_NONE));
-      break;
-    case Protection::kReadWrite:
-      CHECK_EQ(0, mprotect(data, length, PROT_READ | PROT_WRITE));
-      break;
-    default:
-      NOTREACHED();
-  }
-#else   // !defined(OS_POSIX)
-  switch (protection) {
-    case Protection::kNoAccess:
-      CHECK_NE(0, VirtualFree(data, length, MEM_DECOMMIT));
-      break;
-    case Protection::kReadWrite:
-      CHECK_NE(nullptr, VirtualAlloc(data, length, MEM_COMMIT, PAGE_READWRITE));
-      break;
-    default:
-      NOTREACHED();
-  }
-#endif  // !defined(OS_POSIX)
-}
-
 ArrayBufferAllocator* ArrayBufferAllocator::SharedInstance() {
   static ArrayBufferAllocator* instance = new ArrayBufferAllocator();
   return instance;
@@ -198,11 +118,13 @@
   // Take ownership of the array buffer.
   CHECK(!array->IsExternal());
   v8::ArrayBuffer::Contents contents = array->Externalize();
+  // We shouldn't receive large page-allocated array buffers.
+  CHECK_NE(v8::ArrayBuffer::Allocator::AllocationMode::kReservation,
+           contents.AllocationMode());
   buffer_ = contents.Data();
   length_ = contents.ByteLength();
   allocation_base_ = contents.AllocationBase();
   allocation_length_ = contents.AllocationLength();
-  allocation_mode_ = contents.AllocationMode();
 
   DCHECK(reinterpret_cast<uintptr_t>(allocation_base_) <=
          reinterpret_cast<uintptr_t>(buffer_));
@@ -219,8 +141,8 @@
 }
 
 ArrayBuffer::Private::~Private() {
-  PerIsolateData::From(isolate_)->allocator()->Free(
-      allocation_base_, allocation_length_, allocation_mode_);
+  PerIsolateData::From(isolate_)->allocator()->Free(allocation_base_,
+                                                    allocation_length_);
 }
 
 void ArrayBuffer::Private::FirstWeakCallback(
diff --git a/gin/array_buffer.h b/gin/array_buffer.h
index 0b2b1ecf..2aef366a 100644
--- a/gin/array_buffer.h
+++ b/gin/array_buffer.h
@@ -21,11 +21,7 @@
  public:
   void* Allocate(size_t length) override;
   void* AllocateUninitialized(size_t length) override;
-  void* Reserve(size_t length) override;
   void Free(void* data, size_t length) override;
-  void Free(void* data, size_t length, AllocationMode mode) override;
-
-  void SetProtection(void* data, size_t length, Protection protection) override;
 
   GIN_EXPORT static ArrayBufferAllocator* SharedInstance();
 };
diff --git a/gin/array_buffer_unittest.cc b/gin/array_buffer_unittest.cc
index 479808d5..b19ff7bc 100644
--- a/gin/array_buffer_unittest.cc
+++ b/gin/array_buffer_unittest.cc
@@ -8,11 +8,6 @@
 #include "gin/public/isolate_holder.h"
 #include "gin/test/v8_test.h"
 
-#if defined(OS_POSIX)
-#include <setjmp.h>
-#include <signal.h>
-#endif
-
 namespace gin {
 
 using ArrayBufferTest = V8Test;
@@ -21,94 +16,17 @@
 const size_t kBufferLength = 65536;
 }
 
+// Make sure we can allocate, access and free memory.
 TEST_F(ArrayBufferTest, AllocateAndFreeBuffer) {
   v8::Isolate* const isolate = instance_->isolate();
   v8::ArrayBuffer::Allocator* const allocator =
       PerIsolateData::From(isolate)->allocator();
 
   void* buffer = allocator->Allocate(kBufferLength);
+  char* buffer0 = reinterpret_cast<char*>(buffer);
+  *buffer0 = '0';  // ASCII zero
+  CHECK_EQ('0', *buffer0);
   allocator->Free(buffer, kBufferLength);
 }
 
-TEST_F(ArrayBufferTest, ReserveAndReleaseBuffer) {
-  v8::Isolate* const isolate = instance_->isolate();
-  v8::ArrayBuffer::Allocator* const allocator =
-      PerIsolateData::From(isolate)->allocator();
-
-  void* buffer = allocator->Reserve(kBufferLength);
-  allocator->Free(buffer, kBufferLength,
-                  v8::ArrayBuffer::Allocator::AllocationMode::kReservation);
-}
-
-TEST_F(ArrayBufferTest, SetProtectionReadWrite) {
-  v8::Isolate* const isolate = instance_->isolate();
-  v8::ArrayBuffer::Allocator* const allocator =
-      PerIsolateData::From(isolate)->allocator();
-
-  void* buffer = allocator->Reserve(kBufferLength);
-  allocator->SetProtection(buffer, kBufferLength,
-                           v8::ArrayBuffer::Allocator::Protection::kReadWrite);
-  volatile int* int_buffer = static_cast<volatile int*>(buffer);
-  // Try assigning to the buffer. This will fault if we don't SetProtection
-  // first.
-  int_buffer[0] = 42;
-  allocator->Free(buffer, kBufferLength,
-                  v8::ArrayBuffer::Allocator::AllocationMode::kReservation);
-}
-
-#if defined(OS_POSIX)
-
-namespace {
-sigjmp_buf g_continuation_;
-
-void SignalHandler(int signal, siginfo_t* info, void*) {
-  siglongjmp(g_continuation_, 1);
-}
-}  // namespace
-
-TEST_F(ArrayBufferTest, ReservationReadOnlyByDefault) {
-  v8::Isolate* const isolate = instance_->isolate();
-  v8::ArrayBuffer::Allocator* const allocator =
-      PerIsolateData::From(isolate)->allocator();
-
-  void* buffer = allocator->Reserve(kBufferLength);
-  volatile int* int_buffer = static_cast<volatile int*>(buffer);
-
-  // Install a signal handler so we can catch the fault we're about to trigger.
-  struct sigaction action = {};
-  struct sigaction old_action = {};
-  action.sa_sigaction = SignalHandler;
-  sigemptyset(&action.sa_mask);
-  action.sa_flags = SA_SIGINFO;
-  sigaction(SIGSEGV, &action, &old_action);
-#if defined(OS_MACOSX)
-  // On Mac, sometimes we get SIGBUS instead of SIGSEGV.
-  struct sigaction old_bus_action;
-  sigaction(SIGBUS, &action, &old_bus_action);
-#endif
-
-  int const save_sigs = 1;
-  if (!sigsetjmp(g_continuation_, save_sigs)) {
-    // Try assigning to the buffer. This will fault if we don't SetProtection
-    // first.
-    int_buffer[0] = 42;
-  } else {
-    // if sigsetjmp returns nonzero, then we are returning from our handler.
-
-    sigaction(SIGSEGV, &old_action, nullptr);
-#if defined(OS_MACOSX)
-    sigaction(SIGBUS, &old_bus_action, nullptr);
-#endif
-
-    allocator->Free(buffer, kBufferLength,
-                    v8::ArrayBuffer::Allocator::AllocationMode::kReservation);
-    SUCCEED();
-    return;
-  }
-
-  FAIL();
-}
-
-#endif  // OS_POSIX
-
 }  // namespace gin
diff --git a/gpu/command_buffer/build_cmd_buffer_lib.py b/gpu/command_buffer/build_cmd_buffer_lib.py
index 52a24e4..6e869597c1 100644
--- a/gpu/command_buffer/build_cmd_buffer_lib.py
+++ b/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -804,8 +804,8 @@
     """Writes the GLES2 Implemention."""
     impl_func = func.GetInfo('impl_func', True)
     if func.can_auto_generate and impl_func:
-      f.write("%s GLES2Implementation::%s(%s) {\n" %
-                 (func.return_type, func.original_name,
+      f.write("%s %sImplementation::%s(%s) {\n" %
+                 (func.return_type, _prefix,  func.original_name,
                   func.MakeTypedOriginalArgString("")))
       f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
       self.WriteClientGLCallLog(func, f)
@@ -847,7 +847,7 @@
     client_test = func.GetInfo('client_test', True)
     if func.can_auto_generate and client_test:
       code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   struct Cmds {
     cmds::%(name)s cmd;
   };
@@ -867,6 +867,7 @@
       ]
 
       f.write(code % {
+            'prefix' : _prefix,
             'name': func.name,
             'args': ", ".join(gl_arg_strings),
             'cmd_args': ", ".join(cmd_arg_strings),
@@ -877,7 +878,8 @@
       constants = [arg for arg in func.GetOriginalArgs() if arg.IsConstant()]
       if constants:
         code = """
-TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
+TEST_F(%(prefix)sImplementationTest,
+    %(name)sInvalidConstantArg%(invalid_index)d) {
   gl_->%(name)s(%(args)s);
   EXPECT_TRUE(NoCommandsWritten());
   EXPECT_EQ(%(gl_error)s, CheckError());
@@ -893,6 +895,7 @@
               gl_arg_strings.append(arg.GetValidClientSideArg(func))
 
           f.write(code % {
+            'prefix' : _prefix,
             'name': func.name,
             'invalid_index': func.GetOriginalArgs().index(invalid_arg),
             'args': ", ".join(gl_arg_strings),
@@ -905,8 +908,8 @@
       arg.WriteDestinationInitalizationValidation(f, func)
 
   def WriteTraceEvent(self, func, f):
-    f.write('  TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' %
-               func.original_name)
+    f.write('  TRACE_EVENT0("gpu", "%sImplementation::%s");\n' %
+               (_prefix, func.original_name))
 
   def WriteImmediateCmdComputeSize(self, _func, f):
     """Writes the size computation code for the immediate version of a cmd."""
@@ -935,7 +938,7 @@
   def WriteCmdHelper(self, func, f):
     """Writes the cmd helper definition for a cmd."""
     code = """  void %(name)s(%(typed_args)s) {
-    gles2::cmds::%(name)s* c = GetCmdSpace<gles2::cmds::%(name)s>();
+    %(lp)s::cmds::%(name)s* c = GetCmdSpace<%(lp)s::cmds::%(name)s>();
     if (c) {
       c->Init(%(args)s);
     }
@@ -943,6 +946,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedCmdArgString(""),
           "args": func.MakeCmdArgString(""),
@@ -952,8 +956,8 @@
     """Writes the cmd helper definition for the immediate version of a cmd."""
     code = """  void %(name)s(%(typed_args)s) {
     const uint32_t s = 0;
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(s);
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpaceTotalSize<%(lp)s::cmds::%(name)s>(s);
     if (c) {
       c->Init(%(args)s);
     }
@@ -961,6 +965,7 @@
 
 """
     f.write(code % {
+           "lp" : _lower_prefix,
            "name": func.name,
            "typed_args": func.MakeTypedCmdArgString(""),
            "args": func.MakeCmdArgString(""),
@@ -1487,8 +1492,8 @@
 
     impl_func = func.GetInfo('impl_func', True)
     if func.can_auto_generate and impl_func:
-      f.write("%s GLES2Implementation::%s(%s) {\n" %
-                 (func.return_type, func.original_name,
+      f.write("%s %sImplementation::%s(%s) {\n" %
+                 (func.return_type, _prefix, func.original_name,
                   func.MakeTypedOriginalArgString("")))
       f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
       func.WriteDestinationInitalizationValidation(f)
@@ -1520,7 +1525,7 @@
     if not client_test:
       return
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   struct Cmds {
     cmds::%(name)s cmd;
   };
@@ -1545,6 +1550,7 @@
     ]
 
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'args': ", ".join(gl_arg_strings),
           'cmd_args': ", ".join(cmd_arg_strings),
@@ -1600,6 +1606,7 @@
     args = {
         'log_code': log_code,
         'return_type': func.return_type,
+        'prefix' : _prefix,
         'name': func.original_name,
         'typed_args': func.MakeTypedOriginalArgString(""),
         'args': func.MakeOriginalArgString(""),
@@ -1607,7 +1614,8 @@
         'count_name': func.GetOriginalArgs()[0].name,
       }
     f.write(
-        "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
+        "%(return_type)s %(prefix)sImplementation::"
+        "%(name)s(%(typed_args)s) {\n" %
         args)
     func.WriteDestinationInitalizationValidation(f)
     self.WriteClientGLCallLog(func, f)
@@ -1648,7 +1656,7 @@
   def WriteGLES2ImplementationUnitTest(self, func, f):
     """Overrriden from TypeHandler."""
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   GLuint ids[2] = { 0, };
   struct Cmds {
     cmds::%(name)sImmediate gen;
@@ -1665,6 +1673,7 @@
 }
 """
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'types': func.GetInfo('resource_types'),
         })
@@ -1780,9 +1789,9 @@
   def WriteImmediateCmdHelper(self, func, f):
     """Overrriden from TypeHandler."""
     code = """  void %(name)s(%(typed_args)s) {
-    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
+    const uint32_t size = %(lp)s::cmds::%(name)s::ComputeSize(n);
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpaceTotalSize<%(lp)s::cmds::%(name)s>(size);
     if (c) {
       c->Init(%(args)s);
     }
@@ -1790,6 +1799,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedOriginalArgString(""),
           "args": func.MakeOriginalArgString(""),
@@ -1921,8 +1931,8 @@
 
   def WriteGLES2Implementation(self, func, f):
     """Overrriden from TypeHandler."""
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
+    f.write("%s %sImplementation::%s(%s) {\n" %
+               (func.return_type, _prefix, func.original_name,
                 func.MakeTypedOriginalArgString("")))
     f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
     func.WriteDestinationInitalizationValidation(f)
@@ -1972,8 +1982,8 @@
 
   def WriteGLES2Implementation(self, func, f):
     """Overrriden from TypeHandler."""
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
+    f.write("%s %sImplementation::%s(%s) {\n" %
+               (func.return_type, _prefix, func.original_name,
                 func.MakeTypedOriginalArgString("")))
     f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
     func.WriteDestinationInitalizationValidation(f)
@@ -2018,7 +2028,7 @@
   def WriteGLES2ImplementationUnitTest(self, func, f):
     """Overrriden from TypeHandler."""
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   GLuint ids[2] = { k%(types)sStartId, k%(types)sStartId + 1 };
   struct Cmds {
     cmds::%(name)sImmediate del;
@@ -2033,6 +2043,7 @@
 }
 """
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'types': func.GetInfo('resource_types'),
         })
@@ -2120,6 +2131,7 @@
     if impl_func:
       args = {
           'return_type': func.return_type,
+          'prefix' : _prefix,
           'name': func.original_name,
           'typed_args': func.MakeTypedOriginalArgString(""),
           'args': func.MakeOriginalArgString(""),
@@ -2127,7 +2139,8 @@
           'count_name': func.GetOriginalArgs()[0].name,
         }
       f.write(
-          "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
+          "%(return_type)s %(prefix)sImplementation::"
+          "%(name)s(%(typed_args)s) {\n" %
           args)
       f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
       func.WriteDestinationInitalizationValidation(f)
@@ -2206,9 +2219,9 @@
   def WriteImmediateCmdHelper(self, func, f):
     """Overrriden from TypeHandler."""
     code = """  void %(name)s(%(typed_args)s) {
-    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
+    const uint32_t size = %(lp)s::cmds::%(name)s::ComputeSize(n);
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpaceTotalSize<%(lp)s::cmds::%(name)s>(size);
     if (c) {
       c->Init(%(args)s);
     }
@@ -2216,6 +2229,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedOriginalArgString(""),
           "args": func.MakeOriginalArgString(""),
@@ -2361,8 +2375,8 @@
     """Overrriden from TypeHandler."""
     impl_func = func.GetInfo('impl_func', True)
     if impl_func:
-      f.write("%s GLES2Implementation::%s(%s) {\n" %
-                 (func.return_type, func.original_name,
+      f.write("%s %sImplementation::%s(%s) {\n" %
+                 (func.return_type, _prefix, func.original_name,
                   func.MakeTypedOriginalArgString("")))
       f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
       func.WriteDestinationInitalizationValidation(f)
@@ -2425,7 +2439,7 @@
   def WriteGLES2ImplementationUnitTest(self, func, f):
     """Writes the GLES2 Implemention unit test."""
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   struct Cmds {
     cmds::%(name)s cmd;
   };
@@ -2458,6 +2472,7 @@
       gl_arg_strings.append(arg.GetValidClientSideArg(func))
 
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'args': ", ".join(gl_arg_strings),
           'cmd_args': ", ".join(cmd_arg_strings),
@@ -2701,8 +2716,8 @@
     impl_func = func.GetInfo('impl_func')
     if (impl_func != None and impl_func != True):
       return;
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
+    f.write("%s %sImplementation::%s(%s) {\n" %
+               (func.return_type, _prefix, func.original_name,
                 func.MakeTypedOriginalArgString("")))
     f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
     func.WriteDestinationInitalizationValidation(f)
@@ -2731,7 +2746,7 @@
     if not client_test:
       return;
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   %(type)s data[%(count)d] = {0};
   struct Cmds {
     cmds::%(name)sImmediate cmd;
@@ -2755,6 +2770,7 @@
     ]
 
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'type': self.GetArrayType(func),
           'count': self.GetArrayCount(func),
@@ -2838,9 +2854,9 @@
   def WriteImmediateCmdHelper(self, func, f):
     """Overrriden from TypeHandler."""
     code = """  void %(name)s(%(typed_args)s) {
-    const uint32_t size = gles2::cmds::%(name)s::ComputeSize();
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
+    const uint32_t size = %(lp)s::cmds::%(name)s::ComputeSize();
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpaceTotalSize<%(lp)s::cmds::%(name)s>(size);
     if (c) {
       c->Init(%(args)s);
     }
@@ -2848,6 +2864,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedOriginalArgString(""),
           "args": func.MakeOriginalArgString(""),
@@ -2996,8 +3013,8 @@
     impl_func = func.GetInfo('impl_func')
     if (impl_func != None and impl_func != True):
       return;
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
+    f.write("%s %sImplementation::%s(%s) {\n" %
+               (func.return_type, _prefix, func.original_name,
                 func.MakeTypedOriginalArgString("")))
     f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
     func.WriteDestinationInitalizationValidation(f)
@@ -3027,7 +3044,7 @@
       return;
 
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   %(type)s data[%(count_param)d][%(count)d] = {{0}};
   struct Cmds {
     cmds::%(name)sImmediate cmd;
@@ -3064,6 +3081,7 @@
       if arg.name == "count":
         count_param = int(valid_value)
     f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'type': self.GetArrayType(func),
           'count': self.GetArrayCount(func),
@@ -3081,7 +3099,8 @@
       return
 
     code = """
-TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
+TEST_F(%(prefix)sImplementationTest,
+       %(name)sInvalidConstantArg%(invalid_index)d) {
   %(type)s data[%(count_param)d][%(count)d] = {{0}};
   for (int ii = 0; ii < %(count_param)d; ++ii) {
     for (int jj = 0; jj < %(count)d; ++jj) {
@@ -3108,6 +3127,7 @@
             count_param = int(valid_value)
 
       f.write(code % {
+        'prefix' : _prefix,
         'name': func.name,
         'invalid_index': func.GetOriginalArgs().index(invalid_arg),
         'type': self.GetArrayType(func),
@@ -3170,9 +3190,9 @@
   def WriteImmediateCmdHelper(self, func, f):
     """Overrriden from TypeHandler."""
     code = """  void %(name)s(%(typed_args)s) {
-    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(count);
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
+    const uint32_t size = %(lp)s::cmds::%(name)s::ComputeSize(count);
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpaceTotalSize<%(lp)s::cmds::%(name)s>(size);
     if (c) {
       c->Init(%(args)s);
     }
@@ -3180,6 +3200,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedInitString(""),
           "args": func.MakeInitString("")
@@ -3250,8 +3271,8 @@
 
   def WriteGLES2Implementation(self, func, f):
     """Overrriden from TypeHandler."""
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
+    f.write("%s %sImplementation::%s(%s) {\n" %
+               (func.return_type, _prefix, func.original_name,
                 func.MakeTypedOriginalArgString("")))
     f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
     func.WriteDestinationInitalizationValidation(f)
@@ -3314,8 +3335,8 @@
   def WriteGLES2ImplementationUnitTest(self, func, f):
     """Overrriden from TypeHandler."""
     code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
-  const uint32_t kBucketId = GLES2Implementation::kResultBucketId;
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
+  const uint32_t kBucketId = %(prefix)sImplementation::kResultBucketId;
   const char* kString1 = "happy";
   const char* kString2 = "ending";
   const size_t kString1Size = ::strlen(kString1) + 1;
@@ -3377,6 +3398,7 @@
         gl_args.append(arg.GetValidClientSideArg(func))
         bucket_args.append(arg.GetValidClientSideArg(func))
     f.write(code % {
+        'prefix' : _prefix,
         'name': func.name,
         'gl_args': ", ".join(gl_args),
         'bucket_args': ", ".join(bucket_args),
@@ -3385,8 +3407,8 @@
     if self.__GetLengthArg(func) == None:
       return
     code = """
-TEST_F(GLES2ImplementationTest, %(name)sWithLength) {
-  const uint32_t kBucketId = GLES2Implementation::kResultBucketId;
+TEST_F(%(prefix)sImplementationTest, %(name)sWithLength) {
+  const uint32_t kBucketId = %(prefix)sImplementation::kResultBucketId;
   const char* kString = "foobar******";
   const size_t kStringSize = 6;  // We only need "foobar".
   const size_t kHeaderSize = sizeof(GLint) * 2;
@@ -3435,6 +3457,7 @@
       else:
         gl_args.append(arg.GetValidClientSideArg(func))
     f.write(code % {
+        'prefix' : _prefix,
         'name': func.name,
         'gl_args': ", ".join(gl_args),
         'bucket_args': ", ".join(bucket_args),
@@ -3659,8 +3682,8 @@
     """Overrriden from TypeHandler."""
     code = """  void %(name)s(%(typed_args)s) {
     const uint32_t data_size = strlen(name);
-    gles2::cmds::%(name)s* c =
-        GetImmediateCmdSpace<gles2::cmds::%(name)s>(data_size);
+    %(lp)s::cmds::%(name)s* c =
+        GetImmediateCmdSpace<%(lp)s::cmds::%(name)s>(data_size);
     if (c) {
       c->Init(%(args)s, data_size);
     }
@@ -3668,6 +3691,7 @@
 
 """
     f.write(code % {
+          "lp" : _lower_prefix,
           "name": func.name,
           "typed_args": func.MakeTypedOriginalArgString(""),
           "args": func.MakeOriginalArgString(""),
@@ -3859,8 +3883,8 @@
     impl_func = func.GetInfo('impl_func', True)
     if impl_func:
       error_value = func.GetInfo("error_value") or "GL_FALSE"
-      f.write("%s GLES2Implementation::%s(%s) {\n" %
-                 (func.return_type, func.original_name,
+      f.write("%s %sImplementation::%s(%s) {\n" %
+                 (func.return_type, _prefix, func.original_name,
                   func.MakeTypedOriginalArgString("")))
       f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
       self.WriteTraceEvent(func, f)
@@ -3896,7 +3920,7 @@
     client_test = func.GetInfo('client_test', True)
     if client_test:
       code = """
-TEST_F(GLES2ImplementationTest, %(name)s) {
+TEST_F(%(prefix)sImplementationTest, %(name)s) {
   struct Cmds {
     cmds::%(name)s cmd;
   };
@@ -3918,6 +3942,7 @@
       args = func.GetOriginalArgs()
       assert len(args) == 1
       f.write(code % {
+          'prefix' : _prefix,
           'name': func.name,
           'cmd_id_value': args[0].GetValidClientSideCmdArg(func),
           'gl_id_value': args[0].GetValidClientSideArg(func) })
@@ -3946,7 +3971,8 @@
 
   def WriteGLES2Implementation(self, func, f):
     """Overrriden from TypeHandler."""
-    code_1 = """%(return_type)s GLES2Implementation::%(func_name)s(%(args)s) {
+    code_1 = """%(return_type)s %(prefix)sImplementation::%(func_name)s(
+    %(args)s) {
   GPU_CLIENT_SINGLE_THREAD_CHECK();
 """
     code_2 = """  GPU_CLIENT_LOG("[" << GetLogPrefix()
@@ -3976,6 +4002,7 @@
 """
     args = func.GetOriginalArgs()
     str_args = {
+      'prefix' : _prefix,
       'return_type': func.return_type,
       'func_name': func.original_name,
       'args': func.MakeTypedOriginalArgString(""),
@@ -6396,8 +6423,8 @@
   def WriteGLES2ImplementationHeader(self, filename):
     """Writes the GLES2 Implementation header."""
     comment = \
-      ("// This file is included by gles2_implementation.h to declare the\n"
-       "// GL api functions.\n")
+      ("// This file is included by %s_implementation.h to declare the\n"
+       "// GL api functions.\n" % _lower_prefix)
     with CHeaderWriter(filename, self.year, comment) as f:
       for func in self.original_functions:
         func.WriteGLES2ImplementationHeader(f)
@@ -6406,8 +6433,8 @@
   def WriteGLES2Implementation(self, filename):
     """Writes the GLES2 Implementation."""
     comment = \
-      ("// This file is included by gles2_implementation.cc to define the\n"
-       "// GL api functions.\n")
+      ("// This file is included by %s_implementation.cc to define the\n"
+       "// GL api functions.\n" % _lower_prefix)
     with CHeaderWriter(filename, self.year, comment) as f:
       for func in self.original_functions:
         func.WriteGLES2Implementation(f)
@@ -6432,8 +6459,8 @@
   def WriteGLES2ImplementationUnitTests(self, filename):
     """Writes the GLES2 helper header."""
     comment = \
-      ("// This file is included by gles2_implementation.h to declare the\n"
-       "// GL api functions.\n")
+      ("// This file is included by %s_implementation.h to declare the\n"
+       "// GL api functions.\n" % _lower_prefix)
     with CHeaderWriter(filename, self.year, comment) as f:
       for func in self.original_functions:
         func.WriteGLES2ImplementationUnitTest(f)
diff --git a/gpu/command_buffer/build_raster_cmd_buffer.py b/gpu/command_buffer/build_raster_cmd_buffer.py
index 51fc36c..bee9ce17 100755
--- a/gpu/command_buffer/build_raster_cmd_buffer.py
+++ b/gpu/command_buffer/build_raster_cmd_buffer.py
@@ -754,6 +754,14 @@
     'type': 'NoCommand',
     'extension': 'CHROMIUM_ordering_barrier',
   },
+  'InsertFenceSyncCHROMIUM': {
+    'type': 'Custom',
+    'internal': True,
+    'impl_func': False,
+    'cmd_args': 'GLuint64 release_count',
+    'extension': "CHROMIUM_sync_point",
+    'trace_level': 1,
+  },
   'LoseContextCHROMIUM': {
     'decoder_func': 'DoLoseContextCHROMIUM',
     'unit_test': False,
@@ -864,7 +872,7 @@
     'impl_func': True,
     'extension': 'CHROMIUM_unpremultiply_and_dither_copy',
     'extension_flag': 'unpremultiply_and_dither_copy',
-  }
+  },
 }
 
 
@@ -907,20 +915,20 @@
   #   "gpu/command_buffer/client/raster_interface_stub_autogen.h")
   # gen.WriteGLES2InterfaceStubImpl(
   #     "gpu/command_buffer/client/raster_interface_stub_impl_autogen.h")
-  # gen.WriteGLES2ImplementationHeader(
-  #   "gpu/command_buffer/client/raster_implementation_autogen.h")
-  # gen.WriteGLES2Implementation(
-  #   "gpu/command_buffer/client/raster_implementation_impl_autogen.h")
+  gen.WriteGLES2ImplementationHeader(
+    "gpu/command_buffer/client/raster_implementation_autogen.h")
+  gen.WriteGLES2Implementation(
+    "gpu/command_buffer/client/raster_implementation_impl_autogen.h")
   # gen.WriteGLES2ImplementationUnitTests(
-  #     "gpu/command_buffer/client/raster_implementation_unittest_autogen.h")
+  #   "gpu/command_buffer/client/raster_implementation_unittest_autogen.h")
   # gen.WriteGLES2TraceImplementationHeader(
   #     "gpu/command_buffer/client/raster_trace_implementation_autogen.h")
   # gen.WriteGLES2TraceImplementation(
   #     "gpu/command_buffer/client/raster_trace_implementation_impl_autogen.h")
   # gen.WriteGLES2CLibImplementation(
   #   "gpu/command_buffer/client/raster_c_lib_autogen.h")
-  # gen.WriteCmdHelperHeader(
-  #   "gpu/command_buffer/client/raster_cmd_helper_autogen.h")
+  gen.WriteCmdHelperHeader(
+     "gpu/command_buffer/client/raster_cmd_helper_autogen.h")
   gen.WriteServiceImplementation(
     "gpu/command_buffer/service/raster_decoder_autogen.h")
   gen.WriteServiceUnitTests(
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn
index 7b33e7dd..d75b361 100644
--- a/gpu/command_buffer/client/BUILD.gn
+++ b/gpu/command_buffer/client/BUILD.gn
@@ -127,6 +127,10 @@
   "gles2_trace_implementation_impl_autogen.h",
   "gpu_switches.cc",
   "gpu_switches.h",
+  "implementation_base.cc",
+  "implementation_base.h",
+  "logging.cc",
+  "logging.h",
   "program_info_manager.cc",
   "program_info_manager.h",
   "query_tracker.cc",
@@ -197,6 +201,7 @@
   configs += [ "//gpu:raster_implementation" ]
   deps = [
     ":client",
+    ":gles2_implementation",
     ":gles2_interface",
     ":raster_interface",
     "//base",
@@ -204,13 +209,21 @@
     "//components/viz/common:resource_format",
     "//gpu/command_buffer/common",
     "//gpu/command_buffer/common:gles2",
+    "//gpu/command_buffer/common:gles2_utils",
     "//ui/gfx:color_space",
     "//ui/gfx/geometry",
     "//ui/gfx/ipc/color",
   ]
   sources = [
+    "raster_cmd_helper.cc",
+    "raster_cmd_helper.h",
+    "raster_cmd_helper_autogen.h",
+    "raster_implementation.cc",
+    "raster_implementation.h",
+    "raster_implementation_autogen.h",
     "raster_implementation_gles.cc",
     "raster_implementation_gles.h",
+    "raster_implementation_impl_autogen.h",
   ]
 }
 
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 3f94251f..d180566 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -45,16 +45,54 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
 
-#if defined(GPU_CLIENT_DEBUG)
-#include "base/command_line.h"
-#include "gpu/command_buffer/client/gpu_switches.h"
-#endif
-
 #if !defined(__native_client__)
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/ipc/color/gfx_param_traits.h"
 #endif
 
+#if defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_SINGLE_THREAD_CHECK() SingleThreadChecker checker(this);
+#else  // !defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_SINGLE_THREAD_CHECK()
+#endif  // defined(GPU_CLIENT_DEBUG)
+
+// Check that destination pointers point to initialized memory.
+// When the context is lost, calling GL function has no effect so if destination
+// pointers point to initialized memory it can often lead to crash bugs. eg.
+//
+// GLsizei len;
+// glGetShaderSource(shader, max_size, &len, buffer);
+// std::string src(buffer, buffer + len);  // len can be uninitialized here!!!
+//
+// Because this check is not official GL this check happens only on Chrome code,
+// not Pepper.
+//
+// If it was up to us we'd just always write to the destination but the OpenGL
+// spec defines the behavior of OpenGL functions, not us. :-(
+#if defined(__native_client__) || defined(GLES2_CONFORMANCE_TESTS)
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v)
+#define GPU_CLIENT_DCHECK(v)
+#elif defined(GPU_DCHECK)
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v)
+#define GPU_CLIENT_DCHECK(v) GPU_DCHECK(v)
+#elif defined(DCHECK)
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v)
+#define GPU_CLIENT_DCHECK(v) DCHECK(v)
+#else
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v)
+#define GPU_CLIENT_DCHECK(v) ASSERT(v)
+#endif
+
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \
+  GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(          \
+      ptr &&                                                     \
+      (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
+
+#define GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(type, ptr) \
+  GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(                   \
+      !ptr ||                                                             \
+      (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
+
 namespace gpu {
 namespace gles2 {
 
@@ -95,11 +133,6 @@
 
 }  // anonymous namespace
 
-#if !defined(_MSC_VER)
-const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
-const unsigned int GLES2Implementation::kStartingOffset;
-#endif
-
 GLES2Implementation::GLStaticState::GLStaticState() = default;
 
 GLES2Implementation::GLStaticState::~GLStaticState() = default;
@@ -124,8 +157,8 @@
     bool lose_context_when_out_of_memory,
     bool support_client_side_arrays,
     GpuControl* gpu_control)
-    : helper_(helper),
-      transfer_buffer_(transfer_buffer),
+    : ImplementationBase(helper, transfer_buffer, gpu_control),
+      helper_(helper),
       chromium_framebuffer_multisample_(kUnknownExtensionStatus),
       pack_alignment_(4),
       pack_row_length_(0),
@@ -151,32 +184,22 @@
       bound_pixel_pack_transfer_buffer_id_(0),
       bound_pixel_unpack_transfer_buffer_id_(0),
       error_bits_(0),
-      debug_(false),
       lose_context_when_out_of_memory_(lose_context_when_out_of_memory),
       support_client_side_arrays_(support_client_side_arrays),
       use_count_(0),
       flush_id_(0),
       max_extra_transfer_buffer_size_(0),
-      transfer_cache_(this),
       current_trace_stack_(0),
-      gpu_control_(gpu_control),
       capabilities_(gpu_control->GetCapabilities()),
       aggressively_free_resources_(false),
       cached_extension_string_(nullptr),
       weak_ptr_factory_(this) {
   DCHECK(helper);
-  DCHECK(transfer_buffer);
-  DCHECK(gpu_control);
 
   std::stringstream ss;
   ss << std::hex << this;
   this_in_hex_ = ss.str();
 
-  GPU_CLIENT_LOG_CODE_BLOCK({
-    debug_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
-        switches::kEnableGPUClientLogging);
-  });
-
   share_group_ =
       (share_group ? std::move(share_group)
                    : new ShareGroup(
@@ -190,27 +213,12 @@
 gpu::ContextResult GLES2Implementation::Initialize(
     const SharedMemoryLimits& limits) {
   TRACE_EVENT0("gpu", "GLES2Implementation::Initialize");
-  DCHECK_GE(limits.start_transfer_buffer_size, limits.min_transfer_buffer_size);
-  DCHECK_LE(limits.start_transfer_buffer_size, limits.max_transfer_buffer_size);
-  DCHECK_GE(limits.min_transfer_buffer_size, kStartingOffset);
-
-  gpu_control_->SetGpuControlClient(this);
-
-  if (!transfer_buffer_->Initialize(
-          limits.start_transfer_buffer_size, kStartingOffset,
-          limits.min_transfer_buffer_size, limits.max_transfer_buffer_size,
-          kAlignment, kSizeToFlush)) {
-    // TransferBuffer::Initialize doesn't fail for transient reasons such as if
-    // the context was lost. See http://crrev.com/c/720269
-    LOG(ERROR) << "ContextResult::kFatalFailure: "
-               << "TransferBuffer::Initailize() failed";
-    return gpu::ContextResult::kFatalFailure;
+  auto result = ImplementationBase::Initialize(limits);
+  if (result != gpu::ContextResult::kSuccess) {
+    return result;
   }
 
   max_extra_transfer_buffer_size_ = limits.max_mapped_memory_for_texture_upload;
-  mapped_memory_ = std::make_unique<MappedMemoryManager>(
-      helper_, limits.mapped_memory_reclaim_limit);
-  mapped_memory_->set_chunk_size_multiple(limits.mapped_memory_chunk_size);
 
   GLStaticState::ShaderPrecisionMap* shader_precisions =
       &static_state_.shader_precisions;
@@ -229,7 +237,6 @@
   texture_units_ = std::make_unique<TextureUnit[]>(
       capabilities_.max_combined_texture_image_units);
 
-  query_tracker_ = std::make_unique<QueryTracker>(mapped_memory_.get());
   buffer_tracker_ = std::make_unique<BufferTracker>(mapped_memory_.get());
 
   for (int i = 0; i < static_cast<int>(IdNamespaces::kNumIdNamespaces); ++i)
@@ -266,6 +273,7 @@
   // by the queries. The GPU process when validating that memory is still
   // shared will fail and abort (ie, it will stop running).
   WaitForCmd();
+
   query_tracker_.reset();
 
   // GLES2Implementation::Initialize() could fail before allocating
@@ -285,10 +293,6 @@
 
   // Make sure the commands make it the service.
   WaitForCmd();
-
-  // The gpu_control_ outlives this class, so clear the client on it before we
-  // self-destruct.
-  gpu_control_->SetGpuControlClient(nullptr);
 }
 
 GLES2CmdHelper* GLES2Implementation::helper() const {
@@ -315,8 +319,9 @@
   DCHECK(!lost_context_callback_run_);
   lost_context_callback_run_ = true;
   share_group_->Lose();
-  if (!lost_context_callback_.is_null())
-    lost_context_callback_.Run();
+  if (!lost_context_callback_.is_null()) {
+    std::move(lost_context_callback_).Run();
+  }
 }
 
 void GLES2Implementation::OnGpuControlLostContextMaybeReentrant() {
@@ -332,79 +337,10 @@
     error_message_callback_.Run(message, id);
 }
 
-void* GLES2Implementation::GetResultBuffer() {
-  return transfer_buffer_->GetResultBuffer();
-}
-
-int32_t GLES2Implementation::GetResultShmId() {
-  return transfer_buffer_->GetShmId();
-}
-
-uint32_t GLES2Implementation::GetResultShmOffset() {
-  return transfer_buffer_->GetResultOffset();
-}
-
-void GLES2Implementation::FreeUnusedSharedMemory() {
-  mapped_memory_->FreeUnused();
-}
-
-void GLES2Implementation::FreeEverything() {
-  query_tracker_->Shrink(helper_);
-  FreeUnusedSharedMemory();
-  transfer_buffer_->Free();
-  helper_->FreeRingBuffer();
-}
-
 void GLES2Implementation::FreeSharedMemory(void* mem) {
   mapped_memory_->FreePendingToken(mem, helper_->InsertToken());
 }
 
-void GLES2Implementation::RunIfContextNotLost(base::OnceClosure callback) {
-  if (!lost_context_callback_run_)
-    std::move(callback).Run();
-}
-
-void GLES2Implementation::FlushPendingWork() {
-  gpu_control_->FlushPendingWork();
-}
-
-void GLES2Implementation::SignalSyncToken(const gpu::SyncToken& sync_token,
-                                          base::OnceClosure callback) {
-  SyncToken verified_sync_token;
-  if (sync_token.HasData() &&
-      GetVerifiedSyncTokenForIPC(sync_token, &verified_sync_token)) {
-    // We can only send verified sync tokens across IPC.
-    gpu_control_->SignalSyncToken(
-        verified_sync_token,
-        base::Bind(&GLES2Implementation::RunIfContextNotLost,
-                   weak_ptr_factory_.GetWeakPtr(), base::Passed(&callback)));
-  } else {
-    // Invalid sync token, just call the callback immediately.
-    std::move(callback).Run();
-  }
-}
-
-// This may be called from any thread. It's safe to access gpu_control_ without
-// the lock because it is const.
-bool GLES2Implementation::IsSyncTokenSignaled(
-    const gpu::SyncToken& sync_token) {
-  // Check that the sync token belongs to this context.
-  DCHECK_EQ(gpu_control_->GetNamespaceID(), sync_token.namespace_id());
-  DCHECK_EQ(gpu_control_->GetCommandBufferID(), sync_token.command_buffer_id());
-  return gpu_control_->IsFenceSyncReleased(sync_token.release_count());
-}
-
-void GLES2Implementation::SignalQuery(uint32_t query,
-                                      base::OnceClosure callback) {
-  // Flush previously entered commands to ensure ordering with any
-  // glBeginQueryEXT() calls that may have been put into the context.
-  ShallowFlushCHROMIUM();
-  gpu_control_->SignalQuery(
-      query,
-      base::Bind(&GLES2Implementation::RunIfContextNotLost,
-                 weak_ptr_factory_.GetWeakPtr(), base::Passed(&callback)));
-}
-
 GLuint GLES2Implementation::CreateGpuFenceCHROMIUM() {
   GLuint client_id = GetIdAllocator(IdNamespaces::kGpuFences)
                          ->AllocateIDAtOrAbove(last_gpu_fence_id_ + 1);
@@ -440,15 +376,6 @@
   return client_id;
 }
 
-void GLES2Implementation::GetGpuFence(
-    uint32_t gpu_fence_id,
-    base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback) {
-  // This ShallowFlush is required to ensure that the GetGpuFence
-  // call is processed after the preceding CreateGpuFenceCHROMIUM call.
-  ShallowFlushCHROMIUM();
-  gpu_control_->GetGpuFence(gpu_fence_id, std::move(callback));
-}
-
 void GLES2Implementation::DestroyGpuFenceCHROMIUMHelper(GLuint client_id) {
   if (GetIdAllocator(IdNamespaces::kGpuFences)->InUse(client_id)) {
     GetIdAllocator(IdNamespaces::kGpuFences)->FreeID(client_id);
@@ -477,53 +404,6 @@
   }
 }
 
-bool GLES2Implementation::OnMemoryDump(
-    const base::trace_event::MemoryDumpArgs& args,
-    base::trace_event::ProcessMemoryDump* pmd) {
-  using base::trace_event::MemoryAllocatorDump;
-  using base::trace_event::MemoryDumpLevelOfDetail;
-
-  // Dump owned MappedMemoryManager memory as well.
-  mapped_memory_->OnMemoryDump(args, pmd);
-
-  if (!transfer_buffer_->HaveBuffer())
-    return true;
-
-  const uint64_t tracing_process_id =
-      base::trace_event::MemoryDumpManager::GetInstance()
-          ->GetTracingProcessId();
-
-  MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(base::StringPrintf(
-      "gpu/transfer_buffer_memory/buffer_%d", transfer_buffer_->GetShmId()));
-  dump->AddScalar(MemoryAllocatorDump::kNameSize,
-                  MemoryAllocatorDump::kUnitsBytes,
-                  transfer_buffer_->GetSize());
-
-  if (args.level_of_detail != MemoryDumpLevelOfDetail::BACKGROUND) {
-    dump->AddScalar("free_size", MemoryAllocatorDump::kUnitsBytes,
-                    transfer_buffer_->GetFragmentedFreeSize());
-    auto shared_memory_guid =
-        transfer_buffer_->shared_memory_handle().GetGUID();
-    const int kImportance = 2;
-    if (!shared_memory_guid.is_empty()) {
-      pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), shared_memory_guid,
-                                           kImportance);
-    } else {
-      auto guid = GetBufferGUIDForTracing(tracing_process_id,
-                                          transfer_buffer_->GetShmId());
-      pmd->CreateSharedGlobalAllocatorDump(guid);
-      pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
-    }
-  }
-
-  return true;
-}
-
-void GLES2Implementation::WaitForCmd() {
-  TRACE_EVENT0("gpu", "GLES2::WaitForCmd");
-  helper_->CommandBufferHelper::Finish();
-}
-
 bool GLES2Implementation::IsExtensionAvailable(const char* ext) {
   const char* extensions =
       reinterpret_cast<const char*>(GetStringHelper(GL_EXTENSIONS));
@@ -641,109 +521,6 @@
               GLES2Util::GetStringEnum(value)).c_str());
 }
 
-bool GLES2Implementation::GetBucketContents(uint32_t bucket_id,
-                                            std::vector<int8_t>* data) {
-  TRACE_EVENT0("gpu", "GLES2::GetBucketContents");
-  DCHECK(data);
-  const uint32_t kStartSize = 32 * 1024;
-  ScopedTransferBufferPtr buffer(kStartSize, helper_, transfer_buffer_);
-  if (!buffer.valid()) {
-    return false;
-  }
-  typedef cmd::GetBucketStart::Result Result;
-  Result* result = GetResultAs<Result*>();
-  if (!result) {
-    return false;
-  }
-  *result = 0;
-  helper_->GetBucketStart(
-      bucket_id, GetResultShmId(), GetResultShmOffset(),
-      buffer.size(), buffer.shm_id(), buffer.offset());
-  WaitForCmd();
-  uint32_t size = *result;
-  data->resize(size);
-  if (size > 0u) {
-    uint32_t offset = 0;
-    while (size) {
-      if (!buffer.valid()) {
-        buffer.Reset(size);
-        if (!buffer.valid()) {
-          return false;
-        }
-        helper_->GetBucketData(
-            bucket_id, offset, buffer.size(), buffer.shm_id(), buffer.offset());
-        WaitForCmd();
-      }
-      uint32_t size_to_copy = std::min(size, buffer.size());
-      memcpy(&(*data)[offset], buffer.address(), size_to_copy);
-      offset += size_to_copy;
-      size -= size_to_copy;
-      buffer.Release();
-    }
-    // Free the bucket. This is not required but it does free up the memory.
-    // and we don't have to wait for the result so from the client's perspective
-    // it's cheap.
-    helper_->SetBucketSize(bucket_id, 0);
-  }
-  return true;
-}
-
-void GLES2Implementation::SetBucketContents(uint32_t bucket_id,
-                                            const void* data,
-                                            size_t size) {
-  DCHECK(data);
-  helper_->SetBucketSize(bucket_id, size);
-  if (size > 0u) {
-    uint32_t offset = 0;
-    while (size) {
-      ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_);
-      if (!buffer.valid()) {
-        return;
-      }
-      memcpy(buffer.address(), static_cast<const int8_t*>(data) + offset,
-             buffer.size());
-      helper_->SetBucketData(
-          bucket_id, offset, buffer.size(), buffer.shm_id(), buffer.offset());
-      offset += buffer.size();
-      size -= buffer.size();
-    }
-  }
-}
-
-void GLES2Implementation::SetBucketAsCString(uint32_t bucket_id,
-                                             const char* str) {
-  // NOTE: strings are passed NULL terminated. That means the empty
-  // string will have a size of 1 and no-string will have a size of 0
-  if (str) {
-    SetBucketContents(bucket_id, str, strlen(str) + 1);
-  } else {
-    helper_->SetBucketSize(bucket_id, 0);
-  }
-}
-
-bool GLES2Implementation::GetBucketAsString(uint32_t bucket_id,
-                                            std::string* str) {
-  DCHECK(str);
-  std::vector<int8_t> data;
-  // NOTE: strings are passed NULL terminated. That means the empty
-  // string will have a size of 1 and no-string will have a size of 0
-  if (!GetBucketContents(bucket_id, &data)) {
-    return false;
-  }
-  if (data.empty()) {
-    return false;
-  }
-  str->assign(&data[0], &data[0] + data.size() - 1);
-  return true;
-}
-
-void GLES2Implementation::SetBucketAsString(uint32_t bucket_id,
-                                            const std::string& str) {
-  // NOTE: strings are passed NULL terminated. That means the empty
-  // string will have a size of 1 and no-string will have a size of 0
-  SetBucketContents(bucket_id, str.c_str(), str.size() + 1);
-}
-
 void GLES2Implementation::Disable(GLenum cap) {
   GPU_CLIENT_SINGLE_THREAD_CHECK();
   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDisable("
@@ -1435,13 +1212,17 @@
   FlushHelper();
 }
 
-void GLES2Implementation::ShallowFlushCHROMIUM() {
+void GLES2Implementation::IssueShallowFlush() {
   GPU_CLIENT_SINGLE_THREAD_CHECK();
   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShallowFlushCHROMIUM()");
   flush_id_ = GenerateNextFlushId();
   FlushHelper();
 }
 
+void GLES2Implementation::ShallowFlushCHROMIUM() {
+  IssueShallowFlush();
+}
+
 void GLES2Implementation::FlushHelper() {
   // Flush our command buffer
   // (tell the service to execute up to the flush cmd.)
@@ -6143,38 +5924,6 @@
   return manager->TextureIsDeletedForTracing(texture_id);
 }
 
-void* GLES2Implementation::MapTransferCacheEntry(size_t serialized_size) {
-  return transfer_cache_.MapEntry(mapped_memory_.get(), serialized_size);
-}
-
-void GLES2Implementation::UnmapAndCreateTransferCacheEntry(uint32_t type,
-                                                           uint32_t id) {
-  transfer_cache_.UnmapAndCreateEntry(type, id);
-}
-
-bool GLES2Implementation::ThreadsafeLockTransferCacheEntry(uint32_t type,
-                                                           uint32_t id) {
-  return transfer_cache_.LockEntry(type, id);
-}
-
-void GLES2Implementation::UnlockTransferCacheEntries(
-    const std::vector<std::pair<uint32_t, uint32_t>>& entries) {
-  transfer_cache_.UnlockEntries(entries);
-}
-
-void GLES2Implementation::DeleteTransferCacheEntry(uint32_t type, uint32_t id) {
-  transfer_cache_.DeleteEntry(type, id);
-}
-
-unsigned int GLES2Implementation::GetTransferBufferFreeSize() const {
-  return transfer_buffer_->GetFreeSize();
-}
-
-void GLES2Implementation::SetLostContextCallback(
-    const base::Closure& callback) {
-  lost_context_callback_ = callback;
-}
-
 void GLES2Implementation::GenSyncTokenCHROMIUM(GLbyte* sync_token) {
   if (!sync_token) {
     SetGLError(GL_INVALID_VALUE, "glGenSyncTokenCHROMIUM", "empty sync_token");
@@ -6267,21 +6016,6 @@
   gpu_control_->WaitSyncTokenHint(verified_sync_token);
 }
 
-bool GLES2Implementation::GetVerifiedSyncTokenForIPC(
-    const SyncToken& sync_token,
-    SyncToken* verified_sync_token) {
-  DCHECK(sync_token.HasData());
-  DCHECK(verified_sync_token);
-
-  if (!sync_token.verified_flush() &&
-      !gpu_control_->CanWaitUnverifiedSyncToken(sync_token))
-    return false;
-
-  *verified_sync_token = sync_token;
-  verified_sync_token->SetVerifyFlush();
-  return true;
-}
-
 namespace {
 
 bool CreateImageValidInternalFormat(GLenum internalformat,
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index 612414bfe..66ff9429f 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -29,6 +29,8 @@
 #include "gpu/command_buffer/client/gles2_impl_export.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/gpu_control_client.h"
+#include "gpu/command_buffer/client/implementation_base.h"
+#include "gpu/command_buffer/client/logging.h"
 #include "gpu/command_buffer/client/mapped_memory.h"
 #include "gpu/command_buffer/client/query_tracker.h"
 #include "gpu/command_buffer/client/ref_counted.h"
@@ -39,77 +41,9 @@
 #include "gpu/command_buffer/common/context_result.h"
 #include "gpu/command_buffer/common/debug_marker_manager.h"
 
-#if DCHECK_IS_ON() && !defined(__native_client__) && \
-    !defined(GLES2_CONFORMANCE_TESTS)
-  #if defined(GLES2_INLINE_OPTIMIZATION)
-    // TODO(gman): Replace with macros that work with inline optmization.
-    #define GPU_CLIENT_SINGLE_THREAD_CHECK()
-    #define GPU_CLIENT_LOG(args)
-    #define GPU_CLIENT_LOG_CODE_BLOCK(code)
-    #define GPU_CLIENT_DCHECK_CODE_BLOCK(code)
-  #else
-    #include "base/logging.h"
-    #define GPU_CLIENT_SINGLE_THREAD_CHECK() SingleThreadChecker checker(this);
-    #define GPU_CLIENT_LOG(args)  DLOG_IF(INFO, debug_) << args;
-    #define GPU_CLIENT_LOG_CODE_BLOCK(code) code
-    #define GPU_CLIENT_DCHECK_CODE_BLOCK(code) code
-    #define GPU_CLIENT_DEBUG
-  #endif
-#else
-  #define GPU_CLIENT_SINGLE_THREAD_CHECK()
-  #define GPU_CLIENT_LOG(args)
-  #define GPU_CLIENT_LOG_CODE_BLOCK(code)
-  #define GPU_CLIENT_DCHECK_CODE_BLOCK(code)
-#endif
-
-#if defined(GPU_CLIENT_DEBUG)
-  // Set to 1 to have the client fail when a GL error is generated.
-  // This helps find bugs in the renderer since the debugger stops on the error.
-#  if 0
-#    define GL_CLIENT_FAIL_GL_ERRORS
-#  endif
-#endif
-
-// Check that destination pointers point to initialized memory.
-// When the context is lost, calling GL function has no effect so if destination
-// pointers point to initialized memory it can often lead to crash bugs. eg.
-//
-// GLsizei len;
-// glGetShaderSource(shader, max_size, &len, buffer);
-// std::string src(buffer, buffer + len);  // len can be uninitialized here!!!
-//
-// Because this check is not official GL this check happens only on Chrome code,
-// not Pepper.
-//
-// If it was up to us we'd just always write to the destination but the OpenGL
-// spec defines the behavior of OpenGL functions, not us. :-(
-#if defined(__native_client__) || defined(GLES2_CONFORMANCE_TESTS)
-  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v)
-  #define GPU_CLIENT_DCHECK(v)
-#elif defined(GPU_DCHECK)
-  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v)
-  #define GPU_CLIENT_DCHECK(v) GPU_DCHECK(v)
-#elif defined(DCHECK)
-  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v)
-  #define GPU_CLIENT_DCHECK(v) DCHECK(v)
-#else
-  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v)
-  #define GPU_CLIENT_DCHECK(v) ASSERT(v)
-#endif
-
-#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \
-    GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(ptr && \
-        (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
-
-#define GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(type, ptr) \
-    GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(!ptr || \
-        (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
-
 namespace gpu {
 
-class GpuControl;
 class IdAllocator;
-struct SharedMemoryLimits;
 
 namespace gles2 {
 
@@ -122,13 +56,9 @@
 // be had by changing your code to use command buffers directly by using the
 // GLES2CmdHelper but that entails changing your code to use and deal with
 // shared memory and synchronization issues.
-class GLES2_IMPL_EXPORT GLES2Implementation
-    : public GLES2Interface,
-      public ContextSupport,
-      public GpuControlClient,
-      public base::trace_event::MemoryDumpProvider,
-      public QueryTrackerClient,
-      public ClientTransferCache::Client {
+class GLES2_IMPL_EXPORT GLES2Implementation : public GLES2Interface,
+                                              public ImplementationBase,
+                                              public QueryTrackerClient {
  public:
   // Stores GL state that never changes.
   struct GLES2_IMPL_EXPORT GLStaticState {
@@ -142,22 +72,9 @@
     ShaderPrecisionMap shader_precisions;
   };
 
-  // The maximum result size from simple GL get commands.
-  static const size_t kMaxSizeOfSimpleResult =
-      16 * sizeof(uint32_t);  // NOLINT.
-
-  // used for testing only. If more things are reseved add them here.
-  static const unsigned int kStartingOffset = kMaxSizeOfSimpleResult;
-
-  // Size in bytes to issue async flush for transfer buffer.
-  static const unsigned int kSizeToFlush = 256 * 1024;
-
   // The bucket used for results. Public for testing only.
   static const uint32_t kResultBucketId = 1;
 
-  // Alignment of allocations.
-  static const unsigned int kAlignment = 16;
-
   // GL names for the buffers used to emulate client side buffers.
   static const GLuint kClientSideArrayId = 0xFEDCBA98u;
   static const GLuint kClientSideElementArrayId = 0xFEDCBA99u;
@@ -190,14 +107,6 @@
   #include "gpu/command_buffer/client/gles2_implementation_autogen.h"
 
   // ContextSupport implementation.
-  void FlushPendingWork() override;
-  void SignalSyncToken(const gpu::SyncToken& sync_token,
-                       base::OnceClosure callback) override;
-  bool IsSyncTokenSignaled(const gpu::SyncToken& sync_token) override;
-  void SignalQuery(uint32_t query, base::OnceClosure callback) override;
-  void GetGpuFence(uint32_t gpu_fence_id,
-                   base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)>
-                       callback) override;
   void SetAggressivelyFreeResources(bool aggressively_free_resources) override;
   void Swap() override;
   void SwapWithBounds(const std::vector<gfx::Rect>& rects) override;
@@ -217,17 +126,6 @@
       uint32_t texture_id) override;
   bool ThreadsafeDiscardableTextureIsDeletedForTracing(
       uint32_t texture_id) override;
-  void* MapTransferCacheEntry(size_t serialized_size) override;
-  void UnmapAndCreateTransferCacheEntry(uint32_t type, uint32_t id) override;
-  bool ThreadsafeLockTransferCacheEntry(uint32_t type, uint32_t id) override;
-  void UnlockTransferCacheEntries(
-      const std::vector<std::pair<uint32_t, uint32_t>>& entries) override;
-  void DeleteTransferCacheEntry(uint32_t type, uint32_t id) override;
-  unsigned int GetTransferBufferFreeSize() const override;
-
-  // TODO(danakj): Move to ContextSupport once ContextProvider doesn't need to
-  // intercept it.
-  void SetLostContextCallback(const base::Closure& callback);
 
   void GetProgramInfoCHROMIUMHelper(GLuint program,
                                     std::vector<int8_t>* result);
@@ -267,17 +165,6 @@
   bool GetQueryObjectValueHelper(
       const char* function_name, GLuint id, GLenum pname, GLuint64* params);
 
-  void FreeUnusedSharedMemory();
-  void FreeEverything();
-
-  // Helper to set verified bit on sync token if allowed by gpu control.
-  bool GetVerifiedSyncTokenForIPC(const gpu::SyncToken& sync_token,
-                                  gpu::SyncToken* verified_sync_token);
-
-  // base::trace_event::MemoryDumpProvider implementation.
-  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
-                    base::trace_event::ProcessMemoryDump* pmd) override;
-
   const scoped_refptr<ShareGroup>& share_group() const { return share_group_; }
 
   const Capabilities& capabilities() const {
@@ -452,21 +339,14 @@
     GLES2Implementation* gles2_implementation_;
   };
 
-  // Gets the value of the result.
-  template <typename T>
-  T GetResultAs() {
-    return static_cast<T>(GetResultBuffer());
-  }
+  // ImplementationBase implementation.
+  void IssueShallowFlush() override;
 
   // GpuControlClient implementation.
   void OnGpuControlLostContext() final;
   void OnGpuControlLostContextMaybeReentrant() final;
   void OnGpuControlErrorMessage(const char* message, int32_t id) final;
 
-  void* GetResultBuffer();
-  int32_t GetResultShmId();
-  uint32_t GetResultShmOffset();
-
   bool IsChromiumFramebufferMultisampleAvailable();
 
   bool IsExtensionAvailableHelper(
@@ -484,29 +364,6 @@
     return last_error_;
   }
 
-  // Waits for all commands to execute.
-  void WaitForCmd();
-
-  // TODO(gman): These bucket functions really seem like they belong in
-  // CommandBufferHelper (or maybe BucketHelper?). Unfortunately they need
-  // a transfer buffer to function which is currently managed by this class.
-
-  // Gets the contents of a bucket.
-  bool GetBucketContents(uint32_t bucket_id, std::vector<int8_t>* data);
-
-  // Sets the contents of a bucket.
-  void SetBucketContents(uint32_t bucket_id, const void* data, size_t size);
-
-  // Sets the contents of a bucket as a string.
-  void SetBucketAsCString(uint32_t bucket_id, const char* str);
-
-  // Gets the contents of a bucket as a string. Returns false if there is no
-  // string available which is a separate case from the empty string.
-  bool GetBucketAsString(uint32_t bucket_id, std::string* str);
-
-  // Sets the contents of a bucket as a string.
-  void SetBucketAsString(uint32_t bucket_id, const std::string& str);
-
   // Returns true if id is reserved.
   bool IsBufferReservedId(GLuint id);
   bool IsFramebufferReservedId(GLuint id) { return false; }
@@ -711,6 +568,15 @@
                                    size_t* out_paths_offset,
                                    uint32_t* out_transforms_shm_id,
                                    size_t* out_transforms_offset);
+
+// Set to 1 to have the client fail when a GL error is generated.
+// This helps find bugs in the renderer since the debugger stops on the error.
+#if DCHECK_IS_ON()
+#if 0
+#define GL_CLIENT_FAIL_GL_ERRORS
+#endif
+#endif
+
 #if defined(GL_CLIENT_FAIL_GL_ERRORS)
   void CheckGLError();
   void FailGLError(GLenum error);
@@ -732,13 +598,11 @@
 
   GLES2Util util_;
   GLES2CmdHelper* helper_;
-  TransferBufferInterface* transfer_buffer_;
   std::string last_error_;
   DebugMarkerManager debug_marker_manager_;
   std::string this_in_hex_;
 
   base::queue<int32_t> swap_buffers_tokens_;
-  base::queue<int32_t> rate_limit_tokens_;
 
   ExtensionStatus chromium_framebuffer_multisample_;
 
@@ -813,8 +677,7 @@
   // Current GL error bits.
   uint32_t error_bits_;
 
-  // Whether or not to print debugging info.
-  bool debug_;
+  LogSettings log_settings_;
 
   // When true, the context is lost when a GL_OUT_OF_MEMORY error occurs.
   const bool lose_context_when_out_of_memory_;
@@ -852,28 +715,20 @@
   typedef std::map<const void*, MappedTexture> MappedTextureMap;
   MappedTextureMap mapped_textures_;
 
-  std::unique_ptr<MappedMemoryManager> mapped_memory_;
-
   scoped_refptr<ShareGroup> share_group_;
   ShareGroupContextData share_group_context_data_;
 
-  std::unique_ptr<QueryTracker> query_tracker_;
   std::unique_ptr<IdAllocator>
       id_allocators_[static_cast<int>(IdNamespaces::kNumIdNamespaces)];
 
   std::unique_ptr<BufferTracker> buffer_tracker_;
-  ClientTransferCache transfer_cache_;
 
   base::Optional<ScopedTransferBufferPtr> raster_mapped_buffer_;
 
   base::Callback<void(const char*, int32_t)> error_message_callback_;
-  base::Closure lost_context_callback_;
-  bool lost_context_callback_run_ = false;
 
   int current_trace_stack_;
 
-  GpuControl* const gpu_control_;
-
   Capabilities capabilities_;
 
   // Flag to indicate whether the implementation can retain resources, or
diff --git a/gpu/command_buffer/client/implementation_base.cc b/gpu/command_buffer/client/implementation_base.cc
new file mode 100644
index 0000000..ff791c5
--- /dev/null
+++ b/gpu/command_buffer/client/implementation_base.cc
@@ -0,0 +1,340 @@
+// 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 "gpu/command_buffer/client/implementation_base.h"
+
+#include "base/strings/stringprintf.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/trace_event.h"
+#include "gpu/command_buffer/client/cmd_buffer_helper.h"
+#include "gpu/command_buffer/client/gpu_control.h"
+#include "gpu/command_buffer/client/mapped_memory.h"
+#include "gpu/command_buffer/client/query_tracker.h"
+#include "gpu/command_buffer/client/shared_memory_limits.h"
+#include "gpu/command_buffer/common/sync_token.h"
+
+namespace gpu {
+
+#if !defined(_MSC_VER)
+const size_t ImplementationBase::kMaxSizeOfSimpleResult;
+const unsigned int ImplementationBase::kStartingOffset;
+#endif
+
+ImplementationBase::ImplementationBase(CommandBufferHelper* helper,
+                                       TransferBufferInterface* transfer_buffer,
+                                       GpuControl* gpu_control)
+    : transfer_buffer_(transfer_buffer),
+      gpu_control_(gpu_control),
+      helper_(helper),
+      transfer_cache_(this),
+      weak_ptr_factory_(this) {}
+
+ImplementationBase::~ImplementationBase() {
+  // The gpu_control_ outlives this class, so clear the client on it before we
+  // self-destruct.
+  gpu_control_->SetGpuControlClient(nullptr);
+}
+
+void ImplementationBase::FreeUnusedSharedMemory() {
+  mapped_memory_->FreeUnused();
+}
+
+void ImplementationBase::FreeEverything() {
+  query_tracker_->Shrink(helper_);
+  FreeUnusedSharedMemory();
+  transfer_buffer_->Free();
+  helper_->FreeRingBuffer();
+}
+
+void ImplementationBase::SetLostContextCallback(base::OnceClosure callback) {
+  lost_context_callback_ = std::move(callback);
+}
+
+void ImplementationBase::FlushPendingWork() {
+  gpu_control_->FlushPendingWork();
+}
+
+void ImplementationBase::SignalSyncToken(const SyncToken& sync_token,
+                                         base::OnceClosure callback) {
+  SyncToken verified_sync_token;
+  if (sync_token.HasData() &&
+      GetVerifiedSyncTokenForIPC(sync_token, &verified_sync_token)) {
+    // We can only send verified sync tokens across IPC.
+    gpu_control_->SignalSyncToken(
+        verified_sync_token,
+        base::BindOnce(&ImplementationBase::RunIfContextNotLost,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  } else {
+    // Invalid sync token, just call the callback immediately.
+    std::move(callback).Run();
+  }
+}
+
+// This may be called from any thread. It's safe to access gpu_control_ without
+// the lock because it is const.
+bool ImplementationBase::IsSyncTokenSignaled(const SyncToken& sync_token) {
+  // Check that the sync token belongs to this context.
+  DCHECK_EQ(gpu_control_->GetNamespaceID(), sync_token.namespace_id());
+  DCHECK_EQ(gpu_control_->GetCommandBufferID(), sync_token.command_buffer_id());
+  return gpu_control_->IsFenceSyncReleased(sync_token.release_count());
+}
+
+void ImplementationBase::SignalQuery(uint32_t query,
+                                     base::OnceClosure callback) {
+  // Flush previously entered commands to ensure ordering with any
+  // glBeginQueryEXT() calls that may have been put into the context.
+  IssueShallowFlush();
+  gpu_control_->SignalQuery(
+      query,
+      base::BindOnce(&ImplementationBase::RunIfContextNotLost,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void ImplementationBase::GetGpuFence(
+    uint32_t gpu_fence_id,
+    base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback) {
+  // This ShallowFlush is required to ensure that the GetGpuFence
+  // call is processed after the preceding CreateGpuFenceCHROMIUM call.
+  IssueShallowFlush();
+  gpu_control_->GetGpuFence(gpu_fence_id, std::move(callback));
+}
+
+void* ImplementationBase::MapTransferCacheEntry(size_t serialized_size) {
+  return transfer_cache_.MapEntry(mapped_memory_.get(), serialized_size);
+}
+
+void ImplementationBase::UnmapAndCreateTransferCacheEntry(uint32_t type,
+                                                          uint32_t id) {
+  transfer_cache_.UnmapAndCreateEntry(type, id);
+}
+
+bool ImplementationBase::ThreadsafeLockTransferCacheEntry(uint32_t type,
+                                                          uint32_t id) {
+  return transfer_cache_.LockEntry(type, id);
+}
+
+void ImplementationBase::UnlockTransferCacheEntries(
+    const std::vector<std::pair<uint32_t, uint32_t>>& entries) {
+  transfer_cache_.UnlockEntries(entries);
+}
+
+void ImplementationBase::DeleteTransferCacheEntry(uint32_t type, uint32_t id) {
+  transfer_cache_.DeleteEntry(type, id);
+}
+
+unsigned int ImplementationBase::GetTransferBufferFreeSize() const {
+  return transfer_buffer_->GetFreeSize();
+}
+
+bool ImplementationBase::OnMemoryDump(
+    const base::trace_event::MemoryDumpArgs& args,
+    base::trace_event::ProcessMemoryDump* pmd) {
+  using base::trace_event::MemoryAllocatorDump;
+  using base::trace_event::MemoryDumpLevelOfDetail;
+
+  // Dump owned MappedMemoryManager memory as well.
+  mapped_memory_->OnMemoryDump(args, pmd);
+
+  if (!transfer_buffer_->HaveBuffer())
+    return true;
+
+  const uint64_t tracing_process_id =
+      base::trace_event::MemoryDumpManager::GetInstance()
+          ->GetTracingProcessId();
+
+  MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(base::StringPrintf(
+      "gpu/transfer_buffer_memory/buffer_%d", transfer_buffer_->GetShmId()));
+  dump->AddScalar(MemoryAllocatorDump::kNameSize,
+                  MemoryAllocatorDump::kUnitsBytes,
+                  transfer_buffer_->GetSize());
+
+  if (args.level_of_detail != MemoryDumpLevelOfDetail::BACKGROUND) {
+    dump->AddScalar("free_size", MemoryAllocatorDump::kUnitsBytes,
+                    transfer_buffer_->GetFragmentedFreeSize());
+    auto shared_memory_guid =
+        transfer_buffer_->shared_memory_handle().GetGUID();
+    const int kImportance = 2;
+    if (!shared_memory_guid.is_empty()) {
+      pmd->CreateSharedMemoryOwnershipEdge(dump->guid(), shared_memory_guid,
+                                           kImportance);
+    } else {
+      auto guid = GetBufferGUIDForTracing(tracing_process_id,
+                                          transfer_buffer_->GetShmId());
+      pmd->CreateSharedGlobalAllocatorDump(guid);
+      pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
+    }
+  }
+
+  return true;
+}
+
+gpu::ContextResult ImplementationBase::Initialize(
+    const SharedMemoryLimits& limits) {
+  TRACE_EVENT0("gpu", "ImplementationBase::Initialize");
+  DCHECK_GE(limits.start_transfer_buffer_size, limits.min_transfer_buffer_size);
+  DCHECK_LE(limits.start_transfer_buffer_size, limits.max_transfer_buffer_size);
+  DCHECK_GE(limits.min_transfer_buffer_size, kStartingOffset);
+
+  gpu_control_->SetGpuControlClient(this);
+
+  if (!transfer_buffer_->Initialize(
+          limits.start_transfer_buffer_size, kStartingOffset,
+          limits.min_transfer_buffer_size, limits.max_transfer_buffer_size,
+          kAlignment, kSizeToFlush)) {
+    // TransferBuffer::Initialize doesn't fail for transient reasons such as if
+    // the context was lost. See http://crrev.com/c/720269
+    LOG(ERROR) << "ContextResult::kFatalFailure: "
+               << "TransferBuffer::Initialize() failed";
+    return gpu::ContextResult::kFatalFailure;
+  }
+
+  mapped_memory_ = std::make_unique<MappedMemoryManager>(
+      helper_, limits.mapped_memory_reclaim_limit);
+  mapped_memory_->set_chunk_size_multiple(limits.mapped_memory_chunk_size);
+  query_tracker_ = std::make_unique<gles2::QueryTracker>(mapped_memory_.get());
+
+  return gpu::ContextResult::kSuccess;
+}
+
+void ImplementationBase::WaitForCmd() {
+  TRACE_EVENT0("gpu", "ImplementationBase::WaitForCmd");
+  helper_->Finish();
+}
+
+void* ImplementationBase::GetResultBuffer() {
+  return transfer_buffer_->GetResultBuffer();
+}
+
+int32_t ImplementationBase::GetResultShmId() {
+  return transfer_buffer_->GetShmId();
+}
+
+uint32_t ImplementationBase::GetResultShmOffset() {
+  return transfer_buffer_->GetResultOffset();
+}
+
+bool ImplementationBase::GetBucketContents(uint32_t bucket_id,
+                                           std::vector<int8_t>* data) {
+  TRACE_EVENT0("gpu", "ImplementationBase::GetBucketContents");
+  DCHECK(data);
+  const uint32_t kStartSize = 32 * 1024;
+  ScopedTransferBufferPtr buffer(kStartSize, helper_, transfer_buffer_);
+  if (!buffer.valid()) {
+    return false;
+  }
+  typedef cmd::GetBucketStart::Result Result;
+  Result* result = GetResultAs<Result*>();
+  if (!result) {
+    return false;
+  }
+  *result = 0;
+  helper_->GetBucketStart(bucket_id, GetResultShmId(), GetResultShmOffset(),
+                          buffer.size(), buffer.shm_id(), buffer.offset());
+  WaitForCmd();
+  uint32_t size = *result;
+  data->resize(size);
+  if (size > 0u) {
+    uint32_t offset = 0;
+    while (size) {
+      if (!buffer.valid()) {
+        buffer.Reset(size);
+        if (!buffer.valid()) {
+          return false;
+        }
+        helper_->GetBucketData(bucket_id, offset, buffer.size(),
+                               buffer.shm_id(), buffer.offset());
+        WaitForCmd();
+      }
+      uint32_t size_to_copy = std::min(size, buffer.size());
+      memcpy(&(*data)[offset], buffer.address(), size_to_copy);
+      offset += size_to_copy;
+      size -= size_to_copy;
+      buffer.Release();
+    }
+    // Free the bucket. This is not required but it does free up the memory.
+    // and we don't have to wait for the result so from the client's perspective
+    // it's cheap.
+    helper_->SetBucketSize(bucket_id, 0);
+  }
+  return true;
+}
+
+void ImplementationBase::SetBucketContents(uint32_t bucket_id,
+                                           const void* data,
+                                           size_t size) {
+  DCHECK(data);
+  helper_->SetBucketSize(bucket_id, size);
+  if (size > 0u) {
+    uint32_t offset = 0;
+    while (size) {
+      ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_);
+      if (!buffer.valid()) {
+        return;
+      }
+      memcpy(buffer.address(), static_cast<const int8_t*>(data) + offset,
+             buffer.size());
+      helper_->SetBucketData(bucket_id, offset, buffer.size(), buffer.shm_id(),
+                             buffer.offset());
+      offset += buffer.size();
+      size -= buffer.size();
+    }
+  }
+}
+
+void ImplementationBase::SetBucketAsCString(uint32_t bucket_id,
+                                            const char* str) {
+  // NOTE: strings are passed NULL terminated. That means the empty
+  // string will have a size of 1 and no-string will have a size of 0
+  if (str) {
+    SetBucketContents(bucket_id, str, strlen(str) + 1);
+  } else {
+    helper_->SetBucketSize(bucket_id, 0);
+  }
+}
+
+bool ImplementationBase::GetBucketAsString(uint32_t bucket_id,
+                                           std::string* str) {
+  DCHECK(str);
+  std::vector<int8_t> data;
+  // NOTE: strings are passed NULL terminated. That means the empty
+  // string will have a size of 1 and no-string will have a size of 0
+  if (!GetBucketContents(bucket_id, &data)) {
+    return false;
+  }
+  if (data.empty()) {
+    return false;
+  }
+  str->assign(&data[0], &data[0] + data.size() - 1);
+  return true;
+}
+
+void ImplementationBase::SetBucketAsString(uint32_t bucket_id,
+                                           const std::string& str) {
+  // NOTE: strings are passed NULL terminated. That means the empty
+  // string will have a size of 1 and no-string will have a size of 0
+  SetBucketContents(bucket_id, str.c_str(), str.size() + 1);
+}
+
+bool ImplementationBase::GetVerifiedSyncTokenForIPC(
+    const SyncToken& sync_token,
+    SyncToken* verified_sync_token) {
+  DCHECK(sync_token.HasData());
+  DCHECK(verified_sync_token);
+
+  if (!sync_token.verified_flush() &&
+      !gpu_control_->CanWaitUnverifiedSyncToken(sync_token))
+    return false;
+
+  *verified_sync_token = sync_token;
+  verified_sync_token->SetVerifyFlush();
+  return true;
+}
+
+void ImplementationBase::RunIfContextNotLost(base::OnceClosure callback) {
+  if (!lost_context_callback_run_) {
+    std::move(callback).Run();
+  }
+}
+
+}  // namespace gpu
diff --git a/gpu/command_buffer/client/implementation_base.h b/gpu/command_buffer/client/implementation_base.h
new file mode 100644
index 0000000..444ebc5
--- /dev/null
+++ b/gpu/command_buffer/client/implementation_base.h
@@ -0,0 +1,159 @@
+// 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 GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
+#define GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/trace_event/memory_dump_provider.h"
+#include "gpu/command_buffer/client/client_transfer_cache.h"
+#include "gpu/command_buffer/client/context_support.h"
+#include "gpu/command_buffer/client/gles2_impl_export.h"
+#include "gpu/command_buffer/client/gpu_control_client.h"
+#include "gpu/command_buffer/client/query_tracker.h"
+#include "gpu/command_buffer/client/transfer_buffer.h"
+#include "gpu/command_buffer/common/context_result.h"
+
+namespace gpu {
+
+namespace gles2 {
+class QueryTracker;
+}
+
+class CommandBufferHelper;
+class GpuControl;
+class MappedMemoryManager;
+struct SharedMemoryLimits;
+
+// Base class with functionality shared between GLES2Implementation and
+// RasterImplementation.
+class GLES2_IMPL_EXPORT ImplementationBase
+    : public base::trace_event::MemoryDumpProvider,
+      public ContextSupport,
+      public GpuControlClient,
+      public ClientTransferCache::Client {
+ public:
+  // The maximum result size from simple GL get commands.
+  static const size_t kMaxSizeOfSimpleResult =
+      16 * sizeof(uint32_t);  // NOLINT.
+
+  // used for testing only. If more things are reseved add them here.
+  static const unsigned int kStartingOffset = kMaxSizeOfSimpleResult;
+
+  // Size in bytes to issue async flush for transfer buffer.
+  static const unsigned int kSizeToFlush = 256 * 1024;
+
+  // Alignment of allocations.
+  static const unsigned int kAlignment = 16;
+
+  ImplementationBase(CommandBufferHelper* helper,
+                     TransferBufferInterface* transfer_buffer,
+                     GpuControl* gpu_control);
+  ~ImplementationBase() override;
+
+  void FreeUnusedSharedMemory();
+  void FreeEverything();
+
+  // TODO(danakj): Move to ContextSupport once ContextProvider doesn't need to
+  // intercept it.
+  void SetLostContextCallback(base::OnceClosure callback);
+
+  // ContextSupport implementation.
+  void FlushPendingWork() override;
+  void SignalSyncToken(const gpu::SyncToken& sync_token,
+                       base::OnceClosure callback) override;
+  bool IsSyncTokenSignaled(const gpu::SyncToken& sync_token) override;
+  void SignalQuery(uint32_t query, base::OnceClosure callback) override;
+  void GetGpuFence(uint32_t gpu_fence_id,
+                   base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)>
+                       callback) override;
+  void* MapTransferCacheEntry(size_t serialized_size) override;
+  void UnmapAndCreateTransferCacheEntry(uint32_t type, uint32_t id) override;
+  bool ThreadsafeLockTransferCacheEntry(uint32_t type, uint32_t id) override;
+  void UnlockTransferCacheEntries(
+      const std::vector<std::pair<uint32_t, uint32_t>>& entries) override;
+  void DeleteTransferCacheEntry(uint32_t type, uint32_t id) override;
+  unsigned int GetTransferBufferFreeSize() const override;
+
+  // base::trace_event::MemoryDumpProvider implementation.
+  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
+                    base::trace_event::ProcessMemoryDump* pmd) override;
+
+ protected:
+  gpu::ContextResult Initialize(const SharedMemoryLimits& limits);
+
+  // Waits for all commands to execute.
+  void WaitForCmd();
+
+  // Gets the value of the result.
+  template <typename T>
+  T GetResultAs() {
+    return static_cast<T>(GetResultBuffer());
+  }
+
+  void* GetResultBuffer();
+  int32_t GetResultShmId();
+  uint32_t GetResultShmOffset();
+
+  // TODO(gman): These bucket functions really seem like they belong in
+  // CommandBufferHelper (or maybe BucketHelper?). Unfortunately they need
+  // a transfer buffer to function which is currently managed by this class.
+
+  // Gets the contents of a bucket.
+  bool GetBucketContents(uint32_t bucket_id, std::vector<int8_t>* data);
+
+  // Sets the contents of a bucket.
+  void SetBucketContents(uint32_t bucket_id, const void* data, size_t size);
+
+  // Sets the contents of a bucket as a string.
+  void SetBucketAsCString(uint32_t bucket_id, const char* str);
+
+  // Gets the contents of a bucket as a string. Returns false if there is no
+  // string available which is a separate case from the empty string.
+  bool GetBucketAsString(uint32_t bucket_id, std::string* str);
+
+  // Sets the contents of a bucket as a string.
+  void SetBucketAsString(uint32_t bucket_id, const std::string& str);
+
+  bool GetVerifiedSyncTokenForIPC(const SyncToken& sync_token,
+                                  SyncToken* verified_sync_token);
+
+  void RunIfContextNotLost(base::OnceClosure callback);
+
+  TransferBufferInterface* transfer_buffer_;
+
+  std::unique_ptr<MappedMemoryManager> mapped_memory_;
+
+  std::unique_ptr<gles2::QueryTracker> query_tracker_;
+
+  base::OnceClosure lost_context_callback_;
+  bool lost_context_callback_run_ = false;
+
+  GpuControl* const gpu_control_;
+
+ private:
+  virtual void IssueShallowFlush() = 0;
+
+  CommandBufferHelper* helper_;
+
+  ClientTransferCache transfer_cache_;
+
+  base::WeakPtrFactory<ImplementationBase> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImplementationBase);
+};
+
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
diff --git a/gpu/command_buffer/client/logging.cc b/gpu/command_buffer/client/logging.cc
new file mode 100644
index 0000000..c92dbf6f
--- /dev/null
+++ b/gpu/command_buffer/client/logging.cc
@@ -0,0 +1,23 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/client/logging.h"
+
+#if defined(GPU_CLIENT_DEBUG)
+#include "base/command_line.h"
+#include "gpu/command_buffer/client/gpu_switches.h"
+#endif  // defined(GPU_CLIENT_DEBUG)
+
+namespace gpu {
+
+LogSettings::LogSettings() : enabled_(false) {
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    enabled_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
+        switches::kEnableGPUClientLogging);
+  });
+}
+
+LogSettings::~LogSettings() = default;
+
+}  // namespace gpu
diff --git a/gpu/command_buffer/client/logging.h b/gpu/command_buffer/client/logging.h
new file mode 100644
index 0000000..a56e75c
--- /dev/null
+++ b/gpu/command_buffer/client/logging.h
@@ -0,0 +1,68 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_CLIENT_LOGGING_H_
+#define GPU_COMMAND_BUFFER_CLIENT_LOGGING_H_
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "gpu/command_buffer/client/gles2_impl_export.h"
+
+// Macros to log information if DCHECK_IS_ON() and --enable-gpu-client-logging
+// flag is set. Code is optimized out if DCHECK is disabled. Requires that a
+// LogSettings named log_settings_ is in scope whenever a macro is used.
+//
+// Example usage:
+//
+// class Foo {
+//  public:
+//   Foo() {
+//     GPU_CLIENT_LOG("[" << LogPrefix() << "] Hello world");
+//     GPU_CLIENT_LOG_CODE_BLOCK({
+//       for (int i = 0; i < 10; ++i) {
+//         GPU_CLIENT_LOG_CODE_BLOCK("Hello again");
+//       }
+//     });
+//   }
+//
+//   std::string LogPrefix() { return "Foo"; }
+//
+//  private:
+//   LogSettings log_settings_;
+// };
+
+#if DCHECK_IS_ON() && !defined(__native_client__) && \
+    !defined(GLES2_CONFORMANCE_TESTS) && !defined(GLES2_INLINE_OPTIMIZATION)
+#define GPU_CLIENT_DEBUG
+#endif
+
+#if defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_LOG(args) DLOG_IF(INFO, log_settings_.enabled()) << args;
+#define GPU_CLIENT_LOG_CODE_BLOCK(code) code
+#define GPU_CLIENT_DCHECK_CODE_BLOCK(code) code
+#else  // !defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_LOG(args)
+#define GPU_CLIENT_LOG_CODE_BLOCK(code)
+#define GPU_CLIENT_DCHECK_CODE_BLOCK(code)
+#endif  // defined(GPU_CLIENT_DEBUG)
+
+namespace gpu {
+
+// Caches whether --enable-gpu-client-logging is set.
+class GLES2_IMPL_EXPORT LogSettings {
+ public:
+  LogSettings();
+  ~LogSettings();
+
+  bool enabled() { return enabled_; }
+
+ private:
+  bool enabled_;
+
+  DISALLOW_COPY_AND_ASSIGN(LogSettings);
+};
+
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_LOGGING_H_
diff --git a/gpu/command_buffer/client/raster_cmd_helper.cc b/gpu/command_buffer/client/raster_cmd_helper.cc
new file mode 100644
index 0000000..191dfa3
--- /dev/null
+++ b/gpu/command_buffer/client/raster_cmd_helper.cc
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/client/raster_cmd_helper.h"
+
+namespace gpu {
+namespace raster {
+
+RasterCmdHelper::RasterCmdHelper(CommandBuffer* command_buffer)
+    : CommandBufferHelper(command_buffer) {}
+
+RasterCmdHelper::~RasterCmdHelper() = default;
+
+}  // namespace raster
+}  // namespace gpu
diff --git a/gpu/command_buffer/client/raster_cmd_helper.h b/gpu/command_buffer/client/raster_cmd_helper.h
new file mode 100644
index 0000000..cab4dddd
--- /dev/null
+++ b/gpu/command_buffer/client/raster_cmd_helper.h
@@ -0,0 +1,36 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_H_
+#define GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_H_
+
+#include <stdint.h>
+
+#include "base/macros.h"
+#include "gpu/command_buffer/client/cmd_buffer_helper.h"
+#include "gpu/command_buffer/common/raster_cmd_format.h"
+#include "gpu/raster_export.h"
+
+namespace gpu {
+namespace raster {
+
+// A class that helps write GL command buffers.
+class RASTER_EXPORT RasterCmdHelper : public CommandBufferHelper {
+ public:
+  explicit RasterCmdHelper(CommandBuffer* command_buffer);
+  ~RasterCmdHelper() override;
+
+// Include the auto-generated part of this class. We split this because it
+// means we can easily edit the non-auto generated parts right here in this
+// file instead of having to edit some template or the code generator.
+#include "gpu/command_buffer/client/raster_cmd_helper_autogen.h"
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(RasterCmdHelper);
+};
+
+}  // namespace raster
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_H_
diff --git a/gpu/command_buffer/client/raster_cmd_helper_autogen.h b/gpu/command_buffer/client/raster_cmd_helper_autogen.h
new file mode 100644
index 0000000..e67d590
--- /dev/null
+++ b/gpu/command_buffer/client/raster_cmd_helper_autogen.h
@@ -0,0 +1,248 @@
+// 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.
+
+// This file is auto-generated from
+// gpu/command_buffer/build_raster_cmd_buffer.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+#ifndef GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_AUTOGEN_H_
+#define GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_AUTOGEN_H_
+
+void BindTexture(GLenum target, GLuint texture) {
+  raster::cmds::BindTexture* c = GetCmdSpace<raster::cmds::BindTexture>();
+  if (c) {
+    c->Init(target, texture);
+  }
+}
+
+void DeleteTexturesImmediate(GLsizei n, const GLuint* textures) {
+  const uint32_t size = raster::cmds::DeleteTexturesImmediate::ComputeSize(n);
+  raster::cmds::DeleteTexturesImmediate* c =
+      GetImmediateCmdSpaceTotalSize<raster::cmds::DeleteTexturesImmediate>(
+          size);
+  if (c) {
+    c->Init(n, textures);
+  }
+}
+
+void Finish() {
+  raster::cmds::Finish* c = GetCmdSpace<raster::cmds::Finish>();
+  if (c) {
+    c->Init();
+  }
+}
+
+void Flush() {
+  raster::cmds::Flush* c = GetCmdSpace<raster::cmds::Flush>();
+  if (c) {
+    c->Init();
+  }
+}
+
+void GenTexturesImmediate(GLsizei n, GLuint* textures) {
+  const uint32_t size = raster::cmds::GenTexturesImmediate::ComputeSize(n);
+  raster::cmds::GenTexturesImmediate* c =
+      GetImmediateCmdSpaceTotalSize<raster::cmds::GenTexturesImmediate>(size);
+  if (c) {
+    c->Init(n, textures);
+  }
+}
+
+void GetError(uint32_t result_shm_id, uint32_t result_shm_offset) {
+  raster::cmds::GetError* c = GetCmdSpace<raster::cmds::GetError>();
+  if (c) {
+    c->Init(result_shm_id, result_shm_offset);
+  }
+}
+
+void GetIntegerv(GLenum pname,
+                 uint32_t params_shm_id,
+                 uint32_t params_shm_offset) {
+  raster::cmds::GetIntegerv* c = GetCmdSpace<raster::cmds::GetIntegerv>();
+  if (c) {
+    c->Init(pname, params_shm_id, params_shm_offset);
+  }
+}
+
+void TexParameteri(GLenum target, GLenum pname, GLint param) {
+  raster::cmds::TexParameteri* c = GetCmdSpace<raster::cmds::TexParameteri>();
+  if (c) {
+    c->Init(target, pname, param);
+  }
+}
+
+void GenQueriesEXTImmediate(GLsizei n, GLuint* queries) {
+  const uint32_t size = raster::cmds::GenQueriesEXTImmediate::ComputeSize(n);
+  raster::cmds::GenQueriesEXTImmediate* c =
+      GetImmediateCmdSpaceTotalSize<raster::cmds::GenQueriesEXTImmediate>(size);
+  if (c) {
+    c->Init(n, queries);
+  }
+}
+
+void DeleteQueriesEXTImmediate(GLsizei n, const GLuint* queries) {
+  const uint32_t size = raster::cmds::DeleteQueriesEXTImmediate::ComputeSize(n);
+  raster::cmds::DeleteQueriesEXTImmediate* c =
+      GetImmediateCmdSpaceTotalSize<raster::cmds::DeleteQueriesEXTImmediate>(
+          size);
+  if (c) {
+    c->Init(n, queries);
+  }
+}
+
+void BeginQueryEXT(GLenum target,
+                   GLuint id,
+                   uint32_t sync_data_shm_id,
+                   uint32_t sync_data_shm_offset) {
+  raster::cmds::BeginQueryEXT* c = GetCmdSpace<raster::cmds::BeginQueryEXT>();
+  if (c) {
+    c->Init(target, id, sync_data_shm_id, sync_data_shm_offset);
+  }
+}
+
+void EndQueryEXT(GLenum target, GLuint submit_count) {
+  raster::cmds::EndQueryEXT* c = GetCmdSpace<raster::cmds::EndQueryEXT>();
+  if (c) {
+    c->Init(target, submit_count);
+  }
+}
+
+void CompressedCopyTextureCHROMIUM(GLuint source_id, GLuint dest_id) {
+  raster::cmds::CompressedCopyTextureCHROMIUM* c =
+      GetCmdSpace<raster::cmds::CompressedCopyTextureCHROMIUM>();
+  if (c) {
+    c->Init(source_id, dest_id);
+  }
+}
+
+void LoseContextCHROMIUM(GLenum current, GLenum other) {
+  raster::cmds::LoseContextCHROMIUM* c =
+      GetCmdSpace<raster::cmds::LoseContextCHROMIUM>();
+  if (c) {
+    c->Init(current, other);
+  }
+}
+
+void InsertFenceSyncCHROMIUM(GLuint64 release_count) {
+  raster::cmds::InsertFenceSyncCHROMIUM* c =
+      GetCmdSpace<raster::cmds::InsertFenceSyncCHROMIUM>();
+  if (c) {
+    c->Init(release_count);
+  }
+}
+
+void WaitSyncTokenCHROMIUM(GLint namespace_id,
+                           GLuint64 command_buffer_id,
+                           GLuint64 release_count) {
+  raster::cmds::WaitSyncTokenCHROMIUM* c =
+      GetCmdSpace<raster::cmds::WaitSyncTokenCHROMIUM>();
+  if (c) {
+    c->Init(namespace_id, command_buffer_id, release_count);
+  }
+}
+
+void UnpremultiplyAndDitherCopyCHROMIUM(GLuint source_id,
+                                        GLuint dest_id,
+                                        GLint x,
+                                        GLint y,
+                                        GLsizei width,
+                                        GLsizei height) {
+  raster::cmds::UnpremultiplyAndDitherCopyCHROMIUM* c =
+      GetCmdSpace<raster::cmds::UnpremultiplyAndDitherCopyCHROMIUM>();
+  if (c) {
+    c->Init(source_id, dest_id, x, y, width, height);
+  }
+}
+
+void InitializeDiscardableTextureCHROMIUM(GLuint texture_id,
+                                          uint32_t shm_id,
+                                          uint32_t shm_offset) {
+  raster::cmds::InitializeDiscardableTextureCHROMIUM* c =
+      GetCmdSpace<raster::cmds::InitializeDiscardableTextureCHROMIUM>();
+  if (c) {
+    c->Init(texture_id, shm_id, shm_offset);
+  }
+}
+
+void UnlockDiscardableTextureCHROMIUM(GLuint texture_id) {
+  raster::cmds::UnlockDiscardableTextureCHROMIUM* c =
+      GetCmdSpace<raster::cmds::UnlockDiscardableTextureCHROMIUM>();
+  if (c) {
+    c->Init(texture_id);
+  }
+}
+
+void LockDiscardableTextureCHROMIUM(GLuint texture_id) {
+  raster::cmds::LockDiscardableTextureCHROMIUM* c =
+      GetCmdSpace<raster::cmds::LockDiscardableTextureCHROMIUM>();
+  if (c) {
+    c->Init(texture_id);
+  }
+}
+
+void BeginRasterCHROMIUM(GLuint texture_id,
+                         GLuint sk_color,
+                         GLuint msaa_sample_count,
+                         GLboolean can_use_lcd_text,
+                         GLboolean use_distance_field_text,
+                         GLint color_type) {
+  raster::cmds::BeginRasterCHROMIUM* c =
+      GetCmdSpace<raster::cmds::BeginRasterCHROMIUM>();
+  if (c) {
+    c->Init(texture_id, sk_color, msaa_sample_count, can_use_lcd_text,
+            use_distance_field_text, color_type);
+  }
+}
+
+void RasterCHROMIUM(GLsizeiptr size,
+                    uint32_t list_shm_id,
+                    uint32_t list_shm_offset) {
+  raster::cmds::RasterCHROMIUM* c = GetCmdSpace<raster::cmds::RasterCHROMIUM>();
+  if (c) {
+    c->Init(size, list_shm_id, list_shm_offset);
+  }
+}
+
+void EndRasterCHROMIUM() {
+  raster::cmds::EndRasterCHROMIUM* c =
+      GetCmdSpace<raster::cmds::EndRasterCHROMIUM>();
+  if (c) {
+    c->Init();
+  }
+}
+
+void CreateTransferCacheEntryINTERNAL(GLuint entry_type,
+                                      GLuint entry_id,
+                                      GLuint handle_shm_id,
+                                      GLuint handle_shm_offset,
+                                      GLuint data_shm_id,
+                                      GLuint data_shm_offset,
+                                      GLuint data_size) {
+  raster::cmds::CreateTransferCacheEntryINTERNAL* c =
+      GetCmdSpace<raster::cmds::CreateTransferCacheEntryINTERNAL>();
+  if (c) {
+    c->Init(entry_type, entry_id, handle_shm_id, handle_shm_offset, data_shm_id,
+            data_shm_offset, data_size);
+  }
+}
+
+void DeleteTransferCacheEntryINTERNAL(GLuint entry_type, GLuint entry_id) {
+  raster::cmds::DeleteTransferCacheEntryINTERNAL* c =
+      GetCmdSpace<raster::cmds::DeleteTransferCacheEntryINTERNAL>();
+  if (c) {
+    c->Init(entry_type, entry_id);
+  }
+}
+
+void UnlockTransferCacheEntryINTERNAL(GLuint entry_type, GLuint entry_id) {
+  raster::cmds::UnlockTransferCacheEntryINTERNAL* c =
+      GetCmdSpace<raster::cmds::UnlockTransferCacheEntryINTERNAL>();
+  if (c) {
+    c->Init(entry_type, entry_id);
+  }
+}
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_CMD_HELPER_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc
new file mode 100644
index 0000000..d70ad697
--- /dev/null
+++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -0,0 +1,899 @@
+// 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 "gpu/command_buffer/client/raster_implementation.h"
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES2/gl2extchromium.h>
+#include <GLES3/gl3.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <algorithm>
+#include <sstream>
+#include <string>
+#include "base/atomic_sequence_num.h"
+#include "base/bits.h"
+#include "base/compiler_specific.h"
+#include "base/numerics/safe_math.h"
+#include "base/strings/stringprintf.h"
+#include "base/trace_event/memory_allocator_dump.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/process_memory_dump.h"
+#include "base/trace_event/trace_event.h"
+#include "build/build_config.h"
+#include "gpu/command_buffer/client/gpu_control.h"
+#include "gpu/command_buffer/client/query_tracker.h"
+#include "gpu/command_buffer/client/raster_cmd_helper.h"
+#include "gpu/command_buffer/client/shared_memory_limits.h"
+#include "gpu/command_buffer/client/transfer_buffer.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/ipc/color/gfx_param_traits.h"
+
+#if defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_SINGLE_THREAD_CHECK() SingleThreadChecker checker(this);
+#else  // !defined(GPU_CLIENT_DEBUG)
+#define GPU_CLIENT_SINGLE_THREAD_CHECK()
+#endif  // defined(GPU_CLIENT_DEBUG)
+
+// TODO(backer): Update APIs to always write to the destination? See below.
+//
+// Check that destination pointers point to initialized memory.
+// When the context is lost, calling GL function has no effect so if destination
+// pointers point to initialized memory it can often lead to crash bugs. eg.
+//
+// If it was up to us we'd just always write to the destination but the OpenGL
+// spec defines the behavior of OpenGL functions, not us. :-(
+#if defined(GPU_DCHECK)
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v)
+#define GPU_CLIENT_DCHECK(v) GPU_DCHECK(v)
+#elif defined(DCHECK)
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v)
+#define GPU_CLIENT_DCHECK(v) DCHECK(v)
+#else
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v)
+#define GPU_CLIENT_DCHECK(v) ASSERT(v)
+#endif
+
+#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \
+  GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(          \
+      ptr &&                                                     \
+      (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
+
+#define GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(type, ptr) \
+  GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(                   \
+      !ptr ||                                                             \
+      (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
+
+using gpu::gles2::GLES2Util;
+
+namespace gpu {
+namespace raster {
+
+RasterImplementation::SingleThreadChecker::SingleThreadChecker(
+    RasterImplementation* raster_implementation)
+    : raster_implementation_(raster_implementation) {
+  CHECK_EQ(0, raster_implementation_->use_count_);
+  ++raster_implementation_->use_count_;
+}
+
+RasterImplementation::SingleThreadChecker::~SingleThreadChecker() {
+  --raster_implementation_->use_count_;
+  CHECK_EQ(0, raster_implementation_->use_count_);
+}
+
+RasterImplementation::RasterImplementation(
+    RasterCmdHelper* helper,
+    TransferBufferInterface* transfer_buffer,
+    bool bind_generates_resource,
+    bool lose_context_when_out_of_memory,
+    GpuControl* gpu_control)
+    : ImplementationBase(helper, transfer_buffer, gpu_control),
+      helper_(helper),
+      error_bits_(0),
+      lose_context_when_out_of_memory_(lose_context_when_out_of_memory),
+      use_count_(0),
+      current_trace_stack_(0),
+      capabilities_(gpu_control->GetCapabilities()),
+      aggressively_free_resources_(false),
+      lost_(false) {
+  DCHECK(helper);
+  DCHECK(transfer_buffer);
+  DCHECK(gpu_control);
+
+  std::stringstream ss;
+  ss << std::hex << this;
+  this_in_hex_ = ss.str();
+}
+
+gpu::ContextResult RasterImplementation::Initialize(
+    const SharedMemoryLimits& limits) {
+  TRACE_EVENT0("gpu", "RasterImplementation::Initialize");
+
+  auto result = ImplementationBase::Initialize(limits);
+  if (result != gpu::ContextResult::kSuccess) {
+    return result;
+  }
+
+  texture_units_ = std::make_unique<TextureUnit[]>(
+      capabilities_.max_combined_texture_image_units);
+
+  return gpu::ContextResult::kSuccess;
+}
+
+RasterImplementation::~RasterImplementation() {
+  // Make sure the queries are finished otherwise we'll delete the
+  // shared memory (mapped_memory_) which will free the memory used
+  // by the queries. The GPU process when validating that memory is still
+  // shared will fail and abort (ie, it will stop running).
+  WaitForCmd();
+
+  query_tracker_.reset();
+
+  // Make sure the commands make it the service.
+  WaitForCmd();
+}
+
+RasterCmdHelper* RasterImplementation::helper() const {
+  return helper_;
+}
+
+IdAllocator* RasterImplementation::GetIdAllocator(IdNamespaces namespace_id) {
+  DCHECK_EQ(namespace_id, IdNamespaces::kQueries);
+  return &query_id_allocator_;
+}
+
+void RasterImplementation::OnGpuControlLostContext() {
+  OnGpuControlLostContextMaybeReentrant();
+
+  // This should never occur more than once.
+  DCHECK(!lost_context_callback_run_);
+  lost_context_callback_run_ = true;
+  if (!lost_context_callback_.is_null()) {
+    std::move(lost_context_callback_).Run();
+  }
+}
+
+void RasterImplementation::OnGpuControlLostContextMaybeReentrant() {
+  {
+    base::AutoLock hold(lost_lock_);
+    lost_ = true;
+  }
+}
+
+void RasterImplementation::OnGpuControlErrorMessage(const char* message,
+                                                    int32_t id) {
+  if (!error_message_callback_.is_null())
+    error_message_callback_.Run(message, id);
+}
+
+void RasterImplementation::SetAggressivelyFreeResources(
+    bool aggressively_free_resources) {
+  TRACE_EVENT1("gpu", "RasterImplementation::SetAggressivelyFreeResources",
+               "aggressively_free_resources", aggressively_free_resources);
+  aggressively_free_resources_ = aggressively_free_resources;
+
+  if (aggressively_free_resources_ && helper_->HaveRingBuffer()) {
+    // Flush will delete transfer buffer resources if
+    // |aggressively_free_resources_| is true.
+    Flush();
+  } else {
+    ShallowFlushCHROMIUM();
+  }
+}
+
+void RasterImplementation::Swap() {
+  NOTREACHED();
+}
+
+void RasterImplementation::SwapWithBounds(const std::vector<gfx::Rect>&
+                                          /* rects */) {
+  NOTREACHED();
+}
+
+void RasterImplementation::PartialSwapBuffers(
+    const gfx::Rect& /* sub_buffer */) {
+  NOTREACHED();
+}
+
+void RasterImplementation::CommitOverlayPlanes() {
+  NOTREACHED();
+}
+
+void RasterImplementation::ScheduleOverlayPlane(
+    int /* plane_z_order */,
+    gfx::OverlayTransform /* plane_transform */,
+    unsigned /* overlay_texture_id */,
+    const gfx::Rect& /* display_bounds */,
+    const gfx::RectF& /* uv_rect */) {
+  NOTREACHED();
+}
+
+uint64_t RasterImplementation::ShareGroupTracingGUID() const {
+  NOTREACHED();
+  return 0;
+}
+
+void RasterImplementation::SetErrorMessageCallback(
+    base::RepeatingCallback<void(const char*, int32_t)> callback) {
+  error_message_callback_ = std::move(callback);
+}
+
+void RasterImplementation::SetSnapshotRequested() {
+  // Should only be called for real GL contexts.
+  NOTREACHED();
+}
+
+bool RasterImplementation::ThreadSafeShallowLockDiscardableTexture(
+    uint32_t texture_id) {
+  return discardable_texture_manager_.TextureIsValid(texture_id) &&
+         discardable_texture_manager_.LockTexture(texture_id);
+}
+
+void RasterImplementation::CompleteLockDiscardableTexureOnContextThread(
+    uint32_t texture_id) {
+  helper_->LockDiscardableTextureCHROMIUM(texture_id);
+}
+
+bool RasterImplementation::ThreadsafeDiscardableTextureIsDeletedForTracing(
+    uint32_t texture_id) {
+  return discardable_texture_manager_.TextureIsDeletedForTracing(texture_id);
+}
+
+const std::string& RasterImplementation::GetLogPrefix() const {
+  const std::string& prefix(debug_marker_manager_.GetMarker());
+  return prefix.empty() ? this_in_hex_ : prefix;
+}
+
+GLenum RasterImplementation::GetError() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetError()");
+  GLenum err = GetGLError();
+  GPU_CLIENT_LOG("returned " << GLES2Util::GetStringError(err));
+  return err;
+}
+
+void RasterImplementation::IssueBeginQuery(GLenum target,
+                                           GLuint id,
+                                           uint32_t sync_data_shm_id,
+                                           uint32_t sync_data_shm_offset) {
+  helper_->BeginQueryEXT(target, id, sync_data_shm_id, sync_data_shm_offset);
+}
+
+void RasterImplementation::IssueEndQuery(GLenum target, GLuint submit_count) {
+  helper_->EndQueryEXT(target, submit_count);
+}
+
+void RasterImplementation::IssueQueryCounter(GLuint id,
+                                             GLenum target,
+                                             uint32_t sync_data_shm_id,
+                                             uint32_t sync_data_shm_offset,
+                                             GLuint submit_count) {
+  NOTIMPLEMENTED();
+}
+
+void RasterImplementation::IssueSetDisjointValueSync(
+    uint32_t sync_data_shm_id,
+    uint32_t sync_data_shm_offset) {
+  NOTIMPLEMENTED();
+}
+
+GLenum RasterImplementation::GetClientSideGLError() {
+  if (error_bits_ == 0) {
+    return GL_NO_ERROR;
+  }
+
+  GLenum error = GL_NO_ERROR;
+  for (uint32_t mask = 1; mask != 0; mask = mask << 1) {
+    if ((error_bits_ & mask) != 0) {
+      error = GLES2Util::GLErrorBitToGLError(mask);
+      break;
+    }
+  }
+  error_bits_ &= ~GLES2Util::GLErrorToErrorBit(error);
+  return error;
+}
+
+CommandBufferHelper* RasterImplementation::cmd_buffer_helper() {
+  return helper_;
+}
+
+void RasterImplementation::IssueCreateTransferCacheEntry(
+    GLuint entry_type,
+    GLuint entry_id,
+    GLuint handle_shm_id,
+    GLuint handle_shm_offset,
+    GLuint data_shm_id,
+    GLuint data_shm_offset,
+    GLuint data_size) {
+  helper_->CreateTransferCacheEntryINTERNAL(entry_type, entry_id, handle_shm_id,
+                                            handle_shm_offset, data_shm_id,
+                                            data_shm_offset, data_size);
+}
+
+void RasterImplementation::IssueDeleteTransferCacheEntry(GLuint entry_type,
+                                                         GLuint entry_id) {
+  helper_->DeleteTransferCacheEntryINTERNAL(entry_type, entry_id);
+}
+
+void RasterImplementation::IssueUnlockTransferCacheEntry(GLuint entry_type,
+                                                         GLuint entry_id) {
+  helper_->UnlockTransferCacheEntryINTERNAL(entry_type, entry_id);
+}
+
+CommandBuffer* RasterImplementation::command_buffer() const {
+  return helper_->command_buffer();
+}
+
+GLenum RasterImplementation::GetGLError() {
+  TRACE_EVENT0("gpu", "RasterImplementation::GetGLError");
+  // Check the GL error first, then our wrapped error.
+  typedef cmds::GetError::Result Result;
+  Result* result = GetResultAs<Result*>();
+  // If we couldn't allocate a result the context is lost.
+  if (!result) {
+    return GL_NO_ERROR;
+  }
+  *result = GL_NO_ERROR;
+  helper_->GetError(GetResultShmId(), GetResultShmOffset());
+  WaitForCmd();
+  GLenum error = *result;
+  if (error == GL_NO_ERROR) {
+    error = GetClientSideGLError();
+  } else {
+    // There was an error, clear the corresponding wrapped error.
+    error_bits_ &= ~GLES2Util::GLErrorToErrorBit(error);
+  }
+  return error;
+}
+
+#if defined(RASTER_CLIENT_FAIL_GL_ERRORS)
+void RasterImplementation::FailGLError(GLenum error) {
+  if (error != GL_NO_ERROR) {
+    NOTREACHED() << "Error";
+  }
+}
+// NOTE: Calling GetGLError overwrites data in the result buffer.
+void RasterImplementation::CheckGLError() {
+  FailGLError(GetGLError());
+}
+#endif  // defined(RASTER_CLIENT_FAIL_GL_ERRORS)
+
+void RasterImplementation::SetGLError(GLenum error,
+                                      const char* function_name,
+                                      const char* msg) {
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] Client Synthesized Error: "
+                     << GLES2Util::GetStringError(error) << ": "
+                     << function_name << ": " << msg);
+  FailGLError(error);
+  if (msg) {
+    last_error_ = msg;
+  }
+  if (!error_message_callback_.is_null()) {
+    std::string temp(GLES2Util::GetStringError(error) + " : " + function_name +
+                     ": " + (msg ? msg : ""));
+    error_message_callback_.Run(temp.c_str(), 0);
+  }
+  error_bits_ |= GLES2Util::GLErrorToErrorBit(error);
+
+  if (error == GL_OUT_OF_MEMORY && lose_context_when_out_of_memory_) {
+    helper_->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
+                                 GL_UNKNOWN_CONTEXT_RESET_ARB);
+  }
+}
+
+void RasterImplementation::SetGLErrorInvalidEnum(const char* function_name,
+                                                 GLenum value,
+                                                 const char* label) {
+  SetGLError(
+      GL_INVALID_ENUM, function_name,
+      (std::string(label) + " was " + GLES2Util::GetStringEnum(value)).c_str());
+}
+
+bool RasterImplementation::GetIntegervHelper(GLenum pname, GLint* params) {
+  switch (pname) {
+    case GL_MAX_TEXTURE_SIZE:
+      *params = capabilities_.max_texture_size;
+      return true;
+
+    default:
+      return false;
+  }
+}
+
+bool RasterImplementation::GetQueryObjectValueHelper(const char* function_name,
+                                                     GLuint id,
+                                                     GLenum pname,
+                                                     GLuint64* params) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryObjectValueHelper(" << id
+                     << ", " << GLES2Util::GetStringQueryObjectParameter(pname)
+                     << ", " << static_cast<const void*>(params) << ")");
+
+  gles2::QueryTracker::Query* query = query_tracker_->GetQuery(id);
+  if (!query) {
+    SetGLError(GL_INVALID_OPERATION, function_name, "unknown query id");
+    return false;
+  }
+
+  if (query->Active()) {
+    SetGLError(GL_INVALID_OPERATION, function_name,
+               "query active. Did you call glEndQueryEXT?");
+    return false;
+  }
+
+  if (query->NeverUsed()) {
+    SetGLError(GL_INVALID_OPERATION, function_name,
+               "Never used. Did you call glBeginQueryEXT?");
+    return false;
+  }
+
+  bool valid_value = false;
+  switch (pname) {
+    case GL_QUERY_RESULT_EXT:
+      if (!query->CheckResultsAvailable(helper_)) {
+        helper_->WaitForToken(query->token());
+        if (!query->CheckResultsAvailable(helper_)) {
+          FinishHelper();
+          CHECK(query->CheckResultsAvailable(helper_));
+        }
+      }
+      *params = query->GetResult();
+      valid_value = true;
+      break;
+    case GL_QUERY_RESULT_AVAILABLE_EXT:
+      *params = query->CheckResultsAvailable(helper_);
+      valid_value = true;
+      break;
+    default:
+      SetGLErrorInvalidEnum(function_name, pname, "pname");
+      break;
+  }
+  GPU_CLIENT_LOG("  " << *params);
+  CheckGLError();
+  return valid_value;
+}
+
+void RasterImplementation::Flush() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFlush()");
+  // Insert the cmd to call glFlush
+  helper_->Flush();
+  FlushHelper();
+}
+
+void RasterImplementation::ShallowFlushCHROMIUM() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShallowFlushCHROMIUM()");
+  FlushHelper();
+}
+
+void RasterImplementation::FlushHelper() {
+  // Flush our command buffer
+  // (tell the service to execute up to the flush cmd.)
+  helper_->CommandBufferHelper::Flush();
+
+  if (aggressively_free_resources_)
+    FreeEverything();
+}
+
+void RasterImplementation::OrderingBarrierCHROMIUM() {
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glOrderingBarrierCHROMIUM");
+  // Flush command buffer at the GPU channel level.  May be implemented as
+  // Flush().
+  helper_->CommandBufferHelper::OrderingBarrier();
+}
+
+void RasterImplementation::Finish() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  FinishHelper();
+}
+
+void RasterImplementation::FinishHelper() {
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFinish()");
+  TRACE_EVENT0("gpu", "RasterImplementation::Finish");
+  // Insert the cmd to call glFinish
+  helper_->Finish();
+  // Finish our command buffer
+  // (tell the service to execute up to the Finish cmd and wait for it to
+  // execute.)
+  helper_->CommandBufferHelper::Finish();
+
+  if (aggressively_free_resources_)
+    FreeEverything();
+}
+
+void RasterImplementation::GenQueriesEXTHelper(GLsizei /* n */,
+                                               const GLuint* /* queries */) {}
+
+void RasterImplementation::DeleteTexturesHelper(GLsizei n,
+                                                const GLuint* textures) {
+  helper_->DeleteTexturesImmediate(n, textures);
+  for (GLsizei ii = 0; ii < n; ++ii) {
+    texture_id_allocator_.FreeID(textures[ii]);
+    discardable_texture_manager_.FreeTexture(textures[ii]);
+  }
+  UnbindTexturesHelper(n, textures);
+}
+
+void RasterImplementation::UnbindTexturesHelper(GLsizei n,
+                                                const GLuint* textures) {
+  for (GLsizei ii = 0; ii < n; ++ii) {
+    for (GLint tt = 0; tt < capabilities_.max_combined_texture_image_units;
+         ++tt) {
+      TextureUnit& unit = texture_units_[tt];
+      if (textures[ii] == unit.bound_texture_2d) {
+        unit.bound_texture_2d = 0;
+      }
+    }
+  }
+}
+
+GLenum RasterImplementation::GetGraphicsResetStatusKHR() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetGraphicsResetStatusKHR()");
+
+  base::AutoLock hold(lost_lock_);
+  if (lost_)
+    return GL_UNKNOWN_CONTEXT_RESET_KHR;
+  return GL_NO_ERROR;
+}
+
+void RasterImplementation::DeleteQueriesEXTHelper(GLsizei n,
+                                                  const GLuint* queries) {
+  IdAllocator* id_allocator = GetIdAllocator(IdNamespaces::kQueries);
+  for (GLsizei ii = 0; ii < n; ++ii) {
+    query_tracker_->RemoveQuery(queries[ii]);
+    id_allocator->FreeID(queries[ii]);
+  }
+
+  helper_->DeleteQueriesEXTImmediate(n, queries);
+}
+
+void RasterImplementation::BeginQueryEXT(GLenum target, GLuint id) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT("
+                     << GLES2Util::GetStringQueryTarget(target) << ", " << id
+                     << ")");
+
+  switch (target) {
+    case GL_COMMANDS_COMPLETED_CHROMIUM:
+      if (!capabilities_.sync_query) {
+        SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT",
+                   "not enabled for commands completed queries");
+        return;
+      }
+      break;
+    default:
+      SetGLError(GL_INVALID_ENUM, "glBeginQueryEXT", "unknown query target");
+      return;
+  }
+
+  // if any outstanding queries INV_OP
+  if (query_tracker_->GetCurrentQuery(target)) {
+    SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT",
+               "query already in progress");
+    return;
+  }
+
+  if (id == 0) {
+    SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0");
+    return;
+  }
+
+  if (!GetIdAllocator(IdNamespaces::kQueries)->InUse(id)) {
+    SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "invalid id");
+    return;
+  }
+
+  if (query_tracker_->BeginQuery(id, target, this))
+    CheckGLError();
+}
+
+void RasterImplementation::EndQueryEXT(GLenum target) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT("
+                     << GLES2Util::GetStringQueryTarget(target) << ")");
+  if (query_tracker_->EndQuery(target, this))
+    CheckGLError();
+}
+
+void RasterImplementation::GetQueryObjectuivEXT(GLuint id,
+                                                GLenum pname,
+                                                GLuint* params) {
+  GLuint64 result = 0;
+  if (GetQueryObjectValueHelper("glGetQueryObjectuivEXT", id, pname, &result))
+    *params = base::saturated_cast<GLuint>(result);
+}
+
+void RasterImplementation::GenSyncTokenCHROMIUM(GLbyte* sync_token) {
+  if (!sync_token) {
+    SetGLError(GL_INVALID_VALUE, "glGenSyncTokenCHROMIUM", "empty sync_token");
+    return;
+  }
+
+  uint64_t fence_sync = gpu_control_->GenerateFenceSyncRelease();
+  helper_->InsertFenceSyncCHROMIUM(fence_sync);
+  helper_->CommandBufferHelper::OrderingBarrier();
+  gpu_control_->EnsureWorkVisible();
+
+  // Copy the data over after setting the data to ensure alignment.
+  SyncToken sync_token_data(gpu_control_->GetNamespaceID(),
+                            gpu_control_->GetCommandBufferID(), fence_sync);
+  sync_token_data.SetVerifyFlush();
+  memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
+}
+
+void RasterImplementation::GenUnverifiedSyncTokenCHROMIUM(GLbyte* sync_token) {
+  if (!sync_token) {
+    SetGLError(GL_INVALID_VALUE, "glGenUnverifiedSyncTokenCHROMIUM",
+               "empty sync_token");
+    return;
+  }
+
+  uint64_t fence_sync = gpu_control_->GenerateFenceSyncRelease();
+  helper_->InsertFenceSyncCHROMIUM(fence_sync);
+  helper_->CommandBufferHelper::OrderingBarrier();
+
+  // Copy the data over after setting the data to ensure alignment.
+  SyncToken sync_token_data(gpu_control_->GetNamespaceID(),
+                            gpu_control_->GetCommandBufferID(), fence_sync);
+  memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
+}
+
+void RasterImplementation::VerifySyncTokensCHROMIUM(GLbyte** sync_tokens,
+                                                    GLsizei count) {
+  bool requires_synchronization = false;
+  for (GLsizei i = 0; i < count; ++i) {
+    if (sync_tokens[i]) {
+      SyncToken sync_token;
+      memcpy(&sync_token, sync_tokens[i], sizeof(sync_token));
+
+      if (sync_token.HasData() && !sync_token.verified_flush()) {
+        if (!GetVerifiedSyncTokenForIPC(sync_token, &sync_token)) {
+          SetGLError(GL_INVALID_VALUE, "glVerifySyncTokensCHROMIUM",
+                     "Cannot verify sync token using this context.");
+          return;
+        }
+        requires_synchronization = true;
+        DCHECK(sync_token.verified_flush());
+      }
+
+      // Set verify bit on empty sync tokens too.
+      sync_token.SetVerifyFlush();
+
+      memcpy(sync_tokens[i], &sync_token, sizeof(sync_token));
+    }
+  }
+
+  // Ensure all the fence syncs are visible on GPU service.
+  if (requires_synchronization)
+    gpu_control_->EnsureWorkVisible();
+}
+
+void RasterImplementation::WaitSyncTokenCHROMIUM(
+    const GLbyte* sync_token_data) {
+  if (!sync_token_data)
+    return;
+
+  // Copy the data over before data access to ensure alignment.
+  SyncToken sync_token, verified_sync_token;
+  memcpy(&sync_token, sync_token_data, sizeof(SyncToken));
+
+  if (!sync_token.HasData())
+    return;
+
+  if (!GetVerifiedSyncTokenForIPC(sync_token, &verified_sync_token)) {
+    SetGLError(GL_INVALID_VALUE, "glWaitSyncTokenCHROMIUM",
+               "Cannot wait on sync_token which has not been verified");
+    return;
+  }
+
+  helper_->WaitSyncTokenCHROMIUM(
+      static_cast<GLint>(sync_token.namespace_id()),
+      sync_token.command_buffer_id().GetUnsafeValue(),
+      sync_token.release_count());
+
+  // Enqueue sync token in flush after inserting command so that it's not
+  // included in an automatic flush.
+  gpu_control_->WaitSyncTokenHint(verified_sync_token);
+}
+
+namespace {
+
+bool CreateImageValidInternalFormat(GLenum internalformat,
+                                    const Capabilities& capabilities) {
+  switch (internalformat) {
+    case GL_ATC_RGB_AMD:
+    case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
+      return capabilities.texture_format_atc;
+    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+      return capabilities.texture_format_dxt1;
+    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+      return capabilities.texture_format_dxt5;
+    case GL_ETC1_RGB8_OES:
+      return capabilities.texture_format_etc1;
+    case GL_R16_EXT:
+      return capabilities.texture_norm16;
+    case GL_RGB10_A2_EXT:
+      return capabilities.image_xr30;
+    case GL_RED:
+    case GL_RG_EXT:
+    case GL_RGB:
+    case GL_RGBA:
+    case GL_RGB_YCBCR_422_CHROMIUM:
+    case GL_RGB_YCBCR_420V_CHROMIUM:
+    case GL_RGB_YCRCB_420_CHROMIUM:
+    case GL_BGRA_EXT:
+      return true;
+    default:
+      return false;
+  }
+}
+
+}  // namespace
+
+GLuint RasterImplementation::CreateImageCHROMIUMHelper(ClientBuffer buffer,
+                                                       GLsizei width,
+                                                       GLsizei height,
+                                                       GLenum internalformat) {
+  if (width <= 0) {
+    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "width <= 0");
+    return 0;
+  }
+
+  if (height <= 0) {
+    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "height <= 0");
+    return 0;
+  }
+
+  if (!CreateImageValidInternalFormat(internalformat, capabilities_)) {
+    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "invalid format");
+    return 0;
+  }
+
+  // CreateImage creates a fence sync so we must flush first to ensure all
+  // previously created fence syncs are flushed first.
+  FlushHelper();
+
+  int32_t image_id =
+      gpu_control_->CreateImage(buffer, width, height, internalformat);
+  if (image_id < 0) {
+    SetGLError(GL_OUT_OF_MEMORY, "glCreateImageCHROMIUM", "image_id < 0");
+    return 0;
+  }
+  return image_id;
+}
+
+GLuint RasterImplementation::CreateImageCHROMIUM(ClientBuffer buffer,
+                                                 GLsizei width,
+                                                 GLsizei height,
+                                                 GLenum internalformat) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" << width
+                     << ", " << height << ", "
+                     << GLES2Util::GetStringImageInternalFormat(internalformat)
+                     << ")");
+  GLuint image_id =
+      CreateImageCHROMIUMHelper(buffer, width, height, internalformat);
+  CheckGLError();
+  return image_id;
+}
+
+void RasterImplementation::DestroyImageCHROMIUMHelper(GLuint image_id) {
+  // Flush the command stream to make sure all pending commands
+  // that may refer to the image_id are executed on the service side.
+  helper_->CommandBufferHelper::Flush();
+  gpu_control_->DestroyImage(image_id);
+}
+
+void RasterImplementation::DestroyImageCHROMIUM(GLuint image_id) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDestroyImageCHROMIUM("
+                     << image_id << ")");
+  DestroyImageCHROMIUMHelper(image_id);
+  CheckGLError();
+}
+
+void RasterImplementation::InitializeDiscardableTextureCHROMIUM(
+    GLuint texture_id) {
+  if (discardable_texture_manager_.TextureIsValid(texture_id)) {
+    SetGLError(GL_INVALID_VALUE, "glInitializeDiscardableTextureCHROMIUM",
+               "Texture ID already initialized");
+    return;
+  }
+  ClientDiscardableHandle handle =
+      discardable_texture_manager_.InitializeTexture(helper_->command_buffer(),
+                                                     texture_id);
+  if (!handle.IsValid())
+    return;
+
+  helper_->InitializeDiscardableTextureCHROMIUM(texture_id, handle.shm_id(),
+                                                handle.byte_offset());
+}
+
+void RasterImplementation::UnlockDiscardableTextureCHROMIUM(GLuint texture_id) {
+  if (!discardable_texture_manager_.TextureIsValid(texture_id)) {
+    SetGLError(GL_INVALID_VALUE, "glUnlockDiscardableTextureCHROMIUM",
+               "Texture ID not initialized");
+    return;
+  }
+
+  // |should_unbind_texture| will be set to true if the texture has been fully
+  // unlocked. In this case, ensure the texture is unbound.
+  bool should_unbind_texture = false;
+  discardable_texture_manager_.UnlockTexture(texture_id,
+                                             &should_unbind_texture);
+  if (should_unbind_texture)
+    UnbindTexturesHelper(1, &texture_id);
+
+  helper_->UnlockDiscardableTextureCHROMIUM(texture_id);
+}
+
+bool RasterImplementation::LockDiscardableTextureCHROMIUM(GLuint texture_id) {
+  if (discardable_texture_manager_.TextureIsValid(texture_id)) {
+    SetGLError(GL_INVALID_VALUE, "glLockDiscardableTextureCHROMIUM",
+               "Texture ID not initialized");
+    return false;
+  }
+  if (discardable_texture_manager_.LockTexture(texture_id)) {
+    // Failure to lock means that this texture has been deleted on the service
+    // side. Delete it here as well.
+    DeleteTexturesHelper(1, &texture_id);
+    return false;
+  }
+  helper_->LockDiscardableTextureCHROMIUM(texture_id);
+  return true;
+}
+
+void* RasterImplementation::MapRasterCHROMIUM(GLsizeiptr size) {
+  if (size < 0) {
+    SetGLError(GL_INVALID_VALUE, "glMapRasterCHROMIUM", "negative size");
+    return nullptr;
+  }
+  if (raster_mapped_buffer_) {
+    SetGLError(GL_INVALID_OPERATION, "glMapRasterCHROMIUM", "already mapped");
+    return nullptr;
+  }
+  raster_mapped_buffer_.emplace(size, helper_, transfer_buffer_);
+  if (!raster_mapped_buffer_->valid()) {
+    SetGLError(GL_INVALID_OPERATION, "glMapRasterCHROMIUM", "size too big");
+    raster_mapped_buffer_ = base::nullopt;
+    return nullptr;
+  }
+  return raster_mapped_buffer_->address();
+}
+
+void RasterImplementation::UnmapRasterCHROMIUM(GLsizeiptr written_size) {
+  if (written_size < 0) {
+    SetGLError(GL_INVALID_VALUE, "glUnmapRasterCHROMIUM",
+               "negative written_size");
+    return;
+  }
+  if (!raster_mapped_buffer_) {
+    SetGLError(GL_INVALID_OPERATION, "glUnmapRasterCHROMIUM", "not mapped");
+    return;
+  }
+  DCHECK(raster_mapped_buffer_->valid());
+  if (written_size == 0) {
+    raster_mapped_buffer_->Discard();
+    raster_mapped_buffer_ = base::nullopt;
+    return;
+  }
+  raster_mapped_buffer_->Shrink(written_size);
+  helper_->RasterCHROMIUM(written_size, raster_mapped_buffer_->shm_id(),
+                          raster_mapped_buffer_->offset());
+  raster_mapped_buffer_ = base::nullopt;
+  CheckGLError();
+}
+
+// Include the auto-generated part of this file. We split this because it means
+// we can easily edit the non-auto generated parts right here in this file
+// instead of having to edit some template or the code generator.
+#include "gpu/command_buffer/client/raster_implementation_impl_autogen.h"
+
+}  // namespace raster
+}  // namespace gpu
diff --git a/gpu/command_buffer/client/raster_implementation.h b/gpu/command_buffer/client/raster_implementation.h
new file mode 100644
index 0000000..f4abfe0
--- /dev/null
+++ b/gpu/command_buffer/client/raster_implementation.h
@@ -0,0 +1,258 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_H_
+#define GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/optional.h"
+#include "base/trace_event/memory_dump_provider.h"
+#include "gpu/command_buffer/client/client_discardable_texture_manager.h"
+#include "gpu/command_buffer/client/context_support.h"
+#include "gpu/command_buffer/client/gpu_control_client.h"
+#include "gpu/command_buffer/client/implementation_base.h"
+#include "gpu/command_buffer/client/logging.h"
+#include "gpu/command_buffer/client/mapped_memory.h"
+#include "gpu/command_buffer/client/raster_interface.h"
+#include "gpu/command_buffer/client/transfer_buffer.h"
+#include "gpu/command_buffer/common/capabilities.h"
+#include "gpu/command_buffer/common/context_result.h"
+#include "gpu/command_buffer/common/debug_marker_manager.h"
+#include "gpu/command_buffer/common/id_allocator.h"
+#include "gpu/raster_export.h"
+
+namespace gpu {
+
+class GpuControl;
+struct SharedMemoryLimits;
+
+namespace raster {
+
+class RasterCmdHelper;
+
+// This class emulates Raster over command buffers. It can be used by a client
+// program so that the program does not need deal with shared memory and command
+// buffer management.
+class RASTER_EXPORT RasterImplementation : public RasterInterface,
+                                           public ImplementationBase,
+                                           public gles2::QueryTrackerClient {
+ public:
+  RasterImplementation(RasterCmdHelper* helper,
+                       TransferBufferInterface* transfer_buffer,
+                       bool bind_generates_resource,
+                       bool lose_context_when_out_of_memory,
+                       GpuControl* gpu_control);
+
+  ~RasterImplementation() override;
+
+  gpu::ContextResult Initialize(const SharedMemoryLimits& limits);
+
+  // The RasterCmdHelper being used by this RasterImplementation. You can use
+  // this to issue cmds at a lower level for certain kinds of optimization.
+  RasterCmdHelper* helper() const;
+
+  // QueryTrackerClient implementation.
+  void IssueBeginQuery(GLenum target,
+                       GLuint id,
+                       uint32_t sync_data_shm_id,
+                       uint32_t sync_data_shm_offset) override;
+  void IssueEndQuery(GLenum target, GLuint submit_count) override;
+  void IssueQueryCounter(GLuint id,
+                         GLenum target,
+                         uint32_t sync_data_shm_id,
+                         uint32_t sync_data_shm_offset,
+                         GLuint submit_count) override;
+  void IssueSetDisjointValueSync(uint32_t sync_data_shm_id,
+                                 uint32_t sync_data_shm_offset) override;
+  GLenum GetClientSideGLError() override;
+  CommandBufferHelper* cmd_buffer_helper() override;
+  void SetGLError(GLenum error,
+                  const char* function_name,
+                  const char* msg) override;
+
+  // ClientTransferCache::Client implementation.
+  void IssueCreateTransferCacheEntry(GLuint entry_type,
+                                     GLuint entry_id,
+                                     GLuint handle_shm_id,
+                                     GLuint handle_shm_offset,
+                                     GLuint data_shm_id,
+                                     GLuint data_shm_offset,
+                                     GLuint data_size) override;
+  void IssueDeleteTransferCacheEntry(GLuint entry_type,
+                                     GLuint entry_id) override;
+  void IssueUnlockTransferCacheEntry(GLuint entry_type,
+                                     GLuint entry_id) override;
+  CommandBuffer* command_buffer() const override;
+
+// Include the auto-generated part of this class. We split this because
+// it means we can easily edit the non-auto generated parts right here in
+// this file instead of having to edit some template or the code generator.
+#include "gpu/command_buffer/client/raster_implementation_autogen.h"
+
+  // ContextSupport implementation.
+  void SetAggressivelyFreeResources(bool aggressively_free_resources) override;
+  void Swap() override;
+  void SwapWithBounds(const std::vector<gfx::Rect>& rects) override;
+  void PartialSwapBuffers(const gfx::Rect& sub_buffer) override;
+  void CommitOverlayPlanes() override;
+  void ScheduleOverlayPlane(int plane_z_order,
+                            gfx::OverlayTransform plane_transform,
+                            unsigned overlay_texture_id,
+                            const gfx::Rect& display_bounds,
+                            const gfx::RectF& uv_rect) override;
+  uint64_t ShareGroupTracingGUID() const override;
+  void SetErrorMessageCallback(
+      base::RepeatingCallback<void(const char*, int32_t)> callback) override;
+  void SetSnapshotRequested() override;
+  bool ThreadSafeShallowLockDiscardableTexture(uint32_t texture_id) override;
+  void CompleteLockDiscardableTexureOnContextThread(
+      uint32_t texture_id) override;
+  bool ThreadsafeDiscardableTextureIsDeletedForTracing(
+      uint32_t texture_id) override;
+
+  // TODO(danakj): Move to ContextSupport once ContextProvider doesn't need to
+  // intercept it.
+  void SetLostContextCallback(base::OnceClosure callback);
+
+  bool GetQueryObjectValueHelper(const char* function_name,
+                                 GLuint id,
+                                 GLenum pname,
+                                 GLuint64* params);
+
+ private:
+  using IdNamespaces = gles2::id_namespaces::IdNamespaces;
+
+  struct TextureUnit {
+    TextureUnit() : bound_texture_2d(0) {}
+    // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture
+    GLuint bound_texture_2d;
+  };
+
+  // Checks for single threaded access.
+  class SingleThreadChecker {
+   public:
+    explicit SingleThreadChecker(RasterImplementation* raster_implementation);
+    ~SingleThreadChecker();
+
+   private:
+    RasterImplementation* raster_implementation_;
+  };
+
+  // GpuControlClient implementation.
+  void OnGpuControlLostContext() final;
+  void OnGpuControlLostContextMaybeReentrant() final;
+  void OnGpuControlErrorMessage(const char* message, int32_t id) final;
+
+  // Gets the GLError through our wrapper.
+  GLenum GetGLError();
+
+  // Sets our wrapper for the GLError.
+  void SetGLErrorInvalidEnum(const char* function_name,
+                             GLenum value,
+                             const char* label);
+
+  // Returns the last error and clears it. Useful for debugging.
+  const std::string& GetLastError() { return last_error_; }
+
+  void GenQueriesEXTHelper(GLsizei n, const GLuint* queries);
+
+  void DeleteTexturesHelper(GLsizei n, const GLuint* textures);
+  void UnbindTexturesHelper(GLsizei n, const GLuint* textures);
+  void DeleteQueriesEXTHelper(GLsizei n, const GLuint* queries);
+
+  GLuint CreateImageCHROMIUMHelper(ClientBuffer buffer,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLenum internalformat);
+  void DestroyImageCHROMIUMHelper(GLuint image_id);
+
+  // Helpers for query functions.
+  bool GetIntegervHelper(GLenum pname, GLint* params);
+  bool GetTexParameterivHelper(GLenum target, GLenum pname, GLint* params);
+
+  // IdAllocators for objects that can't be shared among contexts.
+  IdAllocator* GetIdAllocator(IdNamespaces id_namespace);
+
+  void FinishHelper();
+  void FlushHelper();
+
+  void RunIfContextNotLost(base::OnceClosure callback);
+
+  const std::string& GetLogPrefix() const;
+
+// Set to 1 to have the client fail when a GL error is generated.
+// This helps find bugs in the renderer since the debugger stops on the error.
+#if DCHECK_IS_ON()
+#if 0
+#define RASTER_CLIENT_FAIL_GL_ERRORS
+#endif
+#endif
+
+#if defined(RASTER_CLIENT_FAIL_GL_ERRORS)
+  void CheckGLError();
+  void FailGLError(GLenum error);
+#else
+  void CheckGLError() {}
+  void FailGLError(GLenum /* error */) {}
+#endif
+
+  void* MapRasterCHROMIUM(GLsizeiptr size);
+  void UnmapRasterCHROMIUM(GLsizeiptr written_size);
+
+  RasterCmdHelper* helper_;
+  TransferBufferInterface* transfer_buffer_;
+  std::string last_error_;
+  gles2::DebugMarkerManager debug_marker_manager_;
+  std::string this_in_hex_;
+
+  std::unique_ptr<TextureUnit[]> texture_units_;
+
+  // Current GL error bits.
+  uint32_t error_bits_;
+
+  LogSettings log_settings_;
+
+  // When true, the context is lost when a GL_OUT_OF_MEMORY error occurs.
+  const bool lose_context_when_out_of_memory_;
+
+  // Used to check for single threaded access.
+  int use_count_;
+
+  base::Optional<ScopedTransferBufferPtr> raster_mapped_buffer_;
+
+  base::RepeatingCallback<void(const char*, int32_t)> error_message_callback_;
+  base::OnceClosure lost_context_callback_;
+  bool lost_context_callback_run_ = false;
+
+  int current_trace_stack_;
+
+  Capabilities capabilities_;
+
+  // Flag to indicate whether the implementation can retain resources, or
+  // whether it should aggressively free them.
+  bool aggressively_free_resources_;
+
+  IdAllocator texture_id_allocator_;
+  IdAllocator query_id_allocator_;
+
+  ClientDiscardableTextureManager discardable_texture_manager_;
+
+  mutable base::Lock lost_lock_;
+  bool lost_;
+
+  DISALLOW_COPY_AND_ASSIGN(RasterImplementation);
+};
+
+}  // namespace raster
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_H_
diff --git a/gpu/command_buffer/client/raster_implementation_autogen.h b/gpu/command_buffer/client/raster_implementation_autogen.h
new file mode 100644
index 0000000..2c50af8
--- /dev/null
+++ b/gpu/command_buffer/client/raster_implementation_autogen.h
@@ -0,0 +1,78 @@
+// 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.
+
+// This file is auto-generated from
+// gpu/command_buffer/build_raster_cmd_buffer.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+// This file is included by raster_implementation.h to declare the
+// GL api functions.
+#ifndef GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_AUTOGEN_H_
+#define GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_AUTOGEN_H_
+
+void DeleteTextures(GLsizei n, const GLuint* textures) override;
+
+void Finish() override;
+
+void Flush() override;
+
+GLenum GetError() override;
+
+void GetIntegerv(GLenum pname, GLint* params) override;
+
+void ShallowFlushCHROMIUM() override;
+
+void OrderingBarrierCHROMIUM() override;
+
+void TexParameteri(GLenum target, GLenum pname, GLint param) override;
+
+void GenQueriesEXT(GLsizei n, GLuint* queries) override;
+
+void DeleteQueriesEXT(GLsizei n, const GLuint* queries) override;
+
+void BeginQueryEXT(GLenum target, GLuint id) override;
+
+void EndQueryEXT(GLenum target) override;
+
+void GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) override;
+
+GLuint CreateImageCHROMIUM(ClientBuffer buffer,
+                           GLsizei width,
+                           GLsizei height,
+                           GLenum internalformat) override;
+
+void DestroyImageCHROMIUM(GLuint image_id) override;
+
+void CompressedCopyTextureCHROMIUM(GLuint source_id, GLuint dest_id) override;
+
+void LoseContextCHROMIUM(GLenum current, GLenum other) override;
+
+void GenSyncTokenCHROMIUM(GLbyte* sync_token) override;
+
+void GenUnverifiedSyncTokenCHROMIUM(GLbyte* sync_token) override;
+
+void VerifySyncTokensCHROMIUM(GLbyte** sync_tokens, GLsizei count) override;
+
+void WaitSyncTokenCHROMIUM(const GLbyte* sync_token) override;
+
+void UnpremultiplyAndDitherCopyCHROMIUM(GLuint source_id,
+                                        GLuint dest_id,
+                                        GLint x,
+                                        GLint y,
+                                        GLsizei width,
+                                        GLsizei height) override;
+
+GLenum GetGraphicsResetStatusKHR() override;
+
+void InitializeDiscardableTextureCHROMIUM(GLuint texture_id) override;
+
+void UnlockDiscardableTextureCHROMIUM(GLuint texture_id) override;
+
+bool LockDiscardableTextureCHROMIUM(GLuint texture_id) override;
+
+void EndRasterCHROMIUM() override;
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/raster_implementation_impl_autogen.h b/gpu/command_buffer/client/raster_implementation_impl_autogen.h
new file mode 100644
index 0000000..2b281ec2
--- /dev/null
+++ b/gpu/command_buffer/client/raster_implementation_impl_autogen.h
@@ -0,0 +1,171 @@
+// 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.
+
+// This file is auto-generated from
+// gpu/command_buffer/build_raster_cmd_buffer.py
+// It's formatted by clang-format using chromium coding style:
+//    clang-format -i -style=chromium filename
+// DO NOT EDIT!
+
+// This file is included by raster_implementation.cc to define the
+// GL api functions.
+#ifndef GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_IMPL_AUTOGEN_H_
+#define GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_IMPL_AUTOGEN_H_
+
+void RasterImplementation::DeleteTextures(GLsizei n, const GLuint* textures) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", "
+                     << static_cast<const void*>(textures) << ")");
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    for (GLsizei i = 0; i < n; ++i) {
+      GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
+    }
+  });
+  GPU_CLIENT_DCHECK_CODE_BLOCK({
+    for (GLsizei i = 0; i < n; ++i) {
+      DCHECK(textures[i] != 0);
+    }
+  });
+  if (n < 0) {
+    SetGLError(GL_INVALID_VALUE, "glDeleteTextures", "n < 0");
+    return;
+  }
+  DeleteTexturesHelper(n, textures);
+  CheckGLError();
+}
+
+void RasterImplementation::GetIntegerv(GLenum pname, GLint* params) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv("
+                     << GLES2Util::GetStringGLState(pname) << ", "
+                     << static_cast<const void*>(params) << ")");
+  TRACE_EVENT0("gpu", "RasterImplementation::GetIntegerv");
+  if (GetIntegervHelper(pname, params)) {
+    return;
+  }
+  typedef cmds::GetIntegerv::Result Result;
+  Result* result = GetResultAs<Result*>();
+  if (!result) {
+    return;
+  }
+  result->SetNumResults(0);
+  helper_->GetIntegerv(pname, GetResultShmId(), GetResultShmOffset());
+  WaitForCmd();
+  result->CopyResult(params);
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    for (int32_t i = 0; i < result->GetNumResults(); ++i) {
+      GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
+    }
+  });
+  CheckGLError();
+}
+void RasterImplementation::TexParameteri(GLenum target,
+                                         GLenum pname,
+                                         GLint param) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri("
+                     << GLES2Util::GetStringTextureBindTarget(target) << ", "
+                     << GLES2Util::GetStringTextureParameter(pname) << ", "
+                     << param << ")");
+  helper_->TexParameteri(target, pname, param);
+  CheckGLError();
+}
+
+void RasterImplementation::GenQueriesEXT(GLsizei n, GLuint* queries) {
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", "
+                     << static_cast<const void*>(queries) << ")");
+  if (n < 0) {
+    SetGLError(GL_INVALID_VALUE, "glGenQueriesEXT", "n < 0");
+    return;
+  }
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  IdAllocator* id_allocator = GetIdAllocator(IdNamespaces::kQueries);
+  for (GLsizei ii = 0; ii < n; ++ii)
+    queries[ii] = id_allocator->AllocateID();
+  GenQueriesEXTHelper(n, queries);
+  helper_->GenQueriesEXTImmediate(n, queries);
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    for (GLsizei i = 0; i < n; ++i) {
+      GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
+    }
+  });
+  CheckGLError();
+}
+
+void RasterImplementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", "
+                     << static_cast<const void*>(queries) << ")");
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    for (GLsizei i = 0; i < n; ++i) {
+      GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
+    }
+  });
+  GPU_CLIENT_DCHECK_CODE_BLOCK({
+    for (GLsizei i = 0; i < n; ++i) {
+      DCHECK(queries[i] != 0);
+    }
+  });
+  if (n < 0) {
+    SetGLError(GL_INVALID_VALUE, "glDeleteQueriesEXT", "n < 0");
+    return;
+  }
+  DeleteQueriesEXTHelper(n, queries);
+  CheckGLError();
+}
+
+void RasterImplementation::CompressedCopyTextureCHROMIUM(GLuint source_id,
+                                                         GLuint dest_id) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompressedCopyTextureCHROMIUM("
+                     << source_id << ", " << dest_id << ")");
+  helper_->CompressedCopyTextureCHROMIUM(source_id, dest_id);
+  CheckGLError();
+}
+
+void RasterImplementation::LoseContextCHROMIUM(GLenum current, GLenum other) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM("
+                     << GLES2Util::GetStringResetStatus(current) << ", "
+                     << GLES2Util::GetStringResetStatus(other) << ")");
+  helper_->LoseContextCHROMIUM(current, other);
+  CheckGLError();
+}
+
+void RasterImplementation::UnpremultiplyAndDitherCopyCHROMIUM(GLuint source_id,
+                                                              GLuint dest_id,
+                                                              GLint x,
+                                                              GLint y,
+                                                              GLsizei width,
+                                                              GLsizei height) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix()
+                     << "] glUnpremultiplyAndDitherCopyCHROMIUM(" << source_id
+                     << ", " << dest_id << ", " << x << ", " << y << ", "
+                     << width << ", " << height << ")");
+  if (width < 0) {
+    SetGLError(GL_INVALID_VALUE, "glUnpremultiplyAndDitherCopyCHROMIUM",
+               "width < 0");
+    return;
+  }
+  if (height < 0) {
+    SetGLError(GL_INVALID_VALUE, "glUnpremultiplyAndDitherCopyCHROMIUM",
+               "height < 0");
+    return;
+  }
+  helper_->UnpremultiplyAndDitherCopyCHROMIUM(source_id, dest_id, x, y, width,
+                                              height);
+  CheckGLError();
+}
+
+void RasterImplementation::EndRasterCHROMIUM() {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEndRasterCHROMIUM("
+                     << ")");
+  helper_->EndRasterCHROMIUM();
+  CheckGLError();
+}
+
+#endif  // GPU_COMMAND_BUFFER_CLIENT_RASTER_IMPLEMENTATION_IMPL_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/raster_cmd_format_autogen.h b/gpu/command_buffer/common/raster_cmd_format_autogen.h
index 8fd11d32..27b2434 100644
--- a/gpu/command_buffer/common/raster_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/raster_cmd_format_autogen.h
@@ -559,6 +559,49 @@
 static_assert(offsetof(LoseContextCHROMIUM, other) == 8,
               "offset of LoseContextCHROMIUM other should be 8");
 
+struct InsertFenceSyncCHROMIUM {
+  typedef InsertFenceSyncCHROMIUM ValueType;
+  static const CommandId kCmdId = kInsertFenceSyncCHROMIUM;
+  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1);
+
+  static uint32_t ComputeSize() {
+    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT
+  }
+
+  void SetHeader() { header.SetCmd<ValueType>(); }
+
+  void Init(GLuint64 _release_count) {
+    SetHeader();
+    gles2::GLES2Util::MapUint64ToTwoUint32(
+        static_cast<uint64_t>(_release_count), &release_count_0,
+        &release_count_1);
+  }
+
+  void* Set(void* cmd, GLuint64 _release_count) {
+    static_cast<ValueType*>(cmd)->Init(_release_count);
+    return NextCmdAddress<ValueType>(cmd);
+  }
+
+  GLuint64 release_count() const volatile {
+    return static_cast<GLuint64>(gles2::GLES2Util::MapTwoUint32ToUint64(
+        release_count_0, release_count_1));
+  }
+
+  gpu::CommandHeader header;
+  uint32_t release_count_0;
+  uint32_t release_count_1;
+};
+
+static_assert(sizeof(InsertFenceSyncCHROMIUM) == 12,
+              "size of InsertFenceSyncCHROMIUM should be 12");
+static_assert(offsetof(InsertFenceSyncCHROMIUM, header) == 0,
+              "offset of InsertFenceSyncCHROMIUM header should be 0");
+static_assert(offsetof(InsertFenceSyncCHROMIUM, release_count_0) == 4,
+              "offset of InsertFenceSyncCHROMIUM release_count_0 should be 4");
+static_assert(offsetof(InsertFenceSyncCHROMIUM, release_count_1) == 8,
+              "offset of InsertFenceSyncCHROMIUM release_count_1 should be 8");
+
 struct WaitSyncTokenCHROMIUM {
   typedef WaitSyncTokenCHROMIUM ValueType;
   static const CommandId kCmdId = kWaitSyncTokenCHROMIUM;
diff --git a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
index 8f3c30be..da15742 100644
--- a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
@@ -203,6 +203,17 @@
   CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
 }
 
+TEST_F(RasterFormatTest, InsertFenceSyncCHROMIUM) {
+  cmds::InsertFenceSyncCHROMIUM& cmd =
+      *GetBufferAs<cmds::InsertFenceSyncCHROMIUM>();
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLuint64>(11));
+  EXPECT_EQ(static_cast<uint32_t>(cmds::InsertFenceSyncCHROMIUM::kCmdId),
+            cmd.header.command);
+  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+  EXPECT_EQ(static_cast<GLuint64>(11), cmd.release_count());
+  CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
 TEST_F(RasterFormatTest, WaitSyncTokenCHROMIUM) {
   cmds::WaitSyncTokenCHROMIUM& cmd =
       *GetBufferAs<cmds::WaitSyncTokenCHROMIUM>();
diff --git a/gpu/command_buffer/common/raster_cmd_ids_autogen.h b/gpu/command_buffer/common/raster_cmd_ids_autogen.h
index a4fd4828..e3e1258d6 100644
--- a/gpu/command_buffer/common/raster_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/raster_cmd_ids_autogen.h
@@ -26,17 +26,18 @@
   OP(EndQueryEXT)                          /* 267 */ \
   OP(CompressedCopyTextureCHROMIUM)        /* 268 */ \
   OP(LoseContextCHROMIUM)                  /* 269 */ \
-  OP(WaitSyncTokenCHROMIUM)                /* 270 */ \
-  OP(UnpremultiplyAndDitherCopyCHROMIUM)   /* 271 */ \
-  OP(InitializeDiscardableTextureCHROMIUM) /* 272 */ \
-  OP(UnlockDiscardableTextureCHROMIUM)     /* 273 */ \
-  OP(LockDiscardableTextureCHROMIUM)       /* 274 */ \
-  OP(BeginRasterCHROMIUM)                  /* 275 */ \
-  OP(RasterCHROMIUM)                       /* 276 */ \
-  OP(EndRasterCHROMIUM)                    /* 277 */ \
-  OP(CreateTransferCacheEntryINTERNAL)     /* 278 */ \
-  OP(DeleteTransferCacheEntryINTERNAL)     /* 279 */ \
-  OP(UnlockTransferCacheEntryINTERNAL)     /* 280 */
+  OP(InsertFenceSyncCHROMIUM)              /* 270 */ \
+  OP(WaitSyncTokenCHROMIUM)                /* 271 */ \
+  OP(UnpremultiplyAndDitherCopyCHROMIUM)   /* 272 */ \
+  OP(InitializeDiscardableTextureCHROMIUM) /* 273 */ \
+  OP(UnlockDiscardableTextureCHROMIUM)     /* 274 */ \
+  OP(LockDiscardableTextureCHROMIUM)       /* 275 */ \
+  OP(BeginRasterCHROMIUM)                  /* 276 */ \
+  OP(RasterCHROMIUM)                       /* 277 */ \
+  OP(EndRasterCHROMIUM)                    /* 278 */ \
+  OP(CreateTransferCacheEntryINTERNAL)     /* 279 */ \
+  OP(DeleteTransferCacheEntryINTERNAL)     /* 280 */ \
+  OP(UnlockTransferCacheEntryINTERNAL)     /* 281 */
 
 enum CommandId {
   kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/raster_cmd_buffer_functions.txt b/gpu/command_buffer/raster_cmd_buffer_functions.txt
index 47933a7..f4450ba 100644
--- a/gpu/command_buffer/raster_cmd_buffer_functions.txt
+++ b/gpu/command_buffer/raster_cmd_buffer_functions.txt
@@ -25,6 +25,7 @@
 GL_APICALL void         GL_APIENTRY glDestroyImageCHROMIUM (GLuint image_id);
 GL_APICALL void         GL_APIENTRY glCompressedCopyTextureCHROMIUM (GLuint source_id, GLuint dest_id);
 GL_APICALL void         GL_APIENTRY glLoseContextCHROMIUM (GLenumResetStatus current, GLenumResetStatus other);
+GL_APICALL GLuint64     GL_APIENTRY glInsertFenceSyncCHROMIUM (void);
 GL_APICALL void         GL_APIENTRY glGenSyncTokenCHROMIUM (GLbyte* sync_token);
 GL_APICALL void         GL_APIENTRY glGenUnverifiedSyncTokenCHROMIUM (GLbyte* sync_token);
 GL_APICALL void         GL_APIENTRY glVerifySyncTokensCHROMIUM (GLbyte** sync_tokens, GLsizei count);
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index 816e4a8..f69fc63 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -899,6 +899,13 @@
   return error::kNoError;
 }
 
+error::Error RasterDecoderImpl::HandleInsertFenceSyncCHROMIUM(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  NOTIMPLEMENTED();
+  return error::kNoError;
+}
+
 void RasterDecoderImpl::DoFinish() {
   api()->glFinishFn();
   ProcessPendingQueries(true);
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index 49025b0..b19f9a4 100644
--- a/gpu/ipc/in_process_command_buffer.cc
+++ b/gpu/ipc/in_process_command_buffer.cc
@@ -470,8 +470,14 @@
     decoder_.reset();
   }
   command_buffer_.reset();
-  context_ = nullptr;
+
+  // Destroy the surface with the context current, some surface destructors make
+  // GL calls.
+  if (context_)
+    context_->MakeCurrent(surface_.get());
   surface_ = nullptr;
+
+  context_ = nullptr;
   if (sync_point_order_data_) {
     sync_point_order_data_->Destroy();
     sync_point_order_data_ = nullptr;
diff --git a/gpu/skia_bindings/grcontext_for_gles2_interface.cc b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
index 7ace97fd..311b27a6 100644
--- a/gpu/skia_bindings/grcontext_for_gles2_interface.cc
+++ b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
@@ -70,6 +70,7 @@
   options.fGlyphCacheTextureMaximumBytes = max_glyph_cache_texture_bytes;
   options.fAvoidStencilBuffers = capabilities.avoid_stencil_buffers;
   options.fAllowPathMaskCaching = false;
+  options.fSharpenMipmappedTextures = true;
   sk_sp<GrGLInterface> interface(
       skia_bindings::CreateGLES2InterfaceBindings(gl));
   gr_context_ = GrContext::MakeGL(std::move(interface), options);
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.cc b/headless/lib/browser/headless_devtools_manager_delegate.cc
index 93487a4a..0395ccb 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.cc
+++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
@@ -951,7 +951,7 @@
   }
 
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kRunAllCompositorStagesBeforeDraw) &&
+          ::switches::kRunAllCompositorStagesBeforeDraw) &&
       headless_contents->HasPendingFrame()) {
     LOG(WARNING) << "A BeginFrame is already in flight. In "
                     "--run-all-compositor-stages-before-draw mode, only a "
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
index 68762a1..4302b458 100644
--- a/infra/config/cq.cfg
+++ b/infra/config/cq.cfg
@@ -110,7 +110,7 @@
       }
       builders {
         name: "linux_chromium_rel_ng"
-        equivalent_to { bucket: "luci.chromium.try" percentage: 0 }
+        equivalent_to { bucket: "luci.chromium.try" percentage: 100 }
       }
     }
     buckets {
@@ -177,7 +177,7 @@
         # TODO(jchinlee): remove this builder once enough data has been
         # collected.
         name: "win_chromium_dbg_ng"
-        experiment_percentage: 2
+        experiment_percentage: 5
       }
       builders {
         name: "win7_chromium_rel_loc_exp"
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 100ee37..638a005 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -291,7 +291,7 @@
 
 На <ph name="TIME" /> данните ви бяха шифровани с пропуска ви за синхронизиране. Въведете го, за да стартирате синхронизирането.</translation>
 <translation id="6418346271604475326">PDF файлът се подготвя</translation>
-<translation id="6434591244308415567">Възникна грешка. Oпитайте отново по-късно.</translation>
+<translation id="6434591244308415567">Възникна грешка. Опитайте отново по-късно.</translation>
 <translation id="6445051938772793705">Държава</translation>
 <translation id="6445981559479772097">Съобщ. е изпратено.</translation>
 <translation id="6464071786529933911">Отв. в нов раздел „инкогнито“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index be2967c..2658be2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -251,7 +251,7 @@
 <translation id="5871497086027727873">১টি আইটেম সরানো হয়েছে</translation>
 <translation id="5911030830365207728">Google অনুবাদ</translation>
 <translation id="5916664084637901428">চালু</translation>
-<translation id="5938160824633642847">আপনার ডিভাইস প্রায় ভর্তি হয়ে গেছে। জায়গা খালি করে আবার চেষ্টা করুন।</translation>
+<translation id="5938160824633642847">আপনার ডিভাইসে পর্যাপ্ত জায়গা নেই। জায়গা খালি করে আবার চেষ্টা করুন।</translation>
 <translation id="5948291296578561264">এর ফলে আপনি ফটো লাইব্রেরিতে ফটো সেভ করতে পারবেন।</translation>
 <translation id="5955891643922670672">অফলাইন সংস্করণ দেখছেন</translation>
 <translation id="5964480694698977962">নতুন ছদ্মবেশী ট্যাব তৈরি করুন।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index c4246bd..3372f934 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">Přesunuta 1 položka</translation>
 <translation id="5911030830365207728">Překladač Google</translation>
 <translation id="5916664084637901428">Zapnuto</translation>
-<translation id="5938160824633642847">Zařízení je téměř plné. Uvolněte paměť a zkuste to znovu.</translation>
+<translation id="5938160824633642847">Zařízení je téměř plné. Uvolněte místo a zkuste to znovu.</translation>
 <translation id="5948291296578561264">Toto umožňuje ukládat fotky do vaší knihovny fotek.</translation>
 <translation id="5955891643922670672">Zobrazuje se offline verze</translation>
 <translation id="5964480694698977962">Vytvořit novou anonymní kartu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 4801c639..c0797df 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -34,7 +34,7 @@
 <translation id="145015347812617860"><ph name="COUNT" /> Elemente</translation>
 <translation id="1491277525950327607">Zum Aktivieren bzw. Deaktivieren doppeltippen</translation>
 <translation id="152234381334907219">Nie speichern für...</translation>
-<translation id="1532451416480227577">Adressen und Kreditkarten aus Google Pay aufrufen</translation>
+<translation id="1532451416480227577">Adressen und Kreditkarten aus Google Pay anzeigen</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">QR-Code scannen</translation>
 <translation id="1580783302095112590">E-Mail gesendet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 6bbb6309..d5d931b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">1 elemento eliminado</translation>
 <translation id="5911030830365207728">Traductor de Google</translation>
 <translation id="5916664084637901428">Activar</translation>
-<translation id="5938160824633642847">Tu dispositivo está casi lleno. Libera espacio e inténtalo de nuevo.</translation>
+<translation id="5938160824633642847">Tu dispositivo está casi lleno. Libera espacio y vuelve a intentarlo.</translation>
 <translation id="5948291296578561264">Esta acción te permite guardar fotos en tu biblioteca.</translation>
 <translation id="5955891643922670672">Viendo versión sin conexión</translation>
 <translation id="5964480694698977962">Crear nueva pestaña de incógnito.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 44db26d..f2ffb5e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">1 elem áthelyezve</translation>
 <translation id="5911030830365207728">Google Fordító</translation>
 <translation id="5916664084637901428">Be</translation>
-<translation id="5938160824633642847">Az eszköz majdnem megtelt. Szabadítson fel tárhelyet, és próbálja újra.</translation>
+<translation id="5938160824633642847">Az eszköz tárhelye majdnem megtelt. Szabadítson fel helyet, és próbálja újra.</translation>
 <translation id="5948291296578561264">Segítségével fotókat menthet a fotótárba.</translation>
 <translation id="5955891643922670672">Offline verzió</translation>
 <translation id="5964480694698977962">Új inkognitólap létrehozása.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 341598c..b3ae4d7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -291,7 +291,7 @@
 
 データは <ph name="TIME" /> に同期パスフレーズで暗号化されました。同期を開始するには、同期パスフレーズを入力してください。</translation>
 <translation id="6418346271604475326">PDF を準備しています</translation>
-<translation id="6434591244308415567">エラーが発生しました。しばらくしてからもう一度お試しください。</translation>
+<translation id="6434591244308415567">エラーが発生しました。しばらくしてからもう一度試してください。</translation>
 <translation id="6445051938772793705">国</translation>
 <translation id="6445981559479772097">メッセージ送信完了。</translation>
 <translation id="6464071786529933911">新しいシークレット タブで開く</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index a6bce4d..2cacb27d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">1개 항목 이동함</translation>
 <translation id="5911030830365207728">Google 번역</translation>
 <translation id="5916664084637901428">사용</translation>
-<translation id="5938160824633642847">기기 용량이 거의 가득 찼습니다. 여유 공간을 확보한 후 다시 시도하세요.</translation>
+<translation id="5938160824633642847">기기의 저장용량이 거의 가득 찼습니다. 여유 공간을 확보한 후 다시 시도해 보세요.</translation>
 <translation id="5948291296578561264">이렇게 하면 사진 라이브러리에 사진을 저장할 수 있습니다.</translation>
 <translation id="5955891643922670672">오프라인 버전 보는 중</translation>
 <translation id="5964480694698977962">새 시크릿 탭 만들기</translation>
@@ -291,7 +291,7 @@
 
 <ph name="TIME" />에 동기화 암호로 데이터가 암호화되었습니다. 동기화를 시작하려면 입력하세요.</translation>
 <translation id="6418346271604475326">PDF 준비 중</translation>
-<translation id="6434591244308415567">오류가 발생했습니다. 나중에 다시 시도하세요.</translation>
+<translation id="6434591244308415567">오류가 발생했습니다. 나중에 다시 시도해 보세요.</translation>
 <translation id="6445051938772793705">국가</translation>
 <translation id="6445981559479772097">메시지가 전송되었습니다.</translation>
 <translation id="6464071786529933911">새 시크릿 탭에서 열기</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 4a852af8..c6e3a9f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -251,7 +251,7 @@
 <translation id="5871497086027727873">1 आयटम हलविला</translation>
 <translation id="5911030830365207728">Google भाषांतर</translation>
 <translation id="5916664084637901428">चालू</translation>
-<translation id="5938160824633642847">तुमचे डिव्हाइस जवळजवळ भरलेले आहे. जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
+<translation id="5938160824633642847">तुमचे डिव्हाइस जवळजवळ भरले आहे. जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5948291296578561264">हे तुम्हाला तुमच्या फोटो लायब्ररीवर फोटो सेव्ह करू देते.</translation>
 <translation id="5955891643922670672">ऑफलाइन आवृत्ती पाहत आहे</translation>
 <translation id="5964480694698977962">नवीन गुप्त टॅब तयार करा.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index e20d6c30..bc80a39 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -302,7 +302,7 @@
 <translation id="6657585470893396449">Wachtwoord</translation>
 <translation id="667999046851023355">Document</translation>
 <translation id="6713747756340119864">Google Apps</translation>
-<translation id="6730682669179532099">Kan wachtwoorden niet exporteren</translation>
+<translation id="6730682669179532099">Wachtwoorden kunnen niet worden geëxporteerd</translation>
 <translation id="6762156594045689028">Als je deze instelling wilt wijzigen, <ph name="BEGIN_LINK" />stel je de synchronisatie opnieuw in<ph name="END_LINK" /></translation>
 <translation id="6780034285637185932">Postcode</translation>
 <translation id="6785453220513215166">Crashrapport verzenden...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 40518b7..2bd74f4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -410,7 +410,7 @@
 <translation id="9034759925968272072">Nie spowoduje to wylogowania z konta Google. Inne rodzaje historii przeglądania mogą być nadal dostępne na Twoim koncie Google na <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" />.</translation>
 <translation id="9039373489628511875">Przepustowość</translation>
 <translation id="9055772144595778347">Nie można zalogować</translation>
-<translation id="9065203028668620118">Edycja</translation>
+<translation id="9065203028668620118">Edytuj</translation>
 <translation id="9079935439869366234">Oznacz wszystkie jako nieprzeczytane</translation>
 <translation id="9083392325882095631">Jeden element</translation>
 <translation id="9100610230175265781">Wymagane jest hasło</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 45ae3bd..9a62bea1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -291,7 +291,7 @@
 
 Datele au fost criptate cu expresia de acces pentru sincronizare la <ph name="TIME" />. Introdu-o pentru a începe sincronizarea.</translation>
 <translation id="6418346271604475326">Se pregătește fișierul PDF</translation>
-<translation id="6434591244308415567">A apărut o eroare. Încearcă din nou mai târziu.</translation>
+<translation id="6434591244308415567">A apărut o eroare, încearcă mai târziu.</translation>
 <translation id="6445051938772793705">Țară</translation>
 <translation id="6445981559479772097">Mesaj trimis.</translation>
 <translation id="6464071786529933911">Deschide în Filă incognito nouă</translation>
@@ -330,7 +330,7 @@
 <translation id="7203585745079012652">Primești răspunsuri vocale</translation>
 <translation id="722055596168483966">Personalizează serviciile Google</translation>
 <translation id="7272437679830969316">Nu ți se poate confirma identitatea. Parola nu a fost copiată.</translation>
-<translation id="7291368939935408496">Se pregătesc parolele…</translation>
+<translation id="7291368939935408496">Se pregătesc parolele...</translation>
 <translation id="7336264872878993241"><ph name="PERCENT" />% descărcat</translation>
 <translation id="7346909386216857016">OK, am înțeles</translation>
 <translation id="7400418766976504921">Adresă URL</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 875f8687..6555a1de 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">1 ставка је премештена</translation>
 <translation id="5911030830365207728">Google преводилац</translation>
 <translation id="5916664084637901428">Укључи</translation>
-<translation id="5938160824633642847">Уређај је скоро пун. Ослободите меморијски простор и пробајте поново.</translation>
+<translation id="5938160824633642847">Уређај је скоро пун. Ослободите простор и пробајте поново.</translation>
 <translation id="5948291296578561264">Ово вам омогућава да чувате слике у фототеци.</translation>
 <translation id="5955891643922670672">Прегледате офлајн верзију</translation>
 <translation id="5964480694698977962">Направи нову картицу без архивирања.</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 3160694..0f34a24 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -250,7 +250,7 @@
 <translation id="5871497086027727873">已移動 1 個項目</translation>
 <translation id="5911030830365207728">Google 翻譯</translation>
 <translation id="5916664084637901428">開啟</translation>
-<translation id="5938160824633642847">你的雲端硬碟快要滿了,請在釋出空間後再試一次。</translation>
+<translation id="5938160824633642847">你的裝置空間即將用盡,請在釋出空間後再試一次。</translation>
 <translation id="5948291296578561264">可讓你將相片儲存至相片庫。</translation>
 <translation id="5955891643922670672">正在查看離線版</translation>
 <translation id="5964480694698977962">新增無痕式分頁。</translation>
@@ -291,7 +291,7 @@
 
 您已在 <ph name="TIME" />使用同步通關密語對資料進行加密,請輸入通關密語開始進行同步。</translation>
 <translation id="6418346271604475326">正在準備 PDF</translation>
-<translation id="6434591244308415567">發生錯誤,請稍後再試一次。</translation>
+<translation id="6434591244308415567">發生錯誤,請稍後再試。</translation>
 <translation id="6445051938772793705">國家/地區</translation>
 <translation id="6445981559479772097">訊息已送出。</translation>
 <translation id="6464071786529933911">在新無痕式分頁中開啟</translation>
@@ -330,7 +330,7 @@
 <translation id="7203585745079012652">語音答覆</translation>
 <translation id="722055596168483966">享有個人化的 Google 服務</translation>
 <translation id="7272437679830969316">無法驗證你的身分,因此未複製密碼。</translation>
-<translation id="7291368939935408496">正在準備匯出密碼…</translation>
+<translation id="7291368939935408496">正在準備匯出密碼...</translation>
 <translation id="7336264872878993241">已下載 <ph name="PERCENT" /> %</translation>
 <translation id="7346909386216857016">好,我知道了</translation>
 <translation id="7400418766976504921">網址</translation>
diff --git a/ios/chrome/browser/OWNERS b/ios/chrome/browser/OWNERS
index fb1f7390..d3a11cd3 100644
--- a/ios/chrome/browser/OWNERS
+++ b/ios/chrome/browser/OWNERS
@@ -3,6 +3,10 @@
 per-file ios_chrome_io_thread*=rch@chromium.org
 per-file ios_chrome_io_thread*=rsleevi@chromium.org
 
+# Only for adding and removing flags.
+per-file about_flags.*=*
+per-file experimental_flags.*=*
+
 per-file ios_chrome_flag_descriptions.*=*
 
 per-file chrome_browser_manifest_overlay.json=set noparent
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index d3a9f38..c4c28b75 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -46,7 +46,6 @@
 #import "ios/chrome/browser/ui/history/history_base_feature.h"
 #include "ios/chrome/browser/ui/main/main_feature_flags.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_feature.h"
-#import "ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/user_feedback_features.h"
@@ -211,9 +210,6 @@
     {"memex-tab-switcher", flag_descriptions::kMemexTabSwitcherName,
      flag_descriptions::kMemexTabSwitcherDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kMemexTabSwitcher)},
-    {"clipping-textfield", flag_descriptions::kClippingTextfieldName,
-     flag_descriptions::kClippingTextfieldDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kClippingTextfield)},
     {"PasswordExport", flag_descriptions::kPasswordExportName,
      flag_descriptions::kPasswordExportDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(password_manager::features::kPasswordExport)},
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 133327ab1..1ac0a8a 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -25,11 +25,6 @@
     "When enabled, some network issues will trigger a test to check if a "
     "Captive Portal network is the cause of the issue.";
 
-const char kClippingTextfieldName[] = "Clipping Textfield";
-const char kClippingTextfieldDescription[] =
-    "When enabled, the new URL clipping implementation compatible with iOS 11 "
-    "is used.";
-
 const char kContextualSearch[] = "Contextual Search";
 const char kContextualSearchDescription[] =
     "Whether or not Contextual Search is enabled.";
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index 13ca5ca3..b60a7f1 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -20,10 +20,6 @@
 extern const char kCaptivePortalMetricsName[];
 extern const char kCaptivePortalMetricsDescription[];
 
-// Title and description for the flag to enable Omnibox Clipping.
-extern const char kClippingTextfieldName[];
-extern const char kClippingTextfieldDescription[];
-
 // Title and description for the flag to enable Contextual Search.
 extern const char kContextualSearch[];
 extern const char kContextualSearchDescription[];
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index a42147a..a06af5a 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -169,6 +169,8 @@
     "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tab_switcher:egtest_support",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
index b59ae97..2f90ee9 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -15,7 +15,8 @@
 #import "ios/chrome/browser/metrics/tab_usage_recorder_test_util.h"
 #import "ios/chrome/browser/ui/settings/privacy_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
diff --git a/ios/chrome/browser/ui/BUILD.gn b/ios/chrome/browser/ui/BUILD.gn
index 81d06b2..25092aa 100644
--- a/ios/chrome/browser/ui/BUILD.gn
+++ b/ios/chrome/browser/ui/BUILD.gn
@@ -277,6 +277,8 @@
     "fade_truncated_label.mm",
     "key_commands_provider.h",
     "key_commands_provider.mm",
+    "new_foreground_tab_fullscreen_disabler.h",
+    "new_foreground_tab_fullscreen_disabler.mm",
     "open_in_controller.h",
     "open_in_controller.mm",
     "open_in_controller_testing.h",
@@ -399,8 +401,10 @@
     "//ios/chrome/browser/ui/toolbar:toolbar_ui_broadcasting_util",
     "//ios/chrome/browser/ui/toolbar/adaptive",
     "//ios/chrome/browser/ui/toolbar/adaptive:adaptive_ui",
+    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/public:toolbar_base_feature",
     "//ios/chrome/browser/ui/tools_menu",
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index e6903b10..5835553 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -175,6 +175,8 @@
     "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/bookmarks:bookmarks",
     "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 393709d..1fa6236 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -22,7 +22,8 @@
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/bookmarks_test_util.h"
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 32065f7..75a621e 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -166,6 +166,7 @@
 #import "ios/chrome/browser/ui/main_content/main_content_ui_broadcasting_util.h"
 #import "ios/chrome/browser/ui/main_content/main_content_ui_state.h"
 #import "ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.h"
+#import "ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_coordinator.h"
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
@@ -198,11 +199,12 @@
 #import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h"
 #import "ios/chrome/browser/ui/toolbar/public/primary_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
@@ -597,6 +599,10 @@
   // The updater that adjusts the toolbar's layout for fullscreen events.
   std::unique_ptr<FullscreenUIUpdater> _fullscreenUIUpdater;
 
+  // The fullscreen disabler for the new foreground tab animation.
+  std::unique_ptr<NewForegroundTabFullscreenDisabler>
+      _foregroundTabAnimationFullscreenDisabler;
+
   // Coordinator for the External Search UI.
   ExternalSearchCoordinator* _externalSearchCoordinator;
 
@@ -1021,6 +1027,9 @@
     [[UpgradeCenter sharedInstance] registerClient:self
                                     withDispatcher:self.dispatcher];
     _inNewTabAnimation = NO;
+
+    _footerFullscreenProgress = 1.0;
+
     if (model && browserState)
       [self updateWithTabModel:model browserState:browserState];
   }
@@ -1226,10 +1235,7 @@
            webStateList:[_model webStateList]];
     StartBroadcastingMainContentUI(self, broadcaster);
 
-    _fullscreenUIUpdater = std::make_unique<FullscreenUIUpdater>(self);
     fullscreenController->AddObserver(_fullscreenUIUpdater.get());
-
-    fullscreenController->SetWebStateList([_model webStateList]);
   } else {
     StopBroadcastingToolbarUI(broadcaster);
     StopBroadcastingMainContentUI(broadcaster);
@@ -1238,9 +1244,8 @@
     _mainContentUIUpdater = nil;
     [_webMainContentUIForwarder disconnect];
     _webMainContentUIForwarder = nil;
+
     fullscreenController->RemoveObserver(_fullscreenUIUpdater.get());
-    _fullscreenUIUpdater = nullptr;
-    fullscreenController->SetWebStateList(nullptr);
   }
 }
 
@@ -1365,6 +1370,15 @@
   _paymentRequestManager = nil;
   [_model browserStateDestroyed];
 
+  FullscreenController* fullscreenController =
+      FullscreenControllerFactory::GetInstance()->GetForBrowserState(
+          _browserState);
+  _foregroundTabAnimationFullscreenDisabler->Disconnect();
+  _foregroundTabAnimationFullscreenDisabler = nullptr;
+  fullscreenController->RemoveObserver(_fullscreenUIUpdater.get());
+  _fullscreenUIUpdater = nullptr;
+  fullscreenController->SetWebStateList(nullptr);
+
   // Disconnect child coordinators.
   [_activityServiceCoordinator disconnect];
   [_qrScannerCoordinator disconnect];
@@ -1928,6 +1942,18 @@
   // Register for bookmark changed notification (BookmarkModel may be null
   // during testing, so explicitly support this).
   _bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState(_browserState);
+
+  // Add a FullscreenUIUpdater for self.
+  FullscreenController* controller =
+      FullscreenControllerFactory::GetInstance()->GetForBrowserState(
+          _browserState);
+  _fullscreenUIUpdater = std::make_unique<FullscreenUIUpdater>(self);
+  // Crate the disabler for any new foreground tab animations in the tab model.
+  _foregroundTabAnimationFullscreenDisabler =
+      std::make_unique<NewForegroundTabFullscreenDisabler>(_model.webStateList,
+                                                           controller);
+  // Set the FullscreenController's WebStateList.
+  controller->SetWebStateList(_model.webStateList);
 }
 
 - (void)installFakeStatusBar {
@@ -1995,15 +2021,12 @@
             initWithBaseViewController:self
         toolsMenuConfigurationProvider:self
                             dispatcher:self.dispatcher
-                          browserState:_browserState];
+                          browserState:_browserState
+                          webStateList:[_model webStateList]];
+    _toolbarCoordinator.delegate = self;
+    _toolbarCoordinator.URLLoader = self;
     self.primaryToolbarCoordinator = _toolbarCoordinator;
     self.toolbarInterface = _toolbarCoordinator;
-    [_toolbarCoordinator
-        setToolbarController:
-            [_dependencyFactory
-                newToolbarControllerWithDelegate:self
-                                       urlLoader:self
-                                      dispatcher:self.dispatcher]];
 
     [_toolbarCoordinator start];
   }
diff --git a/ios/chrome/browser/ui/browser_view_controller_dependency_factory.h b/ios/chrome/browser/ui/browser_view_controller_dependency_factory.h
index b334e5e..c60473b 100644
--- a/ios/chrome/browser/ui/browser_view_controller_dependency_factory.h
+++ b/ios/chrome/browser/ui/browser_view_controller_dependency_factory.h
@@ -49,14 +49,6 @@
 
 - (BrowserViewControllerHelper*)newBrowserViewControllerHelper;
 
-- (id<Toolbar>)newToolbarControllerWithDelegate:
-                   (id<ToolbarCoordinatorDelegate>)delegate
-                                      urlLoader:(id<UrlLoader>)urlLoader
-                                     dispatcher:(id<ApplicationCommands,
-                                                    BrowserCommands,
-                                                    OmniboxFocuser,
-                                                    ToolbarCommands>)dispatcher;
-
 // Returns a new keyboard commands coordinator to handle keyboard commands.
 - (KeyCommandsProvider*)newKeyCommandsProvider;
 
diff --git a/ios/chrome/browser/ui/browser_view_controller_dependency_factory.mm b/ios/chrome/browser/ui/browser_view_controller_dependency_factory.mm
index 2992d193..27ff6f38 100644
--- a/ios/chrome/browser/ui/browser_view_controller_dependency_factory.mm
+++ b/ios/chrome/browser/ui/browser_view_controller_dependency_factory.mm
@@ -17,7 +17,6 @@
 #import "ios/chrome/browser/ui/browser_view_controller_helper.h"
 #import "ios/chrome/browser/ui/key_commands_provider.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_adapter.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -59,22 +58,6 @@
   return [[BrowserViewControllerHelper alloc] init];
 }
 
-- (id<Toolbar>)
-newToolbarControllerWithDelegate:(id<ToolbarCoordinatorDelegate>)delegate
-                       urlLoader:(id<UrlLoader>)urlLoader
-                      dispatcher:(id<ApplicationCommands,
-                                     BrowserCommands,
-                                     OmniboxFocuser,
-                                     ToolbarCommands>)dispatcher {
-  ToolbarAdapter* adapter =
-      [[ToolbarAdapter alloc] initWithDispatcher:dispatcher
-                                    browserState:browserState_
-                                    webStateList:webStateList_];
-  adapter.delegate = delegate;
-  adapter.URLLoader = urlLoader;
-  return static_cast<id<Toolbar>>(adapter);
-}
-
 - (KeyCommandsProvider*)newKeyCommandsProvider {
   return [[KeyCommandsProvider alloc] init];
 }
diff --git a/ios/chrome/browser/ui/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
index 24a85a9..1014a5d 100644
--- a/ios/chrome/browser/ui/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view_controller_unittest.mm
@@ -136,54 +136,6 @@
 }
 @end
 
-// Fake WebToolbarController for testing.
-@interface TestWebToolbarController : UIViewController
-- (BOOL)isOmniboxFirstResponder;
-- (BOOL)showingOmniboxPopup;
-- (void)cancelOmniboxEdit;
-- (void)setBackgroundAlpha:(CGFloat)alpha;
-- (void)browserStateDestroyed;
-- (void)stop;
-
-- (ToolbarButtonUpdater*)buttonUpdater;
-- (void)setToolsMenuStateProvider:(id)provider;
-@property(nonatomic, readonly, weak) UIViewController* viewController;
-
-@end
-
-@implementation TestWebToolbarController
-- (BOOL)isOmniboxFirstResponder {
-  return NO;
-}
-- (BOOL)showingOmniboxPopup {
-  return NO;
-}
-- (void)cancelOmniboxEdit {
-  return;
-}
-- (UIViewController*)viewController {
-  return self;
-}
-- (ToolbarButtonUpdater*)buttonUpdater {
-  return nil;
-}
-- (void)setToolsMenuStateProvider:(id)provider {
-  return;
-}
-- (void)start {
-  return;
-}
-- (void)setBackgroundAlpha:(CGFloat)alpha {
-  return;
-}
-- (void)browserStateDestroyed {
-  return;
-}
-- (void)stop {
-  return;
-}
-@end
-
 #pragma mark -
 
 namespace {
@@ -249,17 +201,10 @@
 
     bvcHelper_ = [[BrowserViewControllerHelper alloc] init];
 
-    // Create fake WTC.
-    TestWebToolbarController* testWTC = [[TestWebToolbarController alloc] init];
-
     // Set up a stub dependency factory.
     id factory = [OCMockObject
         mockForClass:[BrowserViewControllerDependencyFactory class]];
     [[[factory stub] andReturn:bvcHelper_] newBrowserViewControllerHelper];
-    [[[factory stub] andReturn:testWTC]
-        newToolbarControllerWithDelegate:[OCMArg any]
-                               urlLoader:[OCMArg any]
-                              dispatcher:[OCMArg any]];
     [[[factory stub] andReturn:passKitViewController_]
         newPassKitViewControllerForPass:nil];
     [[[factory stub] andReturn:nil] showPassKitErrorInfoBarForManager:nil];
@@ -287,6 +232,7 @@
 
   void TearDown() override {
     [[bvc_ view] removeFromSuperview];
+    [bvc_ browserStateDestroyed];
     [bvc_ shutdown];
 
     BlockCleanupTest::TearDown();
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 4b7bbd2..2085060 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -159,6 +159,7 @@
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions/cells:cells_ui",
+    "//ios/chrome/browser/ui/location_bar:constants",
     "//ios/chrome/browser/ui/ntp",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
index 2c2ec774..aad5e08 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
@@ -8,8 +8,8 @@
 #include "base/logging.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_cell.h"
+#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
@@ -160,9 +160,9 @@
     [searchHintLabel setTextAlignment:NSTextAlignmentRight];
   }
   [searchHintLabel
-      setTextColor:[UIColor
-                       colorWithWhite:kiPhoneOmniboxPlaceholderColorBrightness
-                                alpha:1.0]];
+      setTextColor:
+          [UIColor colorWithWhite:kiPhoneLocationBarPlaceholderColorBrightness
+                            alpha:1.0]];
   [searchHintLabel setFont:[MDCTypography subheadFont]];
 }
 
diff --git a/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h b/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h
index 38811eb..8da4092 100644
--- a/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h
+++ b/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h
@@ -6,22 +6,56 @@
 #define IOS_CHROME_BROWSER_UI_FULLSCREEN_ANIMATED_SCOPED_FULLSCREEN_DISABLER_H_
 
 #include "base/macros.h"
+#include "base/observer_list.h"
 
 class FullscreenController;
+class AnimatedScopedFullscreenDisablerObserver;
 
 // A helper object that increments FullscrenController's disabled counter for
-// its entire lifetime. Since the disabling is happening inside an animation
-// block, any UI changes related to Fullscreen being disabled will be animated.
+// its entire lifetime after calling StartAnimation().  Any UI updates resulting
+// from the incremented disable counter will be animated.
 class AnimatedScopedFullscreenDisabler {
  public:
   explicit AnimatedScopedFullscreenDisabler(FullscreenController* controller);
   ~AnimatedScopedFullscreenDisabler();
 
+  // Adds and removes AnimatedScopedFullscreenDisablerObservers.
+  void AddObserver(AnimatedScopedFullscreenDisablerObserver* observer);
+  void RemoveObserver(AnimatedScopedFullscreenDisablerObserver* observer);
+
+  // Starts the disabling the FullscreenController, animating any resulting UI
+  // changes.  The FullscreenController will then remain disabled until this
+  // disabler is deallocated.
+  void StartAnimation();
+
  private:
+  // Called when the fullscreen disabling animation has finished.
+  void OnAnimationFinished();
+
   // The FullscreenController being disabled by this object.
   FullscreenController* controller_;
+  // The AnimatedScopedFullscreenDisablerObservers.
+  base::ObserverList<AnimatedScopedFullscreenDisablerObserver> observers_;
+  // Whether this disabler is contributing to |controller_|'s disabled counter.
+  bool disabling_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(AnimatedScopedFullscreenDisabler);
 };
 
+// Obsever class for listening to animated fullscreen disabling events.
+class AnimatedScopedFullscreenDisablerObserver {
+ public:
+  explicit AnimatedScopedFullscreenDisablerObserver() = default;
+  virtual ~AnimatedScopedFullscreenDisablerObserver() = default;
+
+  // Called when the fullscreen disabling animation begins and ends.  If
+  // AnimatedScopedFullscreenDisabler::StartAnimation() is called and for a
+  // FullscreenController that is already disabled, these callbacks will not be
+  // sent.
+  virtual void FullscreenDisablingAnimationDidStart(
+      AnimatedScopedFullscreenDisabler* disabler){};
+  virtual void FullscreenDisablingAnimationDidFinish(
+      AnimatedScopedFullscreenDisabler* disabler){};
+};
+
 #endif  // IOS_CHROME_BROWSER_UI_FULLSCREEN_ANIMATED_SCOPED_FULLSCREEN_DISABLER_H_
diff --git a/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.mm b/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.mm
index 60ef64f..8dfef6bf 100644
--- a/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.mm
+++ b/ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.mm
@@ -16,13 +16,51 @@
     FullscreenController* controller)
     : controller_(controller) {
   DCHECK(controller_);
-  [UIView animateWithDuration:ios::material::kDuration1
-                   animations:^{
-                     controller_->IncrementDisabledCounter();
-                   }
-                   completion:nil];
 }
 
 AnimatedScopedFullscreenDisabler::~AnimatedScopedFullscreenDisabler() {
-  controller_->DecrementDisabledCounter();
+  if (disabling_)
+    controller_->DecrementDisabledCounter();
+}
+
+void AnimatedScopedFullscreenDisabler::AddObserver(
+    AnimatedScopedFullscreenDisablerObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void AnimatedScopedFullscreenDisabler::RemoveObserver(
+    AnimatedScopedFullscreenDisablerObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
+void AnimatedScopedFullscreenDisabler::StartAnimation() {
+  // StartAnimation() should be idempotent, so early return if this disabler has
+  // already incremented the disabled counter.
+  if (disabling_)
+    return;
+  disabling_ = true;
+
+  if (controller_->IsEnabled()) {
+    // Increment the disabled counter in an animation block if the controller is
+    // not already disabled.
+    for (auto& observer : observers_) {
+      observer.FullscreenDisablingAnimationDidStart(this);
+    }
+    [UIView animateWithDuration:ios::material::kDuration1
+        animations:^{
+          controller_->IncrementDisabledCounter();
+        }
+        completion:^(BOOL finished) {
+          OnAnimationFinished();
+        }];
+  } else {
+    // If |controller_| is already disabled, no animation is necessary.
+    controller_->IncrementDisabledCounter();
+  }
+}
+
+void AnimatedScopedFullscreenDisabler::OnAnimationFinished() {
+  for (auto& observer : observers_) {
+    observer.FullscreenDisablingAnimationDidFinish(this);
+  }
 }
diff --git a/ios/chrome/browser/ui/location_bar/BUILD.gn b/ios/chrome/browser/ui/location_bar/BUILD.gn
index adda4ada..abe6d0b 100644
--- a/ios/chrome/browser/ui/location_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/location_bar/BUILD.gn
@@ -17,6 +17,7 @@
     "location_bar_view_controller.mm",
   ]
   deps = [
+    ":constants",
     "//base",
     "//components/google/core/browser",
     "//components/google/core/browser",
@@ -65,6 +66,18 @@
       [ "//ios/chrome/browser/ui/omnibox:omnibox_internal" ]
 }
 
+source_set("constants") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "location_bar_constants.h",
+    "location_bar_constants.mm",
+  ]
+  libs = [
+    "Foundation.framework",
+    "CoreGraphics.framework",
+  ]
+}
+
 source_set("unit_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_constants.h b/ios/chrome/browser/ui/location_bar/location_bar_constants.h
new file mode 100644
index 0000000..7c8990a
--- /dev/null
+++ b/ios/chrome/browser/ui/location_bar/location_bar_constants.h
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_LOCATION_BAR_LOCATION_BAR_CONSTANTS_H_
+#define IOS_CHROME_BROWSER_UI_LOCATION_BAR_LOCATION_BAR_CONSTANTS_H_
+
+#import <CoreGraphics/CoreGraphics.h>
+#import <Foundation/Foundation.h>
+
+// The brightness of the location bar placeholder text in regular mode,
+// on an iPhone.
+extern const CGFloat kiPhoneLocationBarPlaceholderColorBrightness;
+
+// Last button in accessory view for keyboard, commonly used TLD.
+extern NSString* const kDotComTLD;
+
+#endif  // IOS_CHROME_BROWSER_UI_LOCATION_BAR_LOCATION_BAR_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_constants.mm b/ios/chrome/browser/ui/location_bar/location_bar_constants.mm
new file mode 100644
index 0000000..c5e0c1b
--- /dev/null
+++ b/ios/chrome/browser/ui/location_bar/location_bar_constants.mm
@@ -0,0 +1,13 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+const CGFloat kiPhoneLocationBarPlaceholderColorBrightness = 150 / 255.0;
+
+NSString* const kDotComTLD = @".com";
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
index 90884b7d..a228f0d 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
@@ -16,6 +16,7 @@
 #include "ios/chrome/browser/autocomplete/autocomplete_scheme_classifier_impl.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
+#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
 #import "ios/chrome/browser/ui/location_bar/location_bar_consumer.h"
 #import "ios/chrome/browser/ui/location_bar/location_bar_mediator.h"
 #import "ios/chrome/browser/ui/location_bar/location_bar_url_loader.h"
@@ -28,7 +29,6 @@
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_views.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
@@ -40,6 +40,14 @@
 #error "This file requires ARC support."
 #endif
 
+namespace {
+// The histogram recording CLAuthorizationStatus for omnibox queries.
+const char* const kOmniboxQueryLocationAuthorizationStatusHistogram =
+    "Omnibox.QueryIosLocationAuthorizationStatus";
+// The number of possible CLAuthorizationStatus values to report.
+const int kLocationAuthorizationStatusCount = 4;
+}  // namespace
+
 @interface LocationBarCoordinator ()<LocationBarConsumer, LocationBarDelegate> {
   std::unique_ptr<LocationBarControllerImpl> _locationBarController;
 }
@@ -98,7 +106,7 @@
     // Set placeholder text color to match fakebox placeholder text color when
     // on iPhone.
     UIColor* placeholderTextColor =
-        [UIColor colorWithWhite:kiPhoneOmniboxPlaceholderColorBrightness
+        [UIColor colorWithWhite:kiPhoneLocationBarPlaceholderColorBrightness
                           alpha:1.0];
     [_locationBarView.textField setPlaceholderTextColor:placeholderTextColor];
   }
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_view.mm b/ios/chrome/browser/ui/location_bar/location_bar_view.mm
index 814af54c..aa44dfcc 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_view.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_view.mm
@@ -6,9 +6,8 @@
 
 #import "ios/chrome/browser/ui/animation_util.h"
 #import "ios/chrome/browser/ui/omnibox/clipping_textfield_container.h"
-#import "ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
+#include "ios/chrome/browser/ui/rtl_geometry.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/material_timing.h"
@@ -28,8 +27,9 @@
 const CGFloat kTextFieldLeadingOffsetNoImage = 16;
 // Space between the leading button and the textfield when a button is shown.
 const CGFloat kTextFieldLeadingOffsetImage = 6;
-// Offset from the trailing edge to the textfield.
-const CGFloat kTextFieldTrailingOffset = 3;
+// The default position animation is 10 pixels toward the trailing side, so
+// that's a negative leading offset.
+const LayoutOffset kPositionAnimationLeadingOffset = -10;
 }  // namespace
 
 @interface OmniboxTextFieldIOS ()
@@ -108,57 +108,38 @@
                                                   textColor:textColor
                                                   tintColor:tintColor];
 
-    if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-      // When clipping is enabled, the text field is put into a container.
+    // The text field is put into a container.
 
-      // TODO(crbug.com/789968): remove these insets when the location bar
-      // background is managed by this view and not toolbar controller. These
-      // insets allow the gradient masking of the omnibox to not extend beyond
-      // the omnibox background's visible frame.
-      self.layoutMargins = UIEdgeInsetsMake(3, 3, 3, 3);
+    // TODO(crbug.com/789968): remove these insets when the location bar
+    // background is managed by this view and not toolbar controller. These
+    // insets allow the gradient masking of the omnibox to not extend beyond
+    // the omnibox background's visible frame.
+    self.layoutMargins = UIEdgeInsetsMake(3, 3, 3, 3);
 
-      _textFieldContainer = [[ClippingTextFieldContainer alloc]
-          initWithClippingTextField:_textField];
-      [self addSubview:_textFieldContainer];
+    _textFieldContainer = [[ClippingTextFieldContainer alloc]
+        initWithClippingTextField:_textField];
+    [self addSubview:_textFieldContainer];
 
-      _leadingTextfieldConstraint = [_textFieldContainer.leadingAnchor
-          constraintEqualToAnchor:self.leadingAnchor
-                         constant:kTextFieldLeadingOffsetNoImage];
+    _leadingTextfieldConstraint = [_textFieldContainer.leadingAnchor
+        constraintEqualToAnchor:self.leadingAnchor
+                       constant:kTextFieldLeadingOffsetNoImage];
 
-      [NSLayoutConstraint activateConstraints:@[
-        [_textFieldContainer.trailingAnchor
-            constraintEqualToAnchor:self.layoutMarginsGuide.trailingAnchor],
-        [_textFieldContainer.topAnchor
-            constraintEqualToAnchor:self.layoutMarginsGuide.topAnchor],
-        [_textFieldContainer.bottomAnchor
-            constraintEqualToAnchor:self.layoutMarginsGuide.bottomAnchor],
-        _leadingTextfieldConstraint,
-      ]];
+    [NSLayoutConstraint activateConstraints:@[
+      [_textFieldContainer.trailingAnchor
+          constraintEqualToAnchor:self.layoutMarginsGuide.trailingAnchor],
+      [_textFieldContainer.topAnchor
+          constraintEqualToAnchor:self.layoutMarginsGuide.topAnchor],
+      [_textFieldContainer.bottomAnchor
+          constraintEqualToAnchor:self.layoutMarginsGuide.bottomAnchor],
+      _leadingTextfieldConstraint,
+    ]];
 
-      _textFieldContainer.translatesAutoresizingMaskIntoConstraints = NO;
-      [_textFieldContainer
-          setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
-                                          forAxis:
-                                              UILayoutConstraintAxisHorizontal];
-    } else {
-      // Contain the text field directly, with no clipping container.
-      [self addSubview:_textField];
-      _leadingTextfieldConstraint = [_textField.leadingAnchor
-          constraintEqualToAnchor:self.leadingAnchor
-                         constant:kTextFieldLeadingOffsetNoImage];
-
-      [NSLayoutConstraint activateConstraints:@[
-        [_textField.trailingAnchor
-            constraintEqualToAnchor:self.trailingAnchor
-                           constant:-kTextFieldTrailingOffset],
-        [_textField.topAnchor constraintEqualToAnchor:self.topAnchor],
-        [_textField.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
-        _leadingTextfieldConstraint,
-      ]];
-
-      _textField.translatesAutoresizingMaskIntoConstraints = NO;
+    _textFieldContainer.translatesAutoresizingMaskIntoConstraints = NO;
+    [_textFieldContainer
+        setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
+                                        forAxis:
+                                            UILayoutConstraintAxisHorizontal];
     }
-  }
   return self;
 }
 
@@ -178,15 +159,9 @@
                        constant:-kLeadingButtonEdgeOffset];
 
     NSLayoutConstraint* leadingButtonToTextField = nil;
-    if (base::FeatureList::IsEnabled(kClippingTextfield)) {
       leadingButtonToTextField = [self.leadingButton.trailingAnchor
           constraintEqualToAnchor:self.textFieldContainer.leadingAnchor
                          constant:-kTextFieldLeadingOffsetImage];
-    } else {
-      leadingButtonToTextField = [self.leadingButton.trailingAnchor
-          constraintEqualToAnchor:self.textField.leadingAnchor
-                         constant:-kTextFieldLeadingOffsetImage];
-    }
 
     [NSLayoutConstraint activateConstraints:@[
       [_leadingButton.centerYAnchor
diff --git a/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.h b/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.h
new file mode 100644
index 0000000..3260da9b
--- /dev/null
+++ b/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.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 IOS_CHROME_BROWSER_UI_NEW_FOREGROUND_TAB_FULLSCREEN_DISABLER_H_
+#define IOS_CHROME_BROWSER_UI_NEW_FOREGROUND_TAB_FULLSCREEN_DISABLER_H_
+
+#include <memory>
+
+#import "ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h"
+#import "ios/chrome/browser/web_state_list/web_state_list_observer.h"
+
+class FullscreenController;
+class WebStateList;
+
+// Helper object that shows the toolbar when a new foreground tab is inserted.
+class NewForegroundTabFullscreenDisabler
+    : public AnimatedScopedFullscreenDisablerObserver,
+      public WebStateListObserver {
+ public:
+  NewForegroundTabFullscreenDisabler(WebStateList* web_state_list,
+                                     FullscreenController* controller);
+  ~NewForegroundTabFullscreenDisabler() override;
+
+  // Stops observing the WebStateList and disabling the FullscreenController.
+  void Disconnect();
+
+ private:
+  // AnimatedScopedFullscreenDisablerObserver:
+  void FullscreenDisablingAnimationDidFinish(
+      AnimatedScopedFullscreenDisabler* disabler) override;
+
+  // WebStateListObserver:
+  void WebStateInsertedAt(WebStateList* web_state_list,
+                          web::WebState* web_state,
+                          int index,
+                          bool activating) override;
+
+  // The WebStateList.
+  WebStateList* web_state_list_;
+  // The FullscreenController.
+  FullscreenController* controller_;
+  // The disabler used for new foreground tabs.
+  std::unique_ptr<AnimatedScopedFullscreenDisabler> disabler_;
+};
+
+#endif  // IOS_CHROME_BROWSER_UI_NEW_FOREGROUND_TAB_FULLSCREEN_DISABLER_H_
diff --git a/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.mm b/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.mm
new file mode 100644
index 0000000..b7513be
--- /dev/null
+++ b/ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.mm
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/new_foreground_tab_fullscreen_disabler.h"
+
+#include "base/logging.h"
+#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+NewForegroundTabFullscreenDisabler::NewForegroundTabFullscreenDisabler(
+    WebStateList* web_state_list,
+    FullscreenController* controller)
+    : web_state_list_(web_state_list), controller_(controller) {
+  DCHECK(web_state_list_);
+  DCHECK(controller_);
+  web_state_list_->AddObserver(this);
+}
+
+NewForegroundTabFullscreenDisabler::~NewForegroundTabFullscreenDisabler() {
+  // Disconnect() is expected to be called before destruction.
+  DCHECK(!web_state_list_);
+  DCHECK(!controller_);
+  DCHECK(!disabler_);
+}
+
+void NewForegroundTabFullscreenDisabler::Disconnect() {
+  web_state_list_->RemoveObserver(this);
+  web_state_list_ = nullptr;
+  controller_ = nullptr;
+  disabler_ = nullptr;
+}
+
+void NewForegroundTabFullscreenDisabler::FullscreenDisablingAnimationDidFinish(
+    AnimatedScopedFullscreenDisabler* disabler) {
+  DCHECK_EQ(disabler_.get(), disabler);
+  disabler_ = nullptr;
+}
+
+void NewForegroundTabFullscreenDisabler::WebStateInsertedAt(
+    WebStateList* web_state_list,
+    web::WebState* web_state,
+    int index,
+    bool activating) {
+  DCHECK_EQ(web_state_list_, web_state_list);
+  if (activating && controller_->IsEnabled()) {
+    disabler_ = std::make_unique<AnimatedScopedFullscreenDisabler>(controller_);
+    disabler_->AddObserver(this);
+    disabler_->StartAnimation();
+  }
+}
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
index 00574d265..c54d198 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/material_timing.h"
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
index 275895f..3de0cbf 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
@@ -13,9 +13,9 @@
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index 148518d6..6fa244c 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -7,8 +7,6 @@
     "location_bar_controller.cc",
     "location_bar_controller.h",
     "location_bar_delegate.h",
-    "omnibox_clipping_feature.h",
-    "omnibox_clipping_feature.mm",
     "web_omnibox_edit_controller.cc",
     "web_omnibox_edit_controller.h",
   ]
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h b/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h
deleted file mode 100644
index e3ea34c..0000000
--- a/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CLIPPING_FEATURE_H_
-#define IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CLIPPING_FEATURE_H_
-
-#include "base/feature_list.h"
-
-// Feature to choose whether to use the iOS 11-compatible textfield clipping.
-extern const base::Feature kClippingTextfield;
-
-#endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_CLIPPING_FEATURE_H_
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.mm b/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.mm
deleted file mode 100644
index c7a759a..0000000
--- a/ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.mm
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h"
-
-const base::Feature kClippingTextfield{"kClippingTextfield",
-                                       base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_presenter.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_presenter.mm
index 87be15c..27d8b0a 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_popup_presenter.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_presenter.mm
@@ -6,7 +6,6 @@
 
 #import "ios/chrome/browser/ui/omnibox/omnibox_popup_positioner.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
@@ -20,6 +19,7 @@
 const CGFloat kExpandAnimationDuration = 0.1;
 const CGFloat kCollapseAnimationDuration = 0.05;
 const CGFloat kShadowHeight = 10;
+const CGFloat kiPadVerticalOffset = 3;
 NS_INLINE CGFloat BottomPadding() {
   return IsIPadIdiom() ? kShadowHeight : 0;
 }
@@ -76,7 +76,8 @@
     ]];
 
     if (IsIPadIdiom()) {
-      [shadowView.topAnchor constraintEqualToAnchor:popupContainer.bottomAnchor]
+      [shadowView.bottomAnchor
+          constraintEqualToAnchor:popupContainer.bottomAnchor]
           .active = YES;
     } else {
       [shadowView.topAnchor
@@ -169,7 +170,7 @@
   NSLayoutConstraint* topConstraint =
       [popup.topAnchor constraintEqualToAnchor:topLayout.bottomAnchor];
   if (IsIPadIdiom()) {
-    topConstraint.constant = kiPadOmniboxPopupVerticalOffset;
+    topConstraint.constant = kiPadVerticalOffset;
   }
 
   [NSLayoutConstraint activateConstraints:@[
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
index 1637b4c1..c5bdcd0a 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
@@ -18,13 +18,11 @@
 #include "ios/chrome/browser/autocomplete/autocomplete_scheme_classifier_impl.h"
 #include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/animation_util.h"
-#import "ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h"
 #include "ios/chrome/browser/ui/omnibox/omnibox_util.h"
 #import "ios/chrome/browser/ui/reversed_animation.h"
 #include "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/material_timing.h"
@@ -511,27 +509,6 @@
   return newBounds;
 }
 
-// Enumerate url components (host, path) and draw each one in different rect.
-- (void)drawTextInRect:(CGRect)rect {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // With the new clipping logic, this override is unnecessary.
-    [super drawTextInRect:rect];
-    return;
-  }
-
-  if (base::ios::IsRunningOnOrLater(11, 1, 0)) {
-    // -[UITextField drawTextInRect:] ignores the argument, so we can't do
-    // anything on 11.1 and up.
-    [super drawTextInRect:rect];
-    return;
-  }
-
-  // Save and restore the graphics state because rectForDrawTextInRect may
-  // apply an image mask to fade out beginning and/or end of the URL.
-  gfx::ScopedCGContextSaveGState saver(UIGraphicsGetCurrentContext());
-  [super drawTextInRect:[self rectForDrawTextInRect:rect]];
-}
-
 // Overriding this method to offset the rightView property
 // (containing a clear text button).
 - (CGRect)rightViewRectForBounds:(CGRect)bounds {
@@ -824,74 +801,6 @@
   [self setTextColor:[UIColor clearColor]];
 }
 
-- (CGRect)rectForDrawTextInRect:(CGRect)rect {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // With the new clipping logic, this override is unnecessary.
-    return rect;
-  }
-
-  // The goal is to always show the most significant part of the hostname
-  // (i.e. the end of the TLD).
-  //
-  //                     --------------------
-  // www.somereallyreally|longdomainname.com|/path/gets/clipped
-  //                     --------------------
-  // {  clipped prefix  } {  visible text  } { clipped suffix }
-
-  // First find how much (if any) of the scheme/host needs to be clipped so that
-  // the end of the TLD fits in |rect|. Note that if the omnibox is currently
-  // displaying a search query the prefix is not clipped.
-
-  CGFloat widthOfClippedPrefix = 0;
-  url::Component scheme, host;
-  AutocompleteInput::ParseForEmphasizeComponents(
-      base::SysNSStringToUTF16(self.text), AutocompleteSchemeClassifierImpl(),
-      &scheme, &host);
-  if (host.len < 0) {
-    return rect;
-  }
-  NSRange hostRange = NSMakeRange(0, host.begin + host.len);
-  NSAttributedString* hostString =
-      [self.attributedText attributedSubstringFromRange:hostRange];
-  CGFloat widthOfHost = ceil([hostString size].width);
-  widthOfClippedPrefix = MAX(widthOfHost - rect.size.width, 0);
-
-  // Now determine if there is any text that will need to be truncated because
-  // there's not enough room.
-  int textWidth = ceil([self.attributedText size].width);
-  CGFloat widthOfClippedSuffix =
-      MAX(textWidth - rect.size.width - widthOfClippedPrefix, 0);
-  BOOL suffixClipped = widthOfClippedSuffix > 0;
-
-  // Fade the beginning and/or end of the visible string to indicate to the user
-  // that the URL has been clipped.
-  BOOL prefixClipped = widthOfClippedPrefix > 0;
-  if (prefixClipped || suffixClipped) {
-    UIImage* fade = nil;
-    if ([self textAlignment] == NSTextAlignmentRight) {
-      // Swap prefix and suffix for RTL.
-      fade = [GTMFadeTruncatingLabel getLinearGradient:rect
-                                              fadeHead:suffixClipped
-                                              fadeTail:prefixClipped];
-    } else {
-      fade = [GTMFadeTruncatingLabel getLinearGradient:rect
-                                              fadeHead:prefixClipped
-                                              fadeTail:suffixClipped];
-    }
-    CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, fade.CGImage);
-  }
-
-  // If necessary, expand the rect so the entire string fits and shift it to the
-  // left (right for RTL) so the clipped prefix is not shown.
-  if ([self textAlignment] == NSTextAlignmentRight) {
-    rect.origin.x -= widthOfClippedSuffix;
-  } else {
-    rect.origin.x -= widthOfClippedPrefix;
-  }
-  rect.size.width = MAX(rect.size.width, textWidth);
-  return rect;
-}
-
 - (NSArray*)fadeAnimationLayers {
   NSMutableArray* layers = [NSMutableArray array];
   for (UIView* subview in self.subviews)
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios_unittest.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios_unittest.mm
index a4c9a3ca..9fb68f4 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios_unittest.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios_unittest.mm
@@ -11,7 +11,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/chrome_paths.h"
-#import "ios/chrome/browser/ui/omnibox/omnibox_clipping_feature.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "testing/gtest_mac.h"
 #include "testing/platform_test.h"
@@ -21,11 +20,6 @@
 #error "This file requires ARC support."
 #endif
 
-// A category for making existing methods visible for use in these tests.
-@interface OmniboxTextFieldIOS (VisibleForTesting)
-- (CGRect)rectForDrawTextInRect:(CGRect)rect;
-@end
-
 namespace {
 
 class OmniboxTextFieldTest : public PlatformTest {
@@ -143,95 +137,6 @@
   [textfield_ resignFirstResponder];
 }
 
-TEST_F(OmniboxTextFieldTest, rectForDrawTextInRect_entireURLFits) {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // This test is expected to not work with new text field clipping because
-    // the code to implement clipping will be removed.
-    return;
-  }
-
-  NSString* text = @"http://www.google.com";
-  [textfield_ setText:text];
-  CGSize textSize = [[textfield_ attributedText] size];
-  CGFloat widthForEntireURL = ceil(textSize.width) + 10;
-
-  CGRect inputRect = CGRectMake(0, 0, widthForEntireURL, textSize.height);
-  CGRect actualRect = [textfield_ rectForDrawTextInRect:inputRect];
-  ExpectRectEqual(inputRect, actualRect);
-}
-
-TEST_F(OmniboxTextFieldTest, rectForDrawTextInRect_clippedPrefix) {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // This test is expected to not work with new text field clipping because
-    // the code to implement clipping will be removed.
-    return;
-  }
-
-  NSString* text = @"http://www.google.com";
-  [textfield_ setText:text];
-  CGSize textSize = [[textfield_ attributedText] size];
-  CGFloat clippedWidth = 10;
-  CGFloat widthForPartOfHost = ceil(textSize.width) - clippedWidth;
-
-  CGRect inputRect = CGRectMake(0, 0, widthForPartOfHost, textSize.height);
-  CGRect actualRect = [textfield_ rectForDrawTextInRect:inputRect];
-  CGRect expectedRect =
-      CGRectMake(-1 * clippedWidth, 0, ceil(textSize.width), textSize.height);
-  ExpectRectEqual(expectedRect, actualRect);
-}
-
-TEST_F(OmniboxTextFieldTest, rectForDrawTextInRect_clippedSuffix) {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // This test is expected to not work with new text field clipping because
-    // the code to implement clipping will be removed.
-    return;
-  }
-
-  NSString* text = @"http://www.google.com/somelongpath";
-  [textfield_ setText:text];
-  CGSize textSize = [[textfield_ attributedText] size];
-  CGFloat widthForPartOfPath = ceil(textSize.width) - 10;
-
-  CGRect inputRect = CGRectMake(0, 0, widthForPartOfPath, textSize.height);
-  CGRect actualRect = [textfield_ rectForDrawTextInRect:inputRect];
-  CGRect expectedRect = CGRectMake(0, 0, ceil(textSize.width), textSize.height);
-  ExpectRectEqual(expectedRect, actualRect);
-}
-
-TEST_F(OmniboxTextFieldTest, rectForDrawTextInRect_noScheme) {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // This test is expected to not work with new text field clipping because
-    // the code to implement clipping will be removed.
-    return;
-  }
-
-  NSString* text = @"www.google.com";
-  [textfield_ setText:text];
-  CGSize textSize = [[textfield_ attributedText] size];
-
-  CGRect inputRect = CGRectMake(0, 0, ceil(textSize.width), textSize.height);
-  CGRect actualRect = [textfield_ rectForDrawTextInRect:inputRect];
-  ExpectRectEqual(inputRect, actualRect);
-}
-
-// When the text doesn't contain a host the method bails early and returns
-// the |rect| passed in.
-TEST_F(OmniboxTextFieldTest, rectForDrawTextInRect_noHost) {
-  if (base::FeatureList::IsEnabled(kClippingTextfield)) {
-    // This test is expected to not work with new text field clipping because
-    // the code to implement clipping will be removed.
-    return;
-  }
-
-  NSString* text = @"http://";
-  [textfield_ setText:text];
-  CGSize textSize = [[textfield_ attributedText] size];
-
-  CGRect inputRect = CGRectMake(0, 0, ceil(textSize.width), textSize.height);
-  CGRect actualRect = [textfield_ rectForDrawTextInRect:inputRect];
-  ExpectRectEqual(inputRect, actualRect);
-}
-
 TEST_F(OmniboxTextFieldTest, SelectedRanges) {
   base::FilePath test_data_directory;
   ASSERT_TRUE(PathService::Get(ios::DIR_TEST_DATA, &test_data_directory));
diff --git a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
index 3cbaff04..0a403ba 100644
--- a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
+++ b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
@@ -27,6 +27,7 @@
     "//ios/chrome/browser/ui/history_popup/requirements",
     "//ios/chrome/browser/ui/page_info:coordinator",
     "//ios/chrome/browser/ui/static_content",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index 0e00923..b02076e 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -21,7 +21,7 @@
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.h"
 #import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
 #include "ios/chrome/browser/ui/rtl_geometry.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h"
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index 64332e7..5eae2c7 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -8,6 +8,7 @@
 #include "base/mac/foundation_util.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
@@ -167,7 +168,9 @@
       initWithRootViewController:controller
                     browserState:browserState
                         delegate:delegate];
-  [controller navigationItem].rightBarButtonItem = [nc cancelButton];
+  if (!experimental_flags::IsNewFeedbackKitEnabled()) {
+    [controller navigationItem].rightBarButtonItem = [nc cancelButton];
+  }
   return nc;
 }
 
diff --git a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
index ef51470..f41fbc3 100644
--- a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
+++ b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
@@ -288,11 +288,11 @@
   Tab* tab = [model_ tabAtIndex:index];
   BOOL isNTP =
       tab.webState->GetLastCommittedURL().host_piece() == kChromeUINewTabHost;
-  UIImage* topToolbarSnapshot =
-      [self.topToolbarSnapshotProvider toolbarSideSwipeSnapshotForTab:tab];
+  UIImage* topToolbarSnapshot = [self.topToolbarSnapshotProvider
+      toolbarSideSwipeSnapshotForWebState:tab.webState];
   [card setTopToolbarImage:topToolbarSnapshot isNewTabPage:isNTP];
-  UIImage* bottomToolbarSnapshot =
-      [self.bottomToolbarSnapshotProvider toolbarSideSwipeSnapshotForTab:tab];
+  UIImage* bottomToolbarSnapshot = [self.bottomToolbarSnapshotProvider
+      toolbarSideSwipeSnapshotForWebState:tab.webState];
   [card setBottomToolbarImage:bottomToolbarSnapshot];
 
   // Converting snapshotted images to grey takes too much time for single core
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
index 479ee34..2efefa75 100644
--- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
+++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
@@ -426,6 +426,7 @@
         std::make_unique<AnimatedScopedFullscreenDisabler>(
             FullscreenControllerFactory::GetInstance()->GetForBrowserState(
                 browserState_));
+    animatedFullscreenDisabler_->StartAnimation();
 
     inSwipe_ = YES;
     [swipeDelegate_ updateAccessoryViewsForSideSwipeWithVisibility:NO];
diff --git a/ios/chrome/browser/ui/stack_view/BUILD.gn b/ios/chrome/browser/ui/stack_view/BUILD.gn
index 7330d18c3..7a09f58 100644
--- a/ios/chrome/browser/ui/stack_view/BUILD.gn
+++ b/ios/chrome/browser/ui/stack_view/BUILD.gn
@@ -62,6 +62,7 @@
     "//ios/chrome/browser/ui/tab_switcher",
     "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar:toolbar_ui",
+    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/public:toolbar_base_feature",
@@ -127,6 +128,8 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui:ui_internal",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/stack_view/stack_view_controller.mm b/ios/chrome/browser/ui/stack_view/stack_view_controller.mm
index d87a9b5b..2718b16 100644
--- a/ios/chrome/browser/ui/stack_view/stack_view_controller.mm
+++ b/ios/chrome/browser/ui/stack_view/stack_view_controller.mm
@@ -51,9 +51,9 @@
 #import "ios/chrome/browser/ui/stack_view/stack_view_controller_private.h"
 #import "ios/chrome/browser/ui/stack_view/stack_view_toolbar_controller.h"
 #import "ios/chrome/browser/ui/stack_view/title_label.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_configuration_provider.h"
diff --git a/ios/chrome/browser/ui/stack_view/stack_view_egtest.mm b/ios/chrome/browser/ui/stack_view/stack_view_egtest.mm
index 6b29cfdb..8cb29e0 100644
--- a/ios/chrome/browser/ui/stack_view/stack_view_egtest.mm
+++ b/ios/chrome/browser/ui/stack_view/stack_view_egtest.mm
@@ -16,7 +16,8 @@
 #import "ios/chrome/browser/ui/stack_view/card_view.h"
 #import "ios/chrome/browser/ui/stack_view/stack_view_controller.h"
 #import "ios/chrome/browser/ui/stack_view/stack_view_controller_private.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/stack_view_test_util.h"
diff --git a/ios/chrome/browser/ui/stack_view/stack_view_toolbar_controller.mm b/ios/chrome/browser/ui/stack_view/stack_view_toolbar_controller.mm
index a9b12347..1301a30 100644
--- a/ios/chrome/browser/ui/stack_view/stack_view_toolbar_controller.mm
+++ b/ios/chrome/browser/ui/stack_view/stack_view_toolbar_controller.mm
@@ -13,8 +13,9 @@
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #import "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/chrome/browser/ui/stack_view/new_tab_button.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/BUILD.gn
index fd7b253..98731002 100644
--- a/ios/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/BUILD.gn
@@ -44,6 +44,8 @@
     "tab_grid_transition_state_provider.h",
     "tab_grid_view_controller.h",
     "tab_grid_view_controller.mm",
+    "top_aligned_image_view.h",
+    "top_aligned_image_view.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h
index 78c3fdce..d7ec2987 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h
@@ -7,10 +7,20 @@
 
 #import <UIKit/UIKit.h>
 
+// Pre-set color configurations.
+typedef NS_ENUM(NSUInteger, TabGridBottomToolbarTheme) {
+  TabGridBottomToolbarThemeInvalid = 0,
+  TabGridBottomToolbarThemeWhiteRoundButton,
+  TabGridBottomToolbarThemeBlueRoundButton,
+  TabGridBottomToolbarThemePartiallyDisabled,
+};
+
 // Toolbar view with two text buttons and a center round button. The contents
 // have a fixed height and are pinned to the top of this view, therefore it is
 // intended to be used as a bottom toolbar.
 @interface TabGridBottomToolbar : UIView
+// The color configuration of the toolbar.
+@property(nonatomic, assign) TabGridBottomToolbarTheme theme;
 // These components are publicly available to allow the user to set their
 // contents, visibility and actions.
 @property(nonatomic, weak, readonly) UIButton* leadingButton;
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
index 60253f0..6ab52812 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h"
 
+#include "base/logging.h"
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
@@ -16,6 +18,7 @@
 }  // namespace
 
 @implementation TabGridBottomToolbar
+@synthesize theme = _theme;
 @synthesize leadingButton = _leadingButton;
 @synthesize trailingButton = _trailingButton;
 @synthesize roundButton = _roundButton;
@@ -31,22 +34,16 @@
 
     UIButton* leadingButton = [UIButton buttonWithType:UIButtonTypeSystem];
     leadingButton.translatesAutoresizingMaskIntoConstraints = NO;
-    leadingButton.tintColor = [UIColor whiteColor];
+
     [leadingButton setTitle:@"Button" forState:UIControlStateNormal];
 
     UIButton* trailingButton = [UIButton buttonWithType:UIButtonTypeSystem];
     trailingButton.translatesAutoresizingMaskIntoConstraints = NO;
-    trailingButton.tintColor = [UIColor whiteColor];
     [trailingButton setTitle:@"Button" forState:UIControlStateNormal];
 
     UIButton* roundButton = [UIButton buttonWithType:UIButtonTypeSystem];
     roundButton.translatesAutoresizingMaskIntoConstraints = NO;
-    roundButton.tintColor = [UIColor whiteColor];
     [roundButton setTitle:@"Btn" forState:UIControlStateNormal];
-    roundButton.backgroundColor = [UIColor colorWithRed:63 / 255.0f
-                                                  green:81 / 255.0f
-                                                   blue:181 / 255.0f
-                                                  alpha:1.0f];
     roundButton.layer.cornerRadius = 22.f;
     roundButton.layer.masksToBounds = YES;
 
@@ -84,4 +81,42 @@
   return CGSizeMake(UIViewNoIntrinsicMetric, kToolbarHeight);
 }
 
+#pragma mark - Public
+
+- (void)setTheme:(TabGridBottomToolbarTheme)theme {
+  if (_theme == theme)
+    return;
+  switch (theme) {
+    case TabGridBottomToolbarThemeWhiteRoundButton:
+      self.trailingButton.enabled = YES;
+      self.roundButton.enabled = YES;
+      self.roundButton.backgroundColor = [UIColor whiteColor];
+      self.roundButton.tintColor = [UIColor blackColor];
+      self.leadingButton.tintColor = [UIColor whiteColor];
+      self.trailingButton.tintColor = [UIColor whiteColor];
+      break;
+    case TabGridBottomToolbarThemeBlueRoundButton:
+      self.trailingButton.enabled = YES;
+      self.roundButton.enabled = YES;
+      self.roundButton.backgroundColor =
+          [UIColor colorWithRed:0.0 green:122.0 / 255.0 blue:1.0 alpha:1.0];
+      self.roundButton.tintColor = [UIColor whiteColor];
+      self.leadingButton.tintColor = [UIColor whiteColor];
+      self.trailingButton.tintColor = [UIColor whiteColor];
+      break;
+    case TabGridBottomToolbarThemePartiallyDisabled:
+      self.trailingButton.enabled = NO;
+      self.roundButton.enabled = NO;
+      self.roundButton.backgroundColor = [UIColor grayColor];
+      self.roundButton.tintColor = [UIColor blackColor];
+      self.leadingButton.tintColor = [UIColor whiteColor];
+      self.trailingButton.tintColor = [UIColor whiteColor];
+      break;
+    default:
+      NOTREACHED() << "Invalid theme for TabGridBottomToolbar.";
+      break;
+  }
+  _theme = theme;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.h b/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.h
new file mode 100644
index 0000000..3ba5daf
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.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 IOS_CHROME_BROWSER_UI_TAB_GRID_TOP_ALIGNED_IMAGE_VIEW_H_
+#define IOS_CHROME_BROWSER_UI_TAB_GRID_TOP_ALIGNED_IMAGE_VIEW_H_
+
+#import <UIKit/UIKit.h>
+
+// The standard UIImageView zooms to the center of the image when it aspect
+// fills. TopAlignedImageView aligns to the top of the image instead of the
+// center.
+@interface TopAlignedImageView : UIView
+// The image displayed in the image view.
+@property(nonatomic) UIImage* image;
+
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_GRID_TOP_ALIGNED_IMAGE_VIEW_H_
diff --git a/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.mm b/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.mm
new file mode 100644
index 0000000..27c5d870
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/top_aligned_image_view.mm
@@ -0,0 +1,62 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/tab_grid/top_aligned_image_view.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface TopAlignedImageView ()
+// The backing image view.
+@property(nonatomic, weak) UIImageView* innerImageView;
+@end
+
+@implementation TopAlignedImageView
+@synthesize innerImageView = _innerImageView;
+
+- (instancetype)init {
+  if (self = [super initWithFrame:CGRectZero]) {
+    UIImageView* innerImageView = [[UIImageView alloc] init];
+    [self addSubview:innerImageView];
+    _innerImageView = innerImageView;
+    _innerImageView.contentMode = UIViewContentModeScaleAspectFill;
+    _innerImageView.backgroundColor = [UIColor clearColor];
+    self.clipsToBounds = YES;
+  }
+  return self;
+}
+
+- (void)layoutSubviews {
+  [super layoutSubviews];
+  if (!self.image)
+    return;
+  CGFloat widthScaleFactor = CGRectGetWidth(self.frame) / self.image.size.width;
+  CGFloat heightScaleFactor =
+      CGRectGetHeight(self.frame) / self.image.size.height;
+  CGFloat imageViewWidth;
+  CGFloat imageViewHeight;
+  if (widthScaleFactor > heightScaleFactor) {
+    imageViewWidth = self.image.size.width * widthScaleFactor;
+    imageViewHeight = self.image.size.height * widthScaleFactor;
+  } else {
+    imageViewWidth = self.image.size.width * heightScaleFactor;
+    imageViewHeight = self.image.size.height * heightScaleFactor;
+  }
+  self.innerImageView.frame =
+      CGRectMake((self.frame.size.width - imageViewWidth) / 2.0f, 0,
+                 imageViewWidth, imageViewHeight);
+}
+
+#pragma mark - Public properties
+
+- (void)setImage:(UIImage*)image {
+  self.innerImageView.image = image;
+}
+
+- (UIImage*)image {
+  return self.innerImageView.image;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn
index 2d7caff..a3d18959 100644
--- a/ios/chrome/browser/ui/toolbar/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -7,16 +7,11 @@
   sources = [
     "legacy_toolbar_coordinator.h",
     "legacy_toolbar_coordinator.mm",
-    "toolbar_adapter.h",
-    "toolbar_adapter.mm",
     "toolbar_model_delegate_ios.h",
     "toolbar_model_delegate_ios.mm",
   ]
   deps = [
-    ":resource_macros",
     ":toolbar_ui",
-    "public",
-    "public:toolbar_base_feature",
     "resources:collapse",
     "resources:collapse_incognito",
     "resources:collapse_pressed",
@@ -27,83 +22,30 @@
     "resources:toolbar_dark_newtab_incognito",
     "resources:toolbar_dark_newtab_incognito_active",
     "//base",
-    "//base:i18n",
-    "//components/bookmarks/browser",
-    "//components/google/core/browser",
-    "//components/omnibox/browser",
     "//components/prefs",
-    "//components/reading_list/core",
-    "//components/reading_list/ios",
-    "//components/search_engines",
-    "//components/strings",
     "//components/toolbar",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/app/theme",
     "//ios/chrome/browser",
     "//ios/chrome/browser/autocomplete",
-    "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/drag_and_drop",
-    "//ios/chrome/browser/reading_list",
-    "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/ssl",
-    "//ios/chrome/browser/tabs",
-    "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui:ui_util",
     "//ios/chrome/browser/ui/activity_services/requirements",
-    "//ios/chrome/browser/ui/bubble",
-    "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
-    "//ios/chrome/browser/ui/fancy_ui",
     "//ios/chrome/browser/ui/fullscreen",
-    "//ios/chrome/browser/ui/fullscreen:ui",
-    "//ios/chrome/browser/ui/history",
     "//ios/chrome/browser/ui/history_popup/requirements",
-    "//ios/chrome/browser/ui/image_util",
-    "//ios/chrome/browser/ui/keyboard",
-    "//ios/chrome/browser/ui/location_bar",
-    "//ios/chrome/browser/ui/ntp",
-    "//ios/chrome/browser/ui/omnibox",
-    "//ios/chrome/browser/ui/omnibox/popup",
-    "//ios/chrome/browser/ui/popup_menu",
+    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
     "//ios/chrome/browser/ui/qr_scanner/requirements",
-    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar",
     "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/keyboard_assist",
+    "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu:configuration",
     "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/chrome/browser/ui/util",
-    "//ios/chrome/browser/ui/voice",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common",
-    "//ios/public/provider/chrome/browser",
-    "//ios/public/provider/chrome/browser/images",
     "//ios/public/provider/chrome/browser/voice",
-    "//ios/third_party/material_components_ios",
-    "//ios/third_party/material_roboto_font_loader_ios",
-    "//ios/web",
-    "//net",
-    "//ui/base",
-
-    # Fake dependencies to break cycles
-    "//ios/chrome/browser/ui/ntp",
-    "//ios/chrome/browser/ui/side_swipe",
+    "//ios/web/public",
   ]
-  public_deps = [
-    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
-  ]
-  allow_circular_includes_from = [
-    "//ios/chrome/browser/ui/side_swipe",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
-    "//ios/chrome/browser/ui/ntp",
-    "//ios/chrome/browser/ui/location_bar",
-  ]
-  libs = [
-    "CoreLocation.framework",
-    "UIKit.framework",
-  ]
+  libs = [ "UIKit.framework" ]
 }
 
 source_set("toolbar_ui") {
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
index fce64dc..bbf99c5 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
@@ -21,7 +21,6 @@
     "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/reading_list",
-    "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
@@ -30,6 +29,7 @@
     "//ios/chrome/browser/ui/ntp",
     "//ios/chrome/browser/ui/ntp:util",
     "//ios/chrome/browser/ui/omnibox",
+    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
     "//ios/chrome/browser/ui/omnibox/popup",
     "//ios/chrome/browser/ui/orchestrator",
     "//ios/chrome/browser/ui/toolbar",
@@ -63,6 +63,7 @@
   ]
   deps = [
     "//base",
+    "//ios/chrome/browser/ui:ui_util",
     "//ios/chrome/browser/ui/activity_services/requirements",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/fullscreen:ui",
@@ -91,6 +92,7 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui:ui_util",
+    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
index b2e8a243..54a5f60 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
@@ -7,7 +7,6 @@
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
-#import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/ui/ntp/ntp_util.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
@@ -16,7 +15,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/tools_menu_button_observer_bridge.h"
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -74,9 +72,7 @@
 
 #pragma mark - SideSwipeToolbarSnapshotProviding
 
-- (UIImage*)toolbarSideSwipeSnapshotForTab:(Tab*)tab {
-  web::WebState* webState = tab.webState;
-
+- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState {
   [self updateToolbarForSideSwipeSnapshot:webState];
 
   UIImage* toolbarSnapshot = CaptureViewWithOption(
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm
index da271d3..9918d96d 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm
@@ -8,7 +8,7 @@
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/top_view_controller.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm
index aa0a9af..28605042 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
 #import "ios/third_party/material_components_ios/src/components/ProgressView/src/MaterialProgressView.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
index 36ace6e6..1ab1c53 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
@@ -22,7 +22,6 @@
 #import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
index eb4c410..ab1db735 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
+#include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/third_party/material_components_ios/src/components/ProgressView/src/MaterialProgressView.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
index 9514d75..6e39eb2 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
@@ -17,7 +17,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_tints.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_tints.h
index 6549968..47dc851 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_tints.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_tints.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 
 namespace toolbar {
 
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
index 7c615e6..7857ccf 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
@@ -6,7 +6,6 @@
 
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
index a49ab7d..f46cf90 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
@@ -17,6 +17,9 @@
 // Toolbar styling.
 extern const CGFloat kToolbarBackgroundColor;
 extern const CGFloat kIncognitoToolbarBackgroundColor;
+// The brightness of the toolbar's background color (visible on NTPs when the
+// background view is hidden).
+extern const CGFloat kNTPBackgroundColorBrightnessIncognito;
 
 // Stackview constraints.
 extern const CGFloat kLocationBarVerticalMargin;
@@ -65,4 +68,40 @@
 extern const CGFloat kIcongnitoAdaptiveLocationBackgroundColor;
 extern const CGFloat kAdaptiveLocationBarBackgroundAlpha;
 
+// Height of the toolbar.
+extern const CGFloat kToolbarHeight;
+// Height of the toolbar when in fullscreen.
+extern const CGFloat kToolbarHeightFullscreen;
+
+// Accessibility identifier of the tools menu button.
+extern NSString* const kToolbarToolsMenuButtonIdentifier;
+// Accessibility identifier of the stack button.
+extern NSString* const kToolbarStackButtonIdentifier;
+// Accessibility identifier of the share button.
+extern NSString* const kToolbarShareButtonIdentifier;
+// Accessibility identifier of the omnibox button.
+extern NSString* const kToolbarOmniboxButtonIdentifier;
+
+// The maximum number to display in the tab switcher button.
+extern NSInteger const kStackButtonMaxTabCount;
+
+// Font sizes for the button containing the tab count
+extern const NSInteger kFontSizeFewerThanTenTabs;
+extern const NSInteger kFontSizeTenTabsOrMore;
+
+// Height of the shadow displayed below the toolbar when the omnibox is
+// contracted.
+extern const CGFloat kToolbarShadowHeight;
+// Height of the shadow displayed below the toolbar when the omnibox is
+// expanded.
+extern const CGFloat kToolbarFullBleedShadowHeight;
+
+// Toolbar style. Determines which button images are used.
+enum ToolbarControllerStyle {
+  ToolbarControllerStyleLightMode = 0,
+  ToolbarControllerStyleDarkMode,
+  ToolbarControllerStyleIncognitoMode,
+  ToolbarControllerStyleMaxStyles
+};
+
 #endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_BUTTONS_TOOLBAR_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
index 5d1ae5bb..07596731 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
@@ -10,6 +10,7 @@
 
 const CGFloat kToolbarBackgroundColor = 0xF2F2F2;
 const CGFloat kIncognitoToolbarBackgroundColor = 0x505050;
+const CGFloat kNTPBackgroundColorBrightnessIncognito = 34.0 / 255.0;
 
 const CGFloat kLocationBarVerticalMargin = 7.0f;
 const CGFloat kExpandedLocationBarVerticalMargin = 2.0f;
@@ -49,3 +50,23 @@
 const CGFloat kAdaptiveLocationBarCornerRadius = 11;
 const CGFloat kIcongnitoAdaptiveLocationBackgroundColor = 0x6A6A6A;
 const CGFloat kAdaptiveLocationBarBackgroundAlpha = 0.12;
+
+const CGFloat kToolbarHeight = 56;
+const CGFloat kToolbarHeightFullscreen = 35;
+
+NSString* const kToolbarToolsMenuButtonIdentifier =
+    @"kToolbarToolsMenuButtonIdentifier";
+NSString* const kToolbarStackButtonIdentifier =
+    @"kToolbarStackButtonIdentifier";
+NSString* const kToolbarShareButtonIdentifier =
+    @"kToolbarShareButtonIdentifier";
+NSString* const kToolbarOmniboxButtonIdentifier =
+    @"kToolbarOmniboxButtonIdentifier";
+
+const NSInteger kStackButtonMaxTabCount = 99;
+
+const NSInteger kFontSizeFewerThanTenTabs = 11;
+const NSInteger kFontSizeTenTabsOrMore = 9;
+
+const CGFloat kToolbarShadowHeight = 2;
+const CGFloat kToolbarFullBleedShadowHeight = 10;
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.mm
index cf044bd..ce904db 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.mm
@@ -6,7 +6,6 @@
 
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
index ca5f7542..b28e84f 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
@@ -8,7 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 
 // ColoredButton specialization that updates the tint color when the tools menu
 // is visible or when the reading list associated with |readingListModel|
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.mm
index 1470889..6665d09 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.mm
@@ -5,13 +5,20 @@
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.h"
 
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+namespace {
+enum ToolbarButtonMode {
+  ToolbarButtonModeNormal,
+  ToolbarButtonModeReversed,
+};
+}  // namespace
+
 @interface ToolbarButtonUpdater ()
 
 // Keeps track of whether or not the back button's images have been reversed.
@@ -65,11 +72,9 @@
                             forState:UIControlStateHighlighted];
   }
   if (self.TTSPlaying && UIAccessibilityIsVoiceOverRunning()) {
-    // Moving VoiceOver without RunBlockAfterDelay results in VoiceOver not
-    // staying on |voiceSearchButton| and instead moving to views inside the
-    // WebView.
-    // Use |voiceSearchButton| in the block to prevent |self| from being
-    // retained.
+    // Moving VoiceOver without delay results in VoiceOver not staying on
+    // |voiceSearchButton| and instead moving to views inside the WebView. Use
+    // |voiceSearchButton| in the block to prevent |self| from being retained.
     UIButton* voiceSearchButton = self.voiceSearchButton;
     dispatch_async(dispatch_get_main_queue(), ^{
       UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h
index a7ca0740..c772826 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h
@@ -98,6 +98,9 @@
 - (void)activateFakeSafeAreaInsets:(UIEdgeInsets)fakeSafeAreaInsets;
 // Deactivates the constraints used to create a fake safe area.
 - (void)deactivateFakeSafeAreaInsets;
+// Asks the provider for the color of the background of the toolbar. A nil value
+// indicates the default color will be used.
+- (UIColor*)toolbarBackgroundColor;
 
 @end
 
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
index 73385db..a8ee6b6 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
@@ -30,7 +30,6 @@
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/chrome/browser/ui/voice/text_to_speech_player.h"
@@ -247,6 +246,10 @@
   [self.toolbarViewController deactivateFakeSafeAreaInsets];
 }
 
+- (UIColor*)toolbarBackgroundColor {
+  return self.toolbarViewController.backgroundColor;
+}
+
 // TODO(crbug.com/786940): This protocol should move to the ViewController
 // owning the Toolbar. This can wait until the omnibox and toolbar refactoring
 // is more advanced.
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view.mm
index f482510f..4b7f63b 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view.mm
@@ -10,8 +10,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
index 5c9bad04..527ddb1 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
@@ -45,6 +45,8 @@
 @property(nonatomic, assign) BOOL expanded;
 // Omnibox focuser.
 @property(nonatomic, weak) id<OmniboxFocuser> omniboxFocuser;
+// Background color of the toolbar. Returns nil if it is the default color.
+@property(nonatomic, strong, readonly) UIColor* backgroundColor;
 
 // Sets the location bar view, containing the omnibox.
 - (void)setLocationBarView:(UIView*)locationBarView;
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
index 78cb4ba..dccb55b 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -26,8 +26,6 @@
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_view.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_base_feature.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/constraints_ui_util.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
@@ -40,6 +38,12 @@
 #error "This file requires ARC support."
 #endif
 
+namespace {
+// Fullscreen constants.
+const CGFloat kIPadToolbarY = 53;
+const CGFloat kScrollFadeDistance = 30;
+}
+
 @interface ToolbarViewController ()<ToolbarViewFullscreenDelegate>
 @property(nonatomic, strong) ToolbarButtonFactory* buttonFactory;
 @property(nonatomic, strong) ToolbarButtonUpdater* buttonUpdater;
@@ -326,6 +330,12 @@
   return self.view.toolsMenuButton;
 }
 
+- (UIColor*)backgroundColor {
+  if (self.view.backgroundView.hidden || self.view.backgroundView.alpha == 0)
+    return nil;
+  return self.view.backgroundView.backgroundColor;
+}
+
 #pragma mark - Components Setup
 
 - (void)setUpToolbarButtons {
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn b/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
index 3c460cb..faba125 100644
--- a/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
@@ -28,6 +28,7 @@
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/external_search:features",
+    "//ios/chrome/browser/ui/location_bar:constants",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.mm b/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.mm
index 326de90e..32058e7 100644
--- a/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.mm
+++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.mm
@@ -10,8 +10,8 @@
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/external_search_commands.h"
 #import "ios/chrome/browser/ui/commands/start_voice_search_command.h"
+#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/voice/voice_search_provider.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/legacy/BUILD.gn b/ios/chrome/browser/ui/toolbar/legacy/BUILD.gn
index c2c9035..4decf333 100644
--- a/ios/chrome/browser/ui/toolbar/legacy/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/legacy/BUILD.gn
@@ -5,11 +5,16 @@
 source_set("legacy") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "abstract_toolbar.h",
     "legacy_toolbar_view.h",
     "legacy_toolbar_view.mm",
     "toolbar_controller+protected.h",
     "toolbar_controller.h",
     "toolbar_controller.mm",
+    "toolbar_controller_constants.h",
+    "toolbar_controller_constants.mm",
+    "toolbar_utils.h",
+    "toolbar_utils.mm",
   ]
   deps = [
     "//base",
diff --git a/ios/chrome/browser/ui/toolbar/public/abstract_toolbar.h b/ios/chrome/browser/ui/toolbar/legacy/abstract_toolbar.h
similarity index 71%
rename from ios/chrome/browser/ui/toolbar/public/abstract_toolbar.h
rename to ios/chrome/browser/ui/toolbar/legacy/abstract_toolbar.h
index fb178f2..a622816 100644
--- a/ios/chrome/browser/ui/toolbar/public/abstract_toolbar.h
+++ b/ios/chrome/browser/ui/toolbar/legacy/abstract_toolbar.h
@@ -2,21 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_TOOLBAR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_TOOLBAR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_ABSTRACT_TOOLBAR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_ABSTRACT_TOOLBAR_H_
 
 #import <Foundation/Foundation.h>
 
-@class ToolsMenuConfiguration;
-
 // ToolbarController public interface.
 @protocol AbstractToolbar<NSObject>
-// Triggers an animation on the tools menu button to draw the user's
-// attention.
-- (void)triggerToolsMenuButtonAnimation;
-// Sets the background to a particular alpha value. Intended for use by
-// subcleasses that need to set the opacity of the entire toolbar.
-- (void)setBackgroundAlpha:(CGFloat)alpha;
 // Updates the tab stack button (if there is one) based on the given tab
 // count. If |tabCount| > |kStackButtonMaxTabCount|, an easter egg is shown
 // instead of the actual number of tabs.
@@ -36,4 +28,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_TOOLBAR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_ABSTRACT_TOOLBAR_H_
diff --git a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h
index 553b1b6..e4bcb96 100644
--- a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h
@@ -6,21 +6,14 @@
 #define IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_CONTROLLER_PROTECTED_H_
 
 #import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 
 @interface ToolbarController (Protected)
 
-// An array of CALayers that are currently animating under
-// kToolbarTransitionAnimationKey.
-@property(nonatomic, readonly) NSMutableArray* transitionLayers;
-
 // The view containing all the content of the toolbar. It respects the trailing
 // and leading anchors of the safe area.
 @property(nonatomic, readonly, strong) UIView* contentView;
 
-// Update share button visibility and |standardButtons_| array.
-- (void)updateStandardButtons;
-
 // Called when buttons are pressed. Records action metrics.
 // Subclasses must call |super| if they override this method.
 - (IBAction)recordUserMetrics:(id)sender;
@@ -29,29 +22,10 @@
 // set display or dismiss target-actions.
 - (UIButton*)stackButton;
 
-// Called whenever one of the standard controls is triggered. Does nothing,
-// but can be overridden by subclasses to clear any state (e.g., close menus).
-- (void)standardButtonPressed:(UIButton*)sender;
-
 // Returns the area that subclasses should use for adding their own
-// controls. Nothing should be added outside this frame without first
-// calling |setStandardControlsVisible:NO|.
+// controls.
 - (CGRect)specificControlsArea;
 
-// Sets the standard control set to be visible or invisible. Uses alpha, so it
-// can be animated if called from an animation context. Intended for use by
-// subclasses that need to temporarily take over the entire toolbar.
-- (void)setStandardControlsVisible:(BOOL)visible;
-
-// Sets the standard control to a particular alpha value. Intended for use by
-// subclasses that need to temporarily take over the entire toolbar.
-- (void)setStandardControlsAlpha:(CGFloat)alpha;
-
-// Returns the UIImage from the resources bundle for the |imageEnum| and
-// |state|.  Uses the toolbar's current style.
-- (UIImage*)imageForImageEnum:(int)imageEnum
-                     forState:(ToolbarButtonUIState)state;
-
 // Returns the image enum for a given button object.  If the user taps a
 // button before its secondary images have been loaded, the image(s) will be
 // loaded then, synchronously.  Called by -standardButtonPressed.
@@ -65,26 +39,6 @@
                      style:(ToolbarControllerStyle)style
                   forState:(ToolbarButtonUIState)state;
 
-// Adds transition animations to every UIButton in |containerView| with a
-// nonzero opacity.
-- (void)animateTransitionForButtonsInView:(UIView*)containerView
-                     containerBeginBounds:(CGRect)containerBeginBounds
-                       containerEndBounds:(CGRect)containerEndBounds
-                          transitionStyle:(ToolbarTransitionStyle)style;
-
-// Add position and opacity animations to |view|'s layer. The opacity
-// animation goes from 0 to 1. The position animation goes from
-// [view.layer.position offset in the leading direction by |leadingOffset|)
-// to view.layer.position. Both animations occur after |delay| seconds.
-- (void)fadeInView:(UIView*)view
-    fromLeadingOffset:(LayoutOffset)leadingOffset
-         withDuration:(NSTimeInterval)duration
-           afterDelay:(NSTimeInterval)delay;
-
-// Animates the tools menu button and stack button for full bleed omnibox
-// animation used for Material.
-- (void)animateStandardControlsForOmniboxExpansion:(BOOL)growOmnibox;
-
 // Sets up |button| with images named by the given |imageEnum| and the current
 // toolbar style.  Sets images synchronously for |initialState|, and
 // asynchronously for the other states. Optionally sets the image for the
diff --git a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.h b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.h
index fc1ce7b..caaa5210 100644
--- a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.h
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.h
@@ -9,9 +9,10 @@
 
 #import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_element.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/abstract_toolbar.h"
 #import "ios/chrome/browser/ui/toolbar/legacy/legacy_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/public/abstract_toolbar.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.mm
index 5d1417a..f2c5307a 100644
--- a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller.mm
@@ -28,7 +28,7 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/tools_menu_button_observer_bridge.h"
 #import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller+protected.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -76,9 +76,6 @@
   // The shadow view. Only used on iPhone.
   UIImageView* fullBleedShadowView_;
 
-  // The backing object for |self.transitionLayers|.
-  NSMutableArray* transitionLayers_;
-
   ToolbarToolsMenuButton* toolsMenuButton_;
   UIButton* stackButton_;
   UIButton* shareButton_;
@@ -252,9 +249,6 @@
           setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)];
     }
 
-    transitionLayers_ =
-        [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity];
-
     // UIImageViews do not default to userInteractionEnabled:YES.
     [self.view setUserInteractionEnabled:YES];
     [backgroundView_ setUserInteractionEnabled:YES];
@@ -288,10 +282,6 @@
     }
     [self registerEventsForButton:toolsMenuButton_];
 
-    self.view.accessibilityIdentifier =
-        style == ToolbarControllerStyleIncognitoMode
-            ? kIncognitoToolbarIdentifier
-            : kToolbarIdentifier;
     SetA11yLabelAndUiAutomationName(stackButton_, IDS_IOS_TOOLBAR_SHOW_TABS,
                                     kToolbarStackButtonIdentifier);
     SetA11yLabelAndUiAutomationName(toolsMenuButton_, IDS_IOS_TOOLBAR_SETTINGS,
@@ -448,22 +438,6 @@
 
 #pragma mark - Protected API
 
-- (void)updateStandardButtons {
-  BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible];
-  [shareButton_ setHidden:!shareButtonShouldBeVisible];
-  NSMutableArray* standardButtons = [NSMutableArray array];
-  [standardButtons addObject:toolsMenuButton_];
-  if (stackButton_)
-    [standardButtons addObject:stackButton_];
-  if (shareButtonShouldBeVisible)
-    [standardButtons addObject:shareButton_];
-  standardButtons_ = standardButtons;
-}
-
-- (CGFloat)statusBarOffset {
-  return StatusBarHeight();
-}
-
 - (IBAction)recordUserMetrics:(id)sender {
   if (sender == toolsMenuButton_)
     base::RecordAction(UserMetricsAction("MobileToolbarShowMenu"));
@@ -475,6 +449,10 @@
     NOTREACHED();
 }
 
+- (CGFloat)statusBarOffset {
+  return StatusBarHeight();
+}
+
 - (UIButton*)stackButton {
   return stackButton_;
 }
@@ -500,33 +478,6 @@
   return controlsFrame;
 }
 
-- (void)setStandardControlsVisible:(BOOL)visible {
-  if (visible) {
-    for (UIButton* button in standardButtons_) {
-      [button setAlpha:1.0];
-    }
-  } else {
-    for (UIButton* button in standardButtons_) {
-      [button setAlpha:0.0];
-    }
-  }
-}
-
-- (void)setStandardControlsAlpha:(CGFloat)alpha {
-  for (UIButton* button in standardButtons_) {
-    if (![button isHidden])
-      [button setAlpha:alpha];
-  }
-}
-
-- (UIImage*)imageForImageEnum:(int)imageEnum
-                     forState:(ToolbarButtonUIState)state {
-  int imageID =
-      [self imageIdForImageEnum:imageEnum style:[self style] forState:state];
-  return NativeReversableImage(
-      imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]);
-}
-
 - (int)imageEnumForButton:(UIButton*)button {
   if (button == stackButton_)
     return ToolbarButtonNameStack;
@@ -554,12 +505,20 @@
   return buttonImageIds[index][style][state];
 }
 
-- (NSMutableArray*)transitionLayers {
-  return transitionLayers_;
+#pragma mark - ToolsMenuPresentationProvider
+
+- (UIButton*)presentingButtonForToolsMenuCoordinator:
+    (ToolsMenuCoordinator*)coordinator {
+  return toolsMenuButton_;
 }
 
+#pragma mark - Private Methods
 #pragma mark Animations
 
+// Add position and opacity animations to |view|'s layer. The opacity
+// animation goes from 0 to 1. The position animation goes from
+// [view.layer.position offset in the leading direction by |leadingOffset|)
+// to view.layer.position. Both animations occur after |delay| seconds.
 - (void)fadeInView:(UIView*)view
     fromLeadingOffset:(LayoutOffset)leadingOffset
          withDuration:(NSTimeInterval)duration
@@ -592,22 +551,6 @@
   [CATransaction commit];
 }
 
-- (void)animateStandardControlsForOmniboxExpansion:(BOOL)growOmnibox {
-  if (growOmnibox)
-    [self fadeOutStandardControls];
-  else
-    [self fadeInStandardControls];
-}
-
-#pragma mark - ToolsMenuPresentationProvider
-
-- (UIButton*)presentingButtonForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator {
-  return toolsMenuButton_;
-}
-
-#pragma mark - Private Methods
-#pragma mark Animations
 - (void)fadeOutStandardControls {
   // The opacity animation has a different duration from the position animation.
   // Thus they require separate CATransations.
@@ -675,20 +618,18 @@
 
 #pragma mark Helpers
 
-- (UIFont*)fontForSize:(NSInteger)size {
-  return [[MDCTypography fontLoader] boldFontOfSize:size];
+// Returns the UIImage from the resources bundle for the |imageEnum| and
+// |state|.  Uses the toolbar's current style.
+- (UIImage*)imageForImageEnum:(int)imageEnum
+                     forState:(ToolbarButtonUIState)state {
+  int imageID =
+      [self imageIdForImageEnum:imageEnum style:[self style] forState:state];
+  return NativeReversableImage(
+      imageID, [self imageShouldFlipForRightToLeftLayoutDirection:imageEnum]);
 }
 
-- (BOOL)shareButtonShouldBeVisible {
-  // The share button only exists on iPad, and when some tabs are visible
-  // (i.e. when not in DarkMode), and when the width is greater than
-  // the tablet mini view.
-  if (!IsIPadIdiom() || style_ == ToolbarControllerStyleDarkMode ||
-      IsCompactTablet(self.view))
-    return NO;
-  return YES;
-}
-
+// Called whenever one of the standard controls is triggered. Does nothing,
+// but can be overridden by subclasses to clear any state (e.g., close menus).
 - (void)standardButtonPressed:(UIButton*)sender {
   // This check for valid button images assumes that the buttons all have a
   // different image for the highlighted state as for the normal state.
@@ -705,6 +646,33 @@
   }
 }
 
+// Update share button visibility and |standardButtons_| array.
+- (void)updateStandardButtons {
+  BOOL shareButtonShouldBeVisible = [self shareButtonShouldBeVisible];
+  [shareButton_ setHidden:!shareButtonShouldBeVisible];
+  NSMutableArray* standardButtons = [NSMutableArray array];
+  [standardButtons addObject:toolsMenuButton_];
+  if (stackButton_)
+    [standardButtons addObject:stackButton_];
+  if (shareButtonShouldBeVisible)
+    [standardButtons addObject:shareButton_];
+  standardButtons_ = standardButtons;
+}
+
+- (UIFont*)fontForSize:(NSInteger)size {
+  return [[MDCTypography fontLoader] boldFontOfSize:size];
+}
+
+- (BOOL)shareButtonShouldBeVisible {
+  // The share button only exists on iPad, and when some tabs are visible
+  // (i.e. when not in DarkMode), and when the width is greater than
+  // the tablet mini view.
+  if (!IsIPadIdiom() || style_ == ToolbarControllerStyleDarkMode ||
+      IsCompactTablet(self.view))
+    return NO;
+  return YES;
+}
+
 - (void)registerEventsForButton:(UIButton*)button {
   if (button != toolsMenuButton_) {
     // |target| must be |self| (as opposed to |nil|) because |self| isn't in the
diff --git a/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h
new file mode 100644
index 0000000..851480a9
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h
@@ -0,0 +1,60 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_CONTROLLER_CONSTANTS_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_CONTROLLER_CONSTANTS_H_
+
+#import <Foundation/Foundation.h>
+
+#import <CoreGraphics/CoreGraphics.h>
+#include "ios/chrome/browser/ui/rtl_geometry.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+
+// The time delay before non-initial button images are loaded.
+extern const int64_t kNonInitialImageAdditionDelayNanosec;
+
+// Toolbar frames shared with subclasses.
+extern const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT];
+// UI frames.  iPhone values followed by iPad values.
+// Full-width frames that don't change for RTL languages.
+extern const CGRect kBackgroundViewFrame[INTERFACE_IDIOM_COUNT];
+extern const CGRect kShadowViewFrame[INTERFACE_IDIOM_COUNT];
+// Full bleed shadow frame is iPhone-only
+extern const CGRect kFullBleedShadowViewFrame;
+
+// Color constants for the stack button text, normal and pressed states.  These
+// arrays are indexed by ToolbarControllerStyle enum values.
+extern const CGFloat kStackButtonNormalColors[];
+extern const int kStackButtonHighlightedColors[];
+
+// Frames that change for RTL.
+extern const LayoutRect kStackButtonFrame;
+extern const LayoutRect kShareMenuButtonFrame;
+extern const LayoutRect kToolsMenuButtonFrame[INTERFACE_IDIOM_COUNT];
+
+// Distance to shift buttons when fading out.
+extern const LayoutOffset kButtonFadeOutXOffset;
+
+enum ToolbarButtonUIState {
+  ToolbarButtonUIStateNormal = 0,
+  ToolbarButtonUIStatePressed,
+  ToolbarButtonUIStateDisabled,
+  NumberOfToolbarButtonUIStates,
+};
+
+// This enumerates the different buttons used by the toolbar and is used to map
+// the resource IDs for the button's icons.  Subclasses with additional buttons
+// should extend these values.  The first new enum should be set to
+// |NumberOfToolbarButtonNames|.  Note that functions that use these values use
+// an int rather than the |ToolbarButtonName| to accommodate additional values.
+// Also, if this enum is extended by a subclass, the subclass must also override
+// -imageIdForImageEnum:style:forState: to provide mapping from enum to resource
+// ID for the various states.
+enum ToolbarButtonName {
+  ToolbarButtonNameStack = 0,
+  ToolbarButtonNameShare,
+  NumberOfToolbarButtonNames,
+};
+
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_CONTROLLER_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.mm
similarity index 66%
rename from ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
rename to ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.mm
index eb1ca83..fce2616a 100644
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.mm
@@ -2,38 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-const CGFloat kToolbarHeight = 56;
-const CGFloat kToolbarHeightFullscreen = 35;
-
 const int64_t kNonInitialImageAdditionDelayNanosec = 500000LL;
 
-NSString* const kToolbarIdentifier = @"kToolbarIdentifier";
-NSString* const kIncognitoToolbarIdentifier = @"kIncognitoToolbarIdentifier";
-NSString* const kToolbarToolsMenuButtonIdentifier =
-    @"kToolbarToolsMenuButtonIdentifier";
-NSString* const kToolbarStackButtonIdentifier =
-    @"kToolbarStackButtonIdentifier";
-NSString* const kToolbarShareButtonIdentifier =
-    @"kToolbarShareButtonIdentifier";
-NSString* const kToolbarOmniboxButtonIdentifier =
-    @"kToolbarOmniboxButtonIdentifier";
-
-const NSInteger kStackButtonMaxTabCount = 99;
-
-const NSInteger kFontSizeFewerThanTenTabs = 11;
-const NSInteger kFontSizeTenTabsOrMore = 9;
-
-const NSUInteger kTransitionLayerCapacity = 11;
-
-const CGFloat kToolbarShadowHeight = 2;
-const CGFloat kToolbarFullBleedShadowHeight = 10;
-
 // Macros for creating CGRects of height H, origin (0,0), with the portrait
 // width of phone/pad devices.
 // clang-format off
@@ -72,5 +48,3 @@
 // clang-format on
 
 const LayoutOffset kButtonFadeOutXOffset = 10;
-
-const CGFloat kPopoverAnchorHorizontalPadding = 10.0;
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_utils.h b/ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h
similarity index 66%
rename from ios/chrome/browser/ui/toolbar/public/toolbar_utils.h
rename to ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h
index 44e6f79..6f89d77c 100644
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_utils.h
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.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 IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UTILS_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UTILS_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UTILS_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UTILS_H_
 
 #import <UIKit/UIKit.h>
 
@@ -11,4 +11,4 @@
 // |status_bar_offset| which needs to be added.
 CGFloat ToolbarHeightWithTopOfScreenOffset(CGFloat status_bar_offset);
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UTILS_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UTILS_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_utils.mm b/ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.mm
similarity index 83%
rename from ios/chrome/browser/ui/toolbar/public/toolbar_utils.mm
rename to ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.mm
index 6f739e2a..e0f4333 100644
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_utils.mm
+++ b/ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_utils.h"
 
 #include "base/feature_list.h"
 #include "base/logging.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h
index fa7a9892..a15f1b8 100644
--- a/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h
+++ b/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h
@@ -9,13 +9,15 @@
 
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/public/primary_toolbar_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_coordinating.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h"
 
 @class CommandDispatcher;
+@protocol ToolbarCoordinatorDelegate;
 @protocol ToolsMenuConfigurationProvider;
+@protocol UrlLoader;
+class WebStateList;
 
 @interface LegacyToolbarCoordinator
     : ChromeCoordinator<PrimaryToolbarCoordinator,
@@ -29,6 +31,7 @@
                                 dispatcher:(CommandDispatcher*)dispatcher
                               browserState:
                                   (ios::ChromeBrowserState*)browserState
+                              webStateList:(WebStateList*)webStateList
     NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
     NS_UNAVAILABLE;
@@ -37,8 +40,13 @@
                                   (ios::ChromeBrowserState*)browserState
     NS_UNAVAILABLE;
 
-// Sets the toolbarController for this coordinator.
-- (void)setToolbarController:(id<Toolbar>)toolbarController;
+// Delegate for this coordinator. Only used for plumbing to Location Bar
+// coordinator.
+// TODO(crbug.com/799446): Change this.
+@property(nonatomic, weak) id<ToolbarCoordinatorDelegate> delegate;
+// URL loader for the toolbar.
+// TODO(crbug.com/799446): Remove this.
+@property(nonatomic, weak) id<UrlLoader> URLLoader;
 
 @end
 
diff --git a/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.mm
index d9225d84..dde1457 100644
--- a/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.mm
@@ -4,12 +4,12 @@
 
 #import "ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h"
 
-#import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/commands/toolbar_commands.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller_factory.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_updater.h"
 #import "ios/chrome/browser/ui/toolbar/clean/toolbar_button_updater.h"
+#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.h"
@@ -26,24 +26,33 @@
   std::unique_ptr<FullscreenUIUpdater> _fullscreenUpdater;
 }
 
-@property(nonatomic, strong) id<Toolbar> toolbarController;
+@property(nonatomic, strong) ToolbarCoordinator* toolbarCoordinator;
 @end
 
 @implementation LegacyToolbarCoordinator
-@synthesize toolbarController = _toolbarController;
+@synthesize toolbarCoordinator = _toolbarCoordinator;
 
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
             toolsMenuConfigurationProvider:
                 (id<ToolsMenuConfigurationProvider>)configurationProvider
                                 dispatcher:(CommandDispatcher*)dispatcher
                               browserState:
-                                  (ios::ChromeBrowserState*)browserState {
+                                  (ios::ChromeBrowserState*)browserState
+                              webStateList:(WebStateList*)webStateList {
   if (self = [super initWithBaseViewController:viewController
                                   browserState:browserState]) {
     DCHECK(browserState);
+    _toolbarCoordinator = [[ToolbarCoordinator alloc] init];
+    _toolbarCoordinator.webStateList = webStateList;
+    _toolbarCoordinator.dispatcher =
+        static_cast<id<ApplicationCommands, BrowserCommands, OmniboxFocuser>>(
+            dispatcher);
+    _toolbarCoordinator.browserState = browserState;
+
     _toolsMenuCoordinator = [[ToolsMenuCoordinator alloc] init];
     _toolsMenuCoordinator.dispatcher = dispatcher;
     _toolsMenuCoordinator.configurationProvider = configurationProvider;
+    _toolsMenuCoordinator.presentationProvider = _toolbarCoordinator;
     [_toolsMenuCoordinator start];
 
     [dispatcher startDispatchingToTarget:self
@@ -63,54 +72,61 @@
 }
 
 - (void)start {
-  [self startObservingFullscreen];
+  [self.toolbarCoordinator start];
 }
 
 - (void)stop {
-  [self.toolbarController setBackgroundAlpha:1.0];
-  [self.toolbarController stop];
-  [self stopObservingFullscreen];
-  self.toolbarController = nil;
+  [self.toolbarCoordinator setBackgroundToIncognitoNTPColorWithAlpha:0];
+  [self.toolbarCoordinator stop];
+  self.toolbarCoordinator = nil;
 }
 
 - (UIViewController*)viewController {
-  return self.toolbarController.viewController;
+  return self.toolbarCoordinator.viewController;
+}
+
+- (void)setURLLoader:(id<UrlLoader>)URLLoader {
+  self.toolbarCoordinator.URLLoader = URLLoader;
+}
+
+- (id<UrlLoader>)URLLoader {
+  return self.toolbarCoordinator.URLLoader;
+}
+
+- (void)setDelegate:(id<ToolbarCoordinatorDelegate>)delegate {
+  self.toolbarCoordinator.delegate = delegate;
+}
+
+- (id<ToolbarCoordinatorDelegate>)delegate {
+  return self.toolbarCoordinator.delegate;
 }
 
 #pragma mark - Delegates
 
 - (id<VoiceSearchControllerDelegate>)voiceSearchDelegate {
-  return self.toolbarController;
+  return self.toolbarCoordinator.voiceSearchControllerDelegate;
 }
 
 - (id<ActivityServicePositioner>)activityServicePositioner {
-  return self.toolbarController;
+  return self.toolbarCoordinator.activityServicePositioner;
 }
 
 - (id<TabHistoryUIUpdater>)tabHistoryUIUpdater {
-  return self.toolbarController.buttonUpdater;
+  return self.toolbarCoordinator.buttonUpdater;
 }
 
 - (id<QRScannerResultLoading>)QRScannerResultLoader {
-  return self.toolbarController;
+  return self.toolbarCoordinator.QRScannerResultLoader;
 }
 
 - (id<OmniboxFocuser>)omniboxFocuser {
-  return self.toolbarController;
+  return self.toolbarCoordinator.omniboxFocuser;
 }
 
-#pragma mark - WebToolbarController public interface
-
-- (void)setToolbarController:(id<Toolbar>)toolbarController {
-  _toolbarController = toolbarController;
-  // ToolbarController needs to know about whether the tools menu is presented
-  // or not, and does so by storing a reference to the coordinator to query.
-  _toolsMenuCoordinator.presentationProvider = _toolbarController;
-  [toolbarController start];
-}
+#pragma mark - ToolbarCommands
 
 - (void)triggerToolsMenuButtonAnimation {
-  [self.toolbarController triggerToolsMenuButtonAnimation];
+  [self.toolbarCoordinator triggerToolsMenuButtonAnimation];
 }
 
 #pragma mark - ToolbarCoordinating
@@ -122,33 +138,33 @@
 #pragma mark - PrimaryToolbarCoordinator
 
 - (void)showPrerenderingAnimation {
-  [self.toolbarController showPrerenderingAnimation];
+  [self.toolbarCoordinator showPrerenderingAnimation];
 }
 
 - (BOOL)isOmniboxFirstResponder {
-  return [self.toolbarController isOmniboxFirstResponder];
+  return [self.toolbarCoordinator isOmniboxFirstResponder];
 }
 
 - (BOOL)showingOmniboxPopup {
-  return [self.toolbarController showingOmniboxPopup];
+  return [self.toolbarCoordinator showingOmniboxPopup];
 }
 
 - (void)transitionToLocationBarFocusedState:(BOOL)focused {
-  [self.toolbarController transitionToLocationBarFocusedState:focused];
+  [self.toolbarCoordinator transitionToLocationBarFocusedState:focused];
 }
 
 #pragma mark - FakeboxFocuser
 
 - (void)focusFakebox {
-  [self.toolbarController focusFakebox];
+  [self.toolbarCoordinator focusFakebox];
 }
 
 - (void)onFakeboxBlur {
-  [self.toolbarController onFakeboxBlur];
+  [self.toolbarCoordinator onFakeboxBlur];
 }
 
 - (void)onFakeboxAnimationComplete {
-  [self.toolbarController onFakeboxAnimationComplete];
+  [self.toolbarCoordinator onFakeboxAnimationComplete];
 }
 
 #pragma mark - SideSwipeToolbarInteracting
@@ -161,13 +177,13 @@
   return ![self isOmniboxFirstResponder] && ![self showingOmniboxPopup];
 }
 
-- (UIImage*)toolbarSideSwipeSnapshotForTab:(Tab*)tab {
-  [self.toolbarController updateToolbarForSideSwipeSnapshot:tab];
+- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState {
+  [self.toolbarCoordinator updateToolbarForSideSwipeSnapshot:webState];
   UIImage* toolbarSnapshot = CaptureViewWithOption(
       [self.viewController view], [[UIScreen mainScreen] scale],
       kClientSideRendering);
 
-  [self.toolbarController resetToolbarAfterSideSwipeSnapshot];
+  [self.toolbarCoordinator resetToolbarAfterSideSwipeSnapshot];
   return toolbarSnapshot;
 }
 
@@ -195,32 +211,25 @@
   newFrame.size.width = width;
 
   self.viewController.view.superview.frame = newFrame;
-  [self.toolbarController activateFakeSafeAreaInsets:safeAreaInsets];
+  [self.toolbarCoordinator activateFakeSafeAreaInsets:safeAreaInsets];
   [self.viewController.view.superview layoutIfNeeded];
 
   UIView* toolbarSnapshotView = [self snapshotForTabSwitcher];
 
   self.viewController.view.superview.frame = oldFrame;
-  [self.toolbarController deactivateFakeSafeAreaInsets];
+  [self.toolbarCoordinator deactivateFakeSafeAreaInsets];
 
   return toolbarSnapshotView;
 }
 
 - (UIColor*)toolbarBackgroundColor {
-  UIColor* toolbarBackgroundColor = nil;
-  if (self.toolbarController.backgroundView.hidden ||
-      self.toolbarController.backgroundView.alpha == 0) {
-    // If the background view isn't visible, use the base toolbar view's
-    // background color.
-    toolbarBackgroundColor = self.viewController.view.backgroundColor;
-  }
-  return toolbarBackgroundColor;
+  return [self.toolbarCoordinator toolbarBackgroundColor];
 }
 
 #pragma mark - IncognitoViewControllerDelegate
 
 - (void)setToolbarBackgroundAlpha:(CGFloat)alpha {
-  [self.toolbarController setBackgroundAlpha:alpha];
+  [self.toolbarCoordinator setBackgroundToIncognitoNTPColorWithAlpha:1 - alpha];
 }
 
 #pragma mark - ToolsMenuPresentationStateProvider
@@ -232,43 +241,11 @@
 #pragma mark - Tools Menu
 
 - (void)toolsMenuWillShowNotification:(NSNotification*)note {
-  [self.toolbarController setToolsMenuIsVisibleForToolsMenuButton:YES];
+  [self.toolbarCoordinator setToolsMenuIsVisibleForToolsMenuButton:YES];
 }
 
 - (void)toolsMenuWillHideNotification:(NSNotification*)note {
-  [self.toolbarController setToolsMenuIsVisibleForToolsMenuButton:NO];
-}
-
-#pragma mark - Fullscreen helpers
-
-// Creates a FullscreenUIUpdater for the toolbar controller and adds it as a
-// FullscreenControllerObserver.
-- (void)startObservingFullscreen {
-  if (_fullscreenUpdater)
-    return;
-  if (!self.browserState)
-    return;
-  FullscreenController* fullscreenController =
-      FullscreenControllerFactory::GetInstance()->GetForBrowserState(
-          self.browserState);
-  DCHECK(fullscreenController);
-  _fullscreenUpdater =
-      std::make_unique<FullscreenUIUpdater>(self.toolbarController);
-  fullscreenController->AddObserver(_fullscreenUpdater.get());
-}
-
-// Removes the FullscreenUIUpdater as a FullscreenControllerObserver.
-- (void)stopObservingFullscreen {
-  if (!_fullscreenUpdater)
-    return;
-  if (!self.browserState)
-    return;
-  FullscreenController* fullscreenController =
-      FullscreenControllerFactory::GetInstance()->GetForBrowserState(
-          self.browserState);
-  DCHECK(fullscreenController);
-  fullscreenController->RemoveObserver(_fullscreenUpdater.get());
-  _fullscreenUpdater = nullptr;
+  [self.toolbarCoordinator setToolsMenuIsVisibleForToolsMenuButton:NO];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/toolbar/public/BUILD.gn b/ios/chrome/browser/ui/toolbar/public/BUILD.gn
index 124c36d..472ea9e 100644
--- a/ios/chrome/browser/ui/toolbar/public/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/public/BUILD.gn
@@ -5,21 +5,12 @@
 source_set("public") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "abstract_toolbar.h",
-    "abstract_web_toolbar.h",
     "fakebox_focuser.h",
     "omnibox_focuser.h",
     "primary_toolbar_coordinator.h",
     "side_swipe_toolbar_interacting.h",
     "side_swipe_toolbar_snapshot_providing.h",
-    "toolbar.h",
-    "toolbar_controller_constants.h",
-    "toolbar_controller_constants.mm",
     "toolbar_coordinating.h",
-    "toolbar_utils.h",
-    "toolbar_utils.mm",
-    "web_toolbar_controller_constants.h",
-    "web_toolbar_controller_constants.mm",
   ]
   deps = [
     ":toolbar_base_feature",
diff --git a/ios/chrome/browser/ui/toolbar/public/abstract_web_toolbar.h b/ios/chrome/browser/ui/toolbar/public/abstract_web_toolbar.h
deleted file mode 100644
index da4cb96..0000000
--- a/ios/chrome/browser/ui/toolbar/public/abstract_web_toolbar.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_WEB_TOOLBAR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_WEB_TOOLBAR_H_
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/ui/toolbar/public/abstract_toolbar.h"
-
-@class Tab;
-@class ToolbarButtonUpdater;
-
-// WebToolbarController public interface.
-@protocol AbstractWebToolbar<AbstractToolbar>
-// Briefly animate the progress bar when a pre-rendered tab is displayed.
-- (void)showPrerenderingAnimation;
-// Returns whether omnibox is a first responder.
-- (BOOL)isOmniboxFirstResponder;
-// Returns whether the omnibox popup is currently displayed.
-- (BOOL)showingOmniboxPopup;
-// Update the visibility of the toolbar before making a side swipe snapshot so
-// the toolbar looks appropriate for |tab|. This includes morphing the toolbar
-// to look like the new tab page header.
-- (void)updateToolbarForSideSwipeSnapshot:(Tab*)tab;
-// Remove any formatting added by -updateToolbarForSideSwipeSnapshot.
-- (void)resetToolbarAfterSideSwipeSnapshot;
-// Convenience getter for the UIViewController.
-@property(nonatomic, readonly, weak) UIViewController* viewController;
-// Object handling the updates of the buttons.
-@property(nonatomic, strong, readonly) ToolbarButtonUpdater* buttonUpdater;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_ABSTRACT_WEB_TOOLBAR_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h b/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h
index 45129ae..c465fd1 100644
--- a/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h
+++ b/ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h
@@ -7,15 +7,16 @@
 
 #import <UIKit/UIKit.h>
 
-@class Tab;
+namespace web {
+class WebState;
+}  // namespace web
 
 // Protocol used by SideSwipe to get snapshot of the toolbar.
 @protocol SideSwipeToolbarSnapshotProviding
 
 // Returns a snapshot of the toolbar with the controls visibility adapted to
-// |tab|.
-// TODO(crbug.com/800266): Use WebState instead of Tab.
-- (UIImage*)toolbarSideSwipeSnapshotForTab:(Tab*)tab;
+// |webState|.
+- (UIImage*)toolbarSideSwipeSnapshotForWebState:(web::WebState*)webState;
 
 @end
 
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar.h b/ios/chrome/browser/ui/toolbar/public/toolbar.h
deleted file mode 100644
index 7c99165..0000000
--- a/ios/chrome/browser/ui/toolbar/public/toolbar.h
+++ /dev/null
@@ -1,35 +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 IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_H_
-
-#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
-#import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_element.h"
-#import "ios/chrome/browser/ui/qr_scanner/requirements/qr_scanner_result_loading.h"
-#import "ios/chrome/browser/ui/toolbar/public/abstract_web_toolbar.h"
-#import "ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h"
-#import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h"
-#import "ios/public/provider/chrome/browser/voice/voice_search_controller_delegate.h"
-
-@protocol Toolbar<AbstractWebToolbar,
-                  OmniboxFocuser,
-                  FakeboxFocuser,
-                  VoiceSearchControllerDelegate,
-                  ActivityServicePositioner,
-                  QRScannerResultLoading,
-                  ToolsMenuPresentationProvider,
-                  FullscreenUIElement>
-
-- (void)setToolsMenuIsVisibleForToolsMenuButton:(BOOL)isVisible;
-- (void)start;
-- (void)stop;
-// Coordinates the location bar focusing/defocusing. For example, initiates
-// transition to the expanded location bar state of the view controller.
-- (void)transitionToLocationBarFocusedState:(BOOL)focused;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PUBLIC_TOOLBAR_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
deleted file mode 100644
index e09cdf7..0000000
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_CONSTANTS_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_CONSTANTS_H_
-
-#import <Foundation/Foundation.h>
-
-#import <CoreGraphics/CoreGraphics.h>
-#include "ios/chrome/browser/ui/rtl_geometry.h"
-#include "ios/chrome/browser/ui/ui_util.h"
-
-// Height of the toolbar.
-extern const CGFloat kToolbarHeight;
-// Height of the toolbar when in fullscreen.
-extern const CGFloat kToolbarHeightFullscreen;
-
-// The time delay before non-initial button images are loaded.
-extern const int64_t kNonInitialImageAdditionDelayNanosec;
-
-// Accessibility identifier of the toolbar view.
-extern NSString* const kToolbarIdentifier;
-// Accessibility identifier of the incognito toolbar view.
-extern NSString* const kIncognitoToolbarIdentifier;
-// Accessibility identifier of the tools menu button.
-extern NSString* const kToolbarToolsMenuButtonIdentifier;
-// Accessibility identifier of the stack button.
-extern NSString* const kToolbarStackButtonIdentifier;
-// Accessibility identifier of the share button.
-extern NSString* const kToolbarShareButtonIdentifier;
-// Accessibility identifier of the omnibox button.
-extern NSString* const kToolbarOmniboxButtonIdentifier;
-
-// The maximum number to display in the tab switcher button.
-extern NSInteger const kStackButtonMaxTabCount;
-
-// Font sizes for the button containing the tab count
-extern const NSInteger kFontSizeFewerThanTenTabs;
-extern const NSInteger kFontSizeTenTabsOrMore;
-
-// The initial capacity used to construct |self.transitionLayers|.  The value
-// is chosen because WebToolbarController animates 11 separate layers during
-// transitions; this value should be updated if new subviews are animated in
-// the future.
-extern const NSUInteger kTransitionLayerCapacity;
-
-// Toolbar frames shared with subclasses.
-extern const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT];
-// UI frames.  iPhone values followed by iPad values.
-// Full-width frames that don't change for RTL languages.
-extern const CGRect kBackgroundViewFrame[INTERFACE_IDIOM_COUNT];
-extern const CGRect kShadowViewFrame[INTERFACE_IDIOM_COUNT];
-// Full bleed shadow frame is iPhone-only
-extern const CGRect kFullBleedShadowViewFrame;
-
-// Color constants for the stack button text, normal and pressed states.  These
-// arrays are indexed by ToolbarControllerStyle enum values.
-extern const CGFloat kStackButtonNormalColors[];
-extern const int kStackButtonHighlightedColors[];
-
-// Frames that change for RTL.
-extern const LayoutRect kStackButtonFrame;
-extern const LayoutRect kShareMenuButtonFrame;
-extern const LayoutRect kToolsMenuButtonFrame[INTERFACE_IDIOM_COUNT];
-
-// Distance to shift buttons when fading out.
-extern const LayoutOffset kButtonFadeOutXOffset;
-
-// The amount of horizontal padding removed from a view's frame when presenting
-// a popover anchored to it.
-extern const CGFloat kPopoverAnchorHorizontalPadding;
-
-// Height of the shadow displayed below the toolbar when the omnibox is
-// contracted.
-extern const CGFloat kToolbarShadowHeight;
-// Height of the shadow displayed below the toolbar when the omnibox is
-// expanded.
-extern const CGFloat kToolbarFullBleedShadowHeight;
-
-// Toolbar style.  Determines which button images are used.
-enum ToolbarControllerStyle {
-  ToolbarControllerStyleLightMode = 0,
-  ToolbarControllerStyleDarkMode,
-  ToolbarControllerStyleIncognitoMode,
-  ToolbarControllerStyleMaxStyles
-};
-enum ToolbarButtonMode {
-  ToolbarButtonModeNormal,
-  ToolbarButtonModeReversed,
-};
-enum ToolbarButtonUIState {
-  ToolbarButtonUIStateNormal = 0,
-  ToolbarButtonUIStatePressed,
-  ToolbarButtonUIStateDisabled,
-  NumberOfToolbarButtonUIStates,
-};
-
-// This enumerates the different buttons used by the toolbar and is used to map
-// the resource IDs for the button's icons.  Subclasses with additional buttons
-// should extend these values.  The first new enum should be set to
-// |NumberOfToolbarButtonNames|.  Note that functions that use these values use
-// an int rather than the |ToolbarButtonName| to accommodate additional values.
-// Also, if this enum is extended by a subclass, the subclass must also override
-// -imageIdForImageEnum:style:forState: to provide mapping from enum to resource
-// ID for the various states.
-enum ToolbarButtonName {
-  ToolbarButtonNameStack = 0,
-  ToolbarButtonNameShare,
-  NumberOfToolbarButtonNames,
-};
-
-// Style used to specify the direction of the toolbar transition animations.
-typedef enum {
-  TOOLBAR_TRANSITION_STYLE_TO_STACK_VIEW,
-  TOOLBAR_TRANSITION_STYLE_TO_BVC
-} ToolbarTransitionStyle;
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h b/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h
deleted file mode 100644
index 3fbca1c..0000000
--- a/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_WEB_TOOLBAR_CONTROLLER_CONSTANTS_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_WEB_TOOLBAR_CONTROLLER_CONSTANTS_H_
-
-#import <Foundation/Foundation.h>
-
-#import <UIKit/UIKit.h>
-#include "ios/chrome/browser/ui/rtl_geometry.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
-#include "ios/chrome/browser/ui/ui_util.h"
-
-// The brightness of the omnibox placeholder text in regular mode,
-// on an iPhone.
-extern const CGFloat kiPhoneOmniboxPlaceholderColorBrightness;
-
-// The histogram recording CLAuthorizationStatus for omnibox queries.
-extern const char* const kOmniboxQueryLocationAuthorizationStatusHistogram;
-// The number of possible CLAuthorizationStatus values to report.
-const int kLocationAuthorizationStatusCount = 4;
-
-// The brightness of the toolbar's background color (visible on NTPs when the
-// background view is hidden).
-extern const CGFloat kNTPBackgroundColorBrightness;
-extern const CGFloat kNTPBackgroundColorBrightnessIncognito;
-
-// How far below the omnibox to position the popup.
-extern const CGFloat kiPadOmniboxPopupVerticalOffset;
-
-// Padding to place on the sides of the omnibox when expanded.
-extern const CGFloat kExpandedOmniboxPadding;
-
-// Padding between the back button and the omnibox when the forward button isn't
-// displayed.
-extern const CGFloat kBackButtonTrailingPadding;
-extern const CGFloat kForwardButtonTrailingPadding;
-extern const CGFloat kReloadButtonTrailingPadding;
-
-// Cancel button sizing.
-extern const CGFloat kCancelButtonBottomMargin;
-extern const CGFloat kCancelButtonTopMargin;
-extern const CGFloat kCancelButtonLeadingMargin;
-extern const CGFloat kCancelButtonWidth;
-
-// Additional offset to adjust the y coordinate of the determinate progress bar
-// up by.
-extern const CGFloat kDeterminateProgressBarYOffset;
-extern const CGFloat kMaterialProgressBarHeight;
-extern const CGFloat kLoadCompleteHideProgressBarDelay;
-// The default position animation is 10 pixels toward the trailing side, so
-// that's a negative leading offset.
-extern const LayoutOffset kPositionAnimationLeadingOffset;
-
-extern const CGFloat kIPadToolbarY;
-extern const CGFloat kScrollFadeDistance;
-
-extern const CGFloat kWebToolbarWidths[INTERFACE_IDIOM_COUNT];
-// UI layouts.  iPhone values followed by iPad values.
-// Frame for the WebToolbar-specific container, which is a subview of the
-// toolbar view itself.
-extern const LayoutRect kWebToolbarFrame[INTERFACE_IDIOM_COUNT];
-
-// Layouts inside the WebToolbar frame
-extern const LayoutRect kOmniboxFrame[INTERFACE_IDIOM_COUNT];
-extern const LayoutRect kBackButtonFrame[INTERFACE_IDIOM_COUNT];
-extern const LayoutRect kForwardButtonFrame[INTERFACE_IDIOM_COUNT];
-
-// iPad-only layouts
-// Layout for both the stop and reload buttons, which are in the same location.
-extern const LayoutRect kStopReloadButtonFrame;
-extern const LayoutRect kStarButtonFrame;
-extern const LayoutRect kVoiceSearchButtonFrame;
-
-// Vertical distance between the y-coordinate of the omnibox's center and the
-// y-coordinate of the web toolbar's center.
-extern const CGFloat kOmniboxCenterOffsetY;
-
-// Last button in accessory view for keyboard, commonly used TLD.
-extern NSString* const kDotComTLD;
-
-enum {
-  WebToolbarButtonNameBack = NumberOfToolbarButtonNames,
-  WebToolbarButtonNameCallingApp,
-  WebToolbarButtonNameForward,
-  WebToolbarButtonNameReload,
-  WebToolbarButtonNameStar,
-  WebToolbarButtonNameStop,
-  WebToolbarButtonNameTTS,
-  WebToolbarButtonNameVoice,
-  NumberOfWebToolbarButtonNames,
-};
-
-// Helper functions.
-void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void));
-CGRect RectShiftedDownForStatusBar(CGRect rect);
-CGRect RectShiftedUpForStatusBar(CGRect rect);
-CGRect RectShiftedUpAndResizedForStatusBar(CGRect rect);
-CGRect RectShiftedDownAndResizedForStatusBar(CGRect rect);
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_WEB_TOOLBAR_CONTROLLER_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.mm b/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.mm
deleted file mode 100644
index 86f510da..0000000
--- a/ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.mm
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/toolbar/public/web_toolbar_controller_constants.h"
-
-#include "base/logging.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-const CGFloat kiPhoneOmniboxPlaceholderColorBrightness = 150 / 255.0;
-
-const char* const kOmniboxQueryLocationAuthorizationStatusHistogram =
-    "Omnibox.QueryIosLocationAuthorizationStatus";
-
-const CGFloat kNTPBackgroundColorBrightness = 1.0;
-const CGFloat kNTPBackgroundColorBrightnessIncognito = 34.0 / 255.0;
-
-const CGFloat kiPadOmniboxPopupVerticalOffset = 3;
-
-const CGFloat kExpandedOmniboxPadding = 6;
-
-const CGFloat kBackButtonTrailingPadding = 7.0;
-const CGFloat kForwardButtonTrailingPadding = -1.0;
-const CGFloat kReloadButtonTrailingPadding = 4.0;
-
-const CGFloat kCancelButtonBottomMargin = 4.0;
-const CGFloat kCancelButtonTopMargin = 4.0;
-const CGFloat kCancelButtonLeadingMargin = 7.0;
-const CGFloat kCancelButtonWidth = 40.0;
-
-const CGFloat kDeterminateProgressBarYOffset = 1.0;
-const CGFloat kMaterialProgressBarHeight = 2.0;
-const CGFloat kLoadCompleteHideProgressBarDelay = 0.5;
-const LayoutOffset kPositionAnimationLeadingOffset = -10.0;
-
-const CGFloat kIPadToolbarY = 53;
-const CGFloat kScrollFadeDistance = 30;
-
-const CGFloat kWebToolbarWidths[INTERFACE_IDIOM_COUNT] = {224, 720};
-// clang-format off
-const LayoutRect kWebToolbarFrame[INTERFACE_IDIOM_COUNT] = {
-  {kPortraitWidth[IPHONE_IDIOM], LayoutRectPositionZero,
-    {kWebToolbarWidths[IPHONE_IDIOM], 56}},
-  {kPortraitWidth[IPAD_IDIOM],   LayoutRectPositionZero,
-    {kWebToolbarWidths[IPAD_IDIOM],   56}},
-};
-
-#define IPHONE_LAYOUT(L, Y, H, W) \
-{ kWebToolbarWidths[IPHONE_IDIOM], {L, Y}, {H, W} }
-#define IPAD_LAYOUT(L, Y, H, W) \
-{ kWebToolbarWidths[IPAD_IDIOM], {L, Y}, {H, W} }
-
-// Layouts inside the WebToolbar frame
-const LayoutRect kOmniboxFrame[INTERFACE_IDIOM_COUNT] = {
-  IPHONE_LAYOUT(55, 7, 169, 43), IPAD_LAYOUT(152, 7, 568, 43),
-};
-const LayoutRect kBackButtonFrame[INTERFACE_IDIOM_COUNT] = {
-  IPHONE_LAYOUT(0, 4, 48, 48), IPAD_LAYOUT(4, 4, 48, 48),
-};
-const LayoutRect kForwardButtonFrame[INTERFACE_IDIOM_COUNT] = {
-  IPHONE_LAYOUT(48, 4, 48, 48), IPAD_LAYOUT(52, 4, 48, 48),
-};
-// clang-format on
-
-const LayoutRect kStopReloadButtonFrame = IPAD_LAYOUT(100, 4, 48, 48);
-const LayoutRect kStarButtonFrame = IPAD_LAYOUT(644, 4, 36, 48);
-const LayoutRect kVoiceSearchButtonFrame = IPAD_LAYOUT(680, 4, 36, 48);
-
-const CGFloat kOmniboxCenterOffsetY = 0.5;
-
-NSString* const kDotComTLD = @".com";
-
-void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)) {
-  DCHECK([NSThread isMainThread]);
-  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * delay),
-                 dispatch_get_main_queue(), block);
-}
-
-CGRect RectShiftedDownForStatusBar(CGRect rect) {
-  if (IsIPadIdiom())
-    return rect;
-  rect.origin.y += StatusBarHeight();
-  return rect;
-}
-
-CGRect RectShiftedUpForStatusBar(CGRect rect) {
-  if (IsIPadIdiom())
-    return rect;
-  rect.origin.y -= StatusBarHeight();
-  return rect;
-}
-
-CGRect RectShiftedUpAndResizedForStatusBar(CGRect rect) {
-  if (IsIPadIdiom())
-    return rect;
-  rect.size.height += StatusBarHeight();
-  return RectShiftedUpForStatusBar(rect);
-}
-
-CGRect RectShiftedDownAndResizedForStatusBar(CGRect rect) {
-  if (IsIPadIdiom())
-    return rect;
-  rect.size.height -= StatusBarHeight();
-  return RectShiftedDownForStatusBar(rect);
-}
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_adapter.h b/ios/chrome/browser/ui/toolbar/toolbar_adapter.h
deleted file mode 100644
index 6afd944f..0000000
--- a/ios/chrome/browser/ui/toolbar/toolbar_adapter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_ADAPTER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_ADAPTER_H_
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
-#import "ios/chrome/browser/ui/history_popup/requirements/tab_history_ui_updater.h"
-#include "ios/chrome/browser/ui/qr_scanner/requirements/qr_scanner_result_loading.h"
-#import "ios/chrome/browser/ui/toolbar/legacy_toolbar_coordinator.h"
-#include "ios/public/provider/chrome/browser/voice/voice_search_controller_delegate.h"
-
-namespace ios {
-class ChromeBrowserState;
-}
-
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
-@protocol OmniboxFocuser;
-@protocol ToolbarCoordinatorDelegate;
-@protocol UrlLoader;
-class WebStateList;
-
-// Temporary Adapter so ToolbarCoordinator can work as a <Toolbar>
-// for LegacyToolbarCoordinator.
-@interface ToolbarAdapter : NSObject<Toolbar>
-
-- (instancetype)
-initWithDispatcher:
-    (id<ApplicationCommands, BrowserCommands, OmniboxFocuser>)dispatcher
-      browserState:(ios::ChromeBrowserState*)browserState
-      webStateList:(WebStateList*)webStateList NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@property(nonatomic, weak) id<UrlLoader> URLLoader;
-@property(nonatomic, weak) id<ToolbarCoordinatorDelegate> delegate;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_ADAPTER_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_adapter.mm b/ios/chrome/browser/ui/toolbar/toolbar_adapter.mm
deleted file mode 100644
index 3c575ba..0000000
--- a/ios/chrome/browser/ui/toolbar/toolbar_adapter.mm
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/toolbar/toolbar_adapter.h"
-
-#import "ios/chrome/browser/tabs/tab.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.h"
-
-@interface ToolbarAdapter ()
-@property(nonatomic, strong) ToolbarCoordinator* toolbarCoordinator;
-@end
-
-@implementation ToolbarAdapter
-@synthesize backgroundView = _backgroundView;
-@synthesize toolbarCoordinator = _toolbarCoordinator;
-@synthesize delegate = _delegate;
-@synthesize URLLoader = _URLLoader;
-
-- (instancetype)initWithDispatcher:
-                    (id<ApplicationCommands, BrowserCommands, OmniboxFocuser>)
-                        dispatcher
-                      browserState:(ios::ChromeBrowserState*)browserState
-                      webStateList:(WebStateList*)webStateList {
-  self = [super init];
-  if (self) {
-    _toolbarCoordinator = [[ToolbarCoordinator alloc] init];
-    _toolbarCoordinator.webStateList = webStateList;
-    _toolbarCoordinator.dispatcher = dispatcher;
-    _toolbarCoordinator.browserState = browserState;
-  }
-  return self;
-}
-
-#pragma mark - Properties
-
-- (void)setDelegate:(id<ToolbarCoordinatorDelegate>)delegate {
-  _delegate = delegate;
-  self.toolbarCoordinator.delegate = delegate;
-}
-
-- (void)setURLLoader:(id<UrlLoader>)URLLoader {
-  _URLLoader = URLLoader;
-  self.toolbarCoordinator.URLLoader = URLLoader;
-}
-
-- (ToolbarButtonUpdater*)buttonUpdater {
-  return self.toolbarCoordinator.buttonUpdater;
-}
-
-- (UIViewController*)viewController {
-  return self.toolbarCoordinator.viewController;
-}
-
-#pragma mark - Abstract WebToolbar
-
-- (void)showPrerenderingAnimation {
-  [self.toolbarCoordinator showPrerenderingAnimation];
-}
-
-- (BOOL)isOmniboxFirstResponder {
-  return [self.toolbarCoordinator isOmniboxFirstResponder];
-}
-
-- (BOOL)showingOmniboxPopup {
-  return [self.toolbarCoordinator showingOmniboxPopup];
-}
-
-- (void)updateToolbarForSideSwipeSnapshot:(Tab*)tab {
-  [self.toolbarCoordinator updateToolbarForSideSwipeSnapshot:tab.webState];
-}
-
-- (void)resetToolbarAfterSideSwipeSnapshot {
-  [self.toolbarCoordinator resetToolbarAfterSideSwipeSnapshot];
-}
-
-#pragma mark - Abstract Toolbar
-
-- (void)triggerToolsMenuButtonAnimation {
-  [self.toolbarCoordinator triggerToolsMenuButtonAnimation];
-}
-
-- (void)setBackgroundAlpha:(CGFloat)alpha {
-  [self.toolbarCoordinator setBackgroundToIncognitoNTPColorWithAlpha:1 - alpha];
-}
-
-- (void)setTabCount:(NSInteger)tabCount {
-  // No op.
-}
-
-- (void)activateFakeSafeAreaInsets:(UIEdgeInsets)fakeSafeAreaInsets {
-  [self.toolbarCoordinator activateFakeSafeAreaInsets:fakeSafeAreaInsets];
-}
-
-- (void)deactivateFakeSafeAreaInsets {
-  [self.toolbarCoordinator deactivateFakeSafeAreaInsets];
-}
-
-- (void)setToolsMenuIsVisibleForToolsMenuButton:(BOOL)isVisible {
-  [self.toolbarCoordinator setToolsMenuIsVisibleForToolsMenuButton:isVisible];
-}
-
-- (void)start {
-  [self.toolbarCoordinator start];
-}
-
-- (void)stop {
-  [self.toolbarCoordinator stop];
-}
-
-- (void)transitionToLocationBarFocusedState:(BOOL)focused {
-  [self.toolbarCoordinator transitionToLocationBarFocusedState:focused];
-}
-
-#pragma mark - OmniboxFocuser
-
-- (void)focusOmnibox {
-  [self.toolbarCoordinator.omniboxFocuser focusOmnibox];
-}
-
-- (void)cancelOmniboxEdit {
-  [self.toolbarCoordinator.omniboxFocuser cancelOmniboxEdit];
-}
-
-#pragma mark - FakeboxFocuser
-
-- (void)focusFakebox {
-  [self.toolbarCoordinator focusFakebox];
-}
-
-- (void)onFakeboxBlur {
-  [self.toolbarCoordinator onFakeboxBlur];
-}
-
-- (void)onFakeboxAnimationComplete {
-  [self.toolbarCoordinator onFakeboxAnimationComplete];
-}
-
-#pragma mark - VoiceSearchControllerDelegate
-
-- (void)receiveVoiceSearchResult:(NSString*)voiceResult {
-  [self.toolbarCoordinator.voiceSearchControllerDelegate
-      receiveVoiceSearchResult:voiceResult];
-}
-
-#pragma mark - ActivityServicePositioner
-
-- (UIView*)shareButtonView {
-  return [[self.toolbarCoordinator activityServicePositioner] shareButtonView];
-}
-
-#pragma mark - QRScannerResultLoading
-
-- (void)receiveQRScannerResult:(NSString*)qrScannerResult
-               loadImmediately:(BOOL)load {
-  [self.toolbarCoordinator.QRScannerResultLoader
-      receiveQRScannerResult:qrScannerResult
-             loadImmediately:load];
-}
-
-#pragma mark - FullscreenUIElement
-
-// FullscreenUIElements in this adapter are no-ops.  ToolbarCoordinator updates
-// its view controller's UI for fullscreen events.
-
-- (void)updateForFullscreenProgress:(CGFloat)progress {
-}
-
-- (void)updateForFullscreenEnabled:(BOOL)enabled {
-}
-
-- (void)finishFullscreenScrollWithAnimator:
-    (FullscreenScrollEndAnimator*)animator {
-}
-
-- (void)scrollFullscreenToTopWithAnimator:
-    (FullscreenScrollToTopAnimator*)animator {
-}
-
-- (void)showToolbarForForgroundWithAnimator:
-    (FullscreenForegroundAnimator*)animator {
-}
-
-#pragma mark - ToolsMenuPresentationProvider
-
-- (UIButton*)presentingButtonForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator {
-  return [self.toolbarCoordinator
-      presentingButtonForToolsMenuCoordinator:coordinator];
-}
-
-@end
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index db35c0a1..969b4409 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -224,6 +224,8 @@
     "//ios/chrome/browser/ui/settings:settings",
     "//ios/chrome/browser/ui/settings/cells",
     "//ios/chrome/browser/ui/static_content",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/legacy",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/browser/ui/tools_menu/public",
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index a90b22e..523a561 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -26,7 +26,8 @@
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
+#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/legacy/toolbar_controller_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
diff --git a/ios/showcase/core/resources/BUILD.gn b/ios/showcase/core/resources/BUILD.gn
index ea6d08c..d34961c 100644
--- a/ios/showcase/core/resources/BUILD.gn
+++ b/ios/showcase/core/resources/BUILD.gn
@@ -28,6 +28,7 @@
     "Icon-76.png",
     "Icon-80.png",
     "Icon-87.png",
+    "Sample-screenshot-portrait.png",
   ]
   outputs = [
     "{{bundle_resources_dir}}/{{source_file_part}}",
diff --git a/ios/showcase/core/resources/Sample-screenshot-portrait.png b/ios/showcase/core/resources/Sample-screenshot-portrait.png
new file mode 100644
index 0000000..282a5b88
--- /dev/null
+++ b/ios/showcase/core/resources/Sample-screenshot-portrait.png
Binary files differ
diff --git a/ios/showcase/core/showcase_model.mm b/ios/showcase/core/showcase_model.mm
index 497a7c88..b771fa3 100644
--- a/ios/showcase/core/showcase_model.mm
+++ b/ios/showcase/core/showcase_model.mm
@@ -82,10 +82,21 @@
       showcase::kUseCaseKey : @"Full tab grid UI",
     },
     @{
+      showcase::
+      kClassForDisplayKey : @"TabGridTopToolbar, TabGridBottomToolbar",
+      showcase::kClassForInstantiationKey : @"SCToolbarsViewController",
+      showcase::kUseCaseKey : @"Toolbars for tab grid",
+    },
+    @{
       showcase::kClassForDisplayKey : @"TableContainerViewController",
       showcase::kClassForInstantiationKey : @"SCTableContainerCoordinator",
       showcase::kUseCaseKey : @"Table View",
     },
+    @{
+      showcase::kClassForDisplayKey : @"TopAlignedImageView",
+      showcase::kClassForInstantiationKey : @"SCImageViewController",
+      showcase::kUseCaseKey : @"ImageView with top aligned aspect fill",
+    },
   ];
 }
 
diff --git a/ios/showcase/tab_grid/BUILD.gn b/ios/showcase/tab_grid/BUILD.gn
index 3db7829..8cbb1a6 100644
--- a/ios/showcase/tab_grid/BUILD.gn
+++ b/ios/showcase/tab_grid/BUILD.gn
@@ -8,8 +8,12 @@
     "sc_grid_cell_view_controller.mm",
     "sc_grid_coordinator.h",
     "sc_grid_coordinator.mm",
+    "sc_image_view_controller.h",
+    "sc_image_view_controller.mm",
     "sc_tab_grid_coordinator.h",
     "sc_tab_grid_coordinator.mm",
+    "sc_toolbars_view_controller.h",
+    "sc_toolbars_view_controller.mm",
   ]
   deps = [
     "//base",
diff --git a/ios/showcase/tab_grid/sc_image_view_controller.h b/ios/showcase/tab_grid/sc_image_view_controller.h
new file mode 100644
index 0000000..95a5f7af
--- /dev/null
+++ b/ios/showcase/tab_grid/sc_image_view_controller.h
@@ -0,0 +1,13 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_SHOWCASE_TAB_GRID_SC_IMAGE_VIEW_CONTROLLER_H_
+#define IOS_SHOWCASE_TAB_GRID_SC_IMAGE_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@interface SCImageViewController : UIViewController
+@end
+
+#endif  // IOS_SHOWCASE_TAB_GRID_SC_IMAGE_VIEW_CONTROLLER_H_
diff --git a/ios/showcase/tab_grid/sc_image_view_controller.mm b/ios/showcase/tab_grid/sc_image_view_controller.mm
new file mode 100644
index 0000000..1fbf6de
--- /dev/null
+++ b/ios/showcase/tab_grid/sc_image_view_controller.mm
@@ -0,0 +1,67 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/showcase/tab_grid/sc_image_view_controller.h"
+
+#import "ios/chrome/browser/ui/tab_grid/top_aligned_image_view.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation SCImageViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.backgroundColor = [UIColor blackColor];
+  UIImageView* standardImageView = [[UIImageView alloc] init];
+  standardImageView.translatesAutoresizingMaskIntoConstraints = NO;
+  standardImageView.contentMode = UIViewContentModeScaleAspectFill;
+  standardImageView.clipsToBounds = YES;
+  standardImageView.image = [UIImage imageNamed:@"Sample-screenshot-portrait"];
+  [self.view addSubview:standardImageView];
+
+  TopAlignedImageView* topAlignedImageView = [[TopAlignedImageView alloc] init];
+  topAlignedImageView.translatesAutoresizingMaskIntoConstraints = NO;
+  topAlignedImageView.image =
+      [UIImage imageNamed:@"Sample-screenshot-portrait"];
+  topAlignedImageView.clipsToBounds = YES;
+  [self.view addSubview:topAlignedImageView];
+
+  UILabel* topLabel = [[UILabel alloc] init];
+  topLabel.textColor = [UIColor whiteColor];
+  topLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  [topLabel setText:@"Standard ImageView with aspect fill"];
+  [self.view addSubview:topLabel];
+
+  UILabel* bottomLabel = [[UILabel alloc] init];
+  bottomLabel.textColor = [UIColor whiteColor];
+  bottomLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  [bottomLabel setText:@"TopAlignedImageView"];
+  [self.view addSubview:bottomLabel];
+
+  NSArray* constraints = @[
+    [topLabel.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
+    [topLabel.bottomAnchor constraintEqualToAnchor:standardImageView.topAnchor],
+    [standardImageView.widthAnchor constraintEqualToConstant:250.0f],
+    [standardImageView.heightAnchor constraintEqualToConstant:250.0f],
+    [standardImageView.centerXAnchor
+        constraintEqualToAnchor:self.view.centerXAnchor],
+    [standardImageView.bottomAnchor
+        constraintEqualToAnchor:self.view.centerYAnchor
+                       constant:-20.0f],
+    [bottomLabel.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
+    [bottomLabel.topAnchor constraintEqualToAnchor:self.view.centerYAnchor
+                                          constant:20.0f],
+    [topAlignedImageView.widthAnchor constraintEqualToConstant:250.0f],
+    [topAlignedImageView.heightAnchor constraintEqualToConstant:250.0f],
+    [topAlignedImageView.centerXAnchor
+        constraintEqualToAnchor:self.view.centerXAnchor],
+    [topAlignedImageView.topAnchor
+        constraintEqualToAnchor:bottomLabel.bottomAnchor],
+
+  ];
+  [NSLayoutConstraint activateConstraints:constraints];
+}
+@end
diff --git a/ios/showcase/tab_grid/sc_toolbars_view_controller.h b/ios/showcase/tab_grid/sc_toolbars_view_controller.h
new file mode 100644
index 0000000..4dd4069
--- /dev/null
+++ b/ios/showcase/tab_grid/sc_toolbars_view_controller.h
@@ -0,0 +1,13 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_SHOWCASE_TAB_GRID_SC_TOOLBARS_VIEW_CONTROLLER_H_
+#define IOS_SHOWCASE_TAB_GRID_SC_TOOLBARS_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@interface SCToolbarsViewController : UIViewController
+@end
+
+#endif  // IOS_SHOWCASE_TAB_GRID_SC_TOOLBARS_VIEW_CONTROLLER_H_
diff --git a/ios/showcase/tab_grid/sc_toolbars_view_controller.mm b/ios/showcase/tab_grid/sc_toolbars_view_controller.mm
new file mode 100644
index 0000000..4285436
--- /dev/null
+++ b/ios/showcase/tab_grid/sc_toolbars_view_controller.mm
@@ -0,0 +1,76 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/showcase/tab_grid/sc_toolbars_view_controller.h"
+
+#import "ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.h"
+#import "ios/chrome/browser/ui/tab_grid/tab_grid_top_toolbar.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation SCToolbarsViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.backgroundColor = [UIColor whiteColor];
+
+  TabGridTopToolbar* topToolbar = [[TabGridTopToolbar alloc] init];
+  topToolbar.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:topToolbar];
+
+  TabGridBottomToolbar* bottomToolbar1 = [[TabGridBottomToolbar alloc] init];
+  bottomToolbar1.translatesAutoresizingMaskIntoConstraints = NO;
+  bottomToolbar1.theme = TabGridBottomToolbarThemeWhiteRoundButton;
+  [self.view addSubview:bottomToolbar1];
+
+  TabGridBottomToolbar* bottomToolbar2 = [[TabGridBottomToolbar alloc] init];
+  bottomToolbar2.translatesAutoresizingMaskIntoConstraints = NO;
+  bottomToolbar2.theme = TabGridBottomToolbarThemeBlueRoundButton;
+  [self.view addSubview:bottomToolbar2];
+
+  TabGridBottomToolbar* bottomToolbar3 = [[TabGridBottomToolbar alloc] init];
+  bottomToolbar3.translatesAutoresizingMaskIntoConstraints = NO;
+  bottomToolbar3.theme = TabGridBottomToolbarThemePartiallyDisabled;
+  [self.view addSubview:bottomToolbar3];
+
+  NSArray* constraints = @[
+    [topToolbar.topAnchor constraintEqualToAnchor:self.view.topAnchor
+                                         constant:10.0f],
+    [topToolbar.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+    [topToolbar.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [topToolbar.heightAnchor
+        constraintEqualToConstant:topToolbar.intrinsicContentSize.height],
+    [bottomToolbar1.topAnchor constraintEqualToAnchor:topToolbar.bottomAnchor
+                                             constant:10.0f],
+    [bottomToolbar1.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [bottomToolbar1.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [bottomToolbar1.heightAnchor
+        constraintEqualToConstant:bottomToolbar1.intrinsicContentSize.height],
+    [bottomToolbar2.topAnchor
+        constraintEqualToAnchor:bottomToolbar1.bottomAnchor
+                       constant:10.0f],
+    [bottomToolbar2.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [bottomToolbar2.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [bottomToolbar2.heightAnchor
+        constraintEqualToConstant:bottomToolbar2.intrinsicContentSize.height],
+    [bottomToolbar3.topAnchor
+        constraintEqualToAnchor:bottomToolbar2.bottomAnchor
+                       constant:10.0f],
+    [bottomToolbar3.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [bottomToolbar3.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [bottomToolbar3.heightAnchor
+        constraintEqualToConstant:bottomToolbar3.intrinsicContentSize.height],
+  ];
+  [NSLayoutConstraint activateConstraints:constraints];
+}
+@end
diff --git a/ios/web/app/web_main_loop.mm b/ios/web/app/web_main_loop.mm
index b5f96c7..b3a83bb6 100644
--- a/ios/web/app/web_main_loop.mm
+++ b/ios/web/app/web_main_loop.mm
@@ -19,7 +19,6 @@
 #include "base/process/process_metrics.h"
 #include "base/task_scheduler/scheduler_worker_pool_params.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_restrictions.h"
 #import "ios/web/net/cookie_notification_bridge.h"
 #include "ios/web/public/app/web_main_parts.h"
@@ -125,8 +124,6 @@
   }
   ios_global_state::StartTaskScheduler(init_params.get());
 
-  base::SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess();
-
   base::Thread::Options io_message_loop_options;
   io_message_loop_options.message_loop_type = base::MessageLoop::TYPE_IO;
   io_thread_ = std::make_unique<WebThreadImpl>(WebThread::IO);
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 1f13be6..3997e7b 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1418,12 +1418,18 @@
   }
 
   // Add or update pending url.
-  if (self.navigationManagerImpl->GetPendingItem()) {
+  web::NavigationItem* item = self.navigationManagerImpl->GetPendingItem();
+  if (item) {
     // Update the existing pending entry.
     // Typically on PAGE_TRANSITION_CLIENT_REDIRECT.
     // Don't update if request is a placeholder entry because the pending item
     // should have the original target URL.
-    if (!IsPlaceholderUrl(requestURL)) {
+    // Don't update if pending URL has a different origin, because client
+    // redirects can not change the origin. It is possible to have more than one
+    // pending navigations, so the redirect does not necesserily belong to the
+    // pending navigation item.
+    if (!IsPlaceholderUrl(requestURL) &&
+        item->GetURL().GetOrigin() == requestURL.GetOrigin()) {
       self.navigationManagerImpl->UpdatePendingItemUrl(requestURL);
     }
   } else {
@@ -1431,9 +1437,9 @@
         requestURL, referrer, transition,
         web::NavigationInitiationType::RENDERER_INITIATED,
         web::NavigationManager::UserAgentOverrideOption::INHERIT);
+    item = self.navigationManagerImpl->GetPendingItem();
   }
 
-  web::NavigationItem* item = self.navigationManagerImpl->GetPendingItem();
   bool isRendererInitiated =
       item ? (static_cast<web::NavigationItemImpl*>(item)
                   ->NavigationInitiationType() ==
diff --git a/ios/web_view/OWNERS b/ios/web_view/OWNERS
index c3456e9..9c0f8c8 100644
--- a/ios/web_view/OWNERS
+++ b/ios/web_view/OWNERS
@@ -1,5 +1,6 @@
 eugenebut@chromium.org
 ichikawa@chromium.org
+jzw@chromium.org
 michaeldo@chromium.org
 rohitrao@chromium.org
 
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 088920c..78ff25b 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -282,7 +282,7 @@
     "//ui/gfx:color_space",
   ]
   deps = [
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//gpu/command_buffer/common",
     "//ppapi/features",
     "//skia",
diff --git a/media/base/media.cc b/media/base/media.cc
index 4de58625..bc7e3e1 100644
--- a/media/base/media.cc
+++ b/media/base/media.cc
@@ -4,7 +4,7 @@
 
 #include "media/base/media.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index a0b5d16..3161ad9 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -41,11 +41,6 @@
 // for details.
 const char kEnableExclusiveAudio[] = "enable-exclusive-audio";
 
-// Force the use of MediaFoundation for video capture. This is only supported in
-// Windows 7 and above. Used, like |kForceDirectShowVideoCapture|, to
-// troubleshoot problems in Windows platforms.
-const char kForceMediaFoundationVideoCapture[] = "force-mediafoundation";
-
 // Use Windows WaveOut/In audio API even if Core Audio is supported.
 const char kForceWaveAudio[] = "force-wave-audio";
 
@@ -350,6 +345,11 @@
 // Enables H264 HW encode acceleration using Media Foundation for Windows.
 const base::Feature kMediaFoundationH264Encoding{
     "MediaFoundationH264Encoding", base::FEATURE_ENABLED_BY_DEFAULT};
+
+// Enables MediaFoundation based video capture
+const base::Feature kMediaFoundationVideoCapture{
+    "MediaFoundationVideoCapture", base::FEATURE_DISABLED_BY_DEFAULT};
+
 #endif  // defined(OS_WIN)
 
 std::string GetEffectiveAutoplayPolicy(const base::CommandLine& command_line) {
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index e5544741..3a7d57d 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -39,7 +39,6 @@
 
 #if defined(OS_WIN)
 MEDIA_EXPORT extern const char kEnableExclusiveAudio[];
-MEDIA_EXPORT extern const char kForceMediaFoundationVideoCapture[];
 MEDIA_EXPORT extern const char kForceWaveAudio[];
 MEDIA_EXPORT extern const char kTrySupportedChannelLayouts[];
 MEDIA_EXPORT extern const char kWaveOutBuffers[];
@@ -148,6 +147,7 @@
 MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoding;
 MEDIA_EXPORT extern const base::Feature kDelayCopyNV12Textures;
 MEDIA_EXPORT extern const base::Feature kMediaFoundationH264Encoding;
+MEDIA_EXPORT extern const base::Feature kMediaFoundationVideoCapture;
 #endif  // defined(OS_WIN)
 
 // Based on a |command_line| and the current platform, returns the effective
diff --git a/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc
index f0ee3f6..528d756 100644
--- a/media/capture/video/win/video_capture_device_factory_win.cc
+++ b/media/capture/video/win/video_capture_device_factory_win.cc
@@ -11,6 +11,7 @@
 #include <wrl/client.h>
 
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
@@ -345,8 +346,8 @@
 }
 
 VideoCaptureDeviceFactoryWin::VideoCaptureDeviceFactoryWin()
-    : use_media_foundation_(base::CommandLine::ForCurrentProcess()->HasSwitch(
-                                switches::kForceMediaFoundationVideoCapture)) {}
+    : use_media_foundation_(
+          base::FeatureList::IsEnabled(media::kMediaFoundationVideoCapture)) {}
 
 std::unique_ptr<VideoCaptureDevice> VideoCaptureDeviceFactoryWin::CreateDevice(
     const Descriptor& device_descriptor) {
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
index 4bc8486..83475cd 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -1270,11 +1270,18 @@
       // change. They implicitly send a V4L2_DEC_CMD_STOP and V4L2_DEC_CMD_START
       // to the decoder.
       if (input_buffer_queued_count_ == 0) {
-        if (!SendDecoderCmdStop())
-          return;
         input_ready_queue_.pop();
         free_input_buffers_.push_back(buffer);
         input_record.input_id = -1;
+        if (coded_size_.IsEmpty()) {
+          // If coded_size_.IsEmpty(), no output buffer could have been
+          // allocated and there is nothing to flush. We can NotifyFlushDone()
+          // immediately, without requesting flush to the driver via
+          // SendDecoderCmdStop().
+          NotifyFlushDoneIfNeeded();
+        } else if (!SendDecoderCmdStop()) {
+          return;
+        }
       } else {
         break;
       }
diff --git a/media/mojo/interfaces/BUILD.gn b/media/mojo/interfaces/BUILD.gn
index 952e5bbb..9eccc18 100644
--- a/media/mojo/interfaces/BUILD.gn
+++ b/media/mojo/interfaces/BUILD.gn
@@ -9,6 +9,7 @@
   # TODO(crbug.com/676224): Conditionally add source files in this list when we
   # support EnabledIf attribute in mojom files.
   sources = [
+    "audio_data_pipe.mojom",
     "audio_decoder.mojom",
     "audio_input_stream.mojom",
     "audio_logging.mojom",
diff --git a/media/mojo/interfaces/audio_data_pipe.mojom b/media/mojo/interfaces/audio_data_pipe.mojom
new file mode 100644
index 0000000..b9d5a28
--- /dev/null
+++ b/media/mojo/interfaces/audio_data_pipe.mojom
@@ -0,0 +1,13 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module media.mojom;
+
+// Used by audio streams for realtime-ish data transfer. Used for both input
+// and output streams, see AudioDeviceThread, AudioSyncReader, and
+// AudioInputSyncWriter.
+struct AudioDataPipe {
+  handle<shared_buffer> shared_memory;
+  handle socket;
+};
diff --git a/media/mojo/interfaces/audio_output_stream.mojom b/media/mojo/interfaces/audio_output_stream.mojom
index 236ec43c..2ccf4b75 100644
--- a/media/mojo/interfaces/audio_output_stream.mojom
+++ b/media/mojo/interfaces/audio_output_stream.mojom
@@ -4,6 +4,7 @@
 
 module media.mojom;
 
+import "media/mojo/interfaces/audio_data_pipe.mojom";
 import "media/mojo/interfaces/audio_parameters.mojom";
 import "media/mojo/interfaces/media_types.mojom";
 
@@ -16,8 +17,8 @@
   // Starts rendering audio.
   Play();
 
-  // Stops rendering audio and sends a signal to the |socket_descriptor|
-  // indicating this.
+  // Stops rendering audio and sends a signal on the AudioDataPipe indicating
+  // this.
   Pause();
 
   // Sets volume. Volume must be in the range [0, 1].
@@ -31,16 +32,12 @@
 };
 
 interface AudioOutputStreamProvider {
-  // Creates a new AudioOutputStream using |params|. |shared_buffer| and
-  // |socket_descriptor| are used to write data to the stream as defined
-  // in AudioDeviceThread. This means:
-  // * |shared_buffer| will be a writable handle to memory of the size needed
-  //   by AudioDeviceThread for the specified params.
-  // * |socket_descriptor| is a descriptor from which a
-  //   base::CancelableSyncSocket can be constructed.
+  // Creates a new AudioOutputStream using |params|. |data_pipe| is used to
+  // transfer audio data.
   // Can only be called once.
-  Acquire(AudioOutputStream& output_stream, AudioOutputStreamClient client, AudioParameters params)
-  => (handle<shared_buffer> shared_buffer, handle socket_descriptor);
+  Acquire(AudioOutputStream& output_stream, AudioOutputStreamClient client,
+    AudioParameters params)
+    => (AudioDataPipe data_pipe);
 };
 
 // An AudioOutputStreamObserver gets notifications about events related to an
diff --git a/media/mojo/services/mojo_audio_input_stream.cc b/media/mojo/services/mojo_audio_input_stream.cc
index 9dba860..7592b758 100644
--- a/media/mojo/services/mojo_audio_input_stream.cc
+++ b/media/mojo/services/mojo_audio_input_stream.cc
@@ -92,7 +92,8 @@
   DCHECK(socket_handle.is_valid());
 
   base::ResetAndReturn(&stream_created_callback_)
-      .Run(std::move(buffer_handle), std::move(socket_handle), initially_muted);
+      .Run({base::in_place, std::move(buffer_handle), std::move(socket_handle)},
+           initially_muted);
 }
 
 void MojoAudioInputStream::OnMuted(int stream_id, bool is_muted) {
diff --git a/media/mojo/services/mojo_audio_input_stream.h b/media/mojo/services/mojo_audio_input_stream.h
index 40a607c1..d28f1e1 100644
--- a/media/mojo/services/mojo_audio_input_stream.h
+++ b/media/mojo/services/mojo_audio_input_stream.h
@@ -10,6 +10,7 @@
 
 #include "base/sequence_checker.h"
 #include "media/audio/audio_input_delegate.h"
+#include "media/mojo/interfaces/audio_data_pipe.mojom.h"
 #include "media/mojo/interfaces/audio_input_stream.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
 #include "mojo/public/cpp/bindings/binding.h"
@@ -22,8 +23,8 @@
     : public mojom::AudioInputStream,
       public AudioInputDelegate::EventHandler {
  public:
-  using StreamCreatedCallback = base::OnceCallback<
-      void(mojo::ScopedSharedBufferHandle, mojo::ScopedHandle, bool)>;
+  using StreamCreatedCallback =
+      base::OnceCallback<void(mojom::AudioDataPipePtr, bool)>;
   using CreateDelegateCallback =
       base::OnceCallback<std::unique_ptr<AudioInputDelegate>(
           AudioInputDelegate::EventHandler*)>;
diff --git a/media/mojo/services/mojo_audio_input_stream_unittest.cc b/media/mojo/services/mojo_audio_input_stream_unittest.cc
index 5f5cc50..5271b9227 100644
--- a/media/mojo/services/mojo_audio_input_stream_unittest.cc
+++ b/media/mojo/services/mojo_audio_input_stream_unittest.cc
@@ -96,24 +96,22 @@
  public:
   MockClient() = default;
 
-  void Initialized(mojo::ScopedSharedBufferHandle shared_buffer,
-                   mojo::ScopedHandle socket_handle,
-                   bool initially_muted) {
-    ASSERT_TRUE(shared_buffer.is_valid());
-    ASSERT_TRUE(socket_handle.is_valid());
+  void Initialized(mojom::AudioDataPipePtr data_pipe, bool initially_muted) {
+    ASSERT_TRUE(data_pipe->shared_memory.is_valid());
+    ASSERT_TRUE(data_pipe->socket.is_valid());
 
     base::PlatformFile fd;
-    mojo::UnwrapPlatformFile(std::move(socket_handle), &fd);
+    mojo::UnwrapPlatformFile(std::move(data_pipe->socket), &fd);
     socket_ = std::make_unique<base::CancelableSyncSocket>(fd);
     EXPECT_NE(socket_->handle(), base::CancelableSyncSocket::kInvalidHandle);
 
     size_t memory_length;
     base::SharedMemoryHandle shmem_handle;
     mojo::UnwrappedSharedMemoryHandleProtection protection;
-    EXPECT_EQ(
-        mojo::UnwrapSharedMemoryHandle(std::move(shared_buffer), &shmem_handle,
-                                       &memory_length, &protection),
-        MOJO_RESULT_OK);
+    EXPECT_EQ(mojo::UnwrapSharedMemoryHandle(
+                  std::move(data_pipe->shared_memory), &shmem_handle,
+                  &memory_length, &protection),
+              MOJO_RESULT_OK);
     EXPECT_EQ(protection,
               mojo::UnwrappedSharedMemoryHandleProtection::kReadOnly);
     buffer_ = std::make_unique<base::SharedMemory>(shmem_handle,
@@ -140,9 +138,7 @@
   return nullptr;
 }
 
-void NotCalled(mojo::ScopedSharedBufferHandle shared_buffer,
-               mojo::ScopedHandle socket_handle,
-               bool initially_muted) {
+void NotCalled(mojom::AudioDataPipePtr data_pipe, bool initially_muted) {
   EXPECT_TRUE(false) << "The StreamCreated callback was called despite the "
                         "test expecting it not to.";
 }
diff --git a/media/mojo/services/mojo_audio_output_stream.cc b/media/mojo/services/mojo_audio_output_stream.cc
index dc099729..79e5241 100644
--- a/media/mojo/services/mojo_audio_output_stream.cc
+++ b/media/mojo/services/mojo_audio_output_stream.cc
@@ -96,7 +96,8 @@
   DCHECK(socket_handle.is_valid());
 
   base::ResetAndReturn(&stream_created_callback_)
-      .Run(std::move(buffer_handle), std::move(socket_handle));
+      .Run(
+          {base::in_place, std::move(buffer_handle), std::move(socket_handle)});
 }
 
 void MojoAudioOutputStream::OnStreamError(int stream_id) {
diff --git a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
index 7be7d38..49edfa9 100644
--- a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
@@ -31,7 +31,7 @@
 using MockDeleter = base::MockCallback<
     base::OnceCallback<void(mojom::AudioOutputStreamProvider*)>>;
 
-void FakeAcquireCallback(mojo::ScopedSharedBufferHandle, mojo::ScopedHandle) {}
+void FakeAcquireCallback(mojom::AudioDataPipePtr data_pipe) {}
 
 class FakeObserver : public mojom::AudioOutputStreamObserver {
  public:
diff --git a/media/mojo/services/mojo_audio_output_stream_unittest.cc b/media/mojo/services/mojo_audio_output_stream_unittest.cc
index f91064e2..efd1619 100644
--- a/media/mojo/services/mojo_audio_output_stream_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_unittest.cc
@@ -95,23 +95,22 @@
  public:
   MockClient() = default;
 
-  void Initialized(mojo::ScopedSharedBufferHandle shared_buffer,
-                   mojo::ScopedHandle socket_handle) {
-    ASSERT_TRUE(shared_buffer.is_valid());
-    ASSERT_TRUE(socket_handle.is_valid());
+  void Initialized(mojom::AudioDataPipePtr data_pipe) {
+    ASSERT_TRUE(data_pipe->shared_memory.is_valid());
+    ASSERT_TRUE(data_pipe->socket.is_valid());
 
     base::PlatformFile fd;
-    mojo::UnwrapPlatformFile(std::move(socket_handle), &fd);
+    mojo::UnwrapPlatformFile(std::move(data_pipe->socket), &fd);
     socket_ = std::make_unique<base::CancelableSyncSocket>(fd);
     EXPECT_NE(socket_->handle(), base::CancelableSyncSocket::kInvalidHandle);
 
     size_t memory_length;
     base::SharedMemoryHandle shmem_handle;
     mojo::UnwrappedSharedMemoryHandleProtection protection;
-    EXPECT_EQ(
-        mojo::UnwrapSharedMemoryHandle(std::move(shared_buffer), &shmem_handle,
-                                       &memory_length, &protection),
-        MOJO_RESULT_OK);
+    EXPECT_EQ(mojo::UnwrapSharedMemoryHandle(
+                  std::move(data_pipe->shared_memory), &shmem_handle,
+                  &memory_length, &protection),
+              MOJO_RESULT_OK);
     EXPECT_EQ(protection,
               mojo::UnwrappedSharedMemoryHandleProtection::kReadWrite);
     buffer_ = std::make_unique<base::SharedMemory>(shmem_handle,
@@ -134,8 +133,7 @@
   return nullptr;
 }
 
-void NotCalled(mojo::ScopedSharedBufferHandle shared_buffer,
-               mojo::ScopedHandle socket_handle) {
+void NotCalled(mojom::AudioDataPipePtr data_pipe) {
   EXPECT_TRUE(false) << "The StreamCreated callback was called despite the "
                         "test expecting it not to.";
 }
diff --git a/net/BUILD.gn b/net/BUILD.gn
index b28d93e..22c93189 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -5163,9 +5163,9 @@
     "quic/core/quic_sent_packet_manager_test.cc",
     "quic/core/quic_server_id_test.cc",
     "quic/core/quic_server_session_base_test.cc",
-    "quic/core/quic_session_test.cc",
     "quic/core/quic_simple_buffer_allocator_test.cc",
     "quic/core/quic_socket_address_coder_test.cc",
+    "quic/core/quic_spdy_session_test.cc",
     "quic/core/quic_spdy_stream_test.cc",
     "quic/core/quic_stream_send_buffer_test.cc",
     "quic/core/quic_stream_sequencer_buffer_test.cc",
diff --git a/net/OWNERS b/net/OWNERS
index 3f42f6b..6b3369d 100644
--- a/net/OWNERS
+++ b/net/OWNERS
@@ -6,7 +6,6 @@
 eroman@chromium.org
 gavinp@chromium.org
 jkarlin@chromium.org
-jri@chromium.org
 juliatuttle@chromium.org
 mattm@chromium.org
 mef@chromium.org
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index d1857c2..d3932f0 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -901,3 +901,6 @@
 
 // Failed to sort addresses according to RFC3484.
 NET_ERROR(DNS_SORT_ERROR, -806)
+
+// Failed to resolve over HTTP, fallback to legacy
+NET_ERROR(DNS_HTTP_FAILED, -807)
diff --git a/net/dns/dns_config_service.cc b/net/dns/dns_config_service.cc
index 1f19a7b..cf7de9c 100644
--- a/net/dns/dns_config_service.cc
+++ b/net/dns/dns_config_service.cc
@@ -83,10 +83,25 @@
   dict->SetBoolean("edns0", edns0);
   dict->SetBoolean("use_local_ipv6", use_local_ipv6);
   dict->SetInteger("num_hosts", hosts.size());
+  list = std::make_unique<base::ListValue>();
+  for (auto& server : dns_over_https_servers) {
+    base::Value val(base::Value::Type::DICTIONARY);
+    base::DictionaryValue* dict;
+    val.GetAsDictionary(&dict);
+    dict->SetString("server", server.server.spec());
+    dict->SetBoolean("use_post", server.use_post);
+    list->GetList().push_back(std::move(val));
+  }
+  dict->Set("doh_servers", std::move(list));
 
   return std::move(dict);
 }
 
+DnsConfig::DnsOverHttpsServerConfig::DnsOverHttpsServerConfig(
+    const GURL& server,
+    bool use_post)
+    : server(server), use_post(use_post) {}
+
 DnsConfigService::DnsConfigService()
     : watch_failed_(false),
       have_config_(false),
diff --git a/net/dns/dns_config_service.h b/net/dns/dns_config_service.h
index 6ccd52f3..231a569 100644
--- a/net/dns/dns_config_service.h
+++ b/net/dns/dns_config_service.h
@@ -20,6 +20,7 @@
 #include "net/base/ip_endpoint.h"  // win requires size of IPEndPoint
 #include "net/base/net_export.h"
 #include "net/dns/dns_hosts.h"
+#include "url/gurl.h"
 
 namespace base {
 class Value;
@@ -50,6 +51,13 @@
     return !nameservers.empty();
   }
 
+  struct NET_EXPORT_PRIVATE DnsOverHttpsServerConfig {
+    DnsOverHttpsServerConfig(const GURL& server, bool use_post);
+
+    GURL server;
+    bool use_post;
+  };
+
   // List of name server addresses.
   std::vector<IPEndPoint> nameservers;
   // Suffix search list; used on first lookup when number of dots in given name
@@ -87,6 +95,10 @@
   // DirectAccess. This is exposed for HostResolver to skip IPv6 probes,
   // as it may cause them to return incorrect results.
   bool use_local_ipv6;
+
+  // List of servers to query over HTTPS, queried in order
+  // (https://tools.ietf.org/id/draft-ietf-doh-dns-over-https-02.txt).
+  std::vector<DnsOverHttpsServerConfig> dns_over_https_servers;
 };
 
 // Service for reading system DNS settings, on demand or when signalled by
diff --git a/net/dns/dns_response.cc b/net/dns/dns_response.cc
index 79c1d5c..8d258e4 100644
--- a/net/dns/dns_response.cc
+++ b/net/dns/dns_response.cc
@@ -151,17 +151,18 @@
 }
 
 DnsResponse::DnsResponse()
-    : io_buffer_(new IOBufferWithSize(dns_protocol::kMaxUDPSize + 1)) {
-}
+    : io_buffer_(new IOBuffer(dns_protocol::kMaxUDPSize + 1)),
+      io_buffer_size_(dns_protocol::kMaxUDPSize + 1) {}
+
+DnsResponse::DnsResponse(IOBuffer* buffer, size_t size)
+    : io_buffer_(buffer), io_buffer_size_(size) {}
 
 DnsResponse::DnsResponse(size_t length)
-    : io_buffer_(new IOBufferWithSize(length)) {
-}
+    : io_buffer_(new IOBuffer(length)), io_buffer_size_(length) {}
 
-DnsResponse::DnsResponse(const void* data,
-                         size_t length,
-                         size_t answer_offset)
+DnsResponse::DnsResponse(const void* data, size_t length, size_t answer_offset)
     : io_buffer_(new IOBufferWithSize(length)),
+      io_buffer_size_(length),
       parser_(io_buffer_->data(), length, answer_offset) {
   DCHECK(data);
   memcpy(io_buffer_->data(), data, length);
@@ -169,11 +170,12 @@
 
 DnsResponse::~DnsResponse() = default;
 
-bool DnsResponse::InitParse(int nbytes, const DnsQuery& query) {
-  DCHECK_GE(nbytes, 0);
+bool DnsResponse::InitParse(size_t nbytes, const DnsQuery& query) {
   // Response includes query, it should be at least that size.
-  if (nbytes < query.io_buffer()->size() || nbytes >= io_buffer_->size())
+  if (nbytes < static_cast<size_t>(query.io_buffer()->size()) ||
+      nbytes >= io_buffer_size_) {
     return false;
+  }
 
   // Match the query id.
   if (base::NetToHost16(header()->id) != query.id())
@@ -196,11 +198,10 @@
   return true;
 }
 
-bool DnsResponse::InitParseWithoutQuery(int nbytes) {
-  DCHECK_GE(nbytes, 0);
-
-  if (nbytes < static_cast<int>(kHeaderSize) || nbytes >= io_buffer_->size())
+bool DnsResponse::InitParseWithoutQuery(size_t nbytes) {
+  if (nbytes < kHeaderSize || nbytes >= io_buffer_size_) {
     return false;
+  }
 
   parser_ = DnsRecordParser(io_buffer_->data(), nbytes, kHeaderSize);
 
diff --git a/net/dns/dns_response.h b/net/dns/dns_response.h
index e9231a5d..ee533c93 100644
--- a/net/dns/dns_response.h
+++ b/net/dns/dns_response.h
@@ -20,7 +20,7 @@
 
 class AddressList;
 class DnsQuery;
-class IOBufferWithSize;
+class IOBuffer;
 
 namespace dns_protocol {
 struct Header;
@@ -108,6 +108,9 @@
   // Constructs a response buffer of given length. Used for TCP transactions.
   explicit DnsResponse(size_t length);
 
+  // Constructs a response taking ownership of the passed buffer.
+  DnsResponse(IOBuffer* buffer, size_t size);
+
   // Constructs a response from |data|. Used for testing purposes only!
   DnsResponse(const void* data, size_t length, size_t answer_offset);
 
@@ -115,15 +118,18 @@
 
   // Internal buffer accessor into which actual bytes of response will be
   // read.
-  IOBufferWithSize* io_buffer() { return io_buffer_.get(); }
+  IOBuffer* io_buffer() { return io_buffer_.get(); }
+
+  // Size of the internal buffer.
+  size_t io_buffer_size() const { return io_buffer_size_; }
 
   // Assuming the internal buffer holds |nbytes| bytes, returns true iff the
   // packet matches the |query| id and question.
-  bool InitParse(int nbytes, const DnsQuery& query);
+  bool InitParse(size_t nbytes, const DnsQuery& query);
 
   // Assuming the internal buffer holds |nbytes| bytes, initialize the parser
   // without matching it against an existing query.
-  bool InitParseWithoutQuery(int nbytes);
+  bool InitParseWithoutQuery(size_t nbytes);
 
   // Returns true if response is valid, that is, after successful InitParse.
   bool IsValid() const;
@@ -158,7 +164,10 @@
   const dns_protocol::Header* header() const;
 
   // Buffer into which response bytes are read.
-  scoped_refptr<IOBufferWithSize> io_buffer_;
+  scoped_refptr<IOBuffer> io_buffer_;
+
+  // Size of the buffer.
+  size_t io_buffer_size_;
 
   // Iterator constructed after InitParse positioned at the answer section.
   // It is never updated afterwards, so can be used in accessors.
diff --git a/net/dns/dns_session.cc b/net/dns/dns_session.cc
index 007ecd2e..3e6efc1 100644
--- a/net/dns/dns_session.cc
+++ b/net/dns/dns_session.cc
@@ -134,7 +134,9 @@
 
 void DnsSession::InitializeServerStats() {
   server_stats_.clear();
-  for (size_t i = 0; i < config_.nameservers.size(); ++i) {
+  for (size_t i = 0;
+       i < config_.nameservers.size() + config_.dns_over_https_servers.size();
+       ++i) {
     server_stats_.push_back(std::make_unique<ServerStats>(
         initial_timeout_, rtt_buckets_.Pointer()));
   }
@@ -162,6 +164,8 @@
 }
 
 unsigned DnsSession::NextGoodServerIndex(unsigned server_index) {
+  DCHECK_GE(server_index, 0u);
+  DCHECK_LT(server_index, config_.nameservers.size());
   unsigned index = server_index;
   base::Time oldest_server_failure(base::Time::Now());
   unsigned oldest_server_failure_index = 0;
@@ -186,6 +190,37 @@
   return oldest_server_failure_index;
 }
 
+unsigned DnsSession::NextGoodDnsOverHttpsServerIndex(unsigned server_index) {
+  DCHECK_GE(server_index, config_.nameservers.size());
+  DCHECK_LT(server_index,
+            config_.nameservers.size() + config_.dns_over_https_servers.size());
+  unsigned index = server_index;
+  base::Time oldest_server_failure(base::Time::Now());
+  unsigned oldest_server_failure_index = config_.nameservers.size();
+
+  do {
+    base::Time cur_server_failure = server_stats_[index]->last_failure;
+    // If number of failures on this server doesn't exceed number of allowed
+    // attempts, return its index.
+    if (server_stats_[index]->last_failure_count < config_.attempts) {
+      return index;
+    }
+    // Track oldest failed server.
+    if (cur_server_failure < oldest_server_failure) {
+      oldest_server_failure = cur_server_failure;
+      oldest_server_failure_index = index;
+    }
+    // Index of dns over https servers begins at nameservers.size().
+    unsigned doh_index = index - config_.nameservers.size();
+    doh_index = ((doh_index + 1) % config_.dns_over_https_servers.size());
+    index = doh_index + config_.nameservers.size();
+  } while (index != server_index);
+
+  // If we are here it means that there are no successful servers, so we have
+  // to use one that has failed oldest.
+  return oldest_server_failure_index;
+}
+
 void DnsSession::RecordServerFailure(unsigned server_index) {
   UMA_HISTOGRAM_CUSTOM_COUNTS("AsyncDNS.ServerFailureIndex", server_index, 1,
                               10, 11);
diff --git a/net/dns/dns_session.h b/net/dns/dns_session.h
index 7b9b26f8..3a09d33 100644
--- a/net/dns/dns_session.h
+++ b/net/dns/dns_session.h
@@ -74,12 +74,17 @@
   // Return the index of the first configured server to use on first attempt.
   unsigned NextFirstServerIndex();
 
-  // Start with |server_index| and find the index of the next known good server
-  // to use on this attempt. Returns |server_index| if this server has no
-  // recorded failures, or if there are no other servers that have not failed
-  // or have failed longer time ago.
+  // Start with |server_index| and find the index of the next known
+  // good non-dns-over-https server to use on this attempt. Returns
+  // |server_index| if this server has no recorded failures, or if
+  // there are no other servers that have not failed or have failed
+  // longer time ago.
   unsigned NextGoodServerIndex(unsigned server_index);
 
+  // Same as above, but for DNS over HTTPS servers and ignoring
+  // non-dns-over-https servers
+  unsigned NextGoodDnsOverHttpsServerIndex(unsigned server_index);
+
   // Record that server failed to respond (due to SRV_FAIL or timeout).
   void RecordServerFailure(unsigned server_index);
 
@@ -146,7 +151,10 @@
 
   struct ServerStats;
 
-  // Track runtime statistics of each DNS server.
+  // Track runtime statistics of each DNS server. This combines both
+  // dns-over-https servers and non-dns-over-https servers.
+  // non-dns-over-https servers come first and dns-over-https servers
+  // started at the index of nameservers.size().
   std::vector<std::unique_ptr<ServerStats>> server_stats_;
 
   // Buckets shared for all |ServerStats::rtt_histogram|.
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc
index d043a01..f18613c6 100644
--- a/net/dns/dns_test_util.cc
+++ b/net/dns/dns_test_util.cc
@@ -148,6 +148,9 @@
     }
   }
 
+  void SetRequestContext(URLRequestContext*) override {}
+  void SetRequestPriority(RequestPriority priority) override {}
+
   MockDnsClientRule::Result result_;
   const std::string hostname_;
   const uint16_t qtype_;
@@ -213,6 +216,10 @@
 }
 
 const DnsConfig* MockDnsClient::GetConfig() const {
+  if (!config_.IsValid())
+    printf("invalid config\n");
+  else
+    printf("valid config\n");
   return config_.IsValid() ? &config_ : NULL;
 }
 
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index dc86ffb..f7a3e8d 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/base64url.h"
 #include "base/big_endian.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -27,11 +28,14 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "net/base/completion_callback.h"
+#include "net/base/elements_upload_data_stream.h"
 #include "net/base/io_buffer.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
+#include "net/base/upload_bytes_element_reader.h"
 #include "net/dns/dns_protocol.h"
 #include "net/dns/dns_query.h"
 #include "net/dns/dns_response.h"
@@ -45,6 +49,11 @@
 #include "net/socket/datagram_client_socket.h"
 #include "net/socket/stream_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_fetcher_response_writer.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_builder.h"
 
 namespace net {
 
@@ -77,6 +86,8 @@
             "Essential for Chrome's navigation."
         })");
 
+const char kDnsOverHttpResponseContentType[] = "application/dns-udpwireformat";
+
 // Count labels in the fully-qualified name in DNS format.
 int CountLabels(const std::string& name) {
   size_t count = 0;
@@ -297,11 +308,10 @@
 
   int DoReadResponse() {
     next_state_ = STATE_READ_RESPONSE_COMPLETE;
-    response_.reset(new DnsResponse());
-    return socket()->Read(response_->io_buffer(),
-                          response_->io_buffer()->size(),
-                          base::Bind(&DnsUDPAttempt::OnIOComplete,
-                                     base::Unretained(this)));
+    response_ = std::make_unique<DnsResponse>();
+    return socket()->Read(
+        response_->io_buffer(), response_->io_buffer_size(),
+        base::Bind(&DnsUDPAttempt::OnIOComplete, base::Unretained(this)));
   }
 
   int DoReadResponseComplete(int rv) {
@@ -352,6 +362,224 @@
   DISALLOW_COPY_AND_ASSIGN(DnsUDPAttempt);
 };
 
+class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate {
+ public:
+  DnsHTTPAttempt(unsigned server_index,
+                 std::unique_ptr<DnsQuery> query,
+                 const GURL& server,
+                 bool use_post,
+                 URLRequestContext* url_request_context,
+                 RequestPriority request_priority_)
+      : DnsAttempt(server_index),
+        query_(std::move(query)),
+        weak_factory_(this) {
+    GURL url(server);
+    if (!use_post) {
+      std::string encoded_query;
+      base::Base64UrlEncode(base::StringPiece(query_->io_buffer()->data(),
+                                              query_->io_buffer()->size()),
+                            base::Base64UrlEncodePolicy::INCLUDE_PADDING,
+                            &encoded_query);
+      std::string query_str("content-type=application/dns-udpwireformat&body=" +
+                            encoded_query);
+      GURL::Replacements replacements;
+      replacements.SetQuery(query_str.c_str(),
+                            url::Component(0, query_str.length()));
+      url = server.ReplaceComponents(replacements);
+    }
+
+    HttpRequestHeaders extra_request_headers;
+    extra_request_headers.SetHeader("Accept", kDnsOverHttpResponseContentType);
+
+    request_ = url_request_context->CreateRequest(
+        url, request_priority_, this,
+        net::DefineNetworkTrafficAnnotation("dns_over_https", R"(
+        semantics {
+          sender: "DNS over HTTPS"
+          description: "Domain name resolution over HTTPS"
+          trigger: "User enters a navigates to a domain or Chrome otherwise "
+                   "makes a connection to a domain whose IP address isn't cached"
+          data: "The domain name that is being requested"
+          destination: OTHER
+          destination_other: "The user configured DNS over HTTPS server, which"
+                             "may be dns.google.com"
+        }
+        policy {
+          cookies_allowed: NO
+          setting:
+            "You can configure this feature via that 'dns_over_https_servers' and"
+            "'dns_over_https.method' prefs. Empty lists imply this feature is"
+            "disabled"
+          policy_exception_justification: "Experimental feature that"
+                                          "is disabled by default"
+        }
+      )"));
+
+    if (use_post) {
+      request_->set_method("POST");
+      std::unique_ptr<UploadElementReader> reader =
+          std::make_unique<UploadBytesElementReader>(
+              query_->io_buffer()->data(), query_->io_buffer()->size());
+      request_->set_upload(
+          ElementsUploadDataStream::CreateWithReader(std::move(reader), 0));
+      extra_request_headers.SetHeader(HttpRequestHeaders::kContentType,
+                                      kDnsOverHttpResponseContentType);
+    }
+
+    request_->SetExtraRequestHeaders(extra_request_headers);
+    request_->SetLoadFlags(request_->load_flags() | LOAD_DISABLE_CACHE |
+                           LOAD_BYPASS_PROXY | LOAD_DO_NOT_SEND_COOKIES |
+                           LOAD_DO_NOT_SAVE_COOKIES |
+                           LOAD_DO_NOT_SEND_AUTH_DATA);
+  }
+
+  // DnsAttempt overrides.
+
+  int Start(const CompletionCallback& callback) override {
+    if (DNSDomainToString(query_->qname()).compare(request_->url().host()) ==
+        0) {
+      // Fast failing looking up a server with itself.
+      return ERR_DNS_HTTP_FAILED;
+    }
+
+    callback_ = callback;
+    request_->Start();
+    return ERR_IO_PENDING;
+  }
+
+  void Cancel() { request_.reset(); }
+
+  const DnsQuery* GetQuery() const override { return query_.get(); }
+  const DnsResponse* GetResponse() const override {
+    const DnsResponse* resp = response_.get();
+    return (resp != NULL && resp->IsValid()) ? resp : NULL;
+  }
+  const NetLogWithSource& GetSocketNetLog() const override {
+    return request_->net_log();
+  }
+
+  // URLRequest::Delegate overrides
+
+  void OnResponseStarted(net::URLRequest* request, int net_error) override {
+    DCHECK_NE(net::ERR_IO_PENDING, net_error);
+    std::string content_type;
+    if (net_error != OK) {
+      ResponseCompleted(net_error);
+      return;
+    }
+
+    if (request_->GetResponseCode() != 200 ||
+        !request->response_headers()->GetMimeType(&content_type) ||
+        0 != content_type.compare(kDnsOverHttpResponseContentType)) {
+      ResponseCompleted(ERR_DNS_MALFORMED_RESPONSE);
+      return;
+    }
+
+    buffer_ = new GrowableIOBuffer();
+
+    if (request->response_headers()->HasHeader(
+            HttpRequestHeaders::kContentLength)) {
+      buffer_->SetCapacity(request_->response_headers()->GetContentLength() +
+                           1);
+    } else {
+      buffer_->SetCapacity(66560);  // 64kb.
+    }
+
+    DCHECK(buffer_->data());
+    DCHECK_GT(buffer_->capacity(), 0);
+
+    int bytes_read =
+        request_->Read(buffer_.get(), buffer_->RemainingCapacity());
+
+    // If IO is pending, wait for the URLRequest to call OnReadCompleted.
+    if (bytes_read == net::ERR_IO_PENDING)
+      return;
+
+    OnReadCompleted(request_.get(), bytes_read);
+  }
+
+  void OnReadCompleted(net::URLRequest* request, int bytes_read) override {
+    // bytes_read can be an error.
+    if (bytes_read < 0) {
+      ResponseCompleted(bytes_read);
+      return;
+    }
+
+    DCHECK_GE(bytes_read, 0);
+
+    if (bytes_read > 0) {
+      buffer_->set_offset(buffer_->offset() + bytes_read);
+
+      if (buffer_->RemainingCapacity() == 0) {
+        buffer_->SetCapacity(buffer_->capacity() + 16384);  // Grow by 16kb.
+      }
+
+      DCHECK(buffer_->data());
+      DCHECK_GT(buffer_->capacity(), 0);
+
+      int bytes_read =
+          request_->Read(buffer_.get(), buffer_->RemainingCapacity());
+
+      // If IO is pending, wait for the URLRequest to call OnReadCompleted.
+      if (bytes_read == net::ERR_IO_PENDING)
+        return;
+
+      if (bytes_read <= 0) {
+        OnReadCompleted(request_.get(), bytes_read);
+      } else {
+        // Else, trigger OnReadCompleted asynchronously to avoid starving the IO
+        // thread in case the URLRequest can provide data synchronously.
+        base::SequencedTaskRunnerHandle::Get()->PostTask(
+            FROM_HERE, base::BindOnce(&DnsHTTPAttempt::OnReadCompleted,
+                                      weak_factory_.GetWeakPtr(),
+                                      request_.get(), bytes_read));
+      }
+    } else {
+      // URLRequest reported an EOF. Call ResponseCompleted.
+      DCHECK_EQ(0, bytes_read);
+      ResponseCompleted(net::OK);
+    }
+  }
+
+ private:
+  void ResponseCompleted(int net_error) {
+    request_.reset();
+    callback_.Run(CompleteResponse(net_error));
+  }
+
+  int CompleteResponse(int net_error) {
+    DCHECK_NE(net::ERR_IO_PENDING, net_error);
+    if (net_error != OK) {
+      return net_error;
+    }
+    if (!buffer_.get() || 0 == buffer_->capacity())
+      return ERR_DNS_MALFORMED_RESPONSE;
+
+    size_t size = buffer_->offset();
+    buffer_->set_offset(0);
+    if (size == 0u)
+      return ERR_DNS_MALFORMED_RESPONSE;
+    response_ = std::make_unique<DnsResponse>(buffer_.get(), size + 1);
+    if (!response_->InitParse(size, *query_))
+      return ERR_DNS_MALFORMED_RESPONSE;
+    if (response_->rcode() == dns_protocol::kRcodeNXDOMAIN)
+      return ERR_NAME_NOT_RESOLVED;
+    if (response_->rcode() != dns_protocol::kRcodeNOERROR)
+      return ERR_DNS_SERVER_FAILED;
+    return OK;
+  }
+
+  scoped_refptr<GrowableIOBuffer> buffer_;
+  std::unique_ptr<DnsQuery> query_;
+  CompletionCallback callback_;
+  std::unique_ptr<DnsResponse> response_;
+  std::unique_ptr<URLRequest> request_;
+
+  base::WeakPtrFactory<DnsHTTPAttempt> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DnsHTTPAttempt);
+};
+
 class DnsTCPAttempt : public DnsAttempt {
  public:
   DnsTCPAttempt(unsigned server_index,
@@ -370,8 +598,8 @@
     callback_ = callback;
     start_time_ = base::TimeTicks::Now();
     next_state_ = STATE_CONNECT_COMPLETE;
-    int rv = socket_->Connect(base::Bind(&DnsTCPAttempt::OnIOComplete,
-                                         base::Unretained(this)));
+    int rv = socket_->Connect(
+        base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this)));
     if (rv == ERR_IO_PENDING) {
       set_result(rv);
       return rv;
@@ -476,8 +704,8 @@
           base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this)),
           kTrafficAnnotation);
     }
-    buffer_ = new DrainableIOBuffer(query_->io_buffer(),
-                                    query_->io_buffer()->size());
+    buffer_ =
+        new DrainableIOBuffer(query_->io_buffer(), query_->io_buffer()->size());
     next_state_ = STATE_SEND_QUERY;
     return OK;
   }
@@ -551,7 +779,7 @@
       next_state_ = STATE_READ_RESPONSE;
       return OK;
     }
-
+    DCHECK_GT(buffer_->BytesConsumed(), 0);
     if (!response_->InitParse(buffer_->BytesConsumed(), *query_))
       return ERR_DNS_MALFORMED_RESPONSE;
     if (response_->flags() & dns_protocol::kFlagTC)
@@ -573,8 +801,7 @@
 
   int ReadIntoBuffer() {
     return socket_->Read(
-        buffer_.get(),
-        buffer_->BytesRemaining(),
+        buffer_.get(), buffer_->BytesRemaining(),
         base::Bind(&DnsTCPAttempt::OnIOComplete, base::Unretained(this)));
   }
 
@@ -619,8 +846,11 @@
         net_log_(net_log),
         qnames_initial_size_(0),
         attempts_count_(0),
+        doh_attempts_(0),
         had_tcp_attempt_(false),
-        first_server_index_(0) {
+        doh_attempt_(false),
+        first_server_index_(0),
+        request_priority_(DEFAULT_PRIORITY) {
     DCHECK(session_.get());
     DCHECK(!hostname_.empty());
     DCHECK(!callback_.is_null());
@@ -666,6 +896,14 @@
     }
   }
 
+  void SetRequestContext(URLRequestContext* context) override {
+    url_request_context_ = context;
+  }
+
+  void SetRequestPriority(RequestPriority priority) override {
+    request_priority_ = priority;
+  }
+
  private:
   // Wrapper for the result of a DnsUDPAttempt.
   struct AttemptResult {
@@ -732,8 +970,8 @@
     if (callback_.is_null())
       return;
 
-    const DnsResponse* response = result.attempt ?
-        result.attempt->GetResponse() : NULL;
+    const DnsResponse* response =
+        result.attempt ? result.attempt->GetResponse() : NULL;
     CHECK(result.rv != OK || response != NULL);
 
     timer_.Stop();
@@ -755,9 +993,29 @@
     base::ResetAndReturn(&callback_).Run(this, result.rv, response);
   }
 
+  bool IsHostInDnsOverHttpsServerList(const std::string& host) const {
+    for (const auto& server : session_->config().dns_over_https_servers) {
+      if (host == server.server.host_piece())
+        return true;
+    }
+    return false;
+  }
+
+  AttemptResult MakeAttempt() {
+    // Make an HTTP attempt unless we have already made more attempts
+    // than we have configured servers. Otherwise make a UDP attempt
+    // as long as we have configured nameservers.
+    DnsConfig config = session_->config();
+    if (doh_attempts_ < config.dns_over_https_servers.size())
+      return MakeHTTPAttempt(config.dns_over_https_servers);
+    DCHECK_GT(config.nameservers.size(), 0u);
+    return MakeUDPAttempt();
+  }
+
   // Makes another attempt at the current name, |qnames_.front()|, using the
   // next nameserver.
-  AttemptResult MakeAttempt() {
+  AttemptResult MakeUDPAttempt() {
+    doh_attempt_ = false;
     unsigned attempt_number = attempts_.size();
 
     uint16_t id = session_->NextQueryId();
@@ -770,18 +1028,19 @@
 
     const DnsConfig& config = session_->config();
 
-    unsigned server_index =
-        (first_server_index_ + attempt_number) % config.nameservers.size();
+    unsigned non_doh_server_index =
+        (first_server_index_ + attempt_number - doh_attempts_) %
+        config.nameservers.size();
     // Skip over known failed servers.
-    server_index = session_->NextGoodServerIndex(server_index);
+    non_doh_server_index = session_->NextGoodServerIndex(non_doh_server_index);
 
     std::unique_ptr<DnsSession::SocketLease> lease =
-        session_->AllocateSocket(server_index, net_log_.source());
+        session_->AllocateSocket(non_doh_server_index, net_log_.source());
 
     bool got_socket = !!lease.get();
 
-    DnsUDPAttempt* attempt =
-        new DnsUDPAttempt(server_index, std::move(lease), std::move(query));
+    DnsUDPAttempt* attempt = new DnsUDPAttempt(
+        non_doh_server_index, std::move(lease), std::move(query));
 
     attempts_.push_back(base::WrapUnique(attempt));
     ++attempts_count_;
@@ -793,18 +1052,55 @@
         NetLogEventType::DNS_TRANSACTION_ATTEMPT,
         attempt->GetSocketNetLog().source().ToEventParametersCallback());
 
-    int rv = attempt->Start(
-        base::Bind(&DnsTransactionImpl::OnUdpAttemptComplete,
-                   base::Unretained(this), attempt_number,
-                   base::TimeTicks::Now()));
+    int rv = attempt->Start(base::Bind(
+        &DnsTransactionImpl::OnUdpAttemptComplete, base::Unretained(this),
+        attempt_number, base::TimeTicks::Now()));
     if (rv == ERR_IO_PENDING) {
-      base::TimeDelta timeout = session_->NextTimeout(server_index,
-                                                      attempt_number);
+      base::TimeDelta timeout =
+          session_->NextTimeout(non_doh_server_index, attempt_number);
       timer_.Start(FROM_HERE, timeout, this, &DnsTransactionImpl::OnTimeout);
     }
     return AttemptResult(rv, attempt);
   }
 
+  AttemptResult MakeHTTPAttempt(
+      const std::vector<DnsConfig::DnsOverHttpsServerConfig>& servers) {
+    doh_attempt_ = true;
+    unsigned attempt_number = attempts_.size();
+    uint16_t id = session_->NextQueryId();
+    std::unique_ptr<DnsQuery> query;
+    if (attempts_.empty()) {
+      query.reset(new DnsQuery(id, qnames_.front(), qtype_, opt_rdata_));
+    } else {
+      query = attempts_[0]->GetQuery()->CloneWithNewId(id);
+    }
+    // doh_attempts_ counts the number of attempts made via HTTPS. To
+    // get a server index cap that by the number of DoH servers we
+    // have configured and then offset it by the number of non-doh
+    // servers we have configured since they come first in the server
+    // stats list.
+    unsigned server_index = session_->NextGoodDnsOverHttpsServerIndex(
+        (doh_attempts_ % session_->config().dns_over_https_servers.size()) +
+        session_->config().nameservers.size());
+
+    attempts_.push_back(std::make_unique<DnsHTTPAttempt>(
+        server_index, std::move(query),
+        servers[server_index - session_->config().nameservers.size()].server,
+        servers[server_index - session_->config().nameservers.size()].use_post,
+        url_request_context_, request_priority_));
+    ++doh_attempts_;
+    ++attempts_count_;
+    // Check that we're not looking one of the DNS over HTTPS servers.
+    if (IsHostInDnsOverHttpsServerList(DNSDomainToString(qnames_.front()))) {
+      static_cast<DnsHTTPAttempt*>(attempts_.back().get())->Cancel();
+      return AttemptResult(ERR_CONNECTION_REFUSED, attempts_.back().get());
+    }
+    int rv = attempts_.back()->Start(
+        base::Bind(&DnsTransactionImpl::OnAttemptComplete,
+                   base::Unretained(this), attempt_number));
+    return AttemptResult(rv, attempts_.back().get());
+  }
+
   AttemptResult MakeTCPAttempt(const DnsAttempt* previous_attempt) {
     DCHECK(previous_attempt);
     DCHECK(!had_tcp_attempt_);
@@ -844,8 +1140,7 @@
         attempt->GetSocketNetLog().source().ToEventParametersCallback());
 
     int rv = attempt->Start(base::Bind(&DnsTransactionImpl::OnAttemptComplete,
-                                       base::Unretained(this),
-                                       attempt_number));
+                                       base::Unretained(this), attempt_number));
     if (rv == ERR_IO_PENDING) {
       // Custom timeout for TCP attempt.
       base::TimeDelta timeout = timer_.GetCurrentDelay() * 2;
@@ -860,7 +1155,9 @@
     net_log_.BeginEvent(NetLogEventType::DNS_TRANSACTION_QUERY,
                         NetLog::StringCallback("qname", &dotted_qname));
 
-    first_server_index_ = session_->NextFirstServerIndex();
+    first_server_index_ = session_->config().nameservers.empty()
+                              ? 0
+                              : session_->NextFirstServerIndex();
     RecordLostPacketsIfAny();
     attempts_.clear();
     had_tcp_attempt_ = false;
@@ -894,7 +1191,7 @@
     // Loop through attempts until we find first that is completed
     size_t first_completed = 0;
     for (first_completed = 0; first_completed < attempts_.size();
-        ++first_completed) {
+         ++first_completed) {
       if (attempts_[first_completed]->is_completed())
         break;
     }
@@ -903,7 +1200,8 @@
     if (first_completed == attempts_.size())
       return;
 
-    size_t num_servers = session_->config().nameservers.size();
+    size_t num_servers = session_->config().nameservers.size() +
+                         session_->config().dns_over_https_servers.size();
     std::vector<int> server_attempts(num_servers);
     for (size_t i = 0; i < first_completed; ++i) {
       unsigned server_index = attempts_[i]->server_index();
@@ -927,7 +1225,8 @@
     if (had_tcp_attempt_)
       return false;
     const DnsConfig& config = session_->config();
-    return attempts_.size() < config.attempts * config.nameservers.size();
+    return attempts_.size() < config.attempts * config.nameservers.size() +
+                                  config.dns_over_https_servers.size();
   }
 
   // Resolves the result of a DnsAttempt until a terminal result is reached
@@ -938,7 +1237,8 @@
 
       switch (result.rv) {
         case OK:
-          session_->RecordServerSuccess(result.attempt->server_index());
+          if (!doh_attempt_)
+            session_->RecordServerSuccess(result.attempt->server_index());
           net_log_.EndEventWithNetErrorCode(
               NetLogEventType::DNS_TRANSACTION_QUERY, result.rv);
           DCHECK(result.attempt);
@@ -984,9 +1284,9 @@
           if (MoreAttemptsAllowed()) {
             result = MakeAttempt();
           } else if (result.rv == ERR_DNS_MALFORMED_RESPONSE &&
-                     !had_tcp_attempt_) {
-            // For UDP only, ignore the response and wait until the last attempt
-            // times out.
+                     !had_tcp_attempt_ && !doh_attempt_) {
+            // For UDP only, ignore the response and wait until the last
+            // attempt times out.
             return AttemptResult(ERR_IO_PENDING, NULL);
           } else {
             return AttemptResult(result.rv, NULL);
@@ -1023,14 +1323,19 @@
   // List of attempts for the current name.
   std::vector<std::unique_ptr<DnsAttempt>> attempts_;
   // Count of attempts, not reset when |attempts_| vector is cleared.
-  int  attempts_count_;
+  int attempts_count_;
+  uint16_t doh_attempts_;
   bool had_tcp_attempt_;
+  bool doh_attempt_;
 
   // Index of the first server to try on each search query.
   int first_server_index_;
 
   base::OneShotTimer timer_;
 
+  URLRequestContext* url_request_context_;
+  RequestPriority request_priority_;
+
   THREAD_CHECKER(thread_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(DnsTransactionImpl);
diff --git a/net/dns/dns_transaction.h b/net/dns/dns_transaction.h
index 5f6cd0a5c..11d8531c 100644
--- a/net/dns/dns_transaction.h
+++ b/net/dns/dns_transaction.h
@@ -10,16 +10,16 @@
 #include <memory>
 #include <string>
 
-#include "base/callback_forward.h"
-#include "base/compiler_specific.h"
-#include "net/base/net_export.h"
+#include "net/base/request_priority.h"
 #include "net/dns/record_rdata.h"
+#include "url/gurl.h"
 
 namespace net {
 
 class DnsResponse;
 class DnsSession;
 class NetLogWithSource;
+class URLRequestContext;
 
 // DnsTransaction implements a stub DNS resolver as defined in RFC 1034.
 // The DnsTransaction takes care of retransmissions, name server fallback (or
@@ -39,6 +39,10 @@
 
   // Starts the transaction.  Always completes asynchronously.
   virtual void Start() = 0;
+
+  virtual void SetRequestContext(URLRequestContext*) = 0;
+
+  virtual void SetRequestPriority(RequestPriority priority) = 0;
 };
 
 // Creates DnsTransaction which performs asynchronous DNS search.
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index ce7bea0..f61f0ff 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -9,15 +9,22 @@
 #include <limits>
 #include <utility>
 
+#include "base/base64url.h"
 #include "base/bind.h"
 #include "base/containers/circular_deque.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/sys_byteorder.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "net/base/ip_address.h"
+#include "net/base/port_util.h"
+#include "net/base/upload_bytes_element_reader.h"
+#include "net/base/url_util.h"
 #include "net/dns/dns_protocol.h"
 #include "net/dns/dns_query.h"
 #include "net/dns/dns_response.h"
@@ -25,9 +32,14 @@
 #include "net/dns/dns_test_util.h"
 #include "net/dns/dns_util.h"
 #include "net/log/net_log_with_source.h"
+#include "net/proxy_resolution/proxy_config_service_fixed.h"
 #include "net/socket/socket_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/net_test_suite.h"
+#include "net/test/url_request/url_request_failed_job.h"
+#include "net/url_request/url_request_filter.h"
+#include "net/url_request/url_request_interceptor.h"
+#include "net/url_request/url_request_test_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -35,18 +47,20 @@
 
 namespace net {
 
-class NetLog;
-
 namespace {
 
 base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1);
 
+const char kMockHostname[] = "mock.http";
+
 std::string DomainFromDot(const base::StringPiece& dotted) {
   std::string out;
   EXPECT_TRUE(DNSDomainFromDot(dotted, &out));
   return out;
 }
 
+enum class Transport { UDP, TCP, HTTPS };
+
 // A SocketDataProvider builder.
 class DnsSocketData {
  public:
@@ -55,11 +69,11 @@
                 const char* dotted_name,
                 uint16_t qtype,
                 IoMode mode,
-                bool use_tcp,
+                Transport transport,
                 const OptRecordRdata* opt_rdata = nullptr)
       : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype, opt_rdata)),
-        use_tcp_(use_tcp) {
-    if (use_tcp_) {
+        transport_(transport) {
+    if (Transport::TCP == transport_) {
       std::unique_ptr<uint16_t> length(new uint16_t);
       *length = base::HostToNet16(query_->io_buffer()->size());
       writes_.push_back(MockWrite(mode,
@@ -80,7 +94,7 @@
                              IoMode mode,
                              uint16_t tcp_length) {
     CHECK(!provider_.get());
-    if (use_tcp_) {
+    if (Transport::TCP == transport_) {
       std::unique_ptr<uint16_t> length(new uint16_t);
       *length = base::HostToNet16(tcp_length);
       reads_.push_back(MockRead(mode,
@@ -89,14 +103,14 @@
       lengths_.push_back(std::move(length));
     }
     reads_.push_back(MockRead(mode, response->io_buffer()->data(),
-                              response->io_buffer()->size(),
+                              response->io_buffer_size(),
                               num_reads_and_writes()));
     responses_.push_back(std::move(response));
   }
 
   // Adds pre-built DnsResponse.
   void AddResponse(std::unique_ptr<DnsResponse> response, IoMode mode) {
-    uint16_t tcp_length = response->io_buffer()->size();
+    uint16_t tcp_length = response->io_buffer_size();
     AddResponseWithLength(std::move(response), mode, tcp_length);
   }
 
@@ -108,6 +122,18 @@
                 mode);
   }
 
+  // Adds pre-built response from |data| buffer.
+  void AddResponseData(const uint8_t* data,
+                       size_t length,
+                       int offset,
+                       IoMode mode) {
+    CHECK(!provider_.get());
+    AddResponse(
+        std::make_unique<DnsResponse>(reinterpret_cast<const char*>(data),
+                                      length - offset, offset),
+        mode);
+  }
+
   // Add no-answer (RCODE only) response matching the query.
   void AddRcode(int rcode, IoMode mode) {
     std::unique_ptr<DnsResponse> response(new DnsResponse(
@@ -130,11 +156,13 @@
       return provider_.get();
     // Terminate the reads with ERR_IO_PENDING to prevent overrun and default to
     // timeout.
-    reads_.push_back(
-        MockRead(SYNCHRONOUS, ERR_IO_PENDING, writes_.size() + reads_.size()));
+    if (transport_ != Transport::HTTPS) {
+      reads_.push_back(MockRead(SYNCHRONOUS, ERR_IO_PENDING,
+                                writes_.size() + reads_.size()));
+    }
     provider_.reset(new SequencedSocketData(&reads_[0], reads_.size(),
                                             &writes_[0], writes_.size()));
-    if (use_tcp_) {
+    if (Transport::TCP == transport_ || Transport::HTTPS == transport_) {
       provider_->set_connect_data(MockConnect(reads_[0].mode, OK));
     }
     return provider_.get();
@@ -142,11 +170,13 @@
 
   uint16_t query_id() const { return query_->id(); }
 
+  IOBufferWithSize* query_buffer() { return query_->io_buffer(); }
+
  private:
   size_t num_reads_and_writes() const { return reads_.size() + writes_.size(); }
 
   std::unique_ptr<DnsQuery> query_;
-  bool use_tcp_;
+  Transport transport_;
   std::vector<std::unique_ptr<uint16_t>> lengths_;
   std::vector<std::unique_ptr<DnsResponse>> responses_;
   std::vector<MockWrite> writes_;
@@ -255,6 +285,8 @@
         hostname_, qtype_, base::Bind(&TransactionHelper::OnTransactionComplete,
                                       base::Unretained(this)),
         NetLogWithSource());
+    transaction_->SetRequestContext(&request_context_);
+    transaction_->SetRequestPriority(DEFAULT_PRIORITY);
     EXPECT_EQ(hostname_, transaction_->GetHostname());
     EXPECT_EQ(qtype_, transaction_->GetType());
     transaction_->Start();
@@ -273,6 +305,9 @@
 
     completed_ = true;
 
+    if (transaction_complete_run_loop_)
+      transaction_complete_run_loop_->QuitWhenIdle();
+
     if (cancel_in_callback_) {
       Cancel();
       return;
@@ -307,6 +342,15 @@
     return has_completed();
   }
 
+  bool RunUntilDone(DnsTransactionFactory* factory) {
+    DCHECK(!transaction_complete_run_loop_);
+    transaction_complete_run_loop_ = std::make_unique<base::RunLoop>();
+    StartTransaction(factory);
+    transaction_complete_run_loop_->Run();
+    transaction_complete_run_loop_.reset();
+    return has_completed();
+  }
+
   bool FastForwardByTimeout(DnsSession* session,
                             unsigned server_index,
                             int attempt) {
@@ -320,16 +364,194 @@
     return has_completed();
   }
 
+  TestURLRequestContext* request_context() { return &request_context_; }
+
  private:
   std::string hostname_;
   uint16_t qtype_;
   std::unique_ptr<DnsTransaction> transaction_;
   int expected_answer_count_;
   bool cancel_in_callback_;
-
+  TestURLRequestContext request_context_;
+  std::unique_ptr<base::RunLoop> transaction_complete_run_loop_;
   bool completed_;
 };
 
+// Callback that allows a test to modify HttpResponseinfo
+// before the response is sent to the requester. This allows
+// response headers to be changed.
+typedef base::RepeatingCallback<void(URLRequest* request,
+                                     HttpResponseInfo* info)>
+    ResponseModifierCallback;
+
+// Callback that allows the test to substiture its own implementation
+// of URLRequestJob to handle the request.
+typedef base::RepeatingCallback<URLRequestJob*(
+    URLRequest* request,
+    NetworkDelegate* network_delegate,
+    SocketDataProvider* data_provider)>
+    DohJobMakerCallback;
+
+// Subclass of URLRequest which takes a SocketDataProvider with data
+// representing both a DNS over HTTPS query and response.
+class URLRequestMockDohJob : public URLRequestJob, public AsyncSocket {
+ public:
+  URLRequestMockDohJob(
+      URLRequest* request,
+      NetworkDelegate* network_delegate,
+      SocketDataProvider* data_provider,
+      ResponseModifierCallback response_modifier = ResponseModifierCallback())
+      : URLRequestJob(request, network_delegate),
+        content_length_(0),
+        leftover_data_len_(0),
+        data_provider_(data_provider),
+        response_modifier_(response_modifier),
+        weak_factory_(this) {
+    data_provider_->Initialize(this);
+    MatchQueryData(request, data_provider);
+  }
+
+  // Compare the query contained in either the POST body or the body
+  // parameter of the GET query to the write data of the SocketDataProvider.
+  static void MatchQueryData(URLRequest* request,
+                             SocketDataProvider* data_provider) {
+    std::string decoded_query;
+    if (request->method() == "GET") {
+      std::string encoded_query;
+      EXPECT_TRUE(
+          GetValueForKeyInQuery(request->url(), "body", &encoded_query));
+      EXPECT_GT(encoded_query.size(), 0ul);
+
+      EXPECT_TRUE(base::Base64UrlDecode(
+          encoded_query, base::Base64UrlDecodePolicy::IGNORE_PADDING,
+          &decoded_query));
+    } else if (request->method() == "POST") {
+      const UploadDataStream* stream = request->get_upload();
+      auto* readers = stream->GetElementReaders();
+      EXPECT_TRUE(readers);
+      EXPECT_FALSE(readers->empty());
+      for (auto& reader : *readers) {
+        const UploadBytesElementReader* byte_reader = reader->AsBytesReader();
+        decoded_query +=
+            std::string(byte_reader->bytes(), byte_reader->length());
+      }
+    }
+
+    std::string query(decoded_query);
+    MockWriteResult result(SYNCHRONOUS, 1);
+    while (result.result > 0 && query.length() > 0) {
+      result = data_provider->OnWrite(query);
+      if (result.result > 0)
+        query = query.substr(result.result);
+    }
+  }
+
+  static GURL GetMockHttpsUrl(const std::string& path) {
+    return GURL("https://" + (kMockHostname + ("/" + path)));
+  }
+
+  // URLRequestJob implementation:
+  void Start() override {
+    // Start reading asynchronously so that all error reporting and data
+    // callbacks happen as they would for network requests.
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::Bind(&URLRequestMockDohJob::StartAsync,
+                              weak_factory_.GetWeakPtr()));
+  }
+
+  ~URLRequestMockDohJob() override {
+    if (data_provider_)
+      data_provider_->DetachSocket();
+  }
+
+  int ReadRawData(IOBuffer* buf, int buf_size) override {
+    if (!data_provider_)
+      return ERR_FAILED;
+    if (leftover_data_len_ > 0) {
+      int rv = DoBufferCopy(leftover_data_, leftover_data_len_, buf, buf_size);
+      return rv;
+    }
+
+    if (data_provider_->AllReadDataConsumed())
+      return 0;
+
+    MockRead read = data_provider_->OnRead();
+
+    if (read.result < ERR_IO_PENDING)
+      return read.result;
+
+    if (read.result == ERR_IO_PENDING) {
+      pending_buf_ = buf;
+      pending_buf_size_ = buf_size;
+      return ERR_IO_PENDING;
+    }
+    return DoBufferCopy(read.data, read.data_len, buf, buf_size);
+  }
+
+  void GetResponseInfo(HttpResponseInfo* info) override {
+    // Send back mock headers.
+    std::string raw_headers;
+    raw_headers.append(
+        "HTTP/1.1 200 OK\n"
+        "Content-type: application/dns-udpwireformat\n");
+    if (content_length_ > 0) {
+      raw_headers.append(base::StringPrintf("Content-Length: %1d\n",
+                                            static_cast<int>(content_length_)));
+    }
+    info->headers =
+        base::MakeRefCounted<HttpResponseHeaders>(HttpUtil::AssembleRawHeaders(
+            raw_headers.c_str(), static_cast<int>(raw_headers.length())));
+    if (response_modifier_)
+      response_modifier_.Run(request(), info);
+  }
+
+  // AsyncSocket implementation:
+  void OnReadComplete(const MockRead& data) override {
+    EXPECT_NE(data.result, ERR_IO_PENDING);
+    if (data.result < 0)
+      return ReadRawDataComplete(data.result);
+    ReadRawDataComplete(DoBufferCopy(data.data, data.data_len, pending_buf_,
+                                     pending_buf_size_));
+  }
+  void OnWriteComplete(int rv) override {}
+  void OnConnectComplete(const MockConnect& data) override {}
+  void OnDataProviderDestroyed() override { data_provider_ = nullptr; }
+
+ private:
+  void StartAsync() {
+    if (!request_)
+      return;
+    if (content_length_)
+      set_expected_content_size(content_length_);
+    NotifyHeadersComplete();
+  }
+
+  int DoBufferCopy(const char* data,
+                   int data_len,
+                   IOBuffer* buf,
+                   int buf_size) {
+    if (data_len > buf_size) {
+      memcpy(buf->data(), data, buf_size);
+      leftover_data_ = data + buf_size;
+      leftover_data_len_ = data_len - buf_size;
+      return buf_size;
+    }
+    memcpy(buf->data(), data, data_len);
+    return data_len;
+  }
+
+  const int content_length_;
+  const char* leftover_data_;
+  int leftover_data_len_;
+  SocketDataProvider* data_provider_;
+  const ResponseModifierCallback response_modifier_;
+  IOBuffer* pending_buf_;
+  int pending_buf_size_;
+  DISALLOW_COPY_AND_ASSIGN(URLRequestMockDohJob);
+
+  base::WeakPtrFactory<URLRequestMockDohJob> weak_factory_;
+};
+
 class DnsTransactionTest : public testing::Test {
  public:
   DnsTransactionTest() = default;
@@ -344,6 +566,96 @@
     }
   }
 
+  // Generates |nameservers| for DnsConfig.
+  void ConfigureDohServers(unsigned num_servers, bool use_post) {
+    CHECK_LE(num_servers, 255u);
+    for (unsigned i = 0; i < num_servers; ++i) {
+      GURL url(URLRequestMockDohJob::GetMockHttpsUrl(
+          base::StringPrintf("doh_test_%d", i)));
+      config_.dns_over_https_servers.push_back(
+          DnsConfig::DnsOverHttpsServerConfig(url, use_post));
+    }
+  }
+
+  // Configures the DnsConfig with one dns over https server, which either
+  // accepts GET or POST requests based on use_post. If |clear_udp| is true,
+  // existing IP name servers are removed from the DnsConfig. If a
+  // ResponseModifierCallback is provided it will be called to contruct the
+  // HTTPResponse.
+  void ConfigDohServers(bool clear_udp,
+                        bool use_post,
+                        int num_doh_servers = 1) {
+    if (clear_udp)
+      ConfigureNumServers(0);
+    NetTestSuite::SetScopedTaskEnvironment(
+        base::test::ScopedTaskEnvironment::MainThreadType::IO);
+    GURL url(URLRequestMockDohJob::GetMockHttpsUrl("doh_test"));
+    URLRequestFilter* filter = URLRequestFilter::GetInstance();
+    filter->AddHostnameInterceptor(url.scheme(), url.host(),
+                                   std::make_unique<DohJobInterceptor>(this));
+    ConfigureDohServers(num_doh_servers, use_post);
+    ConfigureFactory();
+  }
+
+  URLRequestJob* MaybeInterceptRequest(URLRequest* request,
+                                       NetworkDelegate* network_delegate) {
+    // If the path indicates a redirct, skip checking the list of
+    // configured servers, because it won't be there and we still want
+    // to handle it.
+    bool server_found = request->url().path() == "/redirect-destination";
+    for (auto server : config_.dns_over_https_servers) {
+      if (server_found)
+        break;
+      GURL url(request->url());
+      GURL server_url = server.server;
+      if (url.has_query()) {
+        server_url = GURL(server_url.spec() + "?" + url.query());
+      }
+      if (server_url == url) {
+        EXPECT_TRUE((server.use_post ? "POST" : "GET") == request->method());
+        server_found = true;
+      }
+    }
+    EXPECT_TRUE(server_found);
+
+    HttpRequestHeaders* headers = nullptr;
+    if (request->GetFullRequestHeaders(headers)) {
+      EXPECT_FALSE(headers->HasHeader(HttpRequestHeaders::kCookie));
+    }
+    EXPECT_FALSE(request->extra_request_headers().HasHeader(
+        HttpRequestHeaders::kCookie));
+
+    std::string accept;
+    EXPECT_TRUE(request->extra_request_headers().GetHeader("Accept", &accept));
+    EXPECT_EQ(accept, "application/dns-udpwireformat");
+
+    SocketDataProvider* provider = socket_factory_->mock_data().GetNext();
+
+    if (doh_job_maker_)
+      return doh_job_maker_.Run(request, network_delegate, provider);
+
+    return new URLRequestMockDohJob(request, network_delegate, provider,
+                                    response_modifier_);
+  }
+
+  class DohJobInterceptor : public URLRequestInterceptor {
+   public:
+    explicit DohJobInterceptor(DnsTransactionTest* test) : test_(test) {}
+    ~DohJobInterceptor() override {}
+
+    // URLRequestInterceptor implementation:
+    URLRequestJob* MaybeInterceptRequest(
+        URLRequest* request,
+        NetworkDelegate* network_delegate) const override {
+      return test_->MaybeInterceptRequest(request, network_delegate);
+    }
+
+   private:
+    DnsTransactionTest* test_;
+
+    DISALLOW_COPY_AND_ASSIGN(DohJobInterceptor);
+  };
+
   // Called after fully configuring |config|.
   void ConfigureFactory() {
     socket_factory_.reset(new TestSocketFactory());
@@ -371,23 +683,36 @@
                            const uint8_t* response_data,
                            size_t response_length,
                            IoMode mode,
-                           bool use_tcp,
+                           Transport transport,
                            const OptRecordRdata* opt_rdata = nullptr) {
     CHECK(socket_factory_.get());
     std::unique_ptr<DnsSocketData> data(
-        new DnsSocketData(id, dotted_name, qtype, mode, use_tcp, opt_rdata));
+        new DnsSocketData(id, dotted_name, qtype, mode, transport, opt_rdata));
     data->AddResponseData(response_data, response_length, mode);
     AddSocketData(std::move(data));
   }
 
+  void AddQueryAndErrorResponse(uint16_t id,
+                                const char* dotted_name,
+                                uint16_t qtype,
+                                int error,
+                                IoMode mode,
+                                Transport transport) {
+    CHECK(socket_factory_.get());
+    std::unique_ptr<DnsSocketData> data(
+        new DnsSocketData(id, dotted_name, qtype, mode, transport));
+    data->AddReadError(error, mode);
+    AddSocketData(std::move(data));
+  }
+
   void AddAsyncQueryAndResponse(uint16_t id,
                                 const char* dotted_name,
                                 uint16_t qtype,
                                 const uint8_t* data,
                                 size_t data_length,
                                 const OptRecordRdata* opt_rdata = nullptr) {
-    AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC, false,
-                        opt_rdata);
+    AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC,
+                        Transport::UDP, opt_rdata);
   }
 
   void AddSyncQueryAndResponse(uint16_t id,
@@ -397,14 +722,14 @@
                                size_t data_length,
                                const OptRecordRdata* opt_rdata = nullptr) {
     AddQueryAndResponse(id, dotted_name, qtype, data, data_length, SYNCHRONOUS,
-                        false, opt_rdata);
+                        Transport::UDP, opt_rdata);
   }
 
   // Add expected query of |dotted_name| and |qtype| and no response.
   void AddQueryAndTimeout(const char* dotted_name, uint16_t qtype) {
     uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max());
     std::unique_ptr<DnsSocketData> data(
-        new DnsSocketData(id, dotted_name, qtype, ASYNC, false));
+        new DnsSocketData(id, dotted_name, qtype, ASYNC, Transport::UDP));
     AddSocketData(std::move(data));
   }
 
@@ -414,11 +739,11 @@
                         uint16_t qtype,
                         int rcode,
                         IoMode mode,
-                        bool use_tcp) {
+                        Transport trans) {
     CHECK_NE(dns_protocol::kRcodeNOERROR, rcode);
     uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max());
     std::unique_ptr<DnsSocketData> data(
-        new DnsSocketData(id, dotted_name, qtype, mode, use_tcp));
+        new DnsSocketData(id, dotted_name, qtype, mode, trans));
     data->AddRcode(rcode, mode);
     AddSocketData(std::move(data));
   }
@@ -426,13 +751,13 @@
   void AddAsyncQueryAndRcode(const char* dotted_name,
                              uint16_t qtype,
                              int rcode) {
-    AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, false);
+    AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, Transport::UDP);
   }
 
   void AddSyncQueryAndRcode(const char* dotted_name,
                             uint16_t qtype,
                             int rcode) {
-    AddQueryAndRcode(dotted_name, qtype, rcode, SYNCHRONOUS, false);
+    AddQueryAndRcode(dotted_name, qtype, rcode, SYNCHRONOUS, Transport::UDP);
   }
 
   // Checks if the sockets were connected in the order matching the indices in
@@ -448,6 +773,7 @@
   void SetUp() override {
     NetTestSuite::SetScopedTaskEnvironment(
         base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME);
+
     // By default set one server,
     ConfigureNumServers(1);
     // and no retransmissions,
@@ -459,12 +785,25 @@
 
   void TearDown() override {
     // Check that all socket data was at least written to.
+    if (base::MessageLoop::current() &&
+        base::MessageLoop::current()->IsType(base::MessageLoop::TYPE_IO)) {
+      URLRequestFilter* filter = URLRequestFilter::GetInstance();
+      filter->ClearHandlers();
+    }
     for (size_t i = 0; i < socket_data_.size(); ++i) {
       EXPECT_TRUE(socket_data_[i]->GetProvider()->AllWriteDataConsumed()) << i;
     }
     NetTestSuite::ResetScopedTaskEnvironment();
   }
 
+  void SetResponseModifierCallback(ResponseModifierCallback response_modifier) {
+    response_modifier_ = response_modifier;
+  }
+
+  void SetDohJobMakerCallback(DohJobMakerCallback doh_job_maker) {
+    doh_job_maker_ = doh_job_maker;
+  }
+
  protected:
   int GetNextId(int min, int max) {
     EXPECT_FALSE(transaction_ids_.empty());
@@ -483,6 +822,9 @@
   std::unique_ptr<TestSocketFactory> socket_factory_;
   scoped_refptr<DnsSession> session_;
   std::unique_ptr<DnsTransactionFactory> transaction_factory_;
+
+  ResponseModifierCallback response_modifier_;
+  DohJobMakerCallback doh_job_maker_;
 };
 
 TEST_F(DnsTransactionTest, Lookup) {
@@ -597,8 +939,8 @@
   ConfigureFactory();
 
   // Attempt receives mismatched response followed by valid response.
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
   data->AddResponseData(kT1ResponseDatagram,
                         arraysize(kT1ResponseDatagram), SYNCHRONOUS);
   data->AddResponseData(kT0ResponseDatagram,
@@ -615,8 +957,8 @@
 
   // First attempt receives mismatched response followed by valid response.
   // Second attempt times out.
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, false));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::UDP));
   data->AddResponseData(kT1ResponseDatagram,
                         arraysize(kT1ResponseDatagram), ASYNC);
   data->AddResponseData(kT0ResponseDatagram,
@@ -648,8 +990,8 @@
   // First attempt receives mismatched response followed by valid NXDOMAIN
   // response.
   // Second attempt receives valid NXDOMAIN response.
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
   data->AddResponseData(kT1ResponseDatagram, arraysize(kT1ResponseDatagram),
                         SYNCHRONOUS);
   data->AddRcode(dns_protocol::kRcodeNXDOMAIN, ASYNC);
@@ -938,12 +1280,549 @@
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
 }
 
+TEST_F(DnsTransactionTest, HttpsGetLookup) {
+  ConfigDohServers(true /* clear_udp */, false /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsGetFailure) {
+  ConfigDohServers(true /* clear_udp */, false /* use_post */);
+  AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL,
+                   SYNCHRONOUS, Transport::HTTPS);
+
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_SERVER_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsGetMalformed) {
+  ConfigDohServers(true /* clear_udp */, false /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  std::unique_ptr<DnsResponse> response = std::make_unique<DnsResponse>(
+      reinterpret_cast<const char*>(kT0ResponseDatagram),
+      arraysize(kT0ResponseDatagram), 0);
+  // Change the id of the header to make the response malformed.
+  response->io_buffer()->data()[0]++;
+  data->AddResponse(std::move(response), SYNCHRONOUS);
+  AddSocketData(std::move(data));
+
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookup) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailure) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL,
+                   SYNCHRONOUS, Transport::HTTPS);
+
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_SERVER_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostMalformed) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  std::unique_ptr<DnsResponse> response = std::make_unique<DnsResponse>(
+      reinterpret_cast<const char*>(kT0ResponseDatagram),
+      arraysize(kT0ResponseDatagram), 0);
+  // Change the id of the header to make the response malformed.
+  response->io_buffer()->data()[0]++;
+  data->AddResponse(std::move(response), SYNCHRONOUS);
+  AddSocketData(std::move(data));
+
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupAsync) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+URLRequestJob* DohJobMakerCallbackFailStart(URLRequest* request,
+                                            NetworkDelegate* network_delegate,
+                                            SocketDataProvider* data) {
+  URLRequestMockDohJob::MatchQueryData(request, data);
+  return new URLRequestFailedJob(request, network_delegate,
+                                 URLRequestFailedJob::START, ERR_FAILED);
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupFailStart) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailStart));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+URLRequestJob* DohJobMakerCallbackFailSync(URLRequest* request,
+                                           NetworkDelegate* network_delegate,
+                                           SocketDataProvider* data) {
+  URLRequestMockDohJob::MatchQueryData(request, data);
+  return new URLRequestFailedJob(request, network_delegate,
+                                 URLRequestFailedJob::READ_SYNC, ERR_FAILED);
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupFailSync) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseWithLength(std::make_unique<DnsResponse>(), SYNCHRONOUS, 0);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailSync));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+URLRequestJob* DohJobMakerCallbackFailAsync(URLRequest* request,
+                                            NetworkDelegate* network_delegate,
+                                            SocketDataProvider* data) {
+  URLRequestMockDohJob::MatchQueryData(request, data);
+  return new URLRequestFailedJob(request, network_delegate,
+                                 URLRequestFailedJob::READ_ASYNC, ERR_FAILED);
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupFailAsync) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailAsync));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookup2Sync) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
+  data->AddResponseData(kT0ResponseDatagram + 20,
+                        arraysize(kT0ResponseDatagram) - 20, SYNCHRONOUS);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookup2Async) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
+  data->AddResponseData(kT0ResponseDatagram + 20,
+                        arraysize(kT0ResponseDatagram) - 20, ASYNC);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupAsyncWithAsyncZeroRead) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, arraysize(kT0ResponseDatagram),
+                        ASYNC);
+  data->AddResponseData(kT0ResponseDatagram, 0, ASYNC);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupSyncWithAsyncZeroRead) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, arraysize(kT0ResponseDatagram),
+                        SYNCHRONOUS);
+  data->AddResponseData(kT0ResponseDatagram, 0, ASYNC);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSync) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
+  data->AddResponseData(kT0ResponseDatagram + 20,
+                        arraysize(kT0ResponseDatagram) - 20, SYNCHRONOUS);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenSyncError) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
+  data->AddReadError(ERR_FAILED, SYNCHRONOUS);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupAsyncThenAsyncError) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, ASYNC);
+  data->AddReadError(ERR_FAILED, ASYNC);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupSyncThenAsyncError) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
+  data->AddReadError(ERR_FAILED, ASYNC);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostLookupSyncThenSyncError) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::HTTPS));
+  data->AddResponseData(kT0ResponseDatagram, 20, SYNCHRONOUS);
+  data->AddReadError(ERR_FAILED, SYNCHRONOUS);
+  AddSocketData(std::move(data));
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailThenUDPFallback) {
+  config_.attempts = 2;
+  ConfigDohServers(false /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::UDP);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailStart));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailThenUDPFailThenUDPFallback) {
+  ConfigureNumServers(3);
+  ConfigDohServers(false /* clear_udp */, true /* use_post */);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailStart));
+
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndTimeout(kT0HostName, kT0Qtype);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::UDP);
+
+  transaction_ids_.push_back(0);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+
+  // Servers 3 (HTTP) and 0 (UDP) should be marked as bad. 1 and 2 should be
+  // good.
+  EXPECT_EQ(session_->NextGoodServerIndex(0), 1u);
+  EXPECT_EQ(session_->NextGoodServerIndex(1), 1u);
+  EXPECT_EQ(session_->NextGoodServerIndex(2), 2u);
+}
+
+TEST_F(DnsTransactionTest, HttpsMarkUdpBad) {
+  config_.attempts = 1;
+  ConfigureNumServers(2);
+  ConfigDohServers(false /* clear_udp */, true /* use_post */);
+  AddQueryAndErrorResponse(0, kT0HostName, kT0Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+  AddQueryAndErrorResponse(0, kT0HostName, kT0Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::UDP);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::UDP);
+
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+  // Server 0 (UDP) should be marked bad. Server 1 (UDP) should be good
+  // and since 2 is our only Doh server, it will be good.
+  EXPECT_EQ(session_->NextGoodServerIndex(0), 1u);
+  EXPECT_EQ(session_->NextGoodServerIndex(1), 1u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(2), 2u);
+
+  AddQueryAndErrorResponse(1, kT1HostName, kT1Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+  AddQueryAndErrorResponse(1, kT1HostName, kT1Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::UDP);
+
+  AddQueryAndResponse(1, kT1HostName, kT1Qtype, kT1ResponseDatagram,
+                      arraysize(kT1ResponseDatagram), ASYNC, Transport::UDP);
+
+  TransactionHelper helper1(kT1HostName, kT1Qtype, kT1RecordCount);
+  EXPECT_TRUE(helper1.RunUntilDone(transaction_factory_.get()));
+  // Since 0 was bad to start, we started with 1 which will now be the
+  // most recent failure, so Server 1 (UDP) should be marked bad.
+  // Server 0 (UDP) should be good and since 2 is our only Doh server.
+  EXPECT_EQ(session_->NextGoodServerIndex(0), 0u);
+  EXPECT_EQ(session_->NextGoodServerIndex(1), 0u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(2), 2u);
+}
+
+TEST_F(DnsTransactionTest, HttpsMarkHttpsBad) {
+  config_.attempts = 1;
+  ConfigDohServers(false /* clear_udp */, true /* use_post */, 3);
+  AddQueryAndErrorResponse(0, kT0HostName, kT0Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+  AddQueryAndErrorResponse(0, kT0HostName, kT0Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::HTTPS);
+  AddQueryAndErrorResponse(1, kT1HostName, kT1Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+  AddQueryAndErrorResponse(1, kT1HostName, kT1Qtype, ERR_CONNECTION_REFUSED,
+                           SYNCHRONOUS, Transport::HTTPS);
+
+  AddQueryAndResponse(1, kT1HostName, kT1Qtype, kT1ResponseDatagram,
+                      arraysize(kT1ResponseDatagram), ASYNC, Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  TransactionHelper helper1(kT1HostName, kT1Qtype, kT1RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+  // Server 0 is our only UDP server, so it will be good. HTTPS
+  // servers 1 and 2 failed and will be marked bad. Server 3 succeeded
+  // so will be good.
+  EXPECT_EQ(session_->NextGoodServerIndex(0), 0u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(1), 3u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(2), 3u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(3), 3u);
+
+  EXPECT_TRUE(helper1.RunUntilDone(transaction_factory_.get()));
+  // Server 0 is still our only UDP server, so will be good by definition.
+  // Server 3 started out as good, so was tried first and failed. Server 1
+  // then had the oldest failure so would be the next good server and
+  // failed so is marked bad. Next attempt was server 2, which succeded so is
+  // good.
+  EXPECT_EQ(session_->NextGoodServerIndex(0), 0u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(1), 2u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(2), 2u);
+  EXPECT_EQ(session_->NextGoodDnsOverHttpsServerIndex(3), 2u);
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailThenHTTPFallback) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */, 2);
+  AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, ASYNC,
+                   Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailTwiceThenUDPFallback) {
+  config_.attempts = 3;
+  ConfigDohServers(false /* clear_udp */, true /* use_post */, 2);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::UDP);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailStart));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsPostFailTwice) {
+  config_.attempts = 2;
+  ConfigDohServers(true /* clear_udp */, true /* use_post */, 2);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_FAILED);
+  SetDohJobMakerCallback(base::BindRepeating(DohJobMakerCallbackFailStart));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseWithCookie(URLRequest* request, HttpResponseInfo* info) {
+  info->headers->AddHeader("Set-Cookie: test-cookie=you-fail");
+}
+
+class CookieCallback {
+ public:
+  CookieCallback()
+      : result_(false), loop_to_quit_(std::make_unique<base::RunLoop>()) {}
+
+  void SetCookieCallback(bool result) {
+    result_ = result;
+    loop_to_quit_->Quit();
+  }
+
+  void GetAllCookiesCallback(const net::CookieList& list) {
+    list_ = list;
+    loop_to_quit_->Quit();
+  }
+
+  void Reset() { loop_to_quit_.reset(new base::RunLoop()); }
+
+  void WaitUntilDone() { loop_to_quit_->Run(); }
+
+  size_t cookie_list_size() { return list_.size(); }
+
+ private:
+  net::CookieList list_;
+  bool result_;
+  std::unique_ptr<base::RunLoop> loop_to_quit_;
+  DISALLOW_COPY_AND_ASSIGN(CookieCallback);
+};
+
+TEST_F(DnsTransactionTest, HttpsPostTestNoCookies) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(1, kT1HostName, kT1Qtype, kT1ResponseDatagram,
+                      arraysize(kT1ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  TransactionHelper helper1(kT1HostName, kT1Qtype, kT1RecordCount);
+  SetResponseModifierCallback(base::BindRepeating(MakeResponseWithCookie));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+
+  CookieCallback callback;
+  helper0.request_context()->cookie_store()->GetAllCookiesForURLAsync(
+      config_.dns_over_https_servers[0].server,
+      base::Bind(&CookieCallback::GetAllCookiesCallback,
+                 base::Unretained(&callback)));
+  callback.WaitUntilDone();
+  EXPECT_EQ(0u, callback.cookie_list_size());
+  callback.Reset();
+  net::CookieOptions options;
+  helper1.request_context()->cookie_store()->SetCookieWithOptionsAsync(
+      config_.dns_over_https_servers[0].server, "test-cookie=you-still-fail",
+      options,
+      base::Bind(&CookieCallback::SetCookieCallback,
+                 base::Unretained(&callback)));
+  EXPECT_TRUE(helper1.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseWithoutLength(URLRequest* request, HttpResponseInfo* info) {
+  info->headers->RemoveHeader("Content-Length");
+}
+
+TEST_F(DnsTransactionTest, HttpsPostNoContentLength) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  SetResponseModifierCallback(base::BindRepeating(MakeResponseWithoutLength));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseWithBadRequestResponse(URLRequest* request,
+                                        HttpResponseInfo* info) {
+  info->headers->ReplaceStatusLine("HTTP/1.1 400 Bad Request");
+}
+
+TEST_F(DnsTransactionTest, HttpsPostWithBadRequestResponse) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  SetResponseModifierCallback(
+      base::BindRepeating(MakeResponseWithBadRequestResponse));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseWrongType(URLRequest* request, HttpResponseInfo* info) {
+  info->headers->RemoveHeader("Content-Type");
+  info->headers->AddHeader("Content-Type: text/html");
+}
+
+TEST_F(DnsTransactionTest, HttpsPostWithWrongType) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  SetResponseModifierCallback(base::BindRepeating(MakeResponseWrongType));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseRedirect(URLRequest* request, HttpResponseInfo* info) {
+  if (request->url_chain().size() < 2) {
+    info->headers->ReplaceStatusLine("HTTP/1.1 302 Found");
+    info->headers->AddHeader("Location: /redirect-destination?" +
+                             request->url().query());
+  }
+}
+
+TEST_F(DnsTransactionTest, HttpsGetRedirect) {
+  ConfigDohServers(true /* clear_udp */, false /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
+  SetResponseModifierCallback(base::BindRepeating(MakeResponseRedirect));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+void MakeResponseNoType(URLRequest* request, HttpResponseInfo* info) {
+  info->headers->RemoveHeader("Content-Type");
+}
+
+TEST_F(DnsTransactionTest, HttpsPostWithNoType) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */);
+  AddQueryAndResponse(0, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), SYNCHRONOUS,
+                      Transport::HTTPS);
+  TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE);
+  SetResponseModifierCallback(base::BindRepeating(MakeResponseNoType));
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
+TEST_F(DnsTransactionTest, HttpsCantLookupDohServers) {
+  ConfigDohServers(true /* clear_udp */, true /* use_post */, 2);
+  TransactionHelper helper0(kMockHostname, kT0Qtype, ERR_CONNECTION_REFUSED);
+  transaction_ids_.push_back(0);
+  transaction_ids_.push_back(1);
+  EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get()));
+}
+
 TEST_F(DnsTransactionTest, TCPLookup) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
-                      kT0ResponseDatagram, arraysize(kT0ResponseDatagram),
-                      ASYNC, true /* use_tcp */);
+  AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, kT0ResponseDatagram,
+                      arraysize(kT0ResponseDatagram), ASYNC, Transport::TCP);
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
@@ -952,8 +1831,8 @@
 TEST_F(DnsTransactionTest, TCPFailure) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL,
-                   ASYNC, true /* use_tcp */);
+  AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, ASYNC,
+                   Transport::TCP);
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_SERVER_FAILED);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
@@ -962,8 +1841,8 @@
 TEST_F(DnsTransactionTest, TCPMalformed) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   // Valid response but length too short.
   // This must be truncated in the question section. The DnsResponse doesn't
   // examine the answer section until asked to parse it, so truncating it in
@@ -983,8 +1862,8 @@
   ConfigureFactory();
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  AddSocketData(std::make_unique<DnsSocketData>(1 /* id */, kT0HostName,
-                                                kT0Qtype, ASYNC, true));
+  AddSocketData(std::make_unique<DnsSocketData>(
+      1 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_TIMED_OUT);
   EXPECT_FALSE(helper0.Run(transaction_factory_.get()));
@@ -994,8 +1873,8 @@
 TEST_F(DnsTransactionTest, TCPReadReturnsZeroAsync) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   // Return all but the last byte of the response.
   data->AddResponseWithLength(
       std::make_unique<DnsResponse>(
@@ -1013,8 +1892,8 @@
 TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   // Return all but the last byte of the response.
   data->AddResponseWithLength(
       std::make_unique<DnsResponse>(
@@ -1032,8 +1911,8 @@
 TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   data->AddReadError(ERR_CONNECTION_CLOSED, ASYNC);
   AddSocketData(std::move(data));
 
@@ -1044,8 +1923,8 @@
 TEST_F(DnsTransactionTest, TCPConnectionClosedSynchronous) {
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS);
   AddSocketData(std::move(data));
 
@@ -1056,8 +1935,8 @@
 TEST_F(DnsTransactionTest, MismatchedThenNxdomainThenTCP) {
   config_.attempts = 2;
   ConfigureFactory();
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
   // First attempt gets a mismatched response.
   data->AddResponseData(kT1ResponseDatagram, arraysize(kT1ResponseDatagram),
                         SYNCHRONOUS);
@@ -1066,8 +1945,8 @@
   AddSocketData(std::move(data));
   // Second attempt gets NXDOMAIN, which happens before the TCP required.
   AddSyncQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeNXDOMAIN);
-  std::unique_ptr<DnsSocketData> tcp_data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> tcp_data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   tcp_data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS);
   AddSocketData(std::move(tcp_data));
 
@@ -1078,8 +1957,8 @@
 TEST_F(DnsTransactionTest, MismatchedThenOkThenTCP) {
   config_.attempts = 2;
   ConfigureFactory();
-  std::unique_ptr<DnsSocketData> data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false));
+  std::unique_ptr<DnsSocketData> data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, Transport::UDP));
   // First attempt gets a mismatched response.
   data->AddResponseData(kT1ResponseDatagram, arraysize(kT1ResponseDatagram),
                         SYNCHRONOUS);
@@ -1090,8 +1969,8 @@
   // required.
   AddSyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
                           kT0ResponseDatagram, arraysize(kT0ResponseDatagram));
-  std::unique_ptr<DnsSocketData> tcp_data(
-      new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true));
+  std::unique_ptr<DnsSocketData> tcp_data(new DnsSocketData(
+      0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::TCP));
   tcp_data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS);
   AddSocketData(std::move(tcp_data));
 
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index 87cf01d5..7876d87 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -11,11 +11,9 @@
 #include <memory>
 #include <string>
 
-#include "base/macros.h"
 #include "net/base/address_family.h"
 #include "net/base/completion_callback.h"
 #include "net/base/host_port_pair.h"
-#include "net/base/net_export.h"
 #include "net/base/prioritized_dispatcher.h"
 #include "net/base/request_priority.h"
 #include "net/dns/host_cache.h"
@@ -28,9 +26,9 @@
 
 class AddressList;
 class HostResolverImpl;
-class HostResolverProc;
 class NetLog;
 class NetLogWithSource;
+class URLRequestContext;
 
 // This class represents the task of resolving hostnames (or IP address
 // literal) to an AddressList object.
@@ -225,6 +223,10 @@
   virtual void SetNoIPv6OnWifi(bool no_ipv6_on_wifi);
   virtual bool GetNoIPv6OnWifi();
 
+  virtual void SetRequestContext(URLRequestContext* request_context) {}
+  virtual void AddDnsOverHttpsServer(std::string spec, bool use_post) {}
+  virtual void ClearDnsOverHttpsServers() {}
+
   // Creates a HostResolver implementation that queries the underlying system.
   // (Except if a unit-test has changed the global HostResolverProc using
   // ScopedHostResolverProc to intercept requests to the system).
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 907a21f..e5a3bfa 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -972,6 +972,9 @@
     // only needs to run one transaction.
     virtual void OnFirstDnsTransactionComplete() = 0;
 
+    virtual URLRequestContext* url_request_context() = 0;
+    virtual RequestPriority priority() const = 0;
+
    protected:
     Delegate() = default;
     virtual ~Delegate() = default;
@@ -1031,13 +1034,17 @@
 
   std::unique_ptr<DnsTransaction> CreateTransaction(AddressFamily family) {
     DCHECK_NE(ADDRESS_FAMILY_UNSPECIFIED, family);
-    return client_->GetTransactionFactory()->CreateTransaction(
-        key_.hostname,
-        family == ADDRESS_FAMILY_IPV6 ? dns_protocol::kTypeAAAA :
-                                        dns_protocol::kTypeA,
-        base::Bind(&DnsTask::OnTransactionComplete, base::Unretained(this),
-                   base::TimeTicks::Now()),
-        net_log_);
+    std::unique_ptr<DnsTransaction> trans =
+        client_->GetTransactionFactory()->CreateTransaction(
+            key_.hostname,
+            family == ADDRESS_FAMILY_IPV6 ? dns_protocol::kTypeAAAA
+                                          : dns_protocol::kTypeA,
+            base::Bind(&DnsTask::OnTransactionComplete, base::Unretained(this),
+                       base::TimeTicks::Now()),
+            net_log_);
+    trans->SetRequestContext(delegate_->url_request_context());
+    trans->SetRequestPriority(delegate_->priority());
+    return trans;
   }
 
   void OnTransactionComplete(const base::TimeTicks& start_time,
@@ -1636,6 +1643,10 @@
       dns_task_->StartSecondTransaction();
   }
 
+  URLRequestContext* url_request_context() override {
+    return resolver_->url_request_context_;
+  }
+
   void RecordJobHistograms(int error) {
     // Used in UMA_HISTOGRAM_ENUMERATION. Do not renumber entries or reuse
     // deprecated values.
@@ -1795,7 +1806,7 @@
                      base::TimeDelta());
   }
 
-  RequestPriority priority() const {
+  RequestPriority priority() const override {
     return priority_tracker_.highest_priority();
   }
 
@@ -2167,6 +2178,33 @@
   return assume_ipv6_failure_on_wifi_;
 }
 
+void HostResolverImpl::SetRequestContext(URLRequestContext* context) {
+  if (context != url_request_context_) {
+    url_request_context_ = context;
+  }
+}
+
+void HostResolverImpl::ClearDnsOverHttpsServers() {
+  if (dns_over_https_servers_.size() == 0)
+    return;
+
+  dns_over_https_servers_.clear();
+
+  if (dns_client_.get() && dns_client_->GetConfig())
+    UpdateDNSConfig(true);
+}
+
+void HostResolverImpl::AddDnsOverHttpsServer(std::string spec, bool use_post) {
+  GURL url(spec);
+  if (!url.SchemeIs("https"))
+    return;
+
+  dns_over_https_servers_.emplace_back(url, use_post);
+
+  if (dns_client_.get() && dns_client_->GetConfig())
+    UpdateDNSConfig(true);
+}
+
 bool HostResolverImpl::ResolveAsIP(const Key& key,
                                    const RequestInfo& info,
                                    const IPAddress* ip_address,
@@ -2521,6 +2559,7 @@
     // wasn't already a DnsConfig or it's the same one.
     DCHECK(config_changed || !dns_client_->GetConfig() ||
            dns_client_->GetConfig()->Equals(dns_config));
+    dns_config.dns_over_https_servers = dns_over_https_servers_;
     dns_client_->SetConfig(dns_config);
     if (dns_client_->GetConfig())
       UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true);
@@ -2586,6 +2625,7 @@
       num_dns_failures_ < kMaximumDnsFailures) {
     DnsConfig dns_config;
     NetworkChangeNotifier::GetDnsConfig(&dns_config);
+    dns_config.dns_over_https_servers = dns_over_https_servers_;
     dns_client_->SetConfig(dns_config);
     num_dns_failures_ = 0;
     if (dns_client_->GetConfig())
diff --git a/net/dns/host_resolver_impl.h b/net/dns/host_resolver_impl.h
index 58300e55c..0eada32f2 100644
--- a/net/dns/host_resolver_impl.h
+++ b/net/dns/host_resolver_impl.h
@@ -11,17 +11,16 @@
 #include <map>
 #include <memory>
 
-#include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/strings/string_piece.h"
-#include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "net/base/net_export.h"
 #include "net/base/network_change_notifier.h"
+#include "net/dns/dns_config_service.h"
 #include "net/dns/host_cache.h"
 #include "net/dns/host_resolver.h"
 #include "net/dns/host_resolver_proc.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "url/gurl.h"
 
 namespace net {
 
@@ -167,6 +166,10 @@
   void SetNoIPv6OnWifi(bool no_ipv6_on_wifi) override;
   bool GetNoIPv6OnWifi() override;
 
+  void SetRequestContext(URLRequestContext* request_context) override;
+  void AddDnsOverHttpsServer(std::string server, bool use_post) override;
+  void ClearDnsOverHttpsServers() override;
+
   void set_proc_params_for_test(const ProcTaskParams& proc_params) {
     proc_params_ = proc_params;
   }
@@ -378,6 +381,9 @@
   PersistCallback persist_callback_;
   base::OneShotTimer persist_timer_;
 
+  URLRequestContext* url_request_context_;
+  std::vector<DnsConfig::DnsOverHttpsServerConfig> dns_over_https_servers_;
+
   THREAD_CHECKER(thread_checker_);
 
   base::WeakPtrFactory<HostResolverImpl> weak_ptr_factory_;
diff --git a/net/dns/host_resolver_impl_unittest.cc b/net/dns/host_resolver_impl_unittest.cc
index 7f557e8..cbf1dec0 100644
--- a/net/dns/host_resolver_impl_unittest.cc
+++ b/net/dns/host_resolver_impl_unittest.cc
@@ -2746,4 +2746,154 @@
       ResolveLocalHostname("foo.localhoste", kLocalhostLookupPort, &addresses));
 }
 
+TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerAfterConfig) {
+  resolver_ = nullptr;
+  test::ScopedMockNetworkChangeNotifier notifier;
+  CreateSerialResolver();  // To guarantee order of resolutions.
+  notifier.mock_network_change_notifier()->SetConnectionType(
+      NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeDnsConfig(CreateValidDnsConfig());
+
+  resolver_->SetDnsClientEnabled(true);
+  std::string spec("https://dns.example.com/");
+  resolver_->AddDnsOverHttpsServer(spec, true);
+  base::DictionaryValue* config;
+
+  auto value = resolver_->GetDnsConfigAsValue();
+  EXPECT_TRUE(value);
+  if (!value)
+    return;
+  value->GetAsDictionary(&config);
+  base::ListValue* doh_servers;
+  config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
+  EXPECT_TRUE(doh_servers);
+  if (!doh_servers)
+    return;
+  EXPECT_EQ(doh_servers->GetSize(), 1u);
+  base::DictionaryValue* server_method;
+  EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
+  bool use_post;
+  EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
+  EXPECT_TRUE(use_post);
+  std::string server_spec;
+  EXPECT_TRUE(server_method->GetString("server", &server_spec));
+  EXPECT_EQ(server_spec, spec);
+}
+
+TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerBeforeConfig) {
+  resolver_ = nullptr;
+  test::ScopedMockNetworkChangeNotifier notifier;
+  CreateSerialResolver();  // To guarantee order of resolutions.
+  resolver_->SetDnsClientEnabled(true);
+  std::string spec("https://dns.example.com/");
+  resolver_->AddDnsOverHttpsServer(spec, true);
+
+  notifier.mock_network_change_notifier()->SetConnectionType(
+      NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeDnsConfig(CreateValidDnsConfig());
+
+  base::DictionaryValue* config;
+  auto value = resolver_->GetDnsConfigAsValue();
+  EXPECT_TRUE(value);
+  if (!value)
+    return;
+  value->GetAsDictionary(&config);
+  base::ListValue* doh_servers;
+  config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
+  EXPECT_TRUE(doh_servers);
+  if (!doh_servers)
+    return;
+  EXPECT_EQ(doh_servers->GetSize(), 1u);
+  base::DictionaryValue* server_method;
+  EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
+  bool use_post;
+  EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
+  EXPECT_TRUE(use_post);
+  std::string server_spec;
+  EXPECT_TRUE(server_method->GetString("server", &server_spec));
+  EXPECT_EQ(server_spec, spec);
+}
+
+TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerBeforeClient) {
+  resolver_ = nullptr;
+  test::ScopedMockNetworkChangeNotifier notifier;
+  CreateSerialResolver();  // To guarantee order of resolutions.
+  std::string spec("https://dns.example.com/");
+  resolver_->AddDnsOverHttpsServer(spec, true);
+
+  notifier.mock_network_change_notifier()->SetConnectionType(
+      NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeDnsConfig(CreateValidDnsConfig());
+
+  resolver_->SetDnsClientEnabled(true);
+
+  base::DictionaryValue* config;
+  auto value = resolver_->GetDnsConfigAsValue();
+  EXPECT_TRUE(value);
+  if (!value)
+    return;
+  value->GetAsDictionary(&config);
+  base::ListValue* doh_servers;
+  config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
+  EXPECT_TRUE(doh_servers);
+  if (!doh_servers)
+    return;
+  EXPECT_EQ(doh_servers->GetSize(), 1u);
+  base::DictionaryValue* server_method;
+  EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
+  bool use_post;
+  EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
+  EXPECT_TRUE(use_post);
+  std::string server_spec;
+  EXPECT_TRUE(server_method->GetString("server", &server_spec));
+  EXPECT_EQ(server_spec, spec);
+}
+
+TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerAndThenRemove) {
+  resolver_ = nullptr;
+  test::ScopedMockNetworkChangeNotifier notifier;
+  CreateSerialResolver();  // To guarantee order of resolutions.
+  std::string spec("https://dns.example.com/");
+  resolver_->AddDnsOverHttpsServer(spec, true);
+
+  notifier.mock_network_change_notifier()->SetConnectionType(
+      NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeDnsConfig(CreateValidDnsConfig());
+
+  resolver_->SetDnsClientEnabled(true);
+
+  base::DictionaryValue* config;
+  auto value = resolver_->GetDnsConfigAsValue();
+  EXPECT_TRUE(value);
+  if (!value)
+    return;
+  value->GetAsDictionary(&config);
+  base::ListValue* doh_servers;
+  config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
+  EXPECT_TRUE(doh_servers);
+  if (!doh_servers)
+    return;
+  EXPECT_EQ(doh_servers->GetSize(), 1u);
+  base::DictionaryValue* server_method;
+  EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
+  bool use_post;
+  EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
+  EXPECT_TRUE(use_post);
+  std::string server_spec;
+  EXPECT_TRUE(server_method->GetString("server", &server_spec));
+  EXPECT_EQ(server_spec, spec);
+
+  resolver_->ClearDnsOverHttpsServers();
+  value = resolver_->GetDnsConfigAsValue();
+  EXPECT_TRUE(value);
+  if (!value)
+    return;
+  value->GetAsDictionary(&config);
+  config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
+  EXPECT_TRUE(doh_servers);
+  if (!doh_servers)
+    return;
+  EXPECT_EQ(doh_servers->GetSize(), 0u);
+}
+
 }  // namespace net
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc
index 04e2bb5..62028b0 100644
--- a/net/dns/mdns_client_impl.cc
+++ b/net/dns/mdns_client_impl.cc
@@ -81,7 +81,7 @@
       connection_->OnDatagramReceived(&response_, recv_addr_, rv);
 
     rv = socket_->RecvFrom(
-        response_.io_buffer(), response_.io_buffer()->size(), &recv_addr_,
+        response_.io_buffer(), response_.io_buffer_size(), &recv_addr_,
         base::Bind(&MDnsConnection::SocketHandler::OnDatagramReceived,
                    base::Unretained(this)));
   } while (rv > 0);
@@ -227,7 +227,7 @@
   // erroneous behavior in case a packet contains multiple exclusive
   // records with the same type and name.
   std::map<MDnsCache::Key, MDnsCache::UpdateType> update_keys;
-
+  DCHECK_GT(bytes_read, 0);
   if (!response->InitParseWithoutQuery(bytes_read)) {
     DVLOG(1) << "Could not understand an mDNS packet.";
     return;  // Message is unreadable.
diff --git a/net/quic/OWNERS b/net/quic/OWNERS
index 9cd4df79..caafd5f 100644
--- a/net/quic/OWNERS
+++ b/net/quic/OWNERS
@@ -1,5 +1,4 @@
 ckrasic@chromium.org
-jri@chromium.org
 rch@chromium.org
 zhongyi@chromium.org
 
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc
index bb48c32..3b71b64d 100644
--- a/net/quic/chromium/quic_chromium_client_session.cc
+++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -1567,7 +1567,7 @@
     base::UmaHistogramSparse("Net.QuicSession.WriteError.HandshakeConfirmed",
                              -error_code);
   }
-  if (stream_factory_ == nullptr ||
+  if (error_code == ERR_MSG_TOO_BIG || stream_factory_ == nullptr ||
       !stream_factory_->migrate_sessions_on_network_change()) {
     return error_code;
   }
diff --git a/net/quic/chromium/quic_http_stream_test.cc b/net/quic/chromium/quic_http_stream_test.cc
index f896f6d..b0b026be 100644
--- a/net/quic/chromium/quic_http_stream_test.cc
+++ b/net/quic/chromium/quic_http_stream_test.cc
@@ -342,7 +342,7 @@
     promised_response_[":version"] = "HTTP/1.1";
     promised_response_["content-type"] = "text/plain";
 
-    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_);
+    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_);
   }
 
   void SetRequest(const string& method,
@@ -1879,7 +1879,7 @@
   // packet, but does it matter?
 
   push_promise_[":authority"] = "mail.example.org";
-  promise_url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_);
+  promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_);
 
   ReceivePromise(promise_id_);
   EXPECT_NE(session_->GetPromisedByUrl(promise_url_), nullptr);
@@ -1948,7 +1948,7 @@
   // TODO(ckrasic) - could do this via constructing a PUSH_PROMISE
   // packet, but does it matter?
   push_promise_[":authority"] = "www.notexample.org";
-  promise_url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_);
+  promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_);
 
   ReceivePromise(promise_id_);
   // The promise will have been rejected because the cert doesn't
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index c02031f..ca11773b 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -51,6 +51,7 @@
 #include "net/quic/core/crypto/quic_decrypter.h"
 #include "net/quic/core/crypto/quic_encrypter.h"
 #include "net/quic/core/quic_framer.h"
+#include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string_piece.h"
 #include "net/quic/platform/impl/quic_test_impl.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
@@ -5087,6 +5088,36 @@
   EXPECT_TRUE(clock_.Now() - start < QuicTime::Delta::FromSeconds(5));
 }
 
+TEST_P(QuicNetworkTransactionTest, NoMigrationForMsgTooBig) {
+  session_params_.origins_to_force_quic_on.insert(
+      HostPortPair::FromString("mail.example.org:443"));
+  const QuicString error_details =
+      QuicStrCat("Write failed with error: ", ERR_MSG_TOO_BIG, " (",
+                 strerror(ERR_MSG_TOO_BIG), ")");
+
+  MockQuicData socket_data;
+  QuicStreamOffset offset = 0;
+  socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+  socket_data.AddWrite(ConstructInitialSettingsPacket(1, &offset));
+  socket_data.AddWrite(SYNCHRONOUS, ERR_MSG_TOO_BIG);
+  // Connection close packet will be sent for MSG_TOO_BIG.
+  socket_data.AddWrite(client_maker_.MakeConnectionClosePacket(
+      3, true, QUIC_PACKET_WRITE_ERROR, error_details));
+  socket_data.AddSocketDataToFactory(&socket_factory_);
+
+  CreateSession();
+
+  HttpNetworkTransaction trans(DEFAULT_PRIORITY, session_.get());
+  TestCompletionCallback callback;
+  int rv = trans.Start(&request_, callback.callback(), net_log_.bound());
+  EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(callback.have_result());
+  EXPECT_THAT(callback.WaitForResult(), IsError(ERR_QUIC_PROTOCOL_ERROR));
+  EXPECT_TRUE(socket_data.AllReadDataConsumed());
+  EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+}
+
 // Adds coverage to catch regression such as https://crbug.com/622043
 TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
   session_params_.origins_to_force_quic_on.insert(
diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc
index 1b09e07..210f111 100644
--- a/net/quic/chromium/quic_stream_factory.cc
+++ b/net/quic/chromium/quic_stream_factory.cc
@@ -857,6 +857,8 @@
 }
 
 QuicStreamFactory::~QuicStreamFactory() {
+  UMA_HISTOGRAM_COUNTS_1000("Net.NumQuicSessionsAtShutdown",
+                            all_sessions_.size());
   CloseAllSessions(ERR_ABORTED, QUIC_CONNECTION_CANCELLED);
   while (!all_sessions_.empty()) {
     delete all_sessions_.begin()->first;
diff --git a/net/quic/core/congestion_control/bbr_sender_test.cc b/net/quic/core/congestion_control/bbr_sender_test.cc
index f80540b..659da085 100644
--- a/net/quic/core/congestion_control/bbr_sender_test.cc
+++ b/net/quic/core/congestion_control/bbr_sender_test.cc
@@ -13,6 +13,7 @@
 #include "net/quic/core/quic_packets.h"
 #include "net/quic/core/quic_utils.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/mock_clock.h"
 #include "net/quic/test_tools/quic_config_peer.h"
@@ -143,47 +144,46 @@
   // receiver and the switch.  The switch has the buffers four times larger than
   // the bottleneck BDP, which should guarantee a lack of losses.
   void CreateDefaultSetup() {
-    switch_.reset(
-        new simulator::Switch(&simulator_, "Switch", 8, 2 * kTestBdp));
-    bbr_sender_link_.reset(new simulator::SymmetricLink(
+    switch_ = QuicMakeUnique<simulator::Switch>(&simulator_, "Switch", 8,
+                                                2 * kTestBdp);
+    bbr_sender_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &bbr_sender_, switch_->port(1), kLocalLinkBandwidth,
-        kLocalPropagationDelay));
-    receiver_link_.reset(new simulator::SymmetricLink(
+        kLocalPropagationDelay);
+    receiver_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &receiver_, switch_->port(2), kTestLinkBandwidth,
-        kTestPropagationDelay));
+        kTestPropagationDelay);
   }
 
   // Same as the default setup, except the buffer now is half of the BDP.
   void CreateSmallBufferSetup() {
-    switch_.reset(
-        new simulator::Switch(&simulator_, "Switch", 8, 0.5 * kTestBdp));
-    bbr_sender_link_.reset(new simulator::SymmetricLink(
+    switch_ = QuicMakeUnique<simulator::Switch>(&simulator_, "Switch", 8,
+                                                0.5 * kTestBdp);
+    bbr_sender_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &bbr_sender_, switch_->port(1), kLocalLinkBandwidth,
-        kTestPropagationDelay));
-    receiver_link_.reset(new simulator::SymmetricLink(
+        kTestPropagationDelay);
+    receiver_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &receiver_, switch_->port(2), kTestLinkBandwidth,
-        kTestPropagationDelay));
+        kTestPropagationDelay);
   }
 
   // Creates the variation of the default setup in which there is another sender
   // that competes for the same bottleneck link.
   void CreateCompetitionSetup() {
-    switch_.reset(
-        new simulator::Switch(&simulator_, "Switch", 8, 2 * kTestBdp));
+    switch_ = QuicMakeUnique<simulator::Switch>(&simulator_, "Switch", 8,
+                                                2 * kTestBdp);
 
     // Add a small offset to the competing link in order to avoid
     // synchronization effects.
     const QuicTime::Delta small_offset = QuicTime::Delta::FromMicroseconds(3);
-
-    bbr_sender_link_.reset(new simulator::SymmetricLink(
+    bbr_sender_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &bbr_sender_, switch_->port(1), kLocalLinkBandwidth,
-        kLocalPropagationDelay));
-    competing_sender_link_.reset(new simulator::SymmetricLink(
+        kLocalPropagationDelay);
+    competing_sender_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &competing_sender_, switch_->port(3), kLocalLinkBandwidth,
-        kLocalPropagationDelay + small_offset));
-    receiver_link_.reset(new simulator::SymmetricLink(
+        kLocalPropagationDelay + small_offset);
+    receiver_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &receiver_multiplexer_, switch_->port(2), kTestLinkBandwidth,
-        kTestPropagationDelay));
+        kTestPropagationDelay);
   }
 
   // Creates a BBR vs BBR competition setup.
diff --git a/net/quic/core/congestion_control/hybrid_slow_start_test.cc b/net/quic/core/congestion_control/hybrid_slow_start_test.cc
index 3ed84958..22f6a60 100644
--- a/net/quic/core/congestion_control/hybrid_slow_start_test.cc
+++ b/net/quic/core/congestion_control/hybrid_slow_start_test.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_test.h"
 
 namespace net {
@@ -16,7 +17,7 @@
   HybridSlowStartTest()
       : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
         rtt_(QuicTime::Delta::FromMilliseconds(60)) {}
-  void SetUp() override { slow_start_.reset(new HybridSlowStart()); }
+  void SetUp() override { slow_start_ = QuicMakeUnique<HybridSlowStart>(); }
   const QuicTime::Delta one_ms_;
   const QuicTime::Delta rtt_;
   std::unique_ptr<HybridSlowStart> slow_start_;
diff --git a/net/quic/core/congestion_control/pacing_sender_test.cc b/net/quic/core/congestion_control/pacing_sender_test.cc
index 82b39169..65dcf76 100644
--- a/net/quic/core/congestion_control/pacing_sender_test.cc
+++ b/net/quic/core/congestion_control/pacing_sender_test.cc
@@ -8,6 +8,7 @@
 
 #include "net/quic/core/quic_packets.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/mock_clock.h"
 #include "net/quic/test_tools/quic_test_utils.h"
@@ -40,8 +41,8 @@
   ~PacingSenderTest() override {}
 
   void InitPacingRate(QuicPacketCount burst_size, QuicBandwidth bandwidth) {
-    mock_sender_.reset(new StrictMock<MockSendAlgorithm>());
-    pacing_sender_.reset(new PacingSender);
+    mock_sender_ = QuicMakeUnique<StrictMock<MockSendAlgorithm>>();
+    pacing_sender_ = QuicMakeUnique<PacingSender>();
     pacing_sender_->set_sender(mock_sender_.get());
     EXPECT_CALL(*mock_sender_, PacingRate(_)).WillRepeatedly(Return(bandwidth));
     if (burst_size == 0) {
diff --git a/net/quic/core/congestion_control/send_algorithm_test.cc b/net/quic/core/congestion_control/send_algorithm_test.cc
index bdfe1c6..78799c9 100644
--- a/net/quic/core/congestion_control/send_algorithm_test.cc
+++ b/net/quic/core/congestion_control/send_algorithm_test.cc
@@ -12,6 +12,7 @@
 #include "net/quic/core/quic_types.h"
 #include "net/quic/core/quic_utils.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
@@ -24,7 +25,6 @@
 #include "net/quic/test_tools/simulator/simulator.h"
 #include "net/quic/test_tools/simulator/switch.h"
 
-
 namespace net {
 namespace test {
 namespace {
@@ -195,13 +195,13 @@
   void CreateSetup(const QuicBandwidth& test_bandwidth,
                    const QuicTime::Delta& test_link_delay,
                    QuicByteCount bottleneck_queue_length) {
-    switch_.reset(new simulator::Switch(&simulator_, "Switch", 8,
-                                        bottleneck_queue_length));
-    quic_sender_link_.reset(new simulator::SymmetricLink(
+    switch_ = QuicMakeUnique<simulator::Switch>(&simulator_, "Switch", 8,
+                                                bottleneck_queue_length);
+    quic_sender_link_ = QuicMakeUnique<simulator::SymmetricLink>(
         &quic_sender_, switch_->port(1), kLocalLinkBandwidth,
-        kLocalPropagationDelay));
-    receiver_link_.reset(new simulator::SymmetricLink(
-        &receiver_, switch_->port(2), test_bandwidth, test_link_delay));
+        kLocalPropagationDelay);
+    receiver_link_ = QuicMakeUnique<simulator::SymmetricLink>(
+        &receiver_, switch_->port(2), test_bandwidth, test_link_delay);
   }
 
   void DoSimpleTransfer(QuicByteCount transfer_size, QuicTime::Delta deadline) {
diff --git a/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc b/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc
index 4bdcf440..187a0603 100644
--- a/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc
+++ b/net/quic/core/congestion_control/tcp_cubic_sender_bytes_test.cc
@@ -14,6 +14,7 @@
 #include "net/quic/core/quic_packets.h"
 #include "net/quic/core/quic_utils.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/mock_clock.h"
 #include "net/quic/test_tools/quic_config_peer.h"
@@ -781,7 +782,7 @@
 
 TEST_F(TcpCubicSenderBytesTest, LimitCwndIncreaseInCongestionAvoidance) {
   // Enable Cubic.
-  sender_.reset(new TcpCubicSenderBytesPeer(&clock_, false));
+  sender_ = QuicMakeUnique<TcpCubicSenderBytesPeer>(&clock_, false);
 
   int num_sent = SendAvailableSendWindow();
 
diff --git a/net/quic/core/crypto/crypto_handshake_message.cc b/net/quic/core/crypto/crypto_handshake_message.cc
index 2a5117e..f29bb58 100644
--- a/net/quic/core/crypto/crypto_handshake_message.cc
+++ b/net/quic/core/crypto/crypto_handshake_message.cc
@@ -12,7 +12,6 @@
 #include "net/quic/core/quic_socket_address_coder.h"
 #include "net/quic/core/quic_utils.h"
 #include "net/quic/platform/api/quic_endian.h"
-#include "net/quic/platform/api/quic_flag_utils.h"
 #include "net/quic/platform/api/quic_map_util.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string.h"
diff --git a/net/quic/core/crypto/crypto_server_test.cc b/net/quic/core/crypto/crypto_server_test.cc
index d9698fa..c7a9a33 100644
--- a/net/quic/core/crypto/crypto_server_test.cc
+++ b/net/quic/core/crypto/crypto_server_test.cc
@@ -259,7 +259,7 @@
     config_.ValidateClientHello(
         message, client_address_.host(), server_address,
         supported_versions_.front(), &clock_, signed_config_,
-        std::make_unique<ValidateCallback>(this, false, error_substr, called));
+        QuicMakeUnique<ValidateCallback>(this, false, error_substr, called));
   }
 
   class ProcessCallback : public ProcessClientHelloResultCallback {
@@ -324,8 +324,8 @@
         use_stateless_rejects_, server_designated_connection_id, &clock_, rand_,
         &compressed_certs_cache_, params_, signed_config_,
         /*total_framing_overhead=*/50, chlo_packet_size_,
-        std::make_unique<ProcessCallback>(result, should_succeed, error_substr,
-                                          &called, &out_));
+        QuicMakeUnique<ProcessCallback>(result, should_succeed, error_substr,
+                                        &called, &out_));
     EXPECT_TRUE(called);
   }
 
diff --git a/net/quic/core/crypto/quic_crypto_server_config.cc b/net/quic/core/crypto/quic_crypto_server_config.cc
index db1863c..9e677ac 100644
--- a/net/quic/core/crypto/quic_crypto_server_config.cc
+++ b/net/quic/core/crypto/quic_crypto_server_config.cc
@@ -36,7 +36,6 @@
 #include "net/quic/platform/api/quic_clock.h"
 #include "net/quic/platform/api/quic_endian.h"
 #include "net/quic/platform/api/quic_fallthrough.h"
-#include "net/quic/platform/api/quic_flag_utils.h"
 #include "net/quic/platform/api/quic_flags.h"
 #include "net/quic/platform/api/quic_hostname_utils.h"
 #include "net/quic/platform/api/quic_logging.h"
@@ -1498,11 +1497,7 @@
   if (client_hello.GetStringPiece(kCCRT, &client_cached_cert_hashes)) {
     params->client_cached_cert_hashes = client_cached_cert_hashes.as_string();
   } else {
-    if (GetQuicReloadableFlag(quic_2rtt_drop_client_cached_certs)) {
-      params->client_cached_cert_hashes.clear();
-      QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_2rtt_drop_client_cached_certs,
-                        1, 2);
-    }
+    params->client_cached_cert_hashes.clear();
   }
 
   const QuicString compressed =
@@ -1565,20 +1560,9 @@
   if (cached_value) {
     return *cached_value;
   }
-
-  QuicString compressed;
-  if (GetQuicReloadableFlag(quic_2rtt_drop_client_cached_certs)) {
-    compressed =
-        CertCompressor::CompressChain(chain->certs, client_common_set_hashes,
-                                      client_cached_cert_hashes, common_sets);
-    QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_2rtt_drop_client_cached_certs,
-                      2, 2);
-  } else {
-    compressed =
-        CertCompressor::CompressChain(chain->certs, client_common_set_hashes,
-                                      client_common_set_hashes, common_sets);
-  }
-
+  QuicString compressed =
+      CertCompressor::CompressChain(chain->certs, client_common_set_hashes,
+                                    client_cached_cert_hashes, common_sets);
   // Insert the newly compressed cert to cache.
   compressed_certs_cache->Insert(chain, client_common_set_hashes,
                                  client_cached_cert_hashes, compressed);
diff --git a/net/quic/core/quic_client_promised_info.cc b/net/quic/core/quic_client_promised_info.cc
index 82105a2..730f088 100644
--- a/net/quic/core/quic_client_promised_info.cc
+++ b/net/quic/core/quic_client_promised_info.cc
@@ -55,13 +55,14 @@
     Reset(QUIC_INVALID_PROMISE_METHOD);
     return false;
   }
-  if (!SpdyUtils::UrlIsValid(headers)) {
+  if (!SpdyUtils::PromisedUrlIsValid(headers)) {
     QUIC_DVLOG(1) << "Promise for stream " << id_ << " has invalid URL "
                   << url_;
     Reset(QUIC_INVALID_PROMISE_URL);
     return false;
   }
-  if (!session_->IsAuthorized(SpdyUtils::GetHostNameFromHeaderBlock(headers))) {
+  if (!session_->IsAuthorized(
+          SpdyUtils::GetPromisedHostNameFromHeaders(headers))) {
     Reset(QUIC_UNAUTHORIZED_PROMISE_URL);
     return false;
   }
diff --git a/net/quic/core/quic_client_promised_info_test.cc b/net/quic/core/quic_client_promised_info_test.cc
index 87da37c..54a4c91 100644
--- a/net/quic/core/quic_client_promised_info_test.cc
+++ b/net/quic/core/quic_client_promised_info_test.cc
@@ -10,6 +10,7 @@
 #include "net/quic/core/spdy_utils.h"
 #include "net/quic/core/tls_client_handshaker.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_socket_address.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
@@ -74,10 +75,10 @@
     headers_[":status"] = "200";
     headers_["content-length"] = "11";
 
-    stream_.reset(new QuicSpdyClientStream(
+    stream_ = QuicMakeUnique<QuicSpdyClientStream>(
         QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 0),
-        &session_));
-    stream_visitor_.reset(new StreamVisitor());
+        &session_);
+    stream_visitor_ = QuicMakeUnique<StreamVisitor>();
     stream_->set_visitor(stream_visitor_.get());
 
     push_promise_[":path"] = "/bar";
@@ -86,7 +87,7 @@
     push_promise_[":method"] = "GET";
     push_promise_[":scheme"] = "https";
 
-    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_);
+    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_);
 
     client_request_ = push_promise_.Clone();
     promise_id_ =
diff --git a/net/quic/core/quic_client_push_promise_index.cc b/net/quic/core/quic_client_push_promise_index.cc
index c925f54..2b644cae 100644
--- a/net/quic/core/quic_client_push_promise_index.cc
+++ b/net/quic/core/quic_client_push_promise_index.cc
@@ -31,7 +31,7 @@
     const SpdyHeaderBlock& request,
     QuicClientPushPromiseIndex::Delegate* delegate,
     TryHandle** handle) {
-  QuicString url(SpdyUtils::GetPromisedUrlFromHeaderBlock(request));
+  QuicString url(SpdyUtils::GetPromisedUrlFromHeaders(request));
   QuicPromisedByUrlMap::iterator it = promised_by_url_.find(url);
   if (it != promised_by_url_.end()) {
     QuicClientPromisedInfo* promised = it->second;
diff --git a/net/quic/core/quic_client_push_promise_index_test.cc b/net/quic/core/quic_client_push_promise_index_test.cc
index d3d9356f..565352f 100644
--- a/net/quic/core/quic_client_push_promise_index_test.cc
+++ b/net/quic/core/quic_client_push_promise_index_test.cc
@@ -61,7 +61,7 @@
     request_[":version"] = "HTTP/1.1";
     request_[":method"] = "GET";
     request_[":scheme"] = "https";
-    url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(request_);
+    url_ = SpdyUtils::GetPromisedUrlFromHeaders(request_);
   }
 
   MockQuicConnectionHelper helper_;
diff --git a/net/quic/core/quic_connection.cc b/net/quic/core/quic_connection.cc
index f704f0d0..6c53424 100644
--- a/net/quic/core/quic_connection.cc
+++ b/net/quic/core/quic_connection.cc
@@ -2802,8 +2802,7 @@
   // because it needs the receiver to allow receiving overlapping stream data.
   const bool enable_session_decides_what_to_write =
       transport_version() > QUIC_VERSION_41 &&
-      GetQuicReloadableFlag(quic_allow_receiving_overlapping_data) &&
-      GetQuicReloadableFlag(quic_streams_unblocked_by_session) &&
+      GetQuicReloadableFlag(quic_streams_unblocked_by_session2) &&
       use_control_frame_manager_;
   sent_packet_manager_.SetSessionDecideWhatToWrite(
       enable_session_decides_what_to_write);
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc
index 73bae44..45aa13c 100644
--- a/net/quic/core/quic_connection_test.cc
+++ b/net/quic/core/quic_connection_test.cc
@@ -23,6 +23,7 @@
 #include "net/quic/core/quic_utils.h"
 #include "net/quic/platform/api/quic_flags.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_reference_counted.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string.h"
diff --git a/net/quic/core/quic_control_frame_manager_test.cc b/net/quic/core/quic_control_frame_manager_test.cc
index fef0ef38..bc2cc32 100644
--- a/net/quic/core/quic_control_frame_manager_test.cc
+++ b/net/quic/core/quic_control_frame_manager_test.cc
@@ -5,6 +5,7 @@
 #include "net/quic/core/quic_control_frame_manager.h"
 
 #include "net/quic/platform/api/quic_flags.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/quic_test_utils.h"
 
diff --git a/net/quic/core/quic_crypto_client_stream_test.cc b/net/quic/core/quic_crypto_client_stream_test.cc
index 09ee5c9..c62d752 100644
--- a/net/quic/core/quic_crypto_client_stream_test.cc
+++ b/net/quic/core/quic_crypto_client_stream_test.cc
@@ -16,6 +16,7 @@
 #include "net/quic/core/tls_server_handshaker.h"
 #include "net/quic/platform/api/quic_arraysize.h"
 #include "net/quic/platform/api/quic_flags.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
@@ -51,8 +52,8 @@
     // Advance the time, because timers do not like uninitialized times.
     connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
 
-    session_.reset(new TestQuicSpdyClientSession(
-        connection_, DefaultQuicConfig(), server_id_, &crypto_config_));
+    session_ = QuicMakeUnique<TestQuicSpdyClientSession>(
+        connection_, DefaultQuicConfig(), server_id_, &crypto_config_);
   }
 
   void CompleteCryptoHandshake() {
diff --git a/net/quic/core/quic_flags_list.h b/net/quic/core/quic_flags_list.h
index 228ceea..9d7f6e360 100644
--- a/net/quic/core/quic_flags_list.h
+++ b/net/quic/core/quic_flags_list.h
@@ -115,12 +115,6 @@
           FLAGS_quic_reloadable_flag_quic_fix_sequencer_buffer_block_count2,
           true)
 
-// If true, fixes for the two bugs described in crbug.com/723604 will be
-// enabled.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_2rtt_drop_client_cached_certs,
-          true)
-
 // If true, limit quic stream length to be below 2^62.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_stream_too_long, false)
 
@@ -128,11 +122,6 @@
 // TLP instead of 2.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_one_tlp, false)
 
-// If true, stream sequencer buffer allows receiving overlapping stream data.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_allow_receiving_overlapping_data,
-          true)
-
 // If true, QuicStreamSendBuffer keeps track of the slice which next write
 // should get data from if writing new data.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_write_index, false)
@@ -140,7 +129,7 @@
 // If true, when WINDOW_UPDATE is received, add stream to session's write
 // blocked list and let session unblock it later.
 QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_streams_unblocked_by_session,
+          FLAGS_quic_reloadable_flag_quic_streams_unblocked_by_session2,
           false)
 
 // If true, inspects CHLO packets for indicator tags to allow early session
@@ -149,7 +138,7 @@
 
 // When true, ignore the specified ack delay if it causes the RTT sample to be
 // less than min_rtt.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_min_rtt_ack_delay, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_min_rtt_ack_delay, true)
 
 // If true, plugin control frame manager to QuicSession, and let it manage sent
 // control frames.
diff --git a/net/quic/core/quic_flow_controller_test.cc b/net/quic/core/quic_flow_controller_test.cc
index 6ee961ca..e5028170 100644
--- a/net/quic/core/quic_flow_controller_test.cc
+++ b/net/quic/core/quic_flow_controller_test.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/quic_connection_peer.h"
@@ -38,10 +39,10 @@
     connection_ = new MockQuicConnection(&helper_, &alarm_factory_,
                                          Perspective::IS_CLIENT);
     session_ = QuicMakeUnique<MockQuicSession>(connection_);
-    flow_controller_.reset(new QuicFlowController(
+    flow_controller_ = QuicMakeUnique<QuicFlowController>(
         session_.get(), connection_, stream_id_, Perspective::IS_CLIENT,
         send_window_, receive_window_, should_auto_tune_receive_window_,
-        &session_flow_controller_));
+        &session_flow_controller_);
   }
 
   bool ClearControlFrame(const QuicFrame& frame) {
diff --git a/net/quic/core/quic_framer_test.cc b/net/quic/core/quic_framer_test.cc
index 7a56317..14e8b28 100644
--- a/net/quic/core/quic_framer_test.cc
+++ b/net/quic/core/quic_framer_test.cc
@@ -149,12 +149,13 @@
   void OnPacket() override {}
 
   void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
-    public_reset_packet_.reset(new QuicPublicResetPacket(packet));
+    public_reset_packet_ = QuicMakeUnique<QuicPublicResetPacket>((packet));
   }
 
   void OnVersionNegotiationPacket(
       const QuicVersionNegotiationPacket& packet) override {
-    version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet));
+    version_negotiation_packet_ =
+        QuicMakeUnique<QuicVersionNegotiationPacket>((packet));
   }
 
   bool OnProtocolVersionMismatch(ParsedQuicVersion version) override {
@@ -164,7 +165,7 @@
   }
 
   bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
-    header_.reset(new QuicPacketHeader(header));
+    header_ = QuicMakeUnique<QuicPacketHeader>((header));
     return accept_public_header_;
   }
 
@@ -176,7 +177,7 @@
 
   bool OnPacketHeader(const QuicPacketHeader& header) override {
     ++packet_count_;
-    header_.reset(new QuicPacketHeader(header));
+    header_ = QuicMakeUnique<QuicPacketHeader>((header));
     return accept_packet_;
   }
 
diff --git a/net/quic/core/quic_headers_stream_test.cc b/net/quic/core/quic_headers_stream_test.cc
index e9d8144..b389a13f 100644
--- a/net/quic/core/quic_headers_stream_test.cc
+++ b/net/quic/core/quic_headers_stream_test.cc
@@ -231,7 +231,7 @@
   }
 
   void SaveToHandler(size_t size, const QuicHeaderList& header_list) {
-    headers_handler_.reset(new TestHeadersHandler);
+    headers_handler_ = QuicMakeUnique<TestHeadersHandler>();
     headers_handler_->OnHeaderBlockStart();
     for (const auto& p : header_list) {
       headers_handler_->OnHeader(p.first, p.second);
@@ -275,7 +275,7 @@
                             /*parent_stream_id=*/0,
                             /*exclusive=*/false, fin, kFrameComplete));
     }
-    headers_handler_.reset(new TestHeadersHandler);
+    headers_handler_ = QuicMakeUnique<TestHeadersHandler>();
     EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id))
         .WillOnce(Return(headers_handler_.get()));
     EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id)).Times(1);
@@ -381,7 +381,7 @@
       // Parse the outgoing data and check that it matches was was written.
       EXPECT_CALL(visitor_,
                   OnPushPromise(stream_id, promised_stream_id, kFrameComplete));
-      headers_handler_.reset(new TestHeadersHandler);
+      headers_handler_ = QuicMakeUnique<TestHeadersHandler>();
       EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id))
           .WillOnce(Return(headers_handler_.get()));
       EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id)).Times(1);
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc
index d86f2c92..a3e9a87 100644
--- a/net/quic/core/quic_sent_packet_manager.cc
+++ b/net/quic/core/quic_sent_packet_manager.cc
@@ -994,6 +994,9 @@
 
 void QuicSentPacketManager::CancelRetransmissionsForStream(
     QuicStreamId stream_id) {
+  if (session_decides_what_to_write()) {
+    return;
+  }
   unacked_packets_.CancelRetransmissionsForStream(stream_id);
   PendingRetransmissionMap::iterator it = pending_retransmissions_.begin();
   while (it != pending_retransmissions_.end()) {
diff --git a/net/quic/core/quic_server_session_base_test.cc b/net/quic/core/quic_server_session_base_test.cc
index 71e1a9d..afc48cc1 100644
--- a/net/quic/core/quic_server_session_base_test.cc
+++ b/net/quic/core/quic_server_session_base_test.cc
@@ -141,9 +141,9 @@
     ParsedQuicVersionVector supported_versions = SupportedVersions(GetParam());
     connection_ = new StrictMock<MockQuicConnection>(
         &helper_, &alarm_factory_, Perspective::IS_SERVER, supported_versions);
-    session_.reset(new TestServerSession(
+    session_ = QuicMakeUnique<TestServerSession>(
         config_, connection_, &owner_, &stream_helper_, &crypto_config_,
-        &compressed_certs_cache_, &response_cache_));
+        &compressed_certs_cache_, &response_cache_);
     MockClock clock;
     handshake_message_.reset(crypto_config_.AddDefaultConfig(
         QuicRandom::GetInstance(), &clock,
diff --git a/net/quic/core/quic_session.cc b/net/quic/core/quic_session.cc
index f9d1bf9..b8b584fb 100644
--- a/net/quic/core/quic_session.cc
+++ b/net/quic/core/quic_session.cc
@@ -59,7 +59,7 @@
       control_frame_manager_(this),
       can_use_slices_(GetQuicReloadableFlag(quic_use_mem_slices)),
       session_unblocks_stream_(
-          GetQuicReloadableFlag(quic_streams_unblocked_by_session)) {
+          GetQuicReloadableFlag(quic_streams_unblocked_by_session2)) {
   if (use_control_frame_manager()) {
     QUIC_FLAG_COUNT(quic_reloadable_flag_quic_use_control_frame_manager);
   }
diff --git a/net/quic/core/quic_session.h b/net/quic/core/quic_session.h
index be409867..210a1e0 100644
--- a/net/quic/core/quic_session.h
+++ b/net/quic/core/quic_session.h
@@ -544,7 +544,7 @@
   // List of streams with pending retransmissions.
   QuicLinkedHashMap<QuicStreamId, bool> streams_with_pending_retransmission_;
 
-  // Latched value of quic_reloadable_flag_quic_streams_unblocked_by_session.
+  // Latched value of quic_reloadable_flag_quic_streams_unblocked_by_session2.
   const bool session_unblocks_stream_;
 
   DISALLOW_COPY_AND_ASSIGN(QuicSession);
diff --git a/net/quic/core/quic_spdy_client_session_base.cc b/net/quic/core/quic_spdy_client_session_base.cc
index 2361b19..e635839 100644
--- a/net/quic/core/quic_spdy_client_session_base.cc
+++ b/net/quic/core/quic_spdy_client_session_base.cc
@@ -98,7 +98,7 @@
     return false;
   }
 
-  const QuicString url = SpdyUtils::GetPromisedUrlFromHeaderBlock(headers);
+  const QuicString url = SpdyUtils::GetPromisedUrlFromHeaders(headers);
   QuicClientPromisedInfo* old_promised = GetPromisedByUrl(url);
   if (old_promised) {
     QUIC_DVLOG(1) << "Promise for stream " << promised_id
diff --git a/net/quic/core/quic_spdy_session.cc b/net/quic/core/quic_spdy_session.cc
index a7bfc08..2e433eca 100644
--- a/net/quic/core/quic_spdy_session.cc
+++ b/net/quic/core/quic_spdy_session.cc
@@ -336,7 +336,7 @@
     DCHECK_EQ(headers_stream_id, kHeadersStreamId);
   }
 
-  headers_stream_.reset(new QuicHeadersStream(this));
+  headers_stream_ = QuicMakeUnique<QuicHeadersStream>((this));
   DCHECK_EQ(kHeadersStreamId, headers_stream_->id());
   static_streams()[kHeadersStreamId] = headers_stream_.get();
 
diff --git a/net/quic/core/quic_session_test.cc b/net/quic/core/quic_spdy_session_test.cc
similarity index 99%
rename from net/quic/core/quic_session_test.cc
rename to net/quic/core/quic_spdy_session_test.cc
index 28362fec..d2df3f09 100644
--- a/net/quic/core/quic_session_test.cc
+++ b/net/quic/core/quic_spdy_session_test.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 "net/quic/core/quic_session.h"
+#include "net/quic/core/quic_spdy_session.h"
 
 #include <cstdint>
 #include <set>
diff --git a/net/quic/core/quic_spdy_stream_test.cc b/net/quic/core/quic_spdy_stream_test.cc
index 8a43907..1b52494 100644
--- a/net/quic/core/quic_spdy_stream_test.cc
+++ b/net/quic/core/quic_spdy_stream_test.cc
@@ -124,7 +124,8 @@
     connection_ = new testing::StrictMock<MockQuicConnection>(
         &helper_, &alarm_factory_, Perspective::IS_SERVER,
         SupportedVersions(GetParam()));
-    session_.reset(new testing::StrictMock<MockQuicSpdySession>(connection_));
+    session_ =
+        QuicMakeUnique<testing::StrictMock<MockQuicSpdySession>>(connection_);
     stream_ = new TestStream(GetNthClientInitiatedId(0), session_.get(),
                              stream_should_process_data);
     session_->ActivateStream(QuicWrapUnique(stream_));
diff --git a/net/quic/core/quic_stream.cc b/net/quic/core/quic_stream.cc
index d156bd6..8334938 100644
--- a/net/quic/core/quic_stream.cc
+++ b/net/quic/core/quic_stream.cc
@@ -519,11 +519,9 @@
 void QuicStream::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) {
   if (flow_controller_.UpdateSendWindowOffset(frame.byte_offset)) {
     if (session_->session_unblocks_stream()) {
-      if (HasBufferedData()) {
-        QUIC_FLAG_COUNT(quic_reloadable_flag_quic_streams_unblocked_by_session);
-        // Let session unblock this stream.
-        session_->MarkConnectionLevelWriteBlocked(id_);
-      }
+      QUIC_FLAG_COUNT(quic_reloadable_flag_quic_streams_unblocked_by_session2);
+      // Let session unblock this stream.
+      session_->MarkConnectionLevelWriteBlocked(id_);
     } else {
       // Writing can be done again!
       // TODO(rjshade): This does not respect priorities (e.g. multiple
diff --git a/net/quic/core/quic_stream_sequencer.cc b/net/quic/core/quic_stream_sequencer.cc
index ed75b30..176b0c9 100644
--- a/net/quic/core/quic_stream_sequencer.cc
+++ b/net/quic/core/quic_stream_sequencer.cc
@@ -82,11 +82,8 @@
     }
     return;
   }
-  bool stream_unblocked = byte_offset == buffered_frames_.BytesConsumed();
-  if (buffered_frames_.allow_overlapping_data()) {
-    stream_unblocked =
-        previous_readable_bytes == 0 && buffered_frames_.ReadableBytes() > 0;
-  }
+  const bool stream_unblocked =
+      previous_readable_bytes == 0 && buffered_frames_.ReadableBytes() > 0;
   if (stream_unblocked) {
     if (ignore_read_data_) {
       FlushBufferedFrames();
diff --git a/net/quic/core/quic_stream_sequencer_buffer.cc b/net/quic/core/quic_stream_sequencer_buffer.cc
index 941ead4..d7f2acb 100644
--- a/net/quic/core/quic_stream_sequencer_buffer.cc
+++ b/net/quic/core/quic_stream_sequencer_buffer.cc
@@ -31,9 +31,7 @@
 // Upper limit of how many gaps allowed in buffer, which ensures a reasonable
 // number of iterations needed to find the right gap to fill when a frame
 // arrives.
-// TODO(fayang): Rename kMaxNumGapsAllowed to kMaxNumDataIntervalsAllowed when
-// deprecating quic_reloadable_flag_quic_allow_receiving_overlapping_data.
-const size_t kMaxNumGapsAllowed = 2 * kMaxPacketGap;
+const size_t kMaxNumDataIntervalsAllowed = 2 * kMaxPacketGap;
 
 }  // namespace
 
@@ -53,12 +51,7 @@
       blocks_count_(CalculateBlockCount(max_capacity_bytes)),
       total_bytes_read_(0),
       blocks_(nullptr),
-      destruction_indicator_(123456),
-      allow_overlapping_data_(
-          GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
-  if (allow_overlapping_data_) {
-    QUIC_FLAG_COUNT(quic_reloadable_flag_quic_allow_receiving_overlapping_data);
-  }
+      destruction_indicator_(123456) {
   CHECK_GT(blocks_count_, 1u)
       << "blocks_count_ = " << blocks_count_
       << ", max_buffer_capacity_bytes_ = " << max_buffer_capacity_bytes_;
@@ -79,17 +72,8 @@
     }
   }
   num_bytes_buffered_ = 0;
-  if (allow_overlapping_data_) {
-    bytes_received_.Clear();
-    bytes_received_.Add(0, total_bytes_read_);
-  } else {
-    // Reset gaps_ so that buffer is in a state as if all data before
-    // total_bytes_read_ has been consumed, and those after total_bytes_read_
-    // has never arrived.
-    gaps_ = std::list<Gap>(
-        1,
-        Gap(total_bytes_read_, std::numeric_limits<QuicStreamOffset>::max()));
-  }
+  bytes_received_.Clear();
+  bytes_received_.Add(0, total_bytes_read_);
 
   frame_arrival_time_map_.clear();
 }
@@ -113,122 +97,44 @@
     QuicString* error_details) {
   CHECK_EQ(destruction_indicator_, 123456) << "This object has been destructed";
   *bytes_buffered = 0;
-  QuicStreamOffset offset = starting_offset;
   size_t size = data.size();
   if (size == 0) {
     *error_details = "Received empty stream frame without FIN.";
     return QUIC_EMPTY_STREAM_FRAME_NO_FIN;
   }
-  if (allow_overlapping_data_) {
-    // Write beyond the current range this buffer is covering.
-    if (starting_offset + size >
-            total_bytes_read_ + max_buffer_capacity_bytes_ ||
-        starting_offset + size < starting_offset) {
-      *error_details = "Received data beyond available range.";
-      return QUIC_INTERNAL_ERROR;
-    }
-
-    QuicIntervalSet<QuicStreamOffset> newly_received(starting_offset,
-                                                     starting_offset + size);
-    newly_received.Difference(bytes_received_);
-    if (newly_received.Empty()) {
-      return QUIC_NO_ERROR;
-    }
-    bytes_received_.Add(starting_offset, starting_offset + size);
-    if (bytes_received_.Size() >= kMaxNumGapsAllowed) {
-      // This frame is going to create more intervals than allowed. Stop
-      // processing.
-      *error_details = "Too many data intervals received for this stream.";
-      return QUIC_TOO_MANY_STREAM_DATA_INTERVALS;
-    }
-    for (const auto& interval : newly_received) {
-      const QuicStreamOffset copy_offset = interval.min();
-      const QuicByteCount copy_length = interval.max() - interval.min();
-      size_t bytes_copy = 0;
-      if (!CopyStreamData(
-              copy_offset,
-              data.substr(copy_offset - starting_offset, copy_length),
-              &bytes_copy, error_details)) {
-        return QUIC_STREAM_SEQUENCER_INVALID_STATE;
-      }
-      *bytes_buffered += bytes_copy;
-      frame_arrival_time_map_.insert(
-          std::make_pair(copy_offset, FrameInfo(copy_length, timestamp)));
-    }
-    num_bytes_buffered_ += *bytes_buffered;
-    return QUIC_NO_ERROR;
-  }
-
-  // Find the first gap not ending before |offset|. This gap maybe the gap to
-  // fill if the arriving frame doesn't overlaps with previous ones.
-  std::list<Gap>::iterator current_gap = gaps_.begin();
-  while (current_gap != gaps_.end() && current_gap->end_offset <= offset) {
-    ++current_gap;
-  }
-
-  if (current_gap == gaps_.end()) {
-    *error_details = "Received stream data outside of maximum range.";
-    return QUIC_INTERNAL_ERROR;
-  }
-
-  // "duplication": might duplicate with data alread filled,but also might
-  // overlap across different QuicStringPiece objects already written.
-  // In both cases, don't write the data,
-  // and allow the caller of this method to handle the result.
-  if (offset < current_gap->begin_offset &&
-      offset + size <= current_gap->begin_offset) {
-    QUIC_DVLOG(1) << "Duplicated data at offset: " << offset
-                  << " length: " << size;
-    return QUIC_NO_ERROR;
-  }
-  if (offset < current_gap->begin_offset &&
-      offset + size > current_gap->begin_offset) {
-    // Beginning of new data overlaps data before current gap.
-    QuicString prefix(data.data(), data.length() < 128 ? data.length() : 128);
-    *error_details =
-        QuicStrCat("Beginning of received data overlaps with buffered data.\n",
-                   "New frame range [", offset, ", ", offset + size,
-                   ") with first 128 bytes: ", prefix, "\n",
-                   "Currently received frames: ", GapsDebugString(), "\n",
-                   "Current gaps: ", ReceivedFramesDebugString());
-    return QUIC_OVERLAPPING_STREAM_DATA;
-  }
-  if (offset + size > current_gap->end_offset) {
-    // End of new data overlaps with data after current gap.
-    QuicString prefix(data.data(), data.length() < 128 ? data.length() : 128);
-    *error_details = QuicStrCat(
-        "End of received data overlaps with buffered data.\nNew frame range [",
-        offset, ", ", offset + size, ") with first 128 bytes: ", prefix, "\n",
-        "Currently received frames: ", ReceivedFramesDebugString(), "\n",
-        "Current gaps: ", GapsDebugString());
-    return QUIC_OVERLAPPING_STREAM_DATA;
-  }
-
   // Write beyond the current range this buffer is covering.
-  if (offset + size > total_bytes_read_ + max_buffer_capacity_bytes_ ||
-      offset + size < offset) {
+  if (starting_offset + size > total_bytes_read_ + max_buffer_capacity_bytes_ ||
+      starting_offset + size < starting_offset) {
     *error_details = "Received data beyond available range.";
     return QUIC_INTERNAL_ERROR;
   }
 
-  if (current_gap->begin_offset != starting_offset &&
-      current_gap->end_offset != starting_offset + data.length() &&
-      gaps_.size() >= kMaxNumGapsAllowed) {
-    // This frame is going to create one more gap which exceeds max number of
-    // gaps allowed. Stop processing.
-    *error_details = "Too many gaps created for this stream.";
+  QuicIntervalSet<QuicStreamOffset> newly_received(starting_offset,
+                                                   starting_offset + size);
+  newly_received.Difference(bytes_received_);
+  if (newly_received.Empty()) {
+    return QUIC_NO_ERROR;
+  }
+  bytes_received_.Add(starting_offset, starting_offset + size);
+  if (bytes_received_.Size() >= kMaxNumDataIntervalsAllowed) {
+    // This frame is going to create more intervals than allowed. Stop
+    // processing.
+    *error_details = "Too many data intervals received for this stream.";
     return QUIC_TOO_MANY_STREAM_DATA_INTERVALS;
   }
-
-  if (!CopyStreamData(offset, data, bytes_buffered, error_details)) {
-    return QUIC_STREAM_SEQUENCER_INVALID_STATE;
+  for (const auto& interval : newly_received) {
+    const QuicStreamOffset copy_offset = interval.min();
+    const QuicByteCount copy_length = interval.max() - interval.min();
+    size_t bytes_copy = 0;
+    if (!CopyStreamData(copy_offset,
+                        data.substr(copy_offset - starting_offset, copy_length),
+                        &bytes_copy, error_details)) {
+      return QUIC_STREAM_SEQUENCER_INVALID_STATE;
+    }
+    *bytes_buffered += bytes_copy;
+    frame_arrival_time_map_.insert(
+        std::make_pair(copy_offset, FrameInfo(copy_length, timestamp)));
   }
-
-  DCHECK_GT(*bytes_buffered, 0u);
-  UpdateGapList(current_gap, starting_offset, *bytes_buffered);
-
-  frame_arrival_time_map_.insert(
-      std::make_pair(starting_offset, FrameInfo(size, timestamp)));
   num_bytes_buffered_ += *bytes_buffered;
   return QUIC_NO_ERROR;
 }
@@ -311,36 +217,6 @@
   return true;
 }
 
-inline void QuicStreamSequencerBuffer::UpdateGapList(
-    std::list<Gap>::iterator gap_with_new_data_written,
-    QuicStreamOffset start_offset,
-    size_t bytes_written) {
-  if (gap_with_new_data_written->begin_offset == start_offset &&
-      gap_with_new_data_written->end_offset > start_offset + bytes_written) {
-    // New data has been written into the left part of the buffer.
-    gap_with_new_data_written->begin_offset = start_offset + bytes_written;
-  } else if (gap_with_new_data_written->begin_offset < start_offset &&
-             gap_with_new_data_written->end_offset ==
-                 start_offset + bytes_written) {
-    // New data has been written into the right part of the buffer.
-    gap_with_new_data_written->end_offset = start_offset;
-  } else if (gap_with_new_data_written->begin_offset < start_offset &&
-             gap_with_new_data_written->end_offset >
-                 start_offset + bytes_written) {
-    // New data has been written into the middle of the buffer.
-    auto current = gap_with_new_data_written++;
-    QuicStreamOffset current_end = current->end_offset;
-    current->end_offset = start_offset;
-    gaps_.insert(gap_with_new_data_written,
-                 Gap(start_offset + bytes_written, current_end));
-  } else if (gap_with_new_data_written->begin_offset == start_offset &&
-             gap_with_new_data_written->end_offset ==
-                 start_offset + bytes_written) {
-    // This gap has been filled with new data. So it's no longer a gap.
-    gaps_.erase(gap_with_new_data_written);
-  }
-}
-
 QuicErrorCode QuicStreamSequencerBuffer::Readv(const iovec* dest_iov,
                                                size_t dest_count,
                                                size_t* bytes_read,
@@ -595,37 +471,22 @@
 
   // Read index remains in this block, which means a gap has been reached.
   if (NextBlockToRead() == block_index) {
-    if (allow_overlapping_data_) {
-      if (bytes_received_.Size() > 1) {
-        auto it = bytes_received_.begin();
-        ++it;
-        if (GetBlockIndex(it->min()) == block_index) {
-          // Do not retire the block if next data interval is in this block.
-          return true;
-        }
-      } else {
-        QUIC_BUG << "Read stopped at where it shouldn't.";
-        return false;
-      }
-    } else {
-      Gap first_gap = gaps_.front();
-      DCHECK(first_gap.begin_offset == total_bytes_read_);
-      // Check where the next piece data is.
-      // Not empty if next piece of data is still in this chunk.
-      bool gap_ends_in_this_block =
-          (GetBlockIndex(first_gap.end_offset) == block_index);
-      if (gap_ends_in_this_block) {
+    if (bytes_received_.Size() > 1) {
+      auto it = bytes_received_.begin();
+      ++it;
+      if (GetBlockIndex(it->min()) == block_index) {
+        // Do not retire the block if next data interval is in this block.
         return true;
       }
+    } else {
+      QUIC_BUG << "Read stopped at where it shouldn't.";
+      return false;
     }
   }
   return RetireBlock(block_index);
 }
 
 bool QuicStreamSequencerBuffer::Empty() const {
-  if (!allow_overlapping_data_) {
-    return gaps_.size() == 1 && gaps_.front().begin_offset == total_bytes_read_;
-  }
   return bytes_received_.Empty() ||
          (bytes_received_.Size() == 1 && total_bytes_read_ > 0 &&
           bytes_received_.begin()->max() == total_bytes_read_);
@@ -667,17 +528,7 @@
 }
 
 QuicString QuicStreamSequencerBuffer::GapsDebugString() {
-  if (allow_overlapping_data_) {
-    return bytes_received_.ToString();
-  }
-  QuicString current_gaps_string;
-  for (const Gap& gap : gaps_) {
-    QuicStreamOffset current_gap_begin = gap.begin_offset;
-    QuicStreamOffset current_gap_end = gap.end_offset;
-    current_gaps_string.append(
-        QuicStrCat("[", current_gap_begin, ", ", current_gap_end, ") "));
-  }
-  return current_gaps_string;
+  return bytes_received_.ToString();
 }
 
 QuicString QuicStreamSequencerBuffer::ReceivedFramesDebugString() {
@@ -694,24 +545,18 @@
 }
 
 QuicStreamOffset QuicStreamSequencerBuffer::FirstMissingByte() const {
-  if (allow_overlapping_data_) {
-    if (bytes_received_.Empty() || bytes_received_.begin()->min() > 0) {
-      // Offset 0 is not received yet.
-      return 0;
-    }
-    return bytes_received_.begin()->max();
+  if (bytes_received_.Empty() || bytes_received_.begin()->min() > 0) {
+    // Offset 0 is not received yet.
+    return 0;
   }
-  return gaps_.front().begin_offset;
+  return bytes_received_.begin()->max();
 }
 
 QuicStreamOffset QuicStreamSequencerBuffer::NextExpectedByte() const {
-  if (allow_overlapping_data_) {
-    if (bytes_received_.Empty()) {
-      return 0;
-    }
-    return bytes_received_.rbegin()->max();
+  if (bytes_received_.Empty()) {
+    return 0;
   }
-  return gaps_.back().begin_offset;
+  return bytes_received_.rbegin()->max();
 }
 
 }  //  namespace net
diff --git a/net/quic/core/quic_stream_sequencer_buffer.h b/net/quic/core/quic_stream_sequencer_buffer.h
index ae94385..af5555a 100644
--- a/net/quic/core/quic_stream_sequencer_buffer.h
+++ b/net/quic/core/quic_stream_sequencer_buffer.h
@@ -171,8 +171,6 @@
   // Returns number of bytes available to be read out.
   size_t ReadableBytes() const;
 
-  bool allow_overlapping_data() const { return allow_overlapping_data_; }
-
  private:
   friend class test::QuicStreamSequencerBufferPeer;
 
@@ -196,14 +194,6 @@
   // Return false on success, or false otherwise.
   bool RetireBlockIfEmpty(size_t block_index);
 
-  // Called within OnStreamData() to update the gap OnStreamData() writes into
-  // (remove, split or change begin/end offset).
-  // TODO(fayang): Remove this when deprecating
-  // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
-  void UpdateGapList(std::list<Gap>::iterator gap_with_new_data_written,
-                     QuicStreamOffset start_offset,
-                     size_t bytes_written);
-
   // Calculate the capacity of block at specified index.
   // Return value should be either kBlockSizeBytes for non-trailing blocks and
   // max_buffer_capacity % kBlockSizeBytes for trailing block.
@@ -249,11 +239,6 @@
   // Number of bytes read out of buffer.
   QuicStreamOffset total_bytes_read_;
 
-  // Contains Gaps which represents currently missing data.
-  // TODO(fayang): Remove list of gaps when deprecating
-  // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
-  std::list<Gap> gaps_;
-
   // An ordered, variable-length list of blocks, with the length limited
   // such that the number of blocks never exceeds blocks_count_.
   // Each list entry can hold up to kBlockSizeBytes bytes.
@@ -263,8 +248,7 @@
   size_t num_bytes_buffered_;
 
   // Stores all the buffered frames' start offset, length and arrival time.
-  // TODO(fayang): Remove this when deprecating
-  // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
+  // TODO(fayang): Remove this as it is obsolete.
   std::map<QuicStreamOffset, FrameInfo> frame_arrival_time_map_;
 
   // For debugging use after free, assigned to 123456 in constructor and 654321
@@ -275,10 +259,6 @@
   // Currently received data.
   QuicIntervalSet<QuicStreamOffset> bytes_received_;
 
-  // Latched value of
-  // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
-  const bool allow_overlapping_data_;
-
   DISALLOW_COPY_AND_ASSIGN(QuicStreamSequencerBuffer);
 };
 }  // namespace net
diff --git a/net/quic/core/quic_stream_sequencer_buffer_test.cc b/net/quic/core/quic_stream_sequencer_buffer_test.cc
index 1da8708c..a0fb4b0 100644
--- a/net/quic/core/quic_stream_sequencer_buffer_test.cc
+++ b/net/quic/core/quic_stream_sequencer_buffer_test.cc
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
@@ -66,8 +67,8 @@
 
  protected:
   void Initialize() {
-    buffer_.reset(new QuicStreamSequencerBuffer(max_capacity_bytes_));
-    helper_.reset(new QuicStreamSequencerBufferPeer(buffer_.get()));
+    buffer_ = QuicMakeUnique<QuicStreamSequencerBuffer>((max_capacity_bytes_));
+    helper_ = QuicMakeUnique<QuicStreamSequencerBufferPeer>((buffer_.get()));
   }
 
   // Use 2.5 here to make sure the buffer has more than one block and its end
@@ -129,17 +130,11 @@
   for (size_t i = 0; i < source.size(); ++i) {
     ASSERT_EQ('a', block_ptr->buffer[helper_->GetInBlockOffset(800) + i]);
   }
-  EXPECT_EQ(2, helper_->GapSize());
+  EXPECT_EQ(2, helper_->IntervalSize());
   EXPECT_EQ(0u, helper_->ReadableBytes());
-  if (helper_->allow_overlapping_data()) {
-    EXPECT_EQ(1u, helper_->bytes_received().Size());
-    EXPECT_EQ(800u, helper_->bytes_received().begin()->min());
-    EXPECT_EQ(1824u, helper_->bytes_received().begin()->max());
-  } else {
-    std::list<Gap> gaps = helper_->GetGaps();
-    EXPECT_EQ(800u, gaps.front().end_offset);
-    EXPECT_EQ(1824u, gaps.back().begin_offset);
-  }
+  EXPECT_EQ(1u, helper_->bytes_received().Size());
+  EXPECT_EQ(800u, helper_->bytes_received().begin()->min());
+  EXPECT_EQ(1824u, helper_->bytes_received().begin()->max());
   auto* frame_map = helper_->frame_arrival_time_map();
   EXPECT_EQ(1u, frame_map->size());
   EXPECT_EQ(800u, frame_map->begin()->first);
@@ -175,24 +170,14 @@
   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
   QuicTime t2 = clock_.ApproximateNow();
   auto* frame_map = helper_->frame_arrival_time_map();
-  if (helper_->allow_overlapping_data()) {
-    EXPECT_EQ(QUIC_NO_ERROR,
-              buffer_->OnStreamData(0, source, t2, &written, &error_details_));
-    EXPECT_EQ(QUIC_NO_ERROR, buffer_->OnStreamData(1024, source, t2, &written,
-                                                   &error_details_));
-    EXPECT_EQ(3u, frame_map->size());
-    EXPECT_EQ(t1, (*frame_map)[800].timestamp);
-    EXPECT_EQ(t2, (*frame_map)[0].timestamp);
-    EXPECT_EQ(t2, (*frame_map)[1824].timestamp);
-    return;
-  }
-  // But no byte will be written since overlap.
-  EXPECT_EQ(QUIC_OVERLAPPING_STREAM_DATA,
+  EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(0, source, t2, &written, &error_details_));
-  EXPECT_EQ(QUIC_OVERLAPPING_STREAM_DATA,
+  EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(1024, source, t2, &written, &error_details_));
-  EXPECT_EQ(1u, frame_map->size());
+  EXPECT_EQ(3u, frame_map->size());
   EXPECT_EQ(t1, (*frame_map)[800].timestamp);
+  EXPECT_EQ(t2, (*frame_map)[0].timestamp);
+  EXPECT_EQ(t2, (*frame_map)[1824].timestamp);
 }
 
 TEST_F(QuicStreamSequencerBufferTest,
@@ -205,38 +190,15 @@
   source = QuicString(800, 'b');
   QuicString one_byte = "c";
   auto* frame_map = helper_->frame_arrival_time_map();
-  if (helper_->allow_overlapping_data()) {
-    // Write [1, 801).
-    EXPECT_EQ(QUIC_NO_ERROR,
-              buffer_->OnStreamData(1, source, clock_.ApproximateNow(),
-                                    &written, &error_details_));
-    // Write [0, 800).
-    EXPECT_EQ(QUIC_NO_ERROR,
-              buffer_->OnStreamData(0, source, clock_.ApproximateNow(),
-                                    &written, &error_details_));
-    // Write [1823, 1824).
-    EXPECT_EQ(QUIC_NO_ERROR,
-              buffer_->OnStreamData(1823, one_byte, clock_.ApproximateNow(),
-                                    &written, &error_details_));
-    EXPECT_EQ(0u, written);
-    // write one byte to [1824, 1825)
-    EXPECT_EQ(QUIC_NO_ERROR,
-              buffer_->OnStreamData(1824, one_byte, clock_.ApproximateNow(),
-                                    &written, &error_details_));
-    EXPECT_EQ(4u, frame_map->size());
-    EXPECT_TRUE(helper_->CheckBufferInvariants());
-    return;
-  }
-
-  // Try to write to [1, 801), but should fail due to overlapping
-  EXPECT_EQ(QUIC_OVERLAPPING_STREAM_DATA,
+  // Write [1, 801).
+  EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(1, source, clock_.ApproximateNow(), &written,
                                   &error_details_));
-  // write to [0, 800)
+  // Write [0, 800).
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(0, source, clock_.ApproximateNow(), &written,
                                   &error_details_));
-  // Try to write one byte to [1823, 1824), but should count as duplicate
+  // Write [1823, 1824).
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(1823, one_byte, clock_.ApproximateNow(),
                                   &written, &error_details_));
@@ -245,7 +207,7 @@
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(1824, one_byte, clock_.ApproximateNow(),
                                   &written, &error_details_));
-  EXPECT_EQ(3u, frame_map->size());
+  EXPECT_EQ(4u, frame_map->size());
   EXPECT_TRUE(helper_->CheckBufferInvariants());
 }
 
@@ -262,7 +224,7 @@
             buffer_->OnStreamData(kBlockSizeBytes * 2 - 20, source,
                                   clock_.ApproximateNow(), &written,
                                   &error_details_));
-  EXPECT_EQ(3, helper_->GapSize());
+  EXPECT_EQ(3, helper_->IntervalSize());
   EXPECT_EQ(1024u + 100u, buffer_->BytesBuffered());
   EXPECT_TRUE(helper_->CheckBufferInvariants());
 }
@@ -271,13 +233,7 @@
   // Assume a stream has already buffered almost 4GB.
   uint64_t total_bytes_read = pow(2, 32) - 1;
   helper_->set_total_bytes_read(total_bytes_read);
-  if (helper_->allow_overlapping_data()) {
-    helper_->AddBytesReceived(0, total_bytes_read);
-  } else {
-    helper_->set_gaps(std::list<Gap>(
-        1,
-        Gap(total_bytes_read, std::numeric_limits<QuicStreamOffset>::max())));
-  }
+  helper_->AddBytesReceived(0, total_bytes_read);
 
   // Three new out of order frames arrive.
   const size_t kBytesToWrite = 100;
@@ -288,21 +244,21 @@
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(offset, source, clock_.ApproximateNow(),
                                   &written, &error_details_));
-  EXPECT_EQ(2, helper_->GapSize());
+  EXPECT_EQ(2, helper_->IntervalSize());
 
   // Frame [2^32 + 700, 2^32 + 800).
   offset = pow(2, 32) + 700;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(offset, source, clock_.ApproximateNow(),
                                   &written, &error_details_));
-  EXPECT_EQ(3, helper_->GapSize());
+  EXPECT_EQ(3, helper_->IntervalSize());
 
   // Another frame [2^32 + 300, 2^32 + 400).
   offset = pow(2, 32) + 300;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(offset, source, clock_.ApproximateNow(),
                                   &written, &error_details_));
-  EXPECT_EQ(4, helper_->GapSize());
+  EXPECT_EQ(4, helper_->IntervalSize());
 }
 
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataTillEnd) {
@@ -865,12 +821,8 @@
     QuicStreamOffset last_straw = 2 * kMaxNumGapsAllowed - 1;
     if (begin == last_straw) {
       EXPECT_EQ(QUIC_TOO_MANY_STREAM_DATA_INTERVALS, rs);
-      if (GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
-        EXPECT_EQ("Too many data intervals received for this stream.",
-                  error_details_);
-      } else {
-        EXPECT_EQ("Too many gaps created for this stream.", error_details_);
-      }
+      EXPECT_EQ("Too many data intervals received for this stream.",
+                error_details_);
       break;
     }
   }
diff --git a/net/quic/core/quic_stream_sequencer_test.cc b/net/quic/core/quic_stream_sequencer_test.cc
index 581d150..4ec52a03 100644
--- a/net/quic/core/quic_stream_sequencer_test.cc
+++ b/net/quic/core/quic_stream_sequencer_test.cc
@@ -566,22 +566,13 @@
   sequencer_->OnStreamFrame(frame1);
 
   QuicStreamFrame frame2(id, false, 2, QuicStringPiece("hello"));
-  if (GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
-    EXPECT_CALL(stream_,
-                CloseConnectionWithDetails(QUIC_OVERLAPPING_STREAM_DATA, _))
-        .Times(0);
-  } else {
-    EXPECT_CALL(stream_,
-                CloseConnectionWithDetails(QUIC_OVERLAPPING_STREAM_DATA, _))
-        .Times(1);
-  }
+  EXPECT_CALL(stream_,
+              CloseConnectionWithDetails(QUIC_OVERLAPPING_STREAM_DATA, _))
+      .Times(0);
   sequencer_->OnStreamFrame(frame2);
 }
 
 TEST_F(QuicStreamSequencerTest, DataAvailableOnOverlappingFrames) {
-  if (!GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
-    return;
-  }
   QuicStreamId id =
       QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 0);
   const QuicString data(1000, '.');
diff --git a/net/quic/core/quic_stream_test.cc b/net/quic/core/quic_stream_test.cc
index 935e48b..af56b2eff 100644
--- a/net/quic/core/quic_stream_test.cc
+++ b/net/quic/core/quic_stream_test.cc
@@ -107,7 +107,7 @@
   void Initialize(bool stream_should_process_data) {
     connection_ = new StrictMock<MockQuicConnection>(
         &helper_, &alarm_factory_, Perspective::IS_SERVER, supported_versions_);
-    session_.reset(new StrictMock<MockQuicSession>(connection_));
+    session_ = QuicMakeUnique<StrictMock<MockQuicSession>>(connection_);
 
     // New streams rely on having the peer's flow control receive window
     // negotiated in the config.
@@ -1239,6 +1239,35 @@
   }
 }
 
+// Regression test for b/73282665.
+TEST_F(QuicStreamTest,
+       MarkConnectionLevelWriteBlockedOnWindowUpdateFrameWithNoBufferedData) {
+  SetQuicReloadableFlag(quic_streams_unblocked_by_session2, true);
+  // Set a small initial flow control window size.
+  const uint32_t kSmallWindow = 100;
+  set_initial_flow_control_window_bytes(kSmallWindow);
+  Initialize(kShouldProcessData);
+
+  QuicString data(kSmallWindow, '.');
+  EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
+      .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
+  if (session_->use_control_frame_manager()) {
+    EXPECT_CALL(*connection_, SendControlFrame(_))
+        .WillOnce(Invoke(this, &QuicStreamTest::ClearControlFrame));
+  } else {
+    EXPECT_CALL(*connection_, SendBlocked(stream_->id()));
+  }
+  stream_->WriteOrBufferData(data, false, nullptr);
+  EXPECT_FALSE(HasWriteBlockedStreams());
+
+  QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream_->id(),
+                                      120);
+  stream_->OnWindowUpdateFrame(window_update);
+  EXPECT_FALSE(stream_->HasBufferedData());
+  // Verify stream is marked as blocked although there is no buffered data.
+  EXPECT_TRUE(HasWriteBlockedStreams());
+}
+
 TEST_F(QuicStreamTest, RetransmitStreamData) {
   Initialize(kShouldProcessData);
   InSequence s;
diff --git a/net/quic/core/quic_unacked_packet_map.cc b/net/quic/core/quic_unacked_packet_map.cc
index 1f0c0de3..678bc53 100644
--- a/net/quic/core/quic_unacked_packet_map.cc
+++ b/net/quic/core/quic_unacked_packet_map.cc
@@ -255,6 +255,7 @@
 
 void QuicUnackedPacketMap::CancelRetransmissionsForStream(
     QuicStreamId stream_id) {
+  DCHECK(!session_decides_what_to_write_);
   QuicPacketNumber packet_number = least_unacked_;
   for (UnackedPacketMap::iterator it = unacked_packets_.begin();
        it != unacked_packets_.end(); ++it, ++packet_number) {
diff --git a/net/quic/core/quic_unacked_packet_map_test.cc b/net/quic/core/quic_unacked_packet_map_test.cc
index 7a9a839..52fb410 100644
--- a/net/quic/core/quic_unacked_packet_map_test.cc
+++ b/net/quic/core/quic_unacked_packet_map_test.cc
@@ -207,7 +207,11 @@
   VerifyRetransmittablePackets(retransmittable,
                                QUIC_ARRAYSIZE(retransmittable));
 
-  unacked_packets_.CancelRetransmissionsForStream(stream_id);
+  if (unacked_packets_.session_decides_what_to_write()) {
+    EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
+  } else {
+    unacked_packets_.CancelRetransmissionsForStream(stream_id);
+  }
   VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyInFlightPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyRetransmittablePackets(nullptr, 0);
@@ -226,7 +230,9 @@
                                QUIC_ARRAYSIZE(retransmittable));
 
   // Stop retransmissions on another stream and verify the packet is unchanged.
-  unacked_packets_.CancelRetransmissionsForStream(stream_id + 2);
+  if (!unacked_packets_.session_decides_what_to_write()) {
+    unacked_packets_.CancelRetransmissionsForStream(stream_id + 2);
+  }
   VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyInFlightPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyRetransmittablePackets(retransmittable,
@@ -250,7 +256,11 @@
   }
   VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
 
-  unacked_packets_.CancelRetransmissionsForStream(stream_id);
+  if (unacked_packets_.session_decides_what_to_write()) {
+    EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
+  } else {
+    unacked_packets_.CancelRetransmissionsForStream(stream_id);
+  }
   VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyInFlightPackets(unacked, QUIC_ARRAYSIZE(unacked));
   VerifyRetransmittablePackets(nullptr, 0);
diff --git a/net/quic/core/quic_version_manager.cc b/net/quic/core/quic_version_manager.cc
index 71e9069a..14b7235 100644
--- a/net/quic/core/quic_version_manager.cc
+++ b/net/quic/core/quic_version_manager.cc
@@ -13,9 +13,7 @@
     ParsedQuicVersionVector supported_versions)
     : enable_version_99_(GetQuicFlag(FLAGS_quic_enable_version_99)),
       enable_version_43_(GetQuicReloadableFlag(quic_enable_version_43)),
-      enable_version_42_(
-          GetQuicReloadableFlag(quic_enable_version_42) &&
-          GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)),
+      enable_version_42_(GetQuicReloadableFlag(quic_enable_version_42)),
       disable_version_41_(GetQuicReloadableFlag(quic_disable_version_41)),
       disable_version_38_(GetQuicReloadableFlag(quic_disable_version_38)),
       disable_version_37_(GetQuicReloadableFlag(quic_disable_version_37)),
@@ -39,17 +37,13 @@
 void QuicVersionManager::MaybeRefilterSupportedVersions() {
   if (enable_version_99_ != GetQuicFlag(FLAGS_quic_enable_version_99) ||
       enable_version_43_ != GetQuicReloadableFlag(quic_enable_version_43) ||
-      enable_version_42_ !=
-          (GetQuicReloadableFlag(quic_enable_version_42) &&
-           GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) ||
+      enable_version_42_ != GetQuicReloadableFlag(quic_enable_version_42) ||
       disable_version_41_ != GetQuicReloadableFlag(quic_disable_version_41) ||
       disable_version_38_ != GetQuicReloadableFlag(quic_disable_version_38) ||
       disable_version_37_ != GetQuicReloadableFlag(quic_disable_version_37)) {
     enable_version_99_ = GetQuicFlag(FLAGS_quic_enable_version_99);
     enable_version_43_ = GetQuicReloadableFlag(quic_enable_version_43);
-    enable_version_42_ =
-        (GetQuicReloadableFlag(quic_enable_version_42) &&
-         GetQuicReloadableFlag(quic_allow_receiving_overlapping_data));
+    enable_version_42_ = GetQuicReloadableFlag(quic_enable_version_42);
     disable_version_37_ = GetQuicReloadableFlag(quic_disable_version_37);
     disable_version_38_ = GetQuicReloadableFlag(quic_disable_version_38);
     disable_version_41_ = GetQuicReloadableFlag(quic_disable_version_41);
diff --git a/net/quic/core/quic_version_manager.h b/net/quic/core/quic_version_manager.h
index 07fc69b9..95f5662 100644
--- a/net/quic/core/quic_version_manager.h
+++ b/net/quic/core/quic_version_manager.h
@@ -39,8 +39,7 @@
   bool enable_version_99_;
   // FLAGS_quic_enable_version_43
   bool enable_version_43_;
-  // FLAGS_quic_reloadable_flag_quic_enable_version_42 and
-  // FLAGS_quic_reloadable_flag_quic_allow_receiving_overlapping_data.
+  // FLAGS_quic_reloadable_flag_quic_enable_version_42.
   bool enable_version_42_;
   // FLAGS_quic_reloadable_flag_quic_disable_version_41
   bool disable_version_41_;
diff --git a/net/quic/core/quic_version_manager_test.cc b/net/quic/core/quic_version_manager_test.cc
index bbf39c2..bcb0ab3 100644
--- a/net/quic/core/quic_version_manager_test.cc
+++ b/net/quic/core/quic_version_manager_test.cc
@@ -50,7 +50,6 @@
             manager.GetSupportedTransportVersions());
 
   SetQuicReloadableFlag(quic_enable_version_42, true);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   EXPECT_EQ(QuicTransportVersionVector({QUIC_VERSION_42, QUIC_VERSION_41,
                                         QUIC_VERSION_39, QUIC_VERSION_38,
                                         QUIC_VERSION_37, QUIC_VERSION_35}),
diff --git a/net/quic/core/quic_versions.cc b/net/quic/core/quic_versions.cc
index 139daf66..38e7193 100644
--- a/net/quic/core/quic_versions.cc
+++ b/net/quic/core/quic_versions.cc
@@ -146,19 +146,16 @@
     if (version.transport_version == QUIC_VERSION_99) {
       if (GetQuicFlag(FLAGS_quic_enable_version_99) &&
           GetQuicReloadableFlag(quic_enable_version_43) &&
-          GetQuicReloadableFlag(quic_enable_version_42) &&
-          GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
+          GetQuicReloadableFlag(quic_enable_version_42)) {
         filtered_versions.push_back(version);
       }
     } else if (version.transport_version == QUIC_VERSION_43) {
       if (GetQuicReloadableFlag(quic_enable_version_43) &&
-          GetQuicReloadableFlag(quic_enable_version_42) &&
-          GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
+          GetQuicReloadableFlag(quic_enable_version_42)) {
         filtered_versions.push_back(version);
       }
     } else if (version.transport_version == QUIC_VERSION_42) {
-      if (GetQuicReloadableFlag(quic_enable_version_42) &&
-          GetQuicReloadableFlag(quic_allow_receiving_overlapping_data)) {
+      if (GetQuicReloadableFlag(quic_enable_version_42)) {
         filtered_versions.push_back(version);
       }
     } else if (version.transport_version == QUIC_VERSION_41) {
diff --git a/net/quic/core/quic_versions_test.cc b/net/quic/core/quic_versions_test.cc
index 7f9182b6..9c023341 100644
--- a/net/quic/core/quic_versions_test.cc
+++ b/net/quic/core/quic_versions_test.cc
@@ -320,7 +320,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, true);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, true);
   SetQuicFlag(&FLAGS_quic_enable_version_99, true);
   ParsedQuicVersionVector parsed_versions;
@@ -346,7 +345,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, true);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, true);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
@@ -372,7 +370,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, true);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, false);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
@@ -398,7 +395,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, false);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, false);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
@@ -424,7 +420,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, true);
   SetQuicReloadableFlag(quic_disable_version_41, true);
   SetQuicReloadableFlag(quic_enable_version_42, false);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, false);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
@@ -449,7 +444,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, true);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, false);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, false);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
@@ -474,7 +468,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, false);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, false);
   SetQuicFlag(&FLAGS_quic_enable_version_99, false);
   ParsedQuicVersionVector parsed_versions;
diff --git a/net/quic/core/spdy_utils.cc b/net/quic/core/spdy_utils.cc
index 79b0393..d4f1531 100644
--- a/net/quic/core/spdy_utils.cc
+++ b/net/quic/core/spdy_utils.cc
@@ -128,7 +128,7 @@
 }
 
 // static
-QuicString SpdyUtils::GetPromisedUrlFromHeaderBlock(
+QuicString SpdyUtils::GetPromisedUrlFromHeaders(
     const SpdyHeaderBlock& headers) {
   // RFC 7540, Section 8.1.2.3: All HTTP/2 requests MUST include exactly
   // one valid value for the ":method", ":scheme", and ":path" pseudo-header
@@ -182,16 +182,16 @@
 }
 
 // static
-QuicString SpdyUtils::GetHostNameFromHeaderBlock(
+QuicString SpdyUtils::GetPromisedHostNameFromHeaders(
     const SpdyHeaderBlock& headers) {
   // TODO(fayang): Consider just checking out the value of the ":authority" key
   // in headers.
-  return QuicUrlUtils::HostName(GetPromisedUrlFromHeaderBlock(headers));
+  return QuicUrlUtils::HostName(GetPromisedUrlFromHeaders(headers));
 }
 
 // static
-bool SpdyUtils::UrlIsValid(const SpdyHeaderBlock& headers) {
-  QuicString url(GetPromisedUrlFromHeaderBlock(headers));
+bool SpdyUtils::PromisedUrlIsValid(const SpdyHeaderBlock& headers) {
+  QuicString url(GetPromisedUrlFromHeaders(headers));
   return !url.empty() && QuicUrlUtils::IsValidUrl(url);
 }
 
diff --git a/net/quic/core/spdy_utils.h b/net/quic/core/spdy_utils.h
index aca48662..af2ea4d 100644
--- a/net/quic/core/spdy_utils.h
+++ b/net/quic/core/spdy_utils.h
@@ -39,15 +39,15 @@
   // :path headers of a PUSH_PROMISE. Returns empty string if the headers do not
   // conform to HTTP/2 spec or if the ":method" header contains a forbidden
   // method for PUSH_PROMISE.
-  static QuicString GetPromisedUrlFromHeaderBlock(
+  static QuicString GetPromisedUrlFromHeaders(const SpdyHeaderBlock& headers);
+
+  // Returns hostname, or empty std::string if missing.
+  static QuicString GetPromisedHostNameFromHeaders(
       const SpdyHeaderBlock& headers);
 
-  // Returns hostname, or empty string if missing.
-  static QuicString GetHostNameFromHeaderBlock(const SpdyHeaderBlock& headers);
-
-  // Returns true if result of |GetPromisedUrlFromHeaderBlock()| is non-empty
+  // Returns true if result of |GetPromisedUrlFromHeaders()| is non-empty
   // and is a well-formed URL.
-  static bool UrlIsValid(const SpdyHeaderBlock& headers);
+  static bool PromisedUrlIsValid(const SpdyHeaderBlock& headers);
 
   // Populates the fields of |headers| to make a GET request of |url|,
   // which must be fully-qualified.
diff --git a/net/quic/core/spdy_utils_test.cc b/net/quic/core/spdy_utils_test.cc
index 2c1797b..bca36cce 100644
--- a/net/quic/core/spdy_utils_test.cc
+++ b/net/quic/core/spdy_utils_test.cc
@@ -300,58 +300,61 @@
           Pair("key", "value")));
 }
 
-using GetPromisedUrlFromHeaderBlock = QuicTest;
+using GetPromisedUrlFromHeaders = QuicTest;
 
-TEST_F(GetPromisedUrlFromHeaderBlock, Basic) {
+TEST_F(GetPromisedUrlFromHeaders, Basic) {
   SpdyHeaderBlock headers;
   headers[":method"] = "GET";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":scheme"] = "https";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":authority"] = "www.google.com";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":path"] = "/index.html";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers),
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers),
             "https://www.google.com/index.html");
   headers["key1"] = "value1";
   headers["key2"] = "value2";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers),
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers),
             "https://www.google.com/index.html");
 }
 
-TEST_F(GetPromisedUrlFromHeaderBlock, Connect) {
+TEST_F(GetPromisedUrlFromHeaders, Connect) {
   SpdyHeaderBlock headers;
   headers[":method"] = "CONNECT";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":authority"] = "www.google.com";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":scheme"] = "https";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
   headers[":path"] = "https";
-  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedUrlFromHeaders(headers), "");
 }
 
-using GetHostNameFromHeaderBlock = QuicTest;
+using GetPromisedHostNameFromHeaders = QuicTest;
 
-TEST_F(GetHostNameFromHeaderBlock, NormalUsage) {
+TEST_F(GetPromisedHostNameFromHeaders, NormalUsage) {
   SpdyHeaderBlock headers;
   headers[":method"] = "GET";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers), "");
   headers[":scheme"] = "https";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers), "");
   headers[":authority"] = "www.google.com";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers), "");
   headers[":path"] = "/index.html";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers),
+            "www.google.com");
   headers["key1"] = "value1";
   headers["key2"] = "value2";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers),
+            "www.google.com");
   headers[":authority"] = "www.google.com:6666";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers),
+            "www.google.com");
   headers[":authority"] = "192.168.1.1";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers), "192.168.1.1");
   headers[":authority"] = "192.168.1.1:6666";
-  EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1");
+  EXPECT_EQ(SpdyUtils::GetPromisedHostNameFromHeaders(headers), "192.168.1.1");
 }
 
 using PopulateHeaderBlockFromUrl = QuicTest;
diff --git a/net/quic/core/tls_handshaker_test.cc b/net/quic/core/tls_handshaker_test.cc
index 29ab1fc0..27821c309 100644
--- a/net/quic/core/tls_handshaker_test.cc
+++ b/net/quic/core/tls_handshaker_test.cc
@@ -5,6 +5,7 @@
 #include "net/quic/core/tls_client_handshaker.h"
 #include "net/quic/core/tls_server_handshaker.h"
 #include "net/quic/platform/api/quic_arraysize.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
diff --git a/net/quic/http/decoder/quic_http_frame_decoder_adapter.cc b/net/quic/http/decoder/quic_http_frame_decoder_adapter.cc
index aea4551..6d93022 100644
--- a/net/quic/http/decoder/quic_http_frame_decoder_adapter.cc
+++ b/net/quic/http/decoder/quic_http_frame_decoder_adapter.cc
@@ -776,7 +776,7 @@
   CorruptFrameHeader(&frame_header_);
   CorruptFrameHeader(&hpack_first_frame_header_);
 
-  frame_decoder_.reset(new QuicHttpFrameDecoder(this));
+  frame_decoder_ = QuicMakeUnique<QuicHttpFrameDecoder>(this);
   hpack_decoder_ = nullptr;
 }
 
diff --git a/net/quic/http/decoder/quic_http_structure_decoder_test.cc b/net/quic/http/decoder/quic_http_structure_decoder_test.cc
index 3f7f1ee5..fba3c9c 100644
--- a/net/quic/http/decoder/quic_http_structure_decoder_test.cc
+++ b/net/quic/http/decoder/quic_http_structure_decoder_test.cc
@@ -181,7 +181,6 @@
     return AssertionSuccess();
   }
 
-  uint32_t decode_offset_ = 0;
   S structure_;
   QuicHttpStructureDecoder structure_decoder_;
   size_t fast_decode_count_ = 0;
diff --git a/net/quic/quartc/quartc_session.cc b/net/quic/quartc/quartc_session.cc
index 68b0e0a..5bb483b 100644
--- a/net/quic/quartc/quartc_session.cc
+++ b/net/quic/quartc/quartc_session.cc
@@ -130,8 +130,8 @@
   // Initialization with default crypto configuration.
   if (perspective_ == Perspective::IS_CLIENT) {
     std::unique_ptr<ProofVerifier> proof_verifier(new InsecureProofVerifier);
-    quic_crypto_client_config_.reset(new QuicCryptoClientConfig(
-        std::move(proof_verifier), TlsClientHandshaker::CreateSslCtx()));
+    quic_crypto_client_config_ = QuicMakeUnique<QuicCryptoClientConfig>(
+        std::move(proof_verifier), TlsClientHandshaker::CreateSslCtx());
   } else {
     std::unique_ptr<ProofSource> proof_source(new DummyProofSource);
     // Generate a random source address token secret. For long-running servers
@@ -140,10 +140,10 @@
     char source_address_token_secret[kInputKeyingMaterialLength];
     helper_->GetRandomGenerator()->RandBytes(source_address_token_secret,
                                              kInputKeyingMaterialLength);
-    quic_crypto_server_config_.reset(new QuicCryptoServerConfig(
+    quic_crypto_server_config_ = QuicMakeUnique<QuicCryptoServerConfig>(
         string(source_address_token_secret, kInputKeyingMaterialLength),
         helper_->GetRandomGenerator(), std::move(proof_source),
-        TlsServerHandshaker::CreateSslCtx()));
+        TlsServerHandshaker::CreateSslCtx());
     // Provide server with serialized config string to prove ownership.
     QuicCryptoServerConfig::ConfigOptions options;
     // The |message| is used to handle the return value of AddDefaultConfig
diff --git a/net/quic/quartc/quartc_session_test.cc b/net/quic/quartc/quartc_session_test.cc
index 549c8ec..6117233 100644
--- a/net/quic/quartc/quartc_session_test.cc
+++ b/net/quic/quartc/quartc_session_test.cc
@@ -9,6 +9,7 @@
 #include "net/quic/core/quic_types.h"
 #include "net/quic/core/tls_client_handshaker.h"
 #include "net/quic/core/tls_server_handshaker.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/quartc/quartc_factory.h"
 #include "net/quic/quartc/quartc_factory_interface.h"
 #include "net/quic/quartc/quartc_packet_writer.h"
@@ -373,9 +374,9 @@
                       perspective,
                       helper,
                       clock) {
-    stream_delegate_.reset(new FakeQuartcStreamDelegate);
-    session_delegate_.reset(
-        new FakeQuartcSessionDelegate(stream_delegate_.get()));
+    stream_delegate_ = QuicMakeUnique<FakeQuartcStreamDelegate>();
+    session_delegate_ =
+        QuicMakeUnique<FakeQuartcSessionDelegate>((stream_delegate_.get()));
 
     SetDelegate(session_delegate_.get());
   }
@@ -408,20 +409,22 @@
   void Init() {
     // Quic crashes if packets are sent at time 0, and the clock defaults to 0.
     clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
-    client_channel_.reset(new FakeTransportChannel(&task_runner_, &clock_));
-    server_channel_.reset(new FakeTransportChannel(&task_runner_, &clock_));
+    client_channel_ =
+        QuicMakeUnique<FakeTransportChannel>(&task_runner_, &clock_);
+    server_channel_ =
+        QuicMakeUnique<FakeTransportChannel>(&task_runner_, &clock_);
     // Make the channel asynchronous so that two peer will not keep calling each
     // other when they exchange information.
     client_channel_->SetAsync(true);
     client_channel_->SetDestination(server_channel_.get());
 
-    client_transport_.reset(new FakeTransport(client_channel_.get()));
-    server_transport_.reset(new FakeTransport(server_channel_.get()));
+    client_transport_ = QuicMakeUnique<FakeTransport>(client_channel_.get());
+    server_transport_ = QuicMakeUnique<FakeTransport>(server_channel_.get());
 
-    client_writer_.reset(
-        new QuartcPacketWriter(client_transport_.get(), kDefaultMaxPacketSize));
-    server_writer_.reset(
-        new QuartcPacketWriter(server_transport_.get(), kDefaultMaxPacketSize));
+    client_writer_ = QuicMakeUnique<QuartcPacketWriter>(client_transport_.get(),
+                                                        kDefaultMaxPacketSize);
+    server_writer_ = QuicMakeUnique<QuartcPacketWriter>(server_transport_.get(),
+                                                        kDefaultMaxPacketSize);
 
     client_writer_->SetWritable();
     server_writer_->SetWritable();
@@ -481,7 +484,7 @@
       QuartcFactoryConfig config;
       config.clock = &quartc_clock_;
       config.task_runner = &task_runner_;
-      alarm_factory_.reset(new QuartcFactory(config));
+      alarm_factory_ = QuicMakeUnique<QuartcFactory>(config);
     }
     return std::unique_ptr<QuicConnection>(new QuicConnection(
         0, QuicSocketAddress(ip, 0), this /*QuicConnectionHelperInterface*/,
diff --git a/net/quic/quartc/quartc_stream_test.cc b/net/quic/quartc/quartc_stream_test.cc
index 408f18d..27065ad 100644
--- a/net/quic/quartc/quartc_stream_test.cc
+++ b/net/quic/quartc/quartc_stream_test.cc
@@ -8,6 +8,7 @@
 #include "net/quic/core/quic_data_writer.h"
 #include "net/quic/core/quic_session.h"
 #include "net/quic/core/quic_simple_buffer_allocator.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/quartc/quartc_clock_interface.h"
 #include "net/quic/quartc/quartc_factory.h"
 #include "net/quic/test_tools/mock_clock.h"
@@ -163,17 +164,17 @@
 
     // We only use QuartcFactory for its role as an alarm factory.
     QuartcFactoryConfig config;
-    alarm_factory_.reset(new QuartcFactory(config));
+    alarm_factory_ = QuicMakeUnique<QuartcFactory>(config);
 
-    connection_.reset(new QuicConnection(
+    connection_ = QuicMakeUnique<QuicConnection>(
         0, QuicSocketAddress(ip, 0), this /*QuicConnectionHelperInterface*/,
         alarm_factory_.get(), new DummyPacketWriter(), owns_writer, perspective,
-        AllSupportedVersions()));
+        AllSupportedVersions());
 
-    session_.reset(
-        new MockQuicSession(connection_.get(), QuicConfig(), &write_buffer_));
-    mock_stream_delegate_.reset(
-        new MockQuartcStreamDelegate(kStreamId, &read_buffer_));
+    session_ = QuicMakeUnique<MockQuicSession>(connection_.get(), QuicConfig(),
+                                               &write_buffer_);
+    mock_stream_delegate_ =
+        QuicMakeUnique<MockQuartcStreamDelegate>(kStreamId, &read_buffer_);
     stream_ = new QuartcStream(kStreamId, session_.get());
     stream_->SetDelegate(mock_stream_delegate_.get());
     session_->RegisterReliableStream(stream_->stream_id(), kDefaultPriority);
diff --git a/net/quic/test_tools/crypto_test_utils.cc b/net/quic/test_tools/crypto_test_utils.cc
index 3bb6d8d..7244c47 100644
--- a/net/quic/test_tools/crypto_test_utils.cc
+++ b/net/quic/test_tools/crypto_test_utils.cc
@@ -25,6 +25,7 @@
 #include "net/quic/platform/api/quic_bug_tracker.h"
 #include "net/quic/platform/api/quic_clock.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_socket_address.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/platform/api/quic_text_utils.h"
@@ -117,7 +118,7 @@
     const string& hostname,
     std::unique_ptr<ChannelIDKey>* channel_id_key,
     ChannelIDSourceCallback* /*callback*/) {
-  channel_id_key->reset(new TestChannelIDKey(HostnameToKey(hostname)));
+  *channel_id_key = QuicMakeUnique<TestChannelIDKey>(HostnameToKey(hostname));
   return QUIC_SUCCESS;
 }
 
diff --git a/net/quic/test_tools/fake_proof_source.cc b/net/quic/test_tools/fake_proof_source.cc
index cc60e238..c772e003 100644
--- a/net/quic/test_tools/fake_proof_source.cc
+++ b/net/quic/test_tools/fake_proof_source.cc
@@ -5,6 +5,7 @@
 #include "net/quic/test_tools/fake_proof_source.h"
 
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
 
 using std::string;
diff --git a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
index c7aa8e9..64f6454 100644
--- a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
+++ b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc
@@ -105,10 +105,7 @@
   return buffer_->blocks_[index];
 }
 
-int QuicStreamSequencerBufferPeer::GapSize() {
-  if (!buffer_->allow_overlapping_data_) {
-    return buffer_->gaps_.size();
-  }
+int QuicStreamSequencerBufferPeer::IntervalSize() {
   if (buffer_->bytes_received_.Empty()) {
     return 1;
   }
@@ -126,10 +123,6 @@
   return gap_size;
 }
 
-std::list<Gap> QuicStreamSequencerBufferPeer::GetGaps() {
-  return buffer_->gaps_;
-}
-
 size_t QuicStreamSequencerBufferPeer::max_buffer_capacity() {
   return buffer_->max_buffer_capacity_bytes_;
 }
@@ -148,10 +141,6 @@
   buffer_->total_bytes_read_ = total_bytes_read;
 }
 
-void QuicStreamSequencerBufferPeer::set_gaps(const std::list<Gap>& gaps) {
-  buffer_->gaps_ = gaps;
-}
-
 void QuicStreamSequencerBufferPeer::AddBytesReceived(QuicStreamOffset offset,
                                                      QuicByteCount length) {
   buffer_->bytes_received_.Add(offset, offset + length);
@@ -170,9 +159,5 @@
   return buffer_->bytes_received_;
 }
 
-bool QuicStreamSequencerBufferPeer::allow_overlapping_data() {
-  return buffer_->allow_overlapping_data_;
-}
-
 }  // namespace test
 }  // namespace net
diff --git a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
index 655e78b..dd8b4b34 100644
--- a/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
+++ b/net/quic/test_tools/quic_stream_sequencer_buffer_peer.h
@@ -34,11 +34,7 @@
 
   QuicStreamSequencerBuffer::BufferBlock* GetBlock(size_t index);
 
-  // TODO(fayang): Rename this to IntervalSize when deprecating
-  // quic_reloadable_flag_quic_allow_receiving_overlapping_data.
-  int GapSize();
-
-  std::list<QuicStreamSequencerBuffer::Gap> GetGaps();
+  int IntervalSize();
 
   size_t max_buffer_capacity();
 
@@ -49,8 +45,6 @@
 
   void set_total_bytes_read(QuicStreamOffset total_bytes_read);
 
-  void set_gaps(const std::list<QuicStreamSequencerBuffer::Gap>& gaps);
-
   void AddBytesReceived(QuicStreamOffset offset, QuicByteCount length);
 
   bool IsBufferAllocated();
@@ -59,8 +53,6 @@
 
   const QuicIntervalSet<QuicStreamOffset>& bytes_received();
 
-  bool allow_overlapping_data();
-
  private:
   QuicStreamSequencerBuffer* buffer_;
   DISALLOW_COPY_AND_ASSIGN(QuicStreamSequencerBufferPeer);
diff --git a/net/quic/test_tools/simple_quic_framer.cc b/net/quic/test_tools/simple_quic_framer.cc
index 2cab678..14c18736 100644
--- a/net/quic/test_tools/simple_quic_framer.cc
+++ b/net/quic/test_tools/simple_quic_framer.cc
@@ -31,11 +31,12 @@
 
   void OnPacket() override {}
   void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
-    public_reset_packet_.reset(new QuicPublicResetPacket(packet));
+    public_reset_packet_ = QuicMakeUnique<QuicPublicResetPacket>((packet));
   }
   void OnVersionNegotiationPacket(
       const QuicVersionNegotiationPacket& packet) override {
-    version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet));
+    version_negotiation_packet_ =
+        QuicMakeUnique<QuicVersionNegotiationPacket>((packet));
   }
 
   bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
@@ -175,13 +176,13 @@
 SimpleQuicFramer::~SimpleQuicFramer() {}
 
 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
-  visitor_.reset(new SimpleFramerVisitor);
+  visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
   framer_.set_visitor(visitor_.get());
   return framer_.ProcessPacket(packet);
 }
 
 void SimpleQuicFramer::Reset() {
-  visitor_.reset(new SimpleFramerVisitor);
+  visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
 }
 
 const QuicPacketHeader& SimpleQuicFramer::header() const {
diff --git a/net/quic/test_tools/simulator/link.h b/net/quic/test_tools/simulator/link.h
index 1850d8fa..8e3a4ed 100644
--- a/net/quic/test_tools/simulator/link.h
+++ b/net/quic/test_tools/simulator/link.h
@@ -31,9 +31,6 @@
   void Act() override;
 
   inline QuicBandwidth bandwidth() const { return bandwidth_; }
-  inline QuicTime::Delta propagation_delay() const {
-    return propagation_delay_;
-  }
 
  private:
   struct QueuedPacket {
@@ -79,13 +76,7 @@
                 QuicBandwidth bandwidth,
                 QuicTime::Delta propagation_delay);
 
-  inline ConstrainedPortInterface* GetTxPortForA() { return &a_to_b_link_; }
-  inline ConstrainedPortInterface* GetTxPortForB() { return &b_to_a_link_; }
-
   inline QuicBandwidth bandwidth() { return a_to_b_link_.bandwidth(); }
-  inline QuicTime::Delta propagation_delay() {
-    return a_to_b_link_.propagation_delay();
-  }
 
  private:
   OneWayLink a_to_b_link_;
diff --git a/net/quic/test_tools/simulator/packet_filter.h b/net/quic/test_tools/simulator/packet_filter.h
index f8caa2f0..65d86a78 100644
--- a/net/quic/test_tools/simulator/packet_filter.h
+++ b/net/quic/test_tools/simulator/packet_filter.h
@@ -42,8 +42,6 @@
   PacketFilter(Simulator* simulator, std::string name, Endpoint* input);
   ~PacketFilter() override;
 
-  Endpoint* input() { return input_; }
-
   // Implementation of ConstrainedPortInterface.
   void AcceptPacket(std::unique_ptr<Packet> packet) override;
   QuicTime::Delta TimeUntilAvailable() override;
diff --git a/net/quic/test_tools/simulator/simulator.h b/net/quic/test_tools/simulator/simulator.h
index 283f049..2561ce6a 100644
--- a/net/quic/test_tools/simulator/simulator.h
+++ b/net/quic/test_tools/simulator/simulator.h
@@ -51,9 +51,6 @@
   }
 
   inline bool enable_random_delays() const { return enable_random_delays_; }
-  inline void set_enable_random_delays(bool enable_random_delays) {
-    enable_random_delays_ = enable_random_delays;
-  }
 
   // Run the simulation until either no actors are scheduled or
   // |termination_predicate| returns true.  Returns true if terminated due to
diff --git a/net/quic/test_tools/simulator/switch.h b/net/quic/test_tools/simulator/switch.h
index f2fcb81c..c5e1cf45 100644
--- a/net/quic/test_tools/simulator/switch.h
+++ b/net/quic/test_tools/simulator/switch.h
@@ -32,9 +32,6 @@
     return &ports_[port_number - 1];
   }
 
-  inline const Queue* port_queue(SwitchPortNumber port_number) const {
-    return ports_[port_number - 1].queue();
-  }
   inline Queue* port_queue(SwitchPortNumber port_number) {
     return ports_[port_number - 1].queue();
   }
@@ -61,7 +58,6 @@
     void Act() override;
 
     inline bool connected() const { return connected_; }
-    inline const Queue* queue() const { return &queue_; }
     inline Queue* queue() { return &queue_; }
 
    private:
diff --git a/net/spdy/chromium/spdy_session.cc b/net/spdy/chromium/spdy_session.cc
index 53011eb0..f05a738fa 100644
--- a/net/spdy/chromium/spdy_session.cc
+++ b/net/spdy/chromium/spdy_session.cc
@@ -1616,7 +1616,7 @@
   }
 
   // Verify that the response had a URL for us.
-  GURL gurl(SpdyUtils::GetPromisedUrlFromHeaderBlock(headers));
+  GURL gurl(SpdyUtils::GetPromisedUrlFromHeaders(headers));
   if (!gurl.is_valid()) {
     EnqueueResetStreamFrame(stream_id, request_priority,
                             ERROR_CODE_REFUSED_STREAM,
diff --git a/net/test/url_request/url_request_mock_data_job.h b/net/test/url_request/url_request_mock_data_job.h
index 9799389..00646b5 100644
--- a/net/test/url_request/url_request_mock_data_job.h
+++ b/net/test/url_request/url_request_mock_data_job.h
@@ -57,9 +57,11 @@
                                          const std::string& data,
                                          int repeat_count);
 
+ protected:
+  ~URLRequestMockDataJob() override;
+
  private:
   void GetResponseInfoConst(HttpResponseInfo* info) const;
-  ~URLRequestMockDataJob() override;
 
   void StartAsync();
 
diff --git a/net/tools/quic/chlo_extractor_test.cc b/net/tools/quic/chlo_extractor_test.cc
index 4e65639..72c68b5 100644
--- a/net/tools/quic/chlo_extractor_test.cc
+++ b/net/tools/quic/chlo_extractor_test.cc
@@ -5,6 +5,7 @@
 #include "net/tools/quic/chlo_extractor.h"
 
 #include "net/quic/core/quic_framer.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
@@ -65,7 +66,7 @@
         framer.EncryptPayload(ENCRYPTION_NONE, header_.packet_number, *packet,
                               buffer_, arraysize(buffer_));
     ASSERT_NE(0u, encrypted_length);
-    packet_.reset(new QuicEncryptedPacket(buffer_, encrypted_length));
+    packet_ = QuicMakeUnique<QuicEncryptedPacket>(buffer_, encrypted_length);
     EXPECT_TRUE(packet_ != nullptr);
     delete stream_frame;
   }
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index 56c5652..2fdc7ba 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -438,7 +438,7 @@
     auto* test_server = new QuicTestServer(
         crypto_test_utils::ProofSourceForTesting(), server_config_,
         server_supported_versions_, &response_cache_);
-    server_thread_.reset(new ServerThread(test_server, server_address_));
+    server_thread_ = QuicMakeUnique<ServerThread>(test_server, server_address_);
     if (chlo_multiplier_ != 0) {
       server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
     }
diff --git a/net/tools/quic/quic_client_bin.cc b/net/tools/quic/quic_client_bin.cc
index d5c43714..7a2249b8 100644
--- a/net/tools/quic/quic_client_bin.cc
+++ b/net/tools/quic/quic_client_bin.cc
@@ -55,6 +55,7 @@
 #include "net/quic/core/quic_packets.h"
 #include "net/quic/core/quic_server_id.h"
 #include "net/quic/platform/api/quic_flags.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_socket_address.h"
 #include "net/quic/platform/api/quic_str_cat.h"
 #include "net/quic/platform/api/quic_string_piece.h"
@@ -271,11 +272,11 @@
   std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer(new CTPolicyEnforcer());
   std::unique_ptr<ProofVerifier> proof_verifier;
   if (line->HasSwitch("disable-certificate-verification")) {
-    proof_verifier.reset(new FakeProofVerifier());
+    proof_verifier = net::QuicMakeUnique<FakeProofVerifier>();
   } else {
-    proof_verifier.reset(new ProofVerifierChromium(
+    proof_verifier = net::QuicMakeUnique<ProofVerifierChromium>(
         cert_verifier.get(), ct_policy_enforcer.get(),
-        transport_security_state.get(), ct_verifier.get()));
+        transport_security_state.get(), ct_verifier.get());
   }
   net::QuicClient client(net::QuicSocketAddress(ip_addr, port), server_id,
                          versions, &epoll_server, std::move(proof_verifier));
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc
index 7cd119a..bab0eb0 100644
--- a/net/tools/quic/quic_dispatcher_test.cc
+++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -601,7 +601,6 @@
   SetQuicReloadableFlag(quic_disable_version_38, false);
   SetQuicReloadableFlag(quic_disable_version_41, false);
   SetQuicReloadableFlag(quic_enable_version_42, true);
-  SetQuicReloadableFlag(quic_allow_receiving_overlapping_data, true);
   SetQuicReloadableFlag(quic_enable_version_43, true);
   SetQuicFlag(&FLAGS_quic_enable_version_99, true);
   QuicSocketAddress client_address(QuicIpAddress::Loopback4(), 1);
diff --git a/net/tools/quic/quic_simple_server_session_test.cc b/net/tools/quic/quic_simple_server_session_test.cc
index 6545c5b..6800e761 100644
--- a/net/tools/quic/quic_simple_server_session_test.cc
+++ b/net/tools/quic/quic_simple_server_session_test.cc
@@ -17,6 +17,7 @@
 #include "net/quic/core/tls_server_handshaker.h"
 #include "net/quic/platform/api/quic_containers.h"
 #include "net/quic/platform/api/quic_flags.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_socket_address.h"
 #include "net/quic/platform/api/quic_string_piece.h"
 #include "net/quic/platform/api/quic_test.h"
@@ -200,9 +201,9 @@
     ParsedQuicVersionVector supported_versions = SupportedVersions(GetParam());
     connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>(
         &helper_, &alarm_factory_, Perspective::IS_SERVER, supported_versions);
-    session_.reset(new MockQuicSimpleServerSession(
+    session_ = QuicMakeUnique<MockQuicSimpleServerSession>(
         config_, connection_, &owner_, &stream_helper_, &crypto_config_,
-        &compressed_certs_cache_, &response_cache_));
+        &compressed_certs_cache_, &response_cache_);
     MockClock clock;
     handshake_message_.reset(crypto_config_.AddDefaultConfig(
         QuicRandom::GetInstance(), &clock,
@@ -475,9 +476,9 @@
     ParsedQuicVersionVector supported_versions = SupportedVersions(GetParam());
     connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>(
         &helper_, &alarm_factory_, Perspective::IS_SERVER, supported_versions);
-    session_.reset(new MockQuicSimpleServerSession(
+    session_ = QuicMakeUnique<MockQuicSimpleServerSession>(
         config_, connection_, &owner_, &stream_helper_, &crypto_config_,
-        &compressed_certs_cache_, &response_cache_));
+        &compressed_certs_cache_, &response_cache_);
     session_->Initialize();
     QuicSessionPeer::GetMutableCryptoStream(session_.get())
         ->OnSuccessfulVersionNegotiation(supported_versions.front());
diff --git a/net/tools/quic/quic_spdy_client_session_test.cc b/net/tools/quic/quic_spdy_client_session_test.cc
index 6403773..afc3fec 100644
--- a/net/tools/quic/quic_spdy_client_session_test.cc
+++ b/net/tools/quic/quic_spdy_client_session_test.cc
@@ -86,17 +86,17 @@
     connection_ = new PacketSavingConnection(&helper_, &alarm_factory_,
                                              Perspective::IS_CLIENT,
                                              SupportedVersions(GetParam()));
-    session_.reset(new TestQuicSpdyClientSession(
+    session_ = QuicMakeUnique<TestQuicSpdyClientSession>(
         DefaultQuicConfig(), connection_,
         QuicServerId(kServerHostname, kPort, PRIVACY_MODE_DISABLED),
-        &crypto_config_, &push_promise_index_));
+        &crypto_config_, &push_promise_index_);
     session_->Initialize();
     push_promise_[":path"] = "/bar";
     push_promise_[":authority"] = "www.google.com";
     push_promise_[":version"] = "HTTP/1.1";
     push_promise_[":method"] = "GET";
     push_promise_[":scheme"] = "https";
-    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_);
+    promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_);
     promised_stream_id_ =
         QuicSpdySessionPeer::GetNthServerInitiatedStreamId(*session_, 0);
     associated_stream_id_ =
@@ -503,8 +503,7 @@
         session_->HandlePromised(associated_stream_id_, id, push_promise_));
 
     // Verify that the promise is in the unclaimed streams map.
-    QuicString promise_url(
-        SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_));
+    QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
     EXPECT_NE(session_->GetPromisedByUrl(promise_url), nullptr);
     EXPECT_NE(session_->GetPromisedById(id), nullptr);
   }
@@ -524,8 +523,7 @@
       session_->HandlePromised(associated_stream_id_, id, push_promise_));
 
   // Verify that the promise was not created.
-  QuicString promise_url(
-      SpdyUtils::GetPromisedUrlFromHeaderBlock(push_promise_));
+  QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
   EXPECT_EQ(session_->GetPromisedById(id), nullptr);
   EXPECT_EQ(session_->GetPromisedByUrl(promise_url), nullptr);
 }
diff --git a/net/tools/quic/quic_spdy_client_stream_test.cc b/net/tools/quic/quic_spdy_client_stream_test.cc
index 026b4f41..d7cd4c31 100644
--- a/net/tools/quic/quic_spdy_client_stream_test.cc
+++ b/net/tools/quic/quic_spdy_client_stream_test.cc
@@ -11,6 +11,7 @@
 #include "net/quic/core/spdy_utils.h"
 #include "net/quic/core/tls_client_handshaker.h"
 #include "net/quic/platform/api/quic_logging.h"
+#include "net/quic/platform/api/quic_ptr_util.h"
 #include "net/quic/platform/api/quic_socket_address.h"
 #include "net/quic/platform/api/quic_string.h"
 #include "net/quic/platform/api/quic_test.h"
@@ -67,10 +68,10 @@
     headers_[":status"] = "200";
     headers_["content-length"] = "11";
 
-    stream_.reset(new QuicSpdyClientStream(
+    stream_ = QuicMakeUnique<QuicSpdyClientStream>(
         QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, 0),
-        &session_));
-    stream_visitor_.reset(new StreamVisitor());
+        &session_);
+    stream_visitor_ = QuicMakeUnique<StreamVisitor>();
     stream_->set_visitor(stream_visitor_.get());
   }
 
diff --git a/net/tools/quic/test_tools/quic_test_client.cc b/net/tools/quic/test_tools/quic_test_client.cc
index 5459e6a..ea67f70 100644
--- a/net/tools/quic/test_tools/quic_test_client.cc
+++ b/net/tools/quic/test_tools/quic_test_client.cc
@@ -347,8 +347,8 @@
       // May need to retry request if asynchronous rendezvous fails.
       std::unique_ptr<SpdyHeaderBlock> new_headers(
           new SpdyHeaderBlock(headers->Clone()));
-      push_promise_data_to_resend_.reset(new TestClientDataToResend(
-          std::move(new_headers), body, fin, this, std::move(ack_listener)));
+      push_promise_data_to_resend_ = QuicMakeUnique<TestClientDataToResend>(
+          std::move(new_headers), body, fin, this, std::move(ack_listener));
       return 1;
     }
   }
@@ -377,7 +377,7 @@
   if (GetQuicReloadableFlag(enable_quic_stateless_reject_support)) {
     std::unique_ptr<SpdyHeaderBlock> new_headers;
     if (headers) {
-      new_headers.reset(new SpdyHeaderBlock(headers->Clone()));
+      new_headers = QuicMakeUnique<SpdyHeaderBlock>(headers->Clone());
     }
     std::unique_ptr<QuicSpdyClientBase::QuicDataToResend> data_to_resend(
         new TestClientDataToResend(std::move(new_headers), body, fin, this,
diff --git a/net/url_request/test_url_request_interceptor.cc b/net/url_request/test_url_request_interceptor.cc
index 56b8d66..0fbd073 100644
--- a/net/url_request/test_url_request_interceptor.cc
+++ b/net/url_request/test_url_request_interceptor.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file_util.h"
 #include "base/macros.h"
-#include "base/threading/sequenced_worker_pool.h"
+#include "base/task_runner.h"
 #include "base/threading/thread_restrictions.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index a8c185a3..6d6ecd1 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -766,7 +766,7 @@
         "host_main.h",
       ]
       deps = [
-        "//base:debugging_flags",
+        "//base:debugging_buildflags",
       ]
     }
     if (is_mac) {
diff --git a/remoting/host/security_key/BUILD.gn b/remoting/host/security_key/BUILD.gn
index 7184626..33160c1 100644
--- a/remoting/host/security_key/BUILD.gn
+++ b/remoting/host/security_key/BUILD.gn
@@ -55,7 +55,7 @@
     "remote_security_key_main.h",
   ]
   deps = [
-    "//base:debugging_flags",
+    "//base:debugging_buildflags",
   ]
 }
 
diff --git a/remoting/ios/BUILD.gn b/remoting/ios/BUILD.gn
index eb234c6..bd2b63c8 100644
--- a/remoting/ios/BUILD.gn
+++ b/remoting/ios/BUILD.gn
@@ -27,8 +27,6 @@
     "client_gestures.mm",
     "client_keyboard.h",
     "client_keyboard.mm",
-    "keychain_wrapper.h",
-    "keychain_wrapper.mm",
   ]
 
   public_deps = [
diff --git a/remoting/ios/facade/remoting_oauth_authentication.h b/remoting/ios/facade/remoting_oauth_authentication.h
index 3fc22310..b5cc3aa4e 100644
--- a/remoting/ios/facade/remoting_oauth_authentication.h
+++ b/remoting/ios/facade/remoting_oauth_authentication.h
@@ -7,7 +7,8 @@
 
 #import "remoting/ios/facade/remoting_authentication.h"
 
-// The OAuth implementation for RemotingAuthentication.
+// The OAuth implementation for RemotingAuthentication. Note that this is only
+// used by the open source app variant. The official app uses SSO to sign in.
 @interface RemotingOAuthAuthentication : NSObject<RemotingAuthentication>
 
 // Provide an |authorizationCode| to authenticate a user as the first time user
diff --git a/remoting/ios/facade/remoting_oauth_authentication.mm b/remoting/ios/facade/remoting_oauth_authentication.mm
index 5b32998..f15e244 100644
--- a/remoting/ios/facade/remoting_oauth_authentication.mm
+++ b/remoting/ios/facade/remoting_oauth_authentication.mm
@@ -17,7 +17,7 @@
 #import "remoting/ios/facade/host_list_fetcher.h"
 #import "remoting/ios/facade/ios_client_runtime_delegate.h"
 #import "remoting/ios/facade/remoting_service.h"
-#import "remoting/ios/keychain_wrapper.h"
+#import "remoting/ios/persistence/remoting_keychain.h"
 #import "remoting/ios/persistence/remoting_preferences.h"
 
 #include "base/logging.h"
@@ -26,10 +26,18 @@
 #include "remoting/base/oauth_token_getter.h"
 #include "remoting/base/oauth_token_getter_impl.h"
 
-const char kOauthRedirectUrl[] =
+static const char kOauthRedirectUrl[] =
     "https://chromoting-oauth.talkgadget."
     "google.com/talkgadget/oauth/chrome-remote-desktop/dev";
 
+// We currently don't support multi-account sign in for OAuth authentication, so
+// we store the current refresh token for an unspecified account. If we later
+// decide to support multi-account sign in, we may use the user email as the
+// account name when storing the refresh token and store the current user email
+// in UserDefaults.
+static const auto kRefreshTokenAccount =
+    remoting::Keychain::kUnspecifiedAccount;
+
 std::unique_ptr<remoting::OAuthTokenGetter>
 CreateOAuthTokenGetterWithAuthorizationCode(
     const std::string& auth_code,
@@ -79,7 +87,6 @@
 
 @interface RemotingOAuthAuthentication () {
   std::unique_ptr<remoting::OAuthTokenGetter> _tokenGetter;
-  KeychainWrapper* _keychainWrapper;
   BOOL _firstLoadUserAttempt;
 }
 @end
@@ -92,7 +99,6 @@
 - (instancetype)init {
   self = [super init];
   if (self) {
-    _keychainWrapper = KeychainWrapper.instance;
     _user = nil;
     _firstLoadUserAttempt = YES;
   }
@@ -183,19 +189,24 @@
 - (void)storeUserInfo:(UserInfo*)user {
   if (user) {
     [RemotingPreferences instance].activeUserKey = user.userEmail;
-    // TODO(nicholss): Need to match the token with the email.
-    [_keychainWrapper setRefreshToken:user.refreshToken];
+    std::string refreshToken = base::SysNSStringToUTF8(user.refreshToken);
+    remoting::RemotingKeychain::GetInstance()->SetData(
+        remoting::Keychain::Key::REFRESH_TOKEN, kRefreshTokenAccount,
+        refreshToken);
   } else {
     [RemotingPreferences instance].activeUserKey = nil;
-    [_keychainWrapper resetKeychainItem];
+    remoting::RemotingKeychain::GetInstance()->RemoveData(
+        remoting::Keychain::Key::REFRESH_TOKEN, kRefreshTokenAccount);
   }
 }
 
 - (UserInfo*)loadUserInfo {
   UserInfo* user = [[UserInfo alloc] init];
   user.userEmail = [RemotingPreferences instance].activeUserKey;
-  // TODO(nicholss): Need to match the token with the email.
-  user.refreshToken = [_keychainWrapper refreshToken];
+  std::string refreshTokenString =
+      remoting::RemotingKeychain::GetInstance()->GetData(
+          remoting::Keychain::Key::REFRESH_TOKEN, kRefreshTokenAccount);
+  user.refreshToken = base::SysUTF8ToNSString(refreshTokenString);
 
   if (!user || ![user isAuthenticated]) {
     user = nil;
diff --git a/remoting/ios/facade/remoting_service.mm b/remoting/ios/facade/remoting_service.mm
index 33fdfa1..8a8822f 100644
--- a/remoting/ios/facade/remoting_service.mm
+++ b/remoting/ios/facade/remoting_service.mm
@@ -19,7 +19,6 @@
 #import "remoting/ios/facade/host_list_fetcher.h"
 #import "remoting/ios/facade/ios_client_runtime_delegate.h"
 #import "remoting/ios/facade/remoting_authentication.h"
-#import "remoting/ios/keychain_wrapper.h"
 
 #include "base/i18n/time_formatting.h"
 #include "base/logging.h"
diff --git a/remoting/ios/keychain_wrapper.h b/remoting/ios/keychain_wrapper.h
deleted file mode 100644
index 60f909d4..0000000
--- a/remoting/ios/keychain_wrapper.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef REMOTING_IOS_KEYCHAIN_WRAPPER_H_
-#define REMOTING_IOS_KEYCHAIN_WRAPPER_H_
-
-#import <Foundation/Foundation.h>
-
-@class UserInfo;
-
-extern NSString* const kKeychainPairingId;
-extern NSString* const kKeychainPairingSecret;
-
-typedef void (^PairingCredentialsCallback)(NSString* pairingId,
-                                           NSString* secret);
-
-// Class to abstract the details from how iOS wants to write to the keychain.
-@interface KeychainWrapper : NSObject
-
-// Save a refresh token to the keychain.
-- (void)setRefreshToken:(NSString*)refreshToken;
-// Get the refresh token from the keychain, if there is one.
-- (NSString*)refreshToken;
-// Save the pairing credentials for the given host id.
-- (void)commitPairingCredentialsForHost:(NSString*)host
-                                     id:(NSString*)pairingId
-                                 secret:(NSString*)secret;
-// Get the pairing credentials for the given host id.
-- (NSDictionary*)pairingCredentialsForHost:(NSString*)host;
-// Reset the keychain and the cache.
-- (void)resetKeychainItem;
-
-// Access to the singleton shared instance from this property.
-@property(nonatomic, readonly, class) KeychainWrapper* instance;
-
-@end
-
-#endif  //  REMOTING_IOS_KEYCHAIN_WRAPPER_H_
diff --git a/remoting/ios/keychain_wrapper.mm b/remoting/ios/keychain_wrapper.mm
deleted file mode 100644
index 414be0e6..0000000
--- a/remoting/ios/keychain_wrapper.mm
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#import "remoting/ios/keychain_wrapper.h"
-
-#include "base/logging.h"
-#include "base/mac/scoped_cftyperef.h"
-
-#import "remoting/ios/domain/host_info.h"
-
-static const UInt8 kKeychainItemIdentifier[] = "org.chromium.RemoteDesktop\0";
-
-NSString* const kPairingSecretSeperator = @"|";
-
-NSString* const kKeychainPairingId = @"kKeychainPairingId";
-NSString* const kKeychainPairingSecret = @"kKeychainPairingSecret";
-
-@interface KeychainWrapper () {
-  NSMutableDictionary* _keychainData;
-  NSMutableDictionary* _userInfoQuery;
-}
-@end
-
-@implementation KeychainWrapper
-
-// KeychainWrapper is a singleton.
-+ (KeychainWrapper*)instance {
-  static KeychainWrapper* sharedInstance = nil;
-  static dispatch_once_t guard;
-  dispatch_once(&guard, ^{
-    sharedInstance = [[KeychainWrapper alloc] init];
-  });
-  return sharedInstance;
-}
-
-- (id)init {
-  if ((self = [super init])) {
-    OSStatus keychainErr = noErr;
-    _userInfoQuery = [[NSMutableDictionary alloc] init];
-    [_userInfoQuery setObject:(__bridge id)kSecClassGenericPassword
-                       forKey:(__bridge id)kSecClass];
-    NSData* keychainItemID =
-        [NSData dataWithBytes:kKeychainItemIdentifier
-                       length:strlen((const char*)kKeychainItemIdentifier)];
-    [_userInfoQuery setObject:keychainItemID
-                       forKey:(__bridge id)kSecAttrService];
-    [_userInfoQuery setObject:(__bridge id)kSecMatchLimitOne
-                       forKey:(__bridge id)kSecMatchLimit];
-    [_userInfoQuery setObject:(__bridge id)kCFBooleanTrue
-                       forKey:(__bridge id)kSecReturnAttributes];
-
-    base::ScopedCFTypeRef<CFMutableDictionaryRef> outDictionary;
-    keychainErr =
-        SecItemCopyMatching((__bridge CFDictionaryRef)_userInfoQuery,
-                            (CFTypeRef*)outDictionary.InitializeInto());
-    if (keychainErr == noErr) {
-      _keychainData = [self
-          secItemFormatToDictionary:(__bridge_transfer NSMutableDictionary*)
-                                        outDictionary.release()];
-    } else if (keychainErr == errSecItemNotFound) {
-      [self resetKeychainItem];
-
-      if (outDictionary) {
-        _keychainData = nil;
-      }
-    } else {
-      LOG(FATAL) << "Serious error: " << keychainErr;
-      if (outDictionary) {
-        _keychainData = nil;
-      }
-    }
-  }
-  return self;
-}
-
-#pragma mark - Public
-
-- (void)setRefreshToken:(NSString*)refreshToken {
-  [self setObject:refreshToken forKey:(__bridge id)kSecValueData];
-}
-
-- (NSString*)refreshToken {
-  return [self objectForKey:(__bridge id)kSecValueData];
-}
-
-- (void)commitPairingCredentialsForHost:(NSString*)host
-                                     id:(NSString*)pairingId
-                                 secret:(NSString*)secret {
-  NSString* keysString = [self objectForKey:(__bridge id)kSecAttrGeneric];
-  NSMutableDictionary* keys = [self stringToMap:keysString];
-  NSString* pairingIdAndSecret = [NSString
-      stringWithFormat:@"%@%@%@", pairingId, kPairingSecretSeperator, secret];
-  [keys setObject:pairingIdAndSecret forKey:host];
-  [self setObject:[self mapToString:keys] forKey:(__bridge id)kSecAttrGeneric];
-}
-
-- (NSDictionary*)pairingCredentialsForHost:(NSString*)host {
-  NSString* keysString = [self objectForKey:(__bridge id)kSecAttrGeneric];
-  NSMutableDictionary* keys = [self stringToMap:keysString];
-  NSString* pairingIdAndSecret = [keys objectForKey:host];
-  if (!pairingIdAndSecret ||
-      [pairingIdAndSecret rangeOfString:kPairingSecretSeperator].location ==
-          NSNotFound) {
-    return nil;
-  }
-  NSArray* components =
-      [pairingIdAndSecret componentsSeparatedByString:kPairingSecretSeperator];
-  DCHECK(components.count == 2);
-  return @{
-    kKeychainPairingId : components[0],
-    kKeychainPairingSecret : components[1],
-  };
-}
-
-#pragma mark - Map to String helpers
-
-- (NSMutableDictionary*)stringToMap:(NSString*)mapString {
-  NSError* err;
-
-  if (mapString &&
-      [mapString respondsToSelector:@selector(dataUsingEncoding:)]) {
-    NSData* data = [mapString dataUsingEncoding:NSUTF8StringEncoding];
-    NSDictionary* pairingMap =
-        data ? (NSDictionary*)[NSJSONSerialization
-                   JSONObjectWithData:data
-                              options:NSJSONReadingMutableContainers
-                                error:&err]
-             : @{};
-    if (!err) {
-      return [NSMutableDictionary dictionaryWithDictionary:pairingMap];
-    }
-  }
-  // failed to load a dictionary, make a new one.
-  return [NSMutableDictionary dictionaryWithCapacity:1];
-}
-
-- (NSString*)mapToString:(NSDictionary*)map {
-  if (map) {
-    NSError* err;
-    NSData* jsonData =
-        [NSJSONSerialization dataWithJSONObject:map options:0 error:&err];
-    if (!err) {
-      return [[NSString alloc] initWithData:jsonData
-                                   encoding:NSUTF8StringEncoding];
-    }
-  }
-  // failed to convert the map, make nil string.
-  return nil;
-}
-
-#pragma mark - Private
-
-// Implement the mySetObject:forKey method, which writes attributes to the
-// keychain:
-- (void)setObject:(id)inObject forKey:(id)key {
-  if (inObject == nil)
-    return;
-  id currentObject = [_keychainData objectForKey:key];
-  if (![currentObject isEqual:inObject]) {
-    [_keychainData setObject:inObject forKey:key];
-    [self writeToKeychain];
-  }
-}
-
-// Implement the myObjectForKey: method, which reads an attribute value from a
-// dictionary:
-- (id)objectForKey:(id)key {
-  return [_keychainData objectForKey:key];
-}
-
-- (void)resetKeychainItem {
-  if (!_keychainData) {
-    _keychainData = [[NSMutableDictionary alloc] init];
-  } else if (_keychainData) {
-    NSMutableDictionary* tmpDictionary =
-        [self dictionaryToSecItemFormat:_keychainData];
-    OSStatus errorcode = SecItemDelete((__bridge CFDictionaryRef)tmpDictionary);
-    if (errorcode == errSecItemNotFound) {
-      // this is ok.
-    } else if (errorcode != noErr) {
-      LOG(FATAL) << "Problem deleting current keychain item. errorcode: "
-                 << errorcode;
-    }
-  }
-
-  [_keychainData setObject:@"gaia_refresh_token"
-                    forKey:(__bridge id)kSecAttrLabel];
-  [_keychainData setObject:@"Gaia fresh token"
-                    forKey:(__bridge id)kSecAttrDescription];
-  [_keychainData setObject:@"" forKey:(__bridge id)kSecValueData];
-  [_keychainData setObject:@"" forKey:(__bridge id)kSecClass];
-  [_keychainData setObject:@"" forKey:(__bridge id)kSecAttrGeneric];
-}
-
-- (NSMutableDictionary*)dictionaryToSecItemFormat:
-    (NSDictionary*)dictionaryToConvert {
-  NSMutableDictionary* returnDictionary =
-      [NSMutableDictionary dictionaryWithDictionary:dictionaryToConvert];
-
-  NSData* keychainItemID =
-      [NSData dataWithBytes:kKeychainItemIdentifier
-                     length:strlen((const char*)kKeychainItemIdentifier)];
-  [returnDictionary setObject:keychainItemID
-                       forKey:(__bridge id)kSecAttrService];
-  [returnDictionary setObject:(__bridge id)kSecClassGenericPassword
-                       forKey:(__bridge id)kSecClass];
-
-  NSString* passwordString =
-      [dictionaryToConvert objectForKey:(__bridge id)kSecValueData];
-  [returnDictionary
-      setObject:[passwordString dataUsingEncoding:NSUTF8StringEncoding]
-         forKey:(__bridge id)kSecValueData];
-  return returnDictionary;
-}
-
-- (NSMutableDictionary*)secItemFormatToDictionary:
-    (NSDictionary*)dictionaryToConvert {
-  NSMutableDictionary* returnDictionary =
-      [NSMutableDictionary dictionaryWithDictionary:dictionaryToConvert];
-
-  [returnDictionary setObject:(__bridge id)kCFBooleanTrue
-                       forKey:(__bridge id)kSecReturnData];
-  [returnDictionary setObject:(__bridge id)kSecClassGenericPassword
-                       forKey:(__bridge id)kSecClass];
-
-  base::ScopedCFTypeRef<CFDataRef> passwordData;
-  OSStatus keychainError = noErr;
-  keychainError =
-      SecItemCopyMatching((__bridge CFDictionaryRef)returnDictionary,
-                          (CFTypeRef*)passwordData.InitializeInto());
-  if (keychainError == noErr) {
-    [returnDictionary removeObjectForKey:(__bridge id)kSecReturnData];
-
-    NSString* password =
-        [[NSString alloc] initWithBytes:CFDataGetBytePtr(passwordData)
-                                 length:CFDataGetLength(passwordData)
-                               encoding:NSUTF8StringEncoding];
-    [returnDictionary setObject:password forKey:(__bridge id)kSecValueData];
-  } else if (keychainError == errSecItemNotFound) {
-    LOG(WARNING) << "Nothing was found in the keychain.";
-  } else {
-    LOG(FATAL) << "Serious error: " << keychainError;
-  }
-  return returnDictionary;
-}
-
-- (void)writeToKeychain {
-  base::ScopedCFTypeRef<CFDictionaryRef> attributes;
-  NSMutableDictionary* updateItem = nil;
-
-  if (SecItemCopyMatching((__bridge CFDictionaryRef)_userInfoQuery,
-                          (CFTypeRef*)attributes.InitializeInto()) == noErr) {
-    updateItem = [NSMutableDictionary
-        dictionaryWithDictionary:(__bridge_transfer NSDictionary*)
-                                     attributes.release()];
-
-    [updateItem setObject:[_userInfoQuery objectForKey:(__bridge id)kSecClass]
-                   forKey:(__bridge id)kSecClass];
-
-    NSMutableDictionary* tempCheck =
-        [self dictionaryToSecItemFormat:_keychainData];
-    [tempCheck removeObjectForKey:(__bridge id)kSecClass];
-
-    OSStatus errorcode = SecItemUpdate((__bridge CFDictionaryRef)updateItem,
-                                       (__bridge CFDictionaryRef)tempCheck);
-    if (errorcode != noErr) {
-      LOG(FATAL) << "Couldn't update the Keychain Item. errorcode: "
-                 << errorcode;
-    }
-  } else {
-    OSStatus errorcode =
-        SecItemAdd((__bridge CFDictionaryRef)
-                       [self dictionaryToSecItemFormat:_keychainData],
-                   NULL);
-    if (errorcode != noErr) {
-      LOG(FATAL) << "Couldn't add the Keychain Item. errorcode: " << errorcode;
-    }
-  }
-}
-
-@end
diff --git a/remoting/ios/persistence/BUILD.gn b/remoting/ios/persistence/BUILD.gn
index fc4973a..346624a 100644
--- a/remoting/ios/persistence/BUILD.gn
+++ b/remoting/ios/persistence/BUILD.gn
@@ -8,6 +8,8 @@
 
 source_set("persistence") {
   sources = [
+    "host_pairing_info.cc",
+    "host_pairing_info.h",
     "keychain.cc",
     "keychain.h",
     "remoting_keychain.cc",
@@ -24,13 +26,30 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("test_support") {
+  testonly = true
+  sources = [
+    "mock_keychain.cc",
+    "mock_keychain.h",
+  ]
+
+  public_deps = [
+    "//testing/gmock",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "host_pairing_info_unittest.cc",
     "remoting_keychain_unittest.mm",
   ]
   deps = [
     ":persistence",
+    ":test_support",
+    "//testing/gmock",
     "//testing/gtest",
   ]
 
diff --git a/remoting/ios/persistence/host_pairing_info.cc b/remoting/ios/persistence/host_pairing_info.cc
new file mode 100644
index 0000000..860ec57
--- /dev/null
+++ b/remoting/ios/persistence/host_pairing_info.cc
@@ -0,0 +1,107 @@
+// 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 "remoting/ios/persistence/host_pairing_info.h"
+
+#include <memory>
+
+#include "base/json/json_string_value_serializer.h"
+#include "base/strings/string_piece.h"
+#include "base/values.h"
+#include "remoting/ios/persistence/remoting_keychain.h"
+
+namespace remoting {
+
+namespace {
+
+const char kPairingIdKey[] = "id";
+const char kPairingSecretKey[] = "secret";
+
+static remoting::Keychain* g_keychain =
+    remoting::RemotingKeychain::GetInstance();
+
+std::unique_ptr<base::Value> GetHostPairingListForUser(
+    const std::string& user_id) {
+  std::string data =
+      g_keychain->GetData(remoting::Keychain::Key::PAIRING_INFO, user_id);
+  if (data.empty()) {
+    return std::make_unique<base::DictionaryValue>();
+  }
+  JSONStringValueDeserializer deserializer(data);
+  int error_code = 0;
+  std::string error_message;
+  std::unique_ptr<base::Value> value =
+      deserializer.Deserialize(&error_code, &error_message);
+  if (error_code || !error_message.empty()) {
+    LOG(ERROR) << "Failed to decode host pairing list. Code: " << error_code
+               << " message: " << error_message;
+    return std::make_unique<base::DictionaryValue>();
+  }
+  if (!value->is_dict()) {
+    LOG(ERROR) << "Decoded host list is not a dictionary.";
+    return std::make_unique<base::DictionaryValue>();
+  }
+  return value;
+}
+
+}  // namespace
+
+HostPairingInfo::HostPairingInfo(const std::string& user_id,
+                                 const std::string& host_id,
+                                 const std::string& pairing_id,
+                                 const std::string& pairing_secret)
+    : user_id_(user_id),
+      host_id_(host_id),
+      pairing_id_(pairing_id),
+      pairing_secret_(pairing_secret) {}
+
+HostPairingInfo::HostPairingInfo(const HostPairingInfo&) = default;
+
+HostPairingInfo::HostPairingInfo(HostPairingInfo&&) = default;
+
+HostPairingInfo::~HostPairingInfo() {}
+
+// static
+HostPairingInfo HostPairingInfo::GetPairingInfo(const std::string& user_id,
+                                                const std::string& host_id) {
+  std::unique_ptr<base::Value> host_pairings =
+      GetHostPairingListForUser(user_id);
+
+  base::Value* pairing_id = host_pairings->FindPath({host_id, kPairingIdKey});
+  base::Value* pairing_secret =
+      host_pairings->FindPath({host_id, kPairingSecretKey});
+  if (pairing_id && pairing_id->is_string() && pairing_secret &&
+      pairing_secret->is_string()) {
+    return HostPairingInfo(user_id, host_id, pairing_id->GetString(),
+                           pairing_secret->GetString());
+  }
+
+  // Pairing not exist or entry corrupted.
+  return HostPairingInfo(user_id, host_id, "", "");
+}
+
+void HostPairingInfo::Save() {
+  std::unique_ptr<base::Value> host_pairings =
+      GetHostPairingListForUser(user_id_);
+
+  if (!host_pairings) {
+    host_pairings.reset(new base::DictionaryValue());
+  }
+
+  host_pairings->SetPath({host_id_, kPairingIdKey}, base::Value(pairing_id_));
+  host_pairings->SetPath({host_id_, kPairingSecretKey},
+                         base::Value(pairing_secret_));
+  std::string json_string;
+  JSONStringValueSerializer serializer(&json_string);
+  serializer.Serialize(*host_pairings);
+  g_keychain->SetData(remoting::Keychain::Key::PAIRING_INFO, user_id_,
+                      json_string);
+}
+
+// static
+void HostPairingInfo::SetKeychainForTesting(Keychain* keychain) {
+  g_keychain = keychain ? keychain : remoting::RemotingKeychain::GetInstance();
+}
+
+}  // namespace remoting
diff --git a/remoting/ios/persistence/host_pairing_info.h b/remoting/ios/persistence/host_pairing_info.h
new file mode 100644
index 0000000..4fec7fb2
--- /dev/null
+++ b/remoting/ios/persistence/host_pairing_info.h
@@ -0,0 +1,64 @@
+// 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 REMOTING_IOS_PERSISTENCE_HOST_PAIRING_INFO_H_
+#define REMOTING_IOS_PERSISTENCE_HOST_PAIRING_INFO_H_
+
+#include <string>
+
+namespace remoting {
+
+class Keychain;
+
+// A HostPairingInfo contains details to negotiate and maintain a connection
+// to a remote Chromoting host.  This is an entity in a backing store.
+class HostPairingInfo {
+ public:
+  HostPairingInfo(const HostPairingInfo&);
+  HostPairingInfo(HostPairingInfo&&);
+  ~HostPairingInfo();
+
+  // Loads a record from the keychain.
+  // If a record does not exist, return a new record with a blank secret.
+  static HostPairingInfo GetPairingInfo(const std::string& user_id,
+                                        const std::string& host_id);
+
+  // Commit this record to the keychain.
+  void Save();
+
+  // Properties supplied by the host server.
+  const std::string& user_id() const { return user_id_; }
+
+  const std::string& host_id() const { return host_id_; }
+
+  const std::string& pairing_id() const { return pairing_id_; }
+  void set_pairing_id(const std::string& pairing_id) {
+    pairing_id_ = pairing_id;
+  }
+
+  const std::string& pairing_secret() const { return pairing_secret_; }
+  void set_pairing_secret(const std::string& pairing_secret) {
+    pairing_secret_ = pairing_secret;
+  }
+
+  // The keychain is used to fetch and store host pairing data. The default
+  // implementation uses system keychain API. We can supply a custom keychain
+  // for testing. Passing null will restore the default keychain.
+  static void SetKeychainForTesting(Keychain* keychain);
+
+ private:
+  HostPairingInfo(const std::string& user_id,
+                  const std::string& host_id,
+                  const std::string& pairing_id,
+                  const std::string& pairing_secret);
+
+  std::string user_id_;
+  std::string host_id_;
+  std::string pairing_id_;
+  std::string pairing_secret_;
+};
+
+}  // namespace remoting
+
+#endif  //  REMOTING_IOS_PERSISTENCE_HOST_PAIRING_INFO_H_
diff --git a/remoting/ios/persistence/host_pairing_info_unittest.cc b/remoting/ios/persistence/host_pairing_info_unittest.cc
new file mode 100644
index 0000000..7e1b16b
--- /dev/null
+++ b/remoting/ios/persistence/host_pairing_info_unittest.cc
@@ -0,0 +1,253 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "remoting/ios/persistence/host_pairing_info.h"
+
+#include "base/json/json_string_value_serializer.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/sys_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "remoting/ios/persistence/mock_keychain.h"
+
+using ::testing::Return;
+using ::testing::SaveArg;
+using ::testing::_;
+
+namespace remoting {
+
+namespace {
+
+const char kFakeUserId[] = "fake_user_id_1";
+
+std::unique_ptr<base::Value> DecodeJson(const std::string& json) {
+  int error_code = 0;
+  std::string error_message;
+  std::unique_ptr<base::Value> value =
+      JSONStringValueDeserializer(json).Deserialize(&error_code,
+                                                    &error_message);
+  EXPECT_EQ(0, error_code);
+  EXPECT_EQ("", error_message);
+  return value;
+}
+
+}  // namespace
+
+class HostPairingInfoTest : public testing::Test {
+ public:
+  void SetUp() override;
+  void TearDown() override;
+
+ protected:
+  HostPairingInfo MockKeychainAndGetPairing(
+      const std::string& mock_keychain_output,
+      const std::string& host_id);
+  void VerifyHostPairingInfo(const HostPairingInfo& pairing_info,
+                             const std::string& expected_host_id,
+                             const std::string& expected_pairing_id,
+                             const std::string& expected_pairing_secret);
+  MockKeychain mock_keychain_;
+};
+
+void HostPairingInfoTest::SetUp() {
+  HostPairingInfo::SetKeychainForTesting(&mock_keychain_);
+}
+
+void HostPairingInfoTest::TearDown() {
+  HostPairingInfo::SetKeychainForTesting(nullptr);
+}
+
+HostPairingInfo HostPairingInfoTest::MockKeychainAndGetPairing(
+    const std::string& mock_keychain_output,
+    const std::string& host_id) {
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        kFakeUserId, mock_keychain_output);
+  return HostPairingInfo::GetPairingInfo(kFakeUserId, host_id);
+}
+
+void HostPairingInfoTest::VerifyHostPairingInfo(
+    const HostPairingInfo& pairing_info,
+    const std::string& expected_host_id,
+    const std::string& expected_pairing_id,
+    const std::string& expected_pairing_secret) {
+  EXPECT_EQ(kFakeUserId, pairing_info.user_id());
+  EXPECT_EQ(expected_host_id, pairing_info.host_id());
+  EXPECT_EQ(expected_pairing_id, pairing_info.pairing_id());
+  EXPECT_EQ(expected_pairing_secret, pairing_info.pairing_secret());
+}
+
+#pragma mark - Tests
+
+TEST_F(HostPairingInfoTest, RetrieveHostFromNewUser_returnBlankPairingInfo) {
+  HostPairingInfo result = MockKeychainAndGetPairing("", "fake_host_1");
+  VerifyHostPairingInfo(result, "fake_host_1", "", "");
+}
+
+TEST_F(HostPairingInfoTest, RetrieveNonexistentHost_returnBlankPairingInfo) {
+  std::string keychain_result = R"({
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"}
+  })";
+  HostPairingInfo result =
+      MockKeychainAndGetPairing(keychain_result, "fake_host_1");
+  VerifyHostPairingInfo(result, "fake_host_1", "", "");
+}
+
+TEST_F(HostPairingInfoTest,
+       RetrieveInfoFromUserWithMultipleHosts_returnTheRightPairingInfo) {
+  std::string keychain_result = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"},
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"}
+  })";
+  HostPairingInfo result =
+      MockKeychainAndGetPairing(keychain_result, "fake_host_2");
+  VerifyHostPairingInfo(result, "fake_host_2", "id_2", "secret_2");
+}
+
+TEST_F(HostPairingInfoTest,
+       SaveInfoForNewUser_writesFullPairingListToKeychain) {
+  HostPairingInfo result = MockKeychainAndGetPairing("", "fake_host_1");
+  result.set_pairing_id("id_1");
+  result.set_pairing_secret("secret_1");
+
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        kFakeUserId, "");
+
+  std::string actual_json;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         kFakeUserId, &actual_json);
+  result.Save();
+
+  std::string expected_json = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"}
+  })";
+  EXPECT_EQ(*DecodeJson(expected_json), *DecodeJson(actual_json));
+}
+
+TEST_F(HostPairingInfoTest, SaveNewInfoForExistingUser_addsNewHostPairing) {
+  std::string keychain_result = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"}
+  })";
+
+  HostPairingInfo result =
+      MockKeychainAndGetPairing(keychain_result, "fake_host_2");
+  result.set_pairing_id("id_2");
+  result.set_pairing_secret("secret_2");
+
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        kFakeUserId, keychain_result);
+
+  std::string actual_json;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         kFakeUserId, &actual_json);
+  result.Save();
+
+  std::string expected_json = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"},
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"}
+  })";
+  EXPECT_EQ(*DecodeJson(expected_json), *DecodeJson(actual_json));
+}
+
+TEST_F(HostPairingInfoTest, SaveInfoForExistingHost_updatesExistingHostInfo) {
+  std::string keychain_result = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"},
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"}
+  })";
+
+  HostPairingInfo result =
+      MockKeychainAndGetPairing(keychain_result, "fake_host_2");
+  result.set_pairing_id("id_3");
+  result.set_pairing_secret("secret_3");
+
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        kFakeUserId, keychain_result);
+
+  std::string actual_json;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         kFakeUserId, &actual_json);
+  result.Save();
+
+  std::string expected_json = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"},
+    "fake_host_2": {"id": "id_3", "secret": "secret_3"}
+  })";
+  EXPECT_EQ(*DecodeJson(expected_json), *DecodeJson(actual_json));
+}
+
+TEST_F(HostPairingInfoTest,
+       LoadCorruptedDataThenSave_returnsBlankDataAndProperlySaved) {
+  std::string mock_data = R"({
+    "fake_host_1": "corrupted"
+  })";
+  HostPairingInfo result = MockKeychainAndGetPairing(mock_data, "fake_host_1");
+  VerifyHostPairingInfo(result, "fake_host_1", "", "");
+  result.set_pairing_id("id_1");
+  result.set_pairing_secret("secret_1");
+
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        kFakeUserId, "");
+
+  std::string actual_json;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         kFakeUserId, &actual_json);
+  result.Save();
+
+  std::string expected_json = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"}
+  })";
+  EXPECT_EQ(*DecodeJson(expected_json), *DecodeJson(actual_json));
+}
+
+TEST_F(HostPairingInfoTest,
+       LoadTwoPairingsFromTwoUsersThenSave_noInterference) {
+  std::string mock_data_1 = R"({
+    "fake_host_1": {"id": "id_1", "secret": "secret_1"}
+  })";
+  std::string mock_data_2 = R"({
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"}
+  })";
+
+  // Edit pairing of the first user's host.
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        "user_id_1", mock_data_1);
+  HostPairingInfo pairing_1 =
+      HostPairingInfo::GetPairingInfo("user_id_1", "fake_host_1");
+  pairing_1.set_pairing_id("id_3");
+  pairing_1.set_pairing_secret("secret_3");
+
+  // Add new pairing for the second user.
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        "user_id_2", mock_data_2);
+  HostPairingInfo pairing_2 =
+      HostPairingInfo::GetPairingInfo("user_id_2", "fake_host_3");
+  pairing_2.set_pairing_id("id_4");
+  pairing_2.set_pairing_secret("secret_4");
+
+  // Save first pairing.
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        "user_id_1", mock_data_1);
+  std::string expect_json_1 = R"({
+    "fake_host_1": {"id": "id_3", "secret": "secret_3"}
+  })";
+  std::string actual_json_1;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         "user_id_1", &actual_json_1);
+  pairing_1.Save();
+  EXPECT_EQ(*DecodeJson(expect_json_1), *DecodeJson(actual_json_1));
+
+  // Save Second pairing.
+  mock_keychain_.ExpectGetDataAndReturn(Keychain::Key::PAIRING_INFO,
+                                        "user_id_2", mock_data_2);
+  std::string expect_json_2 = R"({
+    "fake_host_2": {"id": "id_2", "secret": "secret_2"},
+    "fake_host_3": {"id": "id_4", "secret": "secret_4"}
+  })";
+  std::string actual_json_2;
+  mock_keychain_.ExpectAndCaptureSetData(Keychain::Key::PAIRING_INFO,
+                                         "user_id_2", &actual_json_2);
+  pairing_2.Save();
+  EXPECT_EQ(*DecodeJson(expect_json_2), *DecodeJson(actual_json_2));
+}
+
+}  // namespace remoting
diff --git a/remoting/ios/persistence/keychain.h b/remoting/ios/persistence/keychain.h
index c6250603..7a2f838 100644
--- a/remoting/ios/persistence/keychain.h
+++ b/remoting/ios/persistence/keychain.h
@@ -5,7 +5,6 @@
 #ifndef REMOTING_IOS_PERSISTENCE_KEYCHAIN_H_
 #define REMOTING_IOS_PERSISTENCE_KEYCHAIN_H_
 
-#include <cstdint>
 #include <string>
 #include <vector>
 
@@ -14,8 +13,6 @@
 // Interface for the iOS keychain. This allows it to be mocked out in tests.
 class Keychain {
  public:
-  using Data = std::vector<uint8_t>;
-
   enum class Key {
     REFRESH_TOKEN,
     PAIRING_INFO,
@@ -31,13 +28,14 @@
   // account.
   virtual void SetData(Key key,
                        const std::string& account,
-                       const Data& data) = 0;
+                       const std::string& data) = 0;
 
   // Retrieves the data of a keychain entry that matches the key and account
   // name. Returns an empty data if no matching data is found.
-  virtual Data GetData(Key key, const std::string& account) const = 0;
+  virtual std::string GetData(Key key, const std::string& account) const = 0;
 
-  // Removes an entry that matches the key and account name.
+  // Removes an entry that matches the key and account name. Does nothing if no
+  // matching entry is found.
   virtual void RemoveData(Key key, const std::string& account) = 0;
 
   static std::string KeyToString(Key key);
diff --git a/remoting/ios/persistence/mock_keychain.cc b/remoting/ios/persistence/mock_keychain.cc
new file mode 100644
index 0000000..94dad41
--- /dev/null
+++ b/remoting/ios/persistence/mock_keychain.cc
@@ -0,0 +1,29 @@
+// 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 "remoting/ios/persistence/mock_keychain.h"
+
+using ::testing::Return;
+using ::testing::SaveArg;
+using ::testing::_;
+
+namespace remoting {
+
+MockKeychain::MockKeychain() {}
+
+MockKeychain::~MockKeychain() {}
+
+void MockKeychain::ExpectAndCaptureSetData(Key key,
+                                           const std::string& account,
+                                           std::string* out_data) {
+  EXPECT_CALL(*this, SetData(key, account, _)).WillOnce(SaveArg<2>(out_data));
+}
+
+void MockKeychain::ExpectGetDataAndReturn(Key key,
+                                          const std::string& account,
+                                          const std::string& data_to_return) {
+  EXPECT_CALL(*this, GetData(key, account)).WillOnce(Return(data_to_return));
+}
+
+}  // namespace remoting
diff --git a/remoting/ios/persistence/mock_keychain.h b/remoting/ios/persistence/mock_keychain.h
new file mode 100644
index 0000000..44a6102
--- /dev/null
+++ b/remoting/ios/persistence/mock_keychain.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 REMOTING_IOS_PERSISTENCE_MOCK_KEYCHAIN_H_
+#define REMOTING_IOS_PERSISTENCE_MOCK_KEYCHAIN_H_
+
+#include "remoting/ios/persistence/keychain.h"
+
+#include "base/logging.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace remoting {
+
+class MockKeychain : public Keychain {
+ public:
+  MockKeychain();
+  ~MockKeychain() override;
+
+  void ExpectAndCaptureSetData(Key key,
+                               const std::string& account,
+                               std::string* out_data);
+  void ExpectGetDataAndReturn(Key key,
+                              const std::string& account,
+                              const std::string& data_to_return);
+
+  // Mocks.
+  MOCK_METHOD3(SetData, void(Key, const std::string&, const std::string&));
+  MOCK_METHOD2(RemoveData, void(Key, const std::string&));
+  MOCK_CONST_METHOD2(GetData, std::string(Key, const std::string&));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockKeychain);
+};
+
+}  // namespace remoting
+
+#endif  // REMOTING_IOS_PERSISTENCE_MOCK_KEYCHAIN_H_
diff --git a/remoting/ios/persistence/remoting_keychain.cc b/remoting/ios/persistence/remoting_keychain.cc
index 0c1fcd2..8540e7e 100644
--- a/remoting/ios/persistence/remoting_keychain.cc
+++ b/remoting/ios/persistence/remoting_keychain.cc
@@ -27,8 +27,9 @@
                                          kCFAllocatorNull);
 }
 
-CFDataRef WrapVectorData(const Keychain::Data& data) {
-  return CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, data.data(),
+CFDataRef WrapStringToData(const std::string& data) {
+  const UInt8* data_pointer = reinterpret_cast<const UInt8*>(data.data());
+  return CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, data_pointer,
                                      data.size(), kCFAllocatorNull);
 }
 
@@ -58,12 +59,11 @@
   return dictionary;
 }
 
-ScopedMutableDictionary CreateDictionaryForInsertion(
-    const std::string& service,
-    const std::string& account,
-    const Keychain::Data& data) {
+ScopedMutableDictionary CreateDictionaryForInsertion(const std::string& service,
+                                                     const std::string& account,
+                                                     const std::string& data) {
   ScopedMutableDictionary dictionary = CreateQueryForUpdate(service, account);
-  CFDictionarySetValue(dictionary.get(), kSecValueData, WrapVectorData(data));
+  CFDictionarySetValue(dictionary.get(), kSecValueData, WrapStringToData(data));
   return dictionary;
 }
 
@@ -81,12 +81,12 @@
 
 void RemotingKeychain::SetData(Key key,
                                const std::string& account,
-                               const Data& data) {
+                               const std::string& data) {
   DCHECK(data.size());
 
   std::string service = KeyToService(key);
 
-  Data existing_data = GetData(key, account);
+  std::string existing_data = GetData(key, account);
   if (!existing_data.empty()) {
     // Item already exists. Update it.
 
@@ -96,7 +96,7 @@
     ScopedMutableDictionary updated_attributes =
         CreateScopedMutableDictionary();
     CFDictionarySetValue(updated_attributes.get(), kSecValueData,
-                         WrapVectorData(data));
+                         WrapStringToData(data));
     OSStatus status = SecItemUpdate(update_query, updated_attributes);
     if (status != errSecSuccess) {
       LOG(FATAL) << "Failed to update keychain item. Status: " << status;
@@ -113,8 +113,8 @@
   }
 }
 
-Keychain::Data RemotingKeychain::GetData(Key key,
-                                         const std::string& account) const {
+std::string RemotingKeychain::GetData(Key key,
+                                      const std::string& account) const {
   std::string service = KeyToService(key);
 
   ScopedMutableDictionary query = CreateQueryForLookup(service, account);
@@ -122,16 +122,16 @@
   OSStatus status =
       SecItemCopyMatching(query, (CFTypeRef*)cf_result.InitializeInto());
   if (status == errSecItemNotFound) {
-    return Data();
+    return "";
   }
   if (status != errSecSuccess) {
     LOG(FATAL) << "Failed to query keychain data. Status: " << status;
-    return Data();
+    return "";
   }
+  const char* data_pointer =
+      reinterpret_cast<const char*>(CFDataGetBytePtr(cf_result.get()));
   CFIndex data_size = CFDataGetLength(cf_result.get());
-  Data result(data_size);
-  CFDataGetBytes(cf_result.get(), CFRangeMake(0, data_size), result.data());
-  return result;
+  return std::string(data_pointer, data_size);
 }
 
 void RemotingKeychain::RemoveData(Key key, const std::string& account) {
@@ -139,7 +139,7 @@
 
   ScopedMutableDictionary query = CreateQueryForUpdate(service, account);
   OSStatus status = SecItemDelete(query);
-  if (status != errSecSuccess) {
+  if (status != errSecSuccess && status != errSecItemNotFound) {
     LOG(FATAL) << "Failed to delete a keychain item. Status: " << status;
   }
 }
diff --git a/remoting/ios/persistence/remoting_keychain.h b/remoting/ios/persistence/remoting_keychain.h
index 23f4c80a..a17aa73 100644
--- a/remoting/ios/persistence/remoting_keychain.h
+++ b/remoting/ios/persistence/remoting_keychain.h
@@ -19,8 +19,10 @@
   static RemotingKeychain* GetInstance();
 
   // Keychain overrides.
-  void SetData(Key key, const std::string& account, const Data& data) override;
-  Data GetData(Key key, const std::string& account) const override;
+  void SetData(Key key,
+               const std::string& account,
+               const std::string& data) override;
+  std::string GetData(Key key, const std::string& account) const override;
   void RemoveData(Key key, const std::string& account) override;
 
   void SetServicePrefixForTesting(const std::string& service_prefix);
diff --git a/remoting/ios/persistence/remoting_keychain_unittest.mm b/remoting/ios/persistence/remoting_keychain_unittest.mm
index f437f7ba..43761c9 100644
--- a/remoting/ios/persistence/remoting_keychain_unittest.mm
+++ b/remoting/ios/persistence/remoting_keychain_unittest.mm
@@ -31,12 +31,6 @@
   return random_string;
 }
 
-Keychain::Data RandomData(int size) {
-  Keychain::Data data(size);
-  base::RandBytes(data.data(), data.size());
-  return data;
-}
-
 NSString* KeyToService(Keychain::Key key) {
   return [NSString stringWithFormat:@"%s%s", kTestServicePrefix,
                                     Keychain::KeyToString(key).c_str()];
@@ -73,10 +67,10 @@
  protected:
   void SetKeychainAndVerify(Keychain::Key key,
                             const std::string& account,
-                            const Keychain::Data& data);
+                            const std::string& data);
   void VerifyKeychain(Keychain::Key key,
                       const std::string& account,
-                      const Keychain::Data& expected_data);
+                      const std::string& expected_data);
   void RemoveKeychainAndVerify(Keychain::Key key, const std::string& account);
 
   RemotingKeychain* keychain_;
@@ -97,22 +91,22 @@
 
 void RemotingKeychainTest::SetKeychainAndVerify(Keychain::Key key,
                                                 const std::string& account,
-                                                const Keychain::Data& data) {
+                                                const std::string& data) {
   keychain_->SetData(key, account, data);
   VerifyKeychain(key, account, data);
 }
 
 void RemotingKeychainTest::VerifyKeychain(Keychain::Key key,
                                           const std::string& account,
-                                          const Keychain::Data& expected_data) {
-  Keychain::Data data = keychain_->GetData(key, account);
+                                          const std::string& expected_data) {
+  std::string data = keychain_->GetData(key, account);
   EXPECT_EQ(expected_data, data);
 }
 
 void RemotingKeychainTest::RemoveKeychainAndVerify(Keychain::Key key,
                                                    const std::string& account) {
   keychain_->RemoveData(key, account);
-  VerifyKeychain(key, account, Keychain::Data());
+  VerifyKeychain(key, account, "");
 }
 
 #pragma mark - Tests
@@ -122,8 +116,10 @@
 TEST_F(RemotingKeychainTest,
        AddThenUpdateAndRemoveOneKeychain_dataAddedThenDeleted) {
   std::string account = RandomBase64String(16);
-  SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account, RandomData(128));
-  SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account, RandomData(128));
+  SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account,
+                       base::RandBytesAsString(128));
+  SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account,
+                       base::RandBytesAsString(128));
   RemoveKeychainAndVerify(Keychain::Key::PAIRING_INFO, account);
 }
 
@@ -131,9 +127,11 @@
     RemotingKeychainTest,
     AddThenUpdateAndRemoveOneKeychainWithUnspecifiedAccount_dataAddedThenDeleted) {
   SetKeychainAndVerify(Keychain::Key::PAIRING_INFO,
-                       Keychain::kUnspecifiedAccount, RandomData(128));
+                       Keychain::kUnspecifiedAccount,
+                       base::RandBytesAsString(128));
   SetKeychainAndVerify(Keychain::Key::PAIRING_INFO,
-                       Keychain::kUnspecifiedAccount, RandomData(128));
+                       Keychain::kUnspecifiedAccount,
+                       base::RandBytesAsString(128));
   RemoveKeychainAndVerify(Keychain::Key::PAIRING_INFO,
                           Keychain::kUnspecifiedAccount);
 }
@@ -142,8 +140,8 @@
     RemotingKeychainTest,
     AddAndRemoveTwoKeychainsWithSameAccountButDifferentKey_rightDataIsReturned) {
   std::string account = RandomBase64String(16);
-  Keychain::Data data_1 = RandomData(128);
-  Keychain::Data data_2 = RandomData(128);
+  std::string data_1 = base::RandBytesAsString(128);
+  std::string data_2 = base::RandBytesAsString(128);
   SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account, data_1);
   SetKeychainAndVerify(Keychain::Key::REFRESH_TOKEN, account, data_2);
 
@@ -159,8 +157,8 @@
     AddAndRemoveTwoKeychainsWithSameKeyButDifferentAccount_rightDataIsReturned) {
   std::string account_1 = RandomBase64String(16);
   std::string account_2 = RandomBase64String(16);
-  Keychain::Data data_1 = RandomData(128);
-  Keychain::Data data_2 = RandomData(128);
+  std::string data_1 = base::RandBytesAsString(128);
+  std::string data_2 = base::RandBytesAsString(128);
   SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account_1, data_1);
   SetKeychainAndVerify(Keychain::Key::PAIRING_INFO, account_2, data_2);
 
diff --git a/remoting/ios/session/remoting_client.mm b/remoting/ios/session/remoting_client.mm
index 52bb0d7..d4e933b 100644
--- a/remoting/ios/session/remoting_client.mm
+++ b/remoting/ios/session/remoting_client.mm
@@ -16,7 +16,7 @@
 #import "remoting/ios/display/gl_display_handler.h"
 #import "remoting/ios/domain/client_session_details.h"
 #import "remoting/ios/domain/host_info.h"
-#import "remoting/ios/keychain_wrapper.h"
+#import "remoting/ios/persistence/host_pairing_info.h"
 #import "remoting/ios/persistence/remoting_preferences.h"
 
 #include "base/strings/sys_string_conversions.h"
@@ -26,6 +26,8 @@
 #include "remoting/client/display/renderer_proxy.h"
 #include "remoting/client/gesture_interpreter.h"
 #include "remoting/client/input/keyboard_interpreter.h"
+#import "remoting/ios/facade/remoting_authentication.h"
+#import "remoting/ios/facade/remoting_service.h"
 #include "remoting/ios/session/remoting_client_session_delegate.h"
 #include "remoting/protocol/session.h"
 #include "remoting/protocol/video_renderer.h"
@@ -41,6 +43,11 @@
 NSString* const kHostSessionHostName = @"kHostSessionHostName";
 NSString* const kHostSessionPin = @"kHostSessionPin";
 
+static std::string GetCurrentUserId() {
+  return base::SysNSStringToUTF8(
+      RemotingService.instance.authentication.user.userId);
+}
+
 @interface RemotingClient () {
   remoting::ChromotingClientRuntime* _runtime;
   std::unique_ptr<remoting::RemotingClientSessonDelegate> _sessonDelegate;
@@ -100,17 +107,10 @@
   info.host_os_version = base::SysNSStringToUTF8(hostInfo.hostOsVersion);
   info.host_version = base::SysNSStringToUTF8(hostInfo.hostVersion);
 
-  NSDictionary* pairing =
-      [KeychainWrapper.instance pairingCredentialsForHost:hostInfo.hostId];
-  if (pairing) {
-    info.pairing_id =
-        base::SysNSStringToUTF8([pairing objectForKey:kKeychainPairingId]);
-    info.pairing_secret =
-        base::SysNSStringToUTF8([pairing objectForKey:kKeychainPairingSecret]);
-  } else {
-    info.pairing_id = "";
-    info.pairing_secret = "";
-  }
+  remoting::HostPairingInfo pairing = remoting::HostPairingInfo::GetPairingInfo(
+      GetCurrentUserId(), info.host_id);
+  info.pairing_id = pairing.pairing_id();
+  info.pairing_secret = pairing.pairing_secret();
 
   info.capabilities = "";
   if ([RemotingPreferences.instance boolForFlag:RemotingFlagUseWebRTC]) {
@@ -314,11 +314,13 @@
 }
 
 - (void)commitPairingCredentialsForHost:(NSString*)host
-                                     id:(NSString*)id
+                                     id:(NSString*)pairingId
                                  secret:(NSString*)secret {
-  [KeychainWrapper.instance commitPairingCredentialsForHost:host
-                                                         id:id
-                                                     secret:secret];
+  remoting::HostPairingInfo info = remoting::HostPairingInfo::GetPairingInfo(
+      GetCurrentUserId(), base::SysNSStringToUTF8(host));
+  info.set_pairing_id(base::SysNSStringToUTF8(pairingId));
+  info.set_pairing_secret(base::SysNSStringToUTF8(secret));
+  info.Save();
 }
 
 - (void)fetchThirdPartyTokenForUrl:(NSString*)tokenUrl
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb
index a57e5349..dc7b682a 100644
--- a/remoting/resources/remoting_strings_ca.xtb
+++ b/remoting/resources/remoting_strings_ca.xtb
@@ -121,7 +121,7 @@
 <translation id="3581045510967524389">No s'ha pogut connectar a la xarxa. Comproveu que el dispositiu estigui connectat a Internet.</translation>
 <translation id="3596628256176442606">Aquest servei permet les connexions entrants dels clients de Chromoting.</translation>
 <translation id="3606997049964069799">No heu iniciat la sessió a Chromium. Inicieu-hi la sessió i torneu-ho a provar.</translation>
-<translation id="3608841044971751032">Accedeix a l'ordinador de manera segura</translation>
+<translation id="3608841044971751032">Accedeix al teu ordinador de manera segura</translation>
 <translation id="3649256019230929621">Minimitza la finestra</translation>
 <translation id="369442766917958684">Sense connexió</translation>
 <translation id="3695446226812920698">Més informació</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb
index 184a1da..2ee10ab 100644
--- a/remoting/resources/remoting_strings_ml.xtb
+++ b/remoting/resources/remoting_strings_ml.xtb
@@ -120,7 +120,7 @@
 <translation id="3581045510967524389">നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല. നിങ്ങളുടെ ഉപകരണം കണക്റ്റുചെയ്‌തിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുക.</translation>
 <translation id="3596628256176442606">ക്രോമോട്ടിംഗ് ക്ലയന്റുകളിൽ നിന്നുള്ള ഇൻകമിംഗ് കണക്ഷനുകളെ ഈ സേവനം പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation>
 <translation id="3606997049964069799">നിങ്ങൾ Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്‌തിട്ടില്ല. സൈൻ ഇൻ ചെയ്‌ത് വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="3608841044971751032">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സുരക്ഷിതമായി ആക്‌സസ് ചെയ്യുക</translation>
+<translation id="3608841044971751032">നിങ്ങളുടെ കമ്പ്യൂട്ടർ സുരക്ഷിതമായി ആക്‌സസ് ചെയ്യൂ</translation>
 <translation id="3649256019230929621">വിൻഡോ ചെറുതാക്കുക</translation>
 <translation id="369442766917958684">ഓഫ്‌ലൈൻ.</translation>
 <translation id="3695446226812920698">എങ്ങനെയെന്നറിയുക</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb
index cd4aa4e..522ea17 100644
--- a/remoting/resources/remoting_strings_mr.xtb
+++ b/remoting/resources/remoting_strings_mr.xtb
@@ -121,7 +121,7 @@
 <translation id="3581045510967524389">नेटवर्कला कनेक्ट करू शकलो नाही. कृपया आपले डिव्हाइस ऑन-लाइन असल्याचे तपासा.</translation>
 <translation id="3596628256176442606">ही सेवा Chromoting क्लायंटकडील येणारी कनेक्शन सक्षम करते.</translation>
 <translation id="3606997049964069799">आपण Chromium वर साइन इन केलेले नाही. कृपया साइन इन करा आणि पुन्हा प्रयत्न करा.</translation>
-<translation id="3608841044971751032">तुमचा कॉंप्युटर सुरक्षितपणे अ‍ॅक्सेस करा</translation>
+<translation id="3608841044971751032">तुमचा कॉंप्युटर सुरक्षितरीत्या अ‍ॅक्सेस करा</translation>
 <translation id="3649256019230929621">विंडो लहान करा</translation>
 <translation id="369442766917958684">ऑफलाइन.</translation>
 <translation id="3695446226812920698">कसे ते जाणून घ्या</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb
index 24d5992..e7f885d 100644
--- a/remoting/resources/remoting_strings_nl.xtb
+++ b/remoting/resources/remoting_strings_nl.xtb
@@ -121,7 +121,7 @@
 <translation id="3581045510967524389">Kan geen verbinding maken met het netwerk. Controleer of je apparaat online is.</translation>
 <translation id="3596628256176442606">Met deze service worden inkomende verbindingen van Chromoting-clients ingeschakeld.</translation>
 <translation id="3606997049964069799">Je bent niet ingelogd bij Chromium. Log in en probeer het opnieuw.</translation>
-<translation id="3608841044971751032">Veilig toegang tot je computer</translation>
+<translation id="3608841044971751032">Veilige toegang tot je computer</translation>
 <translation id="3649256019230929621">Venster minimaliseren</translation>
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Meer informatie</translation>
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc
index 136d757..873fb73 100644
--- a/sandbox/win/src/sandbox_nt_util.cc
+++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -481,6 +481,29 @@
 #pragma warning(pop)
 }
 
+const char* GetAnsiImageInfoFromModule(HMODULE module) {
+// PEImage's dtor won't be run during SEH unwinding, but that's OK.
+#pragma warning(push)
+#pragma warning(disable : 4509)
+  const char* out_name = nullptr;
+  __try {
+    do {
+      base::win::PEImage pe(module);
+
+      if (!pe.VerifyMagic())
+        break;
+
+      PIMAGE_EXPORT_DIRECTORY exports = pe.GetExportDirectory();
+      if (exports)
+        out_name = static_cast<const char*>(pe.RVAToAddr(exports->Name));
+    } while (false);
+  } __except (EXCEPTION_EXECUTE_HANDLER) {
+  }
+
+  return out_name;
+#pragma warning(pop)
+}
+
 UNICODE_STRING* GetBackingFilePath(PVOID address) {
   // We'll start with something close to max_path charactes for the name.
   SIZE_T buffer_bytes = MAX_PATH * 2;
diff --git a/sandbox/win/src/sandbox_nt_util.h b/sandbox/win/src/sandbox_nt_util.h
index 553e7e4..66e63f3 100644
--- a/sandbox/win/src/sandbox_nt_util.h
+++ b/sandbox/win/src/sandbox_nt_util.h
@@ -144,6 +144,12 @@
 // operator delete(name, NT_ALLOC);
 UNICODE_STRING* GetImageInfoFromModule(HMODULE module, uint32_t* flags);
 
+// Returns the name and characteristics for a given PE module. The return
+// value is the name as defined by the export table.
+//
+// The returned buffer is within the PE module and must not be freed.
+const char* GetAnsiImageInfoFromModule(HMODULE module);
+
 // Returns the full path and filename for a given dll.
 // May return nullptr if the provided address is not backed by a named section,
 // or if the current OS version doesn't support the call. The returned buffer
diff --git a/sandbox/win/src/target_interceptions.cc b/sandbox/win/src/target_interceptions.cc
index 5c4f671..60001d68 100644
--- a/sandbox/win/src/target_interceptions.cc
+++ b/sandbox/win/src/target_interceptions.cc
@@ -13,6 +13,14 @@
 
 SANDBOX_INTERCEPT NtExports g_nt;
 
+const char VERIFIER_DLL_NAME[] = "verifier.dll";
+const char KERNEL32_DLL_NAME[] = "kernel32.dll";
+
+enum SectionLoadState {
+  kBeforeKernel32,
+  kAfterKernel32,
+};
+
 // Hooks NtMapViewOfSection to detect the load of DLLs. If hot patching is
 // required for this dll, this functions patches it.
 NTSTATUS WINAPI
@@ -30,21 +38,43 @@
   NTSTATUS ret = orig_MapViewOfSection(section, process, base, zero_bits,
                                        commit_size, offset, view_size, inherit,
                                        allocation_type, protect);
-
-  static int s_load_count = 0;
-  if (1 == s_load_count) {
-    SandboxFactory::GetTargetServices()->GetState()->SetKernel32Loaded();
-    s_load_count = 2;
-  }
+  static SectionLoadState s_state = kBeforeKernel32;
 
   do {
     if (!NT_SUCCESS(ret))
       break;
 
-    if (!InitHeap())
+    if (!IsSameProcess(process))
       break;
 
-    if (!IsSameProcess(process))
+    // Only check for verifier.dll or kernel32.dll loading if we haven't moved
+    // past that state yet.
+    if (s_state == kBeforeKernel32) {
+      const char* ansi_module_name =
+          GetAnsiImageInfoFromModule(reinterpret_cast<HMODULE>(*base));
+      CHECK(ansi_module_name);
+
+      // _strnicmp below may hit read access violations for some sections. We
+      // find what looks like a valid export directory for a PE module but the
+      // pointer to the module name will be pointing to invalid memory.
+      __try {
+        // Don't initialize the heap if verifier.dll is being loaded. This
+        // indicates Application Verifier is enabled and we should wait until
+        // the next module is loaded.
+        if (g_nt._strnicmp(ansi_module_name, VERIFIER_DLL_NAME,
+                           sizeof(VERIFIER_DLL_NAME)) == 0)
+          break;
+
+        if (g_nt._strnicmp(ansi_module_name, KERNEL32_DLL_NAME,
+                           sizeof(KERNEL32_DLL_NAME)) == 0) {
+          SandboxFactory::GetTargetServices()->GetState()->SetKernel32Loaded();
+          s_state = kAfterKernel32;
+        }
+      } __except (EXCEPTION_EXECUTE_HANDLER) {
+      }
+    }
+
+    if (!InitHeap())
       break;
 
     if (!IsValidImageSection(section, base, offset, view_size))
@@ -79,9 +109,6 @@
 
   } while (false);
 
-  if (!s_load_count)
-    s_load_count = 1;
-
   return ret;
 }
 
diff --git a/services/network/public/cpp/network_param_ipc_traits.h b/services/network/public/cpp/network_param_ipc_traits.h
index c66f95c..48b8f5b5 100644
--- a/services/network/public/cpp/network_param_ipc_traits.h
+++ b/services/network/public/cpp/network_param_ipc_traits.h
@@ -302,7 +302,7 @@
   IPC_STRUCT_TRAITS_MEMBER(should_reset_appcache)
   IPC_STRUCT_TRAITS_MEMBER(service_worker_provider_id)
   IPC_STRUCT_TRAITS_MEMBER(originated_from_service_worker)
-  IPC_STRUCT_TRAITS_MEMBER(service_worker_mode)
+  IPC_STRUCT_TRAITS_MEMBER(skip_service_worker)
   IPC_STRUCT_TRAITS_MEMBER(fetch_request_mode)
   IPC_STRUCT_TRAITS_MEMBER(fetch_credentials_mode)
   IPC_STRUCT_TRAITS_MEMBER(fetch_redirect_mode)
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
index 3fcdca3..99f42e6 100644
--- a/services/network/public/cpp/resource_request.h
+++ b/services/network/public/cpp/resource_request.h
@@ -117,10 +117,9 @@
 
   // The service worker mode that indicates which service workers should get
   // events for this request.
-  // Note: this is an enum of type content::ServiceWorkerMode.
   // TODO(jam): remove this from the struct since network service shouldn't know
   // about this.
-  int service_worker_mode = 0;
+  bool skip_service_worker = false;
 
   // The request mode passed to the ServiceWorker.
   mojom::FetchRequestMode fetch_request_mode =
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request.h b/services/resource_coordinator/memory_instrumentation/queued_request.h
index 2457cc0..155c839 100644
--- a/services/resource_coordinator/memory_instrumentation/queued_request.h
+++ b/services/resource_coordinator/memory_instrumentation/queued_request.h
@@ -61,8 +61,8 @@
     Response();
     ~Response();
 
-    base::ProcessId process_id;
-    mojom::ProcessType process_type;
+    base::ProcessId process_id = base::kNullProcessId;
+    mojom::ProcessType process_type = mojom::ProcessType::OTHER;
     std::unique_ptr<base::trace_event::ProcessMemoryDump> chrome_dump;
     OSMemDumpMap os_dumps;
   };
@@ -128,7 +128,7 @@
     Response();
     ~Response();
 
-    base::ProcessId process_id;
+    base::ProcessId process_id = base::kNullProcessId;
     OSMemDumpMap os_dumps;
   };
 
diff --git a/services/service_manager/embedder/BUILD.gn b/services/service_manager/embedder/BUILD.gn
index 212cc8d..67efc260 100644
--- a/services/service_manager/embedder/BUILD.gn
+++ b/services/service_manager/embedder/BUILD.gn
@@ -59,7 +59,7 @@
   if (!is_ios) {
     # deps of ServiceManager::Main and related functionality.
     deps += [
-      "//base/allocator:features",
+      "//base/allocator:buildflags",
       "//components/tracing:startup_tracing",
       "//ui/base",
     ]
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc
index 08ea94a..ed361686 100644
--- a/services/service_manager/embedder/main.cc
+++ b/services/service_manager/embedder/main.cc
@@ -4,7 +4,7 @@
 
 #include "services/service_manager/embedder/main.h"
 
-#include "base/allocator/features.h"
+#include "base/allocator/buildflags.h"
 #include "base/at_exit.h"
 #include "base/base_switches.h"
 #include "base/command_line.h"
@@ -21,7 +21,6 @@
 #include "base/process/process.h"
 #include "base/run_loop.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread.h"
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_log.h"
@@ -227,8 +226,6 @@
 
   base::MessageLoop message_loop(base::MessageLoop::TYPE_UI);
 
-  base::SequencedWorkerPool::EnableWithRedirectionToTaskSchedulerForProcess();
-
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
diff --git a/services/service_manager/public/cpp/standalone_service/main.cc b/services/service_manager/public/cpp/standalone_service/main.cc
index f952d68..61c3b47 100644
--- a/services/service_manager/public/cpp/standalone_service/main.cc
+++ b/services/service_manager/public/cpp/standalone_service/main.cc
@@ -4,8 +4,10 @@
 
 #include "services/service_manager/public/c/main.h"
 #include "base/at_exit.h"
+#include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/debug/stack_trace.h"
+#include "base/feature_list.h"
 #include "base/i18n/icu_util.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -52,6 +54,11 @@
   base::debug::EnableInProcessStackDumping();
 #endif
 
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  base::FeatureList::InitializeInstance(
+      command_line->GetSwitchValueASCII(switches::kEnableFeatures),
+      command_line->GetSwitchValueASCII(switches::kDisableFeatures));
+
   service_manager::WaitForDebuggerIfNecessary();
   service_manager::RunStandaloneService(base::Bind(&RunServiceMain));
 
diff --git a/storage/browser/blob/blob_data_item.cc b/storage/browser/blob/blob_data_item.cc
index 44d8596..6ae53b7a 100644
--- a/storage/browser/blob/blob_data_item.cc
+++ b/storage/browser/blob/blob_data_item.cc
@@ -149,6 +149,16 @@
   data_handle_ = std::move(data_handle);
 }
 
+// static
+void BlobDataItem::SetFileModificationTimes(
+    std::vector<scoped_refptr<BlobDataItem>> items,
+    std::vector<base::Time> times) {
+  DCHECK_EQ(items.size(), times.size());
+  for (size_t i = 0; i < items.size(); ++i) {
+    items[i]->expected_modification_time_ = times[i];
+  }
+}
+
 void PrintTo(const BlobDataItem& x, ::std::ostream* os) {
   const uint64_t kMaxDataPrintLength = 40;
   DCHECK(os);
diff --git a/storage/browser/blob/blob_data_item.h b/storage/browser/blob/blob_data_item.h
index 1a53204..54186c51 100644
--- a/storage/browser/blob/blob_data_item.h
+++ b/storage/browser/blob/blob_data_item.h
@@ -152,6 +152,10 @@
                     base::Time expected_modification_time,
                     scoped_refptr<DataHandle> data_handle);
 
+  static void SetFileModificationTimes(
+      std::vector<scoped_refptr<BlobDataItem>> items,
+      std::vector<base::Time> times);
+
   Type type_;
   uint64_t offset_;
   uint64_t length_;
diff --git a/storage/browser/blob/blob_storage_context.cc b/storage/browser/blob/blob_storage_context.cc
index a3d417c..7fedde5 100644
--- a/storage/browser/blob/blob_storage_context.cc
+++ b/storage/browser/blob/blob_storage_context.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
+#include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -21,6 +22,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/numerics/safe_math.h"
 #include "base/task_runner.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "storage/browser/blob/blob_data_builder.h"
@@ -33,6 +35,21 @@
 namespace {
 using ItemCopyEntry = BlobEntry::ItemCopyEntry;
 using QuotaAllocationTask = BlobMemoryController::QuotaAllocationTask;
+
+std::vector<base::Time> GetModificationTimes(
+    std::vector<base::FilePath> paths) {
+  std::vector<base::Time> result;
+  result.reserve(paths.size());
+  for (const auto& path : paths) {
+    base::File::Info info;
+    if (!base::GetFileInfo(path, &info)) {
+      result.emplace_back();
+      continue;
+    }
+    result.emplace_back(info.last_modified);
+  }
+  return result;
+}
 }  // namespace
 
 BlobStorageContext::BlobStorageContext()
@@ -187,6 +204,29 @@
   UMA_HISTOGRAM_COUNTS_1M("Storage.Blob.TotalUnsharedSize",
                           total_memory_needed / 1024);
 
+  std::vector<scoped_refptr<BlobDataItem>> items_needing_timestamp;
+  std::vector<base::FilePath> file_paths_needing_timestamp;
+  for (auto& item : entry->items_) {
+    if (item->item()->type() == BlobDataItem::Type::kFile &&
+        !item->item()->IsFutureFileItem() &&
+        item->item()->expected_modification_time().is_null()) {
+      items_needing_timestamp.push_back(item->item());
+      file_paths_needing_timestamp.push_back(item->item()->path());
+    }
+  }
+  if (!items_needing_timestamp.empty()) {
+    // Blob construction isn't blocked on getting these timestamps. The created
+    // blob will be fully functional whether or not timestamps are set. When
+    // the timestamp isn't set the blob just won't be able to detect the file
+    // on disk changing after the blob is created.
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE, {base::MayBlock()},
+        base::BindOnce(&GetModificationTimes,
+                       std::move(file_paths_needing_timestamp)),
+        base::BindOnce(&BlobDataItem::SetFileModificationTimes,
+                       std::move(items_needing_timestamp)));
+  }
+
   size_t num_building_dependent_blobs = 0;
   std::vector<std::unique_ptr<BlobDataHandle>> dependent_blobs;
   // We hold a handle to all blobs we're using. This is important, as our memory
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index e15a13d..a327bca 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -844,7 +844,7 @@
           "--mash",
           "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mash.filter"
         ],
-        "name": "ash_unittests-mash",
+        "name": "mash_ash_unittests",
         "override_isolate_target": "ash_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index f2464ab..6aa7fbb 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -10556,63 +10556,77 @@
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "angle_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "app_shell_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "aura_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "base_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "blink_heap_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "blink_platform_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          },
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ],
           "shards": 10
         },
         "test": "browser_tests"
@@ -10620,414 +10634,509 @@
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "cacheinvalidation_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "capture_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "chrome_app_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "chrome_elf_import_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "chrome_elf_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "components_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "compositor_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "content_browsertests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "content_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "courgette_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "crashpad_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "crypto_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "device_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "extensions_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "gcm_unit_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "google_apis_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "gpu_ipc_service_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "gpu_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "install_static_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "integrity": "high",
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "installer_util_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "ipc_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "jingle_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "media_blink_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "media_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "midi_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "native_theme_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "net_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "pdf_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "ppapi_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "printing_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "remoting_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "integrity": "high",
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "sbox_integration_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "sbox_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "sbox_validation_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "services_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "integrity": "high",
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "setup_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "skia_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "sql_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "ui_base_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "unit_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "url_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "views_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "webkit_unit_tests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "wm_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "wtf_unittests"
       },
       {
         "swarming": {
           "can_use_on_swarming_builders": true,
-          "dimension_sets": {
-            "os": "Windows-10"
-          }
+          "dimension_sets": [
+            {
+              "os": "Windows-10"
+            }
+          ]
         },
         "test": "zucchini_unittests"
       }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 97634e9..a6166781 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -6063,7 +6063,7 @@
           "--mash",
           "--test-launcher-filter-file=../../testing/buildbot/filters/ash_unittests_mash.filter"
         ],
-        "name": "ash_unittests-mash",
+        "name": "mash_ash_unittests",
         "override_isolate_target": "ash_unittests",
         "swarming": {
           "can_use_on_swarming_builders": true
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index ae829af..a84328cb 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -9960,33 +9960,7 @@
   },
   "Optional Android Release (Nexus 5X)": {
     "gtest_tests": [],
-    "isolated_scripts": [
-      {
-        "args": [
-          "noop_sleep",
-          "--show-stdout",
-          "--browser=android-chromium",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "noop_sleep_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ]
-        }
-      }
-    ]
+    "isolated_scripts": []
   },
   "Optional Linux Release (Intel HD 630)": {
     "gtest_tests": [
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index a72a2490..2924fa33 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -445,7 +445,9 @@
         "merge": {
           "args": [
             "--configuration-name",
-            "buildbot-test"
+            "buildbot-test",
+            "--service-account-file",
+            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
           ],
           "script": "//tools/perf/process_perf_results.py"
         },
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter
index 96a7927..38495af 100644
--- a/testing/buildbot/filters/mash.browser_tests.filter
+++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -53,7 +53,6 @@
 
 # Incorrect window bounds. Probably WindowSizerAsh problem.
 -BrowserTestTabbedOrApp/BrowserTestParam.*
--TabRestoreTest.*
 
 # Timeout waiting for notification.
 -CaptivePortalAuthenticationIgnoresProxy/NetworkPortalDetectorImplBrowserTestIgnoreProxy.*
diff --git a/testing/buildbot/filters/mojo.fyi.mash.browser_tests.filter b/testing/buildbot/filters/mojo.fyi.mash.browser_tests.filter
index 96a7927..38495af 100644
--- a/testing/buildbot/filters/mojo.fyi.mash.browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.mash.browser_tests.filter
@@ -53,7 +53,6 @@
 
 # Incorrect window bounds. Probably WindowSizerAsh problem.
 -BrowserTestTabbedOrApp/BrowserTestParam.*
--TabRestoreTest.*
 
 # Timeout waiting for notification.
 -CaptivePortalAuthenticationIgnoresProxy/NetworkPortalDetectorImplBrowserTestIgnoreProxy.*
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index 2ac8822..f53a2e8 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -23,22 +23,14 @@
 -ExpectCTBrowserTest.TestDynamicExpectCTHeaderProcessing
 -ExpectCTBrowserTest.TestDynamicExpectCTReporting
 -ExperimentalAppWindowApiTest.SetIcon
--ExtensionApiTabTest.TabsOnUpdated
--ExtensionApiTest.ContentSecurityPolicy
 -ExtensionApiTest.Cookies
 -ExtensionApiTest.Debugger
--ExtensionApiTest.DefaultContentSecurityPolicy
--ExtensionApiTest.SandboxedPages
--ExtensionApiTest.SandboxedPagesCSP
 -ExtensionApiTestWithManagementPolicy.InitiatorProtectedByPolicy
 -ExtensionApiTestWithManagementPolicy.UrlProtectedByPolicy
 -ExtensionApiTestWithSwitch.ExtensionDebugger
 -ExtensionBrowserTest.OnlyComponentExtensionsCanAccessChromeThemeUrls
--ExtensionFetchTest.HostCanFetchWebAccessibleExtensionResource
 -ExtensionIconSourceTest.IconsLoaded
 -ExtensionIconSourceTest.IconsLoadedIncognito
--ExtensionModuleTest.TestModulesAvailable
--ExtensionResourceRequestPolicyTest.WebAccessibleResources
 -ExtensionUnloadBrowserTest.UnloadWithContentScripts
 -FeedbackTest.AnonymousUser
 -FeedbackTest.ExtraDiagnostics
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index c31add9..be5109eb 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -109,9 +109,10 @@
       'Linux TSan Tests',
     ],
   },
-  'ash_unittests-mash': {
+  'mash_ash_unittests': {
     'remove_from': [
       # chromium.memory
+      # Unclear why this isn't run. http://crbug.com/814403
       'Linux Chromium OS ASan LSan Tests (1)',
     ],
   },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index b7472df..eb48c65 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -981,7 +981,7 @@
    },
 
   'mash_chromium_gtests': {
-    'ash_unittests-mash': {
+    'mash_ash_unittests': {
       'test': 'ash_unittests',
       'override_isolate_target': 'ash_unittests',
       'args': [
diff --git a/testing/buildbot/trybot_analyze_config.json b/testing/buildbot/trybot_analyze_config.json
index 8f86c7af2..c0985e2 100644
--- a/testing/buildbot/trybot_analyze_config.json
+++ b/testing/buildbot/trybot_analyze_config.json
@@ -91,5 +91,10 @@
       "testing/xvfb.py",
       "third_party/binutils/Linux_x64/binutils.tar.bz2.sha1"
     ]
+  },
+  "win": {
+    "exclusions": [
+      "build/toolchain/win/rc/win/rc.exe.sha1"
+    ]
   }
 }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 05b1725..280d2ee9 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -801,9 +801,11 @@
       },
       'linux-win_cross-rel': {
         'swarming': {
-          'dimension_sets': {
-            'os': 'Windows-10',
-          },
+          'dimension_sets': [
+            {
+              'os': 'Windows-10',
+            },
+          ],
         },
         'test_suites': {
           'gtest_tests': 'chromium_win_clang_gtests',
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 6115cae..76ee0a4 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -132,25 +132,18 @@
 crbug.com/591099 bindings/blink-in-js-asan-crash.html [ Failure ]
 crbug.com/714962 compositing/background-color/view-blending-base-background.html [ Failure ]
 crbug.com/591099 compositing/child-transform-layer-requires-box.html [ Failure ]
-crbug.com/591099 compositing/compositing-visible-descendant.html [ Failure Pass ]
-crbug.com/591099 compositing/contents-opaque/body-background-painted.html [ Failure Pass ]
-crbug.com/591099 compositing/contents-opaque/body-background-skipped.html [ Failure Pass ]
 crbug.com/591099 compositing/direct-image-compositing.html [ Failure ]
 crbug.com/591099 compositing/draws-content/canvas-background-layer.html [ Failure ]
 crbug.com/591099 compositing/draws-content/webgl-background-layer.html [ Failure ]
 crbug.com/714962 compositing/flex-composited-animated-table-row-background.html [ Failure ]
-crbug.com/591099 compositing/framesets/composited-frame-alignment.html [ Failure Pass ]
 crbug.com/591099 compositing/generated-content.html [ Failure ]
-crbug.com/591099 compositing/geometry/abs-position-inside-opacity.html [ Failure Pass ]
 crbug.com/591099 compositing/geometry/bounds-ignores-hidden-dynamic.html [ Failure ]
 crbug.com/591099 compositing/geometry/bounds-ignores-hidden.html [ Failure ]
 crbug.com/591099 compositing/geometry/clipping-foreground.html [ Failure ]
 crbug.com/591099 compositing/geometry/composited-in-columns.html [ Failure ]
 crbug.com/591099 compositing/geometry/foreground-layer.html [ Failure ]
-crbug.com/591099 compositing/geometry/partial-layout-update.html [ Failure Pass ]
 crbug.com/591099 compositing/geometry/repaint-foreground-layer.html [ Failure ]
 crbug.com/591099 compositing/geometry/root-layer-update.html [ Failure ]
-crbug.com/591099 compositing/geometry/transformed-abs-position-inside-composited.html [ Failure Pass ]
 crbug.com/591099 compositing/geometry/transfrom-origin-on-zero-size-layer.html [ Failure ]
 crbug.com/591099 compositing/geometry/video-opacity-overlay.html [ Failure ]
 crbug.com/714962 compositing/gestures/gesture-tapHighlight-2-overflow-div-scrolled-inner.html [ Failure ]
@@ -161,35 +154,14 @@
 crbug.com/591099 compositing/iframes/iframe-in-composited-layer.html [ Failure ]
 crbug.com/591099 compositing/iframes/layout-on-compositing-change.html [ Failure ]
 crbug.com/591099 compositing/iframes/nested-iframe-scrolling.html [ Failure ]
-crbug.com/591099 compositing/images/direct-image-background-color.html [ Failure Pass ]
-crbug.com/714962 compositing/images/direct-image-clip-path.html [ Failure Pass ]
-crbug.com/714962 compositing/images/direct-image-dynamic-clip-path.html [ Failure Pass ]
-crbug.com/591099 compositing/images/direct-svg-image.html [ Failure Pass ]
 crbug.com/591099 compositing/img-layer-object-fit.html [ Failure ]
 crbug.com/591099 compositing/layer-creation/fixed-position-nonscrollable-iframes-in-scrollable-page.html [ Failure ]
-crbug.com/591099 compositing/layer-creation/overlap-transformed-layer-with-transform-body.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/rotate3d-overlap.html [ Failure ]
-crbug.com/591099 compositing/masks/direct-image-mask.html [ Failure Pass ]
-crbug.com/591099 compositing/masks/mask-with-added-filters.html [ Failure Pass ]
-crbug.com/591099 compositing/masks/mask-with-removed-filters.html [ Failure Pass ]
-crbug.com/591099 compositing/masks/masked-ancestor.html [ Failure Pass ]
 crbug.com/591099 compositing/massive-scale-interest-rect.html [ Failure ]
-crbug.com/591099 compositing/overflow/accelerated-scrolling-with-clip-path-text.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/accelerated-scrolling-with-clip-path.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/ancestor-overflow.html [ Failure ]
 crbug.com/591099 compositing/overflow/border-radius-above-composited-subframe.html [ Failure ]
-crbug.com/591099 compositing/overflow/border-radius-composited-subframe.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/border-radius-on-grandparent-composited-grandchild.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/border-radius-on-parent-composited-grandchild.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/border-radius-on-two-ancestors-composited-grandchild.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/border-radius-styles-with-composited-child.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/composited-layer-under-border-radius-under-composited-layer.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/do-not-crash-use-after-free-update-widget-positions.html [ Crash ]
 crbug.com/591099 compositing/overflow/get-transform-from-non-box-container.html [ Failure ]
-crbug.com/591099 compositing/overflow/grandchild-composited-with-border-radius-ancestor.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/grandchild-with-border-radius-ancestor.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/mask-with-filter.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/mask-with-small-content-rect.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/nested-border-radius-clipping.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-compositing-descendant.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-scroll-with-local-image-background.html [ Failure ]
@@ -199,45 +171,26 @@
 crbug.com/591099 compositing/overflow/scaled-mask.html [ Failure ]
 crbug.com/591099 compositing/overflow/scroll-ancestor-update.html [ Failure ]
 crbug.com/591099 compositing/overflow/scrolling-content-clip-to-viewport.html [ Failure ]
-crbug.com/591099 compositing/overflow/siblings-composited-with-border-radius-ancestor-one-clipped.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/siblings-composited-with-border-radius-ancestor.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/siblings-with-border-radius-ancestor.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/textarea-scroll-touch.html [ Failure ]
-crbug.com/591099 compositing/overflow/universal-accelerated-overflow-scroll.html [ Pass Timeout ]
+crbug.com/591099 compositing/overflow/universal-accelerated-overflow-scroll.html [ Timeout ]
 crbug.com/591099 compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Failure ]
 crbug.com/591099 compositing/reflections/compositing-change-inside-reflection.html [ Failure ]
 crbug.com/591099 compositing/reflections/nested-reflection-mask-change.html [ Failure ]
-crbug.com/591099 compositing/reflections/nested-reflection-transformed.html [ Failure Pass ]
-crbug.com/591099 compositing/reflections/nested-reflection-transformed2.html [ Failure Pass ]
-crbug.com/591099 compositing/reflections/reflection-in-composited.html [ Failure Pass ]
-crbug.com/591099 compositing/reflections/remove-add-reflection.html [ Failure Pass ]
-crbug.com/591099 compositing/reflections/simple-composited-reflections.html [ Failure Pass ]
 crbug.com/591099 compositing/reflections/transform-inside-reflection.html [ Failure ]
-crbug.com/591099 compositing/render-surface-alpha-blending.html [ Failure Pass ]
 crbug.com/591099 compositing/rtl/rtl-absolute-overflow-scrolled.html [ Failure ]
 crbug.com/591099 compositing/rtl/rtl-absolute-overflow.html [ Failure ]
-crbug.com/591099 compositing/rtl/rtl-absolute.html [ Failure Pass ]
 crbug.com/591099 compositing/rtl/rtl-and-writing-mode-scrolling.html [ Failure ]
 crbug.com/591099 compositing/rtl/rtl-fixed-overflow-scrolled.html [ Failure ]
 crbug.com/591099 compositing/rtl/rtl-fixed-overflow.html [ Failure ]
-crbug.com/591099 compositing/rtl/rtl-fixed.html [ Failure Pass ]
 crbug.com/591099 compositing/rtl/rtl-iframe-absolute-overflow-scrolled.html [ Failure ]
 crbug.com/591099 compositing/rtl/rtl-iframe-absolute-overflow.html [ Failure ]
-crbug.com/591099 compositing/rtl/rtl-iframe-absolute.html [ Failure Pass ]
 crbug.com/591099 compositing/rtl/rtl-iframe-fixed-overflow-scrolled.html [ Failure ]
 crbug.com/591099 compositing/rtl/rtl-iframe-fixed-overflow.html [ Failure ]
-crbug.com/591099 compositing/rtl/rtl-iframe-fixed.html [ Failure Pass ]
 crbug.com/591099 compositing/rtl/rtl-overflow-invalidation.html [ Failure ]
-crbug.com/591099 compositing/rtl/rtl-overflow-scrolling.html [ Failure Pass ]
-crbug.com/591099 compositing/scrollbars/nested-overlay-scrollbars.html [ Failure Pass ]
 crbug.com/591099 compositing/self-painting-layers.html [ Failure ]
 crbug.com/591099 compositing/squashing/add-remove-squashed-layers.html [ Failure ]
 crbug.com/591099 compositing/squashing/selection-repaint-with-gaps.html [ Failure ]
-crbug.com/591099 compositing/squashing/squash-above-fixed-1.html [ Failure Pass ]
-crbug.com/591099 compositing/squashing/squash-above-fixed-3.html [ Failure Pass ]
 crbug.com/591099 compositing/squashing/squash-onto-distant-relative.html [ Crash ]
-crbug.com/591099 compositing/squashing/squash-transform-repainting-transformed-child.html [ Failure Pass ]
-crbug.com/591099 compositing/squashing/squashed-layer-loses-graphicslayer.html [ Failure Pass ]
 crbug.com/591099 compositing/squashing/vertical-writing-mode-squashed.html [ Failure ]
 crbug.com/591099 compositing/text-on-large-layer.html [ Failure ]
 crbug.com/591099 crypto/subtle/hkdf/cloneKey.html [ Timeout ]
@@ -576,23 +529,12 @@
 crbug.com/591099 css2.1/t170602-bdr-conflct-w-99-d.html [ Failure ]
 crbug.com/591099 css3/background/background-large-position-and-size-remains-stable.html [ Failure ]
 crbug.com/591099 css3/blending/background-blend-mode-overlapping-accelerated-elements.html [ Failure ]
-crbug.com/714962 css3/blending/effect-background-blend-mode-stacking.html [ Failure Pass ]
-crbug.com/714962 css3/blending/effect-background-blend-mode-tiled.html [ Failure Pass ]
-crbug.com/714962 css3/blending/effect-background-blend-mode.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-2nd-stacking-context-composited.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-composited-reason-children.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolated-group-1.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolation-2-stacking-contexts.html [ Failure Pass ]
-crbug.com/591099 css3/blending/mix-blend-mode-isolation-layer.html [ Failure Pass ]
 crbug.com/591099 css3/calc/catch-divide-by-0.html [ Failure ]
 crbug.com/591099 css3/calc/transition-crash3.html [ Failure ]
 crbug.com/591099 css3/calc/transition-crash4.html [ Failure ]
 crbug.com/591099 css3/css3-modsel-33.html [ Failure ]
-crbug.com/591099 css3/filters/add-filter-rendering.html [ Failure Pass ]
 crbug.com/591099 css3/filters/composited-during-transition-layertree.html [ Failure ]
 crbug.com/591099 css3/filters/composited-layer-child-bounds-after-composited-to-sw-shadow-change.html [ Failure ]
-crbug.com/591099 css3/filters/effect-blur-hw.html [ Failure Pass ]
-crbug.com/591099 css3/filters/effect-blur.html [ Failure Pass ]
 crbug.com/591099 css3/filters/effect-brightness-clamping-hw.html [ Failure ]
 crbug.com/591099 css3/filters/effect-brightness-clamping.html [ Failure ]
 crbug.com/591099 css3/filters/effect-brightness-hw.html [ Failure ]
@@ -618,10 +560,6 @@
 crbug.com/591099 css3/filters/effect-sepia.html [ Failure ]
 crbug.com/591099 css3/filters/filtered-inline.html [ Failure ]
 crbug.com/591099 css3/filters/multiple-references-id-mutate-crash-2.html [ Crash ]
-crbug.com/714962 css3/filters/nested-filter.html [ Failure Pass ]
-crbug.com/591099 css3/filters/regions-expanding.html [ Failure Pass ]
-crbug.com/591099 css3/filters/remove-filter-rendering.html [ Failure Pass ]
-crbug.com/591099 css3/filters/simple-filter-rendering.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/child-overflow.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-flow-border.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-flow-margins-auto-size.html [ Failure ]
@@ -638,13 +576,6 @@
 crbug.com/591099 css3/flexbox/scrollbars-auto.html [ Failure ]
 crbug.com/591099 css3/flexbox/scrollbars.html [ Failure ]
 crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ]
-crbug.com/591099 css3/masking/mask-luminance-gradient.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-luminance-png.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-luminance-svg.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-repeat-round-content.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-repeat-space-border.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-repeat-space-content.html [ Failure Pass ]
-crbug.com/591099 css3/masking/mask-repeat-space-padding.html [ Failure Pass ]
 crbug.com/591099 css3/selectors3/html/css3-modsel-167.html [ Failure ]
 crbug.com/591099 css3/selectors3/html/css3-modsel-167a.html [ Failure ]
 crbug.com/591099 css3/selectors3/html/css3-modsel-168.html [ Failure ]
@@ -752,10 +683,8 @@
 crbug.com/591099 editing/caret/caret-color-005.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-014.html [ Failure ]
 crbug.com/591099 editing/caret/caret-color-015.html [ Failure ]
-crbug.com/591099 editing/caret/caret-color.html [ Failure Pass ]
 crbug.com/591099 editing/caret/caret-position.html [ Failure ]
 crbug.com/591099 editing/deleting/4922367.html [ Failure ]
-crbug.com/591099 editing/deleting/5206311-1.html [ Failure Pass ]
 crbug.com/591099 editing/deleting/5272440.html [ Failure ]
 crbug.com/591099 editing/deleting/5369009.html [ Failure ]
 crbug.com/591099 editing/deleting/5433862-2.html [ Failure ]
@@ -763,9 +692,6 @@
 crbug.com/591099 editing/deleting/delete-at-paragraph-boundaries-011.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-br-013.html [ Failure ]
 crbug.com/591099 editing/deleting/delete-empty-table.html [ Failure ]
-crbug.com/591099 editing/deleting/delete-line-015.html [ Failure Pass ]
-crbug.com/591099 editing/deleting/delete-line-016.html [ Failure Pass ]
-crbug.com/591099 editing/deleting/delete-line-017.html [ Failure Pass ]
 crbug.com/591099 editing/deleting/merge-different-styles.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-endOfParagraph.html [ Failure ]
 crbug.com/591099 editing/deleting/merge-no-br.html [ Failure ]
@@ -783,11 +709,9 @@
 crbug.com/591099 editing/execCommand/5569741.html [ Failure ]
 crbug.com/591099 editing/execCommand/align-in-span.html [ Failure ]
 crbug.com/805784 editing/execCommand/dispatch-text-event-crash.html [ Crash ]
-crbug.com/591099 editing/execCommand/findString-2.html [ Failure Pass ]
 crbug.com/591099 editing/execCommand/findString.html [ Failure ]
 crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs-in-pre.html [ Failure ]
 crbug.com/591099 editing/execCommand/format-block-multiple-paragraphs.html [ Failure ]
-crbug.com/591099 editing/execCommand/format-block-with-trailing-br.html [ Failure Pass ]
 crbug.com/591099 editing/execCommand/insertImage.html [ Failure ]
 crbug.com/591099 editing/execCommand/insertNewLineInQuotedContent-outside-quote.html [ Failure ]
 crbug.com/591099 editing/execCommand/outdent-multiparagraph-list.html [ Failure ]
@@ -796,18 +720,12 @@
 crbug.com/591099 editing/execCommand/queryCommandState-02.html [ Failure ]
 crbug.com/591099 editing/execCommand/remove-list-from-range-selection.html [ Failure ]
 crbug.com/591099 editing/execCommand/replaceSelectorCommand-crash.html [ Crash ]
-crbug.com/591099 editing/input/linux_ltr_composition_underline.html [ Failure Pass ]
 crbug.com/591099 editing/input/linux_rtl_composition_underline.html [ Failure ]
-crbug.com/714962 editing/input/textcontrol-doubleclick-at-end.html [ Failure Pass ]
-crbug.com/591099 editing/inserting/4278698.html [ Failure Pass ]
 crbug.com/591099 editing/inserting/4840662.html [ Failure ]
 crbug.com/591099 editing/inserting/4875189-1.html [ Failure ]
 crbug.com/591099 editing/inserting/4959067.html [ Failure ]
-crbug.com/591099 editing/inserting/4960120-1.html [ Failure Pass ]
 crbug.com/591099 editing/inserting/5002441.html [ Failure ]
 crbug.com/591099 editing/inserting/5058163-1.html [ Failure ]
-crbug.com/591099 editing/inserting/5058163-2.html [ Failure Pass ]
-crbug.com/591099 editing/inserting/5156401-2.html [ Failure Pass ]
 crbug.com/591099 editing/inserting/5418891.html [ Failure ]
 crbug.com/591099 editing/inserting/5510537.html [ Failure ]
 crbug.com/591099 editing/inserting/5549929-2.html [ Failure ]
@@ -823,9 +741,6 @@
 crbug.com/591099 editing/inserting/insert-br-quoted-004.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-br-quoted-005.html [ Failure ]
 crbug.com/591099 editing/inserting/insert-br-quoted-006.html [ Failure ]
-crbug.com/591099 editing/inserting/insert-space-in-empty-doc.html [ Failure Pass ]
-crbug.com/591099 editing/inserting/insert-text-at-tabspan-001.html [ Failure Pass ]
-crbug.com/591099 editing/inserting/insert-text-at-tabspan-003.html [ Failure Pass ]
 crbug.com/591099 editing/inserting/line-break.html [ Failure ]
 crbug.com/591099 editing/inserting/paragraph-separator-in-table-1.html [ Failure ]
 crbug.com/591099 editing/inserting/paragraph-separator-in-table-2.html [ Failure ]
@@ -836,8 +751,6 @@
 crbug.com/591099 editing/pasteboard/5071074-2.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5071074.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5134759.html [ Failure ]
-crbug.com/591099 editing/pasteboard/5156401-1.html [ Failure Pass ]
-crbug.com/591099 editing/pasteboard/5478250.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/5601583-1.html [ Failure ]
 crbug.com/591099 editing/pasteboard/5761530-1.html [ Failure ]
 crbug.com/591099 editing/pasteboard/7955.html [ Failure ]
@@ -846,24 +759,17 @@
 crbug.com/591099 editing/pasteboard/copy-in-password-field.html [ Failure ]
 crbug.com/714962 editing/pasteboard/copy-paste-pre-line-content.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Failure ]
-crbug.com/591099 editing/pasteboard/copy-standalone-image.html [ Failure Pass ]
-crbug.com/714962 editing/pasteboard/drag-drop-copy-text.html [ Failure Pass ]
-crbug.com/714962 editing/pasteboard/drag-drop-input-textarea.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/drag-drop-url-text.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-image-to-contenteditable-in-iframe.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-list-item.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drag-selected-image-to-contenteditable.html [ Failure ]
 crbug.com/591099 editing/pasteboard/dragstart-contains-default-content.html [ Failure ]
 crbug.com/591099 editing/pasteboard/drop-inputtext-acquires-style.html [ Failure ]
-crbug.com/591099 editing/pasteboard/drop-text-events.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/drop-text-without-selection.html [ Failure ]
-crbug.com/714962 editing/pasteboard/file-input-files-access.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/innerText-inline-table.html [ Failure ]
 crbug.com/591099 editing/pasteboard/input-field-1.html [ Failure ]
 crbug.com/591099 editing/pasteboard/merge-start-blockquote.html [ Failure ]
 crbug.com/591099 editing/pasteboard/merge-start-list.html [ Failure ]
-crbug.com/591099 editing/pasteboard/paste-blockquote-after-blockquote.html [ Failure Pass ]
-crbug.com/591099 editing/pasteboard/paste-blockquote-into-blockquote-4.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/paste-line-endings-001.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-line-endings-002.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-line-endings-003.html [ Failure ]
@@ -872,7 +778,6 @@
 crbug.com/591099 editing/pasteboard/paste-noscript.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-pre-001.html [ Failure ]
 crbug.com/591099 editing/pasteboard/paste-text-016.html [ Failure ]
-crbug.com/591099 editing/pasteboard/paste-text-at-tabspan-003.html [ Failure Pass ]
 crbug.com/591099 editing/pasteboard/pasting-tabs.html [ Failure ]
 crbug.com/591099 editing/pasteboard/quirks-mode-br-1.html [ Failure ]
 crbug.com/591099 editing/pasteboard/styled-element-markup.html [ Failure ]
@@ -885,7 +790,6 @@
 crbug.com/591099 editing/selection/5131716-2.html [ Failure ]
 crbug.com/591099 editing/selection/5131716-3.html [ Failure ]
 crbug.com/591099 editing/selection/5131716-4.html [ Failure ]
-crbug.com/591099 editing/selection/5195166-2.html [ Failure Pass ]
 crbug.com/591099 editing/selection/5232159.html [ Failure ]
 crbug.com/591099 editing/selection/5354455-2.html [ Failure ]
 crbug.com/714962 editing/selection/anchor-focus2.html [ Failure ]
@@ -895,22 +799,15 @@
 crbug.com/591099 editing/selection/caret-ltr-right.html [ Failure ]
 crbug.com/591099 editing/selection/caret-ltr.html [ Failure ]
 crbug.com/591099 editing/selection/clear-selection-crash.html [ Crash ]
-crbug.com/591099 editing/selection/clear-selection.html [ Failure Pass ]
-crbug.com/591099 editing/selection/contenteditable-click-inside.html [ Failure Pass ]
 crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ]
 crbug.com/591099 editing/selection/continuations-without-move-caret-to-boundary.html [ Failure ]
-crbug.com/591099 editing/selection/display-table-text.html [ Failure Pass ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Failure ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed.html [ Failure ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl.html [ Failure ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Failure ]
 crbug.com/591099 editing/selection/doubleclick-beside-cr-span.html [ Timeout ]
-crbug.com/714962 editing/selection/drag-drop-events.html [ Failure Pass ]
-crbug.com/714962 editing/selection/drag-drop-restore.html [ Failure Pass ]
 crbug.com/591099 editing/selection/drag-in-iframe.html [ Failure ]
 crbug.com/714962 editing/selection/drag-select-rapidly.html [ Failure ]
-crbug.com/714962 editing/selection/drag-text-delay.html [ Failure Pass ]
-crbug.com/591099 editing/selection/drag_with_unfocused_selection.html [ Failure Pass ]
 crbug.com/591099 editing/selection/editable-div-clear-on-keydown.html [ Failure ]
 crbug.com/591099 editing/selection/expanding-selections.html [ Failure ]
 crbug.com/591099 editing/selection/expanding-selections2.html [ Failure ]
@@ -928,12 +825,10 @@
 crbug.com/591099 editing/selection/inactive-selection.html [ Failure ]
 crbug.com/591099 editing/selection/inline-closest-leaf-child.html [ Failure ]
 crbug.com/591099 editing/selection/keydown-without-selection-crash.html [ Crash ]
-crbug.com/591099 editing/selection/line-wrap-1.html [ Failure Pass ]
 crbug.com/591099 editing/selection/line-wrap-2.html [ Failure ]
 crbug.com/591099 editing/selection/linux_selection_color.html [ Failure ]
 crbug.com/591099 editing/selection/mixed-editability-1.html [ Failure ]
 crbug.com/591099 editing/selection/mixed-editability-10.html [ Failure ]
-crbug.com/591099 editing/selection/mixed-editability-2.html [ Failure Pass ]
 crbug.com/591099 editing/selection/mixed-editability-4.html [ Failure ]
 crbug.com/591099 editing/selection/mixed-editability-5.html [ Failure ]
 crbug.com/591099 editing/selection/mixed-editability-7.html [ Failure ]
@@ -944,36 +839,24 @@
 crbug.com/714962 editing/selection/modify_move/move-forward-after-line-break.html [ Failure ]
 crbug.com/591099 editing/selection/modify_move/move_by_sentence_boundary.html [ Failure ]
 crbug.com/714962 editing/selection/modify_move/move_by_word_with_underscore.html [ Failure ]
-crbug.com/591099 editing/selection/mouse/click-user-select-all-textarea.html [ Failure Pass ]
 crbug.com/591099 editing/selection/mouse/extend_by_word_with_base_is_end.html [ Failure ]
 crbug.com/714962 editing/selection/mouse/user-drag-element-and-user-select-none.html [ Failure ]
 crbug.com/591099 editing/selection/move-3875618-fix.html [ Failure ]
 crbug.com/591099 editing/selection/move-3875641-fix.html [ Failure ]
-crbug.com/591099 editing/selection/move-backwords-by-word-001.html [ Failure Pass ]
 crbug.com/591099 editing/selection/move-by-line-002.html [ Failure ]
-crbug.com/591099 editing/selection/move-by-sentence-001.html [ Failure Pass ]
-crbug.com/591099 editing/selection/move-left-right.html [ Pass Timeout ]
-crbug.com/591099 editing/selection/move-past-trailing-space.html [ Failure Pass ]
+crbug.com/591099 editing/selection/move-left-right.html [ Timeout ]
 crbug.com/714962 editing/selection/offset-from-point-complex-scripts.html [ Failure ]
 crbug.com/714962 editing/selection/offset-from-point.html [ Failure ]
 crbug.com/591099 editing/selection/paint-hyphen.html [ Failure ]
 crbug.com/591099 editing/selection/paragraph-granularity.html [ Failure ]
 crbug.com/591099 editing/selection/programmatic-selection-on-mac-is-directionless.html [ Timeout ]
 crbug.com/591099 editing/selection/range-between-block-and-inline.html [ Failure ]
-crbug.com/591099 editing/selection/readonly-disabled-hittest.html [ Failure Pass ]
-crbug.com/591099 editing/selection/replaced-boundaries-1.html [ Failure Pass ]
-crbug.com/591099 editing/selection/replaced-boundaries-2.html [ Failure Pass ]
-crbug.com/591099 editing/selection/replaced-boundaries-3.html [ Failure Pass ]
-crbug.com/591099 editing/selection/select-across-readonly-input-1.html [ Failure Pass ]
 crbug.com/591099 editing/selection/select-across-readonly-input-2.html [ Failure ]
 crbug.com/591099 editing/selection/select-across-readonly-input-3.html [ Failure ]
-crbug.com/591099 editing/selection/select-across-readonly-input-4.html [ Failure Pass ]
-crbug.com/591099 editing/selection/select-across-readonly-input-5.html [ Failure Pass ]
 crbug.com/591099 editing/selection/select-bidi-run.html [ Failure ]
 crbug.com/591099 editing/selection/select-box.html [ Failure ]
 crbug.com/591099 editing/selection/select-element-paragraph-boundary.html [ Failure ]
 crbug.com/714962 editing/selection/select-from-textfield-outwards.html [ Failure ]
-crbug.com/714962 editing/selection/select-line-break-with-opposite-directionality.html [ Failure Pass ]
 crbug.com/591099 editing/selection/select-missing-image.html [ Failure ]
 crbug.com/591099 editing/selection/select-out-of-floated-contenteditable.html [ Failure ]
 crbug.com/591099 editing/selection/select-out-of-floated-input.html [ Failure ]
@@ -985,7 +868,6 @@
 crbug.com/591099 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Failure ]
 crbug.com/591099 editing/selection/select-text-overflow-ellipsis.html [ Failure ]
 crbug.com/591099 editing/selection/select_all/select_all_details_crash.html [ Failure ]
-crbug.com/591099 editing/selection/selection-3748164-fix.html [ Failure Pass ]
 crbug.com/591099 editing/selection/selection-button-text.html [ Failure ]
 crbug.com/591099 editing/selection/selection-in-iframe-removed-crash.html [ Crash ]
 crbug.com/591099 editing/selection/selection-invalid-offset.html [ Failure ]
@@ -995,18 +877,11 @@
 crbug.com/591099 editing/selection/triple-click-in-pre.html [ Failure ]
 crbug.com/591099 editing/selection/user-select/user-select-all.html [ Failure ]
 crbug.com/591099 editing/selection/word-granularity.html [ Failure ]
-crbug.com/591099 editing/selection/wrapped-line-caret-1.html [ Failure Pass ]
-crbug.com/591099 editing/selection/wrapped-line-caret-2.html [ Failure Pass ]
 crbug.com/714962 editing/shadow/compare-positions-in-nested-shadow.html [ Failure ]
 crbug.com/591099 editing/spelling/design-mode-spellcheck-off.html [ Failure ]
-crbug.com/591099 editing/style/4916887.html [ Failure Pass ]
-crbug.com/591099 editing/style/5065910.html [ Failure Pass ]
-crbug.com/591099 editing/style/5084241.html [ Failure Pass ]
 crbug.com/591099 editing/style/5228141.html [ Failure ]
-crbug.com/591099 editing/style/5279521.html [ Failure Pass ]
 crbug.com/805784 editing/style/apply-style-crash2.html [ Crash ]
 crbug.com/591099 editing/style/block-styles-007.html [ Failure ]
-crbug.com/591099 editing/style/highlight.html [ Failure Pass ]
 crbug.com/591099 editing/text-iterator/findString-start-search-after-selection.html [ Failure ]
 crbug.com/591099 editing/text-iterator/findString.html [ Timeout ]
 crbug.com/591099 editing/undo/crash-redo-with-iframes.html [ Failure ]
@@ -1031,7 +906,7 @@
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_ECDH.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_ECDSA.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_HMAC.worker.html [ Timeout ]
-crbug.com/714962 external/wpt/WebCryptoAPI/generateKey/failures_RSA-OAEP.https.worker.html [ Pass Timeout ]
+crbug.com/714962 external/wpt/WebCryptoAPI/generateKey/failures_RSA-OAEP.https.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.html [ Timeout ]
@@ -1452,7 +1327,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-018.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-020.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-030.xht [ Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-003.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-005.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-007.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-009.xht [ Failure Pass ]
@@ -1463,10 +1338,10 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-019.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-021.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-023.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-025.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-025.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-027.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-031.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-031.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-033.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-035.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-037.xht [ Failure ]
@@ -1474,47 +1349,47 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-043.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-045.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-047.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-049.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-047.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-049.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-051.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-053.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-055.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-057.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-055.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-057.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-059.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-061.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-063.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-067.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-069.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-069.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-071.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-073.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-075.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-075.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-079.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-081.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-083.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-085.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-087.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-091.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-093.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-093.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-097.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-103.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-107.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-111.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-111.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-113.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-115.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-117.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-119.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-121.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-123.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-127.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-129.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-131.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-131.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-133.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-135.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137.xht [ Failure ]
@@ -1522,48 +1397,48 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-143.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-145.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-147.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-147.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-149.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-151.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-155.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-159.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-161.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-161.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-163.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-165.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-165.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-167.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-171.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-175.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-175.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-177.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-179.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-181.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-179.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-181.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-183.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-187.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-191.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-193.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-195.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-195.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-197.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-199.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-203.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-207.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-207.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-209.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-211.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-211.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-215.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-219.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-223.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-223.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-227.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-006.xht [ Failure ]
@@ -1594,7 +1469,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-056.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-058.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-060.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-062.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-062.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-066.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-068.xht [ Failure ]
@@ -1610,7 +1485,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-088.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-090.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-092.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-094.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-094.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-096.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-102.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-104.xht [ Failure Pass ]
@@ -1621,7 +1496,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-114.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-116.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-118.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-120.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-120.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-122.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-124.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-126.xht [ Failure ]
@@ -1631,7 +1506,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-134.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-138.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-142.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-146.xht [ Failure ]
@@ -1647,21 +1522,21 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-166.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-168.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-170.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-174.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-178.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-180.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-182.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-184.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-186.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-190.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-194.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-196.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-198.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-200.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-200.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-202.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-204.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-206.xht [ Failure ]
@@ -1712,7 +1587,7 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/float-vlr-007.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/float-vlr-013.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/float-vrl-004.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/float-vrl-006.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/float-vrl-006.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/float-vrl-008.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/float-vrl-012.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/horizontal-rule-vrl-002.xht [ Failure ]
@@ -1792,11 +1667,11 @@
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-009.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/text-align-vlr-011.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-013.xht [ Failure ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-015.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-015.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-017.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vlr-019.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-002.xht [ Failure Pass ]
-crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-004.xht [ Failure Pass ]
+crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-004.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-006.xht [ Failure ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-008.xht [ Failure Pass ]
 crbug.com/714962 external/wpt/css/css-writing-modes/text-align-vrl-010.xht [ Failure Pass ]
@@ -1852,9 +1727,6 @@
 crbug.com/591099 external/wpt/css/cssom-view/cssom-getClientRects-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/cssom-view/elementFromPoint-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/cssom-view/elementFromPoint-003.html [ Failure ]
-crbug.com/591099 external/wpt/css/cssom-view/elementFromPoint.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/cssom-view/elementsFromPoint-svg.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/cssom-view/overscrollBehavior-manual.html [ Pass Timeout ]
 crbug.com/714962 external/wpt/css/cssom/medialist-dynamic-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/cssom/stylesheet-replacedata-dynamic.html [ Failure ]
 crbug.com/591099 external/wpt/css/geometry/interfaces.html [ Timeout ]
@@ -2034,8 +1906,6 @@
 crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-misc.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/legacy-mb-tchinese/big5/big5-encode-href.html [ Timeout ]
 crbug.com/591099 external/wpt/encoding/textdecoder-fatal-single-byte.html [ Timeout ]
-crbug.com/591099 external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Failure Pass ]
-crbug.com/591099 external/wpt/feature-policy/autoplay-allowed-by-feature-policy.https.sub.html [ Failure Pass ]
 crbug.com/591099 external/wpt/feature-policy/payment-allowed-by-feature-policy.https.sub.html [ Pass ]
 crbug.com/591099 external/wpt/feature-policy/payment-disabled-by-feature-policy.https.sub.html [ Pass ]
 crbug.com/591099 external/wpt/fetch/api/redirect/redirect-location-worker.html [ Pass Timeout ]
@@ -2111,15 +1981,8 @@
 crbug.com/591099 external/wpt/performance-timeline/po-callback-mutate.any.html [ Pass ]
 crbug.com/591099 external/wpt/performance-timeline/po-callback-mutate.any.worker.html [ Pass ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html [ Timeout ]
-crbug.com/714962 external/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Pass Timeout ]
-crbug.com/714962 external/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_disabled_form_control-manual.html [ Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-manual.html [ Pass Timeout ]
-crbug.com/714962 external/wpt/pointerevents/pointerevent_lostpointercapture_is_first-manual.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_pointerleave_pen-manual.html [ Failure ]
-crbug.com/714962 external/wpt/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html [ Pass Timeout ]
-crbug.com/714962 external/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Pass Timeout ]
 crbug.com/714962 external/wpt/pointerevents/pointerevent_touch-action-auto-css_touch-manual.html [ Timeout ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-button-test_touch-manual.html [ Timeout ]
 crbug.com/714962 external/wpt/pointerevents/pointerevent_touch-action-keyboard-manual.html [ Timeout ]
@@ -2162,7 +2025,6 @@
 crbug.com/591099 external/wpt/svg/linking/reftests/href-filter-element.html [ Failure ]
 crbug.com/591099 external/wpt/svg/path/bearing/absolute.svg [ Pass ]
 crbug.com/591099 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Timeout ]
-crbug.com/714962 external/wpt/uievents/order-of-events/mouse-events/click-cancel.html [ Failure Pass ]
 crbug.com/591099 external/wpt/url/url-setters.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/wasm/wasm_local_iframe_test.html [ Failure ]
 crbug.com/591099 external/wpt/webmessaging/broadcastchannel/sandbox.html [ Failure ]
@@ -2266,7 +2128,6 @@
 crbug.com/591099 fast/animation/scroll-animations/scrolltimeline-currenttime.html [ Failure ]
 crbug.com/591099 fast/autoresize/basic.html [ Failure ]
 crbug.com/591099 fast/autoresize/turn-off-autoresize.html [ Failure ]
-crbug.com/591099 fast/backgrounds/001.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/animated-gif-as-background-rounded.html [ Failure ]
 crbug.com/591099 fast/backgrounds/animated-gif-as-background.html [ Failure ]
 crbug.com/591099 fast/backgrounds/animated-svg-as-mask.html [ Failure Pass ]
@@ -2274,17 +2135,13 @@
 crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-inherit-color-bug.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ]
-crbug.com/591099 fast/backgrounds/background-leakage.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/background-origin-root-element.html [ Failure ]
-crbug.com/591099 fast/backgrounds/background-position-1.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/background-repeat-with-background-color.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-svg-scaling-zoom.html [ Failure ]
 crbug.com/591099 fast/backgrounds/background-svg-scaling.html [ Failure ]
 crbug.com/591099 fast/backgrounds/body-generated-image-propagated-to-root.html [ Failure ]
 crbug.com/591099 fast/backgrounds/border-radius-split-background-image.html [ Failure ]
 crbug.com/591099 fast/backgrounds/border-radius-split-background.html [ Failure ]
-crbug.com/591099 fast/backgrounds/mask-box-image.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/mask-composite.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/opacity-on-document-element.html [ Failure ]
 crbug.com/591099 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ]
 crbug.com/591099 fast/backgrounds/repeat/mask-negative-offset-repeat.html [ Failure ]
@@ -2293,46 +2150,23 @@
 crbug.com/591099 fast/backgrounds/repeat/noRepeatCorrectClip.html [ Failure ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-image-list-style.html [ Failure ]
 crbug.com/591099 fast/backgrounds/selection-background-color-of-list-style.html [ Failure ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize01.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize02.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize03.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize04.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize05.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize06.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize07.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize08.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize09.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize10.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize11.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize12.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize13.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize14.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/size/backgroundSize15.html [ Failure ]
 crbug.com/591099 fast/backgrounds/size/backgroundSize16.html [ Failure ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize17.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize18.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize19.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize20.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize21.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/backgroundSize22.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/size/contain-and-cover-zoomed.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/size/contain-and-cover.html [ Failure ]
 crbug.com/591099 fast/backgrounds/size/zero.html [ Failure ]
 crbug.com/591099 fast/backgrounds/svg-as-mask.html [ Failure Pass ]
-crbug.com/591099 fast/block/basic/quirk-height.html [ Failure Pass ]
 crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ]
 crbug.com/591099 fast/block/basic/quirk-percent-height-table-cell.html [ Failure ]
 crbug.com/591099 fast/block/block-add-child-crash.html [ Crash ]
 crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Failure ]
 crbug.com/591099 fast/block/float-avoids-padding-inline-ancestors.html [ Crash ]
 crbug.com/810335 fast/block/float/003.html [ Failure ]
-crbug.com/591099 fast/block/float/br-with-clear-2.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/element-clears-float-without-clearance.html [ Failure ]
 crbug.com/591099 fast/block/float/float-avoidance.html [ Failure ]
 crbug.com/591099 fast/block/float/float-in-float-hit-testing.html [ Failure ]
 crbug.com/591099 fast/block/float/float-in-float-painting.html [ Failure ]
-crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Failure ]
-crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure ]
+crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks-2.html [ Failure Pass ]
+crbug.com/591099 fast/block/float/float-should-dirty-line-when-adjacent-to-line-breaks.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/floats-offset-image-strict-line-height.html [ Failure ]
 crbug.com/591099 fast/block/float/floats-offset-inline-block-strict-line-height.html [ Failure ]
 crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats-with-margin-on-parent.html [ Failure ]
@@ -2351,7 +2185,6 @@
 crbug.com/591099 fast/block/over-constrained-auto-margin.html [ Failure ]
 crbug.com/591099 fast/block/positioning/056.html [ Failure ]
 crbug.com/591099 fast/block/positioning/059.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-with-html-border-quirks.html [ Failure Pass ]
 crbug.com/591099 fast/block/positioning/abspos-auto-left-and-width-change-parent-margin-left.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto-height-with-top-and-bottom.html [ Failure ]
 crbug.com/714962 fast/block/positioning/auto/vertical-rl/001.html [ Failure ]
@@ -2367,7 +2200,6 @@
 crbug.com/591099 fast/block/positioning/fixed-in-abs-height-change.html [ Crash ]
 crbug.com/591099 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ]
 crbug.com/591099 fast/block/positioning/insert-positioned-in-anonymous-crash.html [ Crash ]
-crbug.com/591099 fast/block/positioning/leftmargin-topmargin.html [ Failure Pass ]
 crbug.com/591099 fast/block/positioning/move-with-auto-width.html [ Failure ]
 crbug.com/714962 fast/block/positioning/offsetLeft-offsetTop-multicolumn.html [ Failure ]
 crbug.com/591099 fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html [ Crash ]
@@ -2430,24 +2262,19 @@
 crbug.com/714962 fast/borders/table-borders.html [ Failure ]
 crbug.com/591099 fast/box-decoration-break/box-decoration-break-rendering.html [ Failure ]
 crbug.com/591099 fast/box-shadow/basic-shadows.html [ Failure ]
-crbug.com/591099 fast/box-shadow/border-radius-big.html [ Failure Pass ]
 crbug.com/591099 fast/box-shadow/box-shadow-radius.html [ Failure ]
 crbug.com/591099 fast/box-shadow/box-shadow.html [ Failure ]
 crbug.com/591099 fast/box-shadow/inset-box-shadow-radius.html [ Failure ]
 crbug.com/591099 fast/box-shadow/inset-box-shadows.html [ Failure ]
 crbug.com/591099 fast/box-shadow/inset-subpixel.html [ Failure ]
-crbug.com/591099 fast/box-shadow/inset-with-extraordinary-radii-and-border.html [ Failure Pass ]
 crbug.com/591099 fast/box-shadow/inset.html [ Failure ]
 crbug.com/591099 fast/box-shadow/scaled-box-shadow.html [ Failure ]
-crbug.com/591099 fast/box-shadow/spread.html [ Failure Pass ]
-crbug.com/591099 fast/box-shadow/transform-fringing.html [ Failure Pass ]
 crbug.com/591099 fast/box-sizing/replaced.html [ Failure Pass ]
 crbug.com/591099 fast/canvas-api/toDataURL-supportedTypes.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-drawImage-animated-images.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-measure-bidi-text.html [ Failure ]
 crbug.com/714962 fast/canvas/canvas-textMetrics-width.html [ Failure ]
 crbug.com/591099 fast/canvas/canvas-transforms-during-path.html [ Failure ]
-crbug.com/591099 fast/canvas/fill-stroke-clip-reset-path.html [ Failure Pass ]
 crbug.com/714962 fast/canvas/image-object-in-canvas.html [ Failure ]
 crbug.com/591099 fast/canvas/patternfill-repeat.html [ Failure ]
 crbug.com/714962 fast/canvas/setWidthResetAfterForcedRender.html [ Failure ]
@@ -2461,13 +2288,11 @@
 crbug.com/591099 fast/constructors/blob-sparse-array-assertion-failure.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/001.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/002.html [ Failure ]
-crbug.com/591099 fast/css-generated-content/003.html [ Failure Pass ]
 crbug.com/591099 fast/css-generated-content/005.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/007.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/008.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/009.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/010.html [ Failure ]
-crbug.com/591099 fast/css-generated-content/011.html [ Failure Pass ]
 crbug.com/591099 fast/css-generated-content/012.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/013.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/014.html [ Failure ]
@@ -2480,13 +2305,11 @@
 crbug.com/591099 fast/css-generated-content/crash-selection-editing-removes-pseudo.html [ Crash ]
 crbug.com/591099 fast/css-generated-content/empty-first-letter-with-columns-crash.html [ Crash ]
 crbug.com/591099 fast/css-generated-content/first-letter-in-nested-before-table.html [ Failure ]
-crbug.com/591099 fast/css-generated-content/first-letter-in-nested-before.html [ Failure Pass ]
 crbug.com/591099 fast/css-generated-content/first-letter-next-sibling-crash.html [ Crash ]
 crbug.com/591099 fast/css-generated-content/float-first-letter-siblings-convert-to-inline.html [ Crash ]
 crbug.com/714962 fast/css-generated-content/hover-inline.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/hover-style-change.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/inline-display-types.html [ Failure ]
-crbug.com/591099 fast/css-generated-content/nested-tables-with-before-after-content-crash.html [ Failure Pass ]
 crbug.com/591099 fast/css-generated-content/no-openclose-quote.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/table-before-after-child-add.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/table-cell-before-after-child-add.html [ Failure ]
@@ -2622,12 +2445,9 @@
 crbug.com/807708 fast/css-intrinsic-dimensions/width-avoid-floats.html [ Failure ]
 crbug.com/591099 fast/css/001.html [ Failure ]
 crbug.com/591099 fast/css/002.html [ Failure ]
-crbug.com/591099 fast/css/003.html [ Failure Pass ]
 crbug.com/591099 fast/css/004.html [ Failure ]
 crbug.com/591099 fast/css/005.html [ Failure ]
-crbug.com/591099 fast/css/006.html [ Failure Pass ]
 crbug.com/591099 fast/css/007.html [ Failure ]
-crbug.com/591099 fast/css/008.html [ Failure Pass ]
 crbug.com/591099 fast/css/MarqueeLayoutTest.html [ Failure ]
 crbug.com/591099 fast/css/ZeroOpacityLayers.html [ Failure ]
 crbug.com/591099 fast/css/ZeroOpacityLayers2.html [ Failure ]
@@ -2639,34 +2459,22 @@
 crbug.com/591099 fast/css/absolute-poition-in-rtl-parent.html [ Failure ]
 crbug.com/591099 fast/css/acid2-pixel.html [ Failure ]
 crbug.com/591099 fast/css/acid2.html [ Failure ]
-crbug.com/714962 fast/css/active-pseudo-and-focus-move.html [ Failure Pass ]
 crbug.com/591099 fast/css/area-computedStyle.html [ Failure ]
 crbug.com/591099 fast/css/background-clip-radius-values.html [ Failure ]
-crbug.com/591099 fast/css/background-clip-values.html [ Failure Pass ]
 crbug.com/591099 fast/css/background-image-with-baseurl.html [ Failure Pass ]
 crbug.com/591099 fast/css/background-shorthand-invalid-url.html [ Failure ]
 crbug.com/591099 fast/css/beforeSelectorOnCodeElement.html [ Failure ]
-crbug.com/591099 fast/css/bogus-color-span.html [ Failure Pass ]
 crbug.com/714962 fast/css/border-current-color.html [ Failure ]
 crbug.com/591099 fast/css/border-radius-outline-offset.html [ Failure ]
-crbug.com/591099 fast/css/box-shadow-and-border-radius.html [ Failure Pass ]
-crbug.com/591099 fast/css/bug4860-absolute-block-child-does-not-inherit-alignment.html [ Failure Pass ]
 crbug.com/591099 fast/css/case-transform.html [ Failure ]
 crbug.com/591099 fast/css/center-align-absolute-position-inline-block.html [ Failure ]
 crbug.com/591099 fast/css/center-align-absolute-position.html [ Failure ]
 crbug.com/591099 fast/css/checked-pseudo-selector.html [ Failure ]
-crbug.com/591099 fast/css/child-style-can-override-visited-style.html [ Failure Pass ]
-crbug.com/591099 fast/css/clip-text-in-scaled-div.html [ Failure Pass ]
 crbug.com/591099 fast/css/clip-zooming.html [ Failure ]
-crbug.com/591099 fast/css/color-correction-on-background-image.html [ Failure Pass ]
 crbug.com/591099 fast/css/color-correction-on-backgrounds.html [ Failure ]
 crbug.com/591099 fast/css/color-correction-on-box-shadow.html [ Failure ]
 crbug.com/591099 fast/css/color-correction-on-text-shadow.html [ Failure ]
-crbug.com/591099 fast/css/color-correction-on-text.html [ Failure Pass ]
-crbug.com/591099 fast/css/color-correction-untagged-images.html [ Failure Pass ]
 crbug.com/591099 fast/css/color-correction.html [ Failure ]
-crbug.com/591099 fast/css/color-leakage.html [ Failure Pass ]
-crbug.com/591099 fast/css/color-quirk.html [ Failure Pass ]
 crbug.com/591099 fast/css/compare-content-style.html [ Failure ]
 crbug.com/591099 fast/css/computed-image-width-with-percent-height-quirksmode.html [ Failure ]
 crbug.com/591099 fast/css/containment/contain-paint-composited-scroll.html [ Failure ]
@@ -2679,17 +2487,11 @@
 crbug.com/591099 fast/css/css1_forward_compatible_parsing.html [ Failure ]
 crbug.com/591099 fast/css/css3-ch-unit.html [ Failure ]
 crbug.com/591099 fast/css/css3-modsel-22.html [ Failure ]
-crbug.com/591099 fast/css/css3-nth-child.html [ Failure Pass ]
 crbug.com/591099 fast/css/css3-space-in-nth-and-lang.html [ Failure ]
 crbug.com/591099 fast/css/dfn-default-font-style.html [ Failure ]
-crbug.com/714962 fast/css/disabled-form-control-elements-should-not-be-active.html [ Failure Pass ]
-crbug.com/591099 fast/css/dynamic-sibling-selector.html [ Failure Pass ]
-crbug.com/591099 fast/css/empty-inline-003-quirksmode.htm [ Failure Pass ]
 crbug.com/591099 fast/css/empty-inline-line-height-first-line-quirksmode.htm [ Failure ]
 crbug.com/591099 fast/css/empty-inline-line-height-first-line.htm [ Failure ]
-crbug.com/591099 fast/css/error-in-last-decl.html [ Failure Pass ]
 crbug.com/591099 fast/css/ex-after-font-variant.html [ Failure ]
-crbug.com/591099 fast/css/fieldset-display-row.html [ Failure Pass ]
 crbug.com/591099 fast/css/find-next-layer.html [ Failure ]
 crbug.com/591099 fast/css/first-child-pseudo-class.html [ Failure ]
 crbug.com/714962 fast/css/first-letter-before-hit-test.html [ Failure ]
@@ -2703,7 +2505,6 @@
 crbug.com/591099 fast/css/first-letter-hover.html [ Failure ]
 crbug.com/714962 fast/css/first-letter-range-insert.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure ]
-crbug.com/591099 fast/css/first-letter-set-text.html [ Failure Pass ]
 crbug.com/591099 fast/css/first-letter-text-fragment-crash.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-visibility.html [ Failure ]
 crbug.com/714962 fast/css/first-line-change-color-direct.html [ Failure ]
@@ -2714,7 +2515,6 @@
 crbug.com/591099 fast/css/first-of-type-pseudo-class.html [ Failure ]
 crbug.com/591099 fast/css/focus-ring-continuations.html [ Failure ]
 crbug.com/591099 fast/css/focus-ring-detached.html [ Failure ]
-crbug.com/591099 fast/css/focus-ring-multiline-writingmode-vertical.html [ Failure Pass ]
 crbug.com/591099 fast/css/focus-ring-multiline.html [ Failure ]
 crbug.com/591099 fast/css/focus-ring-outline-color.html [ Failure ]
 crbug.com/591099 fast/css/focus-ring-outline-offset.html [ Failure ]
@@ -2725,9 +2525,7 @@
 crbug.com/591099 fast/css/font-face-synthetic-bold-italic-for-locally-installed.html [ Failure ]
 crbug.com/591099 fast/css/font-face-synthetic-bold-italic.html [ Failure ]
 crbug.com/591099 fast/css/font-face-weight-matching.html [ Failure ]
-crbug.com/591099 fast/css/font-family-pictograph.html [ Failure Pass ]
 crbug.com/591099 fast/css/font-shorthand-weight-only.html [ Failure ]
-crbug.com/591099 fast/css/font-size-negative.html [ Failure Pass ]
 crbug.com/591099 fast/css/font-smoothing.html [ Failure ]
 crbug.com/591099 fast/css/font_property_normal.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Crash ]
@@ -2743,7 +2541,6 @@
 crbug.com/714962 fast/css/hover-pseudo-element-quirks.html [ Failure ]
 crbug.com/591099 fast/css/hover-subselector.html [ Failure ]
 crbug.com/591099 fast/css/hsl-color.html [ Failure ]
-crbug.com/591099 fast/css/hsla-color.html [ Failure Pass ]
 crbug.com/591099 fast/css/ignore-empty-focus-ring-rects.html [ Failure ]
 crbug.com/591099 fast/css/image-orientation/image-orientation-default.html [ Failure ]
 crbug.com/591099 fast/css/image-orientation/image-orientation-from-image-composited-dynamic.html [ Failure ]
@@ -2751,13 +2548,9 @@
 crbug.com/591099 fast/css/image-orientation/image-orientation-from-image.html [ Failure ]
 crbug.com/591099 fast/css/import-rule-regression-11590.html [ Failure ]
 crbug.com/591099 fast/css/import_with_baseurl.html [ Failure Pass ]
-crbug.com/591099 fast/css/inline-element-line-break.html [ Failure Pass ]
-crbug.com/591099 fast/css/inline-properties-important.html [ Failure Pass ]
 crbug.com/591099 fast/css/inline-table-empty-non-auto.html [ Failure ]
-crbug.com/591099 fast/css/input-search-padding.html [ Failure Pass ]
 crbug.com/591099 fast/css/intruding-floats-crash.html [ Failure ]
 crbug.com/591099 fast/css/invalid-percentage-property.html [ Failure ]
-crbug.com/591099 fast/css/invalid-pseudo-classes.html [ Failure Pass ]
 crbug.com/591099 fast/css/invalidation-errors-2.html [ Failure ]
 crbug.com/591099 fast/css/invalidation-errors-3.html [ Failure ]
 crbug.com/591099 fast/css/invalidation-errors.html [ Failure ]
@@ -2767,26 +2560,21 @@
 crbug.com/591099 fast/css/invalidation/valid-invalid-pseudo.html [ Failure ]
 crbug.com/591099 fast/css/large-numbers.html [ Timeout ]
 crbug.com/591099 fast/css/last-child-pseudo-class.html [ Failure ]
-crbug.com/591099 fast/css/last-child-style-sharing.html [ Failure Pass ]
 crbug.com/591099 fast/css/last-of-type-pseudo-class.html [ Failure ]
 crbug.com/591099 fast/css/layerZOrderCrash.html [ Failure ]
 crbug.com/591099 fast/css/line-height-determined-by-primary-font.html [ Failure ]
-crbug.com/591099 fast/css/line-height-negative.html [ Failure Pass ]
 crbug.com/591099 fast/css/line-height-overflow.html [ Failure ]
 crbug.com/591099 fast/css/line-height.html [ Failure ]
 crbug.com/591099 fast/css/line-thickness-underline-strikethrough-overline.html [ Failure ]
 crbug.com/591099 fast/css/link-outside-head.html [ Failure ]
 crbug.com/591099 fast/css/list-outline.html [ Failure ]
-crbug.com/591099 fast/css/margin-bottom-form-element-quirk.html [ Failure Pass ]
 crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/marquee-in-template.html [ Failure ]
-crbug.com/591099 fast/css/max-height-none.html [ Failure Pass ]
 crbug.com/591099 fast/css/namespaces/006.xml [ Failure ]
 crbug.com/591099 fast/css/negative-leading.html [ Failure ]
 crbug.com/591099 fast/css/negative-nth-child.html [ Failure ]
 crbug.com/591099 fast/css/negative-text-indent-in-inline-block.html [ Failure ]
 crbug.com/591099 fast/css/nested-floating-relative-position-percentages.html [ Failure ]
-crbug.com/591099 fast/css/nested-rounded-corners.html [ Failure Pass ]
 crbug.com/591099 fast/css/non-empty-span.html [ Failure ]
 crbug.com/591099 fast/css/non-standard-checkbox-size.html [ Failure ]
 crbug.com/591099 fast/css/nth-child-dynamic.html [ Failure ]
@@ -2794,18 +2582,12 @@
 crbug.com/591099 fast/css/only-child-pseudo-class.html [ Failure ]
 crbug.com/591099 fast/css/only-of-type-pseudo-class.html [ Failure ]
 crbug.com/591099 fast/css/outline-auto-empty-rects.html [ Failure ]
-crbug.com/591099 fast/css/outline-auto-location.html [ Failure Pass ]
 crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ]
 crbug.com/714962 fast/css/outline-small-visual-overflow.html [ Failure ]
 crbug.com/591099 fast/css/overflow-rtl-border-after.html [ Failure ]
-crbug.com/591099 fast/css/pendingStylesheetFontSize.html [ Failure Pass ]
 crbug.com/591099 fast/css/percent-min-width-img-src-change.html [ Failure ]
-crbug.com/591099 fast/css/percent-top-relative-container-height-unspecified.html [ Failure Pass ]
-crbug.com/591099 fast/css/percent-top-value-with-relative-position.html [ Failure Pass ]
 crbug.com/591099 fast/css/percent-width-img-src-change.html [ Failure ]
-crbug.com/591099 fast/css/percentage-height-auto-sized-body-quirks.html [ Failure Pass ]
 crbug.com/591099 fast/css/percentage-non-integer.html [ Failure ]
-crbug.com/591099 fast/css/position-negative-top-margin.html [ Failure Pass ]
 crbug.com/591099 fast/css/positioned-overflow-scroll.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-element-line-break.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-first-line-border-width.html [ Failure ]
@@ -2822,8 +2604,6 @@
 crbug.com/591099 fast/css/relative-positioned-block-with-inline-parent-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/rem-calc-dynamic-scaling.html [ Failure ]
 crbug.com/591099 fast/css/rem-dynamic-scaling.html [ Failure ]
-crbug.com/591099 fast/css/rem-units-on-root.html [ Failure Pass ]
-crbug.com/591099 fast/css/replaced-element-implicit-size.html [ Failure Pass ]
 crbug.com/591099 fast/css/resize-corner-tracking-touch.html [ Failure ]
 crbug.com/591099 fast/css/resize-corner-tracking-transformed-iframe.html [ Failure ]
 crbug.com/591099 fast/css/resize-corner-tracking-transformed.html [ Failure ]
@@ -2838,7 +2618,6 @@
 crbug.com/591099 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ]
 crbug.com/591099 fast/css/style-outside-head.html [ Failure ]
 crbug.com/591099 fast/css/style-parsed-outside-head.html [ Failure ]
-crbug.com/591099 fast/css/table-text-align-quirk.html [ Failure Pass ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-bidi.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-multiple-shadows.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-shadow-alpha.html [ Failure ]
@@ -2852,13 +2631,9 @@
 crbug.com/591099 fast/css/text-overflow-ellipsis.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-input.html [ Failure ]
 crbug.com/591099 fast/css/text-rendering.html [ Failure ]
-crbug.com/591099 fast/css/text-security.html [ Failure Pass ]
 crbug.com/591099 fast/css/textCapitalizeEdgeCases.html [ Failure ]
 crbug.com/591099 fast/css/transform-inline-style-remove.html [ Failure ]
-crbug.com/591099 fast/css/transformed-mask.html [ Failure Pass ]
-crbug.com/591099 fast/css/transition-color-unspecified.html [ Failure Pass ]
 crbug.com/591099 fast/css/universal-hover-quirk.html [ Failure ]
-crbug.com/591099 fast/css/unknown-pseudo-element-matching.html [ Failure Pass ]
 crbug.com/714962 fast/css/user-drag-none.html [ Pass ]
 crbug.com/591099 fast/css/vertical-align-lengths.html [ Failure ]
 crbug.com/591099 fast/css/vertical-text-overflow-ellipsis-text-align-center.html [ Failure ]
@@ -2867,7 +2642,6 @@
 crbug.com/591099 fast/css/vertical-text-overflow-ellipsis-text-align-right.html [ Failure ]
 crbug.com/591099 fast/css/visibility-hit-test.html [ Failure ]
 crbug.com/591099 fast/css/word-space-extra.html [ Failure ]
-crbug.com/591099 fast/css/zoom-font-size.html [ Failure Pass ]
 crbug.com/714962 fast/css3-text/css3-text-decoration/repaint/repaint-text-decoration-style.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-skip-ink.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow.html [ Failure ]
@@ -2889,7 +2663,6 @@
 crbug.com/714962 fast/deprecated-flexbox/009.html [ Failure ]
 crbug.com/714962 fast/deprecated-flexbox/023.html [ Failure ]
 crbug.com/714962 fast/deprecated-flexbox/024.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/flex-hang.html [ Failure Pass ]
 crbug.com/591099 fast/deprecated-flexbox/flexing-overflow-scroll-item.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/intrinsic-min-width-applies-with-fixed-width.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/relpos-flex-item-with-percent-height-abspos-child.html [ Failure ]
@@ -2913,7 +2686,6 @@
 crbug.com/714962 fast/dom/Element/client-rect-list-argument.html [ Failure ]
 crbug.com/591099 fast/dom/Element/getBoundingClientRect.html [ Failure ]
 crbug.com/714962 fast/dom/Element/getClientRects.html [ Failure ]
-crbug.com/591099 fast/dom/Element/null-offset-parent.html [ Failure Pass ]
 crbug.com/591099 fast/dom/Element/offsetLeft-offsetTop-body-quirk.html [ Failure ]
 crbug.com/591099 fast/dom/Element/offsetLeft-offsetTop-html.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLAnchorElement/anchor-in-noscroll-iframe.html [ Failure ]
@@ -2921,25 +2693,18 @@
 crbug.com/591099 fast/dom/HTMLAreaElement/area-download.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/activeElement.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLDocument/document-write-variadic.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLDocument/frameless-location-bugzilla10837.html [ Failure Pass ]
 crbug.com/591099 fast/dom/HTMLElement/bdo.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLImageElement/image-alt-text.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLLinkElement/pending-stylesheet-count.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-boundary-values.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-element-repaint-on-update-value.html [ Failure Pass ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-element.html [ Failure Pass ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-optimums.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-percent-size.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles-changing-pseudo.html [ Failure Pass ]
 crbug.com/591099 fast/dom/HTMLMeterElement/meter-styles.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLObjectElement/vspace-hspace-as-number.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLProgressElement/indeterminate-progress-001.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLProgressElement/progress-bar-value-pseudo-element.html [ Failure ]
 crbug.com/591099 fast/dom/HTMLProgressElement/progress-element.html [ Failure ]
-crbug.com/591099 fast/dom/HTMLStyleElement/insert-parser-generated.html [ Failure Pass ]
-crbug.com/714962 fast/dom/MutationObserver/observe-element-resize.html [ Failure Pass ]
 crbug.com/714962 fast/dom/Range/collapsed-range-bounding-client-rect.html [ Failure ]
-crbug.com/591099 fast/dom/Range/create-contextual-fragment.html [ Failure Pass ]
 crbug.com/714962 fast/dom/Range/get-bounding-client-rect-empty-and-non-empty.html [ Timeout ]
 crbug.com/714962 fast/dom/Range/getBoundingClientRect-getClientRects-relative-to-viewport.html [ Failure ]
 crbug.com/714962 fast/dom/Range/getBoundingClientRect-linebreak-character.html [ Failure ]
@@ -2947,30 +2712,18 @@
 crbug.com/714962 fast/dom/Range/getClientRects-character.html [ Failure ]
 crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-expand.html [ Failure ]
-crbug.com/591099 fast/dom/Window/btoa-pnglet.html [ Failure Pass ]
-crbug.com/591099 fast/dom/Window/open-existing-pop-up-blocking.html [ Failure Pass ]
 crbug.com/591099 fast/dom/Window/property-access-on-cached-window-after-frame-navigated.html [ Timeout ]
 crbug.com/591099 fast/dom/Window/window-collection-length-no-crash.html [ Failure ]
 crbug.com/591099 fast/dom/Window/window-lookup-precedence.html [ Timeout ]
 crbug.com/591099 fast/dom/Window/window-open-pending-url.html [ Failure ]
 crbug.com/591099 fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ]
-crbug.com/714962 fast/dom/Window/window-postmessage-clone-frames.html [ Failure Pass Timeout ]
 crbug.com/714962 fast/dom/Window/window-postmessage-clone.html [ Failure Pass ]
 crbug.com/591099 fast/dom/Window/window-resize-contents.html [ Failure ]
-crbug.com/591099 fast/dom/anchor-text.html [ Failure Pass ]
 crbug.com/591099 fast/dom/anchor-toString.html [ Failure ]
 crbug.com/714962 fast/dom/anchor-without-content.html [ Failure ]
-crbug.com/591099 fast/dom/attr_dead_doc.html [ Failure Pass ]
-crbug.com/591099 fast/dom/blur-contenteditable.html [ Failure Pass ]
 crbug.com/591099 fast/dom/children-nodes.html [ Failure ]
-crbug.com/591099 fast/dom/clone-contents-0-end-offset.html [ Failure Pass ]
 crbug.com/591099 fast/dom/clone-node-dynamic-style.html [ Failure ]
 crbug.com/591099 fast/dom/collection-idempotence.html [ Failure ]
-crbug.com/591099 fast/dom/comment-not-documentElement.html [ Failure Pass ]
-crbug.com/591099 fast/dom/createDocumentType.html [ Failure Pass ]
-crbug.com/591099 fast/dom/css-cached-import-rule.html [ Failure Pass ]
-crbug.com/591099 fast/dom/css-insert-import-rule-twice.html [ Failure Pass ]
-crbug.com/591099 fast/dom/css-insert-import-rule.html [ Failure Pass ]
 crbug.com/591099 fast/dom/defaultView-on-detached-document.html [ Failure ]
 crbug.com/591099 fast/dom/document_write_params.html [ Failure ]
 crbug.com/591099 fast/dom/dom-add-optionelement.html [ Failure ]
@@ -2984,7 +2737,6 @@
 crbug.com/591099 fast/dom/empty-hash-and-search.html [ Failure ]
 crbug.com/591099 fast/dom/focus-contenteditable.html [ Failure ]
 crbug.com/591099 fast/dom/fragment-activation-focuses-target.html [ Failure ]
-crbug.com/591099 fast/dom/importNodeHTML.html [ Failure Pass ]
 crbug.com/714962 fast/dom/inert/inert-inlines.html [ Failure ]
 crbug.com/714962 fast/dom/inert/inert-node-is-uneditable.html [ Failure ]
 crbug.com/591099 fast/dom/inner-text-first-letter.html [ Failure ]
@@ -2999,59 +2751,32 @@
 crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-inline-image.html [ Failure ]
 crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ]
 crbug.com/714962 fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ]
-crbug.com/714962 fast/dom/nodesFromRect/nodesFromRect-svg.html [ Failure Pass ]
 crbug.com/591099 fast/dom/offset-parent-positioned-and-inline.html [ Failure ]
 crbug.com/591099 fast/dom/open-and-close-by-DOM.html [ Failure ]
-crbug.com/591099 fast/dom/outerText.html [ Failure Pass ]
-crbug.com/591099 fast/dom/row-inner-text.html [ Failure Pass ]
 crbug.com/591099 fast/dom/rtl-scroll-to-leftmost-and-resize.html [ Failure ]
-crbug.com/714962 fast/dom/search-shadow-host-crash.html [ Failure Pass ]
 crbug.com/591099 fast/dom/set-outer-html.html [ Failure ]
 crbug.com/714962 fast/dom/shadow/content-pseudo-element-dynamic-attribute-change.html [ Failure ]
-crbug.com/714962 fast/dom/shadow/cppevent-input-in-shadow.html [ Failure Pass ]
-crbug.com/714962 fast/dom/shadow/drop-event-for-input-in-shadow.html [ Failure Pass ]
 crbug.com/714962 fast/dom/shadow/import-rule-in-shadow-tree-needs-document-style-recalc.html [ Failure ]
-crbug.com/714962 fast/dom/shadow/input-color-in-content.html [ Pass Timeout ]
 crbug.com/591099 fast/dom/shadow/querySelector-for-useragent-shadowroot.html [ Failure ]
 crbug.com/714962 fast/dom/shadow/scrollbar.html [ Crash ]
 crbug.com/591099 fast/dom/shadow/selections-in-shadow.html [ Timeout ]
-crbug.com/714962 fast/dom/shadow/shadow-boundary-crossing.html [ Failure Pass ]
 crbug.com/591099 fast/dom/shadow/shadow-dom-event-dispatching-details-summary.html [ Pass ]
-crbug.com/591099 fast/dom/shadow/shadow-dom-event-dispatching-svg-in-shadow-subtree.html [ Failure Pass ]
-crbug.com/714962 fast/dom/shadow/touch-event.html [ Failure Pass ]
-crbug.com/714962 fast/dom/shadow/wheel-event-on-input-in-shadow-dom.html [ Failure Pass ]
 crbug.com/591099 fast/dom/wrapper-classes.html [ Timeout ]
 crbug.com/591099 fast/dom/wrapper-context.html [ Failure ]
-crbug.com/591099 fast/dynamic/001.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/002.html [ Failure ]
-crbug.com/591099 fast/dynamic/004.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/005.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/006.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/007.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/009.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/010.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/011.html [ Failure ]
 crbug.com/591099 fast/dynamic/012.html [ Failure ]
 crbug.com/591099 fast/dynamic/013.html [ Failure ]
-crbug.com/591099 fast/dynamic/014.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/015.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/anonymous-block-layer-lost.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/containing-block-change.html [ Failure ]
 crbug.com/591099 fast/dynamic/continuation-detach-crash.html [ Crash ]
-crbug.com/591099 fast/dynamic/dirty-float-in-clean-line.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/first-letter-after-list-marker.html [ Failure ]
-crbug.com/591099 fast/dynamic/first-letter-display-change.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/float-at-line-break.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/float-from-empty-line.html [ Failure ]
 crbug.com/591099 fast/dynamic/float-in-trailing-whitespace-after-last-line-break-2.html [ Failure ]
-crbug.com/591099 fast/dynamic/float-no-longer-overhanging.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/float-withdrawal-2.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/float-withdrawal.html [ Failure ]
 crbug.com/591099 fast/dynamic/floating-to-positioned-2.html [ Failure ]
 crbug.com/591099 fast/dynamic/floating-to-positioned.html [ Failure ]
 crbug.com/714962 fast/dynamic/focus-clear-resolver-crash.html [ Failure ]
 crbug.com/591099 fast/dynamic/genContentDestroyChildren.html [ Failure ]
-crbug.com/591099 fast/dynamic/hover-sibling-reattach.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/insert-before-table-part-in-continuation.html [ Failure ]
 crbug.com/591099 fast/dynamic/insertAdjacentElement.html [ Failure ]
 crbug.com/591099 fast/dynamic/insertAdjacentHTML.html [ Failure ]
@@ -3061,19 +2786,13 @@
 crbug.com/591099 fast/dynamic/noninlinebadness.html [ Failure ]
 crbug.com/591099 fast/dynamic/outerHTML-doc.html [ Failure ]
 crbug.com/591099 fast/dynamic/outerHTML-img.html [ Failure ]
-crbug.com/591099 fast/dynamic/positioned-movement-with-positioned-children.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/selection-highlight-adjust.html [ Failure ]
 crbug.com/591099 fast/dynamic/static-to-relative-with-absolute-child.html [ Crash ]
 crbug.com/591099 fast/dynamic/staticY-marking-parents-regression.html [ Failure ]
-crbug.com/591099 fast/dynamic/subtree-no-common-root-static-y.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/subtree-parent-static-y.html [ Failure Pass ]
-crbug.com/591099 fast/dynamic/subtree-table-cell-height.html [ Failure Pass ]
 crbug.com/591099 fast/dynamic/text-combine.html [ Failure ]
 crbug.com/591099 fast/dynamic/unicode-bidi.html [ Failure ]
 crbug.com/591099 fast/dynamic/view-overflow.html [ Failure ]
 crbug.com/591099 fast/dynamic/window-resize-scrollbars-test.html [ Failure ]
-crbug.com/591099 fast/dynamic/window-scrollbars-test.html [ Failure Pass ]
-crbug.com/591099 fast/encoding/invalid-UTF-8.html [ Failure Pass ]
 crbug.com/591099 fast/encoding/latin1-unencodables.html [ Failure ]
 crbug.com/591099 fast/encoding/namespace-tolerance.html [ Failure ]
 crbug.com/591099 fast/encoding/utf-16-big-endian.html [ Failure ]
@@ -3091,32 +2810,14 @@
 crbug.com/591099 fast/events/change-frame-focus.html [ Failure ]
 crbug.com/591099 fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Failure ]
 crbug.com/591099 fast/events/check-defocus-event-order-when-triggered-by-tab.html [ Failure ]
-crbug.com/714962 fast/events/click-checkbox-blur-refocus-window.html [ Failure Pass ]
-crbug.com/714962 fast/events/click-checkbox-refocus-window.html [ Failure Pass ]
-crbug.com/714962 fast/events/click-over-descendant-elements.html [ Failure Pass ]
 crbug.com/591099 fast/events/click-range-slider.html [ Failure Pass ]
-crbug.com/714962 fast/events/click-with-large-negative-text-indent.html [ Failure Pass ]
-crbug.com/714962 fast/events/content-changed-during-drop.html [ Failure Pass ]
-crbug.com/591099 fast/events/context-no-deselect.html [ Failure Pass ]
-crbug.com/714962 fast/events/contextmenu-follows-focus.html [ Failure Pass ]
-crbug.com/714962 fast/events/contextmenu-scrolled-page-with-frame.html [ Failure Pass ]
 crbug.com/714962 fast/events/document-elementFromPoint.html [ Failure ]
 crbug.com/591099 fast/events/dom-character-data-modified-textarea-crash.html [ Crash ]
-crbug.com/591099 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Failure Pass ]
-crbug.com/714962 fast/events/drag-and-drop-subframe-dataTransfer.html [ Pass Timeout ]
-crbug.com/714962 fast/events/drag-dataTransferItemList-file-handling.html [ Failure Pass ]
 crbug.com/714962 fast/events/drag-in-frames.html [ Failure ]
 crbug.com/591099 fast/events/drag-selects-image.html [ Failure ]
-crbug.com/591099 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ]
-crbug.com/591099 fast/events/event-listener-on-link.html [ Failure Pass ]
 crbug.com/714962 fast/events/event-on-culled_inline.html [ Failure ]
-crbug.com/591099 fast/events/event-trusted.html [ Failure Pass ]
-crbug.com/714962 fast/events/file-input-hidden-in-ondrop.html [ Pass Timeout ]
 crbug.com/591099 fast/events/frame-programmatic-focus.html [ Failure ]
-crbug.com/591099 fast/events/frame-scroll-fake-mouse-move.html [ Failure Pass ]
 crbug.com/591099 fast/events/frame-tab-focus.html [ Failure ]
-crbug.com/714962 fast/events/input-element-display-none-in-dragleave-crash.html [ Failure Pass ]
-crbug.com/714962 fast/events/inputevents/inputevent-drag-drop.html [ Failure Pass ]
 crbug.com/591099 fast/events/js-keyboard-event-creation.html [ Failure ]
 crbug.com/591099 fast/events/key-events-in-input-text.html [ Failure ]
 crbug.com/591099 fast/events/keyboardevent-getModifierState.html [ Timeout ]
@@ -3129,39 +2830,27 @@
 crbug.com/714962 fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
 crbug.com/591099 fast/events/mouse-drag-from-frame-to-other-frame.html [ Failure ]
 crbug.com/591099 fast/events/mouse-event-buttons-attribute.html [ Timeout ]
-crbug.com/714962 fast/events/mouse-events-on-textarea-resize.html [ Failure Pass ]
 crbug.com/591099 fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/591099 fast/events/mouseevent-getModifierState.html [ Timeout ]
 crbug.com/591099 fast/events/mousemove-after-drag-over-scrollbar.html [ Failure ]
-crbug.com/591099 fast/events/mousemove-to-resizer-changes-cursor.html [ Failure Pass ]
 crbug.com/591099 fast/events/mouseover-mouseout.html [ Failure ]
 crbug.com/591099 fast/events/no-blur-on-enter-button.html [ Failure ]
 crbug.com/714962 fast/events/offsetX-offsetY.html [ Failure ]
 crbug.com/591099 fast/events/onblur-remove.html [ Failure ]
 crbug.com/714962 fast/events/onchange-click-hang.html [ Failure Pass ]
-crbug.com/591099 fast/events/onchange-range-slider.html [ Failure Pass ]
 crbug.com/591099 fast/events/onclick-list-marker.html [ Failure ]
-crbug.com/591099 fast/events/onload-re-entry.html [ Failure Pass ]
 crbug.com/591099 fast/events/onload-webkit-before-webcore.html [ Failure ]
 crbug.com/591099 fast/events/pointer-events-2.html [ Failure ]
-crbug.com/714962 fast/events/pointerevents/mouse-node-remove.html [ Failure Pass ]
-crbug.com/714962 fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure Pass ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ]
-crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture.html [ Failure Pass Timeout ]
+crbug.com/591099 fast/events/pointerevents/mouse-pointer-capture.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/mouse-pointer-event-properties.html [ Timeout ]
-crbug.com/591099 fast/events/pointerevents/mouse-pointer-preventdefault.html [ Failure Timeout ]
+crbug.com/591099 fast/events/pointerevents/mouse-pointer-preventdefault.html [ Timeout ]
 crbug.com/714962 fast/events/pointerevents/mouse-pointer-transition-events.html [ Failure Pass ]
-crbug.com/714962 fast/events/pointerevents/mouse-pointer-updown-events.html [ Failure Pass ]
-crbug.com/591099 fast/events/pointerevents/multi-pointer-preventdefault.html [ Failure Pass Timeout ]
-crbug.com/714962 fast/events/pointerevents/pointer-use-count.html [ Failure Pass ]
+crbug.com/591099 fast/events/pointerevents/multi-pointer-preventdefault.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/touch-capture-in-iframe.html [ Timeout ]
 crbug.com/591099 fast/events/pointerevents/touch-capture.html [ Timeout ]
-crbug.com/714962 fast/events/pointerevents/touch-pointer-events.html [ Failure Pass ]
-crbug.com/714962 fast/events/pointerevents/touch-pointercancel.html [ Failure Pass ]
+crbug.com/714962 fast/events/pointerevents/touch-pointer-events.html [ Pass ]
 crbug.com/591099 fast/events/popup-allowed-from-gesture-initiated-event.html [ Failure ]
-crbug.com/591099 fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Pass Timeout ]
-crbug.com/591099 fast/events/popup-blocked-from-different-frames.html [ Failure Pass ]
-crbug.com/591099 fast/events/right-click-focus.html [ Failure Pass ]
 crbug.com/591099 fast/events/scale-and-scroll-iframe-window.html [ Pass ]
 crbug.com/591099 fast/events/scroll-after-click-on-tab-index.html [ Failure ]
 crbug.com/591099 fast/events/scroll-div-with-prevent-default-in-subframe.html [ Failure ]
@@ -3177,15 +2866,8 @@
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/591099 fast/events/touch/gesture/gesture-click-on-inline-continations.html [ Failure ]
-crbug.com/591099 fast/events/touch/gesture/gesture-tap-frame-move.html [ Failure Pass ]
-crbug.com/714962 fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Failure Pass ]
-crbug.com/714962 fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure Pass ]
-crbug.com/591099 fast/events/touch/touch-action-range-input-csp.html [ Pass Timeout ]
 crbug.com/591099 fast/events/touch/touch-action-range-input.html [ Pass Timeout ]
-crbug.com/714962 fast/events/touch/touch-before-pressing-spin-button.html [ Failure Pass ]
 crbug.com/591099 fast/events/touch/touch-fractional-coordinates.html [ Failure ]
-crbug.com/591099 fast/events/touch/touch-slider-no-js-touch-listener.html [ Failure Pass ]
-crbug.com/591099 fast/events/touch/touch-slider.html [ Failure Pass ]
 crbug.com/591099 fast/events/wheel/latched-scroll-node-removed.html [ Pass ]
 crbug.com/591099 fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
 crbug.com/591099 fast/events/wheel/mouse-wheel-scroll-latching.html [ Pass ]
@@ -3196,11 +2878,8 @@
 crbug.com/591099 fast/events/window-events-capture.html [ Failure ]
 crbug.com/591099 fast/events/window-onerror-11.html [ Failure ]
 crbug.com/591099 fast/events/window-onerror-12.html [ Failure ]
-crbug.com/591099 fast/files/apply-blob-url-to-img.html [ Pass Timeout ]
-crbug.com/591099 fast/files/file-in-input-display.html [ Pass Timeout ]
 crbug.com/591099 fast/forms/001.html [ Failure ]
 crbug.com/591099 fast/forms/007.html [ Failure ]
-crbug.com/714962 fast/forms/25153.html [ Failure Pass ]
 crbug.com/591099 fast/forms/ValidityState-customError.html [ Failure ]
 crbug.com/591099 fast/forms/access-key.html [ Failure ]
 crbug.com/591099 fast/forms/activate-and-disabled-elements.html [ Failure ]
@@ -3208,11 +2887,8 @@
 crbug.com/591099 fast/forms/autofocus-focus-only-once.html [ Failure ]
 crbug.com/591099 fast/forms/basic-buttons.html [ Failure ]
 crbug.com/591099 fast/forms/basic-inputs.html [ Failure ]
-crbug.com/591099 fast/forms/blankbuttons.html [ Failure Pass ]
-crbug.com/591099 fast/forms/button-positioned.html [ Failure Pass ]
 crbug.com/591099 fast/forms/button-sizes.html [ Failure ]
 crbug.com/591099 fast/forms/button-state-restore.html [ Failure ]
-crbug.com/591099 fast/forms/button-style-color.html [ Failure Pass ]
 crbug.com/591099 fast/forms/button-table-styles.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-align.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-baseline-and-collapsing.html [ Failure ]
@@ -3220,56 +2896,24 @@
 crbug.com/591099 fast/forms/button/button-in-forms-collection.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-inner-block-reuse.html [ Failure ]
 crbug.com/591099 fast/forms/button/button-type-change.html [ Failure ]
-crbug.com/591099 fast/forms/button/button-white-space.html [ Failure Pass ]
 crbug.com/591099 fast/forms/calendar-picker/calendar-picker-key-operations.html [ Pass Timeout ]
 crbug.com/714962 fast/forms/calendar-picker/calendar-picker-mouse-operations.html [ Failure ]
-crbug.com/714962 fast/forms/calendar-picker/calendar-picker-type-change-onclick.html [ Pass Timeout ]
 crbug.com/591099 fast/forms/calendar-picker/month-picker-key-operations.html [ Timeout ]
 crbug.com/714962 fast/forms/calendar-picker/month-picker-mouse-operations.html [ Failure ]
 crbug.com/591099 fast/forms/calendar-picker/week-picker-key-operations.html [ Timeout ]
 crbug.com/714962 fast/forms/calendar-picker/week-picker-mouse-operations.html [ Failure ]
 crbug.com/591099 fast/forms/caret-rtl.html [ Failure ]
 crbug.com/591099 fast/forms/checkbox/checkbox-appearance-basic.html [ Failure ]
-crbug.com/714962 fast/forms/checkbox/checkbox-focus-by-mouse.html [ Failure Pass ]
-crbug.com/714962 fast/forms/color/input-color-chooser-shown-readonly.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/color/input-color-chooser-shown.html [ Pass Timeout ]
 crbug.com/591099 fast/forms/color/input-color-onchange-event.html [ Failure ]
 crbug.com/591099 fast/forms/control-clip-overflow.html [ Failure ]
 crbug.com/591099 fast/forms/control-clip.html [ Failure ]
 crbug.com/591099 fast/forms/control-restrict-line-height.html [ Failure ]
 crbug.com/591099 fast/forms/datalist/input-appearance-range-with-datalist-zoomed.html [ Failure ]
-crbug.com/591099 fast/forms/datalist/range-snap-to-datalist.html [ Failure Pass ]
-crbug.com/714962 fast/forms/date-multiple-fields/date-clearbutton-preventdefault-mousecapture-status.html [ Failure Pass ]
-crbug.com/714962 fast/forms/date-multiple-fields/date-multiple-fields-clearbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/date-multiple-fields/date-multiple-fields-mouse-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/date-multiple-fields/date-multiple-fields-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/date-multiple-fields/date-multiple-fields-wheel-event.html [ Failure Pass ]
-crbug.com/714962 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-clearbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-mouse-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-wheel-event.html [ Failure Pass ]
-crbug.com/714962 fast/forms/disabled-mousedown-event.html [ Failure Pass ]
-crbug.com/591099 fast/forms/encoding-test.html [ Failure Pass ]
 crbug.com/591099 fast/forms/fieldset/fieldset-crash.html [ Failure ]
 crbug.com/591099 fast/forms/fieldset/fieldset-with-float.html [ Failure ]
-crbug.com/591099 fast/forms/fieldset/float-before-fieldset.html [ Failure Pass ]
-crbug.com/714962 fast/forms/file/file-cloneNode.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/file/file-input-change-event.html [ Failure Pass ]
-crbug.com/591099 fast/forms/file/file-input-click.html [ Failure Pass ]
 crbug.com/591099 fast/forms/file/file-input-direction.html [ Failure ]
 crbug.com/591099 fast/forms/file/file-input-disabled.html [ Failure ]
-crbug.com/714962 fast/forms/file/file-input-empty-validation.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/file/file-input-reset-validation.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/file/file-input-reset.html [ Failure Pass ]
-crbug.com/591099 fast/forms/file/file-input-webkitdirectory-click.html [ Failure Pass ]
-crbug.com/591099 fast/forms/file/file-user-selection.html [ Pass Timeout ]
 crbug.com/591099 fast/forms/file/get-file-upload.html [ Failure ]
-crbug.com/714962 fast/forms/file/input-file-entries.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/file/input-file-value-with-zoom.html [ Failure Pass ]
-crbug.com/714962 fast/forms/file/input-file-value.html [ Failure Pass ]
-crbug.com/714962 fast/forms/file/input-file-write-files.html [ Failure Pass ]
-crbug.com/714962 fast/forms/file/recover-file-input-in-unposted-form.html [ Pass Timeout ]
-crbug.com/714962 fast/forms/file/selected-files-from-history-state.html [ Failure Pass ]
 crbug.com/591099 fast/forms/floating-textfield-relayout.html [ Failure ]
 crbug.com/591099 fast/forms/focus-selection-input.html [ Failure ]
 crbug.com/591099 fast/forms/focus-selection-textarea.html [ Failure ]
@@ -3280,8 +2924,6 @@
 crbug.com/591099 fast/forms/form-radio-node-list.html [ Failure ]
 crbug.com/591099 fast/forms/form-submission-cancelable.html [ Failure ]
 crbug.com/591099 fast/forms/formmove.html [ Failure ]
-crbug.com/591099 fast/forms/formmove2.html [ Failure Pass ]
-crbug.com/591099 fast/forms/formmove3.html [ Failure Pass ]
 crbug.com/591099 fast/forms/hide-validation-message-crash.html [ Failure ]
 crbug.com/591099 fast/forms/huge-mac-input-clamped-width.html [ Failure ]
 crbug.com/591099 fast/forms/image-border.html [ Failure ]
@@ -3289,7 +2931,6 @@
 crbug.com/591099 fast/forms/image/005.html [ Failure ]
 crbug.com/591099 fast/forms/image/image-error-event-modifies-type-crash.html [ Failure ]
 crbug.com/591099 fast/forms/image/input-align-image.html [ Failure ]
-crbug.com/591099 fast/forms/indeterminate.html [ Failure Pass ]
 crbug.com/591099 fast/forms/input-align.html [ Failure ]
 crbug.com/591099 fast/forms/input-appearance-height.html [ Failure ]
 crbug.com/591099 fast/forms/input-button-sizes.html [ Failure ]
@@ -3297,44 +2938,24 @@
 crbug.com/591099 fast/forms/input-common/reset-checked.html [ Failure ]
 crbug.com/591099 fast/forms/input-first-letter.html [ Failure ]
 crbug.com/591099 fast/forms/input-multiple.html [ Failure ]
-crbug.com/591099 fast/forms/input-readonly-select.html [ Failure Pass ]
-crbug.com/714962 fast/forms/input-step-as-double.html [ Failure Pass ]
 crbug.com/591099 fast/forms/input-type-text-min-width.html [ Failure ]
 crbug.com/591099 fast/forms/input-value.html [ Failure ]
 crbug.com/714962 fast/forms/label/continous-click-on-label.html [ Failure ]
-crbug.com/714962 fast/forms/label/hover-on-moving-mouse-checkbox-to-parent-label.html [ Failure Pass ]
 crbug.com/591099 fast/forms/label/label-click.html [ Pass ]
 crbug.com/591099 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ]
 crbug.com/591099 fast/forms/label/selection-disabled-label.html [ Failure ]
 crbug.com/591099 fast/forms/long-text-in-input.html [ Crash Failure ]
 crbug.com/591099 fast/forms/mailto/advanced-get.html [ Failure ]
 crbug.com/591099 fast/forms/mailto/advanced-put.html [ Failure ]
-crbug.com/591099 fast/forms/minWidthPercent.html [ Failure Pass ]
-crbug.com/714962 fast/forms/month-multiple-fields/month-multiple-fields-clearbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/month-multiple-fields/month-multiple-fields-mouse-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/month-multiple-fields/month-multiple-fields-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/month-multiple-fields/month-multiple-fields-wheel-event.html [ Failure Pass ]
 crbug.com/591099 fast/forms/negativeLineHeight.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-appearance-datalist.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-appearance-spinbutton-disabled-readonly.html [ Failure ]
 crbug.com/591099 fast/forms/number/number-appearance-spinbutton-layer.html [ Failure ]
-crbug.com/714962 fast/forms/number/number-change-type-on-focus.html [ Failure Pass ]
-crbug.com/714962 fast/forms/number/number-spinbutton-capturing.html [ Failure Pass ]
-crbug.com/714962 fast/forms/number/number-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/number/number-spinbutton-changeevent-trigger.html [ Failure Pass ]
-crbug.com/591099 fast/forms/number/number-spinbutton-click-in-iframe.html [ Failure Pass ]
-crbug.com/714962 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Failure Pass ]
 crbug.com/591099 fast/forms/number/number-spinbutton-in-multi-column.html [ Failure ]
-crbug.com/714962 fast/forms/number/number-spinbutton-state.html [ Failure Pass ]
-crbug.com/591099 fast/forms/number/number-wheel-event.html [ Failure Pass ]
 crbug.com/591099 fast/forms/onselect-textfield.html [ Failure ]
 crbug.com/591099 fast/forms/output/htmloutputelement.html [ Failure ]
-crbug.com/591099 fast/forms/preserveFormDuringResidualStyle.html [ Failure Pass ]
 crbug.com/591099 fast/forms/radio-checkbox-restore-indeterminate.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-appearance-basic.html [ Failure ]
-crbug.com/714962 fast/forms/radio/radio-arrow-with-modifier-keys.html [ Failure Pass ]
-crbug.com/714962 fast/forms/radio/radio-focus-by-mouse.html [ Failure Pass ]
-crbug.com/714962 fast/forms/radio/radio-group-arrow-cycle-edge.html [ Failure Pass ]
 crbug.com/591099 fast/forms/radio/radio-indeterminate-pseudo-class.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-nested-labels.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio-remove-form-attr.html [ Failure ]
@@ -3342,46 +2963,19 @@
 crbug.com/591099 fast/forms/radio/radio_checked.html [ Failure ]
 crbug.com/591099 fast/forms/radio/radio_checked_name.html [ Failure ]
 crbug.com/591099 fast/forms/range/range-appearance-basic.html [ Failure ]
-crbug.com/591099 fast/forms/range/range-disabled-on-input.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-drag-when-toggled-disabled.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-drag.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-focus-by-mouse.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-hit-test-with-padding.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-slow-drag-to-edge.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-thumb-height-percentage.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-type-change-crash.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-update-styled.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/range-update.html [ Failure Pass ]
 crbug.com/591099 fast/forms/range/slider-delete-while-dragging-thumb.html [ Failure ]
-crbug.com/591099 fast/forms/range/slider-hit-testing.html [ Failure Pass ]
 crbug.com/591099 fast/forms/range/slider-in-multi-column.html [ Failure ]
-crbug.com/591099 fast/forms/range/slider-mouse-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/slider-onchange-event.html [ Failure Pass ]
 crbug.com/591099 fast/forms/range/slider-padding.html [ Failure ]
-crbug.com/591099 fast/forms/range/slider-thumb-stylability.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/slider-zoomed.html [ Failure Pass ]
-crbug.com/591099 fast/forms/range/thumbslider-no-parent-slider.html [ Failure Pass ]
 crbug.com/591099 fast/forms/reportValidity-valid.html [ Failure ]
 crbug.com/591099 fast/forms/reset-autofilled.html [ Failure ]
 crbug.com/591099 fast/forms/restore-selection-after-layout.html [ Failure ]
-crbug.com/714962 fast/forms/search/disabled-search-input.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-appearance-basic.html [ Failure ]
-crbug.com/714962 fast/forms/search/search-cancel-button-events.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-cancel-button-mouseup.html [ Failure ]
-crbug.com/591099 fast/forms/search/search-cancel-button-style-sharing.html [ Failure Pass ]
-crbug.com/714962 fast/forms/search/search-click-in-placeholder.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-delete-while-cancel-button-clicked.html [ Failure ]
-crbug.com/714962 fast/forms/search/search-disabled-readonly.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-display-none-cancel-button.html [ Failure ]
-crbug.com/714962 fast/forms/search/search-hidden-cancel-button.html [ Failure Pass ]
-crbug.com/714962 fast/forms/search/search-hide-cancel-on-cancel.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-rtl.html [ Failure ]
-crbug.com/714962 fast/forms/search/search-transformed.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/search-vertical-alignment.html [ Failure ]
-crbug.com/714962 fast/forms/search/search-zoomed.html [ Failure Pass ]
 crbug.com/591099 fast/forms/search/searchfield-heights.html [ Failure ]
-crbug.com/591099 fast/forms/select/003.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/004.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/HTMLOptionElement_label01.html [ Failure ]
 crbug.com/591099 fast/forms/select/HTMLOptionElement_label02.html [ Failure ]
 crbug.com/591099 fast/forms/select/HTMLOptionElement_label03.html [ Failure ]
@@ -3396,25 +2990,15 @@
 crbug.com/591099 fast/forms/select/hidden-listbox.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-appearance-basic.html [ Failure ]
 crbug.com/591099 fast/forms/select/listbox-bidi-align.html [ Failure ]
-crbug.com/591099 fast/forms/select/listbox-clip.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/listbox-drag-in-non-multiple.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/listbox-in-multi-column.html [ Failure ]
-crbug.com/591099 fast/forms/select/listbox-onchange.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/listbox-selection-2.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/listbox-selection.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/listbox-tap-input-change-event.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/listbox-tap.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/listbox-width-change.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-appearance-basic.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-appearance-rtl.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-clip.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-deselect-update.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-narrow-width.html [ Failure ]
-crbug.com/591099 fast/forms/select/menulist-no-overflow.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/menulist-no-renderer-onmousedown.html [ Failure ]
 crbug.com/591099 fast/forms/select/menulist-restrict-line-height.html [ Failure ]
-crbug.com/591099 fast/forms/select/menulist-separator-painting.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/menulist-style-color.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/menulist-width-change.html [ Failure ]
 crbug.com/591099 fast/forms/select/optgroup-clicking.html [ Failure ]
 crbug.com/591099 fast/forms/select/optgroup-disabled.html [ Failure ]
@@ -3424,7 +3008,6 @@
 crbug.com/591099 fast/forms/select/option-text-clip.html [ Failure ]
 crbug.com/591099 fast/forms/select/popup-closes-on-blur.html [ Failure ]
 crbug.com/591099 fast/forms/select/popup-with-display-none-optgroup.html [ Failure ]
-crbug.com/714962 fast/forms/select/remove-element-from-within-focus-handler-crash.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/select-align.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-baseline.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-block-background.html [ Failure ]
@@ -3432,18 +3015,11 @@
 crbug.com/591099 fast/forms/select/select-change-popup-to-listbox.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-clientheight-with-multiple-attr.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-disabled.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-empty-list.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/select-empty-option-height.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/select-generated-content.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-initial-position.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-list-box-with-height.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/select-live-pseudo-selectors.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/select-multiple-elements-with-mouse-drag-with-options-less-than-size.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-overflow-scroll-inherited.html [ Failure Pass ]
-crbug.com/591099 fast/forms/select/select-overflow-scroll.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/select-popup-pagekeys.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-script-onchange.html [ Failure ]
-crbug.com/591099 fast/forms/select/select-selected.html [ Failure Pass ]
 crbug.com/591099 fast/forms/select/select-size-invalid.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-style.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-visual-hebrew.html [ Failure ]
@@ -3451,9 +3027,7 @@
 crbug.com/591099 fast/forms/selection-direction.html [ Timeout ]
 crbug.com/591099 fast/forms/selection-functions.html [ Failure ]
 crbug.com/591099 fast/forms/selection-start-end-readonly.html [ Failure ]
-crbug.com/714962 fast/forms/setrangetext-within-events.html [ Failure Pass ]
 crbug.com/591099 fast/forms/slow-click.html [ Failure ]
-crbug.com/591099 fast/forms/stuff-on-my-optgroup.html [ Failure Pass ]
 crbug.com/591099 fast/forms/submit-add-remove-element.html [ Failure ]
 crbug.com/591099 fast/forms/submit-onFocus-invalidForm.html [ Failure ]
 crbug.com/591099 fast/forms/submit/submit-appearance-basic.html [ Failure ]
@@ -3475,7 +3049,6 @@
 crbug.com/714962 fast/forms/suggestion-picker/week-suggestion-picker-appearance.html [ Failure ]
 crbug.com/591099 fast/forms/tabbing-input-iframe.html [ Failure ]
 crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Timeout ]
-crbug.com/591099 fast/forms/text-style-color.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-appearance-bkcolor.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-default-bkcolor.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-disabled.html [ Failure ]
@@ -3483,45 +3056,24 @@
 crbug.com/591099 fast/forms/text/input-appearance-preventDefault.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-readonly.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-appearance-selection.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-appearance-visibility.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-appearance-width.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-baseline.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-changing-value.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-disabled-color.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-double-click-selection-gap-bug.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-element-attach-crash.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-field-text-truncated.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-hit-test-border.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-no-renderer.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-placeholder-visibility-1.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-placeholder-visibility-3.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-readonly-autoscroll.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-readonly-dimmed.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-readonly-empty.html [ Failure Pass ]
-crbug.com/714962 fast/forms/text/input-readonly-focus.html [ Failure Pass ]
-crbug.com/714962 fast/forms/text/input-select-on-click.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-spaces.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-table.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-text-click-inside.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/input-text-click-outside.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-text-double-click.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-text-drag-down.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-text-option-delete.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-text-self-emptying-click.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-text-word-wrap.html [ Failure Pass ]
-crbug.com/591099 fast/forms/text/input-width.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/text-appearance-basic.html [ Failure ]
 crbug.com/591099 fast/forms/text/text-appearance-datalist.html [ Failure ]
 crbug.com/591099 fast/forms/text/text-reset.html [ Failure ]
-crbug.com/714962 fast/forms/text/textfield-inside-anchor.html [ Failure Pass ]
 crbug.com/591099 fast/forms/text/textfield-outline.html [ Failure ]
-crbug.com/591099 fast/forms/text/textfield-overflow.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/basic-textareas.html [ Failure ]
-crbug.com/591099 fast/forms/textarea/drag-into-textarea.html [ Failure Pass ]
-crbug.com/714962 fast/forms/textarea/drag-out-of-textarea.html [ Failure Pass ]
-crbug.com/591099 fast/forms/textarea/linebox-overflow-in-textarea-padding.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/onselect-textarea.html [ Failure ]
-crbug.com/591099 fast/forms/textarea/placeholder-appearance-textarea.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/reset-textarea.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textAreaLineHeight.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-align.html [ Failure ]
@@ -3529,66 +3081,29 @@
 crbug.com/591099 fast/forms/textarea/textarea-metrics.html [ Timeout ]
 crbug.com/591099 fast/forms/textarea/textarea-newline.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-no-scroll-on-blur.html [ Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-1.html [ Failure Pass ]
-crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-2.html [ Failure Pass ]
-crbug.com/714962 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Failure Pass ]
+crbug.com/714962 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Pass ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Failure Pass ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Failure Pass ]
 crbug.com/714962 fast/forms/textarea/textarea-resize-below-min-size.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Failure Pass ]
-crbug.com/591099 fast/forms/textarea/textarea-scroll-height.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/textarea-scrollbar.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scrolled-focus-ring.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scrolled-mask.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scrolled-type.html [ Failure ]
-crbug.com/591099 fast/forms/textarea/textarea-setinnerhtml.html [ Failure Pass ]
 crbug.com/591099 fast/forms/textarea/textarea-width.html [ Failure ]
-crbug.com/714962 fast/forms/time-multiple-fields/time-multiple-fields-clearbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/time-multiple-fields/time-multiple-fields-mouse-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-spinbutton-click-in-iframe.html [ Failure Pass ]
 crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Timeout ]
-crbug.com/591099 fast/forms/time-multiple-fields/time-multiple-fields-wheel-event.html [ Failure Pass ]
-crbug.com/714962 fast/forms/type-after-focus-rule-shrink-width.html [ Pass Timeout ]
 crbug.com/591099 fast/forms/visual-hebrew-text-field.html [ Failure ]
-crbug.com/714962 fast/forms/week-multiple-fields/week-multiple-fields-clearbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/week-multiple-fields/week-multiple-fields-mouse-events.html [ Failure Pass ]
-crbug.com/714962 fast/forms/week-multiple-fields/week-multiple-fields-spinbutton-change-and-input-events.html [ Failure Pass ]
-crbug.com/591099 fast/forms/week-multiple-fields/week-multiple-fields-wheel-event.html [ Failure Pass ]
 crbug.com/591099 fast/frames/001.html [ Failure ]
-crbug.com/591099 fast/frames/002.html [ Failure Pass ]
-crbug.com/591099 fast/frames/calculate-fixed.html [ Failure Pass ]
-crbug.com/591099 fast/frames/calculate-order.html [ Failure Pass ]
-crbug.com/591099 fast/frames/calculate-percentage.html [ Failure Pass ]
-crbug.com/591099 fast/frames/calculate-relative.html [ Failure Pass ]
-crbug.com/591099 fast/frames/calculate-round.html [ Failure Pass ]
 crbug.com/591099 fast/frames/content-opacity-1.html [ Failure Pass ]
 crbug.com/591099 fast/frames/content-opacity-2.html [ Failure Pass ]
 crbug.com/591099 fast/frames/detach-frame-during-focus.html [ Failure ]
-crbug.com/591099 fast/frames/empty-cols-attribute.html [ Failure Pass ]
-crbug.com/591099 fast/frames/empty-frame-src.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-length-fractional.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-navigation.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-rotation-hit.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling-3d.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling-centered.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling-hit.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling-rotate.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling-skew.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frame-set-scaling.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frameElement-frame.html [ Failure Pass ]
-crbug.com/591099 fast/frames/frameElement-iframe.html [ Failure Pass ]
 crbug.com/591099 fast/frames/frameset-frameborder-boolean-values.html [ Failure ]
 crbug.com/591099 fast/frames/frameset-frameborder-inheritance.html [ Failure ]
 crbug.com/591099 fast/frames/frameset-style-recalc.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-onload-remove-self-no-crash.html [ Failure ]
-crbug.com/591099 fast/frames/iframe-option-crash.xhtml [ Failure Pass ]
 crbug.com/591099 fast/frames/iframe-scaling-with-scroll.html [ Failure ]
 crbug.com/591099 fast/frames/iframe-scrolling-attribute.html [ Failure ]
-crbug.com/591099 fast/frames/iframe-text-contents.html [ Failure Pass ]
 crbug.com/591099 fast/frames/iframe-with-frameborder.html [ Failure ]
-crbug.com/591099 fast/frames/invalid.html [ Failure Pass ]
-crbug.com/591099 fast/frames/no-frame-borders.html [ Failure Pass ]
 crbug.com/591099 fast/frames/onlyCommentInIFrame.html [ Failure ]
 crbug.com/591099 fast/frames/sandboxed-iframe-forms-dynamic.html [ Failure ]
 crbug.com/591099 fast/frames/sandboxed-iframe-forms.html [ Failure ]
@@ -3601,14 +3116,9 @@
 crbug.com/591099 fast/frames/unique-name-all-subframes-have-same-name.html [ Failure ]
 crbug.com/591099 fast/frames/unique-name-ancestor-concatenation-conflict.html [ Failure ]
 crbug.com/591099 fast/frames/unique-name-remove-add-child.html [ Failure ]
-crbug.com/591099 fast/frames/valid.html [ Failure Pass ]
-crbug.com/591099 fast/gradients/background-clipped.html [ Failure Pass ]
-crbug.com/591099 fast/gradients/border-image-gradient-sides-and-corners.html [ Failure Pass ]
-crbug.com/591099 fast/gradients/border-image-gradient.html [ Failure Pass ]
 crbug.com/591099 fast/gradients/conic-gradient-out-of-range.html [ Failure ]
 crbug.com/591099 fast/gradients/conic-gradient-positioning.html [ Failure ]
 crbug.com/591099 fast/gradients/conic-gradient.html [ Failure ]
-crbug.com/591099 fast/gradients/crash-on-zero-radius.html [ Failure Pass ]
 crbug.com/591099 fast/gradients/css3-color-stops.html [ Failure ]
 crbug.com/591099 fast/gradients/css3-degenerate-color-stops.html [ Failure ]
 crbug.com/591099 fast/gradients/css3-linear-angle-gradients.html [ Failure ]
@@ -3631,7 +3141,6 @@
 crbug.com/591099 fast/gradients/unprefixed-radial-gradients2.html [ Failure ]
 crbug.com/591099 fast/gradients/unprefixed-repeating-linear-gradient.html [ Failure ]
 crbug.com/591099 fast/gradients/unprefixed-repeating-radial-gradients.html [ Failure ]
-crbug.com/591099 fast/harness/hello_again.html [ Failure Pass ]
 crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ]
@@ -3645,7 +3154,6 @@
 crbug.com/714962 fast/history/visited-link-hover-text-fill-color.html [ Failure ]
 crbug.com/714962 fast/history/visited-link-hover-text-stroke-color.html [ Failure ]
 crbug.com/714962 fast/history/visited-link-hover.html [ Failure ]
-crbug.com/591099 fast/html/draggable-controls.html [ Failure Pass ]
 crbug.com/714962 fast/html/layout-runs-and-floats-crash.html [ Failure ]
 crbug.com/591099 fast/html/select-dropdown-consistent-background-color.html [ Failure ]
 crbug.com/591099 fast/inline-block/baseline-vertical.html [ Failure ]
@@ -3673,43 +3181,24 @@
 crbug.com/591099 fast/innerHTML/004.xhtml [ Failure ]
 crbug.com/591099 fast/innerHTML/005.html [ Failure ]
 crbug.com/591099 fast/innerHTML/innerHTML-custom-tag.html [ Failure ]
-crbug.com/591099 fast/invalid/001.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/002.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/003.html [ Failure ]
-crbug.com/591099 fast/invalid/004.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/005.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/006.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/007.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/008.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/009.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/010.html [ Failure ]
-crbug.com/591099 fast/invalid/011.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/012.html [ Failure ]
-crbug.com/591099 fast/invalid/013.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/014.html [ Failure ]
-crbug.com/591099 fast/invalid/015.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/016.html [ Failure ]
-crbug.com/591099 fast/invalid/017.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/018.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/019.html [ Failure ]
 crbug.com/591099 fast/invalid/021.html [ Failure ]
 crbug.com/591099 fast/invalid/missing-address-end-tag.html [ Failure ]
 crbug.com/591099 fast/invalid/missing-dl-end-tag.html [ Failure ]
 crbug.com/591099 fast/invalid/missing-dt-end-tag.html [ Failure ]
 crbug.com/591099 fast/invalid/missing-font-end-tag.html [ Failure ]
-crbug.com/591099 fast/invalid/nestedh3s.html [ Failure Pass ]
-crbug.com/591099 fast/invalid/table-inside-stray-table-content.html [ Failure Pass ]
 crbug.com/591099 fast/invalid/table-residual-style-crash.html [ Failure ]
 crbug.com/591099 fast/invalid/td-inside-object.html [ Failure ]
 crbug.com/591099 fast/js/dfg-arguments-alias-activation.html [ Timeout ]
 crbug.com/591099 fast/js/dfg-byte-array-put.html [ Timeout ]
 crbug.com/591099 fast/js/document-all-triggers-masquerades-watchpoint.html [ Timeout ]
-crbug.com/591099 fast/js/missing-style-end-tag-js.html [ Failure Pass ]
-crbug.com/591099 fast/js/missing-title-end-tag-js.html [ Failure Pass ]
 crbug.com/591099 fast/js/same-origin-subframe-about-blank.html [ Failure ]
 crbug.com/591099 fast/js/toString-and-valueOf-override.html [ Failure ]
-crbug.com/591099 fast/layers/add-layer-with-nested-stacking.html [ Failure Pass ]
-crbug.com/591099 fast/layers/layer-content-visibility-change.html [ Failure Pass ]
 crbug.com/591099 fast/layers/layer-visibility-sublayer.html [ Failure ]
 crbug.com/591099 fast/layers/layer-visibility.html [ Failure ]
 crbug.com/591099 fast/layers/nested-layers-1.html [ Failure ]
@@ -3717,12 +3206,8 @@
 crbug.com/591099 fast/layers/overflow-hidden-rounded-corners-occlusion.html [ Failure ]
 crbug.com/591099 fast/layers/overflow-scroll-auto-switch.html [ Failure ]
 crbug.com/591099 fast/layers/perspective-inline-no-display.html [ Failure ]
-crbug.com/591099 fast/layers/remove-layer-with-nested-stacking.html [ Failure Pass ]
 crbug.com/591099 fast/layers/remove-only-this-layer-update.html [ Failure ]
 crbug.com/591099 fast/layers/scroll-rect-to-visible.html [ Failure ]
-crbug.com/591099 fast/layers/self-painting-outline.html [ Failure Pass ]
-crbug.com/591099 fast/layers/zindex-inherit.html [ Failure Pass ]
-crbug.com/591099 fast/layers/zindex-ridonkulous.html [ Failure Pass ]
 crbug.com/591099 fast/lists/001-vertical.html [ Failure ]
 crbug.com/591099 fast/lists/001.html [ Failure ]
 crbug.com/591099 fast/lists/002-vertical.html [ Failure ]
@@ -3764,7 +3249,6 @@
 crbug.com/591099 fast/loader/local-iFrame-source-from-local.html [ Failure ]
 crbug.com/591099 fast/loader/local-image-from-local.html [ Failure ]
 crbug.com/591099 fast/loader/opaque-base-url.html [ Failure ]
-crbug.com/591099 fast/loader/text-document-wrapping.html [ Failure Pass ]
 crbug.com/591099 fast/masking/clip-path-selection.html [ Failure ]
 crbug.com/591099 fast/media/mq-color-gamut-picture.html [ Failure ]
 crbug.com/591099 fast/media/mq-display-mode-fullscreen.html [ Crash ]
@@ -3943,7 +3427,6 @@
 crbug.com/591099 fast/multicol/mixed-positioning-stacking-order.html [ Crash Failure ]
 crbug.com/714962 fast/multicol/multicol-becomes-abspos-crash.html [ Failure ]
 crbug.com/714962 fast/multicol/multicol-becomes-paged-fixed-height.html [ Failure ]
-crbug.com/812457 fast/multicol/multicol-on-root-element-quirks.html [ Failure Timeout ]
 crbug.com/591099 fast/multicol/multicol-svg.html [ Failure ]
 crbug.com/591099 fast/multicol/multicol-with-child-renderLayer-for-input.html [ Failure ]
 crbug.com/591099 fast/multicol/nested-3-multicols-fixed-height.html [ Failure ]
@@ -4181,7 +3664,6 @@
 crbug.com/591099 fast/overflow/infiniteRecursion.html [ Failure ]
 crbug.com/714962 fast/overflow/line-clamp-hides-trailing-anchor.html [ Failure ]
 crbug.com/591099 fast/overflow/line-clamp.html [ Failure ]
-crbug.com/591099 fast/overflow/onscroll-layer-self-destruct.html [ Pass Timeout ]
 crbug.com/591099 fast/overflow/overflow-rtl-vertical.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl.html [ Failure ]
 crbug.com/714962 fast/overflow/overflow-text-hit-testing.html [ Failure ]
@@ -4191,8 +3673,6 @@
 crbug.com/591099 fast/overflow/recompute-overflow-of-layout-root-container.html [ Failure ]
 crbug.com/591099 fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Failure ]
 crbug.com/714962 fast/overflow/scroll-div-hide-show.html [ Failure ]
-crbug.com/591099 fast/overflow/scrollbar-restored-and-then-locked.html [ Failure Pass ]
-crbug.com/591099 fast/overflow/scrollbar-restored.html [ Failure Pass ]
 crbug.com/591099 fast/pagination/auto-height-with-break.html [ Failure ]
 crbug.com/591099 fast/pagination/auto-height.html [ Crash ]
 crbug.com/591099 fast/pagination/break-in-paged-overflow.html [ Failure ]
@@ -4228,35 +3708,20 @@
 crbug.com/591099 fast/pagination/viewport-y-vertical-rl-rtl.html [ Failure ]
 crbug.com/591099 fast/parser/001.html [ Failure ]
 crbug.com/591099 fast/parser/assertion-empty-attribute.html [ Failure ]
-crbug.com/591099 fast/parser/bad-xml-slash.html [ Failure Pass ]
 crbug.com/591099 fast/parser/broken-comments-vs-parsing-mode.html [ Failure ]
-crbug.com/591099 fast/parser/document-write-option.html [ Failure Pass ]
 crbug.com/591099 fast/parser/entities-in-html.html [ Failure ]
 crbug.com/591099 fast/parser/entities-in-xhtml.xhtml [ Failure ]
-crbug.com/591099 fast/parser/entity-comment-in-style.html [ Failure Pass ]
-crbug.com/591099 fast/parser/entity-comment-in-textarea.html [ Failure Pass ]
 crbug.com/591099 fast/parser/fonts.html [ Failure ]
 crbug.com/591099 fast/parser/nested-fragment-parser-crash.html [ Crash ]
 crbug.com/591099 fast/parser/nofoo-tags-inside-paragraph.html [ Failure ]
 crbug.com/591099 fast/parser/noscript-with-javascript-disabled.html [ Failure ]
-crbug.com/591099 fast/parser/open-comment-in-style.html [ Failure Pass ]
-crbug.com/591099 fast/parser/open-comment-in-textarea.html [ Failure Pass ]
 crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt-quirks.html [ Failure ]
 crbug.com/591099 fast/parser/stray-end-tags-with-attributes-002-alt.html [ Failure ]
-crbug.com/591099 fast/parser/tabs-in-scripts.html [ Failure Pass ]
-crbug.com/591099 fast/parser/title-error-test.html [ Failure Pass ]
 crbug.com/591099 fast/parser/xhtml-alternate-entities.xml [ Failure ]
-crbug.com/591099 fast/reflections/abs-position-in-reflection.html [ Failure Pass ]
 crbug.com/591099 fast/reflections/inline-crash.html [ Failure ]
 crbug.com/591099 fast/reflections/opacity-reflection-transform.html [ Failure ]
 crbug.com/591099 fast/reflections/reflection-direction.html [ Failure ]
-crbug.com/591099 fast/reflections/reflection-masks-opacity.html [ Failure Pass ]
-crbug.com/591099 fast/reflections/reflection-masks.html [ Failure Pass ]
-crbug.com/591099 fast/reflections/reflection-nesting.html [ Failure Pass ]
 crbug.com/591099 fast/reflections/reflection-overflow-hidden.html [ Failure ]
-crbug.com/591099 fast/reflections/reflection-with-zoom.html [ Failure Pass ]
-crbug.com/591099 fast/reflections/table-cell.html [ Failure Pass ]
-crbug.com/591099 fast/reflections/transparent-reflected-sublayers.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width-quirks.html [ Failure ]
 crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width.html [ Failure ]
 crbug.com/591099 fast/replaced/absolute-position-percentage-height.html [ Failure ]
@@ -4301,7 +3766,6 @@
 crbug.com/591099 fast/ruby/ruby-block-style-not-updated-with-before-after-content.html [ Crash ]
 crbug.com/591099 fast/ruby/ruby-block-style-not-updated.html [ Crash ]
 crbug.com/591099 fast/ruby/ruby-empty-rt.html [ Failure ]
-crbug.com/591099 fast/ruby/ruby-inline-style-not-updated.html [ Failure Pass ]
 crbug.com/591099 fast/ruby/ruby-inline-table.html [ Failure ]
 crbug.com/591099 fast/ruby/ruby-length.html [ Failure ]
 crbug.com/591099 fast/ruby/ruby-run-break.html [ Failure ]
@@ -4322,10 +3786,8 @@
 crbug.com/591099 fast/ruby/rubyDOM-remove-text1.html [ Failure ]
 crbug.com/591099 fast/ruby/rubyDOM-remove-text2.html [ Failure ]
 crbug.com/591099 fast/ruby/select-ruby.html [ Failure ]
-crbug.com/714962 fast/scroll-behavior/scroll-over-resizer.html [ Failure Pass ]
 crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Failure ]
 crbug.com/591099 fast/scrolling/fractional-scroll-offset-fixed-position-non-composited.html [ Crash ]
-crbug.com/591099 fast/scrolling/horizontal-overflow-quirks.html [ Failure Pass ]
 crbug.com/591099 fast/scrolling/jquery-rtl-scroll-type.html [ Failure ]
 crbug.com/591099 fast/scrolling/scroll-into-view-collapsed-div.html [ Failure ]
 crbug.com/591099 fast/scrolling/scroll-max-value.html [ Failure ]
@@ -4360,13 +3822,10 @@
 crbug.com/591099 fast/selectors/168a.html [ Failure ]
 crbug.com/591099 fast/selectors/169.html [ Failure ]
 crbug.com/591099 fast/selectors/169a.html [ Failure ]
-crbug.com/591099 fast/selectors/lang-vs-xml-lang.html [ Failure Pass ]
-crbug.com/591099 fast/selectors/nondeterministic-combinators.html [ Failure Pass ]
 crbug.com/591099 fast/selectors/placeholder-shown-sibling-style-update.html [ Failure ]
 crbug.com/591099 fast/selectors/placeholder-shown-style-update.html [ Failure ]
 crbug.com/591099 fast/selectors/unqualified-hover-quirks.html [ Failure ]
 crbug.com/591099 fast/selectors/unqualified-hover-strict.html [ Failure ]
-crbug.com/591099 fast/selectors/visited-descendant.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius-001.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius-002.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-boxes-001.html [ Failure ]
@@ -4458,7 +3917,6 @@
 crbug.com/591099 fast/spatial-navigation/snav-use-visual-viewport.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/computedstylemargin.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ]
-crbug.com/591099 fast/sub-pixel/should-not-repaint-subpixel-composited-layer.html [ Failure Pass ]
 crbug.com/714962 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/table-cells-with-padding-do-not-wrap.html [ Failure ]
@@ -4551,7 +4009,7 @@
 crbug.com/591099 fast/table/percent-height-content-in-fixed-height-border-box-sized-cell-with-collapsed-border.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-content-in-fixed-height-content-box-sized-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ]
-crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ]
+crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ]
 crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ]
 crbug.com/591099 fast/table/row-in-inline-block.html [ Failure ]
@@ -4682,6 +4140,7 @@
 crbug.com/714962 fast/text/international/rtl-selection-rect-with-fallback.html [ Failure ]
 crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ]
 crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ]
+crbug.com/591099 fast/text/international/unicode-bidi-plaintext-line-wrap.html [ Failure ]
 crbug.com/591099 fast/text/justify-ideograph-complex.html [ Failure ]
 crbug.com/591099 fast/text/justify-ideograph-simple.html [ Failure ]
 crbug.com/591099 fast/text/justify-ideograph-vertical.html [ Failure ]
@@ -4713,7 +4172,6 @@
 crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks-align-left.html [ Failure ]
 crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks-align-right.html [ Failure ]
 crbug.com/591099 fast/text/place-rtl-ellipsis-in-inline-blocks.html [ Failure ]
-crbug.com/714962 fast/text/recalc-position-of-linebox-after-deleting-ellipsis.html [ Failure Pass ]
 crbug.com/591099 fast/text/regional-indicator-symobls.html [ Failure ]
 crbug.com/714962 fast/text/remove-zero-length-run.html [ Failure ]
 crbug.com/714962 fast/text/selection/atsui-rtl-override-selection.html [ Failure ]
@@ -4743,11 +4201,7 @@
 crbug.com/591099 fast/text/whitespace/pre-wrap-spaces-after-newline.html [ Failure ]
 crbug.com/591099 fast/text/zero-width-characters-complex-script.html [ Failure ]
 crbug.com/591099 fast/text/zero-width-characters.html [ Failure ]
-crbug.com/591099 fast/tokenizer/001.html [ Failure Pass ]
-crbug.com/591099 fast/tokenizer/003.html [ Failure Pass ]
 crbug.com/591099 fast/tokenizer/ignore-tags-in-iframe.html [ Failure ]
-crbug.com/591099 fast/tokenizer/missing-style-end-tag-1.html [ Failure Pass ]
-crbug.com/591099 fast/tokenizer/missing-style-end-tag-2.html [ Failure Pass ]
 crbug.com/591099 fast/tokenizer/nested-cached-scripts-and-stylesheet.html [ Failure ]
 crbug.com/591099 fast/tokenizer/script_extra_close.html [ Failure ]
 crbug.com/591099 fast/webgl/webgl-composite-modes-tabswitching.html [ Pass Timeout ]
@@ -4797,7 +4251,6 @@
 crbug.com/591099 fast/xmlhttprequest/xmlhttprequest-recursive-sync-event.html [ Failure ]
 crbug.com/591099 fast/xpath/id-simple.html [ Failure ]
 crbug.com/591099 fast/xpath/xpath-detached-nodes.html [ Failure ]
-crbug.com/591099 fast/xsl/document-function.xml [ Failure Pass ]
 crbug.com/591099 fast/xsl/mozilla-tests.xml [ Failure ]
 crbug.com/591099 fast/xsl/xslt-enc-cyr.xml [ Failure ]
 crbug.com/591099 fast/xsl/xslt-enc.xml [ Failure ]
@@ -4805,11 +4258,9 @@
 crbug.com/591099 fast/xsl/xslt-enc16to16.xml [ Failure ]
 crbug.com/591099 fast/xsl/xslt-entity.xml [ Failure ]
 crbug.com/591099 fast/xsl/xslt-extra-content-at-end.xml [ Failure ]
-crbug.com/591099 fast/xsl/xslt-import-depth.xml [ Failure Pass ]
 crbug.com/591099 fast/xsl/xslt-import-enc16.xml [ Failure ]
 crbug.com/591099 fast/xsl/xslt-in-subframe.html [ Failure ]
 crbug.com/591099 fast/xsl/xslt-relative-path.xml [ Failure ]
-crbug.com/591099 fast/xsl/xslt_unicode.xml [ Failure Pass ]
 crbug.com/591099 fonts/monospace.html [ Failure ]
 crbug.com/591099 fonts/sans-serif.html [ Failure ]
 crbug.com/591099 fonts/serif.html [ Failure ]
@@ -4920,68 +4371,10 @@
 crbug.com/591099 fullscreen/non-ancestor-iframe.html [ Crash ]
 crbug.com/591099 hittesting/border-hittest-inlineFlowBox.html [ Failure ]
 crbug.com/714962 hittesting/culled-inline.html [ Failure ]
-crbug.com/591099 hittesting/image-with-border-radius.html [ Failure Pass ]
 crbug.com/714962 hittesting/image-with-clip-path.html [ Failure ]
 crbug.com/591099 hittesting/inline-with-clip-path.html [ Failure ]
-crbug.com/591099 hittesting/inner-border-radius-hittest.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-child-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-child-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-details-child-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-details-child-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-1-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-10-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-10.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-2-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-3-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-3.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-4-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-4.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-5-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-5.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-6-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-6.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-7-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-7.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-8-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-8.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-9-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-9.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-child-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-add-summary-child-2.html [ Failure Pass ]
 crbug.com/591099 html/details_summary/details-nested-1.html [ Failure ]
 crbug.com/591099 html/details_summary/details-nested-2.html [ Failure ]
-crbug.com/591099 html/details_summary/details-no-summary1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-no-summary2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-no-summary3.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-no-summary4.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open-javascript.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open3.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open4.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open5.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-open6.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-position.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-child-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-child-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-1-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-2-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-3-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-3.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-4-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-4.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-5-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-5.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-6-and-click.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-6.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-child-1.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-remove-summary-child-2.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-replace-summary-child.html [ Failure Pass ]
-crbug.com/591099 html/details_summary/details-replace-text.html [ Failure Pass ]
 crbug.com/591099 html/details_summary/details-writing-mode-align-center.html [ Failure ]
 crbug.com/591099 html/details_summary/details-writing-mode-align-left.html [ Failure ]
 crbug.com/591099 html/details_summary/details-writing-mode-align-right.html [ Failure ]
@@ -4994,16 +4387,10 @@
 crbug.com/591099 html/dialog/modal-dialog-scroll-height.html [ Failure ]
 crbug.com/591099 html/dialog/multiple-centered-dialogs.html [ Failure ]
 crbug.com/591099 html/dialog/top-layer-containing-block.html [ Crash ]
-crbug.com/591099 html/document_metadata/head-has-text-1.html [ Failure Pass ]
-crbug.com/591099 html/document_metadata/head-has-text-2.html [ Failure Pass ]
-crbug.com/591099 html/document_metadata/head-has-text-3.html [ Failure Pass ]
 crbug.com/591099 html/document_metadata/head-has-text-4.html [ Failure ]
-crbug.com/591099 html/document_metadata/head-has-text-5.html [ Failure Pass ]
 crbug.com/591099 html/document_metadata/head-link-style-href-check.html [ Failure ]
-crbug.com/591099 html/grouping_content/listing.html [ Failure Pass ]
 crbug.com/591099 html/marquee/marquee-scroll.html [ Failure ]
 crbug.com/591099 html/marquee/marquee-scrollamount.html [ Failure ]
-crbug.com/591099 html/tabular_data/col_width_resizing_table.html [ Failure Pass ]
 crbug.com/591099 html/tabular_data/table_border_invalid.html [ Failure ]
 crbug.com/591099 html/tabular_data/table_createcaption.html [ Failure ]
 crbug.com/591099 html/tabular_data/td_colspan_rendering.html [ Failure ]
@@ -5040,17 +4427,15 @@
 crbug.com/591099 http/tests/devtools/elements/styles-4/styles-formatting.js [ Pass ]
 crbug.com/591099 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure ]
 crbug.com/714962 http/tests/devtools/jump-to-previous-editing-location.js [ Failure ]
-crbug.com/714962 http/tests/devtools/layers/layer-canvas-log.js [ Failure Pass ]
 crbug.com/591099 http/tests/devtools/network/network-datareceived.js [ Failure ]
 crbug.com/714962 http/tests/devtools/service-workers/service-workers-view.js [ Failure ]
 crbug.com/591099 http/tests/devtools/text-autosizing-override.js [ Failure ]
 crbug.com/591099 http/tests/devtools/tracing/scroll-invalidations.js [ Failure ]
 crbug.com/591099 http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Failure ]
-crbug.com/591099 http/tests/devtools/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.js [ Failure Pass ]
+crbug.com/591099 http/tests/devtools/tracing/timeline-paint/timeline-paint-with-layout-invalidations-on-deleted-node.js [ Pass ]
 crbug.com/591099 http/tests/feature-policy/fullscreen-disabled.php [ Pass ]
 crbug.com/591099 http/tests/feature-policy/payment-disabled.php [ Pass ]
 crbug.com/591099 http/tests/feature-policy/payment-enabledforall.php [ Pass ]
-crbug.com/591099 http/tests/filesystem/input-display.html [ Pass Timeout ]
 crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure ]
 crbug.com/783102 http/tests/incremental/frame-focus-before-load.html [ Timeout ]
 crbug.com/591099 http/tests/incremental/slow-utf8-text.pl [ Pass Timeout ]
@@ -5064,32 +4449,15 @@
 crbug.com/591099 http/tests/loading/simple-subframe.html [ Failure ]
 crbug.com/591099 http/tests/local/drag-over-remote-content.html [ Failure ]
 crbug.com/591099 http/tests/local/file-url-sent-as-referer.html [ Failure ]
-crbug.com/591099 http/tests/local/fileapi/file-last-modified-after-delete.html [ Failure Pass ]
-crbug.com/591099 http/tests/local/fileapi/file-last-modified.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/fileapi/select-dragged-file-input-utf-8.html [ Failure Pass ]
 crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ]
-crbug.com/591099 http/tests/local/fileapi/send-dragged-file.html [ Failure Pass ]
-crbug.com/591099 http/tests/local/fileapi/send-sliced-dragged-file.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/form-data-with-unknown-file-extension.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/send-form-data-constructed-from-form.html [ Pass Timeout ]
-crbug.com/714962 http/tests/local/formdata/send-form-data-with-empty-file-filename.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/send-form-data-with-filename.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/send-form-data-with-sliced-file.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/send-form-data.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/formdata/upload-events.html [ Failure Pass ]
-crbug.com/714962 http/tests/local/serviceworker/fetch-request-body-file.html [ Pass Timeout ]
 crbug.com/591099 http/tests/media/progress-events-generated-correctly.html [ Failure ]
 crbug.com/591099 http/tests/misc/acid2-pixel.html [ Failure ]
 crbug.com/591099 http/tests/misc/acid2.html [ Failure ]
 crbug.com/591099 http/tests/misc/acid3.html [ Crash ]
 crbug.com/591099 http/tests/misc/dns-prefetch-control.html [ Failure ]
 crbug.com/591099 http/tests/misc/empty-urls.html [ Failure ]
-crbug.com/591099 http/tests/misc/error404.pl [ Failure Pass ]
-crbug.com/591099 http/tests/misc/favicon-as-image.html [ Failure Pass ]
 crbug.com/591099 http/tests/misc/frame-access-during-load.html [ Failure ]
-crbug.com/591099 http/tests/misc/generated-content-inside-table.html [ Failure Pass ]
 crbug.com/591099 http/tests/misc/iframe404.html [ Failure ]
-crbug.com/591099 http/tests/misc/location-replace-crossdomain.html [ Failure Pass ]
 crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation-2.htm [ Failure ]
 crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ]
 crbug.com/591099 http/tests/misc/slow-loading-image-in-pattern.html [ Failure ]
@@ -5110,7 +4478,6 @@
 crbug.com/591099 http/tests/navigation/onload-navigation-iframe-2.html [ Failure ]
 crbug.com/591099 http/tests/navigation/post-goback-same-url.html [ Failure ]
 crbug.com/591099 http/tests/navigation/post-goback2.html [ Failure ]
-crbug.com/714962 http/tests/navigation/post-with-modifier.html [ Pass Timeout ]
 crbug.com/591099 http/tests/navigation/postredirect-basic.html [ Failure ]
 crbug.com/591099 http/tests/navigation/postredirect-frames.html [ Failure ]
 crbug.com/591099 http/tests/navigation/postredirect-goback1.html [ Failure ]
@@ -5148,23 +4515,15 @@
 crbug.com/591099 http/tests/security/contentSecurityPolicy/script-src-none-inline-event.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/source-list-parsing-04.html [ Failure ]
 crbug.com/591099 http/tests/security/contentSecurityPolicy/xsl-img-blocked.php [ Failure ]
-crbug.com/714962 http/tests/security/cookies/third-party-cookie-blocking-user-action.html [ Pass Timeout ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Crash Failure Pass ]
 crbug.com/591099 http/tests/security/cross-origin-indexeddb-allowed.html [ Failure ]
 crbug.com/591099 http/tests/security/cross-origin-worker-indexeddb-allowed.html [ Failure ]
-crbug.com/591099 http/tests/security/dataTransfer-set-data-file-url.html [ Failure Pass ]
 crbug.com/591099 http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame-to-data-url-sub-frame.html [ Failure ]
 crbug.com/591099 http/tests/security/feed-urls-from-remote.html [ Failure ]
 crbug.com/591099 http/tests/security/filesystem-iframe-from-remote.html [ Failure ]
-crbug.com/591099 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-two-flags.html [ Pass Timeout ]
-crbug.com/591099 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-user-gesture.html [ Pass Timeout ]
-crbug.com/591099 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html [ Pass Timeout ]
-crbug.com/591099 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html [ Pass Timeout ]
 crbug.com/591099 http/tests/security/frameNavigation/xss-ALLOWED-targeted-subframe-navigation-change.html [ Failure ]
-crbug.com/714962 http/tests/security/frameNavigation/xss-ALLOWED-top-navigation-after-postMessage.html [ Pass Timeout ]
 crbug.com/591099 http/tests/security/host-compare-case-insensitive.html [ Failure ]
-crbug.com/714962 http/tests/security/isolatedWorld/userGestureEvents.html [ Pass Timeout ]
 crbug.com/591099 http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame-to-javascript-url-sub-frame.html [ Failure ]
 crbug.com/591099 http/tests/security/listener/xss-JSTargetNode-onclick-addEventListener.html [ Failure ]
 crbug.com/591099 http/tests/security/listener/xss-JSTargetNode-onclick-shortcut.html [ Failure ]
@@ -5230,7 +4589,6 @@
 crbug.com/591099 images/23-55.html [ Failure ]
 crbug.com/591099 images/55.html [ Failure ]
 crbug.com/591099 images/alt-text-wrapping.html [ Failure ]
-crbug.com/591099 images/color-jpeg-with-color-profile.html [ Failure Pass ]
 crbug.com/714962 images/color-profile-background-clip-text.html [ Failure Crash ]
 crbug.com/591099 images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 images/color-profile-border-radius.html [ Failure ]
@@ -5248,21 +4606,7 @@
 crbug.com/591099 images/color-profile-munsell-adobe-to-srgb.html [ Failure ]
 crbug.com/591099 images/crash-bad-cast.html [ Failure ]
 crbug.com/591099 images/cross-fade-background-size.html [ Failure ]
-crbug.com/591099 images/cross-fade-blending.html [ Failure Pass ]
-crbug.com/591099 images/cross-fade-invalidation.html [ Failure Pass ]
-crbug.com/591099 images/cross-fade-overflow-position.html [ Failure Pass ]
-crbug.com/591099 images/cross-fade-simple.html [ Failure Pass ]
-crbug.com/591099 images/cross-fade-sizing.html [ Failure Pass ]
-crbug.com/591099 images/cross-fade-tiled.html [ Failure Pass ]
 crbug.com/591099 images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure ]
-crbug.com/591099 images/favicon-as-image.html [ Failure Pass ]
-crbug.com/591099 images/gif-loop-count.html [ Failure Pass ]
-crbug.com/591099 images/gif-short-app-extension-string.html [ Failure Pass ]
-crbug.com/591099 images/gray-scale-png-with-color-profile.html [ Failure Pass ]
-crbug.com/591099 images/icon-0colors.html [ Failure Pass ]
-crbug.com/591099 images/icon-decoding.html [ Failure Pass ]
-crbug.com/591099 images/image-click-scale-restore-zoomed-image.html [ Failure Pass ]
-crbug.com/591099 images/image-css3-content-data.html [ Failure Pass ]
 crbug.com/591099 images/image-hover-display-alt.html [ Failure ]
 crbug.com/591099 images/image-in-map.html [ Failure ]
 crbug.com/591099 images/image-map-anchor-children.html [ Failure ]
@@ -5270,16 +4614,11 @@
 crbug.com/591099 images/image-map-multiple.html [ Failure ]
 crbug.com/591099 images/image-map-zoom-alt-content.html [ Failure ]
 crbug.com/591099 images/image-map-zoom.html [ Failure ]
-crbug.com/591099 images/image-zoom-to-25.html [ Failure Pass ]
 crbug.com/591099 images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ]
-crbug.com/591099 images/motion-jpeg-single-frame.html [ Failure Pass ]
-crbug.com/591099 images/pdf-as-background.html [ Failure Pass ]
-crbug.com/591099 images/pdf-as-tiled-background.html [ Failure Pass ]
 crbug.com/591099 images/percent-height-image.html [ Failure ]
 crbug.com/591099 images/pixel-crack-image-background-webkit-transform-scale.html [ Failure ]
 crbug.com/591099 images/png-extra-row-crash.html [ Failure ]
 crbug.com/591099 images/png-suite/test.html [ Failure ]
-crbug.com/591099 images/png_per_row_alpha_decoding.html [ Failure Pass ]
 crbug.com/591099 images/rendering-broken-0px-images-quirk.html [ Failure ]
 crbug.com/591099 images/rendering-broken-0px-images.html [ Failure ]
 crbug.com/591099 images/rendering-broken-10px-images.html [ Failure ]
@@ -5288,7 +4627,6 @@
 crbug.com/591099 images/rendering-broken-block-flow-images.html [ Failure ]
 crbug.com/591099 images/rendering-broken-images-empty-alt.html [ Failure ]
 crbug.com/591099 images/rendering-broken-images.html [ Failure ]
-crbug.com/591099 images/webp-flip.html [ Failure Pass ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-ignoredNodes.js [ Timeout ]
 crbug.com/714962 inspector-protocol/accessibility/accessibility-ignoredNodesModal.js [ Failure ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-img-figure.js [ Timeout ]
@@ -5301,8 +4639,6 @@
 crbug.com/591099 inspector-protocol/css/css-set-style-text.js [ Timeout ]
 crbug.com/714962 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport.js [ Failure ]
 crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Timeout ]
-crbug.com/591099 inspector-protocol/emulation/device-emulation-small-dw.js [ Failure Pass ]
-crbug.com/591099 inspector-protocol/emulation/device-emulation-small.js [ Failure Pass ]
 crbug.com/591099 inspector-protocol/input/dispatchTouchEvent.js [ Pass Timeout ]
 crbug.com/714962 inspector-protocol/layers/paint-profiler.js [ Failure ]
 crbug.com/714962 inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang.js [ Failure ]
@@ -5332,129 +4668,67 @@
 crbug.com/591099 media/controls/volumechange-stopimmediatepropagation.html [ Failure Pass ]
 crbug.com/591099 media/media-document-audio-repaint.html [ Failure ]
 crbug.com/591099 media/video-aspect-ratio.html [ Failure ]
-crbug.com/591099 media/video-canvas-alpha.html [ Failure Pass ]
 crbug.com/591099 media/video-colorspace-yuv420.html [ Failure ]
 crbug.com/591099 media/video-colorspace-yuv422.html [ Failure ]
 crbug.com/591099 media/video-controls-visible-audio-only.html [ Failure ]
 crbug.com/591099 media/video-layer-crash.html [ Failure ]
 crbug.com/591099 media/video-persistence.html [ Crash ]
 crbug.com/591099 media/video-poster-scale.html [ Failure ]
-crbug.com/591099 media/video-remove-insert-repaints.html [ Failure Pass ]
 crbug.com/591099 media/video-replaces-poster.html [ Failure ]
-crbug.com/714962 media/video-src-blob.html [ Pass Timeout ]
 crbug.com/591099 media/video-transformed.html [ Failure ]
-crbug.com/591099 media/video-zoom-controls.html [ Failure Pass ]
 crbug.com/591099 media/video-zoom.html [ Failure ]
 crbug.com/591099 mhtml/data-uri-font.mht [ Failure ]
-crbug.com/591099 mhtml/image_document.mht [ Failure Pass ]
-crbug.com/591099 mhtml/invalid-bad-boundary2.mht [ Failure Pass ]
-crbug.com/591099 mhtml/malformed_mhtml_no_footer.mht [ Failure Pass ]
 crbug.com/591099 netinfo/estimate-multiple-frames.html [ Failure Pass ]
 crbug.com/591099 overflow/overflow-basic-002.html [ Pass ]
 crbug.com/591099 overflow/overflow-position-003.html [ Failure ]
 crbug.com/591099 paint/clipath/clip-path-with-background-and-box-behind.html [ Failure ]
 crbug.com/591099 paint/filters/clip-filter-overflow-clip.html [ Failure ]
-crbug.com/591099 paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure Pass ]
-crbug.com/591099 paint/frames/frameset-with-stacking-contexts.html [ Failure Pass ]
 crbug.com/591099 paint/high-contrast-mode/image-filter-all/text-on-backgrounds.html [ Failure ]
 crbug.com/714962 paint/inline/floating-inline.html [ Crash ]
 crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ]
 crbug.com/591099 paint/inline/outline-offset.html [ Failure ]
-crbug.com/591099 paint/invalidation/4774354.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/4776765.html [ Failure ]
-crbug.com/591099 paint/invalidation/background/background-currentColor-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/background/background-image-paint-invalidation-large-abspos-div.html [ Failure ]
-crbug.com/591099 paint/invalidation/background/background-image-paint-invalidation.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/background-misaligned.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/background/backgroundSizeRepaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/background/body-background-image.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/background/change-text-content-and-background-color.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/full-viewport-repaint-for-background-attachment-fixed.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/view-background-from-body-2.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/viewport-gradient-background-html-move-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/viewport-gradient-background-html-resize-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/background/viewport-gradient-background-html-resize.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/block-layout-inline-children-replaced.html [ Failure ]
 crbug.com/591099 paint/invalidation/block-no-inflow-children.html [ Failure ]
-crbug.com/591099 paint/invalidation/block-shift-repaint.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/box/border-radius-repaint-2.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/box/border-radius-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/box/border-repaint-glitch.html [ Failure ]
 crbug.com/591099 paint/invalidation/box/box-inline-resize.html [ Crash ]
 crbug.com/591099 paint/invalidation/box/box-shadow-dynamic.html [ Failure ]
-crbug.com/591099 paint/invalidation/box/box-sizing.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/box/hover-pseudo-borders.html [ Failure ]
 crbug.com/591099 paint/invalidation/box/invalidate-box-shadow-currentColor.html [ Failure ]
-crbug.com/591099 paint/invalidation/box/negative-shadow-box-shrink.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/box/padding-keeping-content-size.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/box/padding-keeping-visual-size.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/box/resize-with-border.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/bugzilla-3509.html [ Failure ]
 crbug.com/591099 paint/invalidation/bugzilla-5699.html [ Failure ]
 crbug.com/591099 paint/invalidation/bugzilla-6278.html [ Failure ]
-crbug.com/591099 paint/invalidation/bugzilla-6388.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/bugzilla-6473.html [ Failure ]
 crbug.com/591099 paint/invalidation/bugzilla-7235.html [ Crash ]
 crbug.com/591099 paint/invalidation/button-inner-no-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/canvas-resize-no-full-invalidation.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/caret-outside-block.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/caret-subpixel.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/clip/caret-ancestor-clip-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/clip/clip-path-resize.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/clip/clip-with-layout-delta.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/clipped-relative.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/control-clip.html [ Failure ]
-crbug.com/591099 paint/invalidation/clip/css-clip-change-stacking-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/clip/intermediate-layout-position-clip.html [ Failure ]
-crbug.com/591099 paint/invalidation/clip/mask-clip-change-stacking-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/clip/outline-clip-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/repaint-tile-clipped.html [ Crash ]
 crbug.com/591099 paint/invalidation/clip/replaced-clipped-positioned-not-wrong-incremental-repainting.html [ Failure ]
-crbug.com/591099 paint/invalidation/clip/subtree-root-clip-2.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/clip/subtree-root-clip-3.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/clip/subtree-root-clip.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/background-attachment-local-composited.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/background-attachment-local-equivalent.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/become-overlay-composited-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/child-of-sub-pixel-offset-composited-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/chunk-reorder.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/column-span-under-composited-column-child.html [ Crash ]
 crbug.com/714962 paint/invalidation/compositing/composited-inline-change-text-data-keep-geometry.html [ Crash ]
 crbug.com/714962 paint/invalidation/compositing/composited-non-stacking-context-not-invalidation-container.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/compositing-reason-removed.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/containing-block-added-individual.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/containing-block-added.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/containing-block-removed-individual.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/containing-block-removed.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/dont-invalidate-root-layer-when-composited-layer-becomes-visible.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/fixed-pos-with-abs-pos-child-scroll.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/fixed-scroll-in-empty-root-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/iframe-clip-removed.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/iframe-inside-squashed-layer.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/invalidate-when-leaving-squashed-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/layer-repaint-rects.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/layer-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/new-stacking-context.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/overlap-test-with-filter.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/pointer-events-composited-scrolling.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/remove-squashed-layer-plus-move.html [ Failure ]
 crbug.com/714962 paint/invalidation/compositing/repaint-via-layout-offset.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/resize-repaint.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/resize-squashing-layer-that-needs-full-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/should-invoke-deferred-compositing.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/should-not-repaint-composited-descendants-on-overflow-change.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/should-not-repaint-composited-descendants.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/squash-partial-repaint-inside-squashed-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/text-color-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/text-match-highlight.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/tricky-element-removal-crash.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/updating-scrolling-container-and-content.html [ Failure ]
-crbug.com/591099 paint/invalidation/crbug-371640-2.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/crbug-371640-3.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/crbug-371640-4.html [ Failure ]
 crbug.com/591099 paint/invalidation/crbug-371640.html [ Failure ]
 crbug.com/591099 paint/invalidation/create-layer-repaint.html [ Failure ]
@@ -5465,22 +4739,6 @@
 crbug.com/591099 paint/invalidation/css-grid-layout/grid-item-z-index-change-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/delete-into-nested-block.html [ Failure ]
 crbug.com/591099 paint/invalidation/details-open-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/empty-object-move-and-resize.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-composite-3.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-gaussianblur-xonly.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-gaussianblur-yonly.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-gaussianblur.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-lighting.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-primitive-attr-mutation.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-primitive-attr-removal.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/effect-reference-repaint-primitive-removed.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-invalidation-after-display.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-invalidation-positioned-child.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-invalidation-with-composited-container-change.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-on-html-element-with-fixed-position-child.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-repaint-accelerated-child-with-filter-child.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-repaint-accelerated-on-accelerated-filter.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/filters/filter-repaint-on-accelerated-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/flexbox/align-content-change-keeping-geometry.html [ Failure ]
 crbug.com/714962 paint/invalidation/flexbox/align-content-change-no-flex.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/align-content-change.html [ Failure ]
@@ -5506,38 +4764,17 @@
 crbug.com/591099 paint/invalidation/flexbox/repaint-rtl-column.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ]
-crbug.com/591099 paint/invalidation/float-in-new-block-with-layout-delta.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/float-move-during-layout.html [ Failure ]
-crbug.com/591099 paint/invalidation/float-new-in-block.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/checkbox-focus-by-mouse-then-keydown.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/radio-focus-by-mouse-then-keydown.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/range-focus-by-mouse-then-keydown.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/select-option-background-color.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/slider-thumb-drag-release.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/slider-thumb-float.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/forms/submit-focus-by-mouse-then-keydown.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/forms/textarea-appearance-none-resize-handle.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/forms/textarea-caret.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/forms/textarea-resize-property-change.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/forms/textarea-set-disabled.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/gradients-em-stops-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/iframe-display-block-to-display-none.html [ Failure ]
 crbug.com/591099 paint/invalidation/iframe-display-none-to-display-block.html [ Failure ]
-crbug.com/714962 paint/invalidation/image/canvas-composite-repaint-by-all-imagesource.html [ Failure ]
 crbug.com/714962 paint/invalidation/image/percent-size-image-resize-container.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-block-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-color-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/inline-reflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/insert-frame.html [ Failure ]
-crbug.com/714962 paint/invalidation/invalidate-caret-before-text-node-update.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/invalidate-descendants-when-receiving-paint-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/invalidate-invisible-element.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/invalidation-after-opacity-change-subtree.html [ Failure ]
-crbug.com/591099 paint/invalidation/invalidation-on-foreground-graphics-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/invalidation-with-zero-size-object.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/invisible-objects.html [ Failure ]
-crbug.com/591099 paint/invalidation/layer-hide-when-needs-layout.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-1.html [ Failure ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-10.html [ Failure ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-2.html [ Failure ]
@@ -5553,44 +4790,33 @@
 crbug.com/591099 paint/invalidation/list-marker.html [ Failure ]
 crbug.com/591099 paint/invalidation/make-children-non-inline.html [ Failure ]
 crbug.com/591099 paint/invalidation/mix-blend-mode-separate-stacking-context.html [ Failure ]
-crbug.com/714962 paint/invalidation/multi-layout-one-frame.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/multicol/column-rules-fixed-height.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-as-paint-container.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-nested.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-relpos-with-abspos.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/multicol/multicol-resize-with-rule.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/multicol/multicol-rule-actual-columns-change.html [ Crash ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-abspos-in-relpos.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-abspos.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-block.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-inline.html [ Failure ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-overflowing-block-rl.html [ Failure ]
-crbug.com/591099 paint/invalidation/multicol/multicol-with-relpos.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/multicol/multicol-with-text.html [ Failure ]
 crbug.com/591099 paint/invalidation/non-text-link-invalidation-optimization.html [ Failure ]
 crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/border-outline-0.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/outline/border-radius-with-outline.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/focus-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-ring-on-child-move.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-ring.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/inline-focus.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/inline-outline-repaint-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/inline-outline-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/layer-child-outline.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/layer-outline-horizontal.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/layer-outline.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/outline-add-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/outline-change-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-change-invalidation.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/outline-change-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/outline-change-vertical-rl.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/outline-child-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/outline/outline-containing-image-in-non-standard-mode.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline/outline-inset.html [ Failure ]
@@ -5598,13 +4824,6 @@
 crbug.com/591099 paint/invalidation/outline/outline-shrinking.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/align-items-overflow-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/align-self-overflow-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/overflow/clipped-overflow-visible-subtree.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/composited-overflow-with-borderbox-background.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/composited-overflow-with-local-background.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/composited-overflow-with-negative-offset-outline.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/content-into-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/erase-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/fixed-position-transparency-with-overflow.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/overflow/flexible-box-overflow-horizontal.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/flexible-box-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/float-overflow-right.html [ Crash ]
@@ -5619,39 +4838,25 @@
 crbug.com/591099 paint/invalidation/overflow/justify-self-overflow-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/line-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/negative-text-indent-with-overflow-hidden.html [ Failure ]
-crbug.com/591099 paint/invalidation/overflow/opacity-change-on-overflow-float.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/overflow/overflow-delete-line.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/overflow-hide.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/overflow-into-content.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/overflow-show.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/overflow/paged-with-overflowing-block-rl.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/repaint-resized-overflow.html [ Failure ]
-crbug.com/591099 paint/invalidation/overflow/trailing-floats-root-line-box-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/overflow/vertical-overflow-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/overflow/vertical-overflow-parent.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/vertical-overflow-same.html [ Failure ]
 crbug.com/591099 paint/invalidation/overhanging-float-detach-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/paint-caret-in-div-with-negative-indent.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/paint-invalidation-with-opacity.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries.html [ Failure ]
-crbug.com/591099 paint/invalidation/position/absolute-display-block-to-none.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/position/absolute-layer-specified-left-or-right-auto-width-moved-vertically.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/absolute-margin-change-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/absolute-position-change-containing-block.html [ Failure ]
-crbug.com/591099 paint/invalidation/position/absolute-position-moved.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/position/abspos-shift-image-incorrect-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/align-content-position-change-grid.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/block-layout-inline-children-float-positioned.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/containing-block-position-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/fixed-position-layer-moved.html [ Failure ]
-crbug.com/591099 paint/invalidation/position/fixed-scale.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/position/fixed-to-relative-position-with-absolute-child.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/inline-relative-positioned.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/intermediate-layout-position.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/justify-content-position-change-grid.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/justify-content-position-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/position/layout-state-only-positioned.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/position/layout-state-relative.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/position-change-keeping-geometry.html [ Failure ]
@@ -5659,93 +4864,43 @@
 crbug.com/591099 paint/invalidation/position/positioned-great-grandparent-change-location.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/positioned-list-offset-change-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/relative-inline-positioned-movement-repaint.html [ Crash ]
-crbug.com/591099 paint/invalidation/position/relative-margin-change-repaint.html [ Failure Pass ]
 crbug.com/714962 paint/invalidation/position/relative-positioned-movement-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/relayout-fixed-position-after-scale.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/shift-relative-positioned-container-with-image-addition.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/shift-relative-positioned-container-with-image-removal.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/static-to-positioned.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/text-in-relative-positioned-inline.html [ Crash ]
-crbug.com/591099 paint/invalidation/position/transform-absolute-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/position/transform-absolute-in-positioned-container.html [ Crash ]
-crbug.com/591099 paint/invalidation/position/transform-relative-position.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/push-block-with-first-line.html [ Failure ]
 crbug.com/591099 paint/invalidation/quotes.html [ Failure ]
-crbug.com/591099 paint/invalidation/reflection/reflection-invalidation-after-display.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/reflection/reflection-invalidation-positioned-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/reflection/reflection-redraw.html [ Failure ]
 crbug.com/591099 paint/invalidation/reflection/reflection-with-rotation.html [ Failure ]
-crbug.com/591099 paint/invalidation/reflection/scroll-absolute-layer-with-reflection.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/reflection/scroll-fixed-layer-with-reflection.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/reflection/scroll-fixed-reflected-layer.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/remove-block-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-after-layout.html [ Failure ]
 crbug.com/591099 paint/invalidation/remove-inline-layer-after-layout.html [ Crash ]
-crbug.com/591099 paint/invalidation/renderer-destruction-by-invalidateSelection-crash.html [ Failure Pass ]
 crbug.com/714962 paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ]
 crbug.com/591099 paint/invalidation/repaint-descandant-on-ancestor-layer-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/repaint-overlay/layers-overlay.html [ Failure ]
-crbug.com/591099 paint/invalidation/repaint-subrect-grid.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/requestAnimation-translation-leave-traces.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/resize-iframe-text.html [ Failure ]
 crbug.com/591099 paint/invalidation/ruby-flipped-blocks.html [ Failure ]
-crbug.com/714962 paint/invalidation/scroll/caret-invalidation-in-overflow-scroll.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/caret-with-composited-scroll.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/composited-add-resizer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/destroy-composited-scrollbar.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/destroy-overlay-scrollbar.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/destroy-scrollbar.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/fixed-after-scroll.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/fixed-and-absolute-position-scrolled.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/fixed-child-of-transformed-move-after-scroll.html [ Failure ]
-crbug.com/714962 paint/invalidation/scroll/fixed-img-src-change-after-scroll.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/fixed-scroll-simple.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/fixed-under-composited-absolute-scrolled.html [ Crash ]
-crbug.com/591099 paint/invalidation/scroll/fixed-under-composited-fixed-scrolled.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/fixed-with-border-under-composited-absolute-scrolled.html [ Crash ]
-crbug.com/591099 paint/invalidation/scroll/iframe-scroll-repaint.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/scroll/iframe-scrollbar-hover.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/inline-style-change-in-scrolled-view.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/invalidate-after-composited-scroll-of-window.html [ Failure ]
-crbug.com/714962 paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/layout-state-scrolloffset.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/layout-state-scrolloffset2.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/layout-state-scrolloffset3.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/line-in-scrolled-clipped-block.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/outline-change-in-scrollers.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/outline-change-scrollable.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/overflow-auto-in-overflow-auto-scrolled.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/overflow-hidden-in-overflow-hidden-scrolled.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/overflow-hidden-yet-scrolled-with-custom-scrollbar.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/overflow-hidden-yet-scrolled.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/overflow-scroll-body-appear.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/overflow-scroll-delete.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/overflow-scroll-in-overflow-scroll-scrolled.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/overflow-scroll-local-background-text-color-change.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/repaint-during-scroll-with-zoom.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/repaint-during-scroll.html [ Pass Timeout ]
 crbug.com/591099 paint/invalidation/scroll/resize-scrollable-div.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/resize-scrollable-iframe.html [ Failure ]
 crbug.com/591099 paint/invalidation/scroll/scroll-descendant-with-cached-cliprects.html [ Failure ]
-crbug.com/591099 paint/invalidation/scroll/scroll-fixed-layer-with-no-visible-content.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-fixed-layer-with-transformed-parent-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-in-clipped-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-in-fixed-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-in-transformed-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-stacking-context-backface-visiblity-leaves-traces.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scroll-with-transformed-parent-layer.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scrollbar-ancestor-clip-change.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scrollbar-invalidation-on-resize-with-border.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scrollbar-invalidation-on-resize.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/scroll/scrollbar-parts.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scroll/scrolled-iframe-scrollbar-change.html [ Failure ]
-crbug.com/714962 paint/invalidation/search-field-cancel.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/selection/block-selection-gap-stale-cache-2.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/selection/block-selection-gap-stale-cache.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ Failure ]
@@ -5753,7 +4908,6 @@
 crbug.com/591099 paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/japanese-rl-selection-clear.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/japanese-rl-selection-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/selection/repaint-rect-for-vertical-writing-mode-with-positioned-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/selection/selected-replaced.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-after-delete.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-after-remove.html [ Failure ]
@@ -5761,8 +4915,6 @@
 crbug.com/591099 paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/selection-clear-after-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-clear.html [ Failure ]
-crbug.com/714962 paint/invalidation/selection/selection-in-composited-scrolling-container.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/selection/selection-in-non-composited-scrolling-container.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/selection/selection-rl.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection/selection-within-composited-scroller.html [ Failure ]
 crbug.com/714962 paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Failure ]
@@ -5772,73 +4924,20 @@
 crbug.com/591099 paint/invalidation/stacking-context-lost.html [ Failure ]
 crbug.com/591099 paint/invalidation/subtree-root-skipped.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/absolute-sized-content-with-resources.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/absolute-sized-document-no-scrollbars.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/add-background-property-on-root.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/add-border-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/add-outline-property-on-root.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/animate-fill.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/animated-path-inside-transformed-html.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/append-text-node-to-tspan.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/clip-path-child-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/clip-path-href-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/clip-path-id-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/clip-path-units-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/container-repaint.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/embedded-svg-size-changes-no-layout-triggers.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/ems-display-none.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/exs-display-none.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-remove-target.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-target-attribute-change-with-use-indirection.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-target-inline-style-change.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-target-reappend-to-document.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-target-remove-from-document.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/feImage-target-style-change.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/filter-child-repaint.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/filter-refresh.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/hairline-stroke-squarecap.svg [ Failure Pass ]
 crbug.com/714962 paint/invalidation/svg/hit-test-with-br.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/image-with-clip-path.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/inner-svg-change-viewBox-contract.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/inner-svg-change-viewBox.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/inner-svg-change-viewPort-relative.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/invalidate-on-child-layout.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-clipPath-and-object-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-clipPath-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-gradient-and-object-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-gradient-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-marker-and-object-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-mask-and-object-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-mask-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-pattern-and-object-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-late-pattern-creation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-repaint-rect-on-path-with-stroke.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-bounce.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-container.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-image.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-style.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-transform-addition.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/js-update-transform-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/marker-strokeWidth-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/marker-viewBox-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/mask-child-changes.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/mask-clip-target-transform.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/mask-invalidation.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/modify-inserted-listitem.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/modify-text-node-in-tspan.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/modify-transferred-listitem-different-attr.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/outline-offset-text.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/overflow-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/paintorder-filtered.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/pending-resource-after-removal.xhtml [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-content-with-resources.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-content.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-deep-shadow-tree-content.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/relative-sized-document-scrollbars.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-image.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-inner-svg.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol.xhtml [ Failure ]
@@ -5846,66 +4945,28 @@
 crbug.com/591099 paint/invalidation/svg/relative-sized-use-on-symbol.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/remove-background-property-on-root.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/remove-border-property-on-root.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/remove-text-node-from-tspan.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/remove-tspan-from-text.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/svg/repaint-moving-svg-and-div.xhtml [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/repaint-non-scaling-stroke-text-decoration.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/repaint-non-scaling-stroke-text.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/repaint-on-image-bounds-change.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/repaint-paintorder.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children-2.html [ Failure ]
 crbug.com/714962 paint/invalidation/svg/resize-svg-invalidate-children-fixed-size-relative-child.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/resource-client-removal.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/resource-invalidate-on-target-update.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ]
 crbug.com/591099 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/shape-transform-change.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/stroke-opacity-update.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/svg-image-change-content-size.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/svgsvgelement-repaint-children.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/tabgroup.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-dom-removal.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-mask-update.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-pattern-update-2.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-pattern-update.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-repaint-including-stroke.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/text-rescale.html [ Failure ]
-crbug.com/714962 paint/invalidation/svg/text-selection-text-05-t.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/text-viewbox-rescale.html [ Failure Pass ]
 crbug.com/714962 paint/invalidation/svg/text-xy-updates-SVGList.xhtml [ Failure ]
-crbug.com/714962 paint/invalidation/svg/transform-changed-state.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/svg/transform-focus-ring-repaint.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/svg/transform-foreign-object.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/transform-text-element.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/tspan-dynamic-positioning.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/tspan-pattern-update.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/use-clipped-hit.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/use-detach.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/use-disappears-after-style-update.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/use-inherit-style.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/use-setAttribute-crash.svg [ Failure ]
-crbug.com/714962 paint/invalidation/svg/window.svg [ Failure Pass ]
-crbug.com/714962 paint/invalidation/svg/zoom-coords-viewattr-01-b.svg [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/add-table-overpaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/block-selection-gap-in-table-cell.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/border-collapse-change-collapse-to-separate.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/border-collapse-change-separate-to-collapse.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/cached-cell-append.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/cached-change-cell-border-color.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/cached-change-cell-border-width.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/cached-change-cell-sl-border-color.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/cached-change-col-border-color.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/cached-change-col-border-width.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/cached-change-colgroup-border-color.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/cached-change-colgroup-border-width.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/cached-change-row-border-width.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/cached-change-table-border-color.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/cached-change-table-border-width.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/cached-change-tbody-border-color.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/cached-change-tbody-border-width.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/caret-contenteditable-content-after.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/collapsed-border-cell-resize.html [ Failure ]
@@ -5920,7 +4981,6 @@
 crbug.com/591099 paint/invalidation/table/composited-table-background-colgroup.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-background-composited-row-initial-empty.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-background-composited-row.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/composited-table-background-initial-empty.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/composited-table-background-section-composited-row-initial-empty.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-background-section-composited-row.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-background-section-initial-empty.html [ Failure ]
@@ -5928,34 +4988,19 @@
 crbug.com/591099 paint/invalidation/table/composited-table-background.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-row.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/dynamic-table-vertical-alignment-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/fixed-table-cell.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/fixed-table-overflow-zindex.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/fixed-table-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/input-overflow-in-table.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/invalidate-cell-in-row-with-offset.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/invisible-col-visible-td.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/repaint-table-row-in-composited-document.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/resize-table-repaint-percent-size-cell.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/resize-table-repaint-vertical-align-cell.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/resize-table-row-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/table/row-change-background-rowspan-cell.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/scroll-inside-table-cell.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/scroll-relative-table-inside-table-cell.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only.html [ Failure ]
 crbug.com/714962 paint/invalidation/table/table-cell-become-visible-using-row-background.html [ Crash ]
 crbug.com/591099 paint/invalidation/table/table-cell-collapsed-border.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-cell-move.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/table-cell-overflow.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/table-cell-vertical-overflow.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/table/table-col-background-offset.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/table/table-col-background.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/table-collapsed-border.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-extra-bottom-grow.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-outer-border.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/table-overflow-auto-in-overflow-auto-scrolled.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table/table-overflow-scroll-in-overflow-scroll-scrolled.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/table-row.html [ Failure ]
-crbug.com/591099 paint/invalidation/table/table-section-overflow.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table/table-section-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/table-shrink-row-repaint.html [ Crash ]
 crbug.com/591099 paint/invalidation/table/table-two-pass-layout-overpaint.html [ Failure ]
@@ -5969,18 +5014,9 @@
 crbug.com/714962 paint/invalidation/text-match.html [ Failure ]
 crbug.com/591099 paint/invalidation/text-shadow-horizontal.html [ Failure ]
 crbug.com/591099 paint/invalidation/text-shadow.html [ Failure ]
-crbug.com/714962 paint/invalidation/transform/caret-with-transformation.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/transform/change-transform.html [ Failure ]
-crbug.com/591099 paint/invalidation/transform/resize-skewed.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/transform/subpixel-offset-scaled-transform.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/transform/subtree-layoutstate-transform.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/transform/transform-disable-layoutstate.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/transform/transform-inline-layered-child.html [ Crash ]
 crbug.com/591099 paint/invalidation/transform/transform-layout-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/transform/transform-repaint-descendants.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/transform/transform-replaced-shadows.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/transform/transform-rotate-and-remove.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/transform/transform-translate.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/vertical-align-length1.html [ Failure ]
 crbug.com/591099 paint/invalidation/vertical-align-length2.html [ Failure ]
 crbug.com/591099 paint/invalidation/vertical-align1.html [ Failure ]
@@ -5988,20 +5024,7 @@
 crbug.com/591099 paint/invalidation/vertical-rl-as-paint-container.html [ Failure ]
 crbug.com/591099 paint/invalidation/video-mute-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/video-unmute-repaint.html [ Failure ]
-crbug.com/714962 paint/invalidation/window-resize/window-resize-background-image-fixed-centered-composited.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/window-resize/window-resize-background-image-fixed-centered.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/window-resize/window-resize-background-image-generated.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/window-resize/window-resize-background-image-non-fixed.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos.html [ Failure ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-frameset.html [ Failure Pass ]
-crbug.com/714962 paint/invalidation/window-resize/window-resize-media-query.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-no-layout-change1.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-no-layout-change2.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-percent-html.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-percent-width-height.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-positioned-bottom.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-positioned-percent-top.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/window-resize/window-resize-viewport-percent.html [ Failure Pass ]
 crbug.com/591099 paint/markers/active-suggestion-marker-basic.html [ Failure ]
 crbug.com/591099 paint/markers/active-suggestion-marker-split.html [ Failure ]
 crbug.com/591099 paint/markers/composition-marker-basic.html [ Failure ]
@@ -6022,10 +5045,8 @@
 crbug.com/591099 paint/overflow/background-mask-should-be-recorded-full.html [ Failure ]
 crbug.com/591099 paint/overflow/composited-scroll-vertical-rl.html [ Failure ]
 crbug.com/591099 paint/overflow/fixed-background-scroll-window.html [ Pass ]
-crbug.com/591099 paint/overflow/non-composited-fixed-position-descendant.html [ Failure Pass ]
 crbug.com/591099 paint/pagination/composited-paginated-inline.html [ Failure ]
 crbug.com/591099 paint/pagination/pagination-change-clip-crash.html [ Failure ]
-crbug.com/591099 paint/printing/print-box-shadow.html [ Failure Pass ]
 crbug.com/591099 paint/selection/drag-caret.html [ Crash ]
 crbug.com/714962 paint/selection/text-selection-drag.html [ Failure ]
 crbug.com/591099 paint/selection/text-selection-inline-block-rtl.html [ Failure ]
@@ -6049,7 +5070,6 @@
 crbug.com/591099 payments/payment-request-in-iframe.html [ Failure ]
 crbug.com/591099 plugins/embed-attributes-style.html [ Failure ]
 crbug.com/591099 plugins/focus.html [ Failure ]
-crbug.com/591099 plugins/iframe-plugin-bgcolor.html [ Failure ]
 crbug.com/591099 plugins/mouse-click-plugin-clears-selection.html [ Failure ]
 crbug.com/591099 plugins/refcount-leaks.html [ Failure ]
 crbug.com/591099 plugins/tabindex.html [ Failure ]
@@ -6091,13 +5111,9 @@
 crbug.com/714962 printing/page-count-layout-overflow.html [ Failure ]
 crbug.com/591099 printing/page-count-relayout-shrink.html [ Failure ]
 crbug.com/714962 printing/page-height-zero.html [ Failure ]
-crbug.com/591099 printing/quirks-percentage-height-body.html [ Failure Pass ]
-crbug.com/591099 printing/quirks-percentage-height.html [ Failure Pass ]
 crbug.com/591099 printing/respect-layout-overflow-from-pagination.html [ Failure ]
 crbug.com/591099 printing/return-from-printing-mode.html [ Failure ]
-crbug.com/591099 printing/simultaneous-position-float-change.html [ Failure Pass ]
 crbug.com/591099 printing/single-line-must-not-be-split-into-two-pages.html [ Timeout ]
-crbug.com/591099 printing/subframes-percentage-height.html [ Failure Pass ]
 crbug.com/591099 printing/tfoot-repeats-at-bottom-of-each-page-multiple-tables.html [ Failure ]
 crbug.com/591099 printing/thead-repeats-at-top-of-each-page-multiple-tables.html [ Failure ]
 crbug.com/591099 printing/thead-repeats-at-top-of-each-page.html [ Failure ]
@@ -6105,26 +5121,22 @@
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
 crbug.com/591099 scrollbars/custom-scrollbar-enable-changes-thickness-with-iframe.html [ Failure ]
 crbug.com/591099 scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure ]
-crbug.com/591099 scrollbars/scrollbar-click-does-not-blur-content.html [ Failure Pass ]
 crbug.com/591099 scrollbars/scrollbar-large-overflow-rectangle.html [ Crash ]
 crbug.com/591099 scrollbars/scrollbar-miss-mousemove-disabled.html [ Failure ]
 crbug.com/714962 scrollbars/scrollbar-orientation.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbar-owning-renderer-crash.html [ Failure ]
-crbug.com/714962 scrollbars/scrollbar-position-crash.html [ Crash Failure ]
+crbug.com/714962 scrollbars/scrollbar-position-crash.html [ Crash ]
 crbug.com/591099 scrollbars/scrollbars-on-positioned-content.html [ Failure ]
 crbug.com/591099 security/autocomplete-cleared-on-back.html [ Failure ]
 crbug.com/591099 shadow-dom/css-style-inherit.html [ Pass ]
-crbug.com/591099 shadow-dom/event-composed-ua.html [ Pass Timeout ]
 crbug.com/591099 shadow-dom/focus-navigation-with-delegatesFocus.html [ Timeout ]
 crbug.com/714962 shadow-dom/slotted-pseudo-element-dynamic-attribute-change.html [ Failure ]
 crbug.com/591099 shapedetection/detection-HTMLVideoElement.html [ Pass ]
-crbug.com/714962 storage/indexeddb/blob-basics-metadata.html [ Failure Pass ]
 crbug.com/591099 storage/indexeddb/cursor-advance.html [ Pass Timeout ]
 crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/cursor-key-order.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/cursor-update.html [ Pass Timeout ]
 crbug.com/591099 storage/indexeddb/deleted-objects.html [ Timeout ]
-crbug.com/714962 storage/indexeddb/empty-blob-file.html [ Failure Pass ]
 crbug.com/591099 storage/indexeddb/exceptions.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/index-cursor.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/keypath-basics.html [ Pass Timeout ]
@@ -6133,61 +5145,7 @@
 crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/objectstore-keycursor.html [ Timeout ]
-crbug.com/591099 storage/indexeddb/structured-clone.html [ Failure Timeout ]
-crbug.com/714962 svg/W3C-SVG-1.1-SE/filters-image-03-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1-SE/filters-image-05-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1-SE/painting-marker-05-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1-SE/types-dom-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-08-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-22-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-33-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-36-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-40-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-41-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-61-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-63-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-64-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-65-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-66-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-67-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-68-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-69-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-70-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-78-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-80-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-82-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/animate-elem-83-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/coords-units-02-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/coords-viewattr-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/coords-viewattr-02-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/coords-viewattr-03-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/filters-gauss-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/filters-light-04-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/filters-turb-02-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/masking-opacity-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/masking-path-02-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/masking-path-03-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/painting-marker-03-f.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/painting-render-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/painting-stroke-07-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-04-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-05-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-06-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-07-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-08-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-09-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-14-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/paths-data-15-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/pservers-grad-12-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/pservers-grad-13-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/render-elems-03-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/render-groups-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/render-groups-03-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/struct-group-03-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/struct-image-06-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/struct-symbol-01-b.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/text-text-05-t.svg [ Failure Pass ]
-crbug.com/714962 svg/W3C-SVG-1.1/text-text-06-t.svg [ Failure Pass ]
+crbug.com/591099 storage/indexeddb/structured-clone.html [ Timeout ]
 crbug.com/591099 svg/as-background-image/animated-svg-as-background.html [ Crash ]
 crbug.com/591099 svg/as-background-image/background-image-preserveaspectRatio-support.html [ Failure ]
 crbug.com/591099 svg/as-background-image/background-repeat.html [ Failure ]
@@ -6203,28 +5161,14 @@
 crbug.com/591099 svg/as-background-image/svg-as-tiled-background.html [ Failure Pass ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image-2.html [ Failure ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image.html [ Failure ]
-crbug.com/591099 svg/as-image/image-respects-deviceScaleFactor.html [ Failure Pass ]
-crbug.com/591099 svg/as-image/image-respects-pageScaleFactor.html [ Failure Pass ]
 crbug.com/591099 svg/as-image/img-preserveAspectRatio-support-1.html [ Failure ]
-crbug.com/591099 svg/as-image/svg-as-image.html [ Failure Pass ]
-crbug.com/591099 svg/as-image/svg-as-relative-image-with-explicit-size.html [ Failure Pass ]
-crbug.com/591099 svg/as-image/svg-as-relative-image.html [ Failure Pass ]
 crbug.com/591099 svg/as-image/svg-image-leak-loader.html [ Failure ]
-crbug.com/591099 svg/as-image/svg-non-integer-scaled-image.html [ Failure Pass ]
 crbug.com/591099 svg/as-image/svgview-references-use-counters.html [ Failure ]
 crbug.com/591099 svg/as-object/object-box-sizing-no-width-height.html [ Failure ]
-crbug.com/714962 svg/batik/masking/maskRegions.svg [ Failure Pass ]
-crbug.com/714962 svg/batik/text/smallFonts.svg [ Failure Pass ]
-crbug.com/714962 svg/batik/text/textAnchor.svg [ Failure Pass ]
 crbug.com/714962 svg/canvas/canvas-pattern-svg.html [ Failure ]
-crbug.com/591099 svg/css/css-box-min-width.html [ Failure Pass ]
-crbug.com/591099 svg/css/max-height.html [ Failure Pass ]
-crbug.com/591099 svg/css/max-width.html [ Failure Pass ]
 crbug.com/591099 svg/css/text-shadow-multiple.xhtml [ Failure ]
 crbug.com/591099 svg/custom/absolute-sized-svg-in-xhtml.xhtml [ Failure ]
-crbug.com/591099 svg/custom/anchor-on-use.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/clone-element-with-animated-svg-properties.html [ Failure ]
-crbug.com/714962 svg/custom/container-opacity-clip-viewBox.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/createImageElement2.xhtml [ Failure ]
 crbug.com/591099 svg/custom/dominant-baseline-hanging.svg [ Failure ]
 crbug.com/591099 svg/custom/elementTimeControl-nan-crash.html [ Failure ]
@@ -6234,10 +5178,6 @@
 crbug.com/591099 svg/custom/getscreenctm-in-scrollable-div-area-nested.xhtml [ Failure ]
 crbug.com/591099 svg/custom/getscreenctm-in-scrollable-div-area.xhtml [ Failure ]
 crbug.com/591099 svg/custom/getsvgdocument.html [ Failure ]
-crbug.com/591099 svg/custom/grayscale-gradient-mask.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/group-opacity.svg [ Failure Pass ]
-crbug.com/591099 svg/custom/hit-test-path-stroke.svg [ Failure Pass ]
-crbug.com/591099 svg/custom/hit-test-path.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/image-parent-translation.xhtml [ Failure ]
 crbug.com/591099 svg/custom/image-rescale-clip.html [ Failure ]
 crbug.com/591099 svg/custom/image-rescale-scroll.html [ Failure ]
@@ -6247,17 +5187,12 @@
 crbug.com/591099 svg/custom/junk-data.svg [ Failure ]
 crbug.com/591099 svg/custom/load-non-wellformed.svg [ Failure ]
 crbug.com/591099 svg/custom/marker-orient-auto.html [ Failure ]
-crbug.com/714962 svg/custom/marker-zero-length-linecaps.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/masking-clipping-hidpi.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/missing-xlink.svg [ Failure ]
-crbug.com/591099 svg/custom/mouse-move-on-svg-container.xhtml [ Pass Timeout ]
-crbug.com/591099 svg/custom/mouse-move-on-svg-root.xhtml [ Pass Timeout ]
 crbug.com/591099 svg/custom/no-inherited-dashed-stroke.xhtml [ Failure ]
 crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ]
 crbug.com/591099 svg/custom/object-sizing.xhtml [ Failure ]
 crbug.com/591099 svg/custom/path-bad-data.svg [ Failure ]
 crbug.com/591099 svg/custom/pattern-userSpaceOnUse-userToBaseTransform.xhtml [ Failure ]
-crbug.com/714962 svg/custom/preserve-aspect-ratio-syntax.svg [ Failure Pass ]
 crbug.com/591099 svg/custom/rootmost-svg-xy-attrs.xhtml [ Failure ]
 crbug.com/591099 svg/custom/svg-allowed-in-dashboard-object.html [ Failure ]
 crbug.com/591099 svg/custom/svg-float-border-padding.xml [ Failure ]
@@ -6269,59 +5204,16 @@
 crbug.com/591099 svg/custom/tref-with-progress-tag-setpseudo-assert.html [ Failure ]
 crbug.com/591099 svg/custom/use-event-retargeting.html [ Failure ]
 crbug.com/591099 svg/custom/use-font-face-crash.svg [ Failure ]
-crbug.com/714962 svg/custom/use-modify-container-in-target.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-modify-target-container.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-on-clip-path-with-transformation.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-on-g-containing-use.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-on-g.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-on-use.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/use-transform.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/viewbox-syntax.svg [ Failure Pass ]
-crbug.com/714962 svg/custom/width-full-percentage.svg [ Failure Pass ]
 crbug.com/714962 svg/dom/SVGStringList-basics.xhtml [ Failure ]
 crbug.com/591099 svg/dom/svg-root-lengths.html [ Failure ]
 crbug.com/591099 svg/dom/svgangle-units.html [ Pass Timeout ]
-crbug.com/591099 svg/dom/tooltip-title-inline-svg.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVG-dynamic-css-transform.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-dom-height-attr.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-dom-maskContentUnits-attr.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-dom-width-attr.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-dom-x-attr.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-dom-y-attr.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-svgdom-height-prop.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-svgdom-maskContentUnits-prop.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-svgdom-width-prop.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-svgdom-x-prop.html [ Failure Pass ]
-crbug.com/714962 svg/dynamic-updates/SVGMaskElement-svgdom-y-prop.html [ Failure Pass ]
 crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ]
 crbug.com/591099 svg/foreign-object-under-shadow-root-under-hidden.html [ Failure ]
-crbug.com/591099 svg/foreignObject/background-render-phase.html [ Failure Pass ]
-crbug.com/591099 svg/foreignObject/clip.html [ Failure Pass ]
-crbug.com/591099 svg/foreignObject/filter.html [ Failure Pass ]
-crbug.com/591099 svg/foreignObject/mask.html [ Failure Pass ]
-crbug.com/591099 svg/foreignObject/multiple-foreign-objects.html [ Failure Pass ]
 crbug.com/591099 svg/foreignObject/svg-document-in-html-document.svg [ Failure ]
-crbug.com/591099 svg/hittest/clip-path-shape.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/ellipse-hittest.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/empty-container.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/pointer-events-all.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/pointer-events-all2.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/rect-hittest.html [ Failure Pass ]
-crbug.com/714962 svg/hittest/rect-miterlimit.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/text-small-font-size.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/update-ellipse.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/update-rect.html [ Failure Pass ]
-crbug.com/591099 svg/hittest/zero-length-butt-cap-path.xhtml [ Failure Pass ]
-crbug.com/591099 svg/hittest/zero-length-round-cap-path.xhtml [ Failure Pass ]
-crbug.com/591099 svg/hittest/zero-stroke-width.html [ Failure Pass ]
 crbug.com/591099 svg/hixie/error/012.xml [ Failure ]
 crbug.com/591099 svg/hixie/error/013.xml [ Failure ]
 crbug.com/591099 svg/hixie/mixed/006.xml [ Failure ]
-crbug.com/591099 svg/hixie/mixed/011.xml [ Failure Pass ]
-crbug.com/714962 svg/hixie/perf/007.xml [ Failure Pass ]
-crbug.com/714962 svg/hixie/viewbox/preserveAspectRatio/001.xml [ Failure Pass ]
 crbug.com/591099 svg/in-html/sizing/svg-inline.html [ Timeout ]
-crbug.com/591099 svg/overflow/overflow-on-foreignObject.svg [ Failure Pass ]
 crbug.com/714962 svg/overflow/overflow-on-outermost-svg-element-horizontal-auto.svg [ Failure ]
 crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-auto.xhtml [ Failure ]
 crbug.com/591099 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults.xhtml [ Failure ]
@@ -6339,39 +5231,25 @@
 crbug.com/714962 svg/text/columns-do-not-apply.html [ Failure ]
 crbug.com/591099 svg/text/foreignObject-text-clipping-bug.xml [ Failure ]
 crbug.com/714962 svg/text/layout-inline-children-assert.html [ Failure ]
-crbug.com/591099 svg/text/scaling-font-with-geometric-precision.html [ Failure Pass ]
 crbug.com/714962 svg/text/select-text-svgfont.html [ Failure ]
-crbug.com/591099 svg/text/selection-dragging-outside-1.html [ Failure Pass ]
-crbug.com/591099 svg/text/selection-dragging-outside-2.html [ Failure Pass ]
-crbug.com/591099 svg/text/selection-dragging-outside-3.html [ Failure Pass ]
-crbug.com/591099 svg/text/small-fonts-in-html5.html [ Failure Pass ]
 crbug.com/591099 svg/text/text-layout-crash.html [ Failure ]
 crbug.com/591099 svg/text/text-repaint-rects.xhtml [ Failure ]
-crbug.com/714962 svg/text/text-selection-text-06-t.svg [ Failure Pass ]
 crbug.com/714962 svg/text/tspan-multiple-outline.svg [ Failure ]
 crbug.com/591099 svg/transforms/svg-css-transforms-clip-path.xhtml [ Failure ]
 crbug.com/591099 svg/transforms/svg-css-transforms.xhtml [ Failure ]
-crbug.com/714962 svg/transforms/text-with-mask-with-svg-transform.svg [ Failure Pass ]
 crbug.com/591099 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ]
-crbug.com/714962 svg/transforms/text-with-pattern-with-svg-transform.svg [ Failure Pass ]
 crbug.com/591099 svg/transforms/transformed-text-fill-pattern.html [ Failure ]
 crbug.com/591099 svg/wicd/test-rightsizing-a.xhtml [ Failure ]
 crbug.com/591099 svg/wicd/test-rightsizing-b.xhtml [ Failure ]
 crbug.com/591099 svg/wicd/test-scalable-background-image1.xhtml [ Crash ]
 crbug.com/591099 svg/wicd/test-scalable-background-image2.xhtml [ Failure ]
-crbug.com/591099 svg/zoom/page/zoom-clip-path.html [ Failure Pass ]
-crbug.com/714962 svg/zoom/page/zoom-coords-viewattr-01-b.svg [ Failure Pass ]
 crbug.com/591099 svg/zoom/page/zoom-foreignObject.svg [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-hixie-mixed-009.xml [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-hixie-rendering-model-004.xhtml [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ Failure ]
-crbug.com/714962 svg/zoom/page/zoom-mask-with-percentages.svg [ Failure Pass ]
 crbug.com/591099 svg/zoom/page/zoom-replaced-intrinsic-ratio-001.htm [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-svg-as-background-with-relative-size-and-viewBox.html [ Crash ]
 crbug.com/591099 svg/zoom/page/zoom-svg-as-background-with-relative-size.html [ Crash ]
-crbug.com/591099 svg/zoom/page/zoom-svg-as-image.html [ Failure Pass ]
-crbug.com/591099 svg/zoom/page/zoom-svg-as-object.html [ Failure Pass ]
-crbug.com/591099 svg/zoom/page/zoom-svg-as-relative-image.html [ Failure Pass ]
 crbug.com/591099 svg/zoom/page/zoom-svg-float-border-padding.xml [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-svg-through-object-with-absolute-size-2.xhtml [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-svg-through-object-with-absolute-size.xhtml [ Failure ]
@@ -6418,7 +5296,6 @@
 crbug.com/714962 tables/mozilla/bugs/bug18955.html [ Failure ]
 crbug.com/714962 tables/mozilla/bugs/bug19599.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug20579.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug219693-1.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug219693-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug221784-2.html [ Failure ]
 crbug.com/714962 tables/mozilla/bugs/bug2267.html [ Failure ]
@@ -6497,8 +5374,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug98196.html [ Failure ]
 crbug.com/591099 tables/mozilla/collapsing_borders/bug41262-3.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/bloomberg.html [ Failure ]
-crbug.com/591099 tables/mozilla/core/captions.html [ Failure Pass ]
-crbug.com/591099 tables/mozilla/core/cell_heights.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ]
 crbug.com/714962 tables/mozilla/marvin/col_span.html [ Failure ]
 crbug.com/714962 tables/mozilla/marvin/colgroup_span.html [ Failure ]
@@ -6538,7 +5413,6 @@
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug1128.html [ Failure ]
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug14007-1.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14489.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug19526.html [ Failure Pass ]
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug21518.html [ Failure ]
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug22122.html [ Failure ]
 crbug.com/714962 tables/mozilla_expected_failures/bugs/bug2479-5.html [ Failure ]
@@ -6565,19 +5439,13 @@
 crbug.com/714962 tables/mozilla_expected_failures/marvin/tables_cellspacing_pct.html [ Failure ]
 crbug.com/714962 tables/mozilla_expected_failures/marvin/x_colgroup_width_px.xml [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/other/test4.html [ Crash ]
-crbug.com/714962 tables/table-transform-absolute-position-child.html [ Failure Pass ]
 crbug.com/714962 touchadjustment/context-menu-select-text.html [ Failure ]
 crbug.com/714962 touchadjustment/context-menu-text-subtargets.html [ Failure ]
-crbug.com/591099 touchadjustment/small-target-test.html [ Failure Pass ]
 crbug.com/714962 touchadjustment/touch-links-longpress.html [ Failure ]
 crbug.com/591099 transforms/2d/compound-transforms-vs-containers.html [ Failure ]
-crbug.com/591099 transforms/2d/cssmatrix-2d-zoom.html [ Failure Pass ]
 crbug.com/591099 transforms/2d/hindi-rotated.html [ Failure ]
 crbug.com/591099 transforms/2d/transform-2d.html [ Timeout ]
 crbug.com/591099 transforms/2d/transform-fixed-container.html [ Failure ]
-crbug.com/591099 transforms/2d/zoom-menulist.html [ Failure Pass ]
-crbug.com/591099 transforms/3d/general/cssmatrix-3d-zoom.html [ Failure Pass ]
-crbug.com/591099 transforms/3d/general/matrix-with-zoom-3d.html [ Failure Pass ]
 crbug.com/591099 transforms/3d/general/perspective-non-layer.html [ Failure ]
 crbug.com/591099 transforms/3d/general/perspective-units.html [ Failure ]
 crbug.com/591099 transforms/3d/hit-testing/backface-hit-test.html [ Failure ]
@@ -6595,28 +5463,18 @@
 crbug.com/591099 transforms/diamond.html [ Failure ]
 crbug.com/591099 transforms/identity-matrix.html [ Failure ]
 crbug.com/714962 transforms/inline-in-transformed-multicol.html [ Failure ]
-crbug.com/591099 transforms/matrix-01.html [ Failure Pass ]
-crbug.com/591099 transforms/matrix-02.html [ Failure Pass ]
-crbug.com/591099 transforms/matrix-with-zoom.html [ Failure Pass ]
 crbug.com/591099 transforms/overflow-with-transform.html [ Failure ]
-crbug.com/591099 transforms/rotated-transform-affects-scrolling-1.html [ Failure Pass ]
-crbug.com/591099 transforms/rotated-transform-affects-scrolling-2.html [ Failure Pass ]
 crbug.com/591099 transforms/scrollIntoView-transformed.html [ Failure ]
 crbug.com/714962 transforms/selection-bounds-in-transformed-view.html [ Failure ]
 crbug.com/591099 transforms/shadows.html [ Failure ]
-crbug.com/591099 transforms/skew-with-unitless-zero.html [ Failure Pass ]
 crbug.com/591099 transforms/svg-vs-css.xhtml [ Failure ]
 crbug.com/591099 transforms/transform-on-inline.html [ Failure ]
-crbug.com/591099 transforms/transform-overflow.html [ Failure Pass ]
 crbug.com/591099 transforms/transform-positioned-ancestor.html [ Failure ]
 crbug.com/591099 transforms/transformed-caret.html [ Failure ]
-crbug.com/591099 transforms/transformed-focused-text-input.html [ Failure Pass ]
-crbug.com/591099 transforms/transforms-with-opacity.html [ Failure Pass ]
 crbug.com/591099 transforms/transforms-with-zoom.html [ Failure ]
 crbug.com/591099 transitions/opacity-transform-transitions-inside-iframe.html [ Failure ]
 crbug.com/591099 traversal/tree-walker-003.html [ Failure ]
 crbug.com/591099 traversal/tree-walker-004.html [ Failure ]
-crbug.com/591099 vibration/vibration-iframe.html [ Pass Timeout ]
 crbug.com/591099 virtual/android/ [ Skip ]
 crbug.com/591099 virtual/color_space/fast/canvas/color-space/canvas-createImageBitmap-linear-rgb.html [ Pass ]
 crbug.com/591099 virtual/color_space/fast/canvas/color-space/canvas-createImageBitmap-p3.html [ Pass ]
@@ -6635,7 +5493,6 @@
 crbug.com/591099 virtual/gpu-rasterization/images/23-55.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/55.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/alt-text-wrapping.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-jpeg-with-color-profile.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-clip-text.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-radius.html [ Failure ]
@@ -6654,21 +5511,7 @@
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-reflection.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/crash-bad-cast.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-background-size.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-blending.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-invalidation.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-overflow-position.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-simple.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-sizing.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-tiled.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/embed-does-not-propagate-dimensions-to-object-ancestor.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/favicon-as-image.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/gif-loop-count.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/gif-short-app-extension-string.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/gray-scale-png-with-color-profile.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/icon-0colors.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/icon-decoding.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/image-click-scale-restore-zoomed-image.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/image-css3-content-data.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-hover-display-alt.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-in-map.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-anchor-children.html [ Failure ]
@@ -6676,16 +5519,11 @@
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-multiple.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom-alt-content.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/image-map-zoom.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/image-zoom-to-25.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/motion-jpeg-single-frame.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-background.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/pdf-as-tiled-background.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/percent-height-image.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/pixel-crack-image-background-webkit-transform-scale.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/png-extra-row-crash.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/png-suite/test.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/png_per_row_alpha_decoding.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-0px-images-quirk.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-0px-images.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-10px-images.html [ Failure ]
@@ -6694,7 +5532,6 @@
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-block-flow-images.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-images-empty-alt.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/rendering-broken-images.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/webp-flip.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-createImageBitmap-colorClamping.html [ Pass ]
 crbug.com/714962 virtual/gpu/fast/canvas/canvas-css-clip-path.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-drawImage-animated-images.html [ Failure ]
@@ -6703,7 +5540,6 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure ]
 crbug.com/714962 virtual/gpu/fast/canvas/canvas-textMetrics-width.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-transforms-during-path.html [ Failure ]
-crbug.com/591099 virtual/gpu/fast/canvas/fill-stroke-clip-reset-path.html [ Failure Pass ]
 crbug.com/714962 virtual/gpu/fast/canvas/image-object-in-canvas.html [ Failure ]
 crbug.com/591099 virtual/gpu/fast/canvas/patternfill-repeat.html [ Failure ]
 crbug.com/714962 virtual/gpu/fast/canvas/setWidthResetAfterForcedRender.html [ Failure ]
@@ -6714,54 +5550,15 @@
 crbug.com/591099 virtual/incremental-shadow-dom/external/wpt/shadow-dom/untriaged/shadow-trees/shadow-root-002.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/external/wpt/shadow-dom/untriaged/user-interaction/ranges-and-selections/test-002.html [ Pass ]
 crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change.html [ Failure ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/cppevent-input-in-shadow.html [ Failure Pass ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/drop-event-for-input-in-shadow.html [ Failure Pass ]
 crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/import-rule-in-shadow-tree-needs-document-style-recalc.html [ Failure ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/input-color-in-content.html [ Pass Timeout ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/make-marquee-bold-by-exec-command-crash.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/no-renderers-for-light-children.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/querySelector-for-useragent-shadowroot.html [ Failure ]
 crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/scrollbar.html [ Crash ]
 crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/selections-in-shadow.html [ Timeout ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/shadow-boundary-crossing.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/fast/dom/shadow/shadow-dom-event-dispatching-svg-in-shadow-subtree.html [ Failure Pass ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/touch-event.html [ Failure Pass ]
-crbug.com/714962 virtual/incremental-shadow-dom/fast/dom/shadow/wheel-event-on-input-in-shadow-dom.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-child-1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-child-2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-details-child-1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-details-child-2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-4-and-click.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-4.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-5-and-click.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-9-and-click.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-9.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-child-1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-add-summary-child-2.html [ Failure Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-nested-1.html [ Failure ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-nested-2.html [ Failure ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-no-summary1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-no-summary2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-no-summary3.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-no-summary4.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open-javascript.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open3.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open4.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open5.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-open6.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-position.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-child-1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-child-2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-3-and-click.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-3.html [ Failure Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-6-and-click.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-6.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-child-1.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-remove-summary-child-2.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-replace-summary-child.html [ Failure Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-replace-text.html [ Failure Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-writing-mode-align-center.html [ Failure ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-writing-mode-align-left.html [ Failure ]
 crbug.com/591099 virtual/incremental-shadow-dom/html/details_summary/details-writing-mode-align-right.html [ Failure ]
@@ -6769,7 +5566,6 @@
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/active-element.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/css-cascade-outer-scope2.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/css-cascade-slot-distributed.html [ Pass ]
-crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/event-composed-ua.html [ Pass Timeout ]
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/focus-navigation-slot-nested-delegatesFocus.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/focus-navigation-slot-nested.html [ Pass ]
 crbug.com/591099 virtual/incremental-shadow-dom/shadow-dom/focus-navigation-slot-with-tabindex.html [ Pass ]
@@ -6794,33 +5590,15 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/change-frame-focus.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-tab.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/click-checkbox-blur-refocus-window.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/click-checkbox-refocus-window.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/click-over-descendant-elements.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/click-range-slider.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/click-with-large-negative-text-indent.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/contextmenu-follows-focus.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/contextmenu-scrolled-page-with-frame.html [ Failure Pass ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/document-elementFromPoint.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/dom-character-data-modified-textarea-crash.html [ Crash ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Failure Pass ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/drag-and-drop-subframe-dataTransfer.html [ Pass Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/drag-dataTransferItemList-file-handling.html [ Failure Pass ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/drag-on-removed-slider-does-not-crash.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/drag-selects-image.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/event-listener-on-link.html [ Failure Pass ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/event-on-culled_inline.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/event-trusted.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/file-input-hidden-in-ondrop.html [ Pass Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/frame-programmatic-focus.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/frame-scroll-fake-mouse-move.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/frame-tab-focus.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/input-element-display-none-in-dragleave-crash.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/inputevents/inputevent-drag-drop.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/js-keyboard-event-creation.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/key-events-in-input-text.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/keyboardevent-getModifierState.html [ Timeout ]
@@ -6829,49 +5607,34 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/keypress-focus-change.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/media-element-focus-tab.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document-pinch-zoom.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ]
+crbug.com/714962 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Timeout ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame-to-other-frame.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-event-buttons-attribute.html [ Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/mouse-events-on-textarea-resize.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouseevent-getModifierState.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mousemove-after-drag-over-scrollbar.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/mousemove-to-resizer-changes-cursor.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/mouseover-mouseout.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/no-blur-on-enter-button.html [ Failure ]
 crbug.com/714962 virtual/mouseevent_fractional/fast/events/offsetX-offsetY.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/onblur-remove.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/onchange-click-hang.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/onchange-range-slider.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/onclick-list-marker.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/onload-re-entry.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/onload-webkit-before-webcore.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Failure ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-node-remove.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Timeout ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Failure Pass Timeout ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Failure Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-transition-events.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-updown-events.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Failure Pass Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-use-count.html [ Failure Pass ]
+crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Timeout ]
+crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Timeout ]
+crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Pass Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture-in-iframe.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Failure Pass Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointercancel.html [ Failure Pass ]
+crbug.com/714962 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Pass Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-initiated-event.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Pass Timeout ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/popup-blocked-from-different-frames.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/right-click-focus.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/scale-and-scroll-iframe-window.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/scroll-after-click-on-tab-index.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/scroll-div-with-prevent-default-in-subframe.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/scroll-to-anchor-in-overflow-hidden.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/select-element.html [ Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-double-triple-clicks.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-drag.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/sequential-focus-navigation-starting-point.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ]
@@ -6880,15 +5643,8 @@
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click-on-inline-continations.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-move.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Failure Pass ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input-csp.html [ Pass Timeout ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input.html [ Pass Timeout ]
-crbug.com/714962 virtual/mouseevent_fractional/fast/events/touch/touch-before-pressing-spin-button.html [ Failure Pass ]
+crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/scroll-without-mouse-lacks-mousemove-events.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-fractional-coordinates.html [ Failure ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-slider-no-js-touch-listener.html [ Failure Pass ]
-crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/touch-slider.html [ Failure Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/latched-scroll-node-removed.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mouse-wheel-scroll-latching.html [ Pass ]
@@ -6906,6 +5662,7 @@
 crbug.com/591099 virtual/paint-timing/external/wpt/paint-timing/sibling-painting-first-image.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/ [ Skip ]
 crbug.com/714962 virtual/pwa-full-code-cache/http/tests/devtools/service-workers/service-workers-view.js [ Failure ]
+crbug.com/591099 virtual/reporting-api/external/wpt/content-security-policy/reporting-api/reporting-api-doesnt-send-reports-without-violation.https.sub.html [ Pass ]
 crbug.com/591099 virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ]
 crbug.com/591099 virtual/scalefactor150/fast/hidpi/static/popup-menu-with-scrollbar-appearance.html [ Failure ]
 crbug.com/714962 virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ]
@@ -6917,15 +5674,9 @@
 crbug.com/591099 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-global.html [ Pass ]
 crbug.com/591099 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-transform-changed-nolayout.html [ Pass ]
 crbug.com/591099 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
-crbug.com/591099 virtual/spv2/compositing/framesets/composited-frame-alignment.html [ Failure ]
 crbug.com/591099 virtual/spv2/paint/invalidation/box/margin.html [ Failure Pass ]
 crbug.com/591099 virtual/stable/ [ Skip ]
 crbug.com/591099 virtual/threaded/ [ Skip ]
-crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Failure Pass ]
-crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Failure Pass ]
-crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy.https.sub.html [ Failure Pass ]
-crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-default-feature-policy.https.sub.html [ Failure Pass ]
-crbug.com/591099 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-disabled-by-feature-policy.https.sub.html [ Failure Pass ]
 crbug.com/591099 virtual/wheelscrolllatching/ [ Skip ]
 crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ]
 crbug.com/591099 webexposed/element-instance-property-listing.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
index f739acc..ad8392f3 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -102,6 +102,7 @@
 crbug.com/721408 http/tests/inspector-protocol/network/request-interception-on-response-redirect.js [ Failure ]
 crbug.com/721408 http/tests/inspector-protocol/network/request-interception-on-response.js [ Failure ]
 crbug.com/721408 http/tests/inspector-protocol/network/request-interception-patterns.js [ Failure ]
+crbug.com/721408 http/tests/inspector-protocol/network/request-interception-raw-headers.js [ Failure ]
 crbug.com/721408 http/tests/inspector-protocol/network/request-interception-resource-types.js [ Failure ]
 crbug.com/721408 http/tests/inspector-protocol/network/request-response-interception-disable-between.js [ Failure Timeout ]
 crbug.com/721408 http/tests/inspector-protocol/network/response-interception-cancel-xhr-while-responding-error.js [ Failure Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 534cf4e..48cbbb8 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1731,7 +1731,7 @@
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends-invalid.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Failure ]
-crbug.com/626703 [ Retina ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ]
+crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-fonts/font-variant-06.xht [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Failure ]
@@ -1742,7 +1742,6 @@
 crbug.com/626703 external/wpt/css/css-fonts/font-variant-05.xht [ Failure ]
 crbug.com/626703 external/wpt/css/css-cascade/important-prop.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/reporting-api/external/wpt/content-security-policy/reporting-api/reporting-api-doesnt-send-reports-without-violation.https.sub.html [ Timeout ]
-crbug.com/626703 [ Linux Win ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-014.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-013.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-016.html [ Failure ]
@@ -2417,9 +2416,6 @@
 # Added 2016-12-12
 crbug.com/673539 [ Linux Win ] css3/filters/effect-contrast-hw.html [ Pass Failure ]
 
-# Added 2016-12-15
-crbug.com/674466 [ Win10 ] fast/forms/select/menulist-appearance-rtl.html [ Pass Failure ]
-
 
 crbug.com/765738 [ Linux Win Mac ] virtual/enable_wasm/http/tests/wasm/wasm_remote_postMessage_test.https.html [ Pass Timeout ]
 
@@ -3057,7 +3053,6 @@
 # Sheriff failures 2017-10-04
 crbug.com/770691 [ Win7 Linux Mac10.11 ] media/controls/lazy-loaded-style.html [ Failure Pass ]
 crbug.com/770691 [ Win7 Linux Mac10.11 ] virtual/new-remote-playback-pipeline/media/controls/lazy-loaded-style.html [ Failure Pass ]
-crbug.com/770691 [ Mac10.11 ] media/controls/repaint-on-resize.html [ Failure Pass ]
 
 crbug.com/807191 fast/media/mq-color-gamut-picture.html [ Pass Failure Timeout ]
 
@@ -3255,6 +3250,15 @@
 crbug.com/771643 [ Mac10.11 ] virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/813462 external/wpt/offscreen-canvas/the-offscreen-canvas/offscreencanvas.convert.to.blob.html [ Pass Timeout ]
 
+# Sheriff failures 2018-02-20
+crbug.com/770691 [ Mac10.11 ] media/controls/repaint-on-resize.html [ Failure Pass ]
+
+# Sheriff failures 2018-02-21
+crbug.com/814585 [ Linux ] fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Pass Failure ]
+
+# Sheriff failures 2018-02-22
+crbug.com/770691 [ Mac10.11 ] virtual/new-remote-playback-pipeline/media/controls/repaint-on-resize.html [ Failure Pass ]
+
 # MSAN
 crbug.com/813547 [ Linux ] webaudio/BiquadFilter/tail-time-lowpass.html [ Pass Failure ]
 
@@ -3269,7 +3273,8 @@
 crbug.com/807110 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Failure Pass ]
 crbug.com/807110 external/wpt/media-source/mediasource-config-change-mp4-v-framerate.html [ Failure Pass ]
 crbug.com/807110 external/wpt/media-source/mediasource-config-change-mp4-v-framesize.html [ Failure Pass ]
-crbug.com/807110 external/wpt/media-source/mediasource-endofstream.html [ Failure Pass ]
+# Failure and Pass for crbug.com/807110 and Timeout for crbug.com/727252.
+crbug.com/727252 external/wpt/media-source/mediasource-endofstream.html [ Failure Pass Timeout ]
 crbug.com/807110 external/wpt/media-source/mediasource-is-type-supported.html [ Failure Pass ]
 crbug.com/807110 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Failure Pass ]
 crbug.com/807110 external/wpt/media-source/mediasource-sourcebuffer-mode-timestamps.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-computed-accessible-node.html b/third_party/WebKit/LayoutTests/accessibility/aom-computed-accessible-node.html
index fa19d854..913f74e 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aom-computed-accessible-node.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-computed-accessible-node.html
@@ -29,7 +29,7 @@
     const element = document.getElementById("button1");
     let computedAXNode1 = await getComputedAccessibleNode(element);
     let computedAXNode2 = await getComputedAccessibleNode(element);
-    assert_false(computedAXNode1 === computedAXNode2);
+    assert_true(computedAXNode1 === computedAXNode2);
 }, "Multiple calls to getComputedAccessibleNode will return the same node.");
 </script>
 
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-computed-boolean-properties.html b/third_party/WebKit/LayoutTests/accessibility/aom-computed-boolean-properties.html
index 573f29a..4f1310f 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aom-computed-boolean-properties.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-computed-boolean-properties.html
@@ -26,11 +26,47 @@
     var alertElement = document.getElementById("alert-atomic");
     var divCaxNode = await window.getComputedAccessibleNode(divElement);
     var alertCaxNode = await window.getComputedAccessibleNode(alertElement);
-
     assert_equals(divCaxNode.atomic, true);
     assert_equals(alertCaxNode.atomic, true);
 }, "ComputedAccessibleNode.atomic.");
 
-// TODO(meredithl): include tests for modal and busy attributes.
+</script>
+
+<button id="disabled-native" disabled>Can't click me.</button>
+<div id="aria-disabled" aria-disabled="true">Nor me.</div>
+
+<script>
+
+promise_test(async function(t) {
+  var buttonElement = document.getElementById("disabled-native");
+  var divElement = document.getElementById("aria-disabled");
+  var buttonCaxNode = await window.getComputedAccessibleNode(buttonElement);
+  var divCaxNode = await window.getComputedAccessibleNode(divElement);
+  assert_equals(buttonCaxNode.disabled, true);
+  assert_equals(divCaxNode.disabled, true);
+}, "ComputedAccessibleNode.disabled");
+
+</script>
+
+<form action="/action_page.php">
+  <input id="native-readonly" type="text" name="country" value="Norway" readonly><br>
+  <div id="aria-readonly" role="checkbox" aria-checked="true" aria-readonly="true"></div>
+  <input id="submit" type="submit" value="Submit">
+</form>
+
+<script>
+
+promise_test(async function(t) {
+  var readOnlyElement = document.getElementById("native-readonly");
+  var ariaReadOnlyElement = document.getElementById("aria-readonly");
+  var submitElement = document.getElementById("submit");
+  var readOnlyCaxNode = await window.getComputedAccessibleNode(readOnlyElement);
+  var ariaReadOnlyCaxNode = await window.getComputedAccessibleNode(ariaReadOnlyElement);
+  var submitCaxNode = await window.getComputedAccessibleNode(submitElement);
+
+  assert_equals(readOnlyCaxNode.readOnly, true);
+  assert_equals(ariaReadOnlyCaxNode.readOnly, true);
+  assert_equals(submitCaxNode.readOnly, false);
+}, "ComputedAccessibleNode.readOnly");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-computed-relation-accessors.html b/third_party/WebKit/LayoutTests/accessibility/aom-computed-relation-accessors.html
index 5d35217b..7e94c286 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aom-computed-relation-accessors.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-computed-relation-accessors.html
@@ -24,54 +24,77 @@
 }, "Make sure that Accessibility Object Model is enabled");
 
 promise_test(async function(test) {
-    var element = document.getElementById("option1");
-    var computedAXNode = await window.getComputedAccessibleNode(element);
-    var computedParent = computedAXNode.parent;
+    var child_element = document.getElementById("option1");
+    var parent_element = document.getElementById("listbox");
+    var requestedChildNode = await window.getComputedAccessibleNode(child_element);
+    var requestedParentNode = await window.getComputedAccessibleNode(parent_element);
+
+    var computedParent = requestedChildNode.parent;
     assert_false(computedParent === null);
+    assert_true(computedParent === requestedParentNode);
     assert_equals(computedParent.name, "container");
-    // TODO(meredithl): assert_true(computedParent.firstChild === computedAXNode);
+
+    // TODO(meredith): Investigate test case for non-existent parent.
 }, "ComputedAccessibleNode.parent.");
 
 promise_test(async function(test) {
-    var element = document.getElementById("listbox");
-    var computedAXNode = await window.getComputedAccessibleNode(element);
-    var computedChild = computedAXNode.firstChild
+    var parent_element = document.getElementById("listbox");
+    var requestedParentNode = await window.getComputedAccessibleNode(parent_element);
+    var child_element = document.getElementById("option1");
+    var requestedChildNode = await window.getComputedAccessibleNode(child_element);
+
+    var computedChild = requestedParentNode.firstChild
     assert_false(computedChild === null);
     assert_equals(computedChild.name, "Option 1");
-    // TODO(meredithl): assert_true(computedChild.parent === computedAXNode);
+    assert_true(computedChild === requestedChildNode);
+
+    // Check that a call to non-existent child is null.
+    assert_equals(computedChild.firstChild, null);
 }, "ComputedAccessibleNode.firstChild.");
 
 promise_test(async function(test) {
-    var element = document.getElementById("listbox");
-    var computedAXNode = await window.getComputedAccessibleNode(element);
-    var computedChild = computedAXNode.lastChild;
+    var parent_element = document.getElementById("listbox");
+    var requestedParentNode = await window.getComputedAccessibleNode(parent_element);
+    var child_element = document.getElementById("option3");
+    var requestedChildNode = await window.getComputedAccessibleNode(child_element);
+
+    var computedChild = requestedParentNode.lastChild;
+    assert_true(computedChild === requestedChildNode);
     assert_false(computedChild === null);
     assert_equals(computedChild.name, "Option 3");
-    // TODO(meredithl): assert_true(computedChild.parent === computedAXNode);
+
+    // Check that a call to non-existent child is null.
+    assert_equals(computedChild.lastChild, null);
 }, "ComputedAccessibleNode.lastChild.");
 
 promise_test(async function(test) {
-    var element = document.getElementById("option2");
-    var computedAXNode = await window.getComputedAccessibleNode(element);
-    var computedSibling = computedAXNode.previousSibling;
+    var middleChild = document.getElementById("option2");
+    var requestedMiddleChildNode = await window.getComputedAccessibleNode(middleChild);
+    var firstBorn = document.getElementById("option1");
+    var requestedFirstBorn = await window.getComputedAccessibleNode(firstBorn)
+
+    var computedSibling = requestedMiddleChildNode.previousSibling;
     assert_false(computedSibling === null);
+    assert_true(computedSibling === requestedFirstBorn);
     assert_equals(computedSibling.name, "Option 1");
 
-    // Check that a call to non-existant sibling is null.
+    // Check that a call to non-existent sibling is null.
     assert_equals(computedSibling.previousSibling, null);
-    // TODO(meredithl): assert_true(computedSibling.nextSibling === computedAXNode);
 }, "ComputedAccessibleNode.previousSibling");
 
 promise_test(async function(test) {
-    var element = document.getElementById("option2");
-    var computedAXNode = await window.getComputedAccessibleNode(element);
-    var computedSibling = computedAXNode.nextSibling;
+    var middleChild = document.getElementById("option2");
+    var requestedMiddleChildNode = await window.getComputedAccessibleNode(middleChild);
+    var youngestChild = document.getElementById("option3");
+    var requestedYoungestNode = await window.getComputedAccessibleNode(youngestChild)
+
+    var computedSibling = requestedMiddleChildNode.nextSibling;
     assert_false(computedSibling === null);
+    assert_true(computedSibling === requestedYoungestNode);
     assert_equals(computedSibling.name, "Option 3");
 
-    // Check that a call to non-existant sibling is null.
+    // Check that a call to non-existent sibling is null.
     assert_equals(computedSibling.nextSibling, null);
-    // TODO(meredithl): assert_true(computedSibling.previousSibling === computedAXNode);
 }, "ComputedAccessibleNode.nextSibling");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/accessibility/aom-computed-string-properties.html b/third_party/WebKit/LayoutTests/accessibility/aom-computed-string-properties.html
index bf82835..2393dfc7 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aom-computed-string-properties.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aom-computed-string-properties.html
@@ -97,3 +97,35 @@
 }, "ComputedAccessibleNode.autocomplete");
 
 </script>
+
+<div role="checkbox" id="group-checkbox" aria-checked="mixed" aria-controls="cond1 cond2" tabindex="0">
+    All condiments
+</div>
+    <ul id="checkboxes">
+      <li>
+        <label>
+          <input type="checkbox" id="cond1"> Lettuce
+        </label>
+      </li>
+      <li>
+        <label>
+          <input type="checkbox" id="cond2" checked=""> Tomato
+        </label>
+      </li>
+</ul>
+
+<script>
+
+promise_test(async function(test) {
+    var groupElement = document.getElementById("group-checkbox");
+    var cond1Element = document.getElementById("cond1");
+    var cond2Element = document.getElementById("cond2");
+
+    var groupCaxNode = await window.getComputedAccessibleNode(groupElement);
+    var cond1CaxNode = await window.getComputedAccessibleNode(cond1Element);
+    var cond2CaxNode = await window.getComputedAccessibleNode(cond2Element);
+    assert_equals(groupCaxNode.checked, "mixed");
+    assert_equals(cond1CaxNode.checked, "false");
+    assert_equals(cond2CaxNode.checked, "true");
+}, "ComputedAccessibleNode.checked.");
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.html
deleted file mode 100644
index f2b62ce..0000000
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
-<!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
-<script>
-// TODO(https://crbug.com/672127) Use this test case to test the rest of
-// characteristic functions.
-'use strict';
-const test_desc = 'Service is removed. Reject with InvalidStateError.';
-const expected = new DOMException('GATT Service no longer exists.',
-    'InvalidStateError');
-let characteristic, fake_peripheral, fake_service;
-
-bluetooth_test(() => getMeasurementIntervalCharacteristic()
-    .then(_ => ({characteristic, fake_peripheral, fake_service} = _))
-    .then(() => fake_service.remove())
-    .then(() => fake_peripheral.simulateGATTServicesChanged())
-    .then(() => assert_promise_rejects_with_message(
-        characteristic.getDescriptors(user_description.name),
-        expected,
-        'Service got removed.')),
-    test_desc);
-
-</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html
similarity index 71%
rename from third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html
index 70eb61cf..bfb4c8d 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 // TODO(https://crbug.com/672127) Use this test case to test the rest of
 // characteristic functions.
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html
similarity index 66%
copy from third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html
copy to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html
index 70eb61cf..de83400b 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 // TODO(https://crbug.com/672127) Use this test case to test the rest of
 // characteristic functions.
@@ -19,7 +19,7 @@
     .then(() => fake_service.remove())
     .then(() => fake_peripheral.simulateGATTServicesChanged())
     .then(() => assert_promise_rejects_with_message(
-        characteristic.getDescriptor(user_description.name),
+        characteristic.getDescriptors(user_description.uuid),
         expected,
         'Service got removed.')),
     test_desc);
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html
similarity index 71%
rename from third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html
index f2b62ce..c9056dd 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 // TODO(https://crbug.com/672127) Use this test case to test the rest of
 // characteristic functions.
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/notifications/service-is-removed.https.html
similarity index 66%
rename from third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/notifications/service-is-removed.https.html
index f9fe695..bf389ce 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/notifications/service-is-removed.https.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service is removed. Reject with InvalidStateError.';
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/readValue/service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/readValue/service-is-removed.https.html
similarity index 66%
rename from third_party/WebKit/LayoutTests/bluetooth/characteristic/readValue/service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/readValue/service-is-removed.https.html
index 77a03b9..48f8127 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/readValue/service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/readValue/service-is-removed.https.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service gets removed. Reject with InvalidStateError.';
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/writeValue/service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/writeValue/service-is-removed.https.html
similarity index 67%
rename from third_party/WebKit/LayoutTests/bluetooth/characteristic/writeValue/service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/writeValue/service-is-removed.https.html
index 4231143..2b43bfb7 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/characteristic/writeValue/service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/characteristic/writeValue/service-is-removed.https.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service gets removed. Reject with InvalidStateError.';
diff --git a/third_party/WebKit/LayoutTests/bluetooth/descriptor/readValue/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/readValue/gen-service-is-removed.https.html
similarity index 68%
rename from third_party/WebKit/LayoutTests/bluetooth/descriptor/readValue/gen-service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/readValue/gen-service-is-removed.https.html
index 594d4e0..e453c80 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/descriptor/readValue/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/readValue/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service gets removed. Reject with InvalidStateError.';
diff --git a/third_party/WebKit/LayoutTests/bluetooth/descriptor/writeValue/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html
similarity index 68%
rename from third_party/WebKit/LayoutTests/bluetooth/descriptor/writeValue/gen-service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html
index d1b97cfe..acd56c3 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/descriptor/writeValue/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service gets removed. Reject with InvalidStateError.';
diff --git a/third_party/WebKit/LayoutTests/bluetooth/script-tests/characteristic/service-is-removed.js b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/characteristic/service-is-removed.js
similarity index 93%
rename from third_party/WebKit/LayoutTests/bluetooth/script-tests/characteristic/service-is-removed.js
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/characteristic/service-is-removed.js
index 5ff44ed..2f58240 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/script-tests/characteristic/service-is-removed.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/characteristic/service-is-removed.js
@@ -13,7 +13,7 @@
     .then(() => assert_promise_rejects_with_message(
         characteristic.CALLS([
           getDescriptor(user_description.name)|
-          getDescriptors(user_description.name)[UUID]|
+          getDescriptors(user_description.uuid)[UUID]|
           getDescriptors(user_description.name)]),
         expected,
         'Service got removed.')),
diff --git a/third_party/WebKit/LayoutTests/bluetooth/script-tests/descriptor/service-is-removed.js b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/descriptor/service-is-removed.js
similarity index 100%
rename from third_party/WebKit/LayoutTests/bluetooth/script-tests/descriptor/service-is-removed.js
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/descriptor/service-is-removed.js
diff --git a/third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/service/service-is-removed.js
similarity index 100%
rename from third_party/WebKit/LayoutTests/bluetooth/script-tests/service/service-is-removed.js
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/script-tests/service/service-is-removed.js
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html
similarity index 69%
rename from third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html
index 4543774..391c49a0 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristic/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service is removed before getCharacteristic call. ' +
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html
similarity index 69%
rename from third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html
index 39bd06a..62caaad 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service is removed before getCharacteristics call. ' +
diff --git a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html
similarity index 69%
rename from third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html
rename to third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html
index bb883772..486812746 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/service/getCharacteristics/gen-service-is-removed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html
@@ -1,10 +1,10 @@
 <!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py -->
 <!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../../resources/testdriver.js"></script>
-<script src="../../../resources/testdriver-vendor.js"></script>
-<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
 <script>
 'use strict';
 const test_desc = 'Service is removed before getCharacteristics call. ' +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align-ref.html
new file mode 100644
index 0000000..15a15b3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
+<p>There should be a hotpink square in the bottom left corner of a larger blue square.</p>
+<div style="width:200px; background:blue;">
+  <div style="height:100px;"></div>
+  <div style="width:100px; height:100px; background:hotpink;"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html
new file mode 100644
index 0000000..232065c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Text-indent on blank line in RTL container with text-align:left</title>
+<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/text.html#propdef-text-indent" title="16.1 Indentation: the 'text-indent' property">
+<link rel="match" href="text-indent-on-blank-line-rtl-left-align-ref.html">
+<p>There should be a hotpink square in the bottom left corner of a larger blue square.</p>
+<div style="text-align:left; direction:rtl; text-indent:300px; line-height:100px; width:200px; background:blue;">
+  <br>
+  <div style="vertical-align:bottom; display:inline-block; width:100px; height:100px; background:hotpink;"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi-ref.html
new file mode 100644
index 0000000..b412b76
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<style>
+.result {
+  background: green;
+  border-radius: 2px;
+  margin: 10px;
+
+  width: 100px;
+  height: 100px;
+}
+</style>
+
+<div class="result"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi.https.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi.https.html
new file mode 100644
index 0000000..5865095
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-multi.https.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#layout-invalidation">
+<link rel="match" href="style-map-multi-ref.html">
+<meta name="assert" content="This test checks that properties are correctly given to the layout function." />
+
+<style>
+.test {
+  background: red;
+  margin: 10px;
+  width: 100px;
+
+  /* Properties under test. */
+  --foo: bar;
+  border-radius: 2px;
+}
+
+@supports (display: layout(test)) {
+  .test {
+    background: green;
+    display: layout(test);
+  }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test"></div>
+
+<script id="code" type="text/worklet">
+registerLayout('test', class {
+  static get inputProperties() {
+    return [ '--bar', '--foo', 'align-items', 'border-top-left-radius'];
+  }
+
+  *intrinsicSizes() {}
+  *layout(children, edges, constraints, styleMap) {
+    const expected = [
+      {property: '--bar', value: '[CSSUnparsedValue=]'},
+      {property: '--foo', value: '[CSSUnparsedValue= bar]'},
+      {property: 'align-items', value: '[CSSKeywordValue=normal]'},
+      {property: 'border-top-left-radius', value: '[CSSUnitValue=2px]'},
+    ];
+
+    const actual = Array.from(styleMap.keys()).sort().map((property) => {
+      const valueObject = styleMap.get(property);
+      const value = '[' + valueObject.constructor.name + '=' + valueObject.toString() + ']';
+      return {property, value};
+    });
+
+    if (expected.length != actual.length)
+      return {autoBlockSize: 0};
+
+    for (let i = 0; i < expected.length; i++) {
+      if (expected[i].property != actual[i].property)
+        return {autoBlockSize: 0};
+
+      if (expected[i].value != actual[i].value)
+        return {autoBlockSize: 0};
+    }
+
+    return {autoBlockSize: 100};
+  }
+});
+</script>
+
+<script>
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, document.getElementById('code').textContent);
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-ref.html
new file mode 100644
index 0000000..acbd417
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<style>
+.result {
+  background: green;
+  border-radius: 2px;
+  margin: 10px;
+
+  width: 100px;
+  height: 100px;
+}
+</style>
+
+<div class="result"></div>
+<div class="result"></div>
+<div class="result"></div>
+<div class="result"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map.https.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map.https.html
new file mode 100644
index 0000000..7eb2e6a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-layout-api/style-map.https.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#layout-invalidation">
+<link rel="match" href="style-map-ref.html">
+<meta name="assert" content="This test checks that properties are correctly given to the layout function." />
+
+<style>
+.test {
+  background: red;
+  margin: 10px;
+  width: 100px;
+
+  /* Properties under test. */
+  --foo: bar;
+  border-radius: 2px;
+}
+
+@supports (display: layout(test)) {
+  .test {
+    background: green;
+  }
+
+  .test-0 { display: layout(test-0); }
+  .test-1 { display: layout(test-1); }
+  .test-2 { display: layout(test-2); }
+  .test-3 { display: layout(test-3); }
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+
+<div class="test test-0"></div>
+<div class="test test-1"></div>
+<div class="test test-2"></div>
+<div class="test test-3"></div>
+
+<script>
+const tmpl = (test, idx) => {
+  return `
+    registerLayout('test-${idx}', class {
+      static get inputProperties() { return ['${test.property}']; }
+
+      *intrinsicSizes() {}
+      *layout(children, edges, constraints, styleMap) {
+        const value = styleMap.get('${test.property}');
+        const result = '[' + value.constructor.name + '=' + value.toString() + ']';
+        if (result != '${test.expected}')
+          return {autoBlockSize: 0};
+
+        const size = Array.from(styleMap.keys()).length;
+        if (size != 1)
+          return {autoBlockSize: 0};
+
+        return {autoBlockSize: 100};
+      }
+    });
+  `;
+}
+
+const tests = [
+  {property: '--bar', expected: '[CSSUnparsedValue=]'},
+  {property: '--foo', expected: '[CSSUnparsedValue= bar]'},
+  {property: 'align-items', expected: '[CSSKeywordValue=normal]'},
+  {property: 'border-top-left-radius', expected: '[CSSUnitValue=2px]'},
+];
+
+const workletSource = tests.map(tmpl).join('\n');
+
+importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, workletSource);
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-timing/cubic-bezier-timing-functions-output-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-timing/cubic-bezier-timing-functions-output-expected.txt
index 230202dc..8e41c9c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-timing/cubic-bezier-timing-functions-output-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-timing/cubic-bezier-timing-functions-output-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-FAIL cubic-bezier easing with input progress greater than 1 Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
-FAIL cubic-bezier easing with input progress greater than 1 and where the tangent on the upper boundary is infinity Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
-FAIL cubic-bezier easing with input progress less than 0 Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
-FAIL cubic-bezier easing with input progress less than 0 and where the tangent on the lower boundary is infinity Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
+FAIL cubic-bezier easing with input progress greater than 1 assert_approx_equals: The left of the animation should be approximately 98.8706654939602 at 230ms expected 98.8706654939602 +/- 0.01 but got 98.3585
+FAIL cubic-bezier easing with input progress greater than 1 and where the tangent on the upper boundary is infinity assert_approx_equals: The left of the animation should be approximately 106.31755608768113 at 230ms expected 106.31755608768113 +/- 0.01 but got 107.559
+FAIL cubic-bezier easing with input progress less than 0 assert_approx_equals: The left of the animation should be approximately -16.589193103032184 at 10ms expected -16.589193103032184 +/- 0.01 but got -18.0387
+FAIL cubic-bezier easing with input progress less than 0 and where the tangent on the lower boundary is infinity assert_approx_equals: The left of the animation should be approximately -6.317556087681108 at 770ms expected -6.317556087681108 +/- 0.01 but got -7.55879
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/interfaces-expected.txt
index 74ca24c..eaa495c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/interfaces-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 237 tests; 226 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 243 tests; 233 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS CSS Typed OM IDL test
 PASS CSSStyleValue interface: existence and properties of interface object
 PASS CSSStyleValue interface object length
@@ -14,18 +14,24 @@
 PASS StylePropertyMapReadOnly interface object name
 PASS StylePropertyMapReadOnly interface: existence and properties of interface prototype object
 PASS StylePropertyMapReadOnly interface: existence and properties of interface prototype object's "constructor" property
+PASS Testing Symbol.iterator property of iterable interface StylePropertyMapReadOnly
+PASS Testing pair iterable interface StylePropertyMapReadOnly
 PASS StylePropertyMapReadOnly interface: operation get(DOMString)
 PASS StylePropertyMapReadOnly interface: operation getAll(DOMString)
 PASS StylePropertyMapReadOnly interface: operation has(DOMString)
-FAIL StylePropertyMapReadOnly interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS StylePropertyMapReadOnly interface: attribute size
+PASS StylePropertyMapReadOnly interface: operation entries()
+PASS StylePropertyMapReadOnly interface: operation keys()
+PASS StylePropertyMapReadOnly interface: operation values()
+PASS StylePropertyMapReadOnly interface: operation forEach(function, any)
 PASS StylePropertyMap interface: existence and properties of interface object
 PASS StylePropertyMap interface object length
 PASS StylePropertyMap interface object name
 PASS StylePropertyMap interface: existence and properties of interface prototype object
 PASS StylePropertyMap interface: existence and properties of interface prototype object's "constructor" property
+PASS StylePropertyMap interface: operation set(DOMString, [object Object],[object Object])
 PASS StylePropertyMap interface: operation append(DOMString, [object Object],[object Object])
 PASS StylePropertyMap interface: operation delete(DOMString)
-PASS StylePropertyMap interface: operation set(DOMString, [object Object],[object Object])
 PASS StylePropertyMap interface: operation clear()
 PASS CSSUnparsedValue interface: existence and properties of interface object
 PASS CSSUnparsedValue interface object length
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
index e729acf6..7e981567 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
@@ -21,6 +21,16 @@
 }, 'CSSVariableReferenceValue can be constructed with no fallback');
 
 test(() => {
+  const result = new CSSVariableReferenceValue('--foo', null);
+
+  assert_not_equals(result, null,
+      'A CSSVariableReferenceValue should be created');
+  assert_equals(result.variable, '--foo',
+      'Variable member should be same as passed in the constructor');
+  assert_equals(result.fallback, null, 'Fallback member should be null');
+}, 'CSSVariableReferenceValue can be constructed with null fallback');
+
+test(() => {
   const result = new CSSVariableReferenceValue('--foo',
       new CSSUnparsedValue(['lemon']));
 
@@ -32,7 +42,7 @@
       'Fallback member should not be null');
   assert_style_value_equals(result.fallback, new CSSUnparsedValue(['lemon']),
       'Fallback member should be as same as passed in the constructor');
-}, 'CSSVariableReferenceValue can be constructed with fallback');
+}, 'CSSVariableReferenceValue can be constructed with valid fallback');
 
 test(() => {
   let result = new CSSVariableReferenceValue('--foo');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
index 4006b20..d254084 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
@@ -24,7 +24,7 @@
 
 test(t => {
   const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
-  assert_style_value_equals(findInStyleMap(styleMap, 'width'), CSS.px(10));
+  assert_style_value_array_equals(findInStyleMap(styleMap, 'width'), [CSS.px(10)]);
 }, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
 
 test(t => {
@@ -34,9 +34,9 @@
 
 test(t => {
   const styleMap = createComputedStyleMap(t, '--A: A; --C: C; color: red; --B: B;');
-  assert_style_value_equals(findInStyleMap(styleMap, '--A'), new CSSUnparsedValue([' A']));
-  assert_style_value_equals(findInStyleMap(styleMap, '--B'), new CSSUnparsedValue([' B']));
-  assert_style_value_equals(findInStyleMap(styleMap, '--C'), new CSSUnparsedValue([' C']));
+  assert_style_value_array_equals(findInStyleMap(styleMap, '--A'), [new CSSUnparsedValue([' A'])]);
+  assert_style_value_array_equals(findInStyleMap(styleMap, '--B'), [new CSSUnparsedValue([' B'])]);
+  assert_style_value_array_equals(findInStyleMap(styleMap, '--C'), [new CSSUnparsedValue([' C'])]);
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
index 0609010..f96496b0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
@@ -25,7 +25,8 @@
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['height', 'width']);
-  assert_style_value_array_equals(values, [CSS.px(5), CSS.px(10)]);
+  assert_style_value_array_equals(values[0], [CSS.px(5)]);
+  assert_style_value_array_equals(values[1], [CSS.px(10)]);
 }, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
 
 test(t => {
@@ -41,11 +42,9 @@
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['--A', '--B', '--C']);
-  assert_style_value_array_equals(values, [
-    new CSSUnparsedValue([' A']),
-    new CSSUnparsedValue([' B']),
-    new CSSUnparsedValue([' C']),
-  ])
+  assert_style_value_array_equals(values[0], [new CSSUnparsedValue([' A'])]);
+  assert_style_value_array_equals(values[1], [new CSSUnparsedValue([' B'])]);
+  assert_style_value_array_equals(values[2], [new CSSUnparsedValue([' C'])]);
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
index ebd1df7..08dc11e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
@@ -25,7 +25,8 @@
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['height', 'width']);
-  assert_style_value_array_equals(values, [CSS.px(5), CSS.px(10)]);
+  assert_style_value_array_equals(values[0], [CSS.px(5)]);
+  assert_style_value_array_equals(values[1], [CSS.px(10)]);
 }, 'StylePropertyMap iterator returns CSS properties with the correct CSSStyleValue');
 
 test(t => {
@@ -41,11 +42,9 @@
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['--A', '--B', '--C']);
-  assert_style_value_array_equals(values, [
-    new CSSUnparsedValue([' A']),
-    new CSSUnparsedValue([' B']),
-    new CSSUnparsedValue([' C']),
-  ])
+  assert_style_value_array_equals(values[0], [new CSSUnparsedValue([' A'])]);
+  assert_style_value_array_equals(values[1], [new CSSUnparsedValue([' B'])]);
+  assert_style_value_array_equals(values[2], [new CSSUnparsedValue([' C'])]);
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/opacity.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/opacity.html
new file mode 100644
index 0000000..8c9ff189
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/opacity.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>'opacity' property</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<script src="resources/testsuite.js"></script>
+<body>
+<div id="log"></div>
+<script>
+'use strict';
+
+function assert_is_equal_with_clamping(input, result) {
+  const number = input.to('number');
+
+  if (number.value < 0)
+    assert_style_value_equals(result, new CSSUnitValue(0, 'number'));
+  else if (number.value > 1)
+    assert_style_value_equals(result, new CSSUnitValue(1, 'number'));
+  else
+    assert_style_value_equals(result, input);
+}
+
+runPropertyTests('opacity', [
+  {
+    syntax: '<number>',
+    computed: assert_is_equal_with_clamping
+  },
+]);
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js
index d1abedf..d75a0d86 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js
@@ -111,6 +111,31 @@
       }
     ],
   },
+  '<number>': {
+    description: 'a number',
+    examples: [
+      {
+        description: 'the number zero',
+        input: new CSSUnitValue(0, 'number')
+      },
+      {
+        description: 'a negative number',
+        input: new CSSUnitValue(-3.14, 'number')
+      },
+      {
+        description: 'a positive number',
+        input: new CSSUnitValue(3.14, 'number')
+      },
+      {
+        description: "a calc number",
+        input: new CSSMathSum(new CSSUnitValue(2, 'number'), new CSSUnitValue(3, 'number')),
+        defaultSpecified: (_, result) => assert_is_calc_sum(result),
+        defaultComputed: (_, result) => {
+          assert_style_value_equals(result, new CSSUnitValue(5, 'number'));
+        }
+      }
+    ],
+  },
   '<position>': {
     description: 'a position',
     examples: [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-expected.txt
index 242f29c..f31aba3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/transform-expected.txt
@@ -5,6 +5,7 @@
 PASS Setting 'transform' to a length throws TypeError
 PASS Setting 'transform' to a percent throws TypeError
 PASS Setting 'transform' to a time throws TypeError
+PASS Setting 'transform' to a number throws TypeError
 PASS Setting 'transform' to a position throws TypeError
 PASS Setting 'transform' to an image throws TypeError
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-typed-om.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-typed-om.idl
index bbe1dca..d6d4b00d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-typed-om.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-typed-om.idl
@@ -7,37 +7,31 @@
 
 [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
 interface StylePropertyMapReadOnly {
-    readonly maplike<DOMString, sequence<CSSStyleValue>>;
+    iterable<DOMString, sequence<CSSStyleValue>>;
     any get(DOMString property);
     /* 'any' means (undefined or CSSStyleValue) here,
        see https://github.com/heycam/webidl/issues/60 */
     sequence<CSSStyleValue> getAll(DOMString property);
     boolean has(DOMString property);
-    stringifier;
+    readonly attribute long size;
 };
 
-callback UpdateFunction = CSSStyleValue (CSSStyleValue oldValue);
-
 [Exposed=Window]
 interface StylePropertyMap : StylePropertyMapReadOnly {
-    maplike<DOMString, sequence<CSSStyleValue>>;
+    void set(DOMString property, (CSSStyleValue or DOMString)... values);
     void append(DOMString property, (CSSStyleValue or DOMString)... values);
     void delete(DOMString property);
-    void set(DOMString property, (CSSStyleValue or DOMString)... values);
     void clear();
 };
 
-[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
 partial interface Element {
     StylePropertyMapReadOnly computedStyleMap();
 };
 
-[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
 partial interface CSSStyleRule {
     [SameObject] readonly attribute StylePropertyMap styleMap;
 };
 
-[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
 partial interface ElementCSSInlineStyle {
     [SameObject] readonly attribute StylePropertyMap attributeStyleMap;
 };
@@ -54,7 +48,7 @@
 typedef (DOMString or CSSVariableReferenceValue) CSSUnparsedSegment;
 
 [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet),
- Constructor(DOMString variable, optional CSSUnparsedValue fallback)]
+ Constructor(DOMString variable, optional CSSUnparsedValue? fallback)]
 interface CSSVariableReferenceValue {
     attribute DOMString variable;
     readonly attribute CSSUnparsedValue? fallback;
@@ -66,8 +60,6 @@
     attribute DOMString value;
 };
 
-typedef (DOMString or CSSKeywordValue) CSSKeywordish;
-
 typedef (double or CSSNumericValue) CSSNumberish;
 
 enum CSSNumericBaseType {
@@ -306,7 +298,7 @@
 };
 
 dictionary CSSMatrixComponentOptions {
-    boolean is2D = false;
+    boolean is2D;
 };
 
 [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet),
diff --git a/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html b/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html
new file mode 100644
index 0000000..0a364b2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/preload/issues/120">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/preload/resources/preload_helper.js"></script>
+<script>
+    var t = async_test('Makes sure that Link headers preload images with (experimental) srcset/imgsizes attributes.');
+</script>
+<body>
+<script src="resources/dummy.js?pipe=trickle(d3)&link-header-preload-srcset"></script>
+<script>
+    window.addEventListener("load", t.step_func(function() {
+        verifyPreloadAndRTSupport();
+        verifyNumberOfDownloads('resources/square.png?1x', 1);
+        verifyNumberOfDownloads('resources/square.png?2x', 0);
+        verifyNumberOfDownloads('resources/square.png?3x', 0);
+        verifyNumberOfDownloads('resources/square.png?base', 0);
+        verifyNumberOfDownloads('resources/square.png?200', 0);
+        verifyNumberOfDownloads('resources/square.png?400', 1);
+        verifyNumberOfDownloads('resources/square.png?800', 0);
+        verifyNumberOfDownloads('resources/square.png?150', 0);
+        verifyNumberOfDownloads('resources/square.png?300', 1);
+        verifyNumberOfDownloads('resources/square.png?600', 0);
+        t.done();
+    }));
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html.headers b/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html.headers
new file mode 100644
index 0000000..b29f725
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/preload/link-header-preload-srcset.html.headers
@@ -0,0 +1,3 @@
+Link: <resources/square.png?1x>; rel=preload; as=image; srcset="resources/square.png?2x 2x, resources/square.png?3x 3x"
+Link: <resources/square.png?base>; rel=preload; as=image; srcset="resources/square.png?200 200w, resources/square.png?400 400w, resources/square.png?800 800w"; imgsizes=400px
+Link: <resources/square.png?base>; rel=preload; as=image; srcset="resources/square.png?150 150w, resources/square.png?300 300w, resources/square.png?600 600w"; imgsizes="(min-width: 300px) 300px, 150px"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/multipart-image.py b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/multipart-image.py
index 53b77aeb..f94ee1c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/multipart-image.py
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/multipart-image.py
@@ -18,6 +18,6 @@
         headers.append(('Access-Control-Allow-Origin', '*'))
 
     image_path = os.path.join(request.doc_root, 'images')
-    body = create_part(os.path.join(image_path, 'green-1x1.png'))
+    body = create_part(os.path.join(image_path, 'red.png'))
     body = body + create_part(os.path.join(image_path, 'red-16x16.png'))
     return headers, body
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/keyframe-effects/effect-value-context-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/keyframe-effects/effect-value-context-expected.txt
index 8ba97961..7f5431b6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/keyframe-effects/effect-value-context-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/keyframe-effects/effect-value-context-expected.txt
@@ -3,6 +3,6 @@
 PASS Effect values reflect changes to font-size on parent element
 PASS Effect values reflect changes to font-size when computed style is not immediately flushed
 PASS Effect values reflect changes to font-size from reparenting
-FAIL Effect values reflect changes to target element assert_equals: Effect value after updating target element expected "300px" but got "0px"
+FAIL Effect values reflect changes to target element Cannot assign to read only property 'target' of object '#<KeyframeEffect>'
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
index 691a5f7..c4d673e4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
@@ -119,7 +119,7 @@
 PASS Element.animate() correctly sets the Animation's timeline
 PASS Element.animate() correctly sets the Animation's timeline when triggered on an element in a different document
 FAIL Element.animate() calls play on the Animation assert_equals: expected "running" but got "pending"
-FAIL CSSPseudoElement.animate() creates an Animation object Cannot read property 'parentElement' of undefined
-FAIL CSSPseudoElement.animate() creates an Animation object targeting to the correct CSSPseudoElement object Cannot read property 'parentElement' of undefined
+FAIL CSSPseudoElement.animate() creates an Animation object assert_equals: expected Element node <div class="pseudo"></div> but got null
+FAIL CSSPseudoElement.animate() creates an Animation object targeting to the correct CSSPseudoElement object assert_equals: expected Element node <div class="pseudo"></div> but got null
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
index ada7232..131b57c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 167 tests; 153 PASS, 14 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 167 tests; 154 PASS, 13 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS A KeyframeEffectReadOnly can be constructed with no frames
 PASS easing values are parsed correctly when passed to the KeyframeEffectReadOnly constructor in KeyframeEffectOptions
 PASS Invalid easing values are correctly rejected when passed to the KeyframeEffectReadOnly constructor in KeyframeEffectOptions
@@ -165,7 +165,7 @@
 PASS Invalid KeyframeEffectReadOnly option by an 'inherit' easing
 PASS Invalid KeyframeEffectReadOnly option by a variable easing
 PASS Invalid KeyframeEffectReadOnly option by a multi-value easing
-FAIL A KeyframeEffectReadOnly constructed with null target assert_equals: Effect created with null target has correct target expected (object) null but got (undefined) undefined
+PASS A KeyframeEffectReadOnly constructed with null target
 FAIL KeyframeEffect constructor propagates exceptions generated by accessing the options object assert_throws: function "() => {
     new KeyframeEffect(target, { get left() { throw test_error }})
   }" did not throw
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
index cb3eb87..c9b30089 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/idlharness-expected.txt
@@ -11,13 +11,13 @@
 PASS KeyframeEffectReadOnly interface object name
 PASS KeyframeEffectReadOnly interface: existence and properties of interface prototype object
 PASS KeyframeEffectReadOnly interface: existence and properties of interface prototype object's "constructor" property
-FAIL KeyframeEffectReadOnly interface: attribute target assert_true: The prototype object must have a property "target" expected true got false
+PASS KeyframeEffectReadOnly interface: attribute target
 FAIL KeyframeEffectReadOnly interface: attribute iterationComposite assert_true: The prototype object must have a property "iterationComposite" expected true got false
 PASS KeyframeEffectReadOnly interface: attribute composite
 PASS KeyframeEffectReadOnly interface: operation getKeyframes()
 PASS KeyframeEffectReadOnly must be primary interface of new KeyframeEffectReadOnly(null, null)
 PASS Stringification of new KeyframeEffectReadOnly(null, null)
-FAIL KeyframeEffectReadOnly interface: new KeyframeEffectReadOnly(null, null) must inherit property "target" with the proper type assert_inherits: property "target" not found in prototype chain
+PASS KeyframeEffectReadOnly interface: new KeyframeEffectReadOnly(null, null) must inherit property "target" with the proper type
 FAIL KeyframeEffectReadOnly interface: new KeyframeEffectReadOnly(null, null) must inherit property "iterationComposite" with the proper type assert_inherits: property "iterationComposite" not found in prototype chain
 PASS KeyframeEffectReadOnly interface: new KeyframeEffectReadOnly(null, null) must inherit property "composite" with the proper type
 PASS KeyframeEffectReadOnly interface: new KeyframeEffectReadOnly(null, null) must inherit property "getKeyframes()" with the proper type
@@ -28,18 +28,18 @@
 PASS KeyframeEffect interface object name
 PASS KeyframeEffect interface: existence and properties of interface prototype object
 PASS KeyframeEffect interface: existence and properties of interface prototype object's "constructor" property
-FAIL KeyframeEffect interface: attribute target assert_true: The prototype object must have a property "target" expected true got false
+FAIL KeyframeEffect interface: attribute target assert_own_property: expected property "target" missing
 FAIL KeyframeEffect interface: attribute iterationComposite assert_true: The prototype object must have a property "iterationComposite" expected true got false
 PASS KeyframeEffect interface: attribute composite
 FAIL KeyframeEffect interface: operation setKeyframes(object) assert_own_property: interface prototype object missing non-static operation expected property "setKeyframes" missing
 PASS KeyframeEffect must be primary interface of new KeyframeEffect(null, null)
 PASS Stringification of new KeyframeEffect(null, null)
-FAIL KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type assert_inherits: property "target" not found in prototype chain
+PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type
 FAIL KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "iterationComposite" with the proper type assert_inherits: property "iterationComposite" not found in prototype chain
 PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "composite" with the proper type
 FAIL KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "setKeyframes(object)" with the proper type assert_inherits: property "setKeyframes" not found in prototype chain
 FAIL KeyframeEffect interface: calling setKeyframes(object) on new KeyframeEffect(null, null) with too few arguments must throw TypeError assert_inherits: property "setKeyframes" not found in prototype chain
-FAIL KeyframeEffectReadOnly interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type assert_inherits: property "target" not found in prototype chain
+PASS KeyframeEffectReadOnly interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type
 FAIL KeyframeEffectReadOnly interface: new KeyframeEffect(null, null) must inherit property "iterationComposite" with the proper type assert_inherits: property "iterationComposite" not found in prototype chain
 PASS KeyframeEffectReadOnly interface: new KeyframeEffect(null, null) must inherit property "composite" with the proper type
 PASS KeyframeEffectReadOnly interface: new KeyframeEffect(null, null) must inherit property "getKeyframes()" with the proper type
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/target-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/target-expected.txt
index dfebb2e5..c4f3a0c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/target-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/target-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-FAIL Test setting target before constructing the associated animation assert_equals: Value at 50% progress expected "50px" but got "0px"
-FAIL Test setting target from null to a valid target assert_equals: Value at 50% progress after setting new target expected "50px" but got "10px"
-FAIL Test setting target from a valid target to null assert_equals: Value after clearing the target expected "10px" but got "50px"
-FAIL Test setting target from a valid target to another target assert_equals: Value of 1st element (currently not targeted) after changing the effect target expected "10px" but got "50px"
+FAIL Test setting target before constructing the associated animation Cannot assign to read only property 'target' of object '#<KeyframeEffect>'
+FAIL Test setting target from null to a valid target Cannot assign to read only property 'target' of object '#<KeyframeEffect>'
+FAIL Test setting target from a valid target to null Cannot assign to read only property 'target' of object '#<KeyframeEffect>'
+FAIL Test setting target from a valid target to another target Cannot assign to read only property 'target' of object '#<KeyframeEffect>'
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/constructor-expected.txt
new file mode 100644
index 0000000..087efc5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/constructor-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+FAIL VTTCue(), initial values assert_equals: expected (string) "start" but got (undefined) undefined
+PASS VTTCue(), bad start time
+PASS VTTCue(), bad end time
+PASS VTTCue(), text formatting
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/lineAlign-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/lineAlign-expected.txt
new file mode 100644
index 0000000..e3cb95f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/lineAlign-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL VTTCue.lineAlign, script-created cue assert_true: lineAlign is not supported expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/positionAlign-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/positionAlign-expected.txt
new file mode 100644
index 0000000..83c37d8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/VTTCue/positionAlign-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL VTTCue.positionAlign, script-created cue assert_true: positionAlign is not supported expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
new file mode 100644
index 0000000..8c1f604c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
@@ -0,0 +1,56 @@
+This is a testharness.js-based test.
+Found 52 tests; 48 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS VTTCue interface: existence and properties of interface object
+PASS VTTCue interface object length
+PASS VTTCue interface object name
+PASS VTTCue interface: existence and properties of interface prototype object
+PASS VTTCue interface: existence and properties of interface prototype object's "constructor" property
+PASS VTTCue interface: attribute region
+PASS VTTCue interface: attribute vertical
+PASS VTTCue interface: attribute snapToLines
+PASS VTTCue interface: attribute line
+FAIL VTTCue interface: attribute lineAlign assert_true: The prototype object must have a property "lineAlign" expected true got false
+PASS VTTCue interface: attribute position
+FAIL VTTCue interface: attribute positionAlign assert_true: The prototype object must have a property "positionAlign" expected true got false
+PASS VTTCue interface: attribute size
+PASS VTTCue interface: attribute align
+PASS VTTCue interface: attribute text
+PASS VTTCue interface: operation getCueAsHTML()
+PASS VTTCue must be primary interface of new VTTCue(0, 0, "")
+PASS Stringification of new VTTCue(0, 0, "")
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type
+FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type assert_inherits: property "lineAlign" not found in prototype chain
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type
+FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type assert_inherits: property "positionAlign" not found in prototype chain
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML()" with the proper type
+PASS VTTRegion interface: existence and properties of interface object
+PASS VTTRegion interface object length
+PASS VTTRegion interface object name
+PASS VTTRegion interface: existence and properties of interface prototype object
+PASS VTTRegion interface: existence and properties of interface prototype object's "constructor" property
+PASS VTTRegion interface: attribute id
+PASS VTTRegion interface: attribute width
+PASS VTTRegion interface: attribute lines
+PASS VTTRegion interface: attribute regionAnchorX
+PASS VTTRegion interface: attribute regionAnchorY
+PASS VTTRegion interface: attribute viewportAnchorX
+PASS VTTRegion interface: attribute viewportAnchorY
+PASS VTTRegion interface: attribute scroll
+PASS VTTRegion must be primary interface of new VTTRegion()
+PASS Stringification of new VTTRegion()
+PASS VTTRegion interface: new VTTRegion() must inherit property "id" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type
+PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/parsing/file-parsing/tests/settings-position-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/parsing/file-parsing/tests/settings-position-expected.txt
new file mode 100644
index 0000000..124ce22
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/parsing/file-parsing/tests/settings-position-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL settings, position assert_equals: Failed with cue 0 expected (string) "auto" but got (undefined) undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center-ref.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center-ref.html
deleted file mode 100644
index 29cb32a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<style>
-.container {
-    position: relative;
-    display: inline-block;
-    width: 320px;
-    height: 240px;
-}
-.cue {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    overflow: hidden;
-}
-.cue.center {
-    text-align: center;
-}
-.cue > span {
-    font-family: sans-serif;
-    background: green;
-    color: green;
-    font-size: 50px;
-    padding: 2px;
-}
-</style>
-<div class="container">
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-    <source src="/media/white.webm" type="video/webm">
-    <source src="/media/white.mp4" type="video/mp4">
-</video>
-<div class="cue center"><span>&#x5d0;&#x5d1;&#x5d2;</span></div>
-</div>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center.html
deleted file mode 100644
index 05f4244d..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-center.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<link rel="match" href="track-cue-rendering-position-align-rtl-center-ref.html">
-<script>
-function addTrackWithRtlCueData(video, cueData) {
-  var track = video.addTextTrack('subtitles');
-  var cue = new VTTCue(0, 10, '\u05d0\u05d1\u05d2');
-  for (var prop in cueData)
-    cue[prop] = cueData[prop];
-  track.addCue(cue);
-  track.mode = 'showing';
-}
-</script>
-<style>
-video::cue {
-  font-size: 50px;
-  color: green;
-  background-color: green;
-}
-</style>
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-  <source src="/media/white.webm" type="video/webm">
-  <source src="/media/white.mp4" type="video/mp4">
-  <script>
-  var video = document.currentScript.parentNode;
-  addTrackWithRtlCueData(video, { position: 50, positionAlign: 'center', align: 'center', size: 50, line: 0 });
-  </script>
-</video>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left-ref.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left-ref.html
deleted file mode 100644
index 42ae433..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<style>
-.container {
-    position: relative;
-    display: inline-block;
-    width: 320px;
-    height: 240px;
-}
-.cue {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    overflow: hidden;
-}
-.cue.start {
-    text-align: end;
-}
-.cue > span {
-    font-family: sans-serif;
-    background: green;
-    color: green;
-    font-size: 50px;
-    padding: 2px;
-}
-</style>
-<div class="container">
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-    <source src="/media/white.webm" type="video/webm">
-    <source src="/media/white.mp4" type="video/mp4">
-</video>
-<div class="cue start"><span>&#x5d0;&#x5d1;&#x5d2;</span></div>
-</div>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left.html
deleted file mode 100644
index 7433d9f..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-left.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<link rel="match" href="track-cue-rendering-position-align-rtl-line-left-ref.html">
-<script>
-function addTrackWithRtlCueData(video, cueData) {
-  var track = video.addTextTrack('subtitles');
-  var cue = new VTTCue(0, 10, '\u05d0\u05d1\u05d2');
-  for (var prop in cueData)
-    cue[prop] = cueData[prop];
-  track.addCue(cue);
-  track.mode = 'showing';
-}
-</script>
-<style>
-video::cue {
-  font-size: 50px;
-  color: green;
-  background-color: green;
-}
-</style>
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-  <source src="/media/white.webm" type="video/webm">
-  <source src="/media/white.mp4" type="video/mp4">
-  <script>
-  var video = document.currentScript.parentNode;
-  addTrackWithRtlCueData(video, { position: 50, positionAlign: 'line-left', align: 'start', size: 50, line: 0 });
-  </script>
-</video>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right-ref.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right-ref.html
deleted file mode 100644
index 374cbdf0..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<style>
-.container {
-    position: relative;
-    display: inline-block;
-    width: 320px;
-    height: 240px;
-}
-.cue {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-    overflow: hidden;
-}
-.cue.end {
-    text-align: start;
-}
-.cue > span {
-    font-family: sans-serif;
-    background: green;
-    color: green;
-    font-size: 50px;
-    padding: 2px;
-}
-</style>
-<div class="container">
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-    <source src="/media/white.webm" type="video/webm">
-    <source src="/media/white.mp4" type="video/mp4">
-</video>
-<div class="cue end"><span>&#x5d0;&#x5d1;&#x5d2;</span></div>
-</div>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right.html b/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right.html
deleted file mode 100644
index b0a0d74..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/rendering/cues-with-video/processing-model/track-cue-rendering-position-align-rtl-line-right.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<script src="/common/reftest-wait.js"></script>
-<link rel="match" href="track-cue-rendering-position-align-rtl-line-right-ref.html">
-<script>
-function addTrackWithRtlCueData(video, cueData) {
-  var track = video.addTextTrack('subtitles');
-  var cue = new VTTCue(0, 10, '\u05d0\u05d1\u05d2');
-  for (var prop in cueData)
-    cue[prop] = cueData[prop];
-  track.addCue(cue);
-  track.mode = 'showing';
-}
-</script>
-<style>
-video::cue {
-  font-size: 50px;
-  color: green;
-  background-color: green;
-}
-</style>
-<video width="320" height="240" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
-  <source src="/media/white.webm" type="video/webm">
-  <source src="/media/white.mp4" type="video/mp4">
-  <script>
-  var video = document.currentScript.parentNode;
-  addTrackWithRtlCueData(video, { position: 50, positionAlign: 'line-right', align: 'end', size: 50, line: 0 });
-  </script>
-</video>
-</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable-expected.txt
index a4b33c1..e8fb3b2 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable-expected.txt
@@ -5,6 +5,7 @@
 
 PASS Object.getOwnPropertyDescriptor(window, "innerHeight").set is an instance of Function
 PASS window.innerHeight is 42
+PASS window.event is "foo"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable.html b/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable.html
index c36434c..656f8d3 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/replaceable.html
@@ -10,4 +10,11 @@
 window.innerHeight = 42;
 shouldBe('window.innerHeight', '42');
 
+var element = document.createElement("a");
+element.onclick = function() {
+  window.event = "foo";
+};
+element.click();
+shouldBeEqualToString('window.event', "foo");
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/fast/filesystem/resources/file-writer-sync-write-overlapped.js b/third_party/WebKit/LayoutTests/fast/filesystem/resources/file-writer-sync-write-overlapped.js
index 246c934..488aac75 100644
--- a/third_party/WebKit/LayoutTests/fast/filesystem/resources/file-writer-sync-write-overlapped.js
+++ b/third_party/WebKit/LayoutTests/fast/filesystem/resources/file-writer-sync-write-overlapped.js
@@ -29,9 +29,8 @@
 // Verify the contents.
 assert(writer.length == 2 * testData.length + extensionOffset);
 assert(writer.position == writer.length);
-var file = entry.file();
 var reader = new FileReaderSync();
-var contents = reader.readAsBinaryString(file);
+var contents = reader.readAsBinaryString(entry.file());
 var i;
 for (i = 0; i < testData.length + extensionOffset; ++i)
     assert(contents.charCodeAt(i) == testData.charCodeAt(i));
@@ -56,7 +55,7 @@
 assert(writer.position == writer.length);
 
 // Verify the contents.
-contents = reader.readAsBinaryString(file);
+contents = reader.readAsBinaryString(entry.file());
 for (i = 0; i < extensionOffset; ++i)
     assert(contents.charCodeAt(i) == testData.charCodeAt(i));
 for (j = 0; i < writer.length; ++i, ++j)
@@ -80,7 +79,7 @@
 assert(writer.position == testData.length + extensionOffset);
 
 // Verify the contents.
-contents = reader.readAsBinaryString(file);
+contents = reader.readAsBinaryString(entry.file());
 for (i = 0; i < extensionOffset; ++i)
     assert(contents.charCodeAt(i) == testData.charCodeAt(i));
 for (j = 0; i < testData.length + extensionOffset; ++i, ++j)
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.png
index d8a5eba7..c0a528f22 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/classification/list_style_position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.png
index f849ec4..5e6d454 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/color_and_background/background_color-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_decoration-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_decoration-expected.png
index f631221..21412a0d 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_decoration-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_decoration-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png
index 49253f2..3e07eb1 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
index 9cc4adf..39e57b6 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.txt
index 2d4a259e..d5444fa 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.txt
@@ -17,7 +17,7 @@
             text run at (0,20) width 163: "should be a teal box. \x{21E8} "
           LayoutInline {SPAN} at (0,0) size 588x259 [color=#000080]
             LayoutText {#text} at (162,20) size 588x259
-              text run at (162,20) width 116: "FAIL FAIL FAIL"
+              text run at (162,20) width 115: "FAIL FAIL FAIL"
               text run at (0,40) width 277: "FAIL FAIL FAIL FAIL FAIL FAIL FAIL"
               text run at (0,60) width 277: "FAIL FAIL FAIL FAIL FAIL FAIL FAIL"
               text run at (0,80) width 588: "FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-00-d-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-00-d-expected.png
index 9ffef76..de76e88 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-00-d-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-00-d-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-01-b-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-01-b-expected.png
index d5228f17..fdb3e08a 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-01-b-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t090501-c414-flt-01-b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png
index 3fd0a77..768e0790 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png
index 05764df6..b7898f595 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png
index 05764df6..b7898f595 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png
index 05764df6..b7898f595 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png
index 05764df6..b7898f595 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png
index a5396ac..bfa059e 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png
index a5396ac..bfa059e 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png
index a6747884..6a72f587 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png
index 06701ac..6b72de1 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.png
index 829b083e..9ddf108 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug8411-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug8411-expected.png
index 726c73b..62928d0 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug8411-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/bugs/bug8411-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png
index ccbb0e7..fd3dc08 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png
index 4201864..a2139fb 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png
index fd4519a..cd81153 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
index 8295a46..7ffd87a5 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x-expected.txt b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x-expected.txt
new file mode 100644
index 0000000..8e164711
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x-expected.txt
@@ -0,0 +1,64 @@
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+PASS internals.isPreloaded('resources/image2.png'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?1'); is false
+PASS internals.isPreloaded('resources/base-image1.png?1'); is false
+PASS internals.isPreloaded('resources/base-image2.png?1'); is true
+PASS internals.isPreloaded('resources/base-image3.png?1'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?2'); is false
+PASS internals.isPreloaded('resources/base-image1.png?2'); is false
+PASS internals.isPreloaded('resources/base-image2.png?2'); is true
+PASS internals.isPreloaded('resources/base-image3.png?2'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?3'); is false
+PASS internals.isPreloaded('resources/base-image1.png?3'); is false
+PASS internals.isPreloaded('resources/base-image2.png?3'); is true
+PASS internals.isPreloaded('resources/base-image3.png?3'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?4'); is false
+PASS internals.isPreloaded('resources/base-image1.png?4'); is false
+PASS internals.isPreloaded('resources/base-image2.png?4'); is true
+PASS internals.isPreloaded('resources/base-image3.png?4'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?5'); is false
+PASS internals.isPreloaded('resources/base-image1.png?5'); is false
+PASS internals.isPreloaded('resources/base-image2.png?5'); is true
+PASS internals.isPreloaded('resources/base-image3.png?5'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?6'); is false
+PASS internals.isPreloaded('resources/base-image1.png?6'); is false
+PASS internals.isPreloaded('resources/base-image2.png?6'); is true
+PASS internals.isPreloaded('resources/base-image3.png?6'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?7'); is false
+PASS internals.isPreloaded('resources/base-image1.png?7'); is false
+PASS internals.isPreloaded('resources/base-image2.png?7'); is true
+PASS internals.isPreloaded('resources/base-image3.png?7'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?8'); is false
+PASS internals.isPreloaded('resources/base-image1.png?8'); is false
+PASS internals.isPreloaded('resources/base-image2.png?8'); is true
+PASS internals.isPreloaded('resources/base-image3.png?8'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?9'); is false
+PASS internals.isPreloaded('resources/base-image1.png?9'); is false
+PASS internals.isPreloaded('resources/base-image2.png?9'); is true
+PASS internals.isPreloaded('resources/base-image3.png?9'); is false
+PASS internals.isPreloaded('resources/dup-image1.png?7'); is false
+PASS internals.isPreloaded('resources/dup-image1.png?8'); is false
+PASS internals.isPreloaded('resources/dup-image2.png?8'); is false
+PASS internals.isPreloaded('resources/dup-image3.png?8'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?10'); is false
+PASS internals.isPreloaded('resources/base-image1.png?10'); is true
+PASS internals.isPreloaded('resources/base-image2.png?10'); is false
+PASS internals.isPreloaded('resources/base-image3.png?11'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?11'); is false
+PASS internals.isPreloaded('resources/base-image1.png?11'); is false
+PASS internals.isPreloaded('resources/base-image2.png?11'); is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x.html b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x.html
new file mode 100644
index 0000000..9c4f4b0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-2x.html
@@ -0,0 +1,55 @@
+<html>
+<head>
+<script src="/js-test-resources/js-test.js"></script>
+<script>
+    window.targetScaleFactor = 2;
+</script>
+<script src="../resources/srcset-helper.js"></script>
+<script src="http://127.0.0.1:8000/resources/slow-script.pl?delay=100"></script>
+</head>
+<body>
+<script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    shouldBeTrue("internals.isPreloaded('resources/image2.png');");
+    for (var i = 1; i <= 9; ++i) {
+        shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg?" + i + "');");
+        shouldBeFalse("internals.isPreloaded('resources/base-image1.png?" + i + "');");
+        shouldBeTrue("internals.isPreloaded('resources/base-image2.png?" + i + "');");
+        shouldBeFalse("internals.isPreloaded('resources/base-image3.png?" + i + "');");
+    }
+    shouldBeFalse("internals.isPreloaded('resources/dup-image1.png?7');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image1.png?8');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image2.png?8');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image3.png?8');");
+    shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg?10');");
+    shouldBeTrue("internals.isPreloaded('resources/base-image1.png?10');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image2.png?10');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image3.png?11');");
+    shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg?11');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image1.png?11');");
+    shouldBeTrue("internals.isPreloaded('resources/base-image2.png?11');");
+
+</script>
+<!-- Control group -->
+<link rel="preload" as="image" href="resources/image2.png">
+<!-- All permutations of href, srcset and sizes -->
+<link rel="preload" as="image" href="resources/preload-test.jpg?1" imgsizes="400px" srcset="resources/base-image1.png?1 200w, resources/base-image3.png?1 400w, resources/base-image2.png?1 800w">
+<link rel="preload" as="image" href="resources/preload-test.jpg?2" srcset="resources/base-image1.png?2 200w, resources/base-image3.png?2 400w, resources/base-image2.png?2 800w" imgsizes="400px">
+<link rel="preload" as="image" imgsizes="400px" href="resources/preload-test.jpg?3" srcset="resources/base-image1.png?3 200w, resources/base-image3.png?3 400w, resources/base-image2.png?3 800w">
+<link rel="preload" as="image" imgsizes="400px" srcset="resources/base-image1.png?4 200w, resources/base-image3.png?4 400w, resources/base-image2.png?4 800w" href="resources/preload-test.jpg?4">
+<link rel="preload" as="image" srcset="resources/base-image1.png?5 200w, resources/base-image3.png?5 400w, resources/base-image2.png?5 800w" href="resources/preload-test.jpg?5" imgsizes="400px">
+<link rel="preload" as="image" srcset="resources/base-image1.png?6 200w, resources/base-image3.png?6 400w, resources/base-image2.png?6 800w" imgsizes="400px" href="resources/preload-test.jpg?6">
+<!-- Duplicate attributes -->
+<link rel="preload" as="image" srcset="resources/base-image1.png?7 200w, resources/base-image3.png?7 400w, resources/base-image2.png?7 800w" imgsizes="400px" href="resources/preload-test.jpg?7"
+     href="resources/dup-image1.png?7">
+<link rel="preload" as="image" srcset="resources/base-image1.png?8 200w, resources/base-image3.png?8 400w, resources/base-image2.png?8 800w" imgsizes="400px" href="resources/preload-test.jpg?8"
+     srcset="resources/dup-image1.png?8 200w, resources/dup-image3.png?8 400w, resources/dup-image2.png?8 800w">
+<link rel="preload" as="image" srcset="resources/base-image1.png?9 200w, resources/base-image3.png?9 400w, resources/base-image2.png?9 800w" imgsizes="400px" href="resources/preload-test.jpg?9"
+     imgsizes="800px">
+<!-- Sizes with 'x' descriptors -->
+<link rel="preload" as="image" srcset="resources/base-image1.png?10 2x, resources/base-image3.png?10 4x, resources/base-image2.png?10 8x" imgsizes="400px" href="resources/preload-test.jpg?10">
+<!-- fractional sizes -->
+<link rel="preload" as="image" srcset="resources/base-image1.png?11 1w, resources/base-image2.png?11 2w" imgsizes="0.9px" href="resources/preload-test.jpg?11">
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-expected.txt b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-expected.txt
new file mode 100644
index 0000000..9869d44
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes-expected.txt
@@ -0,0 +1,55 @@
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+PASS internals.isPreloaded('resources/image2.png'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?1'); is false
+PASS internals.isPreloaded('resources/base-image1.png?1'); is false
+PASS internals.isPreloaded('resources/base-image2.png?1'); is false
+PASS internals.isPreloaded('resources/base-image3.png?1'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?2'); is false
+PASS internals.isPreloaded('resources/base-image1.png?2'); is false
+PASS internals.isPreloaded('resources/base-image2.png?2'); is false
+PASS internals.isPreloaded('resources/base-image3.png?2'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?3'); is false
+PASS internals.isPreloaded('resources/base-image1.png?3'); is false
+PASS internals.isPreloaded('resources/base-image2.png?3'); is false
+PASS internals.isPreloaded('resources/base-image3.png?3'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?4'); is false
+PASS internals.isPreloaded('resources/base-image1.png?4'); is false
+PASS internals.isPreloaded('resources/base-image2.png?4'); is false
+PASS internals.isPreloaded('resources/base-image3.png?4'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?5'); is false
+PASS internals.isPreloaded('resources/base-image1.png?5'); is false
+PASS internals.isPreloaded('resources/base-image2.png?5'); is false
+PASS internals.isPreloaded('resources/base-image3.png?5'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?6'); is false
+PASS internals.isPreloaded('resources/base-image1.png?6'); is false
+PASS internals.isPreloaded('resources/base-image2.png?6'); is false
+PASS internals.isPreloaded('resources/base-image3.png?6'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?7'); is false
+PASS internals.isPreloaded('resources/base-image1.png?7'); is false
+PASS internals.isPreloaded('resources/base-image2.png?7'); is false
+PASS internals.isPreloaded('resources/base-image3.png?7'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?8'); is false
+PASS internals.isPreloaded('resources/base-image1.png?8'); is false
+PASS internals.isPreloaded('resources/base-image2.png?8'); is false
+PASS internals.isPreloaded('resources/base-image3.png?8'); is true
+PASS internals.isPreloaded('resources/preload-test.jpg?9'); is false
+PASS internals.isPreloaded('resources/base-image1.png?9'); is false
+PASS internals.isPreloaded('resources/base-image2.png?9'); is false
+PASS internals.isPreloaded('resources/base-image3.png?9'); is true
+PASS internals.isPreloaded('resources/dup-image1.png?7'); is false
+PASS internals.isPreloaded('resources/dup-image1.png?8'); is false
+PASS internals.isPreloaded('resources/dup-image2.png?8'); is false
+PASS internals.isPreloaded('resources/dup-image3.png?8'); is false
+PASS internals.isPreloaded('resources/preload-test.jpg?10'); is true
+PASS internals.isPreloaded('resources/base-image1.png?10'); is false
+PASS internals.isPreloaded('resources/base-image2.png?10'); is false
+PASS internals.isPreloaded('resources/base-image3.png?10'); is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes.html b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes.html
new file mode 100644
index 0000000..f7a595a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-sizes.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<script src="/js-test-resources/js-test.js"></script>
+<script src="http://127.0.0.1:8000/resources/slow-script.pl?delay=100"></script>
+</head>
+<body>
+<script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    shouldBeTrue("internals.isPreloaded('resources/image2.png');");
+    for (var i = 1; i <= 9; ++i) {
+        shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg?" + i + "');");
+        shouldBeFalse("internals.isPreloaded('resources/base-image1.png?" + i + "');");
+        shouldBeFalse("internals.isPreloaded('resources/base-image2.png?" + i + "');");
+        shouldBeTrue("internals.isPreloaded('resources/base-image3.png?" + i + "');");
+    }
+    shouldBeFalse("internals.isPreloaded('resources/dup-image1.png?7');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image1.png?8');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image2.png?8');");
+    shouldBeFalse("internals.isPreloaded('resources/dup-image3.png?8');");
+    shouldBeTrue("internals.isPreloaded('resources/preload-test.jpg?10');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image1.png?10');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image2.png?10');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image3.png?10');");
+
+</script>
+<!-- Control group -->
+<link rel="preload" as="image" href="resources/image2.png">
+<!-- All permutations of href, srcset and sizes -->
+<link rel="preload" as="image" href="resources/preload-test.jpg?1" imgsizes="400px" srcset="resources/base-image1.png?1 200w, resources/base-image3.png?1 400w, resources/base-image2.png?1 800w">
+<link rel="preload" as="image" href="resources/preload-test.jpg?2" srcset="resources/base-image1.png?2 200w, resources/base-image3.png?2 400w, resources/base-image2.png?2 800w" imgsizes="400px">
+<link rel="preload" as="image" imgsizes="400px" href="resources/preload-test.jpg?3" srcset="resources/base-image1.png?3 200w, resources/base-image3.png?3 400w, resources/base-image2.png?3 800w">
+<link rel="preload" as="image" imgsizes="400px" srcset="resources/base-image1.png?4 200w, resources/base-image3.png?4 400w, resources/base-image2.png?4 800w" href="resources/preload-test.jpg?4">
+<link rel="preload" as="image" srcset="resources/base-image1.png?5 200w, resources/base-image3.png?5 400w, resources/base-image2.png?5 800w" href="resources/preload-test.jpg?5" imgsizes="400px">
+<link rel="preload" as="image" srcset="resources/base-image1.png?6 200w, resources/base-image3.png?6 400w, resources/base-image2.png?6 800w" imgsizes="400px" href="resources/preload-test.jpg?6">
+<!-- Duplicate attributes -->
+<link rel="preload" as="image" srcset="resources/base-image1.png?7 200w, resources/base-image3.png?7 400w, resources/base-image2.png?7 800w" imgsizes="400px" href="resources/preload-test.jpg?7"
+     href="resources/dup-image1.png?7">
+<link rel="preload" as="image" srcset="resources/base-image1.png?8 200w, resources/base-image3.png?8 400w, resources/base-image2.png?8 800w" imgsizes="400px" href="resources/preload-test.jpg?8"
+     srcset="resources/dup-image1.png?8 200w, resources/dup-image3.png?8 400w, resources/dup-image2.png?8 800w">
+<link rel="preload" as="image" srcset="resources/base-image1.png?9 200w, resources/base-image3.png?9 400w, resources/base-image2.png?9 800w" imgsizes="400px" href="resources/preload-test.jpg?9"
+     imgsizes="800px">
+<!-- Sizes with 'x' descriptors -->
+<link rel="preload" as="image" srcset="resources/base-image1.png?10 2x, resources/base-image3.png?10 4x, resources/base-image2.png?10 8x" imgsizes="400px" href="resources/preload-test.jpg?10">
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x-expected.txt b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x-expected.txt
new file mode 100644
index 0000000..900b99b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x-expected.txt
@@ -0,0 +1,22 @@
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+PASS internals.isPreloaded('resources/preload-test.jpg'); is false
+PASS internals.isPreloaded('resources/base-image2.png'); is true
+PASS internals.isPreloaded('resources/base-image1.png'); is false
+PASS internals.isPreloaded('resources/base-image3.png'); is false
+PASS internals.isPreloaded('resources/image2.png'); is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+This test passes if the fallback image (defined in the href attribute) is not preloaded, but the 2x version (defined in srcset) is.
+The second link rel=preload is here to make sure isPreloaded is working properly
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x.html b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x.html
new file mode 100644
index 0000000..a631517
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-2x.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<script src="/js-test-resources/js-test.js"></script>
+<script>
+    window.targetScaleFactor = 2;
+</script>
+<script src="../resources/srcset-helper.js"></script>
+<script src="http://127.0.0.1:8000/resources/slow-script.pl?delay=100"></script>
+</head>
+<body>
+<script>
+    shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg');");
+    shouldBeTrue("internals.isPreloaded('resources/base-image2.png');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image1.png');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image3.png');");
+    shouldBeTrue("internals.isPreloaded('resources/image2.png');");
+</script>
+<div>This test passes if the fallback image (defined in the href attribute) is not preloaded, but the 2x version (defined in srcset) is.</div>
+<div>The second link rel=preload is here to make sure isPreloaded is working properly</div>
+<link rel="preload" as="image" href="resources/preload-test.jpg" srcset="resources/base-image1.png 1x, resources/base-image3.png 3x, resources/base-image2.png 2x">
+<link rel="preload" as="image" href="resources/image2.png">
+</body>
+</html>
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-expected.txt b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-expected.txt
new file mode 100644
index 0000000..b0ad245
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset-expected.txt
@@ -0,0 +1,22 @@
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - didStartProvisionalLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+PASS internals.isPreloaded('resources/preload-test.jpg'); is false
+PASS internals.isPreloaded('resources/base-image1.png'); is true
+PASS internals.isPreloaded('resources/base-image2.png'); is false
+PASS internals.isPreloaded('resources/base-image3.png'); is false
+PASS internals.isPreloaded('resources/image2.png'); is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+This test passes if the fallback image (defined in the href attribute) is not preloaded, but the 1x version (defined in srcset) is.
+The second link rel=preload is here to make sure isPreloaded is working properly
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset.html b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset.html
new file mode 100644
index 0000000..30177e21
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/link-preload-image-srcset.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<script src="/js-test-resources/js-test.js"></script>
+<script>
+    window.targetScaleFactor = 1;
+</script>
+<script src="../resources/srcset-helper.js"></script>
+<script src="http://127.0.0.1:8000/resources/slow-script.pl?delay=100"></script>
+</head>
+<body>
+<script>
+    shouldBeFalse("internals.isPreloaded('resources/preload-test.jpg');");
+    shouldBeTrue("internals.isPreloaded('resources/base-image1.png');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image2.png');");
+    shouldBeFalse("internals.isPreloaded('resources/base-image3.png');");
+    shouldBeTrue("internals.isPreloaded('resources/image2.png');");
+</script>
+<div>This test passes if the fallback image (defined in the href attribute) is not preloaded, but the 1x version (defined in srcset) is.</div>
+<div>The second link rel=preload is here to make sure isPreloaded is working properly</div>
+<link rel="preload" as="image" href="resources/preload-test.jpg" srcset="resources/base-image1.png 1x, resources/base-image3.png 3x, resources/base-image2.png 2x">
+<link rel="preload" as="image" href="resources/image2.png">
+</body>
+</html>
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop-expected.txt b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop-expected.txt
new file mode 100644
index 0000000..4a6bd7b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop-expected.txt
@@ -0,0 +1,15 @@
+CONSOLE WARNING: line 4: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
+Test File.lastModifiedDate returns null if the information is not available.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS event.dataTransfer contains a File object on drop.
+PASS Expected response data received.
+PASS Expected read result received.
+FAIL Unexpected response data received: 1234567890
+PASS Expected error reading touched blob received.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop.html
new file mode 100644
index 0000000..4103d56
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/file-changed-after-drop.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src="../../../../resources/js-test.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/setup-file-input-element-for-drag.js"></script>
+<script src="resources/temp-file-utils.js"></script>
+<script src="script-tests/file-changed-after-drop.js"></script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js
new file mode 100644
index 0000000..2fe270e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js
@@ -0,0 +1,73 @@
+description("Test File.lastModifiedDate returns null if the information is not available.");
+
+var tempFileContent = "1234567890";
+var tempFileName = "file-last-modified-after-delete.tmp";
+var testStartTime = new Date();
+var lastModifiedDate;
+
+function onFileDrop(file)
+{
+    var xhr = new XMLHttpRequest();
+    xhr.open("POST", "http://127.0.0.1:8000/xmlhttprequest/resources/post-echo.cgi", false);
+    xhr.send(file);
+    if (xhr.responseText == tempFileContent)
+        testPassed("Expected response data received.");
+    else
+        testFailed("Unexpected response data received: " + xhr.responseText);
+
+    var reader = new FileReader();
+    reader.readAsText(file);
+    reader.onerror = () => testFailed("Unexpected error reading blob");
+    reader.onload = () => {
+        if (reader.result == tempFileContent) {
+            testPassed("Expected read result received.");
+        } else {
+            testFailed("Unexpected read result received: " + reader.result);
+        }
+    };
+    reader.onloadend = () => {
+        // Touch the temp file.
+        touchTempFile(tempFileName);
+
+        // Upload the touched file. We should receive an exception since the file has been changed.
+        xhr.open("POST", "http://127.0.0.1:8000/xmlhttprequest/resources/post-echo.cgi", false);
+        try {
+          xhr.send(file);
+          testFailed("Unexpected response data received: " + xhr.responseText);
+        } catch (ex) {
+          testPassed("Expected exception received.");
+        }
+
+        reader.readAsText(file);
+        reader.onerror = () => testPassed("Expected error reading touched blob received.");
+        reader.onload = () => testFailed("Unexpected read result received after touch.");
+        reader.onloadend = cleanUp;
+    }
+}
+
+function runTest()
+{
+    var tempFilePath = createTempFile(tempFileName, tempFileContent);
+    if (tempFilePath.length == 0)
+        return;
+
+    setFileInputDropCallback(onFileDrop);
+    eventSender.beginDragWithFiles([tempFilePath]);
+    moveMouseToCenterOfElement(fileInput);
+    eventSender.mouseUp();
+}
+
+function cleanUp() {
+    // Clean up after ourselves
+    removeFileInputElement();
+    finishJSTest();
+}
+
+if (window.eventSender) {
+    window.jsTestIsAsync = true;
+    runTest();
+} else {
+    testFailed("This test is not interactive, please run using DumpRenderTree");
+}
+
+var successfullyParsed = true;
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
index dbab7ed..5b898ad 100644
--- a/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/webexposed/global-interface-listing-paint-worklet-expected.txt
@@ -257,6 +257,7 @@
 CONSOLE MESSAGE: line 147:     method pipeTo
 CONSOLE MESSAGE: line 147:     method tee
 CONSOLE MESSAGE: line 147: interface StylePropertyMapReadOnly
+CONSOLE MESSAGE: line 147:     getter size
 CONSOLE MESSAGE: line 147:     method constructor
 CONSOLE MESSAGE: line 147:     method entries
 CONSOLE MESSAGE: line 147:     method forEach
@@ -539,6 +540,7 @@
 CONSOLE MESSAGE: line 147:     method pipeTo
 CONSOLE MESSAGE: line 147:     method tee
 CONSOLE MESSAGE: line 147: interface StylePropertyMapReadOnly
+CONSOLE MESSAGE: line 147:     getter size
 CONSOLE MESSAGE: line 147:     method constructor
 CONSOLE MESSAGE: line 147:     method entries
 CONSOLE MESSAGE: line 147:     method forEach
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/captions-snap-to-lines-not-set.vtt b/third_party/WebKit/LayoutTests/media/track/captions-webvtt/captions-snap-to-lines-not-set.vtt
index 473c92c1..0abadb47 100644
--- a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/captions-snap-to-lines-not-set.vtt
+++ b/third_party/WebKit/LayoutTests/media/track/captions-webvtt/captions-snap-to-lines-not-set.vtt
@@ -1,61 +1,61 @@
 WEBVTT FILE
 
 1
-00:00:00.000 --> 00:00:00.500 line:100% position:50%,center
+00:00:00.000 --> 00:00:00.500 line:100% position:50%
 This is a demo track to illustrate positioning features of cues.
 
 2
-00:00:00.500 --> 00:00:01.000 line:50% position:50%,center
+00:00:00.500 --> 00:00:01.000 line:50% position:50%
 Using HTML5 captions, you can position the cues anywhere.
 
 3
-00:00:01.000 --> 00:00:01.500 line:0% position:0%,line-left align:start
+00:00:01.000 --> 00:00:01.500 line:0% position:0% align:start
 For example, here is a cue on the top left-corner.
 
 4
-00:00:01.500 --> 00:00:02.000 line:0% position:100%,line-right align:end
+00:00:01.500 --> 00:00:02.000 line:0% position:100% align:end
 Or on the top-right corner.
 
 5
-00:00:02.000 --> 00:00:02.500 line:100% position:100%,line-right align:right
+00:00:02.000 --> 00:00:02.500 line:100% position:100% align:right
 Bottom-right corner.
 
 6
-00:00:02.500 --> 00:00:03.000 line:100% position:0%,line-left align:left
+00:00:02.500 --> 00:00:03.000 line:100% position:0% align:left
 And, as you might expect, the bottom-left one.
 
 7
-00:00:03.000 --> 00:00:03.500 line:50% position:50%,center
+00:00:03.000 --> 00:00:03.500 line:50% position:50%
 Cues are implicitly displayed within the viewport area.
 
 8
-00:00:03.500 --> 00:00:04.000 line:100% position:50%,center align:center
+00:00:03.500 --> 00:00:04.000 line:100% position:50% align:middle
 And always on top of the controls, if these are visible.
 
 9
-00:00:04.000 --> 00:00:05.000 line:50% position:50%,center
+00:00:04.000 --> 00:00:05.000 line:50% position:50%
 You may even have multiple cues in the same time.
 
 10
-00:00:04.000 --> 00:00:05.000 line:0% position:0%,line-left align:start
+00:00:04.000 --> 00:00:05.000 line:0% position:0% align:start
 Top-left cue.
 
 11
-00:00:04.000 --> 00:00:05.000 line:0% position:100%,line-right align:end
+00:00:04.000 --> 00:00:05.000 line:0% position:100% align:end
 Top-right cue.
 
 12
-00:00:04.000 --> 00:00:05.000 line:100% position:50%,center
+00:00:04.000 --> 00:00:05.000 line:100% position:50%
 Bottom cue.
 
 13
-00:00:04.000 --> 00:00:05.000 line:25% position:100%,line-right align:end
+00:00:04.000 --> 00:00:05.000 line:25% position:100% align:end
 Random cue 1.
 
 14
-00:00:04.000 --> 00:00:05.000 line:33% position:44%,line-left align:start
+00:00:04.000 --> 00:00:05.000 line:33% position:44% align:start
 Random cue 2.
 
 15
-00:00:04.000 --> 00:00:05.000 line:55% position:23%,line-left align:start
+00:00:04.000 --> 00:00:05.000 line:55% position:23% align:start
 Random cue 3.
diff --git a/third_party/WebKit/LayoutTests/media/track/track-cue-rendering-position-auto-rtl-expected.html b/third_party/WebKit/LayoutTests/media/track/track-cue-rendering-position-auto-rtl-expected.html
index 9c451a6b..0654db4e 100644
--- a/third_party/WebKit/LayoutTests/media/track/track-cue-rendering-position-auto-rtl-expected.html
+++ b/third_party/WebKit/LayoutTests/media/track/track-cue-rendering-position-auto-rtl-expected.html
@@ -17,14 +17,14 @@
     overflow: hidden;
 }
 .cue.start {
-    right: 25%;
+    right: 50%;
     text-align: end;
 }
 .cue.middle {
     text-align: center;
 }
 .cue.end {
-    left: 25%;
+    left: 50%;
     text-align: start;
 }
 .cue > span {
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index d933bef9..e25a701 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
index eb26dfa..6608d6c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
index 8a04eedf..b22c454 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index 1030ad8..4b8b07d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-cover-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-cover-expected.png
index 5138cdf..cc0a68b5 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-cover-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-cover-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-repeat-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-repeat-expected.png
index 63a46ff8..7d3e3b434 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-repeat-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-repeat-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-space-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-space-expected.png
index e305fbf..2fb896ef 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-space-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-background-image-space-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-border-radius-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-border-radius-expected.png
index d1301ce..3ddac90 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-border-radius-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-border-radius-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-filter-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-filter-expected.png
index db6f611..6482a48 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-filter-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-filter-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
index c1041230..a2299bd 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
index bcc8d68..dd08d51 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-expected.png
index f24caf7..cc5053a 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
index 593df88..69a4c67 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-profile-match-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-profile-match-expected.png
index 11221824..ec511c28 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-profile-match-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-profile-match-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-mask-image-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-mask-image-svg-expected.png
index fffa76b..8b926716 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-mask-image-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-mask-image-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-object-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-object-expected.png
index 93005085..4dbf1170 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-object-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-object-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
index 6ad288e..886958c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/exif-orientation-height-image-document-expected.png
index 5a6834369..0ba7e83 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/jpeg-yuv-progressive-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/jpeg-yuv-progressive-image-expected.png
index b44cb0e..19e07c8 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/jpeg-yuv-progressive-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/jpeg-yuv-progressive-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
index 3f31a6f..c719a9b8b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/rgb-png-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
index e3f24755..0571fea5 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/sprite-no-bleed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png
index 3903607..ee55ca1c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/ycbcr-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
deleted file mode 100644
index 7747143f..0000000
--- a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/shadow-dom/attach-shadow-mode.html b/third_party/WebKit/LayoutTests/shadow-dom/attach-shadow-mode.html
index 1ab36b76..402f6f2a 100644
--- a/third_party/WebKit/LayoutTests/shadow-dom/attach-shadow-mode.html
+++ b/third_party/WebKit/LayoutTests/shadow-dom/attach-shadow-mode.html
@@ -15,8 +15,5 @@
   assert_equals(host1.shadowRoot.mode, 'open');
   assert_equals(closedShadowRoot.mode, 'closed');
   assert_equals(host3.shadowRoot.mode, 'open');
-  // Note: mode for V0 shadow and UA shadow is not specified anywhere,
-  // Blink returns reasonable default values for these.
-  assert_equals(internals.shadowRoot(input).mode, 'closed');
 }, 'ShadowRoot.mode should return open or closed, and only open if v0.');
 </script>
diff --git a/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iteration.html b/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iteration.html
deleted file mode 100644
index b556d29..0000000
--- a/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iteration.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-
-<div id="testElement"></div>
-
-<script>
-
-test(function() {
-  testElement.style = "";
-
-  var entryIterator = testElement.attributeStyleMap.entries();
-  var keyIterator = testElement.attributeStyleMap.keys();
-  var valueIterator = testElement.attributeStyleMap.values();
-
-  assert_true(entryIterator.next().done);
-  assert_true(keyIterator.next().done);
-  assert_true(valueIterator.next().done);
-}, "Iteration over empty StyleMap returns empty iterator");
-
-test(function() {
-  testElement.style = "width: 50px";
-
-  var iterator = testElement.attributeStyleMap.entries();
-  var entry = iterator.next();
-  assert_false(entry.done);
-  // Should only be one entry.
-  assert_true(iterator.next().done);
-
-  assert_equals(entry.value[0], 'width');
-  assert_equals(entry.value[1].constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value[1].toString(), '50px');
-}, "Iterator for single entry returns iterator with a single value");
-
-test(function() {
-  testElement.style = "width: 60px";
-
-  var iterator = testElement.attributeStyleMap.keys();
-  var entry = iterator.next();
-  assert_false(entry.done);
-  // Should only be one entry.
-  assert_true(iterator.next().done);
-
-  assert_equals(entry.value, 'width');
-}, "Iterator for single key returns iterator with a single value");
-
-test(function() {
-  testElement.style = "width: 70px";
-
-  var iterator = testElement.attributeStyleMap.values();
-  var entry = iterator.next();
-  assert_false(entry.done);
-  // Should only be one entry.
-  assert_true(iterator.next().done);
-
-  assert_equals(entry.value.constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value.toString(), '70px');
-}, "Iterator for single value returns iterator with a single value");
-
-test(function() {
-  testElement.style = "border: 5px solid lightcoral";
-
-  var entries = {};
-  var numEntries = 0;
-  for (let value of testElement.attributeStyleMap.entries()) {
-    numEntries++;
-    entries[value[0]] = value[1];
-  }
-  assert_equals(numEntries, 17);
-
-  assert_equals(entries['border-top-width'].toString(), '5px');
-  assert_equals(entries['border-right-width'].toString(), '5px');
-  assert_equals(entries['border-bottom-width'].toString(), '5px');
-  assert_equals(entries['border-left-width'].toString(), '5px');
-
-  assert_equals(entries['border-top-style'].toString(), 'solid');
-  assert_equals(entries['border-right-style'].toString(), 'solid');
-  assert_equals(entries['border-bottom-style'].toString(), 'solid');
-  assert_equals(entries['border-left-style'].toString(), 'solid');
-
-  assert_equals(entries['border-top-color'].toString(), 'lightcoral');
-  assert_equals(entries['border-right-color'].toString(), 'lightcoral');
-  assert_equals(entries['border-bottom-color'].toString(), 'lightcoral');
-  assert_equals(entries['border-left-color'].toString(), 'lightcoral');
-
-  assert_equals(entries['border-image-source'].toString(), 'initial');
-  assert_equals(entries['border-image-slice'].toString(), 'initial');
-  assert_equals(entries['border-image-width'].toString(), 'initial');
-  assert_equals(entries['border-image-outset'].toString(), 'initial');
-  assert_equals(entries['border-image-repeat'].toString(), 'initial');
-}, "Iterating entries over border element expansion");
-
-test(function() {
-  testElement.style = "background-color: var(--bg-color);";
-  var entries = [...testElement.attributeStyleMap.values()];
-
-  assert_equals(entries.length, 1);
-  assert_equals(entries[0].constructor, CSSUnparsedValue);
-  assert_equals(entries[0].toString(), 'var(--bg-color)');
-  assert_equals([...entries[0]].length, 1);
-  assert_equals([...entries[0]][0].variable, "--bg-color");
-  assert_equals([...entries[0]][0].fallback, null);
-}, "Variable values come out as CSSUnparsedValues");
-
-test(function() {
-  testElement.style = '';
-  testElement.style.setProperty('--my-custom-property', '5px');
-
-  var entries = [...testElement.attributeStyleMap.entries()];
-  assert_equals(entries.length, 1);
-  var propertyAndValue = entries[0];
-  assert_equals(propertyAndValue.length, 2);
-
-  assert_equals(propertyAndValue[0], '--my-custom-property');
-  assert_equals(propertyAndValue[1].constructor, CSSUnparsedValue);
-  assert_equals(propertyAndValue[1].toString(), '5px');
-}, "Custom properties set on the element come out as CSSUnparsedValue");
-
-</script>
diff --git a/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iterationWithModification.html b/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iterationWithModification.html
index 0e10bf7..dbebf26 100644
--- a/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iterationWithModification.html
+++ b/third_party/WebKit/LayoutTests/typedcssom/inlinestyle/inlineStylePropertyMap_iterationWithModification.html
@@ -16,13 +16,15 @@
 
   var entry = iterator.next();
   assert_equals(entry.value[0], 'border-left-width');
-  assert_equals(entry.value[1].constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value[1].toString(), '30px');
+  assert_equals(entry.value[1].length, 1);
+  assert_equals(entry.value[1][0].constructor.name, CSSUnitValue.name);
+  assert_equals(entry.value[1][0].toString(), '30px');
 
   entry = iterator.next();
   assert_equals(entry.value[0], 'width');
-  assert_equals(entry.value[1].constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value[1].toString(), '60px');
+  assert_equals(entry.value[1].length, 1);
+  assert_equals(entry.value[1][0].constructor.name, CSSUnitValue.name);
+  assert_equals(entry.value[1][0].toString(), '60px');
 
   assert_true(iterator.next().done);
 }, "Adding a property while iterating over entries() doesn't affect iterator");
@@ -36,12 +38,14 @@
   testElement.style.borderTopWidth = '10px';
 
   var entry = iterator.next();
-  assert_equals(entry.value.constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value.toString(), '30px');
+  assert_equals(entry.value.length, 1);
+  assert_equals(entry.value[0].constructor.name, CSSUnitValue.name);
+  assert_equals(entry.value[0].toString(), '30px');
 
   entry = iterator.next();
-  assert_equals(entry.value.constructor.name, CSSUnitValue.name);
-  assert_equals(entry.value.toString(), '60px');
+  assert_equals(entry.value.length, 1);
+  assert_equals(entry.value[0].constructor.name, CSSUnitValue.name);
+  assert_equals(entry.value[0].toString(), '60px');
 
   assert_true(iterator.next().done);
 }, "Adding a property while iterating over values() doesn't affect current iterator");
diff --git a/third_party/WebKit/LayoutTests/typedcssom/the-stylepropertymap/declared/delete-rule-crash.html b/third_party/WebKit/LayoutTests/typedcssom/the-stylepropertymap/declared/delete-rule-crash.html
index 05cb5cf..6e8fa0a 100644
--- a/third_party/WebKit/LayoutTests/typedcssom/the-stylepropertymap/declared/delete-rule-crash.html
+++ b/third_party/WebKit/LayoutTests/typedcssom/the-stylepropertymap/declared/delete-rule-crash.html
@@ -23,5 +23,7 @@
   styleMap.append('transition-duration', '1s');
   styleMap.delete('color');
   styleMap.set('width', '10px');
+  styleMap.clear();
+  styleMap.size;
 }, "Deleting a style rule does not crash the corresponding declared style map");
 </script>
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 73ffc33..93a7e9e0 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -6242,9 +6242,7 @@
     attribute @@toStringTag
     getter align
     getter line
-    getter lineAlign
     getter position
-    getter positionAlign
     getter size
     getter snapToLines
     getter text
@@ -6253,9 +6251,7 @@
     method getCueAsHTML
     setter align
     setter line
-    setter lineAlign
     setter position
-    setter positionAlign
     setter size
     setter snapToLines
     setter text
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 11bf798..e7099bb 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1078,9 +1078,11 @@
     getter atomic
     getter autocomplete
     getter busy
+    getter checked
     getter colCount
     getter colIndex
     getter colSpan
+    getter disabled
     getter firstChild
     getter keyShortcuts
     getter lastChild
@@ -1092,6 +1094,7 @@
     getter placeholder
     getter posInSet
     getter previousSibling
+    getter readOnly
     getter role
     getter roleDescription
     getter rowCount
@@ -4022,6 +4025,7 @@
 interface KeyframeEffectReadOnly : AnimationEffectReadOnly
     attribute @@toStringTag
     getter composite
+    getter target
     method constructor
     method getKeyframes
 interface LinearAccelerationSensor : Accelerometer
@@ -6885,6 +6889,7 @@
     method set
 interface StylePropertyMapReadOnly
     attribute @@toStringTag
+    getter size
     method @@iterator
     method constructor
     method entries
@@ -7351,9 +7356,7 @@
     attribute @@toStringTag
     getter align
     getter line
-    getter lineAlign
     getter position
-    getter positionAlign
     getter region
     getter size
     getter snapToLines
@@ -7363,9 +7366,7 @@
     method getCueAsHTML
     setter align
     setter line
-    setter lineAlign
     setter position
-    setter positionAlign
     setter region
     setter size
     setter snapToLines
diff --git a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
index 2c10daa2..49f54459 100644
--- a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
+++ b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
@@ -25,8 +25,6 @@
   "$bindings_core_v8_output_dir/byte_string_sequence_sequence_or_byte_string_byte_string_record.h",
   "$bindings_core_v8_output_dir/composite_operation_or_composite_operation_or_null_sequence.cc",
   "$bindings_core_v8_output_dir/composite_operation_or_composite_operation_or_null_sequence.h",
-  "$bindings_core_v8_output_dir/css_style_value_or_css_style_value_sequence.cc",
-  "$bindings_core_v8_output_dir/css_style_value_or_css_style_value_sequence.h",
   "$bindings_core_v8_output_dir/css_style_value_or_string.cc",
   "$bindings_core_v8_output_dir/css_style_value_or_string.h",
   "$bindings_core_v8_output_dir/double_or_auto_keyword.cc",
@@ -146,8 +144,6 @@
   "$bindings_core_v8_output_dir/v8_resize_observer_callback.h",
   "$bindings_core_v8_output_dir/v8_scroll_state_callback.cc",
   "$bindings_core_v8_output_dir/v8_scroll_state_callback.h",
-  "$bindings_core_v8_output_dir/v8_update_function.cc",
-  "$bindings_core_v8_output_dir/v8_update_function.h",
   "$bindings_core_v8_output_dir/v8_void_function.cc",
   "$bindings_core_v8_output_dir/v8_void_function.h",
 ]
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ContextSnapshot.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ContextSnapshot.cpp
index 274b3a1..dd5bf5c5 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8ContextSnapshot.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8ContextSnapshot.cpp
@@ -405,7 +405,7 @@
     const WrapperTypeInfo* wrapper_type_info =
         snapshot_interface.wrapper_type_info;
     v8::Local<v8::FunctionTemplate> interface_template =
-        v8::FunctionTemplate::FromSnapshot(isolate, index_offset + i)
+        isolate->GetDataFromSnapshotOnce<v8::FunctionTemplate>(index_offset + i)
             .ToLocalChecked();
     snapshot_interface.install_function(isolate, world, interface_template);
     CHECK(!interface_template.IsEmpty());
@@ -466,7 +466,7 @@
   }
 
   for (auto& interface_template : interface_templates) {
-    creator->AddTemplate(interface_template);
+    creator->AddData(interface_template);
   }
   creator->AddContext(context, SerializeInternalField);
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
index 6085578..ff61ebc2 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -560,38 +560,6 @@
   void Free(void* data, size_t size) override {
     WTF::ArrayBufferContents::FreeMemory(data);
   }
-
-  void* Reserve(size_t length) override {
-    return WTF::ArrayBufferContents::ReserveMemory(length);
-  }
-
-  void Free(void* data, size_t length, AllocationMode mode) override {
-    switch (mode) {
-      case AllocationMode::kNormal:
-        Free(data, length);
-        return;
-      case AllocationMode::kReservation:
-        WTF::ArrayBufferContents::ReleaseReservedMemory(data, length);
-        return;
-      default:
-        NOTREACHED();
-    }
-  }
-
-  void SetProtection(void* data,
-                     size_t length,
-                     Protection protection) override {
-    switch (protection) {
-      case Protection::kNoAccess:
-        CHECK(WTF::SetSystemPagesAccess(data, length, WTF::PageInaccessible));
-        return;
-      case Protection::kReadWrite:
-        CHECK(WTF::SetSystemPagesAccess(data, length, WTF::PageReadWrite));
-        return;
-      default:
-        NOTREACHED();
-    }
-  }
 };
 
 }  // namespace
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp
index 3dd087ee..3a594cf2 100644
--- a/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8WindowCustom.cpp
@@ -133,21 +133,6 @@
   V8SetReturnValue(info, js_event);
 }
 
-void V8Window::eventAttributeSetterCustom(
-    v8::Local<v8::Value> value,
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  LocalDOMWindow* impl = ToLocalDOMWindow(V8Window::ToImpl(info.Holder()));
-  v8::Isolate* isolate = info.GetIsolate();
-  ExceptionState exception_state(isolate, ExceptionState::kSetterContext,
-                                 "Window", "event");
-  if (!BindingSecurity::ShouldAllowAccessTo(CurrentDOMWindow(isolate), impl,
-                                            exception_state)) {
-    return;
-  }
-
-  V8PrivateProperty::GetGlobalEvent(isolate).Set(info.Holder(), value);
-}
-
 void V8Window::frameElementAttributeGetterCustom(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
   LocalDOMWindow* impl = ToLocalDOMWindow(V8Window::ToImpl(info.Holder()));
diff --git a/third_party/WebKit/Source/bindings/templates/callback_function.h.tmpl b/third_party/WebKit/Source/bindings/templates/callback_function.h.tmpl
index 1f768fff..e958ea5f 100644
--- a/third_party/WebKit/Source/bindings/templates/callback_function.h.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/callback_function.h.tmpl
@@ -15,7 +15,7 @@
 class {{forward_declaration}};
 {% endfor %}
 
-class {{exported}}{{cpp_class}} final : public CallbackFunctionBase {
+class {{exported}}{{cpp_class}} : public CallbackFunctionBase {
  public:
   static {{cpp_class}}* Create(v8::Local<v8::Function> callback_function) {
     return new {{cpp_class}}(callback_function);
@@ -33,6 +33,10 @@
   void InvokeAndReportException({{argument_declarations | join(', ')}});
 {% endif %}
 
+ protected:
+  explicit {{cpp_class}}(const {{cpp_class}}& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit {{cpp_class}}(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
index 98434e4..9772ae4 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8AnyCallbackFunctionOptionalAnyArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8AnyCallbackFunctionOptionalAnyArg : public CallbackFunctionBase {
  public:
   static V8AnyCallbackFunctionOptionalAnyArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8AnyCallbackFunctionOptionalAnyArg(callback_function);
@@ -31,6 +31,10 @@
   // https://heycam.github.io/webidl/#es-invoking-callback-functions
   v8::Maybe<ScriptValue> Invoke(ScriptWrappable* callback_this_value, ScriptValue optionalAnyArg) WARN_UNUSED_RESULT;
 
+ protected:
+  explicit V8AnyCallbackFunctionOptionalAnyArg(const V8AnyCallbackFunctionOptionalAnyArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8AnyCallbackFunctionOptionalAnyArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_long_callback_function.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_long_callback_function.h
index eec69f3..e7b0a63 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_long_callback_function.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_long_callback_function.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8LongCallbackFunction final : public CallbackFunctionBase {
+class CORE_EXPORT V8LongCallbackFunction : public CallbackFunctionBase {
  public:
   static V8LongCallbackFunction* Create(v8::Local<v8::Function> callback_function) {
     return new V8LongCallbackFunction(callback_function);
@@ -31,6 +31,10 @@
   // https://heycam.github.io/webidl/#es-invoking-callback-functions
   v8::Maybe<int32_t> Invoke(ScriptWrappable* callback_this_value, int32_t num1, int32_t num2) WARN_UNUSED_RESULT;
 
+ protected:
+  explicit V8LongCallbackFunction(const V8LongCallbackFunction& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8LongCallbackFunction(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
index 34dc31d0..94ce68f 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8StringSequenceCallbackFunctionLongSequenceArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8StringSequenceCallbackFunctionLongSequenceArg : public CallbackFunctionBase {
  public:
   static V8StringSequenceCallbackFunctionLongSequenceArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8StringSequenceCallbackFunctionLongSequenceArg(callback_function);
@@ -31,6 +31,10 @@
   // https://heycam.github.io/webidl/#es-invoking-callback-functions
   v8::Maybe<Vector<String>> Invoke(ScriptWrappable* callback_this_value, const Vector<int32_t>& arg) WARN_UNUSED_RESULT;
 
+ protected:
+  explicit V8StringSequenceCallbackFunctionLongSequenceArg(const V8StringSequenceCallbackFunctionLongSequenceArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8StringSequenceCallbackFunctionLongSequenceArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function.h
index 16ba1130..b0bc5ce 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8VoidCallbackFunction final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunction : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunction* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunction(callback_function);
@@ -35,6 +35,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value);
 
+ protected:
+  explicit V8VoidCallbackFunction(const V8VoidCallbackFunction& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunction(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
index c1189020..f7a0fd0c 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
@@ -20,7 +20,7 @@
 class ScriptWrappable;
 class TestDictionary;
 
-class CORE_EXPORT V8VoidCallbackFunctionDictionaryArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunctionDictionaryArg : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionDictionaryArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionDictionaryArg(callback_function);
@@ -36,6 +36,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value, const TestDictionary& arg);
 
+ protected:
+  explicit V8VoidCallbackFunctionDictionaryArg(const V8VoidCallbackFunctionDictionaryArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionDictionaryArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_enum_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
index 41e4804..9e073f09 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8VoidCallbackFunctionEnumArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunctionEnumArg : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionEnumArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionEnumArg(callback_function);
@@ -35,6 +35,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value, const String& arg);
 
+ protected:
+  explicit V8VoidCallbackFunctionEnumArg(const V8VoidCallbackFunctionEnumArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionEnumArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_interface_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
index 17431d4f..e3231b2 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
@@ -20,7 +20,7 @@
 class HTMLDivElement;
 class ScriptWrappable;
 
-class CORE_EXPORT V8VoidCallbackFunctionInterfaceArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunctionInterfaceArg : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionInterfaceArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionInterfaceArg(callback_function);
@@ -36,6 +36,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value, HTMLDivElement* divElement);
 
+ protected:
+  explicit V8VoidCallbackFunctionInterfaceArg(const V8VoidCallbackFunctionInterfaceArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionInterfaceArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
index 57572e2..a1e90bc 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
@@ -20,7 +20,7 @@
 class ScriptWrappable;
 class TestInterfaceImplementation;
 
-class CORE_EXPORT V8VoidCallbackFunctionTestInterfaceSequenceArg final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunctionTestInterfaceSequenceArg : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionTestInterfaceSequenceArg* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionTestInterfaceSequenceArg(callback_function);
@@ -36,6 +36,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value, const HeapVector<Member<TestInterfaceImplementation>>& arg);
 
+ protected:
+  explicit V8VoidCallbackFunctionTestInterfaceSequenceArg(const V8VoidCallbackFunctionTestInterfaceSequenceArg& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionTestInterfaceSequenceArg(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_typedef.h b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_typedef.h
index e8dde92..c3f690df 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_typedef.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/v8_void_callback_function_typedef.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class CORE_EXPORT V8VoidCallbackFunctionTypedef final : public CallbackFunctionBase {
+class CORE_EXPORT V8VoidCallbackFunctionTypedef : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionTypedef* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionTypedef(callback_function);
@@ -35,6 +35,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value, const String& arg);
 
+ protected:
+  explicit V8VoidCallbackFunctionTypedef(const V8VoidCallbackFunctionTypedef& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionTypedef(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/v8_void_callback_function_modules.h b/third_party/WebKit/Source/bindings/tests/results/modules/v8_void_callback_function_modules.h
index 156abbf..950e8944f 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/v8_void_callback_function_modules.h
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/v8_void_callback_function_modules.h
@@ -19,7 +19,7 @@
 
 class ScriptWrappable;
 
-class MODULES_EXPORT V8VoidCallbackFunctionModules final : public CallbackFunctionBase {
+class MODULES_EXPORT V8VoidCallbackFunctionModules : public CallbackFunctionBase {
  public:
   static V8VoidCallbackFunctionModules* Create(v8::Local<v8::Function> callback_function) {
     return new V8VoidCallbackFunctionModules(callback_function);
@@ -35,6 +35,10 @@
   // error handler such as DevTools' console.
   void InvokeAndReportException(ScriptWrappable* callback_this_value);
 
+ protected:
+  explicit V8VoidCallbackFunctionModules(const V8VoidCallbackFunctionModules& other)
+      : CallbackFunctionBase(other) {}
+
  private:
   explicit V8VoidCallbackFunctionModules(v8::Local<v8::Function> callback_function)
       : CallbackFunctionBase(callback_function) {}
diff --git a/third_party/WebKit/Source/build/scripts/core/css/templates/CSSOMTypes.cpp.tmpl b/third_party/WebKit/Source/build/scripts/core/css/templates/CSSOMTypes.cpp.tmpl
index 33d34d8..31ca984 100644
--- a/third_party/WebKit/Source/build/scripts/core/css/templates/CSSOMTypes.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/core/css/templates/CSSOMTypes.cpp.tmpl
@@ -25,6 +25,13 @@
     MatchesBaseType(CSSNumericValueType::BaseType::kLength);
 }
 
+bool IsCSSStyleValueNumber(const CSSStyleValue& value) {
+  if (!value.IsNumericValue())
+    return false;
+  return static_cast<const CSSNumericValue&>(value).Type().
+    MatchesNumber();
+}
+
 bool IsCSSStyleValueTime(const CSSStyleValue& value) {
   if (!value.IsNumericValue())
     return false;
diff --git a/third_party/WebKit/Source/build/scripts/templates/InternalRuntimeFlags.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/InternalRuntimeFlags.h.tmpl
index a441e5a..199a6c7 100644
--- a/third_party/WebKit/Source/build/scripts/templates/InternalRuntimeFlags.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/InternalRuntimeFlags.h.tmpl
@@ -31,7 +31,11 @@
 
   {% for feature in standard_features %}
   bool {{feature.first_lowered_name}}Enabled() {
+    {% if feature.origin_trial_feature_name %}
+    return RuntimeEnabledFeatures::{{feature.name}}EnabledByRuntimeFlag();
+    {% else %}
     return RuntimeEnabledFeatures::{{feature.name}}Enabled();
+    {% endif %}
   }
   {% endfor %}
 
diff --git a/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeaturesTestHelpers.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeaturesTestHelpers.h.tmpl
index d66b642..3b564661 100644
--- a/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeaturesTestHelpers.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/RuntimeEnabledFeaturesTestHelpers.h.tmpl
@@ -31,7 +31,11 @@
 
 {% for feature in features %}
 typedef ScopedRuntimeEnabledFeatureForTest<
+{% if feature.origin_trial_feature_name %}
+    RuntimeEnabledFeatures::{{feature.name}}EnabledByRuntimeFlag,
+{% else %}
     RuntimeEnabledFeatures::{{feature.name}}Enabled,
+{% endif %}
     RuntimeEnabledFeatures::Set{{feature.name}}Enabled>
     Scoped{{feature.name}}ForTest;
 {% endfor %}
diff --git a/third_party/WebKit/Source/build/scripts/templates/origin_trials.cc.tmpl b/third_party/WebKit/Source/build/scripts/templates/origin_trials.cc.tmpl
index da09b45..e0b3c18 100644
--- a/third_party/WebKit/Source/build/scripts/templates/origin_trials.cc.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/origin_trials.cc.tmpl
@@ -20,7 +20,7 @@
 {% if feature.origin_trial_feature_name %}
 
 bool OriginTrials::{{feature.first_lowered_name}}Enabled(const ExecutionContext* executionContext) {
-  if (RuntimeEnabledFeatures::{{feature.name}}Enabled())
+  if (RuntimeEnabledFeatures::{{feature.name}}EnabledByRuntimeFlag())
     return true;
 {% if feature.origin_trial_os %}
 #if
diff --git a/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.cc.tmpl b/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.cc.tmpl
index e2dfc7e..98a6209 100644
--- a/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.cc.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.cc.tmpl
@@ -12,7 +12,11 @@
 
 RuntimeEnabledFeatures::Backup::Backup()
   : {% for feature in standard_features -%}
+{% if feature.origin_trial_feature_name %}
+    {{feature.class_member_name}}(RuntimeEnabledFeatures::{{feature.name}}EnabledByRuntimeFlag())
+{% else %}
     {{feature.class_member_name}}(RuntimeEnabledFeatures::{{feature.name}}Enabled())
+{% endif %}
     {%- if not loop.last %},
     {%+ endif -%}
     {% endfor %} {}
diff --git a/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.h.tmpl
index 9e095da..412a225 100644
--- a/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/runtime_enabled_features.h.tmpl
@@ -38,11 +38,35 @@
   static void SetFeatureEnabledFromString(const std::string& name, bool enabled);
 
   {% for feature in features %}
+  {% if not feature.origin_trial_feature_name %}
   {% if feature.custom %}
   static bool {{feature.name}}Enabled();
   {% else %}
   static void Set{{feature.name}}Enabled(bool enabled) { is_{{feature.class_member_name}}enabled_ = enabled; }
   static bool {{feature.name}}Enabled() { return {{feature.enabled_condition}}; }
+  {% endif %}
+
+  {% endif %}
+  {% endfor %}
+
+  // Origin-trial-enabled features:
+  //
+  // These features are currently part of an origin trial (see
+  // https://www.chromium.org/blink/origin-trials). These methods can be used
+  // to test whether the feature is unconditionally enabled (for example, by
+  // starting the browser with the appropriate command-line flag). However,
+  // that is almost always the incorrect check. Most renderer code should
+  // be calling OriginTrials::<feature>Enabled() instead, to test if the
+  // feature is enabled in a given context.
+
+  {% for feature in features %}
+  {% if feature.origin_trial_feature_name %}
+  {% if feature.custom %}
+  static bool {{feature.name}}EnabledByRuntimeFlag();
+  {% else %}
+  static void Set{{feature.name}}Enabled(bool enabled) { is_{{feature.class_member_name}}enabled_ = enabled; }
+  static bool {{feature.name}}EnabledByRuntimeFlag() { return {{feature.enabled_condition}}; }
+  {% endif %}
 
   {% endif %}
   {% endfor %}
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index d3ce034..c862fb4 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1975,6 +1975,7 @@
     "loader/BaseFetchContextTest.cpp",
     "loader/DocumentLoadTimingTest.cpp",
     "loader/DocumentLoaderTest.cpp",
+    "loader/DocumentThreadableLoaderTest.cpp",
     "loader/FrameFetchContextTest.cpp",
     "loader/IdlenessDetectorTest.cpp",
     "loader/InteractiveDetectorTest.cpp",
diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp
index 7a8ea0e..10ab095 100644
--- a/third_party/WebKit/Source/core/animation/Animation.cpp
+++ b/third_party/WebKit/Source/core/animation/Animation.cpp
@@ -45,7 +45,7 @@
 #include "core/inspector/InspectorTraceEvents.h"
 #include "core/paint/PaintLayer.h"
 #include "core/probe/CoreProbes.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
+#include "platform/animation/CompositorAnimation.h"
 #include "platform/bindings/ScriptForbiddenScope.h"
 #include "platform/heap/Persistent.h"
 #include "platform/instrumentation/tracing/TraceEvent.h"
@@ -143,16 +143,16 @@
 }
 
 Animation::~Animation() {
-  // Verify that m_compositorPlayer has been disposed of.
-  DCHECK(!compositor_player_);
+  // Verify that compositor_animation_ has been disposed of.
+  DCHECK(!compositor_animation_);
 }
 
 void Animation::Dispose() {
-  DestroyCompositorPlayer();
+  DestroyCompositorAnimation();
   // If the DocumentTimeline and its Animation objects are
   // finalized by the same GC, we have to eagerly clear out
-  // this Animation object's compositor player registration.
-  DCHECK(!compositor_player_);
+  // this Animation object's compositor animation registration.
+  DCHECK(!compositor_animation_);
 }
 
 double Animation::EffectEnd() const {
@@ -326,7 +326,7 @@
       CompositorAnimations::FailureCode failure_code =
           CheckCanStartAnimationOnCompositor(composited_element_ids);
       if (failure_code.Ok()) {
-        CreateCompositorPlayer();
+        CreateCompositorAnimation();
         StartAnimationOnCompositor(composited_element_ids);
         compositor_state_ = WTF::WrapUnique(new CompositorState(*this));
       } else {
@@ -446,7 +446,7 @@
 
   const KeyframeEffectReadOnly* effect =
       ToKeyframeEffectReadOnly(content_.Get());
-  return (effect->Target() == &element) &&
+  return (effect->target() == &element) &&
          effect->Affects(PropertyHandle(property));
 }
 
@@ -698,7 +698,7 @@
 }
 
 const AtomicString& Animation::InterfaceName() const {
-  return EventTargetNames::AnimationPlayer;
+  return EventTargetNames::Animation;
 }
 
 ExecutionContext* Animation::GetExecutionContext() const {
@@ -845,7 +845,7 @@
   if (composited_element_ids.has_value()) {
     DCHECK(RuntimeEnabledFeatures::SlimmingPaintV2Enabled());
     Element* target_element =
-        ToKeyframeEffectReadOnly(content_.Get())->Target();
+        ToKeyframeEffectReadOnly(content_.Get())->target();
     if (!target_element) {
       return CompositorAnimations::FailureCode::Actionable(
           "Animation is not attached to an element");
@@ -903,7 +903,7 @@
 void Animation::SetCompositorPending(bool effect_changed) {
   // FIXME: KeyframeEffect could notify this directly?
   if (!HasActiveAnimationsOnCompositor()) {
-    DestroyCompositorPlayer();
+    DestroyCompositorAnimation();
     compositor_state_.reset();
   }
   if (effect_changed && compositor_state_) {
@@ -924,7 +924,7 @@
   if (HasActiveAnimationsOnCompositor())
     ToKeyframeEffectReadOnly(content_.Get())->CancelAnimationOnCompositor();
 
-  DestroyCompositorPlayer();
+  DestroyCompositorAnimation();
 }
 
 void Animation::RestartAnimationOnCompositor() {
@@ -1061,48 +1061,48 @@
   state_is_being_updated_ = false;
 }
 
-void Animation::CreateCompositorPlayer() {
+void Animation::CreateCompositorAnimation() {
   if (Platform::Current()->IsThreadedAnimationEnabled() &&
-      !compositor_player_) {
+      !compositor_animation_) {
     DCHECK(Platform::Current()->CompositorSupport());
-    compositor_player_ = CompositorAnimationPlayerHolder::Create(this);
-    DCHECK(compositor_player_);
+    compositor_animation_ = CompositorAnimationHolder::Create(this);
+    DCHECK(compositor_animation_);
     AttachCompositorTimeline();
   }
 
   AttachCompositedLayers();
 }
 
-void Animation::DestroyCompositorPlayer() {
+void Animation::DestroyCompositorAnimation() {
   DetachCompositedLayers();
 
-  if (compositor_player_) {
+  if (compositor_animation_) {
     DetachCompositorTimeline();
-    compositor_player_->Detach();
-    compositor_player_ = nullptr;
+    compositor_animation_->Detach();
+    compositor_animation_ = nullptr;
   }
 }
 
 void Animation::AttachCompositorTimeline() {
-  if (compositor_player_) {
+  if (compositor_animation_) {
     CompositorAnimationTimeline* timeline =
         timeline_ ? timeline_->CompositorTimeline() : nullptr;
     if (timeline)
-      timeline->PlayerAttached(*this);
+      timeline->AnimationAttached(*this);
   }
 }
 
 void Animation::DetachCompositorTimeline() {
-  if (compositor_player_) {
+  if (compositor_animation_) {
     CompositorAnimationTimeline* timeline =
         timeline_ ? timeline_->CompositorTimeline() : nullptr;
     if (timeline)
-      timeline->PlayerDestroyed(*this);
+      timeline->AnimationDestroyed(*this);
   }
 }
 
 void Animation::AttachCompositedLayers() {
-  if (!compositor_player_)
+  if (!compositor_animation_)
     return;
 
   DCHECK(content_);
@@ -1112,8 +1112,9 @@
 }
 
 void Animation::DetachCompositedLayers() {
-  if (compositor_player_ && compositor_player_->Player()->IsElementAttached())
-    compositor_player_->Player()->DetachElement();
+  if (compositor_animation_ &&
+      compositor_animation_->GetAnimation()->IsElementAttached())
+    compositor_animation_->GetAnimation()->DetachElement();
 }
 
 void Animation::NotifyAnimationStarted(double monotonic_time, int group) {
@@ -1260,7 +1261,7 @@
   if (!content_ || !content_->IsKeyframeEffectReadOnly())
     return;
 
-  Element* target = ToKeyframeEffectReadOnly(content_.Get())->Target();
+  Element* target = ToKeyframeEffectReadOnly(content_.Get())->target();
 
   // TODO(alancutter): Remove dependency of this function on CSSAnimations.
   // This function makes the incorrect assumption that the animation uses
@@ -1310,35 +1311,35 @@
   visitor->Trace(pending_cancelled_event_);
   visitor->Trace(finished_promise_);
   visitor->Trace(ready_promise_);
-  visitor->Trace(compositor_player_);
+  visitor->Trace(compositor_animation_);
   EventTargetWithInlineData::Trace(visitor);
   ContextLifecycleObserver::Trace(visitor);
 }
 
-Animation::CompositorAnimationPlayerHolder*
-Animation::CompositorAnimationPlayerHolder::Create(Animation* animation) {
-  return new CompositorAnimationPlayerHolder(animation);
+Animation::CompositorAnimationHolder*
+Animation::CompositorAnimationHolder::Create(Animation* animation) {
+  return new CompositorAnimationHolder(animation);
 }
 
-Animation::CompositorAnimationPlayerHolder::CompositorAnimationPlayerHolder(
+Animation::CompositorAnimationHolder::CompositorAnimationHolder(
     Animation* animation)
     : animation_(animation) {
-  compositor_player_ = CompositorAnimationPlayer::Create();
-  compositor_player_->SetAnimationDelegate(animation_);
+  compositor_animation_ = CompositorAnimation::Create();
+  compositor_animation_->SetAnimationDelegate(animation_);
 }
 
-void Animation::CompositorAnimationPlayerHolder::Dispose() {
+void Animation::CompositorAnimationHolder::Dispose() {
   if (!animation_)
     return;
   animation_->Dispose();
   DCHECK(!animation_);
-  DCHECK(!compositor_player_);
+  DCHECK(!compositor_animation_);
 }
 
-void Animation::CompositorAnimationPlayerHolder::Detach() {
-  DCHECK(compositor_player_);
-  compositor_player_->SetAnimationDelegate(nullptr);
+void Animation::CompositorAnimationHolder::Detach() {
+  DCHECK(compositor_animation_);
+  compositor_animation_->SetAnimationDelegate(nullptr);
   animation_ = nullptr;
-  compositor_player_.reset();
+  compositor_animation_.reset();
 }
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/animation/Animation.h b/third_party/WebKit/Source/core/animation/Animation.h
index 7c87baa7..02a8091 100644
--- a/third_party/WebKit/Source/core/animation/Animation.h
+++ b/third_party/WebKit/Source/core/animation/Animation.h
@@ -48,14 +48,14 @@
 #include "core/dom/ContextLifecycleObserver.h"
 #include "core/dom/DOMException.h"
 #include "core/dom/events/EventTarget.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 #include "platform/graphics/CompositorElementId.h"
 #include "platform/heap/Handle.h"
 
 namespace blink {
 
-class CompositorAnimationPlayer;
+class CompositorAnimation;
 class Element;
 class ExceptionState;
 class TreeScope;
@@ -64,7 +64,7 @@
                                     public ActiveScriptWrappable<Animation>,
                                     public ContextLifecycleObserver,
                                     public CompositorAnimationDelegate,
-                                    public CompositorAnimationPlayerClient,
+                                    public CompositorAnimationClient,
                                     public AnimationEffectOwner {
   DEFINE_WRAPPERTYPEINFO();
   USING_GARBAGE_COLLECTED_MIXIN(Animation);
@@ -192,9 +192,10 @@
   void SetCompositorPending(bool effect_changed = false);
   void NotifyCompositorStartTime(double timeline_time);
   void NotifyStartTime(double timeline_time);
-  // CompositorAnimationPlayerClient implementation.
-  CompositorAnimationPlayer* CompositorPlayer() const override {
-    return compositor_player_ ? compositor_player_->Player() : nullptr;
+  // CompositorAnimationClient implementation.
+  CompositorAnimation* GetCompositorAnimation() const override {
+    return compositor_animation_ ? compositor_animation_->GetAnimation()
+                                 : nullptr;
   }
 
   bool Affects(const Element&, const CSSProperty&) const;
@@ -251,8 +252,8 @@
 
   CompositorAnimations::FailureCode CheckCanStartAnimationOnCompositorInternal(
       const Optional<CompositorElementIdSet>&) const;
-  void CreateCompositorPlayer();
-  void DestroyCompositorPlayer();
+  void CreateCompositorAnimation();
+  void DestroyCompositorAnimation();
   void AttachCompositorTimeline();
   void DetachCompositorTimeline();
   void AttachCompositedLayers();
@@ -343,30 +344,30 @@
     CompositorPendingChange compositor_pending_change_;
   };
 
-  // CompositorAnimationPlayer objects need to eagerly sever
-  // their connection to their Animation delegate; use a separate
-  // 'holder' on-heap object to accomplish that.
-  class CompositorAnimationPlayerHolder
-      : public GarbageCollectedFinalized<CompositorAnimationPlayerHolder> {
-    USING_PRE_FINALIZER(CompositorAnimationPlayerHolder, Dispose);
+  // CompositorAnimation objects need to eagerly sever their connection to their
+  // Animation delegate; use a separate 'holder' on-heap object to accomplish
+  // that.
+  class CompositorAnimationHolder
+      : public GarbageCollectedFinalized<CompositorAnimationHolder> {
+    USING_PRE_FINALIZER(CompositorAnimationHolder, Dispose);
 
    public:
-    static CompositorAnimationPlayerHolder* Create(Animation*);
+    static CompositorAnimationHolder* Create(Animation*);
 
     void Detach();
 
     void Trace(blink::Visitor* visitor) { visitor->Trace(animation_); }
 
-    CompositorAnimationPlayer* Player() const {
-      return compositor_player_.get();
+    CompositorAnimation* GetAnimation() const {
+      return compositor_animation_.get();
     }
 
    private:
-    explicit CompositorAnimationPlayerHolder(Animation*);
+    explicit CompositorAnimationHolder(Animation*);
 
     void Dispose();
 
-    std::unique_ptr<CompositorAnimationPlayer> compositor_player_;
+    std::unique_ptr<CompositorAnimation> compositor_animation_;
     Member<Animation> animation_;
   };
 
@@ -377,7 +378,7 @@
   bool compositor_pending_;
   int compositor_group_;
 
-  Member<CompositorAnimationPlayerHolder> compositor_player_;
+  Member<CompositorAnimationHolder> compositor_animation_;
 
   bool current_time_pending_;
   bool state_is_being_updated_;
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp b/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
index 297570bc..e2407f83 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimations.cpp
@@ -48,7 +48,7 @@
 #include "core/paint/PaintLayer.h"
 #include "core/paint/compositing/CompositedLayerMapping.h"
 #include "platform/animation/AnimationTranslationUtil.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
+#include "platform/animation/CompositorAnimation.h"
 #include "platform/animation/CompositorFilterAnimationCurve.h"
 #include "platform/animation/CompositorFilterKeyframe.h"
 #include "platform/animation/CompositorFloatAnimationCurve.h"
@@ -383,7 +383,7 @@
     double time_offset,
     const Timing& timing,
     const Animation* animation,
-    CompositorAnimationPlayer& compositor_player,
+    CompositorAnimation& compositor_animation,
     const EffectModel& effect,
     Vector<int>& started_animation_ids,
     double animation_playback_rate) {
@@ -402,7 +402,7 @@
   DCHECK(!keyframe_models.IsEmpty());
   for (auto& compositor_keyframe_model : keyframe_models) {
     int id = compositor_keyframe_model->Id();
-    compositor_player.AddKeyframeModel(std::move(compositor_keyframe_model));
+    compositor_animation.AddKeyframeModel(std::move(compositor_keyframe_model));
     started_animation_ids.push_back(id);
   }
   DCHECK(!started_animation_ids.IsEmpty());
@@ -420,9 +420,10 @@
     // compositing update.
     return;
   }
-  CompositorAnimationPlayer* compositor_player = animation.CompositorPlayer();
-  if (compositor_player)
-    compositor_player->RemoveKeyframeModel(id);
+  CompositorAnimation* compositor_animation =
+      animation.GetCompositorAnimation();
+  if (compositor_animation)
+    compositor_animation->RemoveKeyframeModel(id);
 }
 
 void CompositorAnimations::PauseAnimationForTestingOnCompositor(
@@ -436,15 +437,16 @@
   DisableCompositingQueryAsserts disabler;
 
   DCHECK(CheckCanStartElementOnCompositor(element).Ok());
-  CompositorAnimationPlayer* compositor_player = animation.CompositorPlayer();
-  DCHECK(compositor_player);
-  compositor_player->PauseKeyframeModel(id, pause_time);
+  CompositorAnimation* compositor_animation =
+      animation.GetCompositorAnimation();
+  DCHECK(compositor_animation);
+  compositor_animation->PauseKeyframeModel(id, pause_time);
 }
 
 void CompositorAnimations::AttachCompositedLayers(
     Element& element,
-    CompositorAnimationPlayer* compositor_player) {
-  if (!compositor_player)
+    CompositorAnimation* compositor_animation) {
+  if (!compositor_animation)
     return;
 
   if (!element.GetLayoutObject() ||
@@ -468,7 +470,7 @@
       return;
   }
 
-  compositor_player->AttachElement(CompositorElementIdFromUniqueObjectId(
+  compositor_animation->AttachElement(CompositorElementIdFromUniqueObjectId(
       element.GetLayoutObject()->UniqueId(),
       CompositorElementIdNamespace::kPrimary));
 }
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimations.h b/third_party/WebKit/Source/core/animation/CompositorAnimations.h
index d25e6c1d..2b7a61c 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimations.h
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimations.h
@@ -42,7 +42,7 @@
 namespace blink {
 
 class Animation;
-class CompositorAnimationPlayer;
+class CompositorAnimation;
 class Element;
 class KeyframeEffectModelBase;
 
@@ -105,7 +105,7 @@
                                          double time_offset,
                                          const Timing&,
                                          const Animation*,
-                                         CompositorAnimationPlayer&,
+                                         CompositorAnimation&,
                                          const EffectModel&,
                                          Vector<int>& started_animation_ids,
                                          double animation_playback_rate);
@@ -117,7 +117,7 @@
                                                    int id,
                                                    double pause_time);
 
-  static void AttachCompositedLayers(Element&, CompositorAnimationPlayer*);
+  static void AttachCompositedLayers(Element&, CompositorAnimation*);
 
   struct CompositorTiming {
     Timing::PlaybackDirection direction;
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp b/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
index 0888fe1d..522fe42 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
@@ -147,10 +147,10 @@
       Timing& timing,
       StringKeyframeEffectModel& effect,
       Vector<std::unique_ptr<CompositorKeyframeModel>>& keyframe_models,
-      double player_playback_rate) {
+      double animation_playback_rate) {
     CompositorAnimations::GetAnimationOnCompositor(
         timing, 0, std::numeric_limits<double>::quiet_NaN(), 0, effect,
-        keyframe_models, player_playback_rate);
+        keyframe_models, animation_playback_rate);
   }
 
   bool DuplicateSingleKeyframeAndTestIsCandidateOnResult(
@@ -278,7 +278,7 @@
 
   std::unique_ptr<CompositorKeyframeModel> ConvertToCompositorAnimation(
       StringKeyframeEffectModel& effect,
-      double player_playback_rate) {
+      double animation_playback_rate) {
     // As the compositor code only understands AnimatableValues, we must
     // snapshot the effect to make those available.
     // TODO(crbug.com/725385): Remove once compositor uses InterpolationTypes.
@@ -286,7 +286,7 @@
     effect.SnapshotAllCompositorKeyframes(*element_.Get(), *style, nullptr);
 
     Vector<std::unique_ptr<CompositorKeyframeModel>> result;
-    GetAnimationOnCompositor(timing_, effect, result, player_playback_rate);
+    GetAnimationOnCompositor(timing_, effect, result, animation_playback_rate);
     DCHECK_EQ(1U, result.size());
     return std::move(result[0]);
   }
@@ -1061,19 +1061,19 @@
       CreateReplaceOpKeyframe(CSSPropertyOpacity, "0.5", 1.0));
 
   const double kPlaybackRate = 2;
-  const double kPlayerPlaybackRate = -1.5;
+  const double kAnimationPlaybackRate = -1.5;
 
   timing_.playback_rate = kPlaybackRate;
 
   std::unique_ptr<CompositorKeyframeModel> keyframe_model =
-      ConvertToCompositorAnimation(*effect, kPlayerPlaybackRate);
+      ConvertToCompositorAnimation(*effect, kAnimationPlaybackRate);
   EXPECT_EQ(CompositorTargetProperty::OPACITY,
             keyframe_model->TargetProperty());
   EXPECT_EQ(1.0, keyframe_model->Iterations());
   EXPECT_EQ(0, keyframe_model->TimeOffset());
   EXPECT_EQ(CompositorKeyframeModel::Direction::NORMAL,
             keyframe_model->GetDirection());
-  EXPECT_EQ(kPlaybackRate * kPlayerPlaybackRate,
+  EXPECT_EQ(kPlaybackRate * kAnimationPlaybackRate,
             keyframe_model->PlaybackRate());
 
   std::unique_ptr<CompositorFloatAnimationCurve> keyframed_float_curve =
diff --git a/third_party/WebKit/Source/core/animation/ElementAnimation.cpp b/third_party/WebKit/Source/core/animation/ElementAnimation.cpp
index ed53824..fb10084 100644
--- a/third_party/WebKit/Source/core/animation/ElementAnimation.cpp
+++ b/third_party/WebKit/Source/core/animation/ElementAnimation.cpp
@@ -70,7 +70,7 @@
   for (const auto& animation :
        element.GetDocument().Timeline().getAnimations()) {
     DCHECK(animation->effect());
-    if (ToKeyframeEffectReadOnly(animation->effect())->Target() == element &&
+    if (ToKeyframeEffectReadOnly(animation->effect())->target() == element &&
         (animation->effect()->IsCurrent() || animation->effect()->IsInEffect()))
       animations.push_back(animation);
   }
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffect.cpp b/third_party/WebKit/Source/core/animation/KeyframeEffect.cpp
index 24e77de..6031ca8 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffect.cpp
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffect.cpp
@@ -106,7 +106,7 @@
                                        ExceptionState& exception_state) {
   Timing new_timing = source->SpecifiedTiming();
   KeyframeEffectModelBase* model = source->Model()->Clone();
-  return new KeyframeEffect(source->Target(), model, new_timing,
+  return new KeyframeEffect(source->target(), model, new_timing,
                             source->GetPriority(), source->GetEventDelegate());
 }
 
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.cpp b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.cpp
index cc5e2da..9648140 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.cpp
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.cpp
@@ -93,7 +93,7 @@
     ExceptionState& exception_state) {
   Timing new_timing = source->SpecifiedTiming();
   KeyframeEffectModelBase* model = source->Model()->Clone();
-  return new KeyframeEffectReadOnly(source->Target(), model, new_timing,
+  return new KeyframeEffectReadOnly(source->target(), model, new_timing,
                                     source->GetPriority(),
                                     source->GetEventDelegate());
 }
@@ -316,18 +316,18 @@
     double start_time,
     double current_time,
     double animation_playback_rate,
-    CompositorAnimationPlayer* compositor_player) {
+    CompositorAnimation* compositor_animation) {
   DCHECK(!HasActiveAnimationsOnCompositor());
   DCHECK(CheckCanStartAnimationOnCompositor(animation_playback_rate).Ok());
 
-  if (!compositor_player)
-    compositor_player = GetAnimation()->CompositorPlayer();
-  DCHECK(compositor_player);
+  if (!compositor_animation)
+    compositor_animation = GetAnimation()->GetCompositorAnimation();
+  DCHECK(compositor_animation);
 
   CompositorAnimations::StartAnimationOnCompositor(
       *target_, group, start_time, current_time, SpecifiedTiming(),
-      GetAnimation(), *compositor_player, *Model(), compositor_animation_ids_,
-      animation_playback_rate);
+      GetAnimation(), *compositor_animation, *Model(),
+      compositor_animation_ids_, animation_playback_rate);
   DCHECK(!compositor_animation_ids_.IsEmpty());
 }
 
@@ -415,7 +415,7 @@
   DCHECK(target_);
   DCHECK(GetAnimation());
   CompositorAnimations::AttachCompositedLayers(
-      *target_, GetAnimation()->CompositorPlayer());
+      *target_, GetAnimation()->GetCompositorAnimation());
 }
 
 bool KeyframeEffectReadOnly::HasAnimation() const {
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.h b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.h
index 448da67..9c1dfd37 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.h
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.h
@@ -55,6 +55,7 @@
   // IDL implementation.
   String composite() const;
   Vector<ScriptValue> getKeyframes(ScriptState*);
+  Element* target() const { return target_; }
 
   EffectModel::CompositeOperation compositeInternal() const {
     return model_->Composite();
@@ -68,19 +69,17 @@
     model_ = model;
   }
   Priority GetPriority() const { return priority_; }
-  Element* Target() const { return target_; }
 
   void NotifySampledEffectRemovedFromEffectStack();
 
   CompositorAnimations::FailureCode CheckCanStartAnimationOnCompositor(
       double animation_playback_rate) const;
   // Must only be called once.
-  void StartAnimationOnCompositor(
-      int group,
-      double start_time,
-      double time_offset,
-      double animation_playback_rate,
-      CompositorAnimationPlayer* compositor_player = nullptr);
+  void StartAnimationOnCompositor(int group,
+                                  double start_time,
+                                  double time_offset,
+                                  double animation_playback_rate,
+                                  CompositorAnimation* = nullptr);
   bool HasActiveAnimationsOnCompositor() const;
   bool HasActiveAnimationsOnCompositor(const PropertyHandle&) const;
   bool CancelAnimationOnCompositor();
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.idl b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.idl
index 4a0c0aa4..72fc2ed 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.idl
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffectReadOnly.idl
@@ -15,4 +15,5 @@
 ] interface KeyframeEffectReadOnly : AnimationEffectReadOnly {
   readonly attribute CompositeOperation composite;
   [CallWith=ScriptState] sequence<object> getKeyframes();
+  readonly attribute Element? target;
 };
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp b/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
index 30b6c68..3a3cf44 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
@@ -101,7 +101,7 @@
   KeyframeEffect* animation =
       CreateAnimation(script_state, element.Get(), js_keyframes, 0);
 
-  Element* target = animation->Target();
+  Element* target = animation->target();
   EXPECT_EQ(*element.Get(), *target);
 
   const KeyframeVector keyframes = animation->Model()->GetFrames();
@@ -386,30 +386,30 @@
   timing.start_delay = 100;
   timing.end_delay = 100;
   timing.fill_mode = Timing::FillMode::NONE;
-  KeyframeEffect* animation =
+  KeyframeEffect* keyframe_effect =
       KeyframeEffect::Create(nullptr, CreateEmptyEffectModel(), timing);
-  Animation* player = GetDocument().Timeline().Play(animation);
+  Animation* animation = GetDocument().Timeline().Play(keyframe_effect);
   double inf = std::numeric_limits<double>::infinity();
 
-  EXPECT_EQ(100, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(inf, animation->TimeToReverseEffectChange());
+  EXPECT_EQ(100, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(inf, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(100);
-  EXPECT_EQ(100, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(100);
+  EXPECT_EQ(100, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(199);
-  EXPECT_EQ(1, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(199);
+  EXPECT_EQ(1, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(200);
+  animation->SetCurrentTimeInternal(200);
   // End-exclusive.
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(300);
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(100, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(300);
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(100, keyframe_effect->TimeToReverseEffectChange());
 }
 
 TEST_F(KeyframeEffectTest, TimeToEffectChangeWithPlaybackRate) {
@@ -419,30 +419,30 @@
   timing.end_delay = 100;
   timing.playback_rate = 2;
   timing.fill_mode = Timing::FillMode::NONE;
-  KeyframeEffect* animation =
+  KeyframeEffect* keyframe_effect =
       KeyframeEffect::Create(nullptr, CreateEmptyEffectModel(), timing);
-  Animation* player = GetDocument().Timeline().Play(animation);
+  Animation* animation = GetDocument().Timeline().Play(keyframe_effect);
   double inf = std::numeric_limits<double>::infinity();
 
-  EXPECT_EQ(100, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(inf, animation->TimeToReverseEffectChange());
+  EXPECT_EQ(100, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(inf, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(100);
-  EXPECT_EQ(50, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(100);
+  EXPECT_EQ(50, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(149);
-  EXPECT_EQ(1, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(149);
+  EXPECT_EQ(1, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(150);
+  animation->SetCurrentTimeInternal(150);
   // End-exclusive.
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(200);
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(50, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(200);
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(50, keyframe_effect->TimeToReverseEffectChange());
 }
 
 TEST_F(KeyframeEffectTest, TimeToEffectChangeWithNegativePlaybackRate) {
@@ -452,29 +452,29 @@
   timing.end_delay = 100;
   timing.playback_rate = -2;
   timing.fill_mode = Timing::FillMode::NONE;
-  KeyframeEffect* animation =
+  KeyframeEffect* keyframe_effect =
       KeyframeEffect::Create(nullptr, CreateEmptyEffectModel(), timing);
-  Animation* player = GetDocument().Timeline().Play(animation);
+  Animation* animation = GetDocument().Timeline().Play(keyframe_effect);
   double inf = std::numeric_limits<double>::infinity();
 
-  EXPECT_EQ(100, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(inf, animation->TimeToReverseEffectChange());
+  EXPECT_EQ(100, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(inf, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(100);
-  EXPECT_EQ(50, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(100);
+  EXPECT_EQ(50, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(149);
-  EXPECT_EQ(1, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(149);
+  EXPECT_EQ(1, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(150);
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(0, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(150);
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(0, keyframe_effect->TimeToReverseEffectChange());
 
-  player->SetCurrentTimeInternal(200);
-  EXPECT_EQ(inf, animation->TimeToForwardsEffectChange());
-  EXPECT_EQ(50, animation->TimeToReverseEffectChange());
+  animation->SetCurrentTimeInternal(200);
+  EXPECT_EQ(inf, keyframe_effect->TimeToForwardsEffectChange());
+  EXPECT_EQ(50, keyframe_effect->TimeToReverseEffectChange());
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index fc2a9c1..c70ea13e 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -1893,6 +1893,7 @@
       default_value: "1.0",
       type_name: "float",
       computed_style_custom_functions: ["setter"],
+      typedom_types: ["Number"]
     },
     {
       name: "order",
diff --git a/third_party/WebKit/Source/core/css/SelectorQueryTest.cpp b/third_party/WebKit/Source/core/css/SelectorQueryTest.cpp
index a40b80b..62b236c 100644
--- a/third_party/WebKit/Source/core/css/SelectorQueryTest.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorQueryTest.cpp
@@ -248,8 +248,7 @@
   ShadowRoot& shadowRoot =
       scope->EnsureShadow().AddShadowRoot(*scope, ShadowRootType::kOpen);
   // Make the inside the shadow root be identical to that of the outer document.
-  shadowRoot.appendChild(
-      document->documentElement()->CloneElementWithChildren());
+  shadowRoot.appendChild(document->documentElement()->CloneWithChildren());
   static const struct QueryTest kTestCases[] = {
       // Id in the right most selector.
       {"#first", false, 0, {0, 0, 0, 0, 0, 0, 0}},
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSNumericArray.idl b/third_party/WebKit/Source/core/css/cssom/CSSNumericArray.idl
index 4410d0a7..1789d9b 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSNumericArray.idl
+++ b/third_party/WebKit/Source/core/css/cssom/CSSNumericArray.idl
@@ -9,7 +9,7 @@
   Exposed=(Window,LayoutWorklet,PaintWorklet),
   RaisesException=Constructor
 ] interface CSSNumericArray {
+  iterable<CSSNumericValue>;
   readonly attribute unsigned long length;
   getter CSSNumericValue(unsigned long index);
-  iterable<CSSNumericValue>;
 };
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.cpp b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.cpp
index f8fc012e..7942ef3 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.cpp
@@ -54,23 +54,16 @@
                                     ExceptionState& exception_state) {
   CSSStyleValueVector style_value_vector = ParseCSSStyleValue(
       execution_context, property_name, value, exception_state);
-  if (style_value_vector.IsEmpty())
-    return nullptr;
-
-  return style_value_vector[0];
+  return style_value_vector.IsEmpty() ? nullptr : style_value_vector[0];
 }
 
-Optional<CSSStyleValueVector> CSSStyleValue::parseAll(
+CSSStyleValueVector CSSStyleValue::parseAll(
     const ExecutionContext* execution_context,
     const String& property_name,
     const String& value,
     ExceptionState& exception_state) {
-  CSSStyleValueVector style_value_vector = ParseCSSStyleValue(
-      execution_context, property_name, value, exception_state);
-  if (style_value_vector.IsEmpty())
-    return WTF::nullopt;
-
-  return style_value_vector;
+  return ParseCSSStyleValue(execution_context, property_name, value,
+                            exception_state);
 }
 
 String CSSStyleValue::toString() const {
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h
index 943e5e9..579163f 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h
+++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.h
@@ -51,10 +51,10 @@
                               const String& property_name,
                               const String& value,
                               ExceptionState&);
-  static Optional<CSSStyleValueVector> parseAll(const ExecutionContext*,
-                                                const String& property_name,
-                                                const String& value,
-                                                ExceptionState&);
+  static CSSStyleValueVector parseAll(const ExecutionContext*,
+                                      const String& property_name,
+                                      const String& value,
+                                      ExceptionState&);
 
   virtual ~CSSStyleValue() = default;
 
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.idl b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.idl
index 52ecd6e4..d9a273a8 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.idl
+++ b/third_party/WebKit/Source/core/css/cssom/CSSStyleValue.idl
@@ -10,7 +10,7 @@
   Exposed(Window CSSTypedOM,LayoutWorklet CSSTypedOM,PaintWorklet CSSPaintAPI)
 ] interface CSSStyleValue {
   stringifier;
-  // Putting Exposed=Window in the next line makes |parse| not exposed to PaintWorklet.
-  [RaisesException, Exposed=Window, CallWith=ExecutionContext] static CSSStyleValue? parse(DOMString property, DOMString cssText);
-  [RaisesException, Exposed=Window, CallWith=ExecutionContext] static sequence<CSSStyleValue>? parseAll(DOMString property, DOMString cssText);
+  // Putting Exposed=Window in the next line makes |parse| not exposed to Worklets.
+  [RaisesException, Exposed=Window, CallWith=ExecutionContext] static CSSStyleValue parse(DOMString property, DOMString cssText);
+  [RaisesException, Exposed=Window, CallWith=ExecutionContext] static sequence<CSSStyleValue> parseAll(DOMString property, DOMString cssText);
 };
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSTransformValue.idl b/third_party/WebKit/Source/core/css/cssom/CSSTransformValue.idl
index 94e18a57..422db60a 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSTransformValue.idl
+++ b/third_party/WebKit/Source/core/css/cssom/CSSTransformValue.idl
@@ -8,11 +8,10 @@
     RuntimeEnabled=CSSTypedOM,
     Exposed=(Window,LayoutWorklet,PaintWorklet)
 ] interface CSSTransformValue : CSSStyleValue {
-    // https://github.com/w3c/css-houdini-drafts/issues/358
+    iterable<CSSTransformComponent>;
     readonly attribute unsigned long length;
     getter CSSTransformComponent (unsigned long index);
     [RaisesException] setter CSSTransformComponent (unsigned long index, CSSTransformComponent val);
-    iterable<CSSTransformComponent>;
 
     readonly attribute boolean is2D;
     [RaisesException, RuntimeEnabled=GeometryInterfaces] DOMMatrix toMatrix();
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.idl b/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.idl
index 54e661b..5f1eeb3a 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.idl
+++ b/third_party/WebKit/Source/core/css/cssom/CSSUnitValues.idl
@@ -27,7 +27,7 @@
   [NewObject] static CSSUnitValue pc(double value);
   [NewObject] static CSSUnitValue px(double value);
   [NewObject] static CSSUnitValue Q(double value);
-  // Currently unsupported length units that are specified
+  // TODO: Currently unsupported length units that are specified
   // [NewObject] static CSSUnitValue ic(double value);
   // [NewObject] static CSSUnitValue lh(double value);
   // [NewObject] static CSSUnitValue rlh(double value);
diff --git a/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValue.idl b/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValue.idl
index 74b5abb..7f36effb 100644
--- a/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValue.idl
+++ b/third_party/WebKit/Source/core/css/cssom/CSSVariableReferenceValue.idl
@@ -5,7 +5,7 @@
 // Represents a CSS var() reference in a CSS value.
 // Spec: https://drafts.css-houdini.org/css-typed-om/#cssvariablereferencevalue
 [
-    Constructor(DOMString variable, optional CSSUnparsedValue fallback),
+    Constructor(DOMString variable, optional CSSUnparsedValue? fallback),
     RuntimeEnabled=CSSTypedOM,
     Exposed=(Window,LayoutWorklet,PaintWorklet),
     RaisesException=Constructor,
diff --git a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp
index 58c46630..19ecf23 100644
--- a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.cpp
@@ -13,6 +13,16 @@
 
 namespace blink {
 
+int ComputedStylePropertyMap::size() {
+  const ComputedStyle* style = UpdateStyle();
+  if (!style)
+    return 0;
+
+  const auto& variables = ComputedStyleCSSValueMapping::GetVariables(*style);
+  return CSSComputedStyleDeclaration::ComputableProperties().size() +
+         (variables ? variables->size() : 0);
+}
+
 Node* ComputedStylePropertyMap::StyledNode() const {
   DCHECK(node_);
   if (!pseudo_id_)
diff --git a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h
index 561043a..fe16e21 100644
--- a/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/ComputedStylePropertyMap.h
@@ -32,6 +32,8 @@
     StylePropertyMapReadOnly::Trace(visitor);
   }
 
+  int size() override;
+
  protected:
   ComputedStylePropertyMap(Node* node, const String& pseudo_element = String())
       : StylePropertyMapReadOnly(),
diff --git a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp
index 459abb06..078057c 100644
--- a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.cpp
@@ -16,6 +16,12 @@
 DeclaredStylePropertyMap::DeclaredStylePropertyMap(CSSStyleRule* owner_rule)
     : StylePropertyMap(), owner_rule_(owner_rule) {}
 
+int DeclaredStylePropertyMap::size() {
+  if (!GetStyleRule())
+    return 0;
+  return GetStyleRule()->Properties().PropertyCount();
+}
+
 const CSSValue* DeclaredStylePropertyMap::GetProperty(
     CSSPropertyID property_id) {
   if (!GetStyleRule())
diff --git a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h
index c55c59c..d451e9d 100644
--- a/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/DeclaredStylePropertyMap.h
@@ -31,6 +31,8 @@
     StylePropertyMap::Trace(visitor);
   }
 
+  int size() final;
+
  protected:
   const CSSValue* GetProperty(CSSPropertyID) override;
   const CSSValue* GetCustomProperty(AtomicString) override;
diff --git a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp
index 8911637..253d72d 100644
--- a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.cpp
@@ -28,6 +28,10 @@
   }
 }
 
+int FilteredComputedStylePropertyMap::size() {
+  return native_properties_.size() + custom_properties_.size();
+}
+
 const CSSValue* FilteredComputedStylePropertyMap::GetProperty(
     CSSPropertyID property_id) {
   if (!native_properties_.Contains(property_id))
diff --git a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h
index 82533b6..92519e3 100644
--- a/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/FilteredComputedStylePropertyMap.h
@@ -23,6 +23,8 @@
                                                 custom_properties);
   }
 
+  int size() final;
+
  private:
   FilteredComputedStylePropertyMap(
       Node*,
diff --git a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp
index eeef797..68a41ab2 100644
--- a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.cpp
@@ -10,6 +10,11 @@
 
 namespace blink {
 
+int InlineStylePropertyMap::size() {
+  const CSSPropertyValueSet* inline_style = owner_element_->InlineStyle();
+  return inline_style ? inline_style->PropertyCount() : 0;
+}
+
 const CSSValue* InlineStylePropertyMap::GetProperty(CSSPropertyID property_id) {
   const CSSPropertyValueSet* inline_style = owner_element_->InlineStyle();
   return inline_style ? inline_style->GetPropertyCSSValue(property_id)
diff --git a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h
index fcbcb6d..4c76368 100644
--- a/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/InlineStylePropertyMap.h
@@ -21,6 +21,8 @@
     StylePropertyMap::Trace(visitor);
   }
 
+  int size() final;
+
  protected:
   const CSSValue* GetProperty(CSSPropertyID) override;
   const CSSValue* GetCustomProperty(AtomicString) override;
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
index 0dbacc86..37f270e 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
@@ -7,7 +7,6 @@
 
 #include "base/macros.h"
 #include "bindings/core/v8/css_style_value_or_string.h"
-#include "bindings/core/v8/v8_update_function.h"
 #include "core/css/cssom/StylePropertyMapReadOnly.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.idl b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.idl
index c2340b29..fdc7997 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.idl
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.idl
@@ -4,15 +4,12 @@
 
 // https://drafts.css-houdini.org/css-typed-om/#the-stylepropertymap
 
-callback UpdateFunction = CSSStyleValue (CSSStyleValue oldValue);
-
 [
     RuntimeEnabled=CSSTypedOM,
     Exposed=(Window)
 ] interface StylePropertyMap : StylePropertyMapReadOnly {
+    [RaisesException, CallWith=ExecutionContext] void set(DOMString property, (CSSStyleValue or DOMString)... values);
     [RaisesException, CallWith=ExecutionContext] void append(DOMString property, (CSSStyleValue or DOMString)... values);
     [RaisesException, ImplementedAs=remove] void delete(DOMString property);
-    // Putting Exposed=Window in the next line makes |set| not exposed to PaintWorklet.
-    [RaisesException, CallWith=ExecutionContext, Exposed=Window] void set(DOMString property, (CSSStyleValue or DOMString)... values);
     void clear();
 };
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.cpp b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.cpp
index 224bb9c..4788a51 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.cpp
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.cpp
@@ -19,8 +19,7 @@
 namespace {
 
 class StylePropertyMapIterationSource final
-    : public PairIterable<String, CSSStyleValueOrCSSStyleValueSequence>::
-          IterationSource {
+    : public PairIterable<String, CSSStyleValueVector>::IterationSource {
  public:
   explicit StylePropertyMapIterationSource(
       HeapVector<StylePropertyMapReadOnly::StylePropertyMapEntry> values)
@@ -28,7 +27,7 @@
 
   bool Next(ScriptState*,
             String& key,
-            CSSStyleValueOrCSSStyleValueSequence& value,
+            CSSStyleValueVector& value,
             ExceptionState&) override {
     if (index_ >= values_.size())
       return false;
@@ -42,8 +41,7 @@
 
   virtual void Trace(blink::Visitor* visitor) {
     visitor->Trace(values_);
-    PairIterable<String, CSSStyleValueOrCSSStyleValueSequence>::
-        IterationSource::Trace(visitor);
+    PairIterable<String, CSSStyleValueVector>::IterationSource::Trace(visitor);
   }
 
  private:
@@ -115,15 +113,9 @@
                             const CSSValue& css_value) {
     const auto property_id = cssPropertyID(property_name);
 
-    CSSStyleValueOrCSSStyleValueSequence value;
-    const auto style_value_vector =
+    auto values =
         StyleValueFactory::CssValueToStyleValueVector(property_id, css_value);
-    if (style_value_vector.size() == 1)
-      value.SetCSSStyleValue(style_value_vector[0]);
-    else
-      value.SetCSSStyleValueSequence(style_value_vector);
-
-    result.emplace_back(property_name, value);
+    result.emplace_back(property_name, std::move(values));
   });
 
   std::sort(result.begin(), result.end(), [](const auto& a, const auto& b) {
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h
index cfc5ee2..8467f50 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.h
@@ -7,7 +7,6 @@
 
 #include "base/macros.h"
 #include "bindings/core/v8/Iterable.h"
-#include "bindings/core/v8/css_style_value_or_css_style_value_sequence.h"
 #include "core/CSSPropertyNames.h"
 #include "core/CoreExport.h"
 #include "core/css/cssom/CSSStyleValue.h"
@@ -17,12 +16,11 @@
 
 class CORE_EXPORT StylePropertyMapReadOnly
     : public ScriptWrappable,
-      public PairIterable<String, CSSStyleValueOrCSSStyleValueSequence> {
+      public PairIterable<String, CSSStyleValueVector> {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  using StylePropertyMapEntry =
-      std::pair<String, CSSStyleValueOrCSSStyleValueSequence>;
+  using StylePropertyMapEntry = std::pair<String, CSSStyleValueVector>;
 
   virtual ~StylePropertyMapReadOnly() = default;
 
@@ -30,6 +28,8 @@
   CSSStyleValueVector getAll(const String& property_name, ExceptionState&);
   bool has(const String& property_name, ExceptionState&);
 
+  virtual int size() = 0;
+
  protected:
   StylePropertyMapReadOnly() = default;
 
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl
index db12c921..4503c900 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMapReadOnly.idl
@@ -2,11 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// Spec: https://drafts.css-houdini.org/css-typed-om-1/#the-stylepropertymap
 [
     Exposed(Window CSSTypedOM,LayoutWorklet CSSTypedOM,PaintWorklet CSSPaintAPI)
 ] interface StylePropertyMapReadOnly {
+    iterable<DOMString, sequence<CSSStyleValue>>;
+    /* TODO: This should return (undefined or CSSStyleValue),
+       but IDL doesn't have anything like that yet. See:
+       https://github.com/heycam/webidl/issues/60 */
     [RaisesException] CSSStyleValue? get(DOMString property);
     [RaisesException] sequence<CSSStyleValue> getAll(DOMString property);
     [RaisesException] boolean has(DOMString property);
-    iterable<DOMString, (CSSStyleValue or sequence<CSSStyleValue>)>;
+    readonly attribute long size;
 };
diff --git a/third_party/WebKit/Source/core/dom/Attr.cpp b/third_party/WebKit/Source/core/dom/Attr.cpp
index bd61428d..c73f7f2 100644
--- a/third_party/WebKit/Source/core/dom/Attr.cpp
+++ b/third_party/WebKit/Source/core/dom/Attr.cpp
@@ -95,7 +95,7 @@
   setValue(v.IsNull() ? g_empty_atom : AtomicString(v));
 }
 
-Node* Attr::Clone(Document& factory, CloneChildrenFlag) {
+Node* Attr::Clone(Document& factory, CloneChildrenFlag) const {
   return new Attr(factory, name_, value());
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Attr.h b/third_party/WebKit/Source/core/dom/Attr.h
index 9875320e..98cae39 100644
--- a/third_party/WebKit/Source/core/dom/Attr.h
+++ b/third_party/WebKit/Source/core/dom/Attr.h
@@ -74,7 +74,7 @@
 
   String nodeValue() const override { return value(); }
   void setNodeValue(const String&) override;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 
   bool IsAttributeNode() const override { return true; }
 
diff --git a/third_party/WebKit/Source/core/dom/CDATASection.cpp b/third_party/WebKit/Source/core/dom/CDATASection.cpp
index 140b21cd..586981c4 100644
--- a/third_party/WebKit/Source/core/dom/CDATASection.cpp
+++ b/third_party/WebKit/Source/core/dom/CDATASection.cpp
@@ -40,7 +40,7 @@
   return kCdataSectionNode;
 }
 
-Text* CDATASection::CloneWithData(Document& factory, const String& data) {
+Text* CDATASection::CloneWithData(Document& factory, const String& data) const {
   return Create(factory, data);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/CDATASection.h b/third_party/WebKit/Source/core/dom/CDATASection.h
index bb94d1c..f8a0d7c0 100644
--- a/third_party/WebKit/Source/core/dom/CDATASection.h
+++ b/third_party/WebKit/Source/core/dom/CDATASection.h
@@ -38,7 +38,7 @@
 
   String nodeName() const override;
   NodeType getNodeType() const override;
-  Text* CloneWithData(Document&, const String&) override;
+  Text* CloneWithData(Document&, const String&) const override;
 };
 
 DEFINE_NODE_TYPE_CASTS(CDATASection, getNodeType() == Node::kCdataSectionNode);
diff --git a/third_party/WebKit/Source/core/dom/Comment.cpp b/third_party/WebKit/Source/core/dom/Comment.cpp
index 6a22fdc..8a1ccde 100644
--- a/third_party/WebKit/Source/core/dom/Comment.cpp
+++ b/third_party/WebKit/Source/core/dom/Comment.cpp
@@ -40,7 +40,7 @@
   return kCommentNode;
 }
 
-Node* Comment::Clone(Document& factory, CloneChildrenFlag) {
+Node* Comment::Clone(Document& factory, CloneChildrenFlag) const {
   return Create(factory, data());
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Comment.h b/third_party/WebKit/Source/core/dom/Comment.h
index b214861..7c50c20 100644
--- a/third_party/WebKit/Source/core/dom/Comment.h
+++ b/third_party/WebKit/Source/core/dom/Comment.h
@@ -38,7 +38,7 @@
 
   String nodeName() const override;
   NodeType getNodeType() const override;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 };
 
 DEFINE_NODE_TYPE_CASTS(Comment, getNodeType() == Node::kCommentNode);
diff --git a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.cpp b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.cpp
index 745ec83..972142d 100644
--- a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.cpp
@@ -88,21 +88,20 @@
   tree->ComputeAccessibilityTree();
 
   ComputedAccessibleNode* accessible_node =
-      ComputedAccessibleNode::Create(ax_id, tree);
+      local_frame->GetOrCreateComputedAccessibleNode(ax_id, tree);
   resolver_->Resolve(accessible_node);
 }
 
-ComputedAccessibleNode* ComputedAccessibleNode::Create(
-    AXID ax_id,
-    WebComputedAXTree* tree) {
-  // TODO(meredithl): Change to GetOrCreate and check cache for existing node
-  // with this ID.
-  return new ComputedAccessibleNode(ax_id, tree);
+ComputedAccessibleNode* ComputedAccessibleNode::Create(AXID ax_id,
+                                                       WebComputedAXTree* tree,
+                                                       LocalFrame* frame) {
+  return new ComputedAccessibleNode(ax_id, tree, frame);
 }
 
 ComputedAccessibleNode::ComputedAccessibleNode(AXID ax_id,
-                                               WebComputedAXTree* tree)
-    : ax_id_(ax_id), tree_(tree) {}
+                                               WebComputedAXTree* tree,
+                                               LocalFrame* frame)
+    : ax_id_(ax_id), tree_(tree), frame_(frame) {}
 
 ComputedAccessibleNode::~ComputedAccessibleNode() {}
 
@@ -114,14 +113,42 @@
   return GetBoolAttribute(WebAOMBoolAttribute::AOM_ATTR_BUSY, is_null);
 }
 
+bool ComputedAccessibleNode::disabled(bool& is_null) const {
+  bool out;
+  is_null = true;
+  if (tree_->GetBoolAttributeForAXNode(
+          ax_id_, WebAOMBoolAttribute::AOM_ATTR_DISABLED, &out)) {
+    is_null = false;
+  }
+  return out;
+}
+
 bool ComputedAccessibleNode::modal(bool& is_null) const {
   return GetBoolAttribute(WebAOMBoolAttribute::AOM_ATTR_MODAL, is_null);
 }
 
+bool ComputedAccessibleNode::readOnly(bool& is_null) const {
+  bool out;
+  is_null = true;
+  if (tree_->GetBoolAttributeForAXNode(
+          ax_id_, WebAOMBoolAttribute::AOM_ATTR_READONLY, &out)) {
+    is_null = false;
+  }
+  return out;
+}
+
 const String ComputedAccessibleNode::autocomplete() const {
   return GetStringAttribute(WebAOMStringAttribute::AOM_ATTR_AUTOCOMPLETE);
 }
 
+const String ComputedAccessibleNode::checked() const {
+  WebString out;
+  if (tree_->GetCheckedStateForAXNode(ax_id_, &out)) {
+    return out;
+  }
+  return String();
+}
+
 const String ComputedAccessibleNode::keyShortcuts() const {
   return GetStringAttribute(WebAOMStringAttribute::AOM_ATTR_KEY_SHORTCUTS);
 }
@@ -190,7 +217,7 @@
   if (!tree_->GetParentIdForAXNode(ax_id_, &parent_ax_id)) {
     return nullptr;
   }
-  return ComputedAccessibleNode::Create(parent_ax_id, tree_);
+  return frame_->GetOrCreateComputedAccessibleNode(parent_ax_id, tree_);
 }
 
 ComputedAccessibleNode* ComputedAccessibleNode::firstChild() const {
@@ -198,7 +225,7 @@
   if (!tree_->GetFirstChildIdForAXNode(ax_id_, &child_ax_id)) {
     return nullptr;
   }
-  return ComputedAccessibleNode::Create(child_ax_id, tree_);
+  return frame_->GetOrCreateComputedAccessibleNode(child_ax_id, tree_);
 }
 
 ComputedAccessibleNode* ComputedAccessibleNode::lastChild() const {
@@ -206,7 +233,7 @@
   if (!tree_->GetLastChildIdForAXNode(ax_id_, &child_ax_id)) {
     return nullptr;
   }
-  return ComputedAccessibleNode::Create(child_ax_id, tree_);
+  return frame_->GetOrCreateComputedAccessibleNode(child_ax_id, tree_);
 }
 
 ComputedAccessibleNode* ComputedAccessibleNode::previousSibling() const {
@@ -214,7 +241,7 @@
   if (!tree_->GetPreviousSiblingIdForAXNode(ax_id_, &sibling_ax_id)) {
     return nullptr;
   }
-  return ComputedAccessibleNode::Create(sibling_ax_id, tree_);
+  return frame_->GetOrCreateComputedAccessibleNode(sibling_ax_id, tree_);
 }
 
 ComputedAccessibleNode* ComputedAccessibleNode::nextSibling() const {
@@ -222,7 +249,7 @@
   if (!tree_->GetNextSiblingIdForAXNode(ax_id_, &sibling_ax_id)) {
     return nullptr;
   }
-  return ComputedAccessibleNode::Create(sibling_ax_id, tree_);
+  return frame_->GetOrCreateComputedAccessibleNode(sibling_ax_id, tree_);
 }
 
 ScriptPromise ComputedAccessibleNode::ensureUpToDate(
@@ -279,6 +306,7 @@
 }
 
 void ComputedAccessibleNode::Trace(Visitor* visitor) {
+  visitor->Trace(frame_);
   ScriptWrappable::Trace(visitor);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.h b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.h
index fc55387..0a2a074 100644
--- a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.h
+++ b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.h
@@ -11,12 +11,12 @@
 #include "core/dom/events/EventTarget.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "third_party/WebKit/Source/core/dom/Element.h"
+#include "third_party/WebKit/Source/core/frame/LocalFrame.h"
 #include "third_party/WebKit/Source/platform/wtf/text/WTFString.h"
 #include "third_party/WebKit/public/platform/WebComputedAXTree.h"
 
 namespace blink {
 
-class ScriptPromiseResolver;
 class ScriptState;
 
 class ComputedAccessibleNodePromiseResolver final
@@ -46,15 +46,17 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static ComputedAccessibleNode* Create(AXID, WebComputedAXTree*);
+  static ComputedAccessibleNode* Create(AXID, WebComputedAXTree*, LocalFrame*);
   virtual ~ComputedAccessibleNode();
 
   void Trace(Visitor*);
 
-  // TODO(meredithl): add accessors for state and restriction properties.
+  // TODO(meredithl): add accessors for state properties.
   bool atomic(bool& is_null) const;
   bool busy(bool& is_null) const;
+  bool disabled(bool& is_null) const;
   bool modal(bool& is_null) const;
+  bool readOnly(bool& is_null) const;
 
   int32_t colCount(bool& is_null) const;
   int32_t colIndex(bool& is_null) const;
@@ -67,6 +69,7 @@
   int32_t setSize(bool& is_null) const;
 
   const String autocomplete() const;
+  const String checked() const;
   const String keyShortcuts() const;
   const String name() const;
   const String placeholder() const;
@@ -83,7 +86,7 @@
   ScriptPromise ensureUpToDate(ScriptState*);
 
  private:
-  ComputedAccessibleNode(AXID, WebComputedAXTree*);
+  ComputedAccessibleNode(AXID, WebComputedAXTree*, LocalFrame*);
 
   // content::ComputedAXTree callback.
   void OnSnapshotResponse(ScriptPromiseResolver*);
@@ -96,6 +99,7 @@
 
   // This tree is owned by the RenderFrame.
   blink::WebComputedAXTree* tree_;
+  Member<LocalFrame> frame_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.idl b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.idl
index e5b7b77..1e123a2 100644
--- a/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.idl
+++ b/third_party/WebKit/Source/core/dom/ComputedAccessibleNode.idl
@@ -11,7 +11,9 @@
 
     readonly attribute boolean? atomic;
     readonly attribute boolean? busy;
+    readonly attribute boolean? disabled;
     readonly attribute boolean? modal;
+    readonly attribute boolean? readOnly;
 
     readonly attribute long? colCount;
     readonly attribute unsigned long? colIndex;
@@ -24,6 +26,7 @@
     readonly attribute long? setSize;
 
     readonly attribute DOMString? autocomplete;
+    readonly attribute DOMString? checked;
     readonly attribute DOMString? keyShortcuts;
     readonly attribute DOMString? name;
     readonly attribute DOMString? placeholder;
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index e579065..5671acd6 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -974,7 +974,7 @@
 }
 
 void ContainerNode::CloneChildNodesFrom(const ContainerNode& node) {
-  for (Node& child : NodeTraversal::ChildrenOf(node))
+  for (const Node& child : NodeTraversal::ChildrenOf(node))
     AppendChild(child.Clone(GetDocument(), CloneChildrenFlag::kClone));
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index eba7769..c710756 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -4245,7 +4245,7 @@
   return true;
 }
 
-Node* Document::Clone(Document& factory, CloneChildrenFlag flag) {
+Node* Document::Clone(Document& factory, CloneChildrenFlag flag) const {
   DCHECK_EQ(this, &factory)
       << "Document::Clone() doesn't support importNode mode.";
   Document* clone = CloneDocumentWithoutChildren();
@@ -4255,7 +4255,7 @@
   return clone;
 }
 
-Document* Document::CloneDocumentWithoutChildren() {
+Document* Document::CloneDocumentWithoutChildren() const {
   DocumentInit init = DocumentInit::Create()
                           .WithContextDocument(ContextDocument())
                           .WithURL(Url());
@@ -5607,11 +5607,11 @@
   return *doc;
 }
 
-Document* Document::ContextDocument() {
+Document* Document::ContextDocument() const {
   if (context_document_)
     return context_document_;
   if (frame_)
-    return this;
+    return const_cast<Document*>(this);
   return nullptr;
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index f0576a2..dadc315 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -990,7 +990,7 @@
   // The document of the parent frame.
   Document* ParentDocument() const;
   Document& TopDocument() const;
-  Document* ContextDocument();
+  Document* ContextDocument() const;
 
   ScriptRunner* GetScriptRunner() { return script_runner_.Get(); }
 
@@ -1202,7 +1202,7 @@
       const ElementRegistrationOptions&,
       ExceptionState&,
       V0CustomElement::NameSet valid_names = V0CustomElement::kStandardNames);
-  V0CustomElementRegistrationContext* RegistrationContext() {
+  V0CustomElementRegistrationContext* RegistrationContext() const {
     return registration_context_.Get();
   }
   V0CustomElementMicrotaskRunQueue* CustomElementMicrotaskRunQueue();
@@ -1425,7 +1425,7 @@
 
   void ClearXMLVersion() { xml_version_ = String(); }
 
-  virtual Document* CloneDocumentWithoutChildren();
+  virtual Document* CloneDocumentWithoutChildren() const;
 
   void LockCompatibilityMode() { compatibility_mode_locked_ = true; }
   ParserSynchronizationPolicy GetParserSynchronizationPolicy() const {
@@ -1485,7 +1485,7 @@
   String nodeName() const final;
   NodeType getNodeType() const final;
   bool ChildTypeAllowed(NodeType) const final;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
   void CloneDataFromDocument(const Document&);
 
   ShadowCascadeOrder shadow_cascade_order_ = kShadowCascadeNone;
diff --git a/third_party/WebKit/Source/core/dom/DocumentFragment.cpp b/third_party/WebKit/Source/core/dom/DocumentFragment.cpp
index 4b8b8ba..4b76a24 100644
--- a/third_party/WebKit/Source/core/dom/DocumentFragment.cpp
+++ b/third_party/WebKit/Source/core/dom/DocumentFragment.cpp
@@ -59,7 +59,7 @@
   }
 }
 
-Node* DocumentFragment::Clone(Document& factory, CloneChildrenFlag flag) {
+Node* DocumentFragment::Clone(Document& factory, CloneChildrenFlag flag) const {
   DocumentFragment* clone = Create(factory);
   if (flag == CloneChildrenFlag::kClone)
     clone->CloneChildNodesFrom(*this);
diff --git a/third_party/WebKit/Source/core/dom/DocumentFragment.h b/third_party/WebKit/Source/core/dom/DocumentFragment.h
index effb4f3..66a4f373 100644
--- a/third_party/WebKit/Source/core/dom/DocumentFragment.h
+++ b/third_party/WebKit/Source/core/dom/DocumentFragment.h
@@ -52,7 +52,7 @@
 
  private:
   NodeType getNodeType() const final;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
   bool ChildTypeAllowed(NodeType) const override;
 
   bool IsDocumentFragment() const =
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.cpp b/third_party/WebKit/Source/core/dom/DocumentType.cpp
index 449a7be..45b37d8 100644
--- a/third_party/WebKit/Source/core/dom/DocumentType.cpp
+++ b/third_party/WebKit/Source/core/dom/DocumentType.cpp
@@ -44,7 +44,7 @@
   return kDocumentTypeNode;
 }
 
-Node* DocumentType::Clone(Document& factory, CloneChildrenFlag) {
+Node* DocumentType::Clone(Document& factory, CloneChildrenFlag) const {
   return Create(&factory, name_, public_id_, system_id_);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.h b/third_party/WebKit/Source/core/dom/DocumentType.h
index 516ff80b..259f5102 100644
--- a/third_party/WebKit/Source/core/dom/DocumentType.h
+++ b/third_party/WebKit/Source/core/dom/DocumentType.h
@@ -51,7 +51,7 @@
 
   String nodeName() const override;
   NodeType getNodeType() const override;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 
   InsertionNotificationRequest InsertedInto(ContainerNode*) override;
   void RemovedFrom(ContainerNode*) override;
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index aae8bc0f..88b5fad 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -261,39 +261,37 @@
          GetLayoutObject()->Style()->Visibility() == EVisibility::kVisible;
 }
 
-Node* Element::Clone(Document& factory, CloneChildrenFlag flag) {
-  return flag == CloneChildrenFlag::kClone
-             ? CloneElementWithChildren(&factory)
-             : CloneElementWithoutChildren(&factory);
+Node* Element::Clone(Document& factory, CloneChildrenFlag flag) const {
+  return flag == CloneChildrenFlag::kClone ? CloneWithChildren(&factory)
+                                           : CloneWithoutChildren(&factory);
 }
 
-Element* Element::CloneElementWithChildren(Document* nullable_factory) {
-  Element* clone = CloneElementWithoutAttributesAndChildren(
+Element* Element::CloneWithChildren(Document* nullable_factory) const {
+  Element* clone = CloneWithoutAttributesAndChildren(
       nullable_factory ? *nullable_factory : GetDocument());
   // This will catch HTML elements in the wrong namespace that are not correctly
   // copied.  This is a sanity check as HTML overloads some of the DOM methods.
   DCHECK_EQ(IsHTMLElement(), clone->IsHTMLElement());
 
-  clone->CloneAttributesFromElement(*this);
-  clone->CopyNonAttributePropertiesFromElement(*this,
-                                               CloneChildrenFlag::kClone);
+  clone->CloneAttributesFrom(*this);
+  clone->CloneNonAttributePropertiesFrom(*this, CloneChildrenFlag::kClone);
   clone->CloneChildNodesFrom(*this);
   return clone;
 }
 
-Element* Element::CloneElementWithoutChildren(Document* nullable_factory) {
-  Element* clone = CloneElementWithoutAttributesAndChildren(
+Element* Element::CloneWithoutChildren(Document* nullable_factory) const {
+  Element* clone = CloneWithoutAttributesAndChildren(
       nullable_factory ? *nullable_factory : GetDocument());
   // This will catch HTML elements in the wrong namespace that are not correctly
   // copied.  This is a sanity check as HTML overloads some of the DOM methods.
   DCHECK_EQ(IsHTMLElement(), clone->IsHTMLElement());
 
-  clone->CloneAttributesFromElement(*this);
-  clone->CopyNonAttributePropertiesFromElement(*this, CloneChildrenFlag::kSkip);
+  clone->CloneAttributesFrom(*this);
+  clone->CloneNonAttributePropertiesFrom(*this, CloneChildrenFlag::kSkip);
   return clone;
 }
 
-Element* Element::CloneElementWithoutAttributesAndChildren(Document& factory) {
+Element* Element::CloneWithoutAttributesAndChildren(Document& factory) const {
   return factory.CreateElement(TagQName(), CreateElementFlags::ByCloneNode(),
                                IsValue());
 }
@@ -4354,7 +4352,7 @@
   return OriginalStyleForLayoutObject();
 }
 
-void Element::CloneAttributesFromElement(const Element& other) {
+void Element::CloneAttributesFrom(const Element& other) {
   if (HasRareData())
     DetachAllAttrNodesFromElement();
 
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index 7bccc9f..293d2f9 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -351,8 +351,8 @@
 
   String nodeName() const override;
 
-  Element* CloneElementWithChildren(Document* = nullptr);
-  Element* CloneElementWithoutChildren(Document* = nullptr);
+  Element* CloneWithChildren(Document* = nullptr) const;
+  Element* CloneWithoutChildren(Document* = nullptr) const;
 
   void SetBooleanAttribute(const QualifiedName&, bool);
 
@@ -446,13 +446,13 @@
   }
 
   // Clones attributes only.
-  void CloneAttributesFromElement(const Element&);
+  void CloneAttributesFrom(const Element&);
 
   bool HasEquivalentAttributes(const Element* other) const;
 
   // Step 5 of https://dom.spec.whatwg.org/#concept-node-clone
-  virtual void CopyNonAttributePropertiesFromElement(const Element&,
-                                                     CloneChildrenFlag) {}
+  virtual void CloneNonAttributePropertiesFrom(const Element&,
+                                               CloneChildrenFlag) {}
 
   void AttachLayoutTree(AttachContext&) override;
   void DetachLayoutTree(const AttachContext& = AttachContext()) override;
@@ -1012,8 +1012,8 @@
 
   // Clone is private so that non-virtual CloneElementWithChildren and
   // CloneElementWithoutChildren are used instead.
-  Node* Clone(Document&, CloneChildrenFlag) override;
-  virtual Element* CloneElementWithoutAttributesAndChildren(Document& factory);
+  Node* Clone(Document&, CloneChildrenFlag) const override;
+  virtual Element* CloneWithoutAttributesAndChildren(Document& factory) const;
 
   QualifiedName tag_name_;
 
diff --git a/third_party/WebKit/Source/core/dom/IdleDeadlineTest.cpp b/third_party/WebKit/Source/core/dom/IdleDeadlineTest.cpp
index 2f22ee2..fc788dd 100644
--- a/third_party/WebKit/Source/core/dom/IdleDeadlineTest.cpp
+++ b/third_party/WebKit/Source/core/dom/IdleDeadlineTest.cpp
@@ -20,7 +20,6 @@
   ~MockIdleDeadlineScheduler() override = default;
 
   // WebScheduler implementation:
-  base::SingleThreadTaskRunner* TimerTaskRunner() override { return nullptr; }
   base::SingleThreadTaskRunner* V8TaskRunner() override { return nullptr; }
   void Shutdown() override {}
   bool ShouldYieldForHighPriorityWork() override { return true; }
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp
index a2430fca..de2f309 100644
--- a/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -606,7 +606,7 @@
   remove(ASSERT_NO_EXCEPTION);
 }
 
-Node* Node::cloneNode(bool deep, ExceptionState& exception_state) {
+Node* Node::cloneNode(bool deep, ExceptionState& exception_state) const {
   // https://dom.spec.whatwg.org/#dom-node-clonenode
 
   // 1. If context object is a shadow root, then throw a
@@ -623,7 +623,7 @@
                deep ? CloneChildrenFlag::kClone : CloneChildrenFlag::kSkip);
 }
 
-Node* Node::cloneNode(bool deep) {
+Node* Node::cloneNode(bool deep) const {
   return cloneNode(deep, ASSERT_NO_EXCEPTION);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h
index f53dd67a..3b30da64 100644
--- a/third_party/WebKit/Source/core/dom/Node.h
+++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -258,11 +258,11 @@
   Node* appendChild(Node* new_child);
 
   bool hasChildren() const { return firstChild(); }
-  Node* cloneNode(bool deep, ExceptionState&);
+  Node* cloneNode(bool deep, ExceptionState&) const;
   // https://dom.spec.whatwg.org/#concept-node-clone
-  virtual Node* Clone(Document&, CloneChildrenFlag) = 0;
+  virtual Node* Clone(Document&, CloneChildrenFlag) const = 0;
   // This is not web-exposed. We should rename it or remove it.
-  Node* cloneNode(bool deep);
+  Node* cloneNode(bool deep) const;
   void normalize();
 
   bool isEqualNode(Node*) const;
diff --git a/third_party/WebKit/Source/core/dom/NthIndexCacheTest.cpp b/third_party/WebKit/Source/core/dom/NthIndexCacheTest.cpp
index afd89b4..8984787 100644
--- a/third_party/WebKit/Source/core/dom/NthIndexCacheTest.cpp
+++ b/third_party/WebKit/Source/core/dom/NthIndexCacheTest.cpp
@@ -4,28 +4,15 @@
 
 #include "core/dom/NthIndexCache.h"
 
+#include <memory>
 #include "core/dom/Document.h"
 #include "core/html/HTMLElement.h"
-#include "core/testing/DummyPageHolder.h"
+#include "core/testing/PageTestBase.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include <memory>
 
 namespace blink {
 
-class NthIndexCacheTest : public ::testing::Test {
- protected:
-  void SetUp() override;
-
-  Document& GetDocument() const { return dummy_page_holder_->GetDocument(); }
-  void SetHtmlInnerHTML(const char* html_content);
-
- private:
-  std::unique_ptr<DummyPageHolder> dummy_page_holder_;
-};
-
-void NthIndexCacheTest::SetUp() {
-  dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
-}
+class NthIndexCacheTest : public PageTestBase {};
 
 TEST_F(NthIndexCacheTest, NthIndex) {
   GetDocument().documentElement()->SetInnerHTMLFromString(R"HTML(
@@ -44,12 +31,10 @@
 
   NthIndexCache nth_index_cache(GetDocument());
 
+  EXPECT_EQ(nth_index_cache.NthChildIndex(*GetElementById("nth-child")), 12U);
   EXPECT_EQ(
-      nth_index_cache.NthChildIndex(*GetDocument().getElementById("nth-child")),
+      nth_index_cache.NthLastChildIndex(*GetElementById("nth-last-child")),
       12U);
-  EXPECT_EQ(nth_index_cache.NthLastChildIndex(
-                *GetDocument().getElementById("nth-last-child")),
-            12U);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
index 930c235..52fae3fc 100644
--- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
+++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
@@ -80,7 +80,7 @@
   return kProcessingInstructionNode;
 }
 
-Node* ProcessingInstruction::Clone(Document& factory, CloneChildrenFlag) {
+Node* ProcessingInstruction::Clone(Document& factory, CloneChildrenFlag) const {
   // FIXME: Is it a problem that this does not copy m_localHref?
   // What about other data members?
   return Create(factory, target_, data_);
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
index 66a0d2c6..fd83a05 100644
--- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
+++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
@@ -76,7 +76,7 @@
 
   String nodeName() const override;
   NodeType getNodeType() const override;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 
   InsertionNotificationRequest InsertedInto(ContainerNode*) override;
   void RemovedFrom(ContainerNode*) override;
diff --git a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskControllerTest.cpp b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskControllerTest.cpp
index 05fe341..24b75ddf 100644
--- a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskControllerTest.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskControllerTest.cpp
@@ -24,7 +24,6 @@
   ~MockScriptedIdleTaskControllerScheduler() override = default;
 
   // WebScheduler implementation:
-  base::SingleThreadTaskRunner* TimerTaskRunner() override { return nullptr; }
   base::SingleThreadTaskRunner* CompositorTaskRunner() override {
     return nullptr;
   }
diff --git a/third_party/WebKit/Source/core/dom/ShadowRoot.cpp b/third_party/WebKit/Source/core/dom/ShadowRoot.cpp
index daaff8ca..3318cdd 100644
--- a/third_party/WebKit/Source/core/dom/ShadowRoot.cpp
+++ b/third_party/WebKit/Source/core/dom/ShadowRoot.cpp
@@ -93,7 +93,7 @@
   slot_assignment_->DidChangeHostChildSlotName(old_value, new_value);
 }
 
-Node* ShadowRoot::Clone(Document&, CloneChildrenFlag) {
+Node* ShadowRoot::Clone(Document&, CloneChildrenFlag) const {
   NOTREACHED() << "ShadowRoot nodes are not clonable.";
   return nullptr;
 }
@@ -307,7 +307,7 @@
 }
 
 void ShadowRoot::DistributeV1() {
-  EnsureSlotAssignment().ResolveDistribution();
+  EnsureSlotAssignment().RecalcDistribution();
 }
 
 void ShadowRoot::Trace(blink::Visitor* visitor) {
diff --git a/third_party/WebKit/Source/core/dom/ShadowRoot.h b/third_party/WebKit/Source/core/dom/ShadowRoot.h
index 3ccf3b0a..387669b 100644
--- a/third_party/WebKit/Source/core/dom/ShadowRoot.h
+++ b/third_party/WebKit/Source/core/dom/ShadowRoot.h
@@ -55,11 +55,6 @@
   USING_GARBAGE_COLLECTED_MIXIN(ShadowRoot);
 
  public:
-  // FIXME: Current implementation does not work well if a shadow root is
-  // dynamically created.  So multiple shadow subtrees in several elements are
-  // prohibited.
-  // See https://github.com/w3c/webcomponents/issues/102 and
-  // http://crbug.com/234020
   static ShadowRoot* Create(Document& document, ShadowRootType type) {
     return new ShadowRoot(document, type);
   }
@@ -80,11 +75,24 @@
   ElementShadow* Owner() const { return host().Shadow(); }
   ShadowRootType GetType() const { return static_cast<ShadowRootType>(type_); }
   String mode() const {
-    return (GetType() == ShadowRootType::V0 ||
-            GetType() == ShadowRootType::kOpen)
-               ? "open"
-               : "closed";
-  };
+    switch (GetType()) {
+      case ShadowRootType::kUserAgent:
+        // UA ShadowRoot should not be exposed to the Web.
+        NOTREACHED();
+        return "";
+      case ShadowRootType::V0:
+        // v0 ShadowRoot shouldn't support |mode|, however, we must return
+        // something. Return "open" here for a historical reason.
+        return "open";
+      case ShadowRootType::kOpen:
+        return "open";
+      case ShadowRootType::kClosed:
+        return "closed";
+      default:
+        NOTREACHED();
+        return "";
+    }
+  }
 
   bool IsOpenOrV0() const {
     return GetType() == ShadowRootType::V0 ||
@@ -149,7 +157,7 @@
   void innerHTML(StringOrTrustedHTML&) const;
   void setInnerHTML(const StringOrTrustedHTML&, ExceptionState&);
 
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 
   void SetDelegatesFocus(bool flag) { delegates_focus_ = flag; }
   bool delegatesFocus() const { return delegates_focus_; }
diff --git a/third_party/WebKit/Source/core/dom/SlotAssignment.cpp b/third_party/WebKit/Source/core/dom/SlotAssignment.cpp
index 043f8fc..0a10668 100644
--- a/third_party/WebKit/Source/core/dom/SlotAssignment.cpp
+++ b/third_party/WebKit/Source/core/dom/SlotAssignment.cpp
@@ -204,7 +204,7 @@
   DCHECK(owner.IsV1());
 }
 
-void SlotAssignment::ResolveAssignmentNg() {
+void SlotAssignment::RecalcAssignmentNg() {
   DCHECK(RuntimeEnabledFeatures::IncrementalShadowDOMEnabled());
 
   if (!needs_assignment_recalc_)
@@ -245,7 +245,7 @@
   }
 }
 
-void SlotAssignment::ResolveAssignment() {
+void SlotAssignment::RecalcAssignment() {
   DCHECK(!RuntimeEnabledFeatures::IncrementalShadowDOMEnabled());
 
   for (Member<HTMLSlotElement> slot : Slots())
@@ -286,14 +286,14 @@
   }
 }
 
-void SlotAssignment::ResolveDistribution() {
+void SlotAssignment::RecalcDistribution() {
   DCHECK(!RuntimeEnabledFeatures::IncrementalShadowDOMEnabled());
 
-  ResolveAssignment();
+  RecalcAssignment();
   const HeapVector<Member<HTMLSlotElement>>& slots = Slots();
 
   for (auto slot : slots)
-    slot->ResolveDistributedNodes();
+    slot->RecalcDistributedNodes();
 
   // Update each slot's distribution in reverse tree order so that a child slot
   // is visited before its parent slot.
diff --git a/third_party/WebKit/Source/core/dom/SlotAssignment.h b/third_party/WebKit/Source/core/dom/SlotAssignment.h
index 523faff..93efc56 100644
--- a/third_party/WebKit/Source/core/dom/SlotAssignment.h
+++ b/third_party/WebKit/Source/core/dom/SlotAssignment.h
@@ -37,7 +37,7 @@
   // Instead, provide alternative, HTMLSlotElement::hasAssignedNodesSlow()
   // so that slotchange can be detected.
 
-  void ResolveDistribution();
+  void RecalcDistribution();
   const HeapVector<Member<HTMLSlotElement>>& Slots();
 
   void DidAddSlot(HTMLSlotElement&);
@@ -54,7 +54,7 @@
   }
 
   // For Incremental Shadow DOM
-  void ResolveAssignmentNg();
+  void RecalcAssignmentNg();
 
   void Trace(blink::Visitor*);
 
@@ -72,7 +72,7 @@
   HTMLSlotElement* GetCachedFirstSlotWithoutAccessingNodeTree(
       const AtomicString& slot_name);
 
-  void ResolveAssignment();
+  void RecalcAssignment();
 
   void DidAddSlotInternal(HTMLSlotElement&);
   void DidRemoveSlotInternal(HTMLSlotElement&,
diff --git a/third_party/WebKit/Source/core/dom/Text.cpp b/third_party/WebKit/Source/core/dom/Text.cpp
index 9c9666c..0048afa4 100644
--- a/third_party/WebKit/Source/core/dom/Text.cpp
+++ b/third_party/WebKit/Source/core/dom/Text.cpp
@@ -238,7 +238,7 @@
   return kTextNode;
 }
 
-Node* Text::Clone(Document& factory, CloneChildrenFlag) {
+Node* Text::Clone(Document& factory, CloneChildrenFlag) const {
   return CloneWithData(factory, data());
 }
 
@@ -463,7 +463,7 @@
                                         length_of_replaced_data);
 }
 
-Text* Text::CloneWithData(Document& factory, const String& data) {
+Text* Text::CloneWithData(Document& factory, const String& data) const {
   return Create(factory, data);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Text.h b/third_party/WebKit/Source/core/dom/Text.h
index 7e29d74..730dc272 100644
--- a/third_party/WebKit/Source/core/dom/Text.h
+++ b/third_party/WebKit/Source/core/dom/Text.h
@@ -77,14 +77,14 @@
 
  private:
   String nodeName() const override;
-  Node* Clone(Document&, CloneChildrenFlag) override;
+  Node* Clone(Document&, CloneChildrenFlag) const override;
 
   bool IsTextNode() const =
       delete;  // This will catch anyone doing an unnecessary check.
 
   bool NeedsWhitespaceLayoutObject();
 
-  virtual Text* CloneWithData(Document&, const String&);
+  virtual Text* CloneWithData(Document&, const String&) const;
 };
 
 DEFINE_NODE_TYPE_CASTS(Text, IsTextNode());
diff --git a/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp b/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
index ce163303..f3531f1 100644
--- a/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
+++ b/third_party/WebKit/Source/core/editing/InlineBoxPosition.cpp
@@ -223,21 +223,6 @@
   return box.NextLeafChild() && box.NextLeafChild()->IsLineBreak();
 }
 
-template <typename Strategy>
-const LayoutObject& GetLayoutObjectSkippingShadowRoot(
-    const PositionTemplate<Strategy>& position) {
-  // TODO(editing-dev): This function doesn't handle all types of positions. We
-  // may want to investigate callers and decide if we need to generalize it.
-  DCHECK(position.IsNotNull());
-  const Node* anchor_node = position.AnchorNode();
-  const LayoutObject* result =
-      anchor_node->IsShadowRoot()
-          ? ToShadowRoot(anchor_node)->host().GetLayoutObject()
-          : anchor_node->GetLayoutObject();
-  DCHECK(result) << position;
-  return *result;
-}
-
 InlineBoxPosition ComputeInlineBoxPositionForTextNode(
     const LayoutText* text_layout_object,
     int caret_offset,
@@ -329,8 +314,12 @@
 template <typename Strategy>
 PositionWithAffinityTemplate<Strategy> ComputeInlineAdjustedPositionAlgorithm(
     const PositionWithAffinityTemplate<Strategy>& position) {
+  // TODO(yoichio): We don't assume |position| is canonicalized no longer and
+  // there are few cases failing to compute. Fix it: crbug.com/812535.
+  DCHECK(!position.AnchorNode()->IsShadowRoot()) << position;
+  DCHECK(position.GetPosition().AnchorNode()->GetLayoutObject()) << position;
   const LayoutObject& layout_object =
-      GetLayoutObjectSkippingShadowRoot(position.GetPosition());
+      *position.GetPosition().AnchorNode()->GetLayoutObject();
 
   if (layout_object.IsText())
     return position;
@@ -353,8 +342,9 @@
 InlineBoxPosition ComputeInlineBoxPositionForInlineAdjustedPositionAlgorithm(
     const PositionWithAffinityTemplate<Strategy>& adjusted) {
   const PositionTemplate<Strategy>& position = adjusted.GetPosition();
-  const LayoutObject& layout_object =
-      GetLayoutObjectSkippingShadowRoot(position);
+  DCHECK(!position.AnchorNode()->IsShadowRoot()) << adjusted;
+  DCHECK(position.AnchorNode()->GetLayoutObject()) << adjusted;
+  const LayoutObject& layout_object = *position.AnchorNode()->GetLayoutObject();
   const int caret_offset = position.ComputeEditingOffset();
 
   if (layout_object.IsText()) {
diff --git a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
index fcf774c..ca1023ae 100644
--- a/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/ApplyStyleCommand.cpp
@@ -1383,7 +1383,7 @@
         continue;
       if (!child->contains(target_node) && elements_to_push_down.size()) {
         for (const auto& element : elements_to_push_down) {
-          Element* wrapper = element->CloneElementWithoutChildren();
+          Element* wrapper = element->CloneWithoutChildren();
           wrapper->removeAttribute(styleAttr);
           // Delete id attribute from the second element because the same id
           // cannot be used for more than one element
@@ -2000,10 +2000,11 @@
       return;
   }
 
-  if (styled_inline_element_ && add_styled_element == kAddStyledElement)
-    SurroundNodeRangeWithElement(
-        start_node, end_node,
-        styled_inline_element_->CloneElementWithoutChildren(), editing_state);
+  if (styled_inline_element_ && add_styled_element == kAddStyledElement) {
+    SurroundNodeRangeWithElement(start_node, end_node,
+                                 styled_inline_element_->CloneWithoutChildren(),
+                                 editing_state);
+  }
 }
 
 float ApplyStyleCommand::ComputedFontSize(Node* node) {
diff --git a/third_party/WebKit/Source/core/editing/commands/BreakBlockquoteCommand.cpp b/third_party/WebKit/Source/core/editing/commands/BreakBlockquoteCommand.cpp
index a3fc6548..141d0b87 100644
--- a/third_party/WebKit/Source/core/editing/commands/BreakBlockquoteCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/BreakBlockquoteCommand.cpp
@@ -217,7 +217,7 @@
     ancestors.push_back(node);
 
   // Insert a clone of the top blockquote after the break.
-  Element* cloned_blockquote = top_blockquote->CloneElementWithoutChildren();
+  Element* cloned_blockquote = top_blockquote->CloneWithoutChildren();
   InsertNodeAfter(cloned_blockquote, break_element, editing_state);
   if (editing_state->IsAborted())
     return;
@@ -228,7 +228,7 @@
   // or clonedBlockquote if ancestors is empty).
   Element* cloned_ancestor = cloned_blockquote;
   for (size_t i = ancestors.size(); i != 0; --i) {
-    Element* cloned_child = ancestors[i - 1]->CloneElementWithoutChildren();
+    Element* cloned_child = ancestors[i - 1]->CloneWithoutChildren();
     // Preserve list item numbering in cloned lists.
     if (IsHTMLOListElement(*cloned_child)) {
       Node* list_child_node = i > 1 ? ancestors[i - 2].Get() : start_node;
diff --git a/third_party/WebKit/Source/core/editing/commands/InsertParagraphSeparatorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/InsertParagraphSeparatorCommand.cpp
index 476ae10..a4d29b3 100644
--- a/third_party/WebKit/Source/core/editing/commands/InsertParagraphSeparatorCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/InsertParagraphSeparatorCommand.cpp
@@ -167,7 +167,7 @@
   // Make clones of ancestors in between the start node and the start block.
   Element* parent = block_to_insert;
   for (size_t i = ancestors.size(); i != 0; --i) {
-    Element* child = ancestors[i - 1]->CloneElementWithoutChildren();
+    Element* child = ancestors[i - 1]->CloneWithoutChildren();
     // It should always be okay to remove id from the cloned elements, since the
     // originals are not deleted.
     child->removeAttribute(idAttr);
@@ -274,7 +274,7 @@
   } else if (ShouldUseDefaultParagraphElement(start_block)) {
     block_to_insert = CreateDefaultParagraphElement(GetDocument());
   } else {
-    block_to_insert = start_block->CloneElementWithoutChildren();
+    block_to_insert = start_block->CloneWithoutChildren();
   }
 
   VisiblePosition visible_pos =
@@ -314,8 +314,7 @@
       }
 
       if (list_child && list_child != start_block) {
-        Element* list_child_to_insert =
-            list_child->CloneElementWithoutChildren();
+        Element* list_child_to_insert = list_child->CloneWithoutChildren();
         AppendNode(block_to_insert, list_child_to_insert, editing_state);
         if (editing_state->IsAborted())
           return;
@@ -366,8 +365,7 @@
 
     if (is_first_in_block && !nest_new_block) {
       if (list_child && list_child != start_block) {
-        Element* list_child_to_insert =
-            list_child->CloneElementWithoutChildren();
+        Element* list_child_to_insert = list_child->CloneWithoutChildren();
         AppendNode(block_to_insert, list_child_to_insert, editing_state);
         if (editing_state->IsAborted())
           return;
@@ -525,7 +523,7 @@
   if (nest_new_block) {
     AppendNode(block_to_insert, start_block, editing_state);
   } else if (list_child && list_child != start_block) {
-    Element* list_child_to_insert = list_child->CloneElementWithoutChildren();
+    Element* list_child_to_insert = list_child->CloneWithoutChildren();
     AppendNode(block_to_insert, list_child_to_insert, editing_state);
     if (editing_state->IsAborted())
       return;
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceNodeWithSpanCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceNodeWithSpanCommand.cpp
index 782507e..0124891 100644
--- a/third_party/WebKit/Source/core/editing/commands/ReplaceNodeWithSpanCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/ReplaceNodeWithSpanCommand.cpp
@@ -60,7 +60,7 @@
 
   // FIXME: Fix this to send the proper MutationRecords when MutationObservers
   // are present.
-  new_element->CloneAttributesFromElement(element_to_replace);
+  new_element->CloneAttributesFrom(element_to_replace);
 
   parent_node->RemoveChild(&element_to_replace, ASSERT_NO_EXCEPTION);
 }
diff --git a/third_party/WebKit/Source/core/editing/commands/SimplifyMarkupCommand.cpp b/third_party/WebKit/Source/core/editing/commands/SimplifyMarkupCommand.cpp
index b75b073..e4feb16 100644
--- a/third_party/WebKit/Source/core/editing/commands/SimplifyMarkupCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/SimplifyMarkupCommand.cpp
@@ -83,7 +83,7 @@
       }
 
       if (!current_node->GetComputedStyle()
-               ->VisualInvalidationDiff(*starting_style)
+               ->VisualInvalidationDiff(GetDocument(), *starting_style)
                .HasDifference())
         top_node_with_starting_style = current_node;
     }
diff --git a/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp b/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
index 9848c699..5b4728f 100644
--- a/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
@@ -69,7 +69,7 @@
 }
 
 void SplitElementCommand::DoApply(EditingState*) {
-  element1_ = element2_->CloneElementWithoutChildren();
+  element1_ = element2_->CloneWithoutChildren();
 
   ExecuteApply();
 }
diff --git a/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp b/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp
index cf685da..7f63d41 100644
--- a/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp
+++ b/third_party/WebKit/Source/core/editing/serializers/Serialization.cpp
@@ -584,7 +584,7 @@
       element->setAttribute(classAttr, AppleInterchangeNewline);
     } else {
       if (use_clones_of_enclosing_block)
-        element = block->CloneElementWithoutChildren();
+        element = block->CloneWithoutChildren();
       else
         element = CreateDefaultParagraphElement(document);
       FillContainerFromString(element, s);
diff --git a/third_party/WebKit/Source/core/events/event_target_names.json5 b/third_party/WebKit/Source/core/events/event_target_names.json5
index 71ce589..8101a2e 100644
--- a/third_party/WebKit/Source/core/events/event_target_names.json5
+++ b/third_party/WebKit/Source/core/events/event_target_names.json5
@@ -5,7 +5,7 @@
   },
 
   data: [
-    "core/animation/AnimationPlayer",
+    "core/animation/Animation",
     "core/clipboard/Clipboard",
     "core/css/FontFaceSet",
     "core/css/MediaQueryList",
diff --git a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp
index f2cd2c4..98272d7 100644
--- a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.cpp
@@ -11,10 +11,9 @@
 #include "core/dom/StaticNodeList.h"
 #include "core/html/HTMLElement.h"
 #include "core/html/forms/HTMLFormElement.h"
-#include "core/html/forms/HTMLInputElement.h"
+#include "public/web/WebFormControlElement.h"
 #include "public/web/WebFormElement.h"
-#include "public/web/WebInputElement.h"
-#include "public/web/modules/password_manager/WebFormElementObserverCallback.h"
+#include "public/web/modules/autofill/WebFormElementObserverCallback.h"
 
 namespace blink {
 
@@ -126,9 +125,9 @@
 }
 
 WebFormElementObserver* WebFormElementObserver::Create(
-    WebInputElement& element,
+    WebFormControlElement& element,
     std::unique_ptr<WebFormElementObserverCallback> callback) {
-  return new WebFormElementObserverImpl(*element.Unwrap<HTMLInputElement>(),
+  return new WebFormElementObserverImpl(*element.Unwrap<HTMLElement>(),
                                         std::move(callback));
 }
 
diff --git a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.h b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.h
index 8f7054a..ff438a7 100644
--- a/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.h
+++ b/third_party/WebKit/Source/core/exported/WebFormElementObserverImpl.h
@@ -11,7 +11,7 @@
 #include "platform/heap/Member.h"
 #include "platform/heap/SelfKeepAlive.h"
 #include "platform/wtf/Compiler.h"
-#include "public/web/modules/password_manager/WebFormElementObserver.h"
+#include "public/web/modules/autofill/WebFormElementObserver.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/fetch/FetchManager.cpp b/third_party/WebKit/Source/core/fetch/FetchManager.cpp
index 11648d0..17fdfe2 100644
--- a/third_party/WebKit/Source/core/fetch/FetchManager.cpp
+++ b/third_party/WebKit/Source/core/fetch/FetchManager.cpp
@@ -744,9 +744,7 @@
   // referrer string (i.e. String()).
   request.SetHTTPReferrer(SecurityPolicy::GenerateReferrer(
       referrer_policy, request_->Url(), referrer_string));
-  request.SetServiceWorkerMode(is_isolated_world_
-                                   ? WebURLRequest::ServiceWorkerMode::kNone
-                                   : WebURLRequest::ServiceWorkerMode::kAll);
+  request.SetSkipServiceWorker(is_isolated_world_);
 
   if (request_->Keepalive()) {
     if (!CORS::IsCORSSafelistedMethod(request.HttpMethod()) ||
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 2b8fb65..2a95b6bb4 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -245,6 +245,7 @@
   visitor->Trace(console_);
   visitor->Trace(input_method_controller_);
   visitor->Trace(text_suggestion_controller_);
+  visitor->Trace(computed_node_mapping_);
   Frame::Trace(visitor);
   Supplementable<LocalFrame>::Trace(visitor);
 }
@@ -1236,4 +1237,15 @@
           WebURLRequest::kNoScriptOn);
 }
 
+ComputedAccessibleNode* LocalFrame::GetOrCreateComputedAccessibleNode(
+    AXID ax_id,
+    WebComputedAXTree* tree) {
+  if (computed_node_mapping_.find(ax_id) == computed_node_mapping_.end()) {
+    ComputedAccessibleNode* node =
+        ComputedAccessibleNode::Create(ax_id, tree, this);
+    computed_node_mapping_.insert(ax_id, node);
+  }
+  return computed_node_mapping_.at(ax_id);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h
index 1257250..25b36e4e 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -33,6 +33,7 @@
 
 #include "base/macros.h"
 #include "core/CoreExport.h"
+#include "core/dom/ComputedAccessibleNode.h"
 #include "core/dom/UserGestureIndicator.h"
 #include "core/dom/WeakIdentifierMap.h"
 #include "core/editing/Forward.h"
@@ -44,6 +45,7 @@
 #include "platform/Supplementable.h"
 #include "platform/heap/Handle.h"
 #include "platform/scroll/ScrollTypes.h"
+#include "third_party/WebKit/Source/core/dom/AXObjectCache.h"
 #include "third_party/WebKit/common/loader/prefetch_url_loader_service.mojom-blink.h"
 
 namespace service_manager {
@@ -54,6 +56,7 @@
 
 class AssociatedInterfaceProvider;
 class Color;
+class ComputedAccessibleNode;
 class ContentSettingsClient;
 class Document;
 class Editor;
@@ -83,6 +86,7 @@
 class ScriptController;
 class SpellChecker;
 class TextSuggestionController;
+class WebComputedAXTree;
 class WebFrameScheduler;
 class WebPluginContainerImpl;
 class WebURLLoaderFactory;
@@ -313,6 +317,9 @@
   // Prefetch URLLoader service. May return nullptr.
   blink::mojom::blink::PrefetchURLLoaderService* PrefetchURLLoaderService();
 
+  ComputedAccessibleNode* GetOrCreateComputedAccessibleNode(AXID,
+                                                            WebComputedAXTree*);
+
  private:
   friend class FrameNavigationDisabler;
 
@@ -378,6 +385,10 @@
   IntRect remote_viewport_intersection_;
   std::unique_ptr<FrameResourceCoordinator> frame_resource_coordinator_;
 
+  // Used to keep track of which ComputedAccessibleNodes have already been
+  // instantiated in this frame to avoid constructing duplicates.
+  HeapHashMap<AXID, Member<ComputedAccessibleNode>> computed_node_mapping_;
+
   // Per-frame URLLoader factory.
   std::unique_ptr<WebURLLoaderFactory> url_loader_factory_;
 
diff --git a/third_party/WebKit/Source/core/frame/Window.idl b/third_party/WebKit/Source/core/frame/Window.idl
index 3e9c77b7..b078b88 100644
--- a/third_party/WebKit/Source/core/frame/Window.idl
+++ b/third_party/WebKit/Source/core/frame/Window.idl
@@ -179,7 +179,7 @@
 
     // Non-standard APIs
     [MeasureAs=WindowClientInformation, Replaceable] readonly attribute Navigator clientInformation;
-    [MeasureAs=WindowEvent, Custom, NotEnumerable] attribute Event event;
+    [Replaceable, MeasureAs=WindowEvent, Custom=Getter, NotEnumerable] readonly attribute Event event;
     [MeasureAs=WindowFind] boolean find([Default=Undefined] optional DOMString string,
                                         [Default=Undefined] optional boolean caseSensitive,
                                         [Default=Undefined] optional boolean backwards,
diff --git a/third_party/WebKit/Source/core/html/HTMLAttributeNames.json5 b/third_party/WebKit/Source/core/html/HTMLAttributeNames.json5
index 1955e2bf..d52a5be 100644
--- a/third_party/WebKit/Source/core/html/HTMLAttributeNames.json5
+++ b/third_party/WebKit/Source/core/html/HTMLAttributeNames.json5
@@ -145,6 +145,7 @@
     "hspace",
     "http-equiv",
     "id",
+    "imgsizes",
     "incremental",
     "inert",
     "inputmode",
diff --git a/third_party/WebKit/Source/core/html/HTMLDocument.cpp b/third_party/WebKit/Source/core/html/HTMLDocument.cpp
index 4b486e8..e52ae73 100644
--- a/third_party/WebKit/Source/core/html/HTMLDocument.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLDocument.cpp
@@ -74,7 +74,7 @@
 
 HTMLDocument::~HTMLDocument() = default;
 
-Document* HTMLDocument::CloneDocumentWithoutChildren() {
+Document* HTMLDocument::CloneDocumentWithoutChildren() const {
   return Create(DocumentInit::Create()
                     .WithContextDocument(ContextDocument())
                     .WithURL(Url())
diff --git a/third_party/WebKit/Source/core/html/HTMLDocument.h b/third_party/WebKit/Source/core/html/HTMLDocument.h
index d4c6cf8..d705d3b 100644
--- a/third_party/WebKit/Source/core/html/HTMLDocument.h
+++ b/third_party/WebKit/Source/core/html/HTMLDocument.h
@@ -47,7 +47,7 @@
 
   static bool IsCaseSensitiveAttribute(const QualifiedName&);
 
-  Document* CloneDocumentWithoutChildren() final;
+  Document* CloneDocumentWithoutChildren() const final;
 
  protected:
   HTMLDocument(
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
index c7e2ba2..2f6794ae 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -334,7 +334,7 @@
   // with resources from another origin.
   // https://w3c.github.io/ServiceWorker/#implementer-concerns
   if (IsPlugin())
-    request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+    request.SetSkipServiceWorker(true);
 
   child_frame->Loader().Load(FrameLoadRequest(&GetDocument(), request),
                              child_load_type);
diff --git a/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp b/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
index c3cd176..510251a 100644
--- a/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
@@ -218,8 +218,8 @@
     element.SetHTMLScriptElement(this);
 }
 
-Element* HTMLScriptElement::CloneElementWithoutAttributesAndChildren(
-    Document& factory) {
+Element* HTMLScriptElement::CloneWithoutAttributesAndChildren(
+    Document& factory) const {
   CreateElementFlags flags =
       CreateElementFlags::ByCloneNode().SetAlreadyStarted(
           loader_->AlreadyStarted());
diff --git a/third_party/WebKit/Source/core/html/HTMLScriptElement.h b/third_party/WebKit/Source/core/html/HTMLScriptElement.h
index 67eae0e..d1746a43 100644
--- a/third_party/WebKit/Source/core/html/HTMLScriptElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLScriptElement.h
@@ -99,7 +99,7 @@
   void SetScriptElementForBinding(
       HTMLScriptElementOrSVGScriptElement&) override;
 
-  Element* CloneElementWithoutAttributesAndChildren(Document&) override;
+  Element* CloneWithoutAttributesAndChildren(Document&) const override;
 
   TraceWrapperMember<ScriptLoader> loader_;
 };
diff --git a/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp b/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
index 829e360..f21a3b02 100644
--- a/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLSlotElement.cpp
@@ -104,7 +104,7 @@
     return assigned_nodes_;
   }
   if (RuntimeEnabledFeatures::IncrementalShadowDOMEnabled()) {
-    ContainingShadowRoot()->GetSlotAssignment().ResolveAssignmentNg();
+    ContainingShadowRoot()->GetSlotAssignment().RecalcAssignmentNg();
     return assigned_nodes_;
   }
 
@@ -201,7 +201,7 @@
   assigned_nodes_.push_back(&host_child);
 }
 
-void HTMLSlotElement::ResolveDistributedNodes() {
+void HTMLSlotElement::RecalcDistributedNodes() {
   for (auto& node : assigned_nodes_) {
     DCHECK(node->IsSlotable());
     if (HTMLSlotElement* slot =
@@ -255,7 +255,7 @@
 Node* HTMLSlotElement::AssignedNodeNextTo(const Node& node) const {
   DCHECK(SupportsAssignment());
   if (RuntimeEnabledFeatures::IncrementalShadowDOMEnabled())
-    ContainingShadowRoot()->GetSlotAssignment().ResolveAssignmentNg();
+    ContainingShadowRoot()->GetSlotAssignment().RecalcAssignmentNg();
   else
     DCHECK(!NeedsDistributionRecalc());
   // TODO(crbug.com/776656): Use {node -> index} map to avoid O(N) lookup
@@ -269,7 +269,7 @@
 Node* HTMLSlotElement::AssignedNodePreviousTo(const Node& node) const {
   DCHECK(SupportsAssignment());
   if (RuntimeEnabledFeatures::IncrementalShadowDOMEnabled())
-    ContainingShadowRoot()->GetSlotAssignment().ResolveAssignmentNg();
+    ContainingShadowRoot()->GetSlotAssignment().RecalcAssignmentNg();
   else
     DCHECK(!NeedsDistributionRecalc());
   // TODO(crbug.com/776656): Use {node -> index} map to avoid O(N) lookup
diff --git a/third_party/WebKit/Source/core/html/HTMLSlotElement.h b/third_party/WebKit/Source/core/html/HTMLSlotElement.h
index 7f9ebb79..261cfe1b 100644
--- a/third_party/WebKit/Source/core/html/HTMLSlotElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLSlotElement.h
@@ -85,7 +85,7 @@
 
   void AppendAssignedNode(Node&);
 
-  void ResolveDistributedNodes();
+  void RecalcDistributedNodes();
   void AppendDistributedNode(Node&);
   void AppendDistributedNodesFrom(const HTMLSlotElement& other);
 
diff --git a/third_party/WebKit/Source/core/html/HTMLTemplateElement.cpp b/third_party/WebKit/Source/core/html/HTMLTemplateElement.cpp
index f66420d3..14aaaa2 100644
--- a/third_party/WebKit/Source/core/html/HTMLTemplateElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLTemplateElement.cpp
@@ -55,7 +55,7 @@
 }
 
 // https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:concept-node-clone-ext
-void HTMLTemplateElement::CopyNonAttributePropertiesFromElement(
+void HTMLTemplateElement::CloneNonAttributePropertiesFrom(
     const Element& source,
     CloneChildrenFlag flag) {
   if (flag == CloneChildrenFlag::kSkip)
diff --git a/third_party/WebKit/Source/core/html/HTMLTemplateElement.h b/third_party/WebKit/Source/core/html/HTMLTemplateElement.h
index 2fcac22..ed15fdab 100644
--- a/third_party/WebKit/Source/core/html/HTMLTemplateElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLTemplateElement.h
@@ -55,8 +55,8 @@
   virtual void TraceWrappers(const ScriptWrappableVisitor*) const;
 
  private:
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) override;
+  void CloneNonAttributePropertiesFrom(const Element&,
+                                       CloneChildrenFlag) override;
   void DidMoveToNewDocument(Document& old_document) override;
 
   explicit HTMLTemplateElement(Document&);
diff --git a/third_party/WebKit/Source/core/html/LinkStyle.cpp b/third_party/WebKit/Source/core/html/LinkStyle.cpp
index 1d48dc7f..c6a4c44 100644
--- a/third_party/WebKit/Source/core/html/LinkStyle.cpp
+++ b/third_party/WebKit/Source/core/html/LinkStyle.cpp
@@ -351,7 +351,9 @@
       owner_->TypeValue().DeprecatedLower(),
       owner_->AsValue().DeprecatedLower(), owner_->Media().DeprecatedLower(),
       owner_->nonce(), owner_->IntegrityValue(), owner_->GetReferrerPolicy(),
-      owner_->GetNonEmptyURLAttribute(hrefAttr));
+      owner_->GetNonEmptyURLAttribute(hrefAttr),
+      owner_->FastGetAttribute(srcsetAttr),
+      owner_->FastGetAttribute(imgsizesAttr));
 
   WTF::TextEncoding charset = GetCharset();
 
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
index 592d65a..850c1d0b 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -185,7 +185,7 @@
       mime_type_(mime_type),
       start_time_(start_time),
       static_bitmap_image_loaded_(false),
-      callback_(callback),
+      callback_(V8PersistentCallbackFunction<V8BlobCallback>::Create(callback)),
       script_promise_resolver_(resolver) {
   DCHECK(image);
   sk_sp<SkImage> skia_image = image_->PaintImageForCurrentFrame().GetSkImage();
@@ -402,7 +402,8 @@
     context_->GetTaskRunner(TaskType::kCanvasBlobSerialization)
         ->PostTask(FROM_HERE,
                    WTF::Bind(&V8BlobCallback::InvokeAndReportException,
-                             callback_, nullptr, WrapPersistent(result_blob)));
+                             WrapPersistent(callback_.Get()), nullptr,
+                             WrapPersistent(result_blob)));
   } else {
     script_promise_resolver_->Resolve(result_blob);
   }
@@ -416,9 +417,10 @@
     DCHECK(IsMainThread());
     RecordIdleTaskStatusHistogram(idle_task_status_);
     context_->GetTaskRunner(TaskType::kCanvasBlobSerialization)
-        ->PostTask(FROM_HERE,
-                   WTF::Bind(&V8BlobCallback::InvokeAndReportException,
-                             callback_, nullptr, nullptr));
+        ->PostTask(
+            FROM_HERE,
+            WTF::Bind(&V8BlobCallback::InvokeAndReportException,
+                      WrapPersistent(callback_.Get()), nullptr, nullptr));
   } else {
     script_promise_resolver_->Reject(DOMException::Create(
         kEncodingError, "Encoding of the source image has failed."));
@@ -543,6 +545,7 @@
 void CanvasAsyncBlobCreator::Trace(blink::Visitor* visitor) {
   visitor->Trace(context_);
   visitor->Trace(parent_frame_task_runner_);
+  visitor->Trace(callback_);
   visitor->Trace(script_promise_resolver_);
 }
 
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
index 020d5233..c02e8c1 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
@@ -124,7 +124,7 @@
   // an instance gets created, ScheduleAsyncBlobCreation is invoked, and then
   // the instance is only held by a task runner (via PostTask). Thus the
   // instance has only limited lifetime. Hence, Persistent here is okay.
-  V8BlobCallback::Persistent<V8BlobCallback> callback_;
+  Member<V8PersistentCallbackFunction<V8BlobCallback>> callback_;
 
   // Used for OffscreenCanvas only
   Member<ScriptPromiseResolver> script_promise_resolver_;
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.cpp b/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.cpp
index 105e902..26d2c0908 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.cpp
@@ -681,10 +681,10 @@
   return trimmed_name;
 }
 
-void HTMLFormControlElement::CopyNonAttributePropertiesFromElement(
+void HTMLFormControlElement::CloneNonAttributePropertiesFrom(
     const Element& source,
     CloneChildrenFlag flag) {
-  HTMLElement::CopyNonAttributePropertiesFromElement(source, flag);
+  HTMLElement::CloneNonAttributePropertiesFrom(source, flag);
   SetNeedsValidityCheck();
 }
 
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.h b/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.h
index 0a6bfd5e..13537704 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.h
+++ b/third_party/WebKit/Source/core/html/forms/HTMLFormControlElement.h
@@ -131,8 +131,8 @@
 
   String NameForAutofill() const;
 
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) override;
+  void CloneNonAttributePropertiesFrom(const Element&,
+                                       CloneChildrenFlag) override;
 
   FormAssociated* ToFormAssociatedOrNull() override { return this; };
   void AssociateWith(HTMLFormElement*) override;
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/forms/HTMLFormElement.cpp
index 6c32df0d..390d3dfa 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLFormElement.cpp
+++ b/third_party/WebKit/Source/core/html/forms/HTMLFormElement.cpp
@@ -795,11 +795,10 @@
   did_finish_parsing_children_ = true;
 }
 
-void HTMLFormElement::CopyNonAttributePropertiesFromElement(
-    const Element& source,
-    CloneChildrenFlag flag) {
-  was_demoted_ = static_cast<const HTMLFormElement&>(source).was_demoted_;
-  HTMLElement::CopyNonAttributePropertiesFromElement(source, flag);
+void HTMLFormElement::CloneNonAttributePropertiesFrom(const Element& source,
+                                                      CloneChildrenFlag flag) {
+  was_demoted_ = ToHTMLFormElement(source).was_demoted_;
+  HTMLElement::CloneNonAttributePropertiesFrom(source, flag);
 }
 
 void HTMLFormElement::AnonymousNamedGetter(
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLFormElement.h b/third_party/WebKit/Source/core/html/forms/HTMLFormElement.h
index 0023bb6..feab34e0 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLFormElement.h
+++ b/third_party/WebKit/Source/core/html/forms/HTMLFormElement.h
@@ -125,8 +125,8 @@
     return NamedItemType::kName;
   }
 
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) override;
+  void CloneNonAttributePropertiesFrom(const Element&,
+                                       CloneChildrenFlag) override;
 
   void SubmitDialog(FormSubmission*);
   void Submit(Event*, HTMLFormControlElement* submit_button);
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/forms/HTMLInputElement.cpp
index 1ac34e2..7395887b 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLInputElement.cpp
+++ b/third_party/WebKit/Source/core/html/forms/HTMLInputElement.cpp
@@ -1031,11 +1031,9 @@
                                                        preferred_size);
 }
 
-void HTMLInputElement::CopyNonAttributePropertiesFromElement(
-    const Element& source,
-    CloneChildrenFlag flag) {
-  const HTMLInputElement& source_element =
-      static_cast<const HTMLInputElement&>(source);
+void HTMLInputElement::CloneNonAttributePropertiesFrom(const Element& source,
+                                                       CloneChildrenFlag flag) {
+  const HTMLInputElement& source_element = ToHTMLInputElement(source);
 
   non_attribute_value_ = source_element.non_attribute_value_;
   has_dirty_value_ = source_element.has_dirty_value_;
@@ -1044,7 +1042,7 @@
   is_indeterminate_ = source_element.is_indeterminate_;
   input_type_->CopyNonAttributeProperties(source_element);
 
-  TextControlElement::CopyNonAttributePropertiesFromElement(source, flag);
+  TextControlElement::CloneNonAttributePropertiesFrom(source, flag);
 
   needs_to_update_view_value_ = true;
   input_type_view_->UpdateView();
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLInputElement.h b/third_party/WebKit/Source/core/html/forms/HTMLInputElement.h
index 632ec7020..1a665d0 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLInputElement.h
+++ b/third_party/WebKit/Source/core/html/forms/HTMLInputElement.h
@@ -349,8 +349,7 @@
   void FinishParsingChildren() final;
   void ParserDidSetAttributes() final;
 
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) final;
+  void CloneNonAttributePropertiesFrom(const Element&, CloneChildrenFlag) final;
 
   void AttachLayoutTree(AttachContext&) final;
 
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.cpp b/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.cpp
index 063fe36f..3936161 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.cpp
+++ b/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.cpp
@@ -623,15 +623,14 @@
   return true;
 }
 
-void HTMLTextAreaElement::CopyNonAttributePropertiesFromElement(
+void HTMLTextAreaElement::CloneNonAttributePropertiesFrom(
     const Element& source,
     CloneChildrenFlag flag) {
-  const HTMLTextAreaElement& source_element =
-      static_cast<const HTMLTextAreaElement&>(source);
+  const HTMLTextAreaElement& source_element = ToHTMLTextAreaElement(source);
   SetValueCommon(source_element.value(), kDispatchNoEvent,
                  TextControlSetValueSelection::kSetSelectionToEnd);
   is_dirty_ = source_element.is_dirty_;
-  TextControlElement::CopyNonAttributePropertiesFromElement(source, flag);
+  TextControlElement::CloneNonAttributePropertiesFrom(source, flag);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.h b/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.h
index c923be7..7c6202c 100644
--- a/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.h
+++ b/third_party/WebKit/Source/core/html/forms/HTMLTextAreaElement.h
@@ -131,8 +131,7 @@
 
   bool MatchesReadOnlyPseudoClass() const override;
   bool MatchesReadWritePseudoClass() const override;
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) final;
+  void CloneNonAttributePropertiesFrom(const Element&, CloneChildrenFlag) final;
 
   // If the String* argument is 0, apply value().
   bool ValueMissing(const String*) const;
diff --git a/third_party/WebKit/Source/core/html/forms/SliderThumbElement.h b/third_party/WebKit/Source/core/html/forms/SliderThumbElement.h
index ed08eea..f6df10d 100644
--- a/third_party/WebKit/Source/core/html/forms/SliderThumbElement.h
+++ b/third_party/WebKit/Source/core/html/forms/SliderThumbElement.h
@@ -60,7 +60,7 @@
  private:
   SliderThumbElement(Document&);
   LayoutObject* CreateLayoutObject(const ComputedStyle&) override;
-  Element* CloneElementWithoutAttributesAndChildren(Document&) override;
+  Element* CloneWithoutAttributesAndChildren(Document&) const override;
   bool IsDisabledFormControl() const override;
   bool MatchesReadOnlyPseudoClass() const override;
   bool MatchesReadWritePseudoClass() const override;
@@ -71,8 +71,8 @@
       in_drag_mode_;  // Mouse only. Touch is handled by SliderContainerElement.
 };
 
-inline Element* SliderThumbElement::CloneElementWithoutAttributesAndChildren(
-    Document& factory) {
+inline Element* SliderThumbElement::CloneWithoutAttributesAndChildren(
+    Document& factory) const {
   return Create(factory);
 }
 
diff --git a/third_party/WebKit/Source/core/html/forms/TextControlElement.cpp b/third_party/WebKit/Source/core/html/forms/TextControlElement.cpp
index 627c01b..67cf644c 100644
--- a/third_party/WebKit/Source/core/html/forms/TextControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/forms/TextControlElement.cpp
@@ -994,13 +994,13 @@
   HTMLFormControlElementWithState::Trace(visitor);
 }
 
-void TextControlElement::CopyNonAttributePropertiesFromElement(
+void TextControlElement::CloneNonAttributePropertiesFrom(
     const Element& source,
     CloneChildrenFlag flag) {
   const TextControlElement& source_element =
       static_cast<const TextControlElement&>(source);
   last_change_was_user_edit_ = source_element.last_change_was_user_edit_;
-  HTMLFormControlElement::CopyNonAttributePropertiesFromElement(source, flag);
+  HTMLFormControlElement::CloneNonAttributePropertiesFrom(source, flag);
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/forms/TextControlElement.h b/third_party/WebKit/Source/core/html/forms/TextControlElement.h
index 740c4a8..0dce30d 100644
--- a/third_party/WebKit/Source/core/html/forms/TextControlElement.h
+++ b/third_party/WebKit/Source/core/html/forms/TextControlElement.h
@@ -164,8 +164,8 @@
   void AddPlaceholderBreakElementIfNecessary();
   String ValueWithHardLineBreaks() const;
 
-  void CopyNonAttributePropertiesFromElement(const Element&,
-                                             CloneChildrenFlag) override;
+  void CloneNonAttributePropertiesFrom(const Element&,
+                                       CloneChildrenFlag) override;
 
  private:
   unsigned ComputeSelectionStart() const;
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp
index d87a922..63f6d871 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp
@@ -154,6 +154,7 @@
       String attribute_value = html_token_attribute.Value8BitIfNecessary();
       ProcessAttribute(attribute_name, attribute_value);
     }
+    PostProcessAfterAttributes();
   }
 
   void ProcessAttributes(
@@ -163,6 +164,14 @@
     for (const CompactHTMLToken::Attribute& html_token_attribute : attributes)
       ProcessAttribute(html_token_attribute.GetName(),
                        html_token_attribute.Value());
+    PostProcessAfterAttributes();
+  }
+
+  void PostProcessAfterAttributes() {
+    if (Match(tag_impl_, imgTag) ||
+        (link_is_preload_ && as_attribute_value_ == "image" &&
+         RuntimeEnabledFeatures::PreloadImageSrcSetEnabled()))
+      SetUrlFromImageAttributes();
   }
 
   void HandlePictureSourceURL(PictureData& picture_data) {
@@ -295,34 +304,13 @@
                            const String& attribute_value) {
     if (Match(attribute_name, srcAttr) && img_src_url_.IsNull()) {
       img_src_url_ = attribute_value;
-      SetUrlToLoad(BestFitSourceForImageAttributes(
-                       media_values_->DevicePixelRatio(), source_size_,
-                       attribute_value, srcset_image_candidate_),
-                   kAllowURLReplacement);
     } else if (Match(attribute_name, crossoriginAttr)) {
       SetCrossOrigin(attribute_value);
     } else if (Match(attribute_name, srcsetAttr) &&
-               srcset_image_candidate_.IsEmpty()) {
+               srcset_attribute_value_.IsNull()) {
       srcset_attribute_value_ = attribute_value;
-      srcset_image_candidate_ = BestFitSourceForSrcsetAttribute(
-          media_values_->DevicePixelRatio(), source_size_, attribute_value);
-      SetUrlToLoad(BestFitSourceForImageAttributes(
-                       media_values_->DevicePixelRatio(), source_size_,
-                       img_src_url_, srcset_image_candidate_),
-                   kAllowURLReplacement);
     } else if (Match(attribute_name, sizesAttr) && !source_size_set_) {
-      source_size_ =
-          SizesAttributeParser(media_values_, attribute_value).length();
-      source_size_set_ = true;
-      if (!srcset_image_candidate_.IsEmpty()) {
-        srcset_image_candidate_ = BestFitSourceForSrcsetAttribute(
-            media_values_->DevicePixelRatio(), source_size_,
-            srcset_attribute_value_);
-        SetUrlToLoad(BestFitSourceForImageAttributes(
-                         media_values_->DevicePixelRatio(), source_size_,
-                         img_src_url_, srcset_image_candidate_),
-                     kAllowURLReplacement);
-      }
+      ParseSourceSize(attribute_value);
     } else if (!referrer_policy_set_ &&
                Match(attribute_name, referrerpolicyAttr) &&
                !attribute_value.IsNull()) {
@@ -333,12 +321,24 @@
     }
   }
 
+  void SetUrlFromImageAttributes() {
+    srcset_image_candidate_ =
+        BestFitSourceForSrcsetAttribute(media_values_->DevicePixelRatio(),
+                                        source_size_, srcset_attribute_value_);
+    SetUrlToLoad(BestFitSourceForImageAttributes(
+                     media_values_->DevicePixelRatio(), source_size_,
+                     img_src_url_, srcset_image_candidate_),
+                 kAllowURLReplacement);
+  }
+
   template <typename NameType>
   void ProcessLinkAttribute(const NameType& attribute_name,
                             const String& attribute_value) {
     // FIXME - Don't set rel/media/crossorigin multiple times.
     if (Match(attribute_name, hrefAttr)) {
       SetUrlToLoad(attribute_value, kDisallowURLReplacement);
+      // Used in SetUrlFromImageAttributes() when as=image.
+      img_src_url_ = attribute_value;
     } else if (Match(attribute_name, relAttr)) {
       LinkRelAttribute rel(attribute_value);
       link_is_style_sheet_ = rel.IsStyleSheet() && !rel.IsAlternate() &&
@@ -368,6 +368,11 @@
     } else if (Match(attribute_name, integrityAttr)) {
       SubresourceIntegrity::ParseIntegrityAttribute(attribute_value,
                                                     integrity_metadata_);
+    } else if (Match(attribute_name, srcsetAttr) &&
+               srcset_attribute_value_.IsNull()) {
+      srcset_attribute_value_ = attribute_value;
+    } else if (Match(attribute_name, imgsizesAttr) && !source_size_set_) {
+      ParseSourceSize(attribute_value);
     }
   }
 
@@ -392,9 +397,7 @@
       srcset_image_candidate_ = BestFitSourceForSrcsetAttribute(
           media_values_->DevicePixelRatio(), source_size_, attribute_value);
     } else if (Match(attribute_name, sizesAttr) && !source_size_set_) {
-      source_size_ =
-          SizesAttributeParser(media_values_, attribute_value).length();
-      source_size_set_ = true;
+      ParseSourceSize(attribute_value);
       if (!srcset_image_candidate_.IsEmpty()) {
         srcset_image_candidate_ = BestFitSourceForSrcsetAttribute(
             media_values_->DevicePixelRatio(), source_size_,
@@ -546,6 +549,12 @@
     return true;
   }
 
+  void ParseSourceSize(const String& attribute_value) {
+    source_size_ =
+        SizesAttributeParser(media_values_, attribute_value).length();
+    source_size_set_ = true;
+  }
+
   void SetCrossOrigin(const String& cors_setting) {
     cross_origin_ = GetCrossOriginAttributeValue(cors_setting);
   }
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
index 462d9aa5..aa6fab46 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
@@ -59,16 +59,15 @@
     CSSValueHorizontalTb, CSSValueVerticalRl, CSSValueVerticalLr};
 static_assert(WTF_ARRAY_LENGTH(kDisplayWritingModeMap) ==
                   VTTCue::kNumberOfWritingDirections,
-              "kDisplayWritingModeMap should have the same number of elements "
-              "as VTTCue::kNumberOfWritingDirections");
+              "displayWritingModeMap should have the same number of elements "
+              "as VTTCue::NumberOfWritingDirections");
 
 static const CSSValueID kDisplayAlignmentMap[] = {
     CSSValueStart, CSSValueCenter, CSSValueEnd, CSSValueLeft, CSSValueRight};
-static_assert(
-    WTF_ARRAY_LENGTH(kDisplayAlignmentMap) ==
-        static_cast<size_t>(VTTCue::TextAlignment::kNumberOfAlignments),
-    "kDisplayAlignmentMap should have the same number of elements as "
-    "VTTCue::TextAlignment::kNumberOfAlignments");
+static_assert(WTF_ARRAY_LENGTH(kDisplayAlignmentMap) ==
+                  VTTCue::kNumberOfAlignments,
+              "displayAlignmentMap should have the same number of elements as "
+              "VTTCue::NumberOfAlignments");
 
 static const String& AutoKeyword() {
   DEFINE_STATIC_LOCAL(const String, auto_string, ("auto"));
@@ -100,16 +99,6 @@
   return right;
 }
 
-static const String& LineLeftKeyword() {
-  DEFINE_STATIC_LOCAL(const String, line_left, ("line-left"));
-  return line_left;
-}
-
-static const String& LineRightKeyword() {
-  DEFINE_STATIC_LOCAL(const String, line_right, ("line-right"));
-  return line_right;
-}
-
 static const String& HorizontalKeyword() {
   return g_empty_string;
 }
@@ -152,14 +141,13 @@
 
 VTTCueBox::VTTCueBox(Document& document)
     : HTMLDivElement(document),
-      snap_to_lines_position_(std::numeric_limits<float>::quiet_NaN()),
-      line_align_(0) {
+      snap_to_lines_position_(std::numeric_limits<float>::quiet_NaN()) {
   SetShadowPseudoId(AtomicString("-webkit-media-text-track-display"));
 }
 
 void VTTCueBox::ApplyCSSProperties(
     const VTTDisplayParameters& display_parameters) {
-  // https://w3c.github.io/webvtt/#applying-css-properties
+  // http://dev.w3.org/html5/webvtt/#applying-css-properties-to-webvtt-node-objects
 
   // Initialize the (root) list of WebVTT Node Objects with the following CSS
   // settings:
@@ -205,10 +193,8 @@
   // text alignment:
   SetInlineStyleProperty(CSSPropertyTextAlign, display_parameters.text_align);
 
-  // The snap-to-lines position and line alignment is propagated to
-  // LayoutVTTCue.
+  // The snap-to-lines position is propagated to LayoutVTTCue.
   snap_to_lines_position_ = display_parameters.snap_to_lines_position;
-  line_align_ = display_parameters.line_align;
 }
 
 LayoutObject* VTTCueBox::CreateLayoutObject(const ComputedStyle& style) {
@@ -219,7 +205,7 @@
   if (style.GetPosition() == EPosition::kRelative)
     return HTMLDivElement::CreateLayoutObject(style);
 
-  return new LayoutVTTCue(this, snap_to_lines_position_, line_align_);
+  return new LayoutVTTCue(this, snap_to_lines_position_);
 }
 
 VTTCue::VTTCue(Document& document,
@@ -232,9 +218,7 @@
       text_position_(std::numeric_limits<double>::quiet_NaN()),
       cue_size_(100),
       writing_direction_(kHorizontal),
-      text_alignment_(TextAlignment::kCenter),
-      position_alignment_(PositionAlignment::kAuto),
-      line_alignment_(LineAlignment::kStart),
+      cue_alignment_(kCenter),
       vtt_node_tree_(nullptr),
       cue_background_box_(HTMLDivElement::Create(document)),
       snap_to_lines_(true),
@@ -312,7 +296,7 @@
 }
 
 void VTTCue::setLine(const DoubleOrAutoKeyword& position) {
-  // https://w3c.github.io/webvtt/#webvtt-line-cue-setting
+  // http://dev.w3.org/html5/webvtt/#dfn-vttcue-line
   // On setting, the WebVTT cue line must be set to the new value; if the new
   // value is the string "auto", then it must be interpreted as the special
   // value auto.  ("auto" is translated to NaN.)
@@ -332,39 +316,6 @@
   CueDidChange();
 }
 
-const String& VTTCue::lineAlign() const {
-  switch (line_alignment_) {
-    case LineAlignment::kStart:
-      return StartKeyword();
-    case LineAlignment::kCenter:
-      return CenterKeyword();
-    case LineAlignment::kEnd:
-      return EndKeyword();
-    default:
-      NOTREACHED();
-      return g_empty_string;
-  }
-}
-
-void VTTCue::setLineAlign(const String& value) {
-  LineAlignment alignment = line_alignment_;
-  if (value == StartKeyword())
-    alignment = LineAlignment::kStart;
-  else if (value == CenterKeyword())
-    alignment = LineAlignment::kCenter;
-  else if (value == EndKeyword())
-    alignment = LineAlignment::kEnd;
-  else
-    NOTREACHED();
-
-  if (alignment == line_alignment_)
-    return;
-
-  CueWillChange();
-  line_alignment_ = alignment;
-  CueDidChange();
-}
-
 bool VTTCue::TextPositionIsAuto() const {
   return std::isnan(text_position_);
 }
@@ -378,7 +329,7 @@
 
 void VTTCue::setPosition(const DoubleOrAutoKeyword& position,
                          ExceptionState& exception_state) {
-  // https://w3c.github.io/webvtt/#dom-vttcue-position
+  // http://dev.w3.org/html5/webvtt/#dfn-vttcue-position
   // On setting, if the new value is negative or greater than 100, then an
   // IndexSizeError exception must be thrown. Otherwise, the WebVTT cue
   // position must be set to the new value; if the new value is the string
@@ -402,51 +353,14 @@
   CueDidChange();
 }
 
-const String& VTTCue::positionAlign() const {
-  switch (position_alignment_) {
-    case PositionAlignment::kLineLeft:
-      return LineLeftKeyword();
-    case PositionAlignment::kCenter:
-      return CenterKeyword();
-    case PositionAlignment::kLineRight:
-      return LineRightKeyword();
-    case PositionAlignment::kAuto:
-      return AutoKeyword();
-    default:
-      NOTREACHED();
-      return g_empty_string;
-  }
-}
-
-void VTTCue::setPositionAlign(const String& value) {
-  PositionAlignment alignment = position_alignment_;
-  if (value == LineLeftKeyword())
-    alignment = PositionAlignment::kLineLeft;
-  else if (value == CenterKeyword())
-    alignment = PositionAlignment::kCenter;
-  else if (value == LineRightKeyword())
-    alignment = PositionAlignment::kLineRight;
-  else if (value == AutoKeyword())
-    alignment = PositionAlignment::kAuto;
-  else
-    NOTREACHED();
-
-  if (alignment == position_alignment_)
-    return;
-
-  CueWillChange();
-  position_alignment_ = alignment;
-  CueDidChange();
-}
-
 void VTTCue::setSize(double size, ExceptionState& exception_state) {
-  // https://w3c.github.io/webvtt/#dom-vttcue-size
-  // On setting, if the new value is negative or greater than 100, then
-  // an IndexSizeError exception must be thrown.
+  // http://dev.w3.org/html5/webvtt/#dfn-vttcue-size
+  // On setting, if the new value is negative or greater than 100, then throw
+  // an IndexSizeError exception.
   if (IsInvalidPercentage(size, exception_state))
     return;
 
-  // Otherwise, WebVTT cue size must be set to the new value.
+  // Otherwise, set the WebVTT cue size to the new value.
   if (cue_size_ == size)
     return;
 
@@ -456,16 +370,16 @@
 }
 
 const String& VTTCue::align() const {
-  switch (text_alignment_) {
-    case TextAlignment::kStart:
+  switch (cue_alignment_) {
+    case kStart:
       return StartKeyword();
-    case TextAlignment::kCenter:
+    case kCenter:
       return CenterKeyword();
-    case TextAlignment::kEnd:
+    case kEnd:
       return EndKeyword();
-    case TextAlignment::kLeft:
+    case kLeft:
       return LeftKeyword();
-    case TextAlignment::kRight:
+    case kRight:
       return RightKeyword();
     default:
       NOTREACHED();
@@ -474,25 +388,25 @@
 }
 
 void VTTCue::setAlign(const String& value) {
-  TextAlignment alignment = text_alignment_;
+  CueAlignment alignment = cue_alignment_;
   if (value == StartKeyword())
-    alignment = TextAlignment::kStart;
+    alignment = kStart;
   else if (value == CenterKeyword())
-    alignment = TextAlignment::kCenter;
+    alignment = kCenter;
   else if (value == EndKeyword())
-    alignment = TextAlignment::kEnd;
+    alignment = kEnd;
   else if (value == LeftKeyword())
-    alignment = TextAlignment::kLeft;
+    alignment = kLeft;
   else if (value == RightKeyword())
-    alignment = TextAlignment::kRight;
+    alignment = kRight;
   else
     NOTREACHED();
 
-  if (alignment == text_alignment_)
+  if (alignment == cue_alignment_)
     return;
 
   CueWillChange();
-  text_alignment_ = alignment;
+  cue_alignment_ = alignment;
   CueDidChange();
 }
 
@@ -544,27 +458,27 @@
   CueDidChange();
 }
 
-double VTTCue::CalculateComputedLine() const {
-  // https://w3c.github.io/webvtt/#cue-computed-line
+double VTTCue::CalculateComputedLinePosition() const {
+  // http://dev.w3.org/html5/webvtt/#dfn-cue-computed-line
   // A WebVTT cue has a computed line whose value is that returned by the
   // following algorithm, which is defined in terms of the other aspects of
   // the cue:
 
   // 1. If the line is numeric, the WebVTT cue snap-to-lines flag of the
-  //    WebVTT cue is false, and the line is negative or greater than 100,
+  //    WebVTT cue is not set, and the line is negative or greater than 100,
   //    then return 100 and abort these steps.
   if (!LineIsAuto() && !snap_to_lines_ && IsInvalidPercentage(line_position_))
     return 100;
 
   // 2. If the line is numeric, return the value of the WebVTT cue line and
-  //    abort these steps. (Either the WebVTT cue snap-to-lines flag is true,
+  //    abort these steps. (Either the WebVTT cue snap-to-lines flag is set,
   //    so any value, not just those in the range 0..100, is valid, or the
   //    value is in the range 0..100 and is thus valid regardless of the
   //    value of that flag.)
   if (!LineIsAuto())
     return line_position_;
 
-  // 3. If the WebVTT cue snap-to-lines flag of the WebVTT cue is false,
+  // 3. If the WebVTT cue snap-to-lines flag of the WebVTT cue is not set,
   //    return the value 100 and abort these steps. (The WebVTT cue line is
   //    the special value auto.)
   if (!snap_to_lines_)
@@ -644,44 +558,43 @@
   return IsLtr(text_direction) ? CSSValueLtr : CSSValueRtl;
 }
 
-double VTTCue::CalculateComputedPosition() const {
-  // https://w3c.github.io/webvtt/#cue-computed-position
+double VTTCue::CalculateComputedTextPosition() const {
+  // http://dev.w3.org/html5/webvtt/#dfn-cue-computed-position
 
   // 1. If the position is numeric, then return the value of the position and
   // abort these steps. (Otherwise, the position is the special value auto.)
   if (!TextPositionIsAuto())
     return text_position_;
 
-  // 2. If the cue text alignment is left, return 0 and abort these steps.
-  if (text_alignment_ == TextAlignment::kLeft)
-    return 0;
-  // 3. If the cue text alignment is right, return 100 and abort these steps.
-  if (text_alignment_ == TextAlignment::kRight)
-    return 100;
-  // 4. Otherwise, return 50 and abort these steps.
-  return 50;
+  switch (cue_alignment_) {
+    // 2. If the cue text alignment is start or left, return 0 and abort these
+    // steps.
+    case kStart:
+    case kLeft:
+      return 0;
+    // 3. If the cue text alignment is end or right, return 100 and abort these
+    // steps.
+    case kEnd:
+    case kRight:
+      return 100;
+    // 4. If the cue text alignment is center, return 50 and abort these steps.
+    case kCenter:
+      return 50;
+    default:
+      NOTREACHED();
+      return 0;
+  }
 }
 
-VTTCue::PositionAlignment VTTCue::CalculateComputedPositionAlignment() const {
-  // https://w3c.github.io/webvtt/#cue-computed-position-alignment
-
-  // 1. If the WebVTT cue position alignment is not auto, then return the value
-  //    of the WebVTT cue position alignment and abort these steps.
-  if (position_alignment_ != PositionAlignment::kAuto)
-    return position_alignment_;
-
-  // 2. If the WebVTT cue text alignment is left, return line-left and
-  // abort these steps.
-  if (text_alignment_ == TextAlignment::kLeft)
-    return PositionAlignment::kLineLeft;
-
-  // 3. If the WebVTT cue text alignment is right, return line-right and
-  // abort these steps.
-  if (text_alignment_ == TextAlignment::kRight)
-    return PositionAlignment::kLineRight;
-
-  // 4. Otherwise, return center.
-  return PositionAlignment::kCenter;
+VTTCue::CueAlignment VTTCue::CalculateComputedCueAlignment() const {
+  switch (cue_alignment_) {
+    case VTTCue::kLeft:
+      return VTTCue::kStart;
+    case VTTCue::kRight:
+      return VTTCue::kEnd;
+    default:
+      return cue_alignment_;
+  }
 }
 
 VTTDisplayParameters::VTTDisplayParameters()
@@ -689,11 +602,10 @@
       direction(CSSValueNone),
       text_align(CSSValueNone),
       writing_mode(CSSValueNone),
-      snap_to_lines_position(std::numeric_limits<float>::quiet_NaN()),
-      line_align(0) {}
+      snap_to_lines_position(std::numeric_limits<float>::quiet_NaN()) {}
 
 VTTDisplayParameters VTTCue::CalculateDisplayParameters() const {
-  // https://w3c.github.io/webvtt/#apply-webvtt-cue-settings
+  // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
 
   VTTDisplayParameters display_parameters;
 
@@ -705,8 +617,7 @@
 
   // Note: The 'text-align' property is also determined here so that
   // VTTCueBox::applyCSSProperties need not have access to a VTTCue.
-  display_parameters.text_align =
-      kDisplayAlignmentMap[static_cast<size_t>(GetTextAlignment())];
+  display_parameters.text_align = kDisplayAlignmentMap[GetCueAlignment()];
 
   // 3. If the cue writing direction is horizontal, then let block-flow be
   // 'tb'. Otherwise, if the cue writing direction is vertical growing left,
@@ -714,22 +625,21 @@
   // vertical growing right; let block-flow be 'rl'.
   display_parameters.writing_mode = kDisplayWritingModeMap[writing_direction_];
 
-  // Resolve the cue alignment to one of the values {line-left, line-right,
-  // center}.
-  PositionAlignment computed_position_alignment =
-      CalculateComputedPositionAlignment();
+  // Resolve the cue alignment to one of the values {start, end, center}.
+  CueAlignment computed_cue_alignment = CalculateComputedCueAlignment();
 
   // 4. Determine the value of maximum size for cue as per the appropriate
   // rules from the following list:
-  double computed_position = CalculateComputedPosition();
-  double maximum_size = computed_position;
-  if (computed_position_alignment == PositionAlignment::kLineLeft) {
-    maximum_size = 100 - computed_position;
-  } else if (computed_position_alignment == PositionAlignment::kLineRight) {
-    maximum_size = computed_position;
-  } else if (computed_position_alignment == PositionAlignment::kCenter) {
-    maximum_size =
-        computed_position <= 50 ? computed_position : (100 - computed_position);
+  double computed_text_position = CalculateComputedTextPosition();
+  double maximum_size = computed_text_position;
+  if (computed_cue_alignment == kStart) {
+    maximum_size = 100 - computed_text_position;
+  } else if (computed_cue_alignment == kEnd) {
+    maximum_size = computed_text_position;
+  } else if (computed_cue_alignment == kCenter) {
+    maximum_size = computed_text_position <= 50
+                       ? computed_text_position
+                       : (100 - computed_text_position);
     maximum_size = maximum_size * 2;
   } else {
     NOTREACHED();
@@ -748,33 +658,33 @@
   // 7. Determine the value of x-position or y-position for cue as per the
   // appropriate rules from the following list:
   if (writing_direction_ == kHorizontal) {
-    switch (computed_position_alignment) {
-      case PositionAlignment::kLineLeft:
-        display_parameters.position.SetX(computed_position);
+    switch (computed_cue_alignment) {
+      case kStart:
+        display_parameters.position.SetX(computed_text_position);
         break;
-      case PositionAlignment::kLineRight:
-        display_parameters.position.SetX(computed_position -
+      case kEnd:
+        display_parameters.position.SetX(computed_text_position -
                                          display_parameters.size);
         break;
-      case PositionAlignment::kCenter:
-        display_parameters.position.SetX(computed_position -
+      case kCenter:
+        display_parameters.position.SetX(computed_text_position -
                                          display_parameters.size / 2);
         break;
       default:
         NOTREACHED();
     }
   } else {
-    // Cases for writing_direction_ being VerticalGrowing{Left|Right}
-    switch (computed_position_alignment) {
-      case PositionAlignment::kLineLeft:
-        display_parameters.position.SetY(computed_position);
+    // Cases for m_writingDirection being VerticalGrowing{Left|Right}
+    switch (computed_cue_alignment) {
+      case kStart:
+        display_parameters.position.SetY(computed_text_position);
         break;
-      case PositionAlignment::kLineRight:
-        display_parameters.position.SetY(computed_position -
+      case kEnd:
+        display_parameters.position.SetY(computed_text_position -
                                          display_parameters.size);
         break;
-      case PositionAlignment::kCenter:
-        display_parameters.position.SetY(computed_position -
+      case kCenter:
+        display_parameters.position.SetY(computed_text_position -
                                          display_parameters.size / 2);
         break;
       default:
@@ -784,34 +694,29 @@
 
   // A cue has a computed line whose value is defined in terms of
   // the other aspects of the cue.
-  double computed_line = CalculateComputedLine();
+  double computed_line_position = CalculateComputedLinePosition();
 
   // 8. Determine the value of whichever of x-position or y-position is not
   // yet calculated for cue as per the appropriate rules from the following
   // list:
   if (!snap_to_lines_) {
     if (writing_direction_ == kHorizontal)
-      display_parameters.position.SetY(computed_line);
+      display_parameters.position.SetY(computed_line_position);
     else
-      display_parameters.position.SetX(computed_line);
+      display_parameters.position.SetX(computed_line_position);
   } else {
     if (writing_direction_ == kHorizontal)
       display_parameters.position.SetY(0);
     else
       display_parameters.position.SetX(0);
   }
+
   // Step 9 not implemented (margin == 0).
 
-  // The snap-to-lines position and line alignment are propagated to
-  // LayoutVTTCue.
-  if (snap_to_lines_) {
-    display_parameters.snap_to_lines_position = computed_line;
-  } else {
-    if (line_alignment_ == LineAlignment::kCenter)
-      display_parameters.line_align = 50;
-    else if (line_alignment_ == LineAlignment::kEnd)
-      display_parameters.line_align = 100;
-  }
+  // The snap-to-lines position is propagated to LayoutVTTCue.
+  display_parameters.snap_to_lines_position =
+      snap_to_lines_ ? computed_line_position
+                     : std::numeric_limits<float>::quiet_NaN();
 
   DCHECK(std::isfinite(display_parameters.size));
   DCHECK_NE(display_parameters.direction, CSSValueNone);
@@ -932,7 +837,7 @@
   if (cue_size_ != 100)
     UseCounter::Count(GetDocument(), WebFeature::kVTTCueRenderSizeNot100);
 
-  if (text_alignment_ != TextAlignment::kCenter)
+  if (cue_alignment_ != kCenter)
     UseCounter::Count(GetDocument(), WebFeature::kVTTCueRenderAlignNotCenter);
 
   VTTCueBox* display_box = GetDisplayTree();
@@ -975,7 +880,7 @@
 }
 
 static bool ScanPercentage(VTTScanner& input, double& number) {
-  // https://w3c.github.io/webvtt/#parse-a-percentage-string
+  // http://dev.w3.org/html5/webvtt/#dfn-parse-a-percentage-string
 
   // 1. Let input be the string being parsed.
   // 2. If input contains any characters other than U+0025 PERCENT SIGN
@@ -1048,7 +953,7 @@
       }
       case kLine: {
         // If name is a case-sensitive match for "line"
-        // Steps 1 - 2 Handled below.
+        // Steps 1 - 2 skipped.
         double number;
         // 3. If linepos does not contain at least one ASCII digit, then
         //    jump to the step labeled next setting.
@@ -1091,74 +996,32 @@
           if (is_negative && number)
             number = -number;
         }
-        LineAlignment line_alignment = LineAlignment::kStart;
-        if (input.Scan(',')) {
-          // 6. If linealign is a case-sensitive match for the string "start",
-          //    then let cue's WebVTT cue line alignment be start alignment.
-          if (input.Scan("start"))
-            line_alignment = LineAlignment::kStart;
-          // 7. If linealign is a case-sensitive match for the string "center",
-          //    then let cue's WebVTT cue line alignment be center alignment.
-          else if (input.Scan("center"))
-            line_alignment = LineAlignment::kCenter;
-          // 8. If linealign is a case-sensitive match for the string
-          //    "end", then let cue's WebVTT cue line alignment be end
-          //    alignment.
-          else if (input.Scan("end"))
-            line_alignment = LineAlignment::kEnd;
-          // 9. Otherwise, if linealign is not null, then jump to the
-          //    step labeled next setting.
-          else
-            break;
-        }
         if (!input.IsAt(value_run.end()))
           break;
-        // 9. Let cue's WebVTT cue line be number.
+        // 5. Let cue's WebVTT cue line be number.
         line_position_ = number;
-        line_alignment_ = line_alignment;
-        // 10. If the last character in linepos is a U+0025 PERCENT SIGN
-        //     character (%), then let cue's WebVTT cue snap-to-lines
-        //     flag be false. Otherwise, let it be true.
+        // 6. If the last character in linepos is a U+0025 PERCENT SIGN
+        //    character (%), then let cue's WebVTT cue snap-to-lines
+        //    flag be false. Otherwise, let it be true.
         snap_to_lines_ = !is_percentage;
+        // Steps 7 - 9 skipped.
         break;
       }
       case kPosition: {
         // If name is a case-sensitive match for "position".
         double number;
-        // Steps 1 - 2 Handled below.
+        // Steps 1 - 2 skipped.
         // 3. If parse a percentage string from colpos doesn't fail, let
         //    number be the returned percentage, otherwise jump to the step
         //    labeled next setting (text track cue text position's value
         //    remains the special value auto).
         if (!ScanPercentage(input, number))
           break;
-        PositionAlignment position_alignment = PositionAlignment::kAuto;
-        if (input.Scan(',')) {
-          // 4. If colalign is a case-sensitive match for the string
-          //    "line-left", then let cue's WebVTT cue position
-          //    alignment be line-left alignment.
-          if (input.Scan("line-left"))
-            position_alignment = PositionAlignment::kLineLeft;
-          // 5. If colalign is a case-sensitive match for the string
-          //    "center", then let cue's WebVTT cue position alignment
-          //    be center alignment.
-          else if (input.Scan("center"))
-            position_alignment = PositionAlignment::kCenter;
-          // 6. If colalign is a case-sensitive match for the string
-          //    "line-right", then let cue's WebVTT cue position alignment be
-          //    line-right alignment.
-          else if (input.Scan("line-right"))
-            position_alignment = PositionAlignment::kLineRight;
-          // 7. Otherwise, if colalign is not null, then jump to the
-          //    step labeled next setting.
-          else
-            break;
-        }
         if (!input.IsAt(value_run.end()))
           break;
-        // 8. Let cue's cue position be number.
+        // 4. Let cue's cue position be number.
         text_position_ = number;
-        position_alignment_ = position_alignment;
+        // Steps 5 - 7 skipped.
         break;
       }
       case kSize: {
@@ -1180,27 +1043,27 @@
         // 1. If value is a case-sensitive match for the string "start",
         //    then let cue's WebVTT cue text alignment be start alignment.
         if (input.ScanRun(value_run, StartKeyword()))
-          text_alignment_ = TextAlignment::kStart;
+          cue_alignment_ = kStart;
 
         // 2. If value is a case-sensitive match for the string "center",
         //    then let cue's WebVTT cue text alignment be center alignment.
         else if (input.ScanRun(value_run, CenterKeyword()))
-          text_alignment_ = TextAlignment::kCenter;
+          cue_alignment_ = kCenter;
 
         // 3. If value is a case-sensitive match for the string "end", then
         //    let cue's WebVTT cue text alignment be end alignment.
         else if (input.ScanRun(value_run, EndKeyword()))
-          text_alignment_ = TextAlignment::kEnd;
+          cue_alignment_ = kEnd;
 
         // 4. If value is a case-sensitive match for the string "left",
         //    then let cue's WebVTT cue text alignment be left alignment.
         else if (input.ScanRun(value_run, LeftKeyword()))
-          text_alignment_ = TextAlignment::kLeft;
+          cue_alignment_ = kLeft;
 
         // 5. If value is a case-sensitive match for the string "right",
         //    then let cue's WebVTT cue text alignment be right alignment.
         else if (input.ScanRun(value_run, RightKeyword()))
-          text_alignment_ = TextAlignment::kRight;
+          cue_alignment_ = kRight;
         break;
       }
       case kRegionId:
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h
index 0ed8df9..877bc92 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h
@@ -55,7 +55,6 @@
   CSSValueID text_align;
   CSSValueID writing_mode;
   double snap_to_lines_position;
-  int line_align;
 };
 
 class VTTCueBox final : public HTMLDivElement {
@@ -75,7 +74,6 @@
   // non-snap-to-lines layout where no adjustment should take place.
   // This is set in applyCSSProperties and propagated to LayoutVTTCue.
   float snap_to_lines_position_;
-  int line_align_;
 };
 
 class VTTCue final : public TextTrackCue {
@@ -103,15 +101,9 @@
   void line(DoubleOrAutoKeyword&) const;
   void setLine(const DoubleOrAutoKeyword&);
 
-  const String& lineAlign() const;
-  void setLineAlign(const String&);
-
   void position(DoubleOrAutoKeyword&) const;
   void setPosition(const DoubleOrAutoKeyword&, ExceptionState&);
 
-  const String& positionAlign() const;
-  void setPositionAlign(const String&);
-
   double size() const { return cue_size_; }
   void setSize(double, ExceptionState&);
 
@@ -134,7 +126,7 @@
 
   void RemoveDisplayTree(RemovalNotification) override;
 
-  double CalculateComputedLine() const;
+  double CalculateComputedLinePosition() const;
 
   enum WritingDirection {
     kHorizontal = 0,
@@ -144,7 +136,7 @@
   };
   WritingDirection GetWritingDirection() const { return writing_direction_; }
 
-  enum class TextAlignment {
+  enum CueAlignment {
     kStart = 0,
     kCenter,
     kEnd,
@@ -152,13 +144,7 @@
     kRight,
     kNumberOfAlignments
   };
-  TextAlignment GetTextAlignment() const { return text_alignment_; }
-
-  enum class PositionAlignment { kLineLeft, kCenter, kLineRight, kAuto };
-  PositionAlignment GetPositionAlignment() const { return position_alignment_; }
-
-  enum class LineAlignment { kStart, kCenter, kEnd };
-  LineAlignment GetLineAlignment() const { return line_alignment_; }
+  CueAlignment GetCueAlignment() const { return cue_alignment_; }
 
   ExecutionContext* GetExecutionContext() const override;
 
@@ -185,9 +171,8 @@
   bool TextPositionIsAuto() const;
 
   VTTDisplayParameters CalculateDisplayParameters() const;
-  double CalculateComputedPosition() const;
-  LineAlignment CalculateComputedLineAlignment() const;
-  PositionAlignment CalculateComputedPositionAlignment() const;
+  double CalculateComputedTextPosition() const;
+  CueAlignment CalculateComputedCueAlignment() const;
 
   enum CueSetting {
     kNone,
@@ -205,9 +190,7 @@
   double text_position_;
   double cue_size_;
   WritingDirection writing_direction_;
-  TextAlignment text_alignment_;
-  PositionAlignment position_alignment_;
-  LineAlignment line_alignment_;
+  CueAlignment cue_alignment_;
 
   Member<VTTRegion> region_;
   Member<DocumentFragment> vtt_node_tree_;
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.idl b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.idl
index 48df964c..060ab772 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.idl
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.idl
@@ -30,10 +30,9 @@
 // https://w3c.github.io/webvtt/#the-vttcue-interface
 
 enum AutoKeyword { "auto" };
-typedef (double or AutoKeyword) LineAndPositionSetting;
 enum DirectionSetting { "" /* horizontal */, "rl", "lr" };
-enum LineAlignSetting { "start", "center", "end" };
-enum PositionAlignSetting { "line-left", "center", "line-right", "auto" };
+// enum LineAlignSetting { "start", "middle", "end" };
+// enum PositionAlignSetting { "start", "middle", "end", "auto" };
 enum AlignSetting { "start", "center", "end", "left", "right" };
 
 [
@@ -43,10 +42,10 @@
     [RuntimeEnabled=WebVTTRegions] attribute VTTRegion? region;
     attribute DirectionSetting vertical;
     attribute boolean snapToLines;
-    attribute LineAndPositionSetting line;
-    attribute LineAlignSetting lineAlign;
-    [RaisesException=Setter] attribute LineAndPositionSetting position;
-    attribute PositionAlignSetting positionAlign;
+    attribute (double or AutoKeyword) line;
+    // attribute LineAlignSetting lineAlign;
+    [RaisesException=Setter] attribute (double or AutoKeyword) position;
+    // attribute PositionAlignSetting positionAlign;
     [RaisesException=Setter] attribute double size;
     attribute AlignSetting align;
     attribute DOMString text;
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTElement.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTElement.cpp
index 79e1be5..981d724 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTElement.cpp
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTElement.cpp
@@ -74,8 +74,8 @@
   return new VTTElement(node_type, document);
 }
 
-Element* VTTElement::CloneElementWithoutAttributesAndChildren(
-    Document& factory) {
+Element* VTTElement::CloneWithoutAttributesAndChildren(
+    Document& factory) const {
   VTTElement* clone =
       Create(static_cast<VTTNodeType>(web_vtt_node_type_), &factory);
   clone->SetLanguage(language_);
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTElement.h b/third_party/WebKit/Source/core/html/track/vtt/VTTElement.h
index fcc94b1d..dc9497d5 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTElement.h
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTElement.h
@@ -48,7 +48,7 @@
   static VTTElement* Create(const QualifiedName&, Document*);
   HTMLElement* CreateEquivalentHTMLElement(Document&);
 
-  Element* CloneElementWithoutAttributesAndChildren(Document&) override;
+  Element* CloneWithoutAttributesAndChildren(Document&) const override;
 
   void SetVTTNodeType(VTTNodeType type) {
     web_vtt_node_type_ = static_cast<unsigned>(type);
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index ea4820067..283c810 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -120,6 +120,14 @@
          IsHTMLInputElement(ToShadowRoot(target_node)->host());
 }
 
+enum class UMATouchAdjustmentNodeRelation {
+  kSameNode = 0,
+  kTouchStartNodeIsDescendantOfTapNode = 1,
+  kTapNodeIsDescendantOfTouchStartNode = 2,
+  kOthers = 3,
+  kTouchAdjustmentNodeRelationCount = 4
+};
+
 }  // namespace
 
 using namespace HTMLNames;
@@ -1681,6 +1689,9 @@
     padding = LayoutSize(adjusted_event.TapAreaInRootFrame());
     if (!padding.IsEmpty()) {
       padding.Scale(1.f / 2);
+      // Apply the same bound as touchstart event to adjustment padding
+      if (RuntimeEnabledFeatures::UnifiedTouchAdjustmentEnabled())
+        padding = GetHitTestRectForAdjustment(FlooredIntSize(padding));
       hit_type |= HitTestRequest::kListBased;
     }
   }
@@ -1730,9 +1741,24 @@
         stored_adjusted_point,
         (hit_type | HitTestRequest::kReadOnly) & ~HitTestRequest::kListBased);
     if (gesture_event.GetType() == WebInputEvent::kGestureTap) {
-      UMA_HISTOGRAM_BOOLEAN(
-          "Event.Touch.TouchAdjustment.AdjustToSameNode",
-          point_base_result.InnerNode() == hit_test_result.InnerNode());
+      if (hit_test_result.InnerNode() && point_base_result.InnerNode()) {
+        UMATouchAdjustmentNodeRelation relation =
+            UMATouchAdjustmentNodeRelation::kOthers;
+        if (hit_test_result.InnerNode() == point_base_result.InnerNode()) {
+          relation = UMATouchAdjustmentNodeRelation::kSameNode;
+        } else if (point_base_result.InnerNode()->IsDescendantOf(
+                       hit_test_result.InnerNode())) {
+          relation = UMATouchAdjustmentNodeRelation::
+              kTouchStartNodeIsDescendantOfTapNode;
+        } else if (hit_test_result.InnerNode()->IsDescendantOf(
+                       point_base_result.InnerNode())) {
+          relation = UMATouchAdjustmentNodeRelation::
+              kTapNodeIsDescendantOfTouchStartNode;
+        }
+        UMA_HISTOGRAM_ENUMERATION(
+            "Event.Touch.TouchAdjustment.AdjustedNode", relation,
+            UMATouchAdjustmentNodeRelation::kTouchAdjustmentNodeRelationCount);
+      }
     }
     adjusted_event.ApplyTouchAdjustment(
         touch_adjustment_result_.adjusted_point);
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
index 5d7c265..ce07c49 100644
--- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
@@ -27,8 +27,6 @@
 
 namespace {
 
-const float kMaxAdjustmentRadiusDips = 16.f;
-
 size_t ToPointerTypeIndex(WebPointerProperties::PointerType t) {
   return static_cast<size_t>(t);
 }
@@ -36,11 +34,6 @@
   return registry.HasEventHandlers(EventHandlerRegistry::kPointerEvent);
 }
 
-LayoutSize GetHitTestRectForAdjustment(const IntSize& touch_area) {
-  const LayoutSize kMaxSize(kMaxAdjustmentRadiusDips, kMaxAdjustmentRadiusDips);
-  return LayoutSize(touch_area).ShrunkTo(kMaxSize);
-}
-
 }  // namespace
 
 PointerEventManager::PointerEventManager(LocalFrame& frame,
diff --git a/third_party/WebKit/Source/core/inspector/DEPS b/third_party/WebKit/Source/core/inspector/DEPS
new file mode 100644
index 0000000..c724c982
--- /dev/null
+++ b/third_party/WebKit/Source/core/inspector/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+    "+base/sampling_heap_profiler/sampling_heap_profiler.h",
+]
diff --git a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
index c55ce89..ce248a6 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
@@ -126,8 +126,8 @@
           .setFill(computed_timing.fill())
           .setEasing(easing)
           .build();
-  if (effect->Target())
-    animation_object->setBackendNodeId(DOMNodeIds::IdForNode(effect->Target()));
+  if (effect->target())
+    animation_object->setBackendNodeId(DOMNodeIds::IdForNode(effect->target()));
   return animation_object;
 }
 
@@ -178,7 +178,7 @@
     animation_type = AnimationType::WebAnimation;
   } else {
     const Element* element =
-        ToKeyframeEffectReadOnly(animation.effect())->Target();
+        ToKeyframeEffectReadOnly(animation.effect())->target();
     std::unique_ptr<protocol::Animation::KeyframesRule> keyframe_rule;
 
     if (!element) {
@@ -315,7 +315,7 @@
     }
 
     KeyframeEffect* new_effect = KeyframeEffect::Create(
-        old_effect->Target(), new_model, old_effect->SpecifiedTiming());
+        old_effect->target(), new_model, old_effect->SpecifiedTiming());
     is_cloning_ = true;
     blink::Animation* clone =
         blink::Animation::Create(new_effect, animation->timeline());
@@ -421,7 +421,7 @@
   if (id_to_animation_clone_.at(animation_id))
     animation = id_to_animation_clone_.at(animation_id);
   const Element* element =
-      ToKeyframeEffectReadOnly(animation->effect())->Target();
+      ToKeyframeEffectReadOnly(animation->effect())->target();
   Document* document = element->ownerDocument();
   LocalFrame* frame = document ? document->GetFrame() : nullptr;
   ScriptState* script_state =
@@ -474,7 +474,7 @@
     css_properties.push_back(&CSSProperty::Get(cssPropertyID(animation.id())));
   }
 
-  Element* element = effect->Target();
+  Element* element = effect->target();
   HeapVector<Member<CSSStyleDeclaration>> styles =
       css_agent_->MatchingStyles(element);
   std::unique_ptr<WebCryptoDigestor> digestor =
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
index b7ac913b..003ef75 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -836,7 +836,7 @@
     return ToResponse(exception_state);
 
   // Copy over the original node's attributes.
-  new_elem->CloneAttributesFromElement(*old_element);
+  new_elem->CloneAttributesFrom(*old_element);
 
   // Copy over the original node's children.
   for (Node* child = old_element->firstChild(); child;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorMemoryAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorMemoryAgent.cpp
index b674ab7..392c49f 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorMemoryAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorMemoryAgent.cpp
@@ -31,10 +31,10 @@
 #include "core/inspector/InspectorMemoryAgent.h"
 
 #include "base/debug/stack_trace.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
 #include "core/frame/LocalFrameClient.h"
 #include "core/inspector/InspectedFrames.h"
 #include "platform/InstanceCounters.h"
-#include "public/common/sampling_heap_profiler/sampling_heap_profiler.h"
 
 namespace blink {
 
@@ -101,11 +101,11 @@
       in_sampling_interval.fromMaybe(kDefaultNativeMemorySamplingInterval);
   if (interval <= 0)
     return Response::Error("Invalid sampling rate.");
-  SamplingHeapProfiler::GetInstance()->SetSamplingInterval(interval);
+  base::SamplingHeapProfiler::GetInstance()->SetSamplingInterval(interval);
   state_->setInteger(MemoryAgentState::samplingProfileInterval, interval);
   if (in_suppressRandomness.fromMaybe(false))
-    SamplingHeapProfiler::GetInstance()->SuppressRandomnessForTest();
-  profile_id_ = SamplingHeapProfiler::GetInstance()->Start();
+    base::SamplingHeapProfiler::GetInstance()->SuppressRandomnessForTest();
+  profile_id_ = base::SamplingHeapProfiler::GetInstance()->Start();
   return Response::OK();
 }
 
@@ -115,7 +115,7 @@
                      &sampling_interval);
   if (!sampling_interval)
     return Response::Error("Sampling profiler is not started.");
-  SamplingHeapProfiler::GetInstance()->Stop();
+  base::SamplingHeapProfiler::GetInstance()->Stop();
   state_->setInteger(MemoryAgentState::samplingProfileInterval, 0);
   return Response::OK();
 }
@@ -137,8 +137,8 @@
   std::unique_ptr<protocol::Array<protocol::Memory::SamplingProfileNode>>
       samples =
           protocol::Array<protocol::Memory::SamplingProfileNode>::create();
-  std::vector<SamplingHeapProfiler::Sample> raw_samples =
-      SamplingHeapProfiler::GetInstance()->GetSamples(id);
+  std::vector<base::SamplingHeapProfiler::Sample> raw_samples =
+      base::SamplingHeapProfiler::GetInstance()->GetSamples(id);
 
   for (auto& it : raw_samples) {
     std::unique_ptr<protocol::Array<protocol::String>> stack =
diff --git a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp
index a0757d4..9c6bbc9 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorNetworkAgent.cpp
@@ -845,7 +845,7 @@
     request.SetShouldResetAppCache(true);
   }
   if (state_->booleanProperty(NetworkAgentState::kBypassServiceWorker, false))
-    request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+    request.SetSkipServiceWorker(true);
 
   InspectorPageAgent::ResourceType type =
       InspectorPageAgent::ToResourceType(resource_type);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
index 69e0470..4391f26 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
@@ -1285,7 +1285,7 @@
   if (const AnimationEffectReadOnly* effect = animation.effect()) {
     value->SetString("name", animation.id());
     if (effect->IsKeyframeEffectReadOnly()) {
-      if (Element* target = ToKeyframeEffectReadOnly(effect)->Target())
+      if (Element* target = ToKeyframeEffectReadOnly(effect)->target())
         SetNodeInfo(value.get(), target, "nodeId", "nodeName");
     }
   }
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index 5758b7e..dc8254d 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1833,7 +1833,8 @@
 
 void LayoutObject::FirstLineStyleDidChange(const ComputedStyle& old_style,
                                            const ComputedStyle& new_style) {
-  StyleDifference diff = old_style.VisualInvalidationDiff(new_style);
+  StyleDifference diff =
+      old_style.VisualInvalidationDiff(GetDocument(), new_style);
 
   if (diff.NeedsFullPaintInvalidation() ||
       diff.TextDecorationOrColorChanged()) {
@@ -1893,7 +1894,7 @@
 
   StyleDifference diff;
   if (style_)
-    diff = style_->VisualInvalidationDiff(*style);
+    diff = style_->VisualInvalidationDiff(GetDocument(), *style);
 
   diff = AdjustStyleDifference(diff);
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
index 3f7a780..3f21a71 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
@@ -482,12 +482,10 @@
     ts << " paint_offset=(" << fragment->PaintOffset().ToString()
        << ") visual_rect=(" << fragment->VisualRect().ToString() << ")";
     if (fragment->HasLocalBorderBoxProperties()) {
-      auto local_properties = fragment->LocalBorderBoxProperties();
       // To know where they point into the paint property tree, you can dump
       // the tree using ShowAllPropertyTrees(frame_view).
-      ts << " state=(t:" << local_properties.Transform()
-         << ", c:" << local_properties.Clip()
-         << ", e:" << local_properties.Effect() << ")";
+      ts << " state=(" << fragment->LocalBorderBoxProperties().ToString()
+         << ")";
     }
     ts << "\n";
   }
diff --git a/third_party/WebKit/Source/core/layout/LayoutVTTCue.cpp b/third_party/WebKit/Source/core/layout/LayoutVTTCue.cpp
index c0fa4525..a46f033 100644
--- a/third_party/WebKit/Source/core/layout/LayoutVTTCue.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutVTTCue.cpp
@@ -89,7 +89,7 @@
   if (IsFlippedBlocksWritingMode(writing_mode))
     line_position = -(line_position + 1);
 
-  // 9. Let position be the result of multiplying step and line.
+  // 9. Let position be the result of multiplying step and line offset.
   LayoutUnit position = step * line_position;
 
   // 10. Vertical Growing Left: Decrease position by the width of the
@@ -148,7 +148,7 @@
 bool SnapToLinesLayouter::ShouldSwitchDirection(InlineFlowBox* first_line_box,
                                                 LayoutUnit step,
                                                 LayoutUnit margin) const {
-  // 16. Horizontal: If step is negative and the top of the first line box in
+  // 17. Horizontal: If step is negative and the top of the first line box in
   // boxes is now above the top of the title area, or if step is positive and
   // the bottom of the first line box in boxes is now below the bottom of the
   // title area, jump to the step labeled switch direction.
@@ -167,7 +167,7 @@
 }
 
 void SnapToLinesLayouter::UpdateLayout() {
-  // https://w3c.github.io/webvtt/#apply-webvtt-cue-settings
+  // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
   // Step 13, "If cue's text track cue snap-to-lines flag is set".
 
   InlineFlowBox* first_line_box = FindFirstLineBox();
@@ -236,8 +236,11 @@
   // boxes in output, and all of the boxes in output are entirely within the
   // title area box, then jump to the step labeled done positioning below.
   while (IsOutside(title_area) || IsOverlapping()) {
+    // 16. Let current position score be the percentage of the area of the
+    // bounding box of the boxes in boxes that is outside the title area
+    // box.
     if (!ShouldSwitchDirection(first_line_box, step, margin)) {
-      // 17. Horizontal: Move all the boxes in boxes down by the distance
+      // 18. Horizontal: Move all the boxes in boxes down by the distance
       // given by step. (If step is negative, then this will actually
       // result in an upwards movement of the boxes in absolute terms.)
       // Vertical: Move all the boxes in boxes right by the distance
@@ -245,11 +248,11 @@
       // result in a leftwards movement of the boxes in absolute terms.)
       MoveBoxesBy(step);
 
-      // 18. Jump back to the step labeled step loop.
+      // 19. Jump back to the step labeled step loop.
       continue;
     }
 
-    // 19. Switch direction: If switched is true, then remove all the boxes
+    // 20. Switch direction: If switched is true, then remove all the boxes
     // in boxes, and jump to the step labeled done positioning below.
     if (switched) {
       // This does not "remove" the boxes, but rather just pushes them
@@ -259,68 +262,54 @@
       break;
     }
 
-    // 20. Otherwise, move all the boxes in boxes back to their specified
+    // 21. Otherwise, move all the boxes in boxes back to their specified
     // position as determined in the earlier step.
     cue_box_.SetLocation(specified_position_);
 
-    // 21. Negate step.
+    // 22. Negate step.
     step = -step;
 
-    // 22. Set switched to true.
+    // 23. Set switched to true.
     switched = true;
 
-    // 23. Jump back to the step labeled step loop.
+    // 24. Jump back to the step labeled step loop.
   }
 }
 
 }  // unnamed namespace
 
-LayoutVTTCue::LayoutVTTCue(ContainerNode* node,
-                           float snap_to_lines_position,
-                           int line_align)
-    : LayoutBlockFlow(node),
-      snap_to_lines_position_(snap_to_lines_position),
-      line_align_(line_align) {}
+LayoutVTTCue::LayoutVTTCue(ContainerNode* node, float snap_to_lines_position)
+    : LayoutBlockFlow(node), snap_to_lines_position_(snap_to_lines_position) {}
 
 void LayoutVTTCue::RepositionCueSnapToLinesNotSet() {
-  // https://w3c.github.io/webvtt/#apply-webvtt-cue-settings
+  // FIXME: Implement overlapping detection when snap-to-lines is not set.
+  // http://wkb.ug/84296
+
+  // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
   // Step 13, "If cue's text track cue snap-to-lines flag is not set".
 
-  if (line_align_) {
-    // 1. Let bounding box be the bounding box of the boxes in boxes.
-    LayoutRect bounding_box = ContentBoxRect();
+  // 1. Let bounding box be the bounding box of the boxes in boxes.
 
-    WritingMode writing_mode = StyleRef().GetWritingMode();
-    LayoutUnit extent = blink::IsHorizontalWritingMode(writing_mode)
-                            ? bounding_box.Height()
-                            : bounding_box.Width();
-    // 2. Run the appropriate steps from the following list:
-    //    If the text track cue writing direction is horizontal
-    //       If the text track cue line alignment is center alignment
-    //          Move all the boxes in boxes up by half of the height of
-    //          bounding box.
-    //       If the text track cue line alignment is end alignment
-    //          Move all the boxes in boxes up by the height of bounding box.
-    //
-    //    If the text track cue writing direction is vertical growing left or
-    //    vertical growing right
-    //       If the text track cue line alignment is center alignment
-    //          Move all the boxes in boxes left by half of the width of
-    //          bounding box.
-    //       If the text track cue line alignment is end alignment
-    //          Move all the boxes in boxes left by the width of bounding box.
-    LayoutUnit fraction(line_align_);
-    fraction /= 100;
-    SetLogicalTop(LogicalTop() - extent * fraction);
-  }
+  // 2. Run the appropriate steps from the following list:
+  //    If the text track cue writing direction is horizontal
+  //       If the text track cue line alignment is middle alignment
+  //          Move all the boxes in boxes up by half of the height of
+  //          bounding box.
+  //       If the text track cue line alignment is end alignment
+  //          Move all the boxes in boxes up by the height of bounding box.
+  //
+  //    If the text track cue writing direction is vertical growing left or
+  //    vertical growing right
+  //       If the text track cue line alignment is middle alignment
+  //          Move all the boxes in boxes left by half of the width of
+  //          bounding box.
+  //       If the text track cue line alignment is end alignment
+  //          Move all the boxes in boxes left by the width of bounding box.
 
   // 3. If none of the boxes in boxes would overlap any of the boxes in
   // output, and all the boxes in output are within the video's rendering
   // area, then jump to the step labeled done positioning below.
 
-  // FIXME: Implement overlapping detection when snap-to-lines is not set.
-  // http://wkb.ug/84296
-
   // 4. If there is a position to which the boxes in boxes can be moved while
   // maintaining the relative positions of the boxes in boxes to each other
   // such that none of the boxes in boxes would overlap any of the boxes in
@@ -376,7 +365,7 @@
 
   LayoutState state(*this);
 
-  // https://w3c.github.io/webvtt/#apply-webvtt-cue-settings - step 13.
+  // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13.
   if (!std::isnan(snap_to_lines_position_))
     SnapToLinesLayouter(*this, ComputeControlsRect()).UpdateLayout();
   else
diff --git a/third_party/WebKit/Source/core/layout/LayoutVTTCue.h b/third_party/WebKit/Source/core/layout/LayoutVTTCue.h
index 489da0d..59b71e39 100644
--- a/third_party/WebKit/Source/core/layout/LayoutVTTCue.h
+++ b/third_party/WebKit/Source/core/layout/LayoutVTTCue.h
@@ -34,7 +34,7 @@
 
 class LayoutVTTCue final : public LayoutBlockFlow {
  public:
-  LayoutVTTCue(ContainerNode*, float snap_to_lines_position, int line_align);
+  LayoutVTTCue(ContainerNode*, float snap_to_lines_position);
 
   // The computed line position for snap-to-lines layout, and NaN for
   // non-snap-to-lines layout where no adjustment should take place.
@@ -47,7 +47,6 @@
   void RepositionCueSnapToLinesNotSet();
 
   float snap_to_lines_position_;
-  int line_align_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.cpp b/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.cpp
index 4cf83987..cdd10cdb 100644
--- a/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.cpp
+++ b/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.cpp
@@ -8,9 +8,11 @@
 #include "bindings/core/v8/DictionaryIterator.h"
 #include "bindings/core/v8/V8BindingForCore.h"
 #include "bindings/core/v8/V8FragmentResultOptions.h"
+#include "core/css/cssom/FilteredComputedStylePropertyMap.h"
 #include "core/dom/ExecutionContext.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/layout/custom/FragmentResultOptions.h"
+#include "core/layout/custom/LayoutCustom.h"
 #include "platform/bindings/ScriptState.h"
 #include "platform/bindings/V8BindingMacros.h"
 #include "platform/bindings/V8ObjectConstructor.h"
@@ -45,6 +47,7 @@
       instance_(definition->script_state_->GetIsolate(), instance) {}
 
 bool CSSLayoutDefinition::Instance::Layout(
+    const LayoutCustom& layout_custom,
     FragmentResultOptions* fragment_result_options) {
   ScriptState* script_state = definition_->GetScriptState();
   ExecutionContext* execution_context = ExecutionContext::From(script_state);
@@ -60,8 +63,25 @@
 
   v8::Local<v8::Function> layout = definition_->layout_.NewLocal(isolate);
 
-  // TODO(ikilpatrick): Build up arguments to pass into the layout function.
-  Vector<v8::Local<v8::Value>> argv = {};
+  // TODO(ikilpatrick): We can (and should) be smarter about the style map
+  // here. Instead of creating a new one each time, we should have one that
+  // lives on the layout object, and gets re-populated when various properties
+  // change. Internally this should hold onto CSSValues, instead of creating
+  // new ones each access.
+  // This should be shared with the CSS paint, but without the invalidation.
+  DCHECK(layout_custom.GetNode());
+  StylePropertyMapReadOnly* style_map =
+      FilteredComputedStylePropertyMap::Create(
+          layout_custom.GetNode(), definition_->native_invalidation_properties_,
+          definition_->custom_invalidation_properties_);
+
+  // TODO(ikilpatrick): Fill in children array, layout constraints, and edges.
+  Vector<v8::Local<v8::Value>> argv = {
+      v8::Array::New(isolate, 0),  // children array
+      v8::Undefined(isolate),      // edges
+      v8::Undefined(isolate),      // constraints
+      ToV8(style_map, script_state->GetContext()->Global(), isolate),
+  };
 
   v8::Local<v8::Value> generator_value;
   if (!V8ScriptRunner::CallFunction(layout, execution_context, instance,
diff --git a/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.h b/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.h
index 8f0bedb8..946a171 100644
--- a/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.h
+++ b/third_party/WebKit/Source/core/layout/custom/CSSLayoutDefinition.h
@@ -16,6 +16,7 @@
 namespace blink {
 
 class FragmentResultOptions;
+class LayoutCustom;
 class ScriptState;
 
 // Represents a javascript class registered on the LayoutWorkletGlobalScope by
@@ -45,7 +46,7 @@
 
     // Runs the web developer defined layout, returns true if everything
     // succeeded, and populates the FragmentResultOptions dictionary.
-    bool Layout(FragmentResultOptions*);
+    bool Layout(const LayoutCustom&, FragmentResultOptions*);
 
     void Trace(blink::Visitor*);
     void TraceWrappers(const ScriptWrappableVisitor*) const override;
diff --git a/third_party/WebKit/Source/core/layout/custom/LayoutCustom.cpp b/third_party/WebKit/Source/core/layout/custom/LayoutCustom.cpp
index 4cf61918..ce09eab 100644
--- a/third_party/WebKit/Source/core/layout/custom/LayoutCustom.cpp
+++ b/third_party/WebKit/Source/core/layout/custom/LayoutCustom.cpp
@@ -97,7 +97,7 @@
     }
 
     FragmentResultOptions fragment_result_options;
-    if (!instance->Layout(&fragment_result_options))
+    if (!instance->Layout(*this, &fragment_result_options))
       return false;
 
     // TODO(ikilpatrick): Currently we need to "fail" if we have any children
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index 89f0c6a..8e74f3a 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -60,7 +60,7 @@
   }
 
   // An empty line, or only trailing spaces.
-  DCHECK_EQ(space, line_info.AvailableWidth());
+  DCHECK_EQ(space, line_info.AvailableWidth() - line_info.TextIndent());
   end_offset = line_info.StartOffset();
 }
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_layout_input_node.h b/third_party/WebKit/Source/core/layout/ng/ng_layout_input_node.h
index 2924aa9..fc71c4f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_layout_input_node.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_layout_input_node.h
@@ -98,7 +98,7 @@
 
   String ToString() const;
 
-  explicit operator bool() { return box_ != nullptr; }
+  explicit operator bool() const { return box_ != nullptr; }
 
   bool operator==(const NGLayoutInputNode& other) const {
     return box_ == other.box_;
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGBlock.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGBlock.h
index 997edcb..1d68ecf 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGBlock.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGBlock.h
@@ -68,6 +68,8 @@
     return type == kLayoutObjectSVG || LayoutBlockFlow::IsOfType(type);
   }
 
+  void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;
+
  private:
   LayoutRect AbsoluteVisualRect() const final;
 
@@ -77,7 +79,6 @@
                      const LayoutPoint& accumulated_offset) const final;
 
   void UpdateFromStyle() final;
-  void StyleDidChange(StyleDifference, const ComputedStyle* old_style) final;
 
   bool NodeAtPoint(HitTestResult&,
                    const HitTestLocation& location_in_container,
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp
index a6794999..4a8e0805 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.cpp
@@ -138,7 +138,7 @@
   FloatPoint local_point = local_transform.Inverse().MapPoint(point_in_parent);
 
   // Early exit if local point is not contained in clipped viewport area
-  if (SVGLayoutSupport::IsOverflowHidden(this) &&
+  if (SVGLayoutSupport::IsOverflowHidden(*this) &&
       !FrameRect().Contains(LayoutPoint(local_point)))
     return false;
 
@@ -152,4 +152,15 @@
                                   kHitTestChildBlockBackgrounds);
 }
 
+void LayoutSVGForeignObject::StyleDidChange(StyleDifference diff,
+                                            const ComputedStyle* old_style) {
+  LayoutSVGBlock::StyleDidChange(diff, old_style);
+
+  if (old_style && (SVGLayoutSupport::IsOverflowHidden(*old_style) !=
+                    SVGLayoutSupport::IsOverflowHidden(StyleRef()))) {
+    // See NeedsOverflowClip() in PaintPropertyTreeBuilder for the reason.
+    SetNeedsPaintPropertyUpdate();
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.h
index 799554c..1e46743 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGForeignObject.h
@@ -79,6 +79,7 @@
   void ComputeLogicalHeight(LayoutUnit logical_height,
                             LayoutUnit logical_top,
                             LogicalExtentComputedValues&) const override;
+  void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;
 
   bool needs_transform_update_;
 };
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
index 2af73c87..d4f6747 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
@@ -81,11 +81,23 @@
     const FloatPoint& point_in_parent,
     HitTestAction action) {
   // Respect the viewport clip which is in parent coordinates.
-  if (SVGLayoutSupport::IsOverflowHidden(this)) {
+  if (SVGLayoutSupport::IsOverflowHidden(*this)) {
     if (!viewport_.Contains(point_in_parent))
       return false;
   }
   return LayoutSVGContainer::NodeAtFloatPoint(result, point_in_parent, action);
 }
 
+void LayoutSVGViewportContainer::StyleDidChange(
+    StyleDifference diff,
+    const ComputedStyle* old_style) {
+  LayoutSVGContainer::StyleDidChange(diff, old_style);
+
+  if (old_style && (SVGLayoutSupport::IsOverflowHidden(*old_style) !=
+                    SVGLayoutSupport::IsOverflowHidden(StyleRef()))) {
+    // See NeedsOverflowClip() in PaintPropertyTreeBuilder for the reason.
+    SetNeedsPaintPropertyUpdate();
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.h
index b30cb08..3ff27e9 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.h
@@ -60,6 +60,8 @@
                         const FloatPoint& point_in_parent,
                         HitTestAction) override;
 
+  void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;
+
   FloatRect viewport_;
   mutable AffineTransform local_to_parent_transform_;
   bool is_layout_size_changed_ : 1;
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp
index 51532721..2bdb44c 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp
@@ -370,13 +370,16 @@
     resources->LayoutIfNeeded();
 }
 
-bool SVGLayoutSupport::IsOverflowHidden(const LayoutObject* object) {
+bool SVGLayoutSupport::IsOverflowHidden(const LayoutObject& object) {
   // LayoutSVGRoot should never query for overflow state - it should always clip
   // itself to the initial viewport size.
-  DCHECK(!object->IsDocumentElement());
+  DCHECK(!object.IsDocumentElement());
+  return IsOverflowHidden(object.StyleRef());
+}
 
-  return object->Style()->OverflowX() == EOverflow::kHidden ||
-         object->Style()->OverflowX() == EOverflow::kScroll;
+bool SVGLayoutSupport::IsOverflowHidden(const ComputedStyle& style) {
+  return style.OverflowX() == EOverflow::kHidden ||
+         style.OverflowX() == EOverflow::kScroll;
 }
 
 void SVGLayoutSupport::AdjustVisualRectWithResources(
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.h b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.h
index 8e9a0c28..57b629d 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.h
+++ b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.h
@@ -60,7 +60,8 @@
   static void LayoutResourcesIfNeeded(const LayoutObject&);
 
   // Helper function determining whether overflow is hidden.
-  static bool IsOverflowHidden(const LayoutObject*);
+  static bool IsOverflowHidden(const LayoutObject&);
+  static bool IsOverflowHidden(const ComputedStyle&);
 
   // Adjusts the visualRect in combination with filter, clipper and masker
   // in local coordinates.
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index 3e726a9..9b43f07 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -75,6 +75,38 @@
 
 namespace {
 
+// Fetch API Spec: https://fetch.spec.whatwg.org/#cors-preflight-fetch-0
+String CreateAccessControlRequestHeadersHeader(const HTTPHeaderMap& headers) {
+  Vector<String> filtered_headers;
+  for (const auto& header : headers) {
+    // Exclude CORS-safelisted headers.
+    if (CORS::IsCORSSafelistedHeader(header.key, header.value))
+      continue;
+    // Calling a deprecated function, but eventually this function,
+    // |CreateAccessControlRequestHeadersHeader| will be removed.
+    // When the request is from a Worker, referrer header was added by
+    // WorkerThreadableLoader. But it should not be added to
+    // Access-Control-Request-Headers header.
+    if (DeprecatedEqualIgnoringCase(header.key, "referer"))
+      continue;
+    filtered_headers.push_back(header.key.DeprecatedLower());
+  }
+  if (!filtered_headers.size())
+    return g_null_atom;
+
+  // Sort header names lexicographically.
+  std::sort(filtered_headers.begin(), filtered_headers.end(),
+            WTF::CodePointCompareLessThan);
+  StringBuilder header_buffer;
+  for (const String& header : filtered_headers) {
+    if (!header_buffer.IsEmpty())
+      header_buffer.Append(",");
+    header_buffer.Append(header);
+  }
+
+  return header_buffer.ToString();
+}
+
 class EmptyDataHandle final : public WebDataConsumerHandle {
  private:
   class EmptyDataReader final : public WebDataConsumerHandle::Reader {
@@ -118,6 +150,7 @@
 // net/url_request/url_request.cc separately.
 static const int kMaxCORSRedirects = 20;
 
+// static
 void DocumentThreadableLoader::LoadResourceSynchronously(
     Document& document,
     const ResourceRequest& request,
@@ -130,6 +163,49 @@
       ->Start(request);
 }
 
+// static
+WebURLRequest DocumentThreadableLoader::CreateAccessControlPreflightRequest(
+    const WebURLRequest& request) {
+  const KURL& request_url = request.Url();
+
+  DCHECK(request_url.User().IsEmpty());
+  DCHECK(request_url.Pass().IsEmpty());
+
+  WebURLRequest preflight_request(request_url);
+  preflight_request.SetHTTPMethod(HTTPNames::OPTIONS);
+  preflight_request.SetHTTPHeaderField(HTTPNames::Access_Control_Request_Method,
+                                       request.HttpMethod());
+  preflight_request.SetPriority(request.GetPriority());
+  preflight_request.SetRequestContext(request.GetRequestContext());
+  preflight_request.SetFetchCredentialsMode(
+      network::mojom::FetchCredentialsMode::kOmit);
+  preflight_request.SetSkipServiceWorker(true);
+  preflight_request.SetHTTPReferrer(request.HttpHeaderField(HTTPNames::Referer),
+                                    request.GetReferrerPolicy());
+
+  if (request.IsExternalRequest()) {
+    preflight_request.SetHTTPHeaderField(
+        HTTPNames::Access_Control_Request_External, "true");
+  }
+
+  String request_headers = CreateAccessControlRequestHeadersHeader(
+      request.ToResourceRequest().HttpHeaderFields());
+  if (request_headers != g_null_atom) {
+    preflight_request.SetHTTPHeaderField(
+        HTTPNames::Access_Control_Request_Headers, request_headers);
+  }
+
+  return preflight_request;
+}
+
+// static
+WebURLRequest
+DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+    const WebURLRequest& request) {
+  return CreateAccessControlPreflightRequest(request);
+}
+
+// static
 DocumentThreadableLoader* DocumentThreadableLoader::Create(
     ThreadableLoadingContext& loading_context,
     ThreadableLoaderClient* client,
@@ -268,7 +344,7 @@
   if (request.GetFetchRequestMode() ==
       network::mojom::FetchRequestMode::kNoCORS) {
     SECURITY_CHECK(WebCORS::IsNoCORSAllowedContext(
-        request_context_, request.GetServiceWorkerMode()));
+        request_context_, request.GetSkipServiceWorker()));
   } else {
     cors_flag_ = !GetSecurityOrigin()->CanRequest(request.Url());
   }
@@ -306,7 +382,7 @@
   probe::shouldBypassServiceWorker(GetExecutionContext(),
                                    &should_bypass_service_worker);
   if (should_bypass_service_worker)
-    new_request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+    new_request.SetSkipServiceWorker(true);
 
   // Process the CORS protocol inside the DocumentThreadableLoader for the
   // following cases:
@@ -314,23 +390,21 @@
   // - When the request is sync or the protocol is unsupported since we can
   //   assume that any service worker (SW) is skipped for such requests by
   //   content/ code.
-  // - When the ServiceWorkerMode is not kAll, any SW will be skipped.
+  // - When |skip_service_worker| is true, any SW will be skipped.
   // - If we're not yet controlled by a SW, then we're sure that this
   //   request won't be intercepted by a SW. In case we end up with
   //   sending a CORS preflight request, the actual request to be sent later
   //   may be intercepted. This is taken care of in LoadPreflightRequest() by
-  //   setting the ServiceWorkerMode to kNone.
+  //   setting |skip_service_worker| to true.
   //
   // From the above analysis, you can see that the request can never be
   // intercepted by a SW inside this if-block. It's because:
-  // - the ServiceWorkerMode needs to be kAll, and
+  // - |skip_service_worker| needs to be false, and
   // - we're controlled by a SW at this point
   // to allow a SW to intercept the request. Even when the request gets issued
   // asynchronously after performing the CORS preflight, it doesn't get
   // intercepted since LoadPreflightRequest() sets the flag to kNone in advance.
-  if (!async_ ||
-      new_request.GetServiceWorkerMode() !=
-          WebURLRequest::ServiceWorkerMode::kAll ||
+  if (!async_ || new_request.GetSkipServiceWorker() ||
       !SchemeRegistry::ShouldTreatURLSchemeAsAllowingServiceWorkers(
           new_request.Url().Protocol()) ||
       !loading_context_->GetResourceFetcher()->IsControlledByServiceWorker()) {
@@ -344,8 +418,7 @@
     // request.
     fallback_request_for_service_worker_ = ResourceRequest(request);
     // Skip the service worker for the fallback request.
-    fallback_request_for_service_worker_.SetServiceWorkerMode(
-        WebURLRequest::ServiceWorkerMode::kNone);
+    fallback_request_for_service_worker_.SetSkipServiceWorker(true);
   }
 
   LoadRequest(new_request, resource_loader_options_);
@@ -383,7 +456,7 @@
 void DocumentThreadableLoader::LoadPreflightRequest(
     const ResourceRequest& actual_request,
     const ResourceLoaderOptions& actual_options) {
-  WebURLRequest web_url_request = WebCORS::CreateAccessControlPreflightRequest(
+  WebURLRequest web_url_request = CreateAccessControlPreflightRequest(
       WrappedResourceRequest(actual_request));
 
   ResourceRequest& preflight_request =
@@ -397,11 +470,11 @@
   actual_request_ = actual_request;
   actual_options_ = actual_options;
 
-  // Explicitly set the ServiceWorkerMode to None here. Although the page is
+  // Explicitly set |skip_service_worker| to true here. Although the page is
   // not controlled by a SW at this point, a new SW may be controlling the
   // page when this actual request gets sent later. We should not send the
   // actual request to the SW. See https://crbug.com/604583.
-  actual_request_.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+  actual_request_.SetSkipServiceWorker(true);
 
   // Create a ResourceLoaderOptions for preflight.
   ResourceLoaderOptions preflight_options = actual_options;
@@ -515,8 +588,7 @@
   // We don't want any requests that could involve a CORS preflight to get
   // intercepted by a foreign SW, even if we have the result of the preflight
   // cached already. See https://crbug.com/674370.
-  cross_origin_request.SetServiceWorkerMode(
-      WebURLRequest::ServiceWorkerMode::kNone);
+  cross_origin_request.SetSkipServiceWorker(true);
 
   PrepareCrossOriginRequest(cross_origin_request);
   LoadRequest(cross_origin_request, cross_origin_options);
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
index be96aca..bbcfffd 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -66,6 +66,11 @@
                                         ThreadableLoaderClient&,
                                         const ThreadableLoaderOptions&,
                                         const ResourceLoaderOptions&);
+
+  // Exposed for testing. Code outside this class should not call this function.
+  static WebURLRequest CreateAccessControlPreflightRequestForTesting(
+      const WebURLRequest&);
+
   static DocumentThreadableLoader* Create(ThreadableLoadingContext&,
                                           ThreadableLoaderClient*,
                                           const ThreadableLoaderOptions&,
@@ -85,6 +90,9 @@
  private:
   enum BlockingBehavior { kLoadSynchronously, kLoadAsynchronously };
 
+  static WebURLRequest CreateAccessControlPreflightRequest(
+      const WebURLRequest&);
+
   DocumentThreadableLoader(ThreadableLoadingContext&,
                            ThreadableLoaderClient*,
                            BlockingBehavior,
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoaderTest.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoaderTest.cpp
new file mode 100644
index 0000000..2767831
--- /dev/null
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoaderTest.cpp
@@ -0,0 +1,92 @@
+// 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 "core/loader/DocumentThreadableLoader.h"
+
+#include "platform/exported/WrappedResourceResponse.h"
+#include "platform/loader/fetch/ResourceResponse.h"
+#include "public/platform/WebCORS.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+namespace {
+
+TEST(DocumentThreadableLoaderCreatePreflightRequestTest, LexicographicalOrder) {
+  WebURLRequest request;
+  request.AddHTTPHeaderField("Orange", "Orange");
+  request.AddHTTPHeaderField("Apple", "Red");
+  request.AddHTTPHeaderField("Kiwifruit", "Green");
+  request.AddHTTPHeaderField("Content-Type", "application/octet-stream");
+  request.AddHTTPHeaderField("Strawberry", "Red");
+
+  WebURLRequest preflight =
+      DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+          request);
+
+  EXPECT_EQ("apple,content-type,kiwifruit,orange,strawberry",
+            preflight.HttpHeaderField("Access-Control-Request-Headers"));
+}
+
+TEST(DocumentThreadableLoaderCreatePreflightRequestTest, ExcludeSimpleHeaders) {
+  WebURLRequest request;
+  request.AddHTTPHeaderField("Accept", "everything");
+  request.AddHTTPHeaderField("Accept-Language", "everything");
+  request.AddHTTPHeaderField("Content-Language", "everything");
+  request.AddHTTPHeaderField("Save-Data", "on");
+
+  WebURLRequest preflight =
+      DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+          request);
+
+  // Do not emit empty-valued headers; an empty list of non-"CORS safelisted"
+  // request headers should cause "Access-Control-Request-Headers:" to be
+  // left out in the preflight request.
+  EXPECT_EQ(WebString(g_null_atom),
+            preflight.HttpHeaderField("Access-Control-Request-Headers"));
+}
+
+TEST(DocumentThreadableLoaderCreatePreflightRequestTest,
+     ExcludeSimpleContentTypeHeader) {
+  WebURLRequest request;
+  request.AddHTTPHeaderField("Content-Type", "text/plain");
+
+  WebURLRequest preflight =
+      DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+          request);
+
+  // Empty list also; see comment in test above.
+  EXPECT_EQ(WebString(g_null_atom),
+            preflight.HttpHeaderField("Access-Control-Request-Headers"));
+}
+
+TEST(DocumentThreadableLoaderCreatePreflightRequestTest,
+     IncludeNonSimpleHeader) {
+  WebURLRequest request;
+  request.AddHTTPHeaderField("X-Custom-Header", "foobar");
+
+  WebURLRequest preflight =
+      DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+          request);
+
+  EXPECT_EQ("x-custom-header",
+            preflight.HttpHeaderField("Access-Control-Request-Headers"));
+}
+
+TEST(DocumentThreadableLoaderCreatePreflightRequestTest,
+     IncludeNonSimpleContentTypeHeader) {
+  WebURLRequest request;
+  request.AddHTTPHeaderField("Content-Type", "application/octet-stream");
+
+  WebURLRequest preflight =
+      DocumentThreadableLoader::CreateAccessControlPreflightRequestForTesting(
+          request);
+
+  EXPECT_EQ("content-type",
+            preflight.HttpHeaderField("Access-Control-Request-Headers"));
+}
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.cpp b/third_party/WebKit/Source/core/loader/EmptyClients.cpp
index 2eff492d..99eaaef 100644
--- a/third_party/WebKit/Source/core/loader/EmptyClients.cpp
+++ b/third_party/WebKit/Source/core/loader/EmptyClients.cpp
@@ -68,8 +68,11 @@
     return Platform::Current()->MainThread()->GetTaskRunner();
   }
 
-  void AddThrottlingObserver(ObserverType, Observer*) override {}
-  void RemoveThrottlingObserver(ObserverType, Observer*) override {}
+  std::unique_ptr<ThrottlingObserverHandle> AddThrottlingObserver(
+      ObserverType,
+      Observer*) override {
+    return nullptr;
+  }
   void SetFrameVisible(bool) override {}
   bool IsFrameVisible() const override { return false; }
   void SetPageVisible(bool) override {}
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 103109bb..77f2c1c 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -240,10 +240,8 @@
     request.SetURL(override_url);
     request.ClearHTTPReferrer();
   }
-  request.SetServiceWorkerMode(frame_load_type ==
-                                       kFrameLoadTypeReloadBypassingCache
-                                   ? WebURLRequest::ServiceWorkerMode::kNone
-                                   : WebURLRequest::ServiceWorkerMode::kAll);
+  request.SetSkipServiceWorker(frame_load_type ==
+                               kFrameLoadTypeReloadBypassingCache);
   return request;
 }
 
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 116a70d5a..87731d7 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -419,8 +419,7 @@
     // https://w3c.github.io/ServiceWorker/#implementer-concerns
     if (GetElement()->IsHTMLElement() &&
         ToHTMLElement(GetElement())->IsPluginElement()) {
-      resource_request.SetServiceWorkerMode(
-          WebURLRequest::ServiceWorkerMode::kNone);
+      resource_request.SetSkipServiceWorker(true);
     }
 
     FetchParameters params(resource_request, resource_loader_options);
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
index 5ba77183..a9741a35 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -34,6 +34,7 @@
 #include "bindings/core/v8/V8BindingForCore.h"
 #include "core/css/MediaList.h"
 #include "core/css/MediaQueryEvaluator.h"
+#include "core/css/parser/SizesAttributeParser.h"
 #include "core/dom/Document.h"
 #include "core/frame/FrameConsole.h"
 #include "core/frame/LocalFrame.h"
@@ -42,6 +43,7 @@
 #include "core/html/CrossOriginAttribute.h"
 #include "core/html/LinkRelAttribute.h"
 #include "core/html/parser/HTMLPreloadScanner.h"
+#include "core/html/parser/HTMLSrcsetParser.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/loader/DocumentLoader.h"
 #include "core/loader/NetworkHintsInterface.h"
@@ -91,7 +93,9 @@
       nonce(header.Nonce()),
       integrity(header.Integrity()),
       referrer_policy(kReferrerPolicyDefault),
-      href(KURL(base_url, header.Url())) {}
+      href(KURL(base_url, header.Url())),
+      srcset(header.Srcset()),
+      sizes(header.Imgsizes()) {}
 
 class LinkLoader::FinishObserver final
     : public GarbageCollectedFinalized<ResourceFinishObserver>,
@@ -314,11 +318,9 @@
   return false;
 }
 
-static bool MediaMatches(Document& document,
-                         const String& media,
-                         ViewportDescription* viewport_description) {
-  if (media.IsEmpty())
-    return true;
+static MediaValues* CreateMediaValues(
+    Document& document,
+    ViewportDescription* viewport_description) {
   MediaValues* media_values =
       MediaValues::CreateDynamicIfFrameExists(document.GetFrame());
   if (viewport_description) {
@@ -326,21 +328,48 @@
         viewport_description->max_width.GetFloatValue(),
         viewport_description->max_height.GetFloatValue());
   }
+  return media_values;
+}
 
+static bool MediaMatches(const String& media, MediaValues* media_values) {
   scoped_refptr<MediaQuerySet> media_queries = MediaQuerySet::Create(media);
   MediaQueryEvaluator evaluator(*media_values);
   return evaluator.Eval(*media_queries);
 }
 
+// |base_url| is used in Link HTTP Header based preloads to resolve relative
+// URLs in srcset, which should be based on the resource's URL, not the
+// document's base URL. If |base_url| is a null URL, relative URLs are resolved
+// using |document.CompleteURL()|.
 static Resource* PreloadIfNeeded(const LinkLoadParameters& params,
                                  Document& document,
+                                 const KURL& base_url,
                                  LinkCaller caller,
                                  ViewportDescription* viewport_description) {
   if (!document.Loader() || !params.rel.IsLinkPreload())
     return nullptr;
 
+  Optional<Resource::Type> resource_type =
+      LinkLoader::GetResourceTypeFromAsAttribute(params.as);
+
+  MediaValues* media_values = nullptr;
+  KURL url;
+  if (resource_type == Resource::kImage && !params.srcset.IsEmpty() &&
+      RuntimeEnabledFeatures::PreloadImageSrcSetEnabled()) {
+    media_values = CreateMediaValues(document, viewport_description);
+    float source_size =
+        SizesAttributeParser(media_values, params.sizes).length();
+    ImageCandidate candidate = BestFitSourceForImageAttributes(
+        media_values->DevicePixelRatio(), source_size, params.href,
+        params.srcset);
+    url = base_url.IsNull() ? document.CompleteURL(candidate.ToString())
+                            : KURL(base_url, candidate.ToString());
+  } else {
+    url = params.href;
+  }
+
   UseCounter::Count(document, WebFeature::kLinkRelPreload);
-  if (!params.href.IsValid() || params.href.IsEmpty()) {
+  if (!url.IsValid() || url.IsEmpty()) {
     document.AddConsoleMessage(ConsoleMessage::Create(
         kOtherMessageSource, kWarningMessageLevel,
         String("<link rel=preload> has an invalid `href` value")));
@@ -348,13 +377,15 @@
   }
 
   // Preload only if media matches
-  if (!MediaMatches(document, params.media, viewport_description))
-    return nullptr;
+  if (!params.media.IsEmpty()) {
+    if (!media_values)
+      media_values = CreateMediaValues(document, viewport_description);
+    if (!MediaMatches(params.media, media_values))
+      return nullptr;
+  }
 
   if (caller == kLinkCalledFromHeader)
     UseCounter::Count(document, WebFeature::kLinkHeaderPreload);
-  Optional<Resource::Type> resource_type =
-      LinkLoader::GetResourceTypeFromAsAttribute(params.as);
   if (resource_type == WTF::nullopt) {
     document.AddConsoleMessage(ConsoleMessage::Create(
         kOtherMessageSource, kWarningMessageLevel,
@@ -368,13 +399,13 @@
         String("<link rel=preload> has an unsupported `type` value")));
     return nullptr;
   }
-  ResourceRequest resource_request(params.href);
+  ResourceRequest resource_request(url);
   resource_request.SetRequestContext(ResourceFetcher::DetermineRequestContext(
       resource_type.value(), ResourceFetcher::kImageNotImageSet, false));
 
   if (params.referrer_policy != kReferrerPolicyDefault) {
     resource_request.SetHTTPReferrer(SecurityPolicy::GenerateReferrer(
-        params.referrer_policy, params.href, document.OutgoingReferrer()));
+        params.referrer_policy, url, document.OutgoingReferrer()));
   }
 
   ResourceLoaderOptions options;
@@ -391,8 +422,7 @@
   if (settings && settings->GetLogPreload()) {
     document.AddConsoleMessage(ConsoleMessage::Create(
         kOtherMessageSource, kVerboseMessageLevel,
-        String("Preload triggered for " + params.href.Host() +
-               params.href.GetPath())));
+        String("Preload triggered for " + url.Host() + url.GetPath())));
   }
   link_fetch_params.SetLinkPreload(true);
   return document.Loader()->StartPreload(resource_type.value(),
@@ -448,8 +478,12 @@
 
   // Preload only if media matches.
   // https://html.spec.whatwg.org/#processing-the-media-attribute
-  if (!MediaMatches(document, params.media, viewport_description))
-    return;
+  if (!params.media.IsEmpty()) {
+    MediaValues* media_values =
+        CreateMediaValues(document, viewport_description);
+    if (!MediaMatches(params.media, media_values))
+      return;
+  }
 
   // Step 5. "Let settings object be the link element's node document's relevant
   // settings object." [spec text]
@@ -583,7 +617,7 @@
               ? &(viewport_description_wrapper->description)
               : nullptr;
 
-      PreloadIfNeeded(params, *document, kLinkCalledFromHeader,
+      PreloadIfNeeded(params, *document, base_url, kLinkCalledFromHeader,
                       viewport_description);
       PrefetchIfNeeded(params, *document);
       ModulePreloadIfNeeded(params, *document, viewport_description, nullptr);
@@ -611,8 +645,8 @@
   PreconnectIfNeeded(params, &document, document.GetFrame(),
                      network_hints_interface, kLinkCalledFromMarkup);
 
-  Resource* resource =
-      PreloadIfNeeded(params, document, kLinkCalledFromMarkup, nullptr);
+  Resource* resource = PreloadIfNeeded(params, document, NullURL(),
+                                       kLinkCalledFromMarkup, nullptr);
   if (!resource) {
     resource = PrefetchIfNeeded(params, document);
   }
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.h b/third_party/WebKit/Source/core/loader/LinkLoader.h
index 4849abe4..456c30f 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.h
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.h
@@ -60,7 +60,9 @@
                      const String& nonce,
                      const String& integrity,
                      const ReferrerPolicy& referrer_policy,
-                     const KURL& href)
+                     const KURL& href,
+                     const String& srcset,
+                     const String& sizes)
       : rel(rel),
         cross_origin(cross_origin),
         type(type),
@@ -69,7 +71,9 @@
         nonce(nonce),
         integrity(integrity),
         referrer_policy(referrer_policy),
-        href(href) {}
+        href(href),
+        srcset(srcset),
+        sizes(sizes) {}
   LinkLoadParameters(const LinkHeader&, const KURL& base_url);
 
   LinkRelAttribute rel;
@@ -81,6 +85,8 @@
   String integrity;
   ReferrerPolicy referrer_policy;
   KURL href;
+  String srcset;
+  String sizes;
 };
 
 // The LinkLoader can load link rel types icon, dns-prefetch, prefetch, and
diff --git a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
index dfba01b6..4099af0 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
+++ b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
@@ -94,42 +94,38 @@
     ResourceLoadPriority priority;
     WebURLRequest::RequestContext context;
     bool link_loader_should_load_value;
-    bool expecting_load;
+    KURL load_url;
     ReferrerPolicy referrer_policy;
   };
 
+  LinkLoaderPreloadTestBase() {
+    dummy_page_holder_ = DummyPageHolder::Create(IntSize(500, 500));
+  }
+
   ~LinkLoaderPreloadTestBase() {
     Platform::Current()
         ->GetURLLoaderMockFactory()
         ->UnregisterAllURLsAndClearMemoryCache();
   }
 
+ protected:
   void TestPreload(const LinkLoadParameters& params,
-                   const Expectations& expected,
-                   const char* content_security_policy = nullptr) {
-    std::unique_ptr<DummyPageHolder> dummy_page_holder =
-        DummyPageHolder::Create(IntSize(500, 500));
-    ResourceFetcher* fetcher = dummy_page_holder->GetDocument().Fetcher();
-    if (content_security_policy) {
-      dummy_page_holder->GetDocument()
-          .GetContentSecurityPolicy()
-          ->DidReceiveHeader(content_security_policy,
-                             kContentSecurityPolicyHeaderTypeEnforce,
-                             kContentSecurityPolicyHeaderSourceHTTP);
-    }
+                   const Expectations& expected) {
+    ResourceFetcher* fetcher = dummy_page_holder_->GetDocument().Fetcher();
     ASSERT_TRUE(fetcher);
-    dummy_page_holder->GetFrame().GetSettings()->SetScriptEnabled(true);
+    dummy_page_holder_->GetFrame().GetSettings()->SetScriptEnabled(true);
     Persistent<MockLinkLoaderClient> loader_client =
         MockLinkLoaderClient::Create(expected.link_loader_should_load_value);
     LinkLoader* loader = LinkLoader::Create(loader_client.Get());
     URLTestHelpers::RegisterMockedErrorURLLoad(params.href);
-    loader->LoadLink(params, dummy_page_holder->GetDocument(),
+    loader->LoadLink(params, dummy_page_holder_->GetDocument(),
                      NetworkHintsMock());
-    if (expected.expecting_load &&
+    if (!expected.load_url.IsNull() &&
         expected.priority != ResourceLoadPriority::kUnresolved) {
       ASSERT_EQ(1, fetcher->CountPreloads());
       Resource* resource = loader->GetResourceForTesting();
       ASSERT_NE(resource, nullptr);
+      EXPECT_EQ(expected.load_url.GetString(), resource->Url().GetString());
       EXPECT_TRUE(fetcher->ContainsAsPreload(resource));
       EXPECT_EQ(expected.priority, resource->GetResourceRequest().Priority());
       EXPECT_EQ(expected.context,
@@ -142,6 +138,7 @@
       ASSERT_EQ(0, fetcher->CountPreloads());
     }
   }
+  std::unique_ptr<DummyPageHolder> dummy_page_holder_;
 };
 
 struct PreloadTestParams {
@@ -189,10 +186,11 @@
   LinkLoadParameters params(
       LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, String(),
       test_case.as, String(), String(), String(), kReferrerPolicyDefault,
-      KURL(NullURL(), test_case.href));
+      KURL(NullURL(), test_case.href), String(), String());
   Expectations expectations = {
       test_case.priority, test_case.context, test_case.expecting_load,
-      test_case.expecting_load, kReferrerPolicyDefault};
+      test_case.expecting_load ? params.href : NullURL(),
+      kReferrerPolicyDefault};
   TestPreload(params, expectations);
 }
 
@@ -266,10 +264,11 @@
   LinkLoadParameters params(
       LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, test_case.type,
       test_case.as, String(), String(), String(), kReferrerPolicyDefault,
-      KURL(NullURL(), test_case.href));
+      KURL(NullURL(), test_case.href), String(), String());
   Expectations expectations = {
       test_case.priority, test_case.context, test_case.expecting_load,
-      test_case.expecting_load, kReferrerPolicyDefault};
+      test_case.expecting_load ? params.href : NullURL(),
+      kReferrerPolicyDefault};
   TestPreload(params, expectations);
 }
 
@@ -298,10 +297,11 @@
   LinkLoadParameters params(
       LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, "image/gif",
       "image", test_case.media, String(), String(), kReferrerPolicyDefault,
-      KURL(NullURL(), "http://example.test/cat.gif"));
+      KURL(NullURL(), "http://example.test/cat.gif"), String(), String());
   Expectations expectations = {
       test_case.priority, WebURLRequest::kRequestContextImage,
-      test_case.link_loader_should_load_value, test_case.expecting_load,
+      test_case.link_loader_should_load_value,
+      test_case.expecting_load ? params.href : NullURL(),
       kReferrerPolicyDefault};
   TestPreload(params, expectations);
 }
@@ -324,13 +324,13 @@
 
 TEST_P(LinkLoaderPreloadReferrerPolicyTest, Preload) {
   const ReferrerPolicy referrer_policy = GetParam();
-  LinkLoadParameters params(LinkRelAttribute("preload"),
-                            kCrossOriginAttributeNotSet, "image/gif", "image",
-                            String(), String(), String(), referrer_policy,
-                            KURL(NullURL(), "http://example.test/cat.gif"));
+  LinkLoadParameters params(
+      LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, "image/gif",
+      "image", String(), String(), String(), referrer_policy,
+      KURL(NullURL(), "http://example.test/cat.gif"), String(), String());
   Expectations expectations = {ResourceLoadPriority::kLow,
-                               WebURLRequest::kRequestContextImage, true, true,
-                               referrer_policy};
+                               WebURLRequest::kRequestContextImage, true,
+                               params.href, referrer_policy};
   TestPreload(params, expectations);
 }
 
@@ -356,21 +356,77 @@
 
 TEST_P(LinkLoaderPreloadNonceTest, Preload) {
   const auto& test_case = GetParam();
+  dummy_page_holder_->GetDocument()
+      .GetContentSecurityPolicy()
+      ->DidReceiveHeader(test_case.content_security_policy,
+                         kContentSecurityPolicyHeaderTypeEnforce,
+                         kContentSecurityPolicyHeaderSourceHTTP);
   LinkLoadParameters params(
       LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, String(),
       "script", String(), test_case.nonce, String(), kReferrerPolicyDefault,
-      KURL(NullURL(), "http://example.test/cat.js"));
+      KURL(NullURL(), "http://example.test/cat.js"), String(), String());
   Expectations expectations = {
       ResourceLoadPriority::kHigh, WebURLRequest::kRequestContextScript,
-      test_case.expecting_load, test_case.expecting_load,
+      test_case.expecting_load,
+      test_case.expecting_load ? params.href : NullURL(),
       kReferrerPolicyDefault};
-  TestPreload(params, expectations, test_case.content_security_policy);
+  TestPreload(params, expectations);
 }
 
 INSTANTIATE_TEST_CASE_P(LinkLoaderPreloadNonceTest,
                         LinkLoaderPreloadNonceTest,
                         ::testing::ValuesIn(kPreloadNonceTestParams));
 
+struct PreloadSrcsetTestParams {
+  const char* href;
+  const char* srcset;
+  const char* sizes;
+  float scale_factor;
+  const char* expected_url;
+};
+
+constexpr PreloadSrcsetTestParams kPreloadSrcsetTestParams[] = {
+    {"http://example.test/cat.gif",
+     "http://example.test/cat1x.gif 1x, http://example.test/cat2x.gif 2x",
+     nullptr, 1.0, "http://example.test/cat1x.gif"},
+    {"http://example.test/cat.gif",
+     "http://example.test/cat1x.gif 1x, http://example.test/cat2x.gif 2x",
+     nullptr, 2.0, "http://example.test/cat2x.gif"},
+    {"http://example.test/cat.gif",
+     "http://example.test/cat400.gif 400w, http://example.test/cat800.gif 800w",
+     "400px", 1.0, "http://example.test/cat400.gif"},
+    {"http://example.test/cat.gif",
+     "http://example.test/cat400.gif 400w, http://example.test/cat800.gif 800w",
+     "400px", 2.0, "http://example.test/cat800.gif"},
+    {"http://example.test/cat.gif",
+     "cat200.gif 200w, cat400.gif 400w, cat800.gif 800w", "200px", 1.0,
+     "http://example.test/cat200.gif"},
+};
+
+class LinkLoaderPreloadSrcsetTest
+    : public LinkLoaderPreloadTestBase,
+      public ::testing::WithParamInterface<PreloadSrcsetTestParams> {};
+
+TEST_P(LinkLoaderPreloadSrcsetTest, Preload) {
+  const auto& test_case = GetParam();
+  dummy_page_holder_->GetDocument().SetBaseURLOverride(
+      KURL("http://example.test/"));
+  dummy_page_holder_->GetPage().SetDeviceScaleFactorDeprecated(
+      test_case.scale_factor);
+  LinkLoadParameters params(
+      LinkRelAttribute("preload"), kCrossOriginAttributeNotSet, "image/gif",
+      "image", String(), String(), String(), kReferrerPolicyDefault,
+      KURL(NullURL(), test_case.href), test_case.srcset, test_case.sizes);
+  Expectations expectations = {
+      ResourceLoadPriority::kLow, WebURLRequest::kRequestContextImage, true,
+      KURL(NullURL(), test_case.expected_url), kReferrerPolicyDefault};
+  TestPreload(params, expectations);
+}
+
+INSTANTIATE_TEST_CASE_P(LinkLoaderPreloadSrcsetTest,
+                        LinkLoaderPreloadSrcsetTest,
+                        ::testing::ValuesIn(kPreloadSrcsetTestParams));
+
 struct ModulePreloadTestParams {
   const char* href;
   const char* nonce;
@@ -441,11 +497,11 @@
       MockLinkLoaderClient::Create(true);
   LinkLoader* loader = LinkLoader::Create(loader_client.Get());
   KURL href_url = KURL(NullURL(), test_case.href);
-  LinkLoadParameters params(LinkRelAttribute("modulepreload"),
-                            test_case.cross_origin, String() /* type */,
-                            String() /* as */, String() /* media */,
-                            test_case.nonce, test_case.integrity,
-                            test_case.referrer_policy, href_url);
+  LinkLoadParameters params(
+      LinkRelAttribute("modulepreload"), test_case.cross_origin,
+      String() /* type */, String() /* as */, String() /* media */,
+      test_case.nonce, test_case.integrity, test_case.referrer_policy, href_url,
+      String() /* srcset */, String() /* sizes */);
   loader->LoadLink(params, dummy_page_holder->GetDocument(),
                    NetworkHintsMock());
   ASSERT_EQ(test_case.expecting_load, modulator->fetched());
@@ -486,10 +542,10 @@
     LinkLoader* loader = LinkLoader::Create(loader_client.Get());
     KURL href_url = KURL(NullURL(), test_case.href);
     URLTestHelpers::RegisterMockedErrorURLLoad(href_url);
-    LinkLoadParameters params(LinkRelAttribute("prefetch"),
-                              kCrossOriginAttributeNotSet, test_case.type, "",
-                              test_case.media, "", "",
-                              test_case.referrer_policy, href_url);
+    LinkLoadParameters params(
+        LinkRelAttribute("prefetch"), kCrossOriginAttributeNotSet,
+        test_case.type, "", test_case.media, "", "", test_case.referrer_policy,
+        href_url, String() /* srcset */, String() /* sizes */);
     loader->LoadLink(params, dummy_page_holder->GetDocument(),
                      NetworkHintsMock());
     ASSERT_TRUE(dummy_page_holder->GetDocument().Fetcher());
@@ -533,10 +589,10 @@
     LinkLoader* loader = LinkLoader::Create(loader_client.Get());
     KURL href_url = KURL(KURL(String("http://example.com")), test_case.href);
     NetworkHintsMock network_hints;
-    LinkLoadParameters params(LinkRelAttribute("dns-prefetch"),
-                              kCrossOriginAttributeNotSet, String(), String(),
-                              String(), String(), String(),
-                              kReferrerPolicyDefault, href_url);
+    LinkLoadParameters params(
+        LinkRelAttribute("dns-prefetch"), kCrossOriginAttributeNotSet, String(),
+        String(), String(), String(), String(), kReferrerPolicyDefault,
+        href_url, String() /* srcset */, String() /* sizes */);
     loader->LoadLink(params, dummy_page_holder->GetDocument(), network_hints);
     EXPECT_FALSE(network_hints.DidPreconnect());
     EXPECT_EQ(test_case.should_load, network_hints.DidDnsPrefetch());
@@ -568,10 +624,10 @@
     LinkLoader* loader = LinkLoader::Create(loader_client.Get());
     KURL href_url = KURL(KURL(String("http://example.com")), test_case.href);
     NetworkHintsMock network_hints;
-    LinkLoadParameters params(LinkRelAttribute("preconnect"),
-                              test_case.cross_origin, String(), String(),
-                              String(), String(), String(),
-                              kReferrerPolicyDefault, href_url);
+    LinkLoadParameters params(
+        LinkRelAttribute("preconnect"), test_case.cross_origin, String(),
+        String(), String(), String(), String(), kReferrerPolicyDefault,
+        href_url, String() /* srcset */, String() /* sizes */);
     loader->LoadLink(params, dummy_page_holder->GetDocument(), network_hints);
     EXPECT_EQ(test_case.should_load, network_hints.DidPreconnect());
     EXPECT_EQ(test_case.is_https, network_hints.IsHTTPS());
@@ -590,10 +646,10 @@
   LinkLoader* loader = LinkLoader::Create(loader_client.Get());
   KURL href_url = KURL(KURL(), "https://www.example.com/");
   URLTestHelpers::RegisterMockedErrorURLLoad(href_url);
-  LinkLoadParameters params(LinkRelAttribute("preload prefetch"),
-                            kCrossOriginAttributeNotSet,
-                            "application/javascript", "script", "", "", "",
-                            kReferrerPolicyDefault, href_url);
+  LinkLoadParameters params(
+      LinkRelAttribute("preload prefetch"), kCrossOriginAttributeNotSet,
+      "application/javascript", "script", "", "", "", kReferrerPolicyDefault,
+      href_url, String() /* srcset */, String() /* sizes */);
   loader->LoadLink(params, dummy_page_holder->GetDocument(),
                    NetworkHintsMock());
   ASSERT_EQ(1, fetcher->CountPreloads());
diff --git a/third_party/WebKit/Source/core/loader/PingLoaderTest.cpp b/third_party/WebKit/Source/core/loader/PingLoaderTest.cpp
index 6d7ee0f..6f76c9d 100644
--- a/third_party/WebKit/Source/core/loader/PingLoaderTest.cpp
+++ b/third_party/WebKit/Source/core/loader/PingLoaderTest.cpp
@@ -7,7 +7,7 @@
 #include "core/frame/LocalFrame.h"
 #include "core/loader/EmptyClients.h"
 #include "core/loader/FrameLoader.h"
-#include "core/testing/DummyPageHolder.h"
+#include "core/testing/PageTestBase.h"
 #include "platform/loader/fetch/SubstituteData.h"
 #include "platform/testing/URLTestHelpers.h"
 #include "platform/testing/UnitTestHelpers.h"
@@ -33,11 +33,11 @@
   ResourceRequest ping_request_;
 };
 
-class PingLoaderTest : public ::testing::Test {
+class PingLoaderTest : public PageTestBase {
  public:
   void SetUp() override {
     client_ = new PingLocalFrameClient;
-    page_holder_ = DummyPageHolder::Create(IntSize(1, 1), nullptr, client_);
+    PageTestBase::SetupPageWithClients(nullptr, client_);
   }
 
   void TearDown() override {
@@ -49,17 +49,16 @@
   void SetDocumentURL(const KURL& url) {
     FrameLoadRequest request(nullptr, ResourceRequest(url),
                              SubstituteData(SharedBuffer::Create()));
-    page_holder_->GetFrame().Loader().Load(request);
+    GetFrame().Loader().Load(request);
     blink::testing::RunPendingTasks();
-    ASSERT_EQ(url.GetString(), page_holder_->GetDocument().Url().GetString());
+    ASSERT_EQ(url.GetString(), GetDocument().Url().GetString());
   }
 
   const ResourceRequest& PingAndGetRequest(const KURL& ping_url) {
     KURL destination_url("http://navigation.destination");
     URLTestHelpers::RegisterMockedURLLoad(
         ping_url, testing::CoreTestDataPath("bar.html"), "text/html");
-    PingLoader::SendLinkAuditPing(&page_holder_->GetFrame(), ping_url,
-                                  destination_url);
+    PingLoader::SendLinkAuditPing(&GetFrame(), ping_url, destination_url);
     const ResourceRequest& ping_request = client_->PingRequest();
     if (!ping_request.IsNull()) {
       EXPECT_EQ(destination_url.GetString(),
@@ -73,7 +72,6 @@
 
  protected:
   Persistent<PingLocalFrameClient> client_;
-  std::unique_ptr<DummyPageHolder> page_holder_;
 };
 
 TEST_F(PingLoaderTest, HTTPSToHTTPS) {
@@ -110,8 +108,7 @@
   KURL ping_url("https://localhost/bar.html");
   URLTestHelpers::RegisterMockedURLLoad(
       ping_url, testing::CoreTestDataPath("bar.html"), "text/html");
-  PingLoader::SendLinkAuditPing(&page_holder_->GetFrame(), ping_url,
-                                destination_url);
+  PingLoader::SendLinkAuditPing(&GetFrame(), ping_url, destination_url);
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
   const ResourceRequest& request = client_->PingRequest();
   ASSERT_FALSE(request.IsNull());
@@ -125,7 +122,7 @@
   KURL ping_url("https://localhost/bar.html");
   URLTestHelpers::RegisterMockedURLLoad(
       ping_url, testing::CoreTestDataPath("bar.html"), "text/html");
-  PingLoader::SendViolationReport(&page_holder_->GetFrame(), ping_url,
+  PingLoader::SendViolationReport(&GetFrame(), ping_url,
                                   EncodedFormData::Create(),
                                   PingLoader::kXSSAuditorViolationReport);
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
@@ -141,7 +138,7 @@
   KURL ping_url("https://localhost/bar.html");
   URLTestHelpers::RegisterMockedURLLoad(
       ping_url, testing::CoreTestDataPath("bar.html"), "text/html");
-  PingLoader::SendBeacon(&page_holder_->GetFrame(), ping_url, "hello");
+  PingLoader::SendBeacon(&GetFrame(), ping_url, "hello");
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
   const ResourceRequest& request = client_->PingRequest();
   ASSERT_FALSE(request.IsNull());
diff --git a/third_party/WebKit/Source/core/loader/ProgressTrackerTest.cpp b/third_party/WebKit/Source/core/loader/ProgressTrackerTest.cpp
index 786c6f4..75ae41b0 100644
--- a/third_party/WebKit/Source/core/loader/ProgressTrackerTest.cpp
+++ b/third_party/WebKit/Source/core/loader/ProgressTrackerTest.cpp
@@ -6,7 +6,7 @@
 
 #include "core/frame/Settings.h"
 #include "core/loader/EmptyClients.h"
-#include "core/testing/DummyPageHolder.h"
+#include "core/testing/PageTestBase.h"
 #include "platform/loader/fetch/ResourceResponse.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -26,18 +26,16 @@
   double last_progress_;
 };
 
-class ProgressTrackerTest : public ::testing::Test {
+class ProgressTrackerTest : public PageTestBase {
  public:
   ProgressTrackerTest()
       : response_(KURL("http://example.com"), "text/html", 1024) {}
 
   void SetUp() override {
     client_ = new ProgressClient;
-    dummy_page_holder_ =
-        DummyPageHolder::Create(IntSize(800, 600), nullptr, client_.Get());
+    PageTestBase::SetupPageWithClients(nullptr, client_.Get());
   }
 
-  LocalFrame& GetFrame() const { return dummy_page_holder_->GetFrame(); }
   ProgressTracker& Progress() const { return GetFrame().Loader().Progress(); }
   double LastProgress() const { return client_->LastProgress(); }
   const ResourceResponse& ResponseHeaders() const { return response_; }
@@ -55,7 +53,6 @@
 
  private:
   Persistent<ProgressClient> client_;
-  std::unique_ptr<DummyPageHolder> dummy_page_holder_;
   ResourceResponse response_;
 };
 
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
index b5f6844..94a559a 100644
--- a/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
+++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleTreeLinkerTest.cpp
@@ -12,7 +12,7 @@
 #include "core/script/Modulator.h"
 #include "core/script/ModuleScript.h"
 #include "core/testing/DummyModulator.h"
-#include "core/testing/DummyPageHolder.h"
+#include "core/testing/PageTestBase.h"
 #include "platform/bindings/ScriptState.h"
 #include "platform/bindings/V8ThrowException.h"
 #include "platform/heap/Handle.h"
@@ -174,7 +174,7 @@
   DummyModulator::Trace(visitor);
 }
 
-class ModuleTreeLinkerTest : public ::testing::Test {
+class ModuleTreeLinkerTest : public PageTestBase {
   DISALLOW_COPY_AND_ASSIGN(ModuleTreeLinkerTest);
 
  public:
@@ -184,14 +184,13 @@
   ModuleTreeLinkerTestModulator* GetModulator() { return modulator_.Get(); }
 
  protected:
-  std::unique_ptr<DummyPageHolder> dummy_page_holder_;
   Persistent<ModuleTreeLinkerTestModulator> modulator_;
 };
 
 void ModuleTreeLinkerTest::SetUp() {
-  dummy_page_holder_ = DummyPageHolder::Create(IntSize(500, 500));
+  PageTestBase::SetUp(IntSize(500, 500));
   scoped_refptr<ScriptState> script_state =
-      ToScriptStateForMainWorld(&dummy_page_holder_->GetFrame());
+      ToScriptStateForMainWorld(&GetFrame());
   modulator_ = new ModuleTreeLinkerTestModulator(script_state);
 }
 
diff --git a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
index 4da00e3..e6c2ddcb 100644
--- a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
+++ b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
@@ -44,6 +44,7 @@
 namespace TouchAdjustment {
 
 const float kZeroTolerance = 1e-6f;
+constexpr float kMaxAdjustmentRadiusDips = 16.f;
 
 // Class for remembering absolute quads of a target node and what node they
 // represent.
@@ -530,4 +531,10 @@
       subtargets, TouchAdjustment::HybridDistanceFunction);
 }
 
+LayoutSize GetHitTestRectForAdjustment(const IntSize& touch_area) {
+  const LayoutSize max_size(TouchAdjustment::kMaxAdjustmentRadiusDips,
+                            TouchAdjustment::kMaxAdjustmentRadiusDips);
+  return LayoutSize(touch_area).ShrunkTo(max_size);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/page/TouchAdjustment.h b/third_party/WebKit/Source/core/page/TouchAdjustment.h
index 2bd0a40..688cfe7 100644
--- a/third_party/WebKit/Source/core/page/TouchAdjustment.h
+++ b/third_party/WebKit/Source/core/page/TouchAdjustment.h
@@ -24,6 +24,7 @@
 #include "platform/geometry/FloatPoint.h"
 #include "platform/geometry/IntPoint.h"
 #include "platform/geometry/IntRect.h"
+#include "platform/geometry/LayoutSize.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Vector.h"
 
@@ -41,7 +42,8 @@
                                   const IntPoint& touch_hotspot,
                                   const IntRect& touch_area,
                                   const HeapVector<Member<Node>>&);
-// FIXME: Implement the similar functions for other gestures here as well.
+
+LayoutSize GetHitTestRectForAdjustment(const IntSize& touch_area);
 
 struct TouchAdjustmentResult {
   uint32_t unique_event_id;
diff --git a/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.cpp b/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.cpp
index afbed5c..906b2eb3 100644
--- a/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.cpp
@@ -8,6 +8,11 @@
 
 namespace blink {
 
+void ScrollStateCallbackV8Impl::Trace(blink::Visitor* visitor) {
+  visitor->Trace(callback_);
+  ScrollStateCallback::Trace(visitor);
+}
+
 void ScrollStateCallbackV8Impl::Invoke(ScrollState* scroll_state) {
   callback_->InvokeAndReportException(nullptr, scroll_state);
 }
diff --git a/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.h b/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.h
index ca6971a..77a5732 100644
--- a/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.h
+++ b/third_party/WebKit/Source/core/page/scrolling/ScrollStateCallback.h
@@ -48,6 +48,8 @@
 
   ~ScrollStateCallbackV8Impl() = default;
 
+  void Trace(blink::Visitor*) override;
+
   void Invoke(ScrollState*) override;
 
  private:
@@ -57,9 +59,11 @@
   explicit ScrollStateCallbackV8Impl(
       V8ScrollStateCallback* callback,
       WebNativeScrollBehavior native_scroll_behavior)
-      : ScrollStateCallback(native_scroll_behavior), callback_(callback) {}
+      : ScrollStateCallback(native_scroll_behavior),
+        callback_(V8PersistentCallbackFunction<V8ScrollStateCallback>::Create(
+            callback)) {}
 
-  V8ScrollStateCallback::Persistent<V8ScrollStateCallback> callback_;
+  Member<V8PersistentCallbackFunction<V8ScrollStateCallback>> callback_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/LinkHighlightImpl.cpp b/third_party/WebKit/Source/core/paint/LinkHighlightImpl.cpp
index 6a7ace8f..66ee39d 100644
--- a/third_party/WebKit/Source/core/paint/LinkHighlightImpl.cpp
+++ b/third_party/WebKit/Source/core/paint/LinkHighlightImpl.cpp
@@ -90,15 +90,15 @@
   clip_layer_->SetTransformOrigin(WebFloatPoint3D());
   clip_layer_->AddChild(content_layer_->Layer());
 
-  compositor_player_ = CompositorAnimationPlayer::Create();
-  DCHECK(compositor_player_);
-  compositor_player_->SetAnimationDelegate(this);
+  compositor_animation_ = CompositorAnimation::Create();
+  DCHECK(compositor_animation_);
+  compositor_animation_->SetAnimationDelegate(this);
   if (owning_web_view_->LinkHighlightsTimeline())
-    owning_web_view_->LinkHighlightsTimeline()->PlayerAttached(*this);
+    owning_web_view_->LinkHighlightsTimeline()->AnimationAttached(*this);
 
   CompositorElementId element_id =
       CompositorElementIdFromUniqueObjectId(unique_id_);
-  compositor_player_->AttachElement(element_id);
+  compositor_animation_->AttachElement(element_id);
   content_layer_->Layer()->SetDrawsContent(true);
   content_layer_->Layer()->SetOpacity(1);
   content_layer_->Layer()->SetElementId(element_id);
@@ -106,12 +106,12 @@
 }
 
 LinkHighlightImpl::~LinkHighlightImpl() {
-  if (compositor_player_->IsElementAttached())
-    compositor_player_->DetachElement();
+  if (compositor_animation_->IsElementAttached())
+    compositor_animation_->DetachElement();
   if (owning_web_view_->LinkHighlightsTimeline())
-    owning_web_view_->LinkHighlightsTimeline()->PlayerDestroyed(*this);
-  compositor_player_->SetAnimationDelegate(nullptr);
-  compositor_player_.reset();
+    owning_web_view_->LinkHighlightsTimeline()->AnimationDestroyed(*this);
+  compositor_animation_->SetAnimationDelegate(nullptr);
+  compositor_animation_.reset();
 
   ClearGraphicsLayerLinkHighlightPointer();
   ReleaseResources();
@@ -331,7 +331,7 @@
                                       0, 0);
 
   content_layer_->Layer()->SetDrawsContent(true);
-  compositor_player_->AddKeyframeModel(std::move(keyframe_model));
+  compositor_animation_->AddKeyframeModel(std::move(keyframe_model));
 
   Invalidate();
   owning_web_view_->MainFrameImpl()->FrameWidget()->ScheduleAnimation();
@@ -407,8 +407,8 @@
   return ClipLayer();
 }
 
-CompositorAnimationPlayer* LinkHighlightImpl::CompositorPlayer() const {
-  return compositor_player_.get();
+CompositorAnimation* LinkHighlightImpl::GetCompositorAnimation() const {
+  return compositor_animation_.get();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/LinkHighlightImpl.h b/third_party/WebKit/Source/core/paint/LinkHighlightImpl.h
index 18dcb8b..c5e6ff1 100644
--- a/third_party/WebKit/Source/core/paint/LinkHighlightImpl.h
+++ b/third_party/WebKit/Source/core/paint/LinkHighlightImpl.h
@@ -28,9 +28,9 @@
 
 #include <memory>
 #include "core/CoreExport.h"
+#include "platform/animation/CompositorAnimation.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 #include "platform/graphics/CompositorElementId.h"
 #include "platform/graphics/LinkHighlight.h"
 #include "platform/graphics/Path.h"
@@ -48,11 +48,10 @@
 class WebLayer;
 class WebViewImpl;
 
-class CORE_EXPORT LinkHighlightImpl final
-    : public LinkHighlight,
-      public WebContentLayerClient,
-      public CompositorAnimationDelegate,
-      public CompositorAnimationPlayerClient {
+class CORE_EXPORT LinkHighlightImpl final : public LinkHighlight,
+                                            public WebContentLayerClient,
+                                            public CompositorAnimationDelegate,
+                                            public CompositorAnimationClient {
  public:
   static std::unique_ptr<LinkHighlightImpl> Create(Node*, WebViewImpl*);
   ~LinkHighlightImpl() override;
@@ -77,8 +76,8 @@
   WebLayer* Layer() override;
   void ClearCurrentGraphicsLayer() override;
 
-  // CompositorAnimationPlayerClient implementation.
-  CompositorAnimationPlayer* CompositorPlayer() const override;
+  // CompositorAnimationClient implementation.
+  CompositorAnimation* GetCompositorAnimation() const override;
 
   GraphicsLayer* CurrentGraphicsLayerForTesting() const {
     return current_graphics_layer_;
@@ -105,7 +104,7 @@
   WebViewImpl* owning_web_view_;
   GraphicsLayer* current_graphics_layer_;
   bool is_scrolling_graphics_layer_;
-  std::unique_ptr<CompositorAnimationPlayer> compositor_player_;
+  std::unique_ptr<CompositorAnimation> compositor_animation_;
 
   bool geometry_needs_update_;
   bool is_animating_;
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
index 684c20c96..2fcd31c 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -1014,7 +1014,7 @@
   // See LayoutSVGBlock::AllowsOverflowClip().
   if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled() &&
       (object.IsSVGForeignObject() || object.IsSVGViewportContainer()) &&
-      SVGLayoutSupport::IsOverflowHidden(&object))
+      SVGLayoutSupport::IsOverflowHidden(object))
     return true;
 
   return object.IsBox() && ToLayoutBox(object).ShouldClipOverflow() &&
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp
index 8ef848d8..ac9361fa 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeUpdateTests.cpp
@@ -1068,4 +1068,54 @@
   EXPECT_TRUE(filter->RequiresCompositingForAnimation());
 }
 
+TEST_P(PaintPropertyTreeUpdateTest, SVGViewportContainerOverflowChange) {
+  SetBodyInnerHTML(R"HTML(
+    <svg>
+      <svg id='target' width='30' height='40'></svg>
+    </svg>
+  )HTML");
+
+  const auto* properties = PaintPropertiesForElement("target");
+  ASSERT_NE(nullptr, properties);
+  EXPECT_EQ(FloatRect(0, 0, 30, 40),
+            properties->OverflowClip()->ClipRect().Rect());
+
+  GetDocument().getElementById("target")->setAttribute("overflow", "visible");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  EXPECT_EQ(nullptr, PaintPropertiesForElement("target"));
+
+  GetDocument().getElementById("target")->setAttribute("overflow", "hidden");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  properties = PaintPropertiesForElement("target");
+  ASSERT_NE(nullptr, properties);
+  EXPECT_EQ(FloatRect(0, 0, 30, 40),
+            properties->OverflowClip()->ClipRect().Rect());
+}
+
+TEST_P(PaintPropertyTreeUpdateTest, SVGForeignObjectOverflowChange) {
+  SetBodyInnerHTML(R"HTML(
+    <svg>
+      <foreignObject id='target' x='10' y='20' width='30' height='40'
+          overflow='hidden'>
+      </foreignObject>
+    </svg>
+  )HTML");
+
+  const auto* properties = PaintPropertiesForElement("target");
+  ASSERT_NE(nullptr, properties);
+  EXPECT_EQ(FloatRect(10, 20, 30, 40),
+            properties->OverflowClip()->ClipRect().Rect());
+
+  GetDocument().getElementById("target")->setAttribute("overflow", "visible");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  EXPECT_EQ(nullptr, PaintPropertiesForElement("target"));
+
+  GetDocument().getElementById("target")->setAttribute("overflow", "hidden");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  properties = PaintPropertiesForElement("target");
+  ASSERT_NE(nullptr, properties);
+  EXPECT_EQ(FloatRect(10, 20, 30, 40),
+            properties->OverflowClip()->ClipRect().Rect());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp b/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp
index 890651c..31c1c3a 100644
--- a/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/SVGContainerPainter.cpp
@@ -47,7 +47,7 @@
     Optional<FloatClipRecorder> clip_recorder;
     Optional<ScopedPaintChunkProperties> scoped_paint_chunk_properties;
     if (layout_svg_container_.IsSVGViewportContainer() &&
-        SVGLayoutSupport::IsOverflowHidden(&layout_svg_container_)) {
+        SVGLayoutSupport::IsOverflowHidden(layout_svg_container_)) {
       if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
         const auto* fragment =
             paint_info.FragmentToPaint(layout_svg_container_);
diff --git a/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp b/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp
index 6006d35..bd1cdf2 100644
--- a/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/SVGForeignObjectPainter.cpp
@@ -50,7 +50,7 @@
   // apply clip manually. See LayoutSVGBlock::allowsOverflowClip() for details.
   Optional<FloatClipRecorder> clip_recorder;
   Optional<ScopedPaintChunkProperties> scoped_paint_chunk_properties;
-  if (SVGLayoutSupport::IsOverflowHidden(&layout_svg_foreign_object_)) {
+  if (SVGLayoutSupport::IsOverflowHidden(layout_svg_foreign_object_)) {
     if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
       const auto* fragment =
           paint_info.FragmentToPaint(layout_svg_foreign_object_);
diff --git a/third_party/WebKit/Source/core/paint/SVGShapePainter.cpp b/third_party/WebKit/Source/core/paint/SVGShapePainter.cpp
index 218a5532..4e049a7 100644
--- a/third_party/WebKit/Source/core/paint/SVGShapePainter.cpp
+++ b/third_party/WebKit/Source/core/paint/SVGShapePainter.cpp
@@ -240,7 +240,7 @@
 
   canvas->save();
   canvas->concat(AffineTransformToSkMatrix(transform));
-  if (SVGLayoutSupport::IsOverflowHidden(&marker))
+  if (SVGLayoutSupport::IsOverflowHidden(marker))
     canvas->clipRect(marker.Viewport());
 
   PaintRecordBuilder builder(nullptr, &paint_info.context);
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index 277c891..0e37c05 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -35,8 +35,11 @@
 #include "core/css/properties/CSSProperty.h"
 #include "core/css/properties/Longhand.h"
 #include "core/css/resolver/StyleResolver.h"
+#include "core/dom/Document.h"
+#include "core/frame/LocalDOMWindow.h"
 #include "core/layout/LayoutTheme.h"
 #include "core/layout/TextAutosizer.h"
+#include "core/layout/custom/LayoutWorklet.h"
 #include "core/style/AppliedTextDecoration.h"
 #include "core/style/BorderEdge.h"
 #include "core/style/ComputedStyleConstants.h"
@@ -502,6 +505,7 @@
 }
 
 StyleDifference ComputedStyle::VisualInvalidationDiff(
+    const Document& document,
     const ComputedStyle& other) const {
   // Note, we use .Get() on each DataRef below because DataRef::operator== will
   // do a deep compare, which is duplicate work when we're going to compare each
@@ -517,7 +521,7 @@
     diff.SetNeedsPaintInvalidationObject();
   }
 
-  if (!diff.NeedsFullLayout() && DiffNeedsFullLayout(other))
+  if (!diff.NeedsFullLayout() && DiffNeedsFullLayout(document, other))
     diff.SetNeedsFullLayout();
 
   if (!diff.NeedsFullLayout() && !MarginEqual(other)) {
@@ -632,8 +636,42 @@
   return false;
 }
 
-bool ComputedStyle::DiffNeedsFullLayout(const ComputedStyle& other) const {
-  return ComputedStyleBase::DiffNeedsFullLayout(*this, other);
+bool ComputedStyle::DiffNeedsFullLayout(const Document& document,
+                                        const ComputedStyle& other) const {
+  if (ComputedStyleBase::DiffNeedsFullLayout(*this, other))
+    return true;
+
+  if (IsDisplayLayoutCustomBox()) {
+    if (DiffNeedsFullLayoutForLayoutCustom(document, other))
+      return true;
+  }
+
+  return false;
+}
+
+bool ComputedStyle::DiffNeedsFullLayoutForLayoutCustom(
+    const Document& document,
+    const ComputedStyle& other) const {
+  DCHECK(IsDisplayLayoutCustomBox());
+
+  LayoutWorklet* worklet = LayoutWorklet::From(*document.domWindow());
+  const AtomicString& name = DisplayLayoutCustomName();
+
+  if (!worklet->GetDocumentDefinitionMap()->Contains(name))
+    return false;
+
+  const DocumentLayoutDefinition* definition =
+      worklet->GetDocumentDefinitionMap()->at(name);
+  if (definition == kInvalidDocumentLayoutDefinition)
+    return false;
+
+  if (!PropertiesEqual(definition->NativeInvalidationProperties(), other))
+    return true;
+
+  if (!CustomPropertiesEqual(definition->CustomInvalidationProperties(), other))
+    return true;
+
+  return false;
 }
 
 bool ComputedStyle::DiffNeedsPaintInvalidationSubtree(
@@ -673,27 +711,45 @@
       !value->CustomInvalidationProperties())
     return true;
 
-  for (CSSPropertyID property_id : *value->NativeInvalidationProperties()) {
+  if (!PropertiesEqual(*value->NativeInvalidationProperties(), other))
+    return true;
+
+  if (!CustomPropertiesEqual(*value->CustomInvalidationProperties(), other))
+    return true;
+
+  return false;
+}
+
+bool ComputedStyle::PropertiesEqual(const Vector<CSSPropertyID>& properties,
+                                    const ComputedStyle& other) const {
+  for (CSSPropertyID property_id : properties) {
     // TODO(ikilpatrick): remove IsInterpolableProperty check once
     // CSSPropertyEquality::PropertiesEqual correctly handles all properties.
     const CSSProperty& property = CSSProperty::Get(property_id);
     if (!property.IsInterpolable() ||
         !CSSPropertyEquality::PropertiesEqual(PropertyHandle(property), *this,
                                               other))
-      return true;
+      return false;
   }
 
-  if (InheritedVariables() || NonInheritedVariables() ||
-      other.InheritedVariables() || other.NonInheritedVariables()) {
-    for (const AtomicString& property_name :
-         *value->CustomInvalidationProperties()) {
-      if (!DataEquivalent(GetVariable(property_name),
-                          other.GetVariable(property_name)))
-        return true;
-    }
+  return true;
+}
+
+bool ComputedStyle::CustomPropertiesEqual(
+    const Vector<AtomicString>& properties,
+    const ComputedStyle& other) const {
+  // Short-circuit if neither of the styles have custom properties.
+  if (!InheritedVariables() && !NonInheritedVariables() &&
+      !other.InheritedVariables() && !other.NonInheritedVariables())
+    return true;
+
+  for (const AtomicString& property_name : properties) {
+    if (!DataEquivalent(GetVariable(property_name),
+                        other.GetVariable(property_name)))
+      return false;
   }
 
-  return false;
+  return true;
 }
 
 // This doesn't include conditions needing layout or overflow recomputation
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 12d6338..6698f9a 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -283,7 +283,8 @@
   StyleContentAlignmentData ResolvedJustifyContent(
       const StyleContentAlignmentData& normal_behaviour) const;
 
-  StyleDifference VisualInvalidationDiff(const ComputedStyle&) const;
+  StyleDifference VisualInvalidationDiff(const Document&,
+                                         const ComputedStyle&) const;
 
   void InheritFrom(const ComputedStyle& inherit_parent,
                    IsAtShadowBoundary = kNotAtShadowBoundary);
@@ -2448,7 +2449,9 @@
                                             const StyleDifference&) const;
   bool DiffNeedsFullLayoutAndPaintInvalidation(
       const ComputedStyle& other) const;
-  bool DiffNeedsFullLayout(const ComputedStyle& other) const;
+  bool DiffNeedsFullLayout(const Document&, const ComputedStyle& other) const;
+  bool DiffNeedsFullLayoutForLayoutCustom(const Document&,
+                                          const ComputedStyle& other) const;
   bool DiffNeedsPaintInvalidationSubtree(const ComputedStyle& other) const;
   bool DiffNeedsPaintInvalidationObject(const ComputedStyle& other) const;
   bool DiffNeedsPaintInvalidationObjectForPaintImage(
@@ -2458,6 +2461,11 @@
   CORE_EXPORT void UpdatePropertySpecificDifferences(const ComputedStyle& other,
                                                      StyleDifference&) const;
 
+  bool PropertiesEqual(const Vector<CSSPropertyID>& properties,
+                       const ComputedStyle& other) const;
+  bool CustomPropertiesEqual(const Vector<AtomicString>& properties,
+                             const ComputedStyle& other) const;
+
   static bool ShadowListHasCurrentColor(const ShadowList*);
 
   StyleInheritedVariables& MutableInheritedVariables();
diff --git a/third_party/WebKit/Source/core/svg/SVGScriptElement.cpp b/third_party/WebKit/Source/core/svg/SVGScriptElement.cpp
index b187125..13a939e 100644
--- a/third_party/WebKit/Source/core/svg/SVGScriptElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGScriptElement.cpp
@@ -146,8 +146,8 @@
   return Node::GetDocument();
 }
 
-Element* SVGScriptElement::CloneElementWithoutAttributesAndChildren(
-    Document& factory) {
+Element* SVGScriptElement::CloneWithoutAttributesAndChildren(
+    Document& factory) const {
   CreateElementFlags flags =
       CreateElementFlags::ByCloneNode().SetAlreadyStarted(
           loader_->AlreadyStarted());
diff --git a/third_party/WebKit/Source/core/svg/SVGScriptElement.h b/third_party/WebKit/Source/core/svg/SVGScriptElement.h
index aefde13..b6e7871 100644
--- a/third_party/WebKit/Source/core/svg/SVGScriptElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGScriptElement.h
@@ -98,7 +98,7 @@
   void SetScriptElementForBinding(
       HTMLScriptElementOrSVGScriptElement&) override;
 
-  Element* CloneElementWithoutAttributesAndChildren(Document&) override;
+  Element* CloneWithoutAttributesAndChildren(Document&) const override;
   bool LayoutObjectIsNeeded(const ComputedStyle&) override { return false; }
 
   TraceWrapperMember<ScriptLoader> loader_;
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
index 4f46574..31239ae 100644
--- a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
@@ -402,7 +402,7 @@
 }
 
 Element* SVGUseElement::CreateInstanceTree(SVGElement& target_root) const {
-  Element* instance_root = target_root.CloneElementWithChildren();
+  Element* instance_root = target_root.CloneWithChildren();
   DCHECK(instance_root->IsSVGElement());
   if (IsSVGSymbolElement(target_root)) {
     // Spec: The referenced 'symbol' and its contents are deep-cloned into
@@ -417,7 +417,7 @@
         SVGSVGElement::Create(target_root.GetDocument());
     // Transfer all attributes from the <symbol> to the new <svg>
     // element.
-    svg_element->CloneAttributesFromElement(*instance_root);
+    svg_element->CloneAttributesFrom(*instance_root);
     // Move already cloned elements to the new <svg> element.
     MoveChildrenToReplacementElement(*instance_root, *svg_element);
     instance_root = svg_element;
@@ -624,7 +624,7 @@
     // Setup sub-shadow tree root node
     SVGGElement* clone_parent = SVGGElement::Create(original_use.GetDocument());
     // Transfer all data (attributes, etc.) from <use> to the new <g> element.
-    clone_parent->CloneAttributesFromElement(*use);
+    clone_parent->CloneAttributesFrom(*use);
     clone_parent->SetCorrespondingElement(&original_use);
 
     RemoveAttributesFromReplacementElement(*clone_parent);
diff --git a/third_party/WebKit/Source/core/timing/PerformanceNavigationTimingTest.cpp b/third_party/WebKit/Source/core/timing/PerformanceNavigationTimingTest.cpp
index b0a6399..b7be983 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceNavigationTimingTest.cpp
+++ b/third_party/WebKit/Source/core/timing/PerformanceNavigationTimingTest.cpp
@@ -4,42 +4,32 @@
 
 #include "core/timing/PerformanceNavigationTiming.h"
 
-#include "core/testing/DummyPageHolder.h"
+#include "core/testing/PageTestBase.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/common/page/page_visibility_state.mojom-blink.h"
 
 namespace blink {
 
-class PerformanceNavigationTimingTest : public ::testing::Test {
+class PerformanceNavigationTimingTest : public PageTestBase {
  protected:
-  void SetUp() override {
-    page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
-  }
-
   AtomicString GetNavigationType(NavigationType type, Document* document) {
     return PerformanceNavigationTiming::GetNavigationType(type, document);
   }
-
-  std::unique_ptr<DummyPageHolder> page_holder_;
 };
 
 TEST_F(PerformanceNavigationTimingTest, GetNavigationType) {
-  page_holder_->GetPage().SetVisibilityState(
-      mojom::PageVisibilityState::kPrerender, false);
-  AtomicString returned_type = GetNavigationType(kNavigationTypeBackForward,
-                                                 &page_holder_->GetDocument());
+  GetPage().SetVisibilityState(mojom::PageVisibilityState::kPrerender, false);
+  AtomicString returned_type =
+      GetNavigationType(kNavigationTypeBackForward, &GetDocument());
   EXPECT_EQ(returned_type, "prerender");
 
-  page_holder_->GetPage().SetVisibilityState(
-      mojom::PageVisibilityState::kHidden, false);
-  returned_type = GetNavigationType(kNavigationTypeBackForward,
-                                    &page_holder_->GetDocument());
+  GetPage().SetVisibilityState(mojom::PageVisibilityState::kHidden, false);
+  returned_type = GetNavigationType(kNavigationTypeBackForward, &GetDocument());
   EXPECT_EQ(returned_type, "back_forward");
 
-  page_holder_->GetPage().SetVisibilityState(
-      mojom::PageVisibilityState::kVisible, false);
-  returned_type = GetNavigationType(kNavigationTypeFormResubmitted,
-                                    &page_holder_->GetDocument());
+  GetPage().SetVisibilityState(mojom::PageVisibilityState::kVisible, false);
+  returned_type =
+      GetNavigationType(kNavigationTypeFormResubmitted, &GetDocument());
   EXPECT_EQ(returned_type, "navigate");
 }
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
index 6ca55eb..2c96dad 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
+++ b/third_party/WebKit/Source/core/timing/PerformanceTest.cpp
@@ -7,8 +7,8 @@
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "bindings/core/v8/v8_performance_observer_callback.h"
 #include "core/dom/ExecutionContext.h"
-#include "core/testing/DummyPageHolder.h"
 #include "core/testing/NullExecutionContext.h"
+#include "core/testing/PageTestBase.h"
 #include "core/timing/Performance.h"
 #include "core/timing/PerformanceLongTaskTiming.h"
 #include "core/timing/PerformanceObserver.h"
@@ -40,7 +40,7 @@
   void Trace(blink::Visitor* visitor) { Performance::Trace(visitor); }
 };
 
-class PerformanceTest : public ::testing::Test {
+class PerformanceTest : public PageTestBase {
  protected:
   void Initialize(ScriptState* script_state) {
     v8::Local<v8::Function> callback =
@@ -52,7 +52,7 @@
   }
 
   void SetUp() override {
-    page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
+    PageTestBase::SetUp();
     execution_context_ = new NullExecutionContext();
   }
 
@@ -74,7 +74,6 @@
   Persistent<TestPerformance> base_;
   Persistent<ExecutionContext> execution_context_;
   Persistent<PerformanceObserver> observer_;
-  std::unique_ptr<DummyPageHolder> page_holder_;
   Persistent<V8PerformanceObserverCallback> cb_;
 };
 
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
index a9f4ad0..24317734 100644
--- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
+++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -1085,9 +1085,7 @@
   request.SetFetchCredentialsMode(
       with_credentials_ ? network::mojom::FetchCredentialsMode::kInclude
                         : network::mojom::FetchCredentialsMode::kSameOrigin);
-  request.SetServiceWorkerMode(is_isolated_world_
-                                   ? WebURLRequest::ServiceWorkerMode::kNone
-                                   : WebURLRequest::ServiceWorkerMode::kAll);
+  request.SetSkipServiceWorker(is_isolated_world_);
   request.SetExternalRequestStateFromRequestorAddressSpace(
       execution_context.GetSecurityContext().AddressSpace());
 
diff --git a/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Dialog.js b/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Dialog.js
index 49c74077..86b54c4 100644
--- a/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Dialog.js
+++ b/third_party/WebKit/Source/devtools/front_end/audits2/Audits2Dialog.js
@@ -47,16 +47,15 @@
     const buttonsRow = uiElement.createChild('div', 'audits2-dialog-buttons hbox');
     this._startButton =
         UI.createTextButton(Common.UIString('Run audit'), this._start.bind(this), '', true /* primary */);
-    this._startButton.autofocus = true;
     buttonsRow.appendChild(this._startButton);
     this._cancelButton = UI.createTextButton(Common.UIString('Cancel'), this._cancel.bind(this));
     buttonsRow.appendChild(this._cancelButton);
 
+    auditsViewElement.tabIndex = 0;
+    this._dialog.setDefaultFocusedElement(this._startButton);
     this._dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.SetExactWidthMaxHeight);
     this._dialog.setMaxContentSize(new UI.Size(500, 400));
     this._dialog.show(dialogRenderElement);
-    auditsViewElement.tabIndex = 0;
-    auditsViewElement.focus();
   }
 
   hide() {
diff --git a/third_party/WebKit/Source/devtools/front_end/jsconfig.json b/third_party/WebKit/Source/devtools/front_end/jsconfig.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/jsconfig.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn
index c5e2a70..cc24f4f 100644
--- a/third_party/WebKit/Source/modules/BUILD.gn
+++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -234,6 +234,7 @@
 
   sources = [
     "accessibility/AXObjectCacheTest.cpp",
+    "accessibility/AXObjectTest.cpp",
     "accessibility/AccessibilityObjectModelTest.cpp",
     "accessibility/testing/AccessibilityTest.cpp",
     "accessibility/testing/AccessibilityTest.h",
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
index e93eaa9..9c74523 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.cpp
@@ -1776,12 +1776,27 @@
   return const_cast<AXObject*>(this);
 }
 
+const AXObject::AXObjectVector& AXObject::Children() const {
+  return const_cast<AXObject*>(this)->Children();
+}
+
 const AXObject::AXObjectVector& AXObject::Children() {
   UpdateChildrenIfNecessary();
 
   return children_;
 }
 
+bool AXObject::IsAncestorOf(const AXObject& descendant) const {
+  return descendant.IsDescendantOf(*this);
+}
+
+bool AXObject::IsDescendantOf(const AXObject& ancestor) const {
+  const AXObject* parent = ParentObject();
+  while (parent && parent != &ancestor)
+    parent = parent->ParentObject();
+  return !!parent;
+}
+
 AXObject* AXObject::ParentObject() const {
   if (IsDetached())
     return nullptr;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObject.h b/third_party/WebKit/Source/modules/accessibility/AXObject.h
index bb96d6b3..3909c8b6 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObject.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXObject.h
@@ -636,7 +636,10 @@
 
   // High-level accessibility tree access. Other modules should only use these
   // functions.
+  const AXObjectVector& Children() const;
   const AXObjectVector& Children();
+  bool IsAncestorOf(const AXObject&) const;
+  bool IsDescendantOf(const AXObject&) const;
   AXObject* ParentObject() const;
   AXObject* ParentObjectIfExists() const;
   virtual AXObject* ComputeParent() const = 0;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
index 234b3e1..713e0fd 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
@@ -412,6 +412,10 @@
   return new_obj;
 }
 
+AXObject* AXObjectCacheImpl::GetOrCreate(const Node* node) {
+  return GetOrCreate(const_cast<Node*>(node));
+}
+
 AXObject* AXObjectCacheImpl::GetOrCreate(Node* node) {
   if (!node)
     return nullptr;
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.h b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.h
index 51d42921..c60faf7c 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.h
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.h
@@ -170,6 +170,7 @@
   AXObject* GetOrCreate(AccessibilityRole);
   AXObject* GetOrCreate(AccessibleNode*);
   AXObject* GetOrCreate(LayoutObject*) override;
+  AXObject* GetOrCreate(const Node*);
   AXObject* GetOrCreate(Node*);
   AXObject* GetOrCreate(AbstractInlineTextBox*);
 
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectTest.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectTest.cpp
new file mode 100644
index 0000000..debe051
--- /dev/null
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectTest.cpp
@@ -0,0 +1,39 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/accessibility/AXObject.h"
+#include "modules/accessibility/testing/AccessibilityTest.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+TEST_F(AccessibilityTest, IsDescendantOf) {
+  SetBodyInnerHTML(R"HTML(<button id='button'>button</button>)HTML");
+
+  const AXObject* root = GetAXRootObject();
+  ASSERT_NE(nullptr, root);
+  const AXObject* button = GetAXObjectByElementId("button");
+  ASSERT_NE(nullptr, button);
+
+  EXPECT_TRUE(button->IsDescendantOf(*root));
+  EXPECT_FALSE(root->IsDescendantOf(*root));
+  EXPECT_FALSE(button->IsDescendantOf(*button));
+  EXPECT_FALSE(root->IsDescendantOf(*button));
+}
+
+TEST_F(AccessibilityTest, IsAncestorOf) {
+  SetBodyInnerHTML(R"HTML(<button id='button'>button</button>)HTML");
+
+  const AXObject* root = GetAXRootObject();
+  ASSERT_NE(nullptr, root);
+  const AXObject* button = GetAXObjectByElementId("button");
+  ASSERT_NE(nullptr, button);
+
+  EXPECT_TRUE(root->IsAncestorOf(*button));
+  EXPECT_FALSE(root->IsAncestorOf(*root));
+  EXPECT_FALSE(button->IsAncestorOf(*button));
+  EXPECT_FALSE(button->IsAncestorOf(*root));
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/accessibility/AccessibilityObjectModelTest.cpp b/third_party/WebKit/Source/modules/accessibility/AccessibilityObjectModelTest.cpp
index 2e4bfbd..1fbc108 100644
--- a/third_party/WebKit/Source/modules/accessibility/AccessibilityObjectModelTest.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AccessibilityObjectModelTest.cpp
@@ -12,6 +12,7 @@
 #include "modules/accessibility/AXTableCell.h"
 #include "modules/accessibility/AXTableRow.h"
 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/modules/accessibility/testing/AccessibilityTest.cpp b/third_party/WebKit/Source/modules/accessibility/testing/AccessibilityTest.cpp
index 9869a8d..ed23b7d 100644
--- a/third_party/WebKit/Source/modules/accessibility/testing/AccessibilityTest.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/testing/AccessibilityTest.cpp
@@ -43,7 +43,7 @@
 
 AXObject* AccessibilityTest::GetAXObjectByElementId(const char* id) const {
   const auto* element = GetElementById(id);
-  return element ? GetAXObjectCache().Get(element) : nullptr;
+  return element ? GetAXObjectCache().GetOrCreate(element) : nullptr;
 }
 
 std::string AccessibilityTest::PrintAXTree() const {
diff --git a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.cpp
index 379cb96..02a1292 100644
--- a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.cpp
@@ -100,16 +100,16 @@
   ThreadedWorkletGlobalScope::Dispose();
 }
 
-Animator* AnimationWorkletGlobalScope::GetAnimatorFor(int player_id,
+Animator* AnimationWorkletGlobalScope::GetAnimatorFor(int animation_id,
                                                       const String& name) {
-  Animator* animator = animators_.at(player_id);
+  Animator* animator = animators_.at(animation_id);
   if (!animator) {
-    // This is a new player so we should create an animator for it.
+    // This is a new animation so we should create an animator for it.
     animator = CreateInstance(name);
     if (!animator)
       return nullptr;
 
-    animators_.Set(player_id, animator);
+    animators_.Set(animation_id, animator);
   }
 
   return animator;
@@ -131,7 +131,7 @@
 
   for (const CompositorMutatorInputState::AnimationState& animation_input :
        mutator_input.animations) {
-    int id = animation_input.animation_player_id;
+    int id = animation_input.animation_id;
     const String name = String::FromUTF8(animation_input.name.data(),
                                          animation_input.name.size());
 
@@ -144,7 +144,7 @@
 
     CompositorMutatorOutputState::AnimationState animation_output;
     if (animator->Animate(script_state, animation_input, &animation_output)) {
-      animation_output.animation_player_id = id;
+      animation_output.animation_id = id;
       result->animations.push_back(std::move(animation_output));
     }
   }
diff --git a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.h b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.h
index 644cbbf..effad68 100644
--- a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.h
+++ b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScope.h
@@ -59,7 +59,7 @@
                               v8::Isolate*,
                               WorkerThread*);
 
-  Animator* GetAnimatorFor(int player_id, const String& name);
+  Animator* GetAnimatorFor(int animation_id, const String& name);
   typedef HeapHashMap<String, TraceWrapperMember<AnimatorDefinition>>
       DefinitionMap;
   DefinitionMap animator_definitions_;
diff --git a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScopeTest.cpp b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScopeTest.cpp
index 9ad92a7..473dfad4 100644
--- a/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScopeTest.cpp
+++ b/third_party/WebKit/Source/modules/animationworklet/AnimationWorkletGlobalScopeTest.cpp
@@ -178,11 +178,11 @@
         ToBoolean(isolate, animated_before.V8Value(), ASSERT_NO_EXCEPTION))
         << "animate function is invoked early";
 
-    // Passing a new input state with a new player id should cause the worklet
-    // to create and animate an animator.
+    // Passing a new input state with a new animation id should cause the
+    // worklet to create and animate an animator.
     CompositorMutatorInputState state;
     CompositorMutatorInputState::AnimationState test_animation_state;
-    test_animation_state.animation_player_id = 1;
+    test_animation_state.animation_id = 1;
     test_animation_state.name = "test";
     test_animation_state.current_time = 5000;
     state.animations = {test_animation_state};
@@ -230,11 +230,11 @@
             });
           )JS"));
 
-    // Passing a new input state with a new player id should cause the worklet
-    // to create and animate an animator.
+    // Passing a new input state with a new animation id should cause the
+    // worklet to create and animate an animator.
     CompositorMutatorInputState state;
     CompositorMutatorInputState::AnimationState test_animation_state;
-    test_animation_state.animation_player_id = 1;
+    test_animation_state.animation_id = 1;
     test_animation_state.name = "test";
     test_animation_state.current_time = 5000;
     state.animations = {test_animation_state};
diff --git a/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.cpp b/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.cpp
index 0c77450f..8815c31 100644
--- a/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.cpp
+++ b/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.cpp
@@ -53,15 +53,15 @@
 
   // TODO(crbug.com/781816): Allow using effects with no target.
   for (const auto& effect : keyframe_effects) {
-    if (!effect->Target()) {
+    if (!effect->target()) {
       error_string = "All effect targets must exist";
       return false;
     }
   }
 
-  Document& target_document = keyframe_effects.at(0)->Target()->GetDocument();
+  Document& target_document = keyframe_effects.at(0)->target()->GetDocument();
   for (const auto& effect : keyframe_effects) {
-    if (effect->Target()->GetDocument() != target_document) {
+    if (effect->target()->GetDocument() != target_document) {
       error_string = "All effects must target elements in the same document";
       return false;
     }
@@ -167,7 +167,7 @@
     return nullptr;
   }
 
-  Document& document = keyframe_effects.at(0)->Target()->GetDocument();
+  Document& document = keyframe_effects.at(0)->target()->GetDocument();
   WorkletAnimation* animation = new WorkletAnimation(
       animator_name, document, keyframe_effects, timeline, std::move(options));
 
@@ -215,7 +215,7 @@
 bool WorkletAnimation::StartOnCompositor(String* failure_message) {
   DCHECK(IsMainThread());
   KeyframeEffectReadOnly* target_effect = effects_.at(0);
-  Element& target = *target_effect->Target();
+  Element& target = *target_effect->target();
 
   // CheckCanStartAnimationOnCompositor requires that the property-specific
   // keyframe groups have been created. To ensure this we manually snapshot the
@@ -249,31 +249,32 @@
     return false;
   }
 
-  if (!compositor_player_) {
-    compositor_player_ = CompositorAnimationPlayer::CreateWorkletPlayer(
+  if (!compositor_animation_) {
+    compositor_animation_ = CompositorAnimation::CreateWorkletAnimation(
         animator_name_, ToCompositorScrollTimeline(timeline_));
-    compositor_player_->SetAnimationDelegate(this);
+    compositor_animation_->SetAnimationDelegate(this);
   }
 
   // Register ourselves on the compositor timeline. This will cause our cc-side
-  // animation player to be registered.
+  // animation animation to be registered.
   if (CompositorAnimationTimeline* compositor_timeline =
           document_->Timeline().CompositorTimeline())
-    compositor_timeline->PlayerAttached(*this);
+    compositor_timeline->AnimationAttached(*this);
 
   // TODO(smcgruer): Creating a WorkletAnimation should be a hint to blink
   // compositing that the animated element should be promoted. Otherwise this
   // fails. http://crbug.com/776533
   CompositorAnimations::AttachCompositedLayers(target,
-                                               compositor_player_.get());
+                                               compositor_animation_.get());
 
   double start_time = std::numeric_limits<double>::quiet_NaN();
   double time_offset = 0;
   int group = 0;
 
   // TODO(smcgruer): We need to start all of the effects, not just the first.
-  effects_.at(0)->StartAnimationOnCompositor(
-      group, start_time, time_offset, playback_rate, compositor_player_.get());
+  effects_.at(0)->StartAnimationOnCompositor(group, start_time, time_offset,
+                                             playback_rate,
+                                             compositor_animation_.get());
   play_state_ = Animation::kRunning;
   return true;
 }
@@ -283,10 +284,10 @@
 
   if (CompositorAnimationTimeline* compositor_timeline =
           document_->Timeline().CompositorTimeline())
-    compositor_timeline->PlayerDestroyed(*this);
-  if (compositor_player_) {
-    compositor_player_->SetAnimationDelegate(nullptr);
-    compositor_player_ = nullptr;
+    compositor_timeline->AnimationDestroyed(*this);
+  if (compositor_animation_) {
+    compositor_animation_->SetAnimationDelegate(nullptr);
+    compositor_animation_ = nullptr;
   }
 }
 
diff --git a/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.h b/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.h
index 7bdd014..31c2682 100644
--- a/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.h
+++ b/third_party/WebKit/Source/modules/animationworklet/WorkletAnimation.h
@@ -11,9 +11,9 @@
 #include "core/animation/KeyframeEffectReadOnly.h"
 #include "core/animation/WorkletAnimationBase.h"
 #include "modules/ModulesExport.h"
+#include "platform/animation/CompositorAnimation.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 
 namespace blink {
 
@@ -31,7 +31,7 @@
 //
 // Spec: https://wicg.github.io/animation-worklet/#worklet-animation-desc
 class MODULES_EXPORT WorkletAnimation : public WorkletAnimationBase,
-                                        public CompositorAnimationPlayerClient,
+                                        public CompositorAnimationClient,
                                         public CompositorAnimationDelegate {
   DEFINE_WRAPPERTYPEINFO();
   USING_PRE_FINALIZER(WorkletAnimation, Dispose);
@@ -53,9 +53,9 @@
   // WorkletAnimationBase implementation.
   bool StartOnCompositor(String* failure_message) override;
 
-  // CompositorAnimationPlayerClient implementation.
-  CompositorAnimationPlayer* CompositorPlayer() const override {
-    return compositor_player_.get();
+  // CompositorAnimationClient implementation.
+  CompositorAnimation* GetCompositorAnimation() const override {
+    return compositor_animation_.get();
   }
 
   // CompositorAnimationDelegate implementation.
@@ -90,7 +90,7 @@
   DocumentTimelineOrScrollTimeline timeline_;
   scoped_refptr<SerializedScriptValue> options_;
 
-  std::unique_ptr<CompositorAnimationPlayer> compositor_player_;
+  std::unique_ptr<CompositorAnimation> compositor_animation_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
index bbef9d7..e746de7 100644
--- a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
+++ b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
@@ -337,6 +337,12 @@
 
   ~V8Callbacks() override = default;
 
+  void Trace(blink::Visitor* visitor) override {
+    visitor->Trace(success_callback_);
+    visitor->Trace(error_callback_);
+    UserMediaRequest::Callbacks::Trace(visitor);
+  }
+
   void OnSuccess(ScriptWrappable* callback_this_value,
                  MediaStream* stream) override {
     success_callback_->InvokeAndReportException(callback_this_value, stream);
@@ -349,18 +355,21 @@
  private:
   V8Callbacks(V8NavigatorUserMediaSuccessCallback* success_callback,
               V8NavigatorUserMediaErrorCallback* error_callback)
-      : success_callback_(success_callback), error_callback_(error_callback) {}
+      : success_callback_(
+            V8PersistentCallbackFunction<
+                V8NavigatorUserMediaSuccessCallback>::Create(success_callback)),
+        error_callback_(
+            V8PersistentCallbackFunction<
+                V8NavigatorUserMediaErrorCallback>::Create(error_callback)) {}
 
   // As Blink does not hold a UserMediaRequest and lets content/ hold it,
   // we cannot use wrapper-tracing to keep the underlying callback functions.
   // Plus, it's guaranteed that the callbacks are one-shot type (not repeated
   // type) and the owner UserMediaRequest will be discarded in a limited
   // timeframe. Thus these persistent handles are okay.
-  V8NavigatorUserMediaSuccessCallback::Persistent<
-      V8NavigatorUserMediaSuccessCallback>
+  Member<V8PersistentCallbackFunction<V8NavigatorUserMediaSuccessCallback>>
       success_callback_;
-  V8NavigatorUserMediaErrorCallback::Persistent<
-      V8NavigatorUserMediaErrorCallback>
+  Member<V8PersistentCallbackFunction<V8NavigatorUserMediaErrorCallback>>
       error_callback_;
 };
 
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.cpp
index cb55836..7ed2701 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.cpp
@@ -54,8 +54,12 @@
     V8RTCSessionDescriptionCallback* success_callback,
     V8RTCPeerConnectionErrorCallback* error_callback)
     : ContextLifecycleObserver(context),
-      success_callback_(success_callback),
-      error_callback_(error_callback),
+      success_callback_(
+          V8PersistentCallbackFunction<V8RTCSessionDescriptionCallback>::Create(
+              success_callback)),
+      error_callback_(
+          V8PersistentCallbackFunction<
+              V8RTCPeerConnectionErrorCallback>::Create(error_callback)),
       requester_(requester) {
   DCHECK(requester_);
 }
@@ -94,6 +98,8 @@
 }
 
 void RTCSessionDescriptionRequestImpl::Trace(blink::Visitor* visitor) {
+  visitor->Trace(success_callback_);
+  visitor->Trace(error_callback_);
   visitor->Trace(requester_);
   RTCSessionDescriptionRequest::Trace(visitor);
   ContextLifecycleObserver::Trace(visitor);
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.h b/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.h
index 49da119..ef93ce14 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.h
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCSessionDescriptionRequestImpl.h
@@ -77,10 +77,11 @@
   // functions as persistent handles. This is acceptable because the request
   // object will be discarded in a limited time due to success, failure, or
   // destruction of the execution context.
-  V8RTCSessionDescriptionCallback::Persistent<V8RTCSessionDescriptionCallback>
+  Member<V8PersistentCallbackFunction<V8RTCSessionDescriptionCallback>>
       success_callback_;
-  V8RTCPeerConnectionErrorCallback::Persistent<V8RTCPeerConnectionErrorCallback>
+  Member<V8PersistentCallbackFunction<V8RTCPeerConnectionErrorCallback>>
       error_callback_;
+
   Member<RTCPeerConnection> requester_;
 };
 
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.cpp
index 3f8914a..d30d1d0 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.cpp
@@ -41,7 +41,8 @@
                                          V8RTCStatsCallback* callback,
                                          MediaStreamTrack* selector)
     : ContextLifecycleObserver(context),
-      success_callback_(callback),
+      success_callback_(
+          V8PersistentCallbackFunction<V8RTCStatsCallback>::Create(callback)),
       component_(selector ? selector->Component() : nullptr),
       requester_(requester) {
   DCHECK(requester_);
@@ -81,6 +82,7 @@
 }
 
 void RTCStatsRequestImpl::Trace(blink::Visitor* visitor) {
+  visitor->Trace(success_callback_);
   visitor->Trace(component_);
   visitor->Trace(requester_);
   RTCStatsRequest::Trace(visitor);
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.h b/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.h
index b855541..81cf6ae 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.h
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCStatsRequestImpl.h
@@ -73,7 +73,8 @@
   // functions as persistent handles. This is acceptable because the request
   // object will be discarded in a limited time due to success, failure, or
   // destruction of the execution context.
-  V8RTCStatsCallback::Persistent<V8RTCStatsCallback> success_callback_;
+  Member<V8PersistentCallbackFunction<V8RTCStatsCallback>> success_callback_;
+
   Member<MediaStreamComponent> component_;
   Member<RTCPeerConnection> requester_;
 };
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.cpp
index 31d02bd..481907ca 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.cpp
@@ -51,8 +51,11 @@
     V8VoidFunction* success_callback,
     V8RTCPeerConnectionErrorCallback* error_callback)
     : ContextLifecycleObserver(context),
-      success_callback_(success_callback),
-      error_callback_(error_callback),
+      success_callback_(V8PersistentCallbackFunction<V8VoidFunction>::Create(
+          success_callback)),
+      error_callback_(
+          V8PersistentCallbackFunction<
+              V8RTCPeerConnectionErrorCallback>::Create(error_callback)),
       requester_(requester) {
   DCHECK(requester_);
 }
@@ -92,6 +95,8 @@
 }
 
 void RTCVoidRequestImpl::Trace(blink::Visitor* visitor) {
+  visitor->Trace(success_callback_);
+  visitor->Trace(error_callback_);
   visitor->Trace(requester_);
   RTCVoidRequest::Trace(visitor);
   ContextLifecycleObserver::Trace(visitor);
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.h b/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.h
index dd351c09..f0b4396 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.h
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCVoidRequestImpl.h
@@ -75,9 +75,10 @@
   // functions as persistent handles. This is acceptable because the request
   // object will be discarded in a limited time due to success, failure, or
   // destruction of the execution context.
-  V8VoidFunction::Persistent<V8VoidFunction> success_callback_;
-  V8RTCPeerConnectionErrorCallback::Persistent<V8RTCPeerConnectionErrorCallback>
+  Member<V8PersistentCallbackFunction<V8VoidFunction>> success_callback_;
+  Member<V8PersistentCallbackFunction<V8RTCPeerConnectionErrorCallback>>
       error_callback_;
+
   Member<RTCPeerConnection> requester_;
 };
 
diff --git a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp
index e6c7c71..dfc4367 100644
--- a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp
@@ -26,8 +26,6 @@
 #include "modules/webaudio/AsyncAudioDecoder.h"
 
 #include "base/location.h"
-#include "bindings/modules/v8/v8_decode_error_callback.h"
-#include "bindings/modules/v8/v8_decode_success_callback.h"
 #include "core/typed_arrays/DOMArrayBuffer.h"
 #include "modules/webaudio/AudioBuffer.h"
 #include "modules/webaudio/BaseAudioContext.h"
@@ -40,12 +38,13 @@
 
 namespace blink {
 
-void AsyncAudioDecoder::DecodeAsync(DOMArrayBuffer* audio_data,
-                                    float sample_rate,
-                                    V8DecodeSuccessCallback* success_callback,
-                                    V8DecodeErrorCallback* error_callback,
-                                    ScriptPromiseResolver* resolver,
-                                    BaseAudioContext* context) {
+void AsyncAudioDecoder::DecodeAsync(
+    DOMArrayBuffer* audio_data,
+    float sample_rate,
+    V8PersistentCallbackFunction<V8DecodeSuccessCallback>* success_callback,
+    V8PersistentCallbackFunction<V8DecodeErrorCallback>* error_callback,
+    ScriptPromiseResolver* resolver,
+    BaseAudioContext* context) {
   DCHECK(IsMainThread());
   DCHECK(audio_data);
   if (!audio_data)
@@ -64,8 +63,8 @@
 void AsyncAudioDecoder::DecodeOnBackgroundThread(
     DOMArrayBuffer* audio_data,
     float sample_rate,
-    V8DecodeSuccessCallback* success_callback,
-    V8DecodeErrorCallback* error_callback,
+    V8PersistentCallbackFunction<V8DecodeSuccessCallback>* success_callback,
+    V8PersistentCallbackFunction<V8DecodeErrorCallback>* error_callback,
     ScriptPromiseResolver* resolver,
     BaseAudioContext* context) {
   DCHECK(!IsMainThread());
@@ -93,8 +92,8 @@
 
 void AsyncAudioDecoder::NotifyComplete(
     DOMArrayBuffer*,
-    V8DecodeSuccessCallback* success_callback,
-    V8DecodeErrorCallback* error_callback,
+    V8PersistentCallbackFunction<V8DecodeSuccessCallback>* success_callback,
+    V8PersistentCallbackFunction<V8DecodeErrorCallback>* error_callback,
     AudioBus* audio_bus,
     ScriptPromiseResolver* resolver,
     BaseAudioContext* context) {
diff --git a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.h b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.h
index 65c5ca1..39c8101 100644
--- a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.h
+++ b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.h
@@ -29,7 +29,8 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "platform/heap/Handle.h"
+#include "bindings/modules/v8/v8_decode_error_callback.h"
+#include "bindings/modules/v8/v8_decode_success_callback.h"
 
 namespace blink {
 
@@ -38,8 +39,6 @@
 class BaseAudioContext;
 class DOMArrayBuffer;
 class ScriptPromiseResolver;
-class V8DecodeErrorCallback;
-class V8DecodeSuccessCallback;
 
 // AsyncAudioDecoder asynchronously decodes audio file data from a
 // DOMArrayBuffer in the background thread. Upon successful decoding, a
@@ -59,25 +58,27 @@
   // appropriately when finished.
   void DecodeAsync(DOMArrayBuffer* audio_data,
                    float sample_rate,
-                   V8DecodeSuccessCallback*,
-                   V8DecodeErrorCallback*,
+                   V8PersistentCallbackFunction<V8DecodeSuccessCallback>*,
+                   V8PersistentCallbackFunction<V8DecodeErrorCallback>*,
                    ScriptPromiseResolver*,
                    BaseAudioContext*);
 
  private:
   AudioBuffer* CreateAudioBufferFromAudioBus(AudioBus*);
-  static void DecodeOnBackgroundThread(DOMArrayBuffer* audio_data,
-                                       float sample_rate,
-                                       V8DecodeSuccessCallback*,
-                                       V8DecodeErrorCallback*,
-                                       ScriptPromiseResolver*,
-                                       BaseAudioContext*);
-  static void NotifyComplete(DOMArrayBuffer* audio_data,
-                             V8DecodeSuccessCallback*,
-                             V8DecodeErrorCallback*,
-                             AudioBus*,
-                             ScriptPromiseResolver*,
-                             BaseAudioContext*);
+  static void DecodeOnBackgroundThread(
+      DOMArrayBuffer* audio_data,
+      float sample_rate,
+      V8PersistentCallbackFunction<V8DecodeSuccessCallback>*,
+      V8PersistentCallbackFunction<V8DecodeErrorCallback>*,
+      ScriptPromiseResolver*,
+      BaseAudioContext*);
+  static void NotifyComplete(
+      DOMArrayBuffer* audio_data,
+      V8PersistentCallbackFunction<V8DecodeSuccessCallback>*,
+      V8PersistentCallbackFunction<V8DecodeErrorCallback>*,
+      AudioBus*,
+      ScriptPromiseResolver*,
+      BaseAudioContext*);
 
   DISALLOW_COPY_AND_ASSIGN(AsyncAudioDecoder);
 };
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
index df1cac81..4d91318 100644
--- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
@@ -311,18 +311,13 @@
 
     decode_audio_resolvers_.insert(resolver);
 
-    // Add a reference to success_callback and error_callback so that
-    // they don't get collected prematurely before decodeAudioData
-    // calls them.
-    if (success_callback) {
-      success_callbacks_.emplace_back(success_callback);
-    }
-    if (error_callback) {
-      error_callbacks_.emplace_back(error_callback);
-    }
-
-    audio_decoder_.DecodeAsync(audio, rate, success_callback, error_callback,
-                               resolver, this);
+    audio_decoder_.DecodeAsync(
+        audio, rate,
+        V8PersistentCallbackFunction<V8DecodeSuccessCallback>::Create(
+            success_callback),
+        V8PersistentCallbackFunction<V8DecodeErrorCallback>::Create(
+            error_callback),
+        resolver, this);
   } else {
     // If audioData is already detached (neutered) we need to reject the
     // promise with an error.
@@ -340,8 +335,8 @@
 void BaseAudioContext::HandleDecodeAudioData(
     AudioBuffer* audio_buffer,
     ScriptPromiseResolver* resolver,
-    V8DecodeSuccessCallback* success_callback,
-    V8DecodeErrorCallback* error_callback) {
+    V8PersistentCallbackFunction<V8DecodeSuccessCallback>* success_callback,
+    V8PersistentCallbackFunction<V8DecodeErrorCallback>* error_callback) {
   DCHECK(IsMainThread());
 
   if (audio_buffer) {
@@ -361,24 +356,6 @@
   // We've resolved the promise.  Remove it now.
   DCHECK(decode_audio_resolvers_.Contains(resolver));
   decode_audio_resolvers_.erase(resolver);
-
-  // Find the success_callback and error_callback and remove it from
-  // our list so that it can be collected.  Remove any matching entry
-  // found (callback methods could be duplicated) which should be ok
-  // because we're only using this to hold a reference to the
-  // callback.
-
-  if (success_callback) {
-    size_t index = success_callbacks_.Find(success_callback);
-    DCHECK_NE(index, kNotFound);
-    success_callbacks_.EraseAt(index);
-  }
-
-  if (error_callback) {
-    size_t index = error_callbacks_.Find(error_callback);
-    DCHECK_NE(index, kNotFound);
-    error_callbacks_.EraseAt(index);
-  }
 }
 
 AudioBufferSourceNode* BaseAudioContext::createBufferSource(
@@ -845,6 +822,7 @@
 
     // Copy over the surviving active nodes.
     HeapVector<Member<AudioNode>> actives;
+    CHECK_GE(active_source_nodes_.size(), remove_count);
     actives.ReserveInitialCapacity(active_source_nodes_.size() - remove_count);
     for (unsigned i = 0; i < removables.size(); ++i) {
       if (!removables[i])
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h
index 33702e0..d1d173a 100644
--- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h
+++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.h
@@ -82,8 +82,6 @@
 class ScriptState;
 class SecurityOrigin;
 class StereoPannerNode;
-class V8DecodeErrorCallback;
-class V8DecodeSuccessCallback;
 class WaveShaperNode;
 
 // BaseAudioContext is the cornerstone of the web audio API and all AudioNodes
@@ -187,10 +185,11 @@
 
   // Handles the promise and callbacks when |decodeAudioData| is finished
   // decoding.
-  void HandleDecodeAudioData(AudioBuffer*,
-                             ScriptPromiseResolver*,
-                             V8DecodeSuccessCallback*,
-                             V8DecodeErrorCallback*);
+  void HandleDecodeAudioData(
+      AudioBuffer*,
+      ScriptPromiseResolver*,
+      V8PersistentCallbackFunction<V8DecodeSuccessCallback>*,
+      V8PersistentCallbackFunction<V8DecodeErrorCallback>*);
 
   AudioListener* listener() { return listener_; }
 
@@ -486,22 +485,6 @@
 
   AsyncAudioDecoder audio_decoder_;
 
-  // Hold references to the |decodeAudioData| callbacks so that they
-  // don't get prematurely GCed by v8 before |decodeAudioData| returns
-  // and calls them.
-  //
-  // Note that BaseAudioContext has no parent object that does wrapper-tracing,
-  // and author script does not hold the V8 wrapper object in general. The only
-  // thing that makes the BaseAudioContext alive is a closure posted to a task
-  // queue, which doesn't support wrapper-tracing. So this object holds the
-  // callback functions as persistent handles. This is acceptable because it's
-  // guaranteed that each callback will be removed once their task gets done
-  // regardless of whether it's successful or not.
-  Vector<V8DecodeSuccessCallback::Persistent<V8DecodeSuccessCallback>>
-      success_callbacks_;
-  Vector<V8DecodeErrorCallback::Persistent<V8DecodeErrorCallback>>
-      error_callbacks_;
-
   // When a context is closed, the sample rate is cleared.  But decodeAudioData
   // can be called after the context has been closed and it needs the sample
   // rate.  When the context is closed, the sample rate is saved here.
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 978236f..767ff39 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -408,14 +408,14 @@
     "animation/AnimationTranslationUtil.cpp",
     "animation/AnimationTranslationUtil.h",
     "animation/AnimationUtilities.h",
+    "animation/CompositorAnimation.cpp",
+    "animation/CompositorAnimation.h",
+    "animation/CompositorAnimationClient.cpp",
+    "animation/CompositorAnimationClient.h",
     "animation/CompositorAnimationCurve.h",
     "animation/CompositorAnimationDelegate.h",
     "animation/CompositorAnimationHost.cpp",
     "animation/CompositorAnimationHost.h",
-    "animation/CompositorAnimationPlayer.cpp",
-    "animation/CompositorAnimationPlayer.h",
-    "animation/CompositorAnimationPlayerClient.cpp",
-    "animation/CompositorAnimationPlayerClient.h",
     "animation/CompositorAnimationTimeline.cpp",
     "animation/CompositorAnimationTimeline.h",
     "animation/CompositorFilterAnimationCurve.cpp",
@@ -1548,7 +1548,7 @@
   ]
   deps = [
     ":platform_export",
-    "//base/allocator:features",
+    "//base/allocator:buildflags",
     "//components/viz/service",
     "//device/base/synchronization",
     "//device/vr/public/mojom:mojom_blink",
@@ -1799,7 +1799,7 @@
     "WebVectorTest.cpp",
     "animation/AnimationTranslationUtilTest.cpp",
     "animation/CompositorAnimationHostTest.cpp",
-    "animation/CompositorAnimationPlayerTest.cpp",
+    "animation/CompositorAnimationTest.cpp",
     "animation/CompositorAnimationTimelineTest.cpp",
     "animation/CompositorFloatAnimationCurveTest.cpp",
     "animation/CompositorKeyframeModelTest.cpp",
diff --git a/third_party/WebKit/Source/platform/Timer.cpp b/third_party/WebKit/Source/platform/Timer.cpp
index cb544233..fbc8745 100644
--- a/third_party/WebKit/Source/platform/Timer.cpp
+++ b/third_party/WebKit/Source/platform/Timer.cpp
@@ -108,11 +108,6 @@
   SetNextFireTime(now, next_fire_time - now);
 }
 
-// static
-scoped_refptr<base::SingleThreadTaskRunner> TimerBase::GetTimerTaskRunner() {
-  return Platform::Current()->CurrentThread()->Scheduler()->TimerTaskRunner();
-}
-
 scoped_refptr<base::SingleThreadTaskRunner> TimerBase::TimerTaskRunner() const {
   return web_task_runner_;
 }
diff --git a/third_party/WebKit/Source/platform/Timer.h b/third_party/WebKit/Source/platform/Timer.h
index 438b7cb..9cac5bc0 100644
--- a/third_party/WebKit/Source/platform/Timer.h
+++ b/third_party/WebKit/Source/platform/Timer.h
@@ -99,9 +99,6 @@
     bool operator()(const TimerBase* a, const TimerBase* b) const;
   };
 
- protected:
-  static scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner();
-
  private:
   virtual void Fired() = 0;
 
diff --git a/third_party/WebKit/Source/platform/WebFrameScheduler.h b/third_party/WebKit/Source/platform/WebFrameScheduler.h
index 1890bf8..2e10b13 100644
--- a/third_party/WebKit/Source/platform/WebFrameScheduler.h
+++ b/third_party/WebKit/Source/platform/WebFrameScheduler.h
@@ -52,13 +52,23 @@
     virtual void OnThrottlingStateChanged(ThrottlingState) = 0;
   };
 
+  class ThrottlingObserverHandle {
+   public:
+    ThrottlingObserverHandle() = default;
+    virtual ~ThrottlingObserverHandle() = default;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(ThrottlingObserverHandle);
+  };
+
   // Adds an Observer instance to be notified on scheduling policy changed.
   // When an Observer is added, the initial state will be notified synchronously
   // through the Observer interface.
-  virtual void AddThrottlingObserver(ObserverType, Observer*) = 0;
-
-  // Removes an Observer instance.
-  virtual void RemoveThrottlingObserver(ObserverType, Observer*) = 0;
+  // A RAII handle is returned and observer is unregistered when the handle is
+  // destroyed.
+  virtual std::unique_ptr<ThrottlingObserverHandle> AddThrottlingObserver(
+      ObserverType,
+      Observer*) = 0;
 
   // The scheduler may throttle tasks associated with offscreen frames.
   virtual void SetFrameVisible(bool) = 0;
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimation.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimation.cpp
new file mode 100644
index 0000000..5d406a6
--- /dev/null
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimation.cpp
@@ -0,0 +1,124 @@
+// 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 "platform/animation/CompositorAnimation.h"
+
+#include "cc/animation/animation_id_provider.h"
+#include "cc/animation/animation_timeline.h"
+#include "platform/animation/CompositorAnimationDelegate.h"
+#include "platform/animation/CompositorKeyframeModel.h"
+#include "platform/wtf/text/WTFString.h"
+
+namespace blink {
+
+std::unique_ptr<CompositorAnimation> CompositorAnimation::Create() {
+  return std::make_unique<CompositorAnimation>(
+      cc::SingleKeyframeEffectAnimation::Create(
+          cc::AnimationIdProvider::NextAnimationId()));
+}
+
+std::unique_ptr<CompositorAnimation>
+CompositorAnimation::CreateWorkletAnimation(
+    const String& name,
+    std::unique_ptr<CompositorScrollTimeline> scroll_timeline) {
+  return std::make_unique<CompositorAnimation>(cc::WorkletAnimation::Create(
+      cc::AnimationIdProvider::NextAnimationId(),
+      std::string(name.Ascii().data(), name.length()),
+      std::move(scroll_timeline)));
+}
+
+CompositorAnimation::CompositorAnimation(
+    scoped_refptr<cc::SingleKeyframeEffectAnimation> animation)
+    : animation_(animation), delegate_() {}
+
+CompositorAnimation::~CompositorAnimation() {
+  SetAnimationDelegate(nullptr);
+  // Detach animation from timeline, otherwise it stays there (leaks) until
+  // compositor shutdown.
+  if (animation_->animation_timeline())
+    animation_->animation_timeline()->DetachAnimation(animation_);
+}
+
+cc::SingleKeyframeEffectAnimation* CompositorAnimation::CcAnimation() const {
+  return animation_.get();
+}
+
+void CompositorAnimation::SetAnimationDelegate(
+    CompositorAnimationDelegate* delegate) {
+  delegate_ = delegate;
+  animation_->set_animation_delegate(delegate ? this : nullptr);
+}
+
+void CompositorAnimation::AttachElement(const CompositorElementId& id) {
+  animation_->AttachElement(id);
+}
+
+void CompositorAnimation::DetachElement() {
+  animation_->DetachElement();
+}
+
+bool CompositorAnimation::IsElementAttached() const {
+  return !!animation_->element_id();
+}
+
+void CompositorAnimation::AddKeyframeModel(
+    std::unique_ptr<CompositorKeyframeModel> keyframe_model) {
+  animation_->AddKeyframeModel(keyframe_model->ReleaseCcKeyframeModel());
+}
+
+void CompositorAnimation::RemoveKeyframeModel(int keyframe_model_id) {
+  animation_->RemoveKeyframeModel(keyframe_model_id);
+}
+
+void CompositorAnimation::PauseKeyframeModel(int keyframe_model_id,
+                                             double time_offset) {
+  animation_->PauseKeyframeModel(keyframe_model_id, time_offset);
+}
+
+void CompositorAnimation::AbortKeyframeModel(int keyframe_model_id) {
+  animation_->AbortKeyframeModel(keyframe_model_id);
+}
+
+void CompositorAnimation::NotifyAnimationStarted(base::TimeTicks monotonic_time,
+                                                 int target_property,
+                                                 int group) {
+  if (delegate_) {
+    delegate_->NotifyAnimationStarted(
+        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
+  }
+}
+
+void CompositorAnimation::NotifyAnimationFinished(
+    base::TimeTicks monotonic_time,
+    int target_property,
+    int group) {
+  if (delegate_) {
+    delegate_->NotifyAnimationFinished(
+        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
+  }
+}
+
+void CompositorAnimation::NotifyAnimationAborted(base::TimeTicks monotonic_time,
+                                                 int target_property,
+                                                 int group) {
+  if (delegate_) {
+    delegate_->NotifyAnimationAborted(
+        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
+  }
+}
+
+void CompositorAnimation::NotifyAnimationTakeover(
+    base::TimeTicks monotonic_time,
+    int target_property,
+    base::TimeTicks animation_start_time,
+    std::unique_ptr<cc::AnimationCurve> curve) {
+  if (delegate_) {
+    delegate_->NotifyAnimationTakeover(
+        (monotonic_time - base::TimeTicks()).InSecondsF(),
+        (animation_start_time - base::TimeTicks()).InSecondsF(),
+        std::move(curve));
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.h b/third_party/WebKit/Source/platform/animation/CompositorAnimation.h
similarity index 70%
rename from third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.h
rename to third_party/WebKit/Source/platform/animation/CompositorAnimation.h
index d3d86728..8e537ea7 100644
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.h
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimation.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 CompositorAnimationPlayer_h
-#define CompositorAnimationPlayer_h
+#ifndef CompositorAnimation_h
+#define CompositorAnimation_h
 
 #include <memory>
 #include "base/memory/scoped_refptr.h"
 #include "cc/animation/animation_delegate.h"
 #include "cc/animation/scroll_timeline.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
-#include "cc/animation/worklet_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
+#include "cc/animation/worklet_animation.h"
 #include "platform/PlatformExport.h"
 #include "platform/graphics/CompositorElementId.h"
 #include "platform/wtf/Noncopyable.h"
@@ -27,24 +27,24 @@
 class CompositorAnimationDelegate;
 class CompositorKeyframeModel;
 
-// A compositor representation for AnimationPlayer.
-class PLATFORM_EXPORT CompositorAnimationPlayer : public cc::AnimationDelegate {
-  WTF_MAKE_NONCOPYABLE(CompositorAnimationPlayer);
+// A compositor representation for Animation.
+class PLATFORM_EXPORT CompositorAnimation : public cc::AnimationDelegate {
+  WTF_MAKE_NONCOPYABLE(CompositorAnimation);
 
  public:
-  static std::unique_ptr<CompositorAnimationPlayer> Create();
-  static std::unique_ptr<CompositorAnimationPlayer> CreateWorkletPlayer(
+  static std::unique_ptr<CompositorAnimation> Create();
+  static std::unique_ptr<CompositorAnimation> CreateWorkletAnimation(
       const String& name,
       std::unique_ptr<CompositorScrollTimeline>);
 
-  explicit CompositorAnimationPlayer(
-      scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer>);
-  ~CompositorAnimationPlayer();
+  explicit CompositorAnimation(
+      scoped_refptr<cc::SingleKeyframeEffectAnimation>);
+  ~CompositorAnimation();
 
-  cc::SingleKeyframeEffectAnimationPlayer* CcAnimationPlayer() const;
+  cc::SingleKeyframeEffectAnimation* CcAnimation() const;
 
   // An animation delegate is notified when animations are started and stopped.
-  // The CompositorAnimationPlayer does not take ownership of the delegate, and
+  // The CompositorAnimation does not take ownership of the delegate, and
   // it is the responsibility of the client to reset the layer's delegate before
   // deleting the delegate.
   void SetAnimationDelegate(CompositorAnimationDelegate*);
@@ -74,10 +74,10 @@
                                base::TimeTicks animation_start_time,
                                std::unique_ptr<cc::AnimationCurve>) override;
 
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> animation_player_;
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> animation_;
   CompositorAnimationDelegate* delegate_;
 };
 
 }  // namespace blink
 
-#endif  // CompositorAnimationPlayer_h
+#endif  // CompositorAnimation_h
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.cpp
new file mode 100644
index 0000000..0e7128fb
--- /dev/null
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.cpp
@@ -0,0 +1,11 @@
+// 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 "platform/animation/CompositorAnimationClient.h"
+
+namespace blink {
+
+CompositorAnimationClient::~CompositorAnimationClient() = default;
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.h b/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.h
new file mode 100644
index 0000000..1abf1fd0
--- /dev/null
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationClient.h
@@ -0,0 +1,24 @@
+// 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 CompositorAnimationClient_h
+#define CompositorAnimationClient_h
+
+#include "public/platform/WebCommon.h"
+
+namespace blink {
+
+class CompositorAnimation;
+
+// A client for compositor representation of Animation.
+class BLINK_PLATFORM_EXPORT CompositorAnimationClient {
+ public:
+  virtual ~CompositorAnimationClient();
+
+  virtual CompositorAnimation* GetCompositorAnimation() const = 0;
+};
+
+}  // namespace blink
+
+#endif  // CompositorAnimationClient_h
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.cpp
deleted file mode 100644
index 229c8d14..0000000
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayer.cpp
+++ /dev/null
@@ -1,125 +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 "platform/animation/CompositorAnimationPlayer.h"
-
-#include "cc/animation/animation_id_provider.h"
-#include "cc/animation/animation_timeline.h"
-#include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorKeyframeModel.h"
-#include "platform/wtf/text/WTFString.h"
-
-namespace blink {
-
-std::unique_ptr<CompositorAnimationPlayer> CompositorAnimationPlayer::Create() {
-  return std::make_unique<CompositorAnimationPlayer>(
-      cc::SingleKeyframeEffectAnimationPlayer::Create(
-          cc::AnimationIdProvider::NextPlayerId()));
-}
-
-std::unique_ptr<CompositorAnimationPlayer>
-CompositorAnimationPlayer::CreateWorkletPlayer(
-    const String& name,
-    std::unique_ptr<CompositorScrollTimeline> scroll_timeline) {
-  return std::make_unique<CompositorAnimationPlayer>(
-      cc::WorkletAnimationPlayer::Create(
-          cc::AnimationIdProvider::NextPlayerId(),
-          std::string(name.Ascii().data(), name.length()),
-          std::move(scroll_timeline)));
-}
-
-CompositorAnimationPlayer::CompositorAnimationPlayer(
-    scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> player)
-    : animation_player_(player), delegate_() {}
-
-CompositorAnimationPlayer::~CompositorAnimationPlayer() {
-  SetAnimationDelegate(nullptr);
-  // Detach player from timeline, otherwise it stays there (leaks) until
-  // compositor shutdown.
-  if (animation_player_->animation_timeline())
-    animation_player_->animation_timeline()->DetachPlayer(animation_player_);
-}
-
-cc::SingleKeyframeEffectAnimationPlayer*
-CompositorAnimationPlayer::CcAnimationPlayer() const {
-  return animation_player_.get();
-}
-
-void CompositorAnimationPlayer::SetAnimationDelegate(
-    CompositorAnimationDelegate* delegate) {
-  delegate_ = delegate;
-  animation_player_->set_animation_delegate(delegate ? this : nullptr);
-}
-
-void CompositorAnimationPlayer::AttachElement(const CompositorElementId& id) {
-  animation_player_->AttachElement(id);
-}
-
-void CompositorAnimationPlayer::DetachElement() {
-  animation_player_->DetachElement();
-}
-
-bool CompositorAnimationPlayer::IsElementAttached() const {
-  return !!animation_player_->element_id();
-}
-
-void CompositorAnimationPlayer::AddKeyframeModel(
-    std::unique_ptr<CompositorKeyframeModel> keyframe_model) {
-  animation_player_->AddKeyframeModel(keyframe_model->ReleaseCcKeyframeModel());
-}
-
-void CompositorAnimationPlayer::RemoveKeyframeModel(int keyframe_model_id) {
-  animation_player_->RemoveKeyframeModel(keyframe_model_id);
-}
-
-void CompositorAnimationPlayer::PauseKeyframeModel(int keyframe_model_id,
-                                                   double time_offset) {
-  animation_player_->PauseKeyframeModel(keyframe_model_id, time_offset);
-}
-
-void CompositorAnimationPlayer::AbortKeyframeModel(int keyframe_model_id) {
-  animation_player_->AbortKeyframeModel(keyframe_model_id);
-}
-
-void CompositorAnimationPlayer::NotifyAnimationStarted(
-    base::TimeTicks monotonic_time,
-    int target_property,
-    int group) {
-  if (delegate_)
-    delegate_->NotifyAnimationStarted(
-        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
-}
-
-void CompositorAnimationPlayer::NotifyAnimationFinished(
-    base::TimeTicks monotonic_time,
-    int target_property,
-    int group) {
-  if (delegate_)
-    delegate_->NotifyAnimationFinished(
-        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
-}
-
-void CompositorAnimationPlayer::NotifyAnimationAborted(
-    base::TimeTicks monotonic_time,
-    int target_property,
-    int group) {
-  if (delegate_)
-    delegate_->NotifyAnimationAborted(
-        (monotonic_time - base::TimeTicks()).InSecondsF(), group);
-}
-
-void CompositorAnimationPlayer::NotifyAnimationTakeover(
-    base::TimeTicks monotonic_time,
-    int target_property,
-    base::TimeTicks animation_start_time,
-    std::unique_ptr<cc::AnimationCurve> curve) {
-  if (delegate_) {
-    delegate_->NotifyAnimationTakeover(
-        (monotonic_time - base::TimeTicks()).InSecondsF(),
-        (animation_start_time - base::TimeTicks()).InSecondsF(),
-        std::move(curve));
-  }
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.cpp
deleted file mode 100644
index 3189e69..0000000
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.cpp
+++ /dev/null
@@ -1,11 +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 "platform/animation/CompositorAnimationPlayerClient.h"
-
-namespace blink {
-
-CompositorAnimationPlayerClient::~CompositorAnimationPlayerClient() = default;
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.h b/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.h
deleted file mode 100644
index 5363eea..0000000
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerClient.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CompositorAnimationPlayerClient_h
-#define CompositorAnimationPlayerClient_h
-
-#include "public/platform/WebCommon.h"
-
-namespace blink {
-
-class CompositorAnimationPlayer;
-
-// A client for compositor representation of AnimationPlayer.
-class BLINK_PLATFORM_EXPORT CompositorAnimationPlayerClient {
- public:
-  virtual ~CompositorAnimationPlayerClient();
-
-  virtual CompositorAnimationPlayer* CompositorPlayer() const = 0;
-};
-
-}  // namespace blink
-
-#endif  // CompositorAnimationPlayerClient_h
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerTest.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerTest.cpp
deleted file mode 100644
index 8f6e5e2..0000000
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationPlayerTest.cpp
+++ /dev/null
@@ -1,146 +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 "platform/animation/CompositorAnimationPlayer.h"
-
-#include "base/time/time.h"
-#include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
-#include "platform/animation/CompositorAnimationTimeline.h"
-#include "platform/animation/CompositorFloatAnimationCurve.h"
-#include "platform/animation/CompositorKeyframeModel.h"
-#include "platform/animation/CompositorTargetProperty.h"
-#include "platform/testing/CompositorTest.h"
-
-#include <memory>
-
-namespace blink {
-
-class CompositorAnimationDelegateForTesting
-    : public CompositorAnimationDelegate {
- public:
-  CompositorAnimationDelegateForTesting() { ResetFlags(); }
-
-  void ResetFlags() {
-    started_ = false;
-    finished_ = false;
-    aborted_ = false;
-  }
-
-  void NotifyAnimationStarted(double, int) override { started_ = true; }
-  void NotifyAnimationFinished(double, int) override { finished_ = true; }
-  void NotifyAnimationAborted(double, int) override { aborted_ = true; }
-
-  bool started_;
-  bool finished_;
-  bool aborted_;
-};
-
-class CompositorAnimationPlayerTestClient
-    : public CompositorAnimationPlayerClient {
- public:
-  CompositorAnimationPlayerTestClient()
-      : player_(CompositorAnimationPlayer::Create()) {}
-
-  CompositorAnimationPlayer* CompositorPlayer() const override {
-    return player_.get();
-  }
-
-  std::unique_ptr<CompositorAnimationPlayer> player_;
-};
-
-class CompositorAnimationPlayerTest : public CompositorTest {};
-
-// Test that when the animation delegate is null, the animation player
-// doesn't forward the finish notification.
-TEST_F(CompositorAnimationPlayerTest, NullDelegate) {
-  std::unique_ptr<CompositorAnimationDelegateForTesting> delegate(
-      new CompositorAnimationDelegateForTesting);
-
-  std::unique_ptr<CompositorAnimationPlayer> player =
-      CompositorAnimationPlayer::Create();
-  cc::SingleKeyframeEffectAnimationPlayer* cc_player =
-      player->CcAnimationPlayer();
-
-  std::unique_ptr<CompositorAnimationCurve> curve =
-      CompositorFloatAnimationCurve::Create();
-  std::unique_ptr<CompositorKeyframeModel> keyframe_model =
-      CompositorKeyframeModel::Create(
-          *curve, CompositorTargetProperty::TRANSFORM, 1, 0);
-  player->AddKeyframeModel(std::move(keyframe_model));
-
-  player->SetAnimationDelegate(delegate.get());
-  EXPECT_FALSE(delegate->finished_);
-
-  cc_player->NotifyKeyframeModelFinishedForTesting(
-      CompositorTargetProperty::TRANSFORM, 1);
-  EXPECT_TRUE(delegate->finished_);
-
-  delegate->ResetFlags();
-
-  player->SetAnimationDelegate(nullptr);
-  cc_player->NotifyKeyframeModelFinishedForTesting(
-      CompositorTargetProperty::TRANSFORM, 1);
-  EXPECT_FALSE(delegate->finished_);
-}
-
-TEST_F(CompositorAnimationPlayerTest,
-       NotifyFromCCAfterCompositorPlayerDeletion) {
-  std::unique_ptr<CompositorAnimationDelegateForTesting> delegate(
-      new CompositorAnimationDelegateForTesting);
-
-  std::unique_ptr<CompositorAnimationPlayer> player =
-      CompositorAnimationPlayer::Create();
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> cc_player =
-      player->CcAnimationPlayer();
-
-  std::unique_ptr<CompositorAnimationCurve> curve =
-      CompositorFloatAnimationCurve::Create();
-  std::unique_ptr<CompositorKeyframeModel> keyframe_model =
-      CompositorKeyframeModel::Create(*curve, CompositorTargetProperty::OPACITY,
-                                      1, 0);
-  player->AddKeyframeModel(std::move(keyframe_model));
-
-  player->SetAnimationDelegate(delegate.get());
-  EXPECT_FALSE(delegate->finished_);
-
-  cc_player->NotifyKeyframeModelFinishedForTesting(
-      CompositorTargetProperty::OPACITY, 1);
-  EXPECT_TRUE(delegate->finished_);
-  delegate->finished_ = false;
-
-  // Delete CompositorAnimationPlayer. ccPlayer stays alive.
-  player = nullptr;
-
-  // No notifications. Doesn't crash.
-  cc_player->NotifyKeyframeModelFinishedForTesting(
-      CompositorTargetProperty::OPACITY, 1);
-  EXPECT_FALSE(delegate->finished_);
-}
-
-TEST_F(CompositorAnimationPlayerTest,
-       CompositorPlayerDeletionDetachesFromCCTimeline) {
-  std::unique_ptr<CompositorAnimationTimeline> timeline =
-      CompositorAnimationTimeline::Create();
-  std::unique_ptr<CompositorAnimationPlayerTestClient> client(
-      new CompositorAnimationPlayerTestClient);
-
-  scoped_refptr<cc::AnimationTimeline> cc_timeline =
-      timeline->GetAnimationTimeline();
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> cc_player =
-      client->player_->CcAnimationPlayer();
-  EXPECT_FALSE(cc_player->animation_timeline());
-
-  timeline->PlayerAttached(*client);
-  EXPECT_TRUE(cc_player->animation_timeline());
-  EXPECT_TRUE(cc_timeline->GetPlayerById(cc_player->id()));
-
-  // Delete client and CompositorAnimationPlayer while attached to timeline.
-  client = nullptr;
-
-  EXPECT_FALSE(cc_player->animation_timeline());
-  EXPECT_FALSE(cc_timeline->GetPlayerById(cc_player->id()));
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationTest.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationTest.cpp
new file mode 100644
index 0000000..509f79f1
--- /dev/null
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationTest.cpp
@@ -0,0 +1,142 @@
+// 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 "platform/animation/CompositorAnimation.h"
+
+#include "base/time/time.h"
+#include "platform/animation/CompositorAnimationClient.h"
+#include "platform/animation/CompositorAnimationDelegate.h"
+#include "platform/animation/CompositorAnimationTimeline.h"
+#include "platform/animation/CompositorFloatAnimationCurve.h"
+#include "platform/animation/CompositorKeyframeModel.h"
+#include "platform/animation/CompositorTargetProperty.h"
+#include "platform/testing/CompositorTest.h"
+
+#include <memory>
+
+namespace blink {
+
+class CompositorAnimationDelegateForTesting
+    : public CompositorAnimationDelegate {
+ public:
+  CompositorAnimationDelegateForTesting() { ResetFlags(); }
+
+  void ResetFlags() {
+    started_ = false;
+    finished_ = false;
+    aborted_ = false;
+  }
+
+  void NotifyAnimationStarted(double, int) override { started_ = true; }
+  void NotifyAnimationFinished(double, int) override { finished_ = true; }
+  void NotifyAnimationAborted(double, int) override { aborted_ = true; }
+
+  bool started_;
+  bool finished_;
+  bool aborted_;
+};
+
+class CompositorAnimationTestClient : public CompositorAnimationClient {
+ public:
+  CompositorAnimationTestClient() : animation_(CompositorAnimation::Create()) {}
+
+  CompositorAnimation* GetCompositorAnimation() const override {
+    return animation_.get();
+  }
+
+  std::unique_ptr<CompositorAnimation> animation_;
+};
+
+class CompositorAnimationTest : public CompositorTest {};
+
+// Test that when the animation delegate is null, the animation animation
+// doesn't forward the finish notification.
+TEST_F(CompositorAnimationTest, NullDelegate) {
+  std::unique_ptr<CompositorAnimationDelegateForTesting> delegate(
+      new CompositorAnimationDelegateForTesting);
+
+  std::unique_ptr<CompositorAnimation> animation =
+      CompositorAnimation::Create();
+  cc::SingleKeyframeEffectAnimation* cc_animation = animation->CcAnimation();
+
+  std::unique_ptr<CompositorAnimationCurve> curve =
+      CompositorFloatAnimationCurve::Create();
+  std::unique_ptr<CompositorKeyframeModel> keyframe_model =
+      CompositorKeyframeModel::Create(
+          *curve, CompositorTargetProperty::TRANSFORM, 1, 0);
+  animation->AddKeyframeModel(std::move(keyframe_model));
+
+  animation->SetAnimationDelegate(delegate.get());
+  EXPECT_FALSE(delegate->finished_);
+
+  cc_animation->NotifyKeyframeModelFinishedForTesting(
+      CompositorTargetProperty::TRANSFORM, 1);
+  EXPECT_TRUE(delegate->finished_);
+
+  delegate->ResetFlags();
+
+  animation->SetAnimationDelegate(nullptr);
+  cc_animation->NotifyKeyframeModelFinishedForTesting(
+      CompositorTargetProperty::TRANSFORM, 1);
+  EXPECT_FALSE(delegate->finished_);
+}
+
+TEST_F(CompositorAnimationTest, NotifyFromCCAfterCompositorAnimationDeletion) {
+  std::unique_ptr<CompositorAnimationDelegateForTesting> delegate(
+      new CompositorAnimationDelegateForTesting);
+
+  std::unique_ptr<CompositorAnimation> animation =
+      CompositorAnimation::Create();
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> cc_animation =
+      animation->CcAnimation();
+
+  std::unique_ptr<CompositorAnimationCurve> curve =
+      CompositorFloatAnimationCurve::Create();
+  std::unique_ptr<CompositorKeyframeModel> keyframe_model =
+      CompositorKeyframeModel::Create(*curve, CompositorTargetProperty::OPACITY,
+                                      1, 0);
+  animation->AddKeyframeModel(std::move(keyframe_model));
+
+  animation->SetAnimationDelegate(delegate.get());
+  EXPECT_FALSE(delegate->finished_);
+
+  cc_animation->NotifyKeyframeModelFinishedForTesting(
+      CompositorTargetProperty::OPACITY, 1);
+  EXPECT_TRUE(delegate->finished_);
+  delegate->finished_ = false;
+
+  // Delete CompositorAnimation. ccAnimation stays alive.
+  animation = nullptr;
+
+  // No notifications. Doesn't crash.
+  cc_animation->NotifyKeyframeModelFinishedForTesting(
+      CompositorTargetProperty::OPACITY, 1);
+  EXPECT_FALSE(delegate->finished_);
+}
+
+TEST_F(CompositorAnimationTest,
+       CompositorAnimationDeletionDetachesFromCCTimeline) {
+  std::unique_ptr<CompositorAnimationTimeline> timeline =
+      CompositorAnimationTimeline::Create();
+  std::unique_ptr<CompositorAnimationTestClient> client(
+      new CompositorAnimationTestClient);
+
+  scoped_refptr<cc::AnimationTimeline> cc_timeline =
+      timeline->GetAnimationTimeline();
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> cc_animation =
+      client->animation_->CcAnimation();
+  EXPECT_FALSE(cc_animation->animation_timeline());
+
+  timeline->AnimationAttached(*client);
+  EXPECT_TRUE(cc_animation->animation_timeline());
+  EXPECT_TRUE(cc_timeline->GetAnimationById(cc_animation->id()));
+
+  // Delete client and CompositorAnimation while attached to timeline.
+  client = nullptr;
+
+  EXPECT_FALSE(cc_animation->animation_timeline());
+  EXPECT_FALSE(cc_timeline->GetAnimationById(cc_animation->id()));
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.cpp
index 0be89b8..09cb5fb 100644
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.cpp
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.cpp
@@ -6,9 +6,9 @@
 
 #include "cc/animation/animation_host.h"
 #include "cc/animation/animation_id_provider.h"
+#include "platform/animation/CompositorAnimation.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationHost.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 
 namespace blink {
 
@@ -29,18 +29,20 @@
   return animation_timeline_.get();
 }
 
-void CompositorAnimationTimeline::PlayerAttached(
-    const blink::CompositorAnimationPlayerClient& client) {
-  if (client.CompositorPlayer())
-    animation_timeline_->AttachPlayer(
-        client.CompositorPlayer()->CcAnimationPlayer());
+void CompositorAnimationTimeline::AnimationAttached(
+    const blink::CompositorAnimationClient& client) {
+  if (client.GetCompositorAnimation()) {
+    animation_timeline_->AttachAnimation(
+        client.GetCompositorAnimation()->CcAnimation());
+  }
 }
 
-void CompositorAnimationTimeline::PlayerDestroyed(
-    const blink::CompositorAnimationPlayerClient& client) {
-  if (client.CompositorPlayer())
-    animation_timeline_->DetachPlayer(
-        client.CompositorPlayer()->CcAnimationPlayer());
+void CompositorAnimationTimeline::AnimationDestroyed(
+    const blink::CompositorAnimationClient& client) {
+  if (client.GetCompositorAnimation()) {
+    animation_timeline_->DetachAnimation(
+        client.GetCompositorAnimation()->CcAnimation());
+  }
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.h b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.h
index 109b505..1f7dfad 100644
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.h
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimeline.h
@@ -14,7 +14,7 @@
 
 namespace blink {
 
-class CompositorAnimationPlayerClient;
+class CompositorAnimationClient;
 
 // A compositor representation for cc::AnimationTimeline.
 class PLATFORM_EXPORT CompositorAnimationTimeline {
@@ -29,8 +29,8 @@
 
   cc::AnimationTimeline* GetAnimationTimeline() const;
 
-  void PlayerAttached(const CompositorAnimationPlayerClient&);
-  void PlayerDestroyed(const CompositorAnimationPlayerClient&);
+  void AnimationAttached(const CompositorAnimationClient&);
+  void AnimationDestroyed(const CompositorAnimationClient&);
 
  private:
   CompositorAnimationTimeline();
diff --git a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimelineTest.cpp b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimelineTest.cpp
index 0b7968a..dcc5314 100644
--- a/third_party/WebKit/Source/platform/animation/CompositorAnimationTimelineTest.cpp
+++ b/third_party/WebKit/Source/platform/animation/CompositorAnimationTimelineTest.cpp
@@ -7,8 +7,8 @@
 #include <memory>
 #include "base/memory/scoped_refptr.h"
 #include "cc/animation/animation_host.h"
+#include "platform/animation/CompositorAnimation.h"
 #include "platform/animation/CompositorAnimationHost.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
 #include "platform/testing/CompositorTest.h"
 #include "platform/testing/WebLayerTreeViewImplForTesting.h"
 
diff --git a/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.cpp b/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.cpp
index bda075b..3c866f6 100644
--- a/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.cpp
+++ b/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.cpp
@@ -18,6 +18,11 @@
   incumbent_script_state_ = ScriptState::From(isolate->GetIncumbentContext());
 }
 
+CallbackFunctionBase::CallbackFunctionBase(const CallbackFunctionBase& other)
+    : callback_function_(other.GetIsolate(), other.CallbackFunction()),
+      callback_relevant_script_state_(other.callback_relevant_script_state_),
+      incumbent_script_state_(other.incumbent_script_state_) {}
+
 void CallbackFunctionBase::TraceWrappers(
     const ScriptWrappableVisitor* visitor) const {
   visitor->TraceWrappers(callback_function_);
diff --git a/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.h b/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.h
index d4242dc..13dd15e 100644
--- a/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.h
+++ b/third_party/WebKit/Source/platform/bindings/CallbackFunctionBase.h
@@ -9,10 +9,12 @@
 #include "platform/bindings/TraceWrapperBase.h"
 #include "platform/bindings/TraceWrapperV8Reference.h"
 #include "platform/heap/Handle.h"
-#include "platform/heap/Persistent.h"
 
 namespace blink {
 
+template <typename V8CallbackFunction>
+class V8PersistentCallbackFunction;
+
 // CallbackFunctionBase is the common base class of all the callback function
 // classes. Most importantly this class provides a way of type dispatching (e.g.
 // overload resolutions, SFINAE technique, etc.) so that it's possible to
@@ -26,16 +28,12 @@
     : public GarbageCollectedFinalized<CallbackFunctionBase>,
       public TraceWrapperBase {
  public:
-  // Custom version of blink::Persistent
-  template <typename T>
-  class Persistent;
-
   virtual ~CallbackFunctionBase() = default;
 
   virtual void Trace(blink::Visitor* visitor) {}
   void TraceWrappers(const ScriptWrappableVisitor*) const override;
 
-  v8::Isolate* GetIsolate() {
+  v8::Isolate* GetIsolate() const {
     return callback_relevant_script_state_->GetIsolate();
   }
   ScriptState* CallbackRelevantScriptState() {
@@ -44,13 +42,17 @@
 
  protected:
   explicit CallbackFunctionBase(v8::Local<v8::Function>);
+  explicit CallbackFunctionBase(const CallbackFunctionBase& other);
 
-  v8::Local<v8::Function> CallbackFunction() {
+  v8::Local<v8::Function> CallbackFunction() const {
     return callback_function_.NewLocal(GetIsolate());
   }
   ScriptState* IncumbentScriptState() { return incumbent_script_state_.get(); }
 
  private:
+  template <typename V8CallbackFunction>
+  friend class V8PersistentCallbackFunction;
+
   // The "callback function type" value.
   TraceWrapperV8Reference<v8::Function> callback_function_;
   // The associated Realm of the callback function type value.
@@ -61,51 +63,39 @@
   scoped_refptr<ScriptState> incumbent_script_state_;
 };
 
-template <typename T>
-class CallbackFunctionBase::Persistent
-    : public PersistentBase<T,
-                            kNonWeakPersistentConfiguration,
-                            kSingleThreadPersistentConfiguration> {
-  using Parent = PersistentBase<T,
-                                kNonWeakPersistentConfiguration,
-                                kSingleThreadPersistentConfiguration>;
-
+// V8PersistentCallbackFunction retains the underlying v8::Function of a
+// V8CallbackFunction, which must be a subclass of CallbackFunctionBase, without
+// wrapper-tracing. This class is necessary and useful where wrapper-tracing is
+// not suitable. Remember that, as a nature of v8::Persistent, abuse of
+// V8PersistentCallbackFunction would result in memory leak, so the use of
+// V8PersistentCallbackFunction should be limited to those which are guaranteed
+// to release the persistents in a finite time period.
+template <typename V8CallbackFunction>
+class V8PersistentCallbackFunction final : public V8CallbackFunction {
  public:
-  Persistent(T* raw) : Parent(raw) {
-    if (raw)
-      function_.Reset(raw->GetIsolate(), raw->callback_function_.Get());
-  }
-  Persistent(const Persistent& other) : Parent(other) {
-    if (other)
-      function_.Reset(other->GetIsolate(), other.function_);
-  }
-  ~Persistent() { function_.Reset(); }
-
-  Persistent& operator=(const Persistent& other) {
-    if (this == &other)
-      return *this;
-
-    if (other) {
-      Parent::operator=(other);
-      function_.Reset(other->GetIsolate(), other.function_);
-    } else {
-      Clear();
-    }
-    return *this;
+  static V8PersistentCallbackFunction* Create(
+      V8CallbackFunction* callback_function) {
+    return callback_function
+               ? new V8PersistentCallbackFunction(callback_function)
+               : nullptr;
   }
 
-  void Clear() {
-    Parent::Clear();
-    function_.Reset();
-  }
+  ~V8PersistentCallbackFunction() override { v8_function_.Reset(); }
 
  private:
-  v8::Persistent<v8::Function> function_;
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8CallbackFunction(*callback_function) {
+    v8_function_.Reset(this->GetIsolate(), this->callback_function_.Get());
+  }
+
+  v8::Persistent<v8::Function> v8_function_;
 };
 
+// TODO(yukishiino): Remove WrapPersistentCallbackFunction.
+// blink::WrapPersistent + V8PersistentCallbackFunction is preferred.
 template <typename T>
-typename T::template Persistent<T> WrapPersistentCallbackFunction(T* value) {
-  return typename T::template Persistent<T>(value);
+auto WrapPersistentCallbackFunction(T* value) {
+  return WrapPersistent(V8PersistentCallbackFunction<T>::Create(value));
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/exported/WebCORS.cpp b/third_party/WebKit/Source/platform/exported/WebCORS.cpp
index c283df18..1b6fe854 100644
--- a/third_party/WebKit/Source/platform/exported/WebCORS.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebCORS.cpp
@@ -52,40 +52,6 @@
 
 namespace {
 
-// Fetch API Spec: https://fetch.spec.whatwg.org/#cors-preflight-fetch-0
-String CreateAccessControlRequestHeadersHeader(
-    const WebHTTPHeaderMap& headers) {
-  Vector<String> filtered_headers;
-  for (const auto& header : headers.GetHTTPHeaderMap()) {
-    if (CORS::IsCORSSafelistedHeader(header.key, header.value)) {
-      // Exclude CORS-safelisted headers.
-      continue;
-    }
-    // TODO(hintzed) replace with EqualIgnoringASCIICase()
-    if (DeprecatedEqualIgnoringCase(header.key, "referer")) {
-      // When the request is from a Worker, referrer header was added by
-      // WorkerThreadableLoader. But it should not be added to
-      // Access-Control-Request-Headers header.
-      continue;
-    }
-    filtered_headers.push_back(header.key.DeprecatedLower());
-  }
-  if (!filtered_headers.size())
-    return g_null_atom;
-
-  // Sort header names lexicographically.
-  std::sort(filtered_headers.begin(), filtered_headers.end(),
-            WTF::CodePointCompareLessThan);
-  StringBuilder header_buffer;
-  for (const String& header : filtered_headers) {
-    if (!header_buffer.IsEmpty())
-      header_buffer.Append(",");
-    header_buffer.Append(header);
-  }
-
-  return header_buffer.ToString();
-}
-
 // A parser for the value of the Access-Control-Expose-Headers header.
 class HTTPHeaderNameListParser {
   STACK_ALLOCATED();
@@ -210,41 +176,6 @@
   return base::nullopt;
 }
 
-WebURLRequest CreateAccessControlPreflightRequest(
-    const WebURLRequest& request) {
-  const KURL& request_url = request.Url();
-
-  DCHECK(request_url.User().IsEmpty());
-  DCHECK(request_url.Pass().IsEmpty());
-
-  WebURLRequest preflight_request(request_url);
-  preflight_request.SetHTTPMethod(HTTPNames::OPTIONS);
-  preflight_request.SetHTTPHeaderField(HTTPNames::Access_Control_Request_Method,
-                                       request.HttpMethod());
-  preflight_request.SetPriority(request.GetPriority());
-  preflight_request.SetRequestContext(request.GetRequestContext());
-  preflight_request.SetFetchCredentialsMode(
-      network::mojom::FetchCredentialsMode::kOmit);
-  preflight_request.SetServiceWorkerMode(
-      WebURLRequest::ServiceWorkerMode::kNone);
-  preflight_request.SetHTTPReferrer(request.HttpHeaderField(HTTPNames::Referer),
-                                    request.GetReferrerPolicy());
-
-  if (request.IsExternalRequest()) {
-    preflight_request.SetHTTPHeaderField(
-        HTTPNames::Access_Control_Request_External, "true");
-  }
-
-  String request_headers = CreateAccessControlRequestHeadersHeader(
-      request.ToResourceRequest().HttpHeaderFields());
-  if (request_headers != g_null_atom) {
-    preflight_request.SetHTTPHeaderField(
-        HTTPNames::Access_Control_Request_Headers, request_headers);
-  }
-
-  return preflight_request;
-}
-
 WebHTTPHeaderSet ExtractCorsExposedHeaderNamesList(
     network::mojom::FetchCredentialsMode credentials_mode,
     const WebURLResponse& response) {
@@ -296,12 +227,10 @@
       map.GetHTTPHeaderMap());
 }
 
-// No-CORS requests are allowed for all these contexts, and plugin contexts with
-// private permission when we set ServiceWorkerMode to None in
-// PepperURLLoaderHost.
-bool IsNoCORSAllowedContext(
-    WebURLRequest::RequestContext context,
-    WebURLRequest::ServiceWorkerMode service_worker_mode) {
+// No-CORS requests are allowed for all these contexts, and plugin contexts when
+// we set skip_service_worker to true in PepperURLLoaderHost.
+bool IsNoCORSAllowedContext(WebURLRequest::RequestContext context,
+                            bool skip_service_worker) {
   switch (context) {
     case WebURLRequest::kRequestContextAudio:
     case WebURLRequest::kRequestContextFavicon:
@@ -314,7 +243,9 @@
     case WebURLRequest::kRequestContextWorker:
       return true;
     case WebURLRequest::kRequestContextPlugin:
-      return service_worker_mode == WebURLRequest::ServiceWorkerMode::kNone;
+      // TODO(toyoshim): |skip_service_worker| must be always true here. Will
+      // change to return always true and add a DCHECK to call sites.
+      return skip_service_worker;
     default:
       return false;
   }
diff --git a/third_party/WebKit/Source/platform/exported/WebCORSTest.cpp b/third_party/WebKit/Source/platform/exported/WebCORSTest.cpp
index 58b45e09..24293c5 100644
--- a/third_party/WebKit/Source/platform/exported/WebCORSTest.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebCORSTest.cpp
@@ -5,9 +5,8 @@
 #include "public/platform/WebCORS.h"
 
 #include "platform/exported/WrappedResourceResponse.h"
-#include "platform/loader/fetch/ResourceRequest.h"
 #include "platform/loader/fetch/ResourceResponse.h"
-#include "platform/weborigin/SecurityOrigin.h"
+#include "public/platform/WebCORS.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
@@ -28,73 +27,6 @@
   }
 };
 
-TEST(CreateAccessControlPreflightRequestTest, LexicographicalOrder) {
-  WebURLRequest request;
-  request.AddHTTPHeaderField("Orange", "Orange");
-  request.AddHTTPHeaderField("Apple", "Red");
-  request.AddHTTPHeaderField("Kiwifruit", "Green");
-  request.AddHTTPHeaderField("Content-Type", "application/octet-stream");
-  request.AddHTTPHeaderField("Strawberry", "Red");
-
-  WebURLRequest preflight =
-      WebCORS::CreateAccessControlPreflightRequest(request);
-
-  EXPECT_EQ("apple,content-type,kiwifruit,orange,strawberry",
-            preflight.HttpHeaderField("Access-Control-Request-Headers"));
-}
-
-TEST(CreateAccessControlPreflightRequestTest, ExcludeSimpleHeaders) {
-  WebURLRequest request;
-  request.AddHTTPHeaderField("Accept", "everything");
-  request.AddHTTPHeaderField("Accept-Language", "everything");
-  request.AddHTTPHeaderField("Content-Language", "everything");
-  request.AddHTTPHeaderField("Save-Data", "on");
-
-  WebURLRequest preflight =
-      WebCORS::CreateAccessControlPreflightRequest(request);
-
-  // Do not emit empty-valued headers; an empty list of non-"CORS safelisted"
-  // request headers should cause "Access-Control-Request-Headers:" to be
-  // left out in the preflight request.
-  EXPECT_EQ(WebString(g_null_atom),
-            preflight.HttpHeaderField("Access-Control-Request-Headers"));
-}
-
-TEST(CreateAccessControlPreflightRequestTest, ExcludeSimpleContentTypeHeader) {
-  WebURLRequest request;
-  request.AddHTTPHeaderField("Content-Type", "text/plain");
-
-  WebURLRequest preflight =
-      WebCORS::CreateAccessControlPreflightRequest(request);
-
-  // Empty list also; see comment in test above.
-  EXPECT_EQ(WebString(g_null_atom),
-            preflight.HttpHeaderField("Access-Control-Request-Headers"));
-}
-
-TEST(CreateAccessControlPreflightRequestTest, IncludeNonSimpleHeader) {
-  WebURLRequest request;
-  request.AddHTTPHeaderField("X-Custom-Header", "foobar");
-
-  WebURLRequest preflight =
-      WebCORS::CreateAccessControlPreflightRequest(request);
-
-  EXPECT_EQ("x-custom-header",
-            preflight.HttpHeaderField("Access-Control-Request-Headers"));
-}
-
-TEST(CreateAccessControlPreflightRequestTest,
-     IncludeNonSimpleContentTypeHeader) {
-  WebURLRequest request;
-  request.AddHTTPHeaderField("Content-Type", "application/octet-stream");
-
-  WebURLRequest preflight =
-      WebCORS::CreateAccessControlPreflightRequest(request);
-
-  EXPECT_EQ("content-type",
-            preflight.HttpHeaderField("Access-Control-Request-Headers"));
-}
-
 TEST_F(CORSExposedHeadersTest, ValidInput) {
   EXPECT_EQ(Parse(CredentialsMode::kOmit, "valid"),
             WebHTTPHeaderSet({"valid"}));
diff --git a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
index 76b32a688..88a2ed7 100644
--- a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
@@ -272,13 +272,12 @@
   resource_request_->SetKeepalive(keepalive);
 }
 
-WebURLRequest::ServiceWorkerMode WebURLRequest::GetServiceWorkerMode() const {
-  return resource_request_->GetServiceWorkerMode();
+bool WebURLRequest::GetSkipServiceWorker() const {
+  return resource_request_->GetSkipServiceWorker();
 }
 
-void WebURLRequest::SetServiceWorkerMode(
-    WebURLRequest::ServiceWorkerMode service_worker_mode) {
-  resource_request_->SetServiceWorkerMode(service_worker_mode);
+void WebURLRequest::SetSkipServiceWorker(bool skip_service_worker) {
+  resource_request_->SetSkipServiceWorker(skip_service_worker);
 }
 
 bool WebURLRequest::ShouldResetAppCache() const {
diff --git a/third_party/WebKit/Source/platform/fonts/FontCache.h b/third_party/WebKit/Source/platform/fonts/FontCache.h
index 2705d5b..7b7ae77 100644
--- a/third_party/WebKit/Source/platform/fonts/FontCache.h
+++ b/third_party/WebKit/Source/platform/fonts/FontCache.h
@@ -154,7 +154,7 @@
   unsigned short Generation();
   void Invalidate();
 
-  SkFontMgr* FontManager() { return font_manager_.get(); }
+  sk_sp<SkFontMgr> FontManager() { return font_manager_; }
   static void SetFontManager(sk_sp<SkFontMgr>);
 
 #if !defined(OS_MACOSX)
diff --git a/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp b/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp
index 672b3c6..2b33095 100644
--- a/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp
+++ b/third_party/WebKit/Source/platform/fonts/android/FontCacheAndroid.cpp
@@ -40,7 +40,7 @@
 
 namespace blink {
 
-static AtomicString DefaultFontFamily(SkFontMgr* font_manager) {
+static AtomicString DefaultFontFamily(sk_sp<SkFontMgr> font_manager) {
   // Pass nullptr to get the default typeface. The default typeface in Android
   // is "sans-serif" if exists, or the first entry in fonts.xml.
   sk_sp<SkTypeface> typeface(
@@ -60,10 +60,9 @@
 }
 
 static AtomicString DefaultFontFamily() {
-  if (SkFontMgr* font_manager = FontCache::GetFontCache()->FontManager())
+  if (sk_sp<SkFontMgr> font_manager = FontCache::GetFontCache()->FontManager())
     return DefaultFontFamily(font_manager);
-  sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
-  return DefaultFontFamily(fm.get());
+  return DefaultFontFamily(SkFontMgr::RefDefault());
 }
 
 // static
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
index d6380e42..6752445f 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
@@ -872,6 +872,12 @@
                    std::move(contents_clipping_mask_layer_json));
   }
 
+  if (layer_state_ && (flags & (kLayerTreeIncludesDebugInfo |
+                                kLayerTreeIncludesPaintRecords))) {
+    json->SetString("layerState", layer_state_->state.ToString());
+    json->SetValue("layerOffset", PointAsJSONArray(layer_state_->offset));
+  }
+
 #ifndef NDEBUG
   if (DrawsContent() && (flags & kLayerTreeIncludesPaintRecords))
     json->SetValue("paintRecord", RecordAsJSON(*CapturePaintRecord()));
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayerTest.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayerTest.cpp
index 96b72127..9b7f3db3 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsLayerTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayerTest.cpp
@@ -26,9 +26,9 @@
 #include "platform/graphics/GraphicsLayer.h"
 
 #include <memory>
+#include "platform/animation/CompositorAnimation.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationHost.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 #include "platform/animation/CompositorAnimationTimeline.h"
 #include "platform/animation/CompositorFloatAnimationCurve.h"
 #include "platform/animation/CompositorKeyframeModel.h"
@@ -117,17 +117,17 @@
                         GraphicsLayerTest,
                         ::testing::Values(0, kSlimmingPaintV175));
 
-class AnimationPlayerForTesting : public CompositorAnimationPlayerClient {
+class AnimationForTesting : public CompositorAnimationClient {
  public:
-  AnimationPlayerForTesting() {
-    compositor_player_ = CompositorAnimationPlayer::Create();
+  AnimationForTesting() {
+    compositor_animation_ = CompositorAnimation::Create();
   }
 
-  CompositorAnimationPlayer* CompositorPlayer() const override {
-    return compositor_player_.get();
+  CompositorAnimation* GetCompositorAnimation() const override {
+    return compositor_animation_.get();
   }
 
-  std::unique_ptr<CompositorAnimationPlayer> compositor_player_;
+  std::unique_ptr<CompositorAnimation> compositor_animation_;
 };
 
 TEST_P(GraphicsLayerTest, updateLayerShouldFlattenTransformWithAnimations) {
@@ -146,19 +146,21 @@
 
   std::unique_ptr<CompositorAnimationTimeline> compositor_timeline =
       CompositorAnimationTimeline::Create();
-  AnimationPlayerForTesting player;
+  AnimationForTesting animation;
 
   CompositorAnimationHost host(LayerTreeView()->CompositorAnimationHost());
 
   host.AddTimeline(*compositor_timeline);
-  compositor_timeline->PlayerAttached(player);
+  compositor_timeline->AnimationAttached(animation);
 
   platform_layer_->SetElementId(CompositorElementId(platform_layer_->Id()));
 
-  player.CompositorPlayer()->AttachElement(platform_layer_->GetElementId());
-  ASSERT_TRUE(player.CompositorPlayer()->IsElementAttached());
+  animation.GetCompositorAnimation()->AttachElement(
+      platform_layer_->GetElementId());
+  ASSERT_TRUE(animation.GetCompositorAnimation()->IsElementAttached());
 
-  player.CompositorPlayer()->AddKeyframeModel(std::move(float_keyframe_model));
+  animation.GetCompositorAnimation()->AddKeyframeModel(
+      std::move(float_keyframe_model));
 
   ASSERT_TRUE(platform_layer_->HasTickingAnimationForTesting());
 
@@ -168,7 +170,7 @@
   ASSERT_TRUE(platform_layer_);
 
   ASSERT_TRUE(platform_layer_->HasTickingAnimationForTesting());
-  player.CompositorPlayer()->RemoveKeyframeModel(keyframe_model_id);
+  animation.GetCompositorAnimation()->RemoveKeyframeModel(keyframe_model_id);
   ASSERT_FALSE(platform_layer_->HasTickingAnimationForTesting());
 
   graphics_layer_->SetShouldFlattenTransform(true);
@@ -178,10 +180,10 @@
 
   ASSERT_FALSE(platform_layer_->HasTickingAnimationForTesting());
 
-  player.CompositorPlayer()->DetachElement();
-  ASSERT_FALSE(player.CompositorPlayer()->IsElementAttached());
+  animation.GetCompositorAnimation()->DetachElement();
+  ASSERT_FALSE(animation.GetCompositorAnimation()->IsElementAttached());
 
-  compositor_timeline->PlayerDestroyed(player);
+  compositor_timeline->AnimationDestroyed(animation);
   host.RemoveTimeline(*compositor_timeline.get());
 }
 
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
index ab5cc9a2fa..7d7cb43 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintChunksToCcLayer.cpp
@@ -160,9 +160,14 @@
   const ClipPaintPropertyNode* lca_clip =
       &LowestCommonAncestor(*target_clip, *current_clip_);
   while (current_clip_ != lca_clip) {
+#if DCHECK_IS_ON()
     DCHECK(state_stack_.size() &&
            state_stack_.back().type == StateEntry::PairedType::kClip)
-        << "Error: Chunk has a clip that escaped its effect's clip.";
+        << "Error: Chunk has a clip that escaped its layer's or effect's clip."
+        << "\ntarget_clip:\n"
+        << target_clip->ToTreeString().Utf8().data() << "current_clip_:\n"
+        << current_clip_->ToTreeString().Utf8().data();
+#endif
     if (!state_stack_.size() ||
         state_stack_.back().type != StateEntry::PairedType::kClip)
       break;
@@ -232,8 +237,13 @@
   const EffectPaintPropertyNode* lca_effect =
       &LowestCommonAncestor(*target_effect, *current_effect_);
   while (current_effect_ != lca_effect) {
-    DCHECK(state_stack_.size()) << "Error: Chunk layerized into a layer with "
-                                   "an effect that's too deep.";
+#if DCHECK_IS_ON()
+    DCHECK(state_stack_.size())
+        << "Error: Chunk has an effect that escapes layer's effect.\n"
+        << "target_effect:\n"
+        << target_effect->ToTreeString().Utf8().data() << "current_effect_:\n"
+        << current_effect_->ToTreeString().Utf8().data();
+#endif
     if (!state_stack_.size())
       break;
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerDebugData.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerDebugData.cpp
index cbcd254..9352fa0 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerDebugData.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerDebugData.cpp
@@ -131,6 +131,8 @@
 
     json_object->SetString(
         "chunk", ClientName(chunk.id.client) + " " + chunk.id.ToString());
+    json_object->SetString("state",
+                           chunk.properties.property_tree_state.ToString());
     if (flags_ & DisplayItemList::kShowPaintRecords)
       json_object->SetString("chunkData", chunk.ToString());
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.cpp b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.cpp
index 9ebee1f..bc44882 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.cpp
@@ -38,6 +38,10 @@
   return CompositorElementId();
 }
 
+String PropertyTreeState::ToString() const {
+  return String::Format("t:%p c:%p e:%p", Transform(), Clip(), Effect());
+}
+
 #if DCHECK_IS_ON()
 
 String PropertyTreeState::ToTreeString() const {
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
index 94734a6..0c96fbb 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
@@ -52,6 +52,7 @@
     Effect()->ClearChangedToRoot();
   }
 
+  String ToString() const;
 #if DCHECK_IS_ON()
   // Dumps the tree from this state up to the root as a string.
   String ToTreeString() const;
diff --git a/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.cpp b/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.cpp
index 60bd0c7..4052a94 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.cpp
@@ -38,14 +38,4 @@
   return CompositorElementId();
 }
 
-#if DCHECK_IS_ON()
-
-String RefCountedPropertyTreeState::ToTreeString() const {
-  return "transform:\n" + (Transform() ? Transform()->ToTreeString() : "null") +
-         "\nclip:\n" + (Clip() ? Clip()->ToTreeString() : "null") +
-         "\neffect:\n" + (Effect() ? Effect()->ToTreeString() : "null");
-}
-
-#endif
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.h b/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.h
index fe38bf6..5b43a11 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/RefCountedPropertyTreeState.h
@@ -65,9 +65,10 @@
     Effect()->ClearChangedToRoot();
   }
 
+  String ToString() const { return GetPropertyTreeState().ToString(); }
 #if DCHECK_IS_ON()
   // Dumps the tree from this state up to the root as a string.
-  String ToTreeString() const;
+  String ToTreeString() const { return GetPropertyTreeState().ToTreeString(); }
 #endif
 
  private:
diff --git a/third_party/WebKit/Source/platform/heap/Heap.cpp b/third_party/WebKit/Source/platform/heap/Heap.cpp
index 77f3a33..ffd7a61 100644
--- a/third_party/WebKit/Source/platform/heap/Heap.cpp
+++ b/third_party/WebKit/Source/platform/heap/Heap.cpp
@@ -249,8 +249,6 @@
 }
 
 void ThreadHeap::PushWeakCallback(void* closure, WeakCallback callback) {
-  DCHECK(thread_state_->IsInGC());
-
   CallbackStack::Item* slot = weak_callback_stack_->AllocateEntry();
   *slot = CallbackStack::Item(closure, callback);
 }
diff --git a/third_party/WebKit/Source/platform/heap/Heap.h b/third_party/WebKit/Source/platform/heap/Heap.h
index 60a29a7..18ef6a9 100644
--- a/third_party/WebKit/Source/platform/heap/Heap.h
+++ b/third_party/WebKit/Source/platform/heap/Heap.h
@@ -492,6 +492,8 @@
 #endif
 
  private:
+  friend class incremental_marking_test::IncrementalMarkingScope;
+
   // Reset counters that track live and allocated-since-last-GC sizes.
   void ResetHeapCounters();
 
diff --git a/third_party/WebKit/Source/platform/heap/IncrementalMarkingTest.cpp b/third_party/WebKit/Source/platform/heap/IncrementalMarkingTest.cpp
index d5321c6..1b21319 100644
--- a/third_party/WebKit/Source/platform/heap/IncrementalMarkingTest.cpp
+++ b/third_party/WebKit/Source/platform/heap/IncrementalMarkingTest.cpp
@@ -31,16 +31,16 @@
         heap_(thread_state_->Heap()),
         marking_stack_(heap_.MarkingStack()) {
     EXPECT_TRUE(marking_stack_->IsEmpty());
-    marking_stack_->Commit();
+    heap_.CommitCallbackStacks();
     heap_.EnableIncrementalMarkingBarrier();
     thread_state->current_gc_data_.visitor =
-        Visitor::Create(thread_state, Visitor::kGlobalMarking);
+        MarkingVisitor::Create(thread_state, MarkingVisitor::kGlobalMarking);
   }
 
   ~IncrementalMarkingScope() {
     EXPECT_TRUE(marking_stack_->IsEmpty());
     heap_.DisableIncrementalMarkingBarrier();
-    marking_stack_->Decommit();
+    heap_.DecommitCallbackStacks();
   }
 
   CallbackStack* marking_stack() const { return marking_stack_; }
@@ -857,9 +857,9 @@
   // TraceInCollection will be called for weak processing.
   template <typename VisitorDispatcher>
   bool TraceInCollection(VisitorDispatcher visitor,
-                         WTF::ShouldWeakPointersBeMarkedStrongly strongify) {
+                         WTF::WeakHandlingFlag weakness) {
     visitor->Trace(first);
-    if (strongify == WTF::kWeakPointersActStrong) {
+    if (weakness == WTF::kNoWeakHandling) {
       visitor->Trace(second);
     }
     return false;
@@ -874,8 +874,7 @@
 template <>
 struct HashTraits<blink::incremental_marking_test::StrongWeakPair>
     : SimpleClassHashTraits<blink::incremental_marking_test::StrongWeakPair> {
-  static const WTF::WeakHandlingFlag kWeakHandlingFlag =
-      WTF::kWeakHandlingInCollections;
+  static const WTF::WeakHandlingFlag kWeakHandlingFlag = WTF::kWeakHandling;
 
   template <typename U = void>
   struct IsTraceableInCollection {
@@ -904,8 +903,8 @@
   static bool TraceInCollection(
       VisitorDispatcher visitor,
       blink::incremental_marking_test::StrongWeakPair& t,
-      WTF::ShouldWeakPointersBeMarkedStrongly strongify) {
-    return t.TraceInCollection(visitor, strongify);
+      WTF::WeakHandlingFlag weakness) {
+    return t.TraceInCollection(visitor, weakness);
   }
 };
 
diff --git a/third_party/WebKit/Source/platform/loader/LinkHeader.cpp b/third_party/WebKit/Source/platform/loader/LinkHeader.cpp
index 1c5551e..ba2ad133 100644
--- a/third_party/WebKit/Source/platform/loader/LinkHeader.cpp
+++ b/third_party/WebKit/Source/platform/loader/LinkHeader.cpp
@@ -40,6 +40,10 @@
     return LinkHeader::kLinkParameterNonce;
   if (base::EqualsCaseInsensitiveASCII(name, "integrity"))
     return LinkHeader::kLinkParameterIntegrity;
+  if (base::EqualsCaseInsensitiveASCII(name, "srcset"))
+    return LinkHeader::kLinkParameterSrcset;
+  if (base::EqualsCaseInsensitiveASCII(name, "imgsizes"))
+    return LinkHeader::kLinkParameterImgsizes;
   return LinkHeader::kLinkParameterUnknown;
 }
 
@@ -60,6 +64,10 @@
     nonce_ = value;
   else if (name == kLinkParameterIntegrity)
     integrity_ = value;
+  else if (name == kLinkParameterSrcset)
+    srcset_ = value;
+  else if (name == kLinkParameterImgsizes)
+    imgsizes_ = value;
 }
 
 template <typename Iterator>
diff --git a/third_party/WebKit/Source/platform/loader/LinkHeader.h b/third_party/WebKit/Source/platform/loader/LinkHeader.h
index a911164..a1d6210 100644
--- a/third_party/WebKit/Source/platform/loader/LinkHeader.h
+++ b/third_party/WebKit/Source/platform/loader/LinkHeader.h
@@ -23,6 +23,8 @@
   const String& CrossOrigin() const { return cross_origin_; }
   const String& Nonce() const { return nonce_; }
   const String& Integrity() const { return integrity_; }
+  const String& Srcset() const { return srcset_; }
+  const String& Imgsizes() const { return imgsizes_; }
   bool Valid() const { return is_valid_; }
 
   enum LinkParameterName {
@@ -39,6 +41,8 @@
     kLinkParameterAs,
     kLinkParameterNonce,
     kLinkParameterIntegrity,
+    kLinkParameterSrcset,
+    kLinkParameterImgsizes,
   };
 
  private:
@@ -56,6 +60,8 @@
   String cross_origin_;
   String nonce_;
   String integrity_;
+  String srcset_;
+  String imgsizes_;
   bool is_valid_;
 };
 
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
index 1bdaf19..88e3f2f 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
@@ -57,7 +57,7 @@
 #include "public/platform/Platform.h"
 #include "public/platform/WebURL.h"
 #include "public/platform/WebURLRequest.h"
-#include "public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
 
 using blink::WebURLRequest;
 
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
index 7315c97..b43db9d 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
@@ -417,8 +417,8 @@
   }
 
   is_enabled_ = true;
-  scheduler->AddThrottlingObserver(WebFrameScheduler::ObserverType::kLoader,
-                                   this);
+  scheduler_observer_handle_ = scheduler->AddThrottlingObserver(
+      WebFrameScheduler::ObserverType::kLoader, this);
 }
 
 ResourceLoadScheduler* ResourceLoadScheduler::Create(FetchContext* context) {
@@ -453,12 +453,7 @@
   if (traffic_monitor_)
     traffic_monitor_.reset();
 
-  if (!is_enabled_)
-    return;
-  auto* scheduler = context_->GetFrameScheduler();
-  DCHECK(scheduler);
-  scheduler->RemoveThrottlingObserver(WebFrameScheduler::ObserverType::kLoader,
-                                      this);
+  scheduler_observer_handle_.reset();
 }
 
 void ResourceLoadScheduler::Request(ResourceLoadSchedulerClient* client,
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
index 481ed410..6148290 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
@@ -303,6 +303,10 @@
 
   // Holds FetchContext reference to contact WebFrameScheduler.
   Member<FetchContext> context_;
+
+  // Handle to throttling observer.
+  std::unique_ptr<WebFrameScheduler::ThrottlingObserverHandle>
+      scheduler_observer_handle_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
index 65b5088..b76f6d7 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
@@ -231,9 +231,7 @@
       resource_->LastResourceRequest().CreateRedirectRequest(
           new_url, new_method, new_site_for_cookies, new_referrer,
           static_cast<ReferrerPolicy>(new_referrer_policy),
-          passed_redirect_response.WasFetchedViaServiceWorker()
-              ? WebURLRequest::ServiceWorkerMode::kAll
-              : WebURLRequest::ServiceWorkerMode::kNone);
+          !passed_redirect_response.WasFetchedViaServiceWorker());
 
   Resource::Type resource_type = resource_->GetType();
 
@@ -285,10 +283,7 @@
     if (options.cors_handling_by_resource_fetcher ==
             kEnableCORSHandlingByResourceFetcher &&
         fetch_request_mode == network::mojom::FetchRequestMode::kCORS) {
-      scoped_refptr<const SecurityOrigin> source_origin =
-          options.security_origin;
-      if (!source_origin.get())
-        source_origin = Context().GetSecurityOrigin();
+      scoped_refptr<const SecurityOrigin> source_origin = GetSourceOrigin();
       WebSecurityOrigin source_web_origin(source_origin.get());
       WrappedResourceRequest new_request_wrapper(*new_request);
       WTF::Optional<network::mojom::CORSError> cors_error =
@@ -409,6 +404,15 @@
   return fetcher_->Context();
 }
 
+scoped_refptr<const SecurityOrigin> ResourceLoader::GetSourceOrigin() const {
+  scoped_refptr<const SecurityOrigin> origin =
+      resource_->Options().security_origin;
+  if (origin)
+    return origin;
+
+  return Context().GetSecurityOrigin();
+}
+
 CORSStatus ResourceLoader::DetermineCORSStatus(const ResourceResponse& response,
                                                StringBuilder& error_msg) const {
   // Service workers handle CORS separately.
@@ -429,12 +433,7 @@
   if (resource_->GetType() == Resource::Type::kMainResource)
     return CORSStatus::kNotApplicable;
 
-  const SecurityOrigin* source_origin =
-      resource_->Options().security_origin.get();
-
-  if (!source_origin)
-    source_origin = Context().GetSecurityOrigin();
-
+  scoped_refptr<const SecurityOrigin> source_origin = GetSourceOrigin();
   DCHECK(source_origin);
 
   if (source_origin->CanRequest(response.Url()))
@@ -535,8 +534,7 @@
         fetch_request_mode == network::mojom::FetchRequestMode::kCORS &&
         response.WasFallbackRequiredByServiceWorker()) {
       ResourceRequest last_request = resource_->LastResourceRequest();
-      DCHECK_EQ(last_request.GetServiceWorkerMode(),
-                WebURLRequest::ServiceWorkerMode::kAll);
+      DCHECK(!last_request.GetSkipServiceWorker());
       // This code handles the case when a controlling service worker doesn't
       // handle a cross origin request.
       if (!Context().ShouldLoadNewResource(resource_type)) {
@@ -544,8 +542,7 @@
         HandleError(ResourceError::CancelledError(response.Url()));
         return;
       }
-      last_request.SetServiceWorkerMode(
-          WebURLRequest::ServiceWorkerMode::kNone);
+      last_request.SetSkipServiceWorker(true);
       Restart(last_request);
       return;
     }
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.h
index 84d8485b..6a4a8e3 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.h
@@ -155,6 +155,7 @@
   void Restart(const ResourceRequest&);
 
   FetchContext& Context() const;
+  scoped_refptr<const SecurityOrigin> GetSourceOrigin() const;
 
   CORSStatus DetermineCORSStatus(const ResourceResponse&, StringBuilder&) const;
 
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
index 7d6f3618..883251f 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
@@ -58,7 +58,7 @@
       keepalive_(false),
       should_reset_app_cache_(false),
       cache_mode_(mojom::FetchCacheMode::kDefault),
-      service_worker_mode_(WebURLRequest::ServiceWorkerMode::kAll),
+      skip_service_worker_(false),
       priority_(ResourceLoadPriority::kLowest),
       intra_priority_value_(0),
       requestor_id_(0),
@@ -100,7 +100,7 @@
   SetUseStreamOnResponse(data->use_stream_on_response_);
   SetKeepalive(data->keepalive_);
   SetCacheMode(data->cache_mode_);
-  SetServiceWorkerMode(data->service_worker_mode_);
+  SetSkipServiceWorker(data->skip_service_worker_);
   SetShouldResetAppCache(data->should_reset_app_cache_);
   SetRequestorID(data->requestor_id_);
   SetPluginChildID(data->plugin_child_id_);
@@ -134,7 +134,7 @@
     const KURL& new_site_for_cookies,
     const String& new_referrer,
     ReferrerPolicy new_referrer_policy,
-    WebURLRequest::ServiceWorkerMode service_worker_mode) const {
+    bool skip_service_worker) const {
   std::unique_ptr<ResourceRequest> request =
       std::make_unique<ResourceRequest>(new_url);
   request->SetHTTPMethod(new_method);
@@ -143,7 +143,7 @@
       new_referrer.IsEmpty() ? Referrer::NoReferrer() : String(new_referrer);
   request->SetHTTPReferrer(
       Referrer(referrer, static_cast<ReferrerPolicy>(new_referrer_policy)));
-  request->SetServiceWorkerMode(service_worker_mode);
+  request->SetSkipServiceWorker(skip_service_worker);
   request->SetRedirectStatus(RedirectStatus::kFollowedRedirect);
 
   // Copy from parameters for |this|.
@@ -188,7 +188,7 @@
   data->use_stream_on_response_ = use_stream_on_response_;
   data->keepalive_ = keepalive_;
   data->cache_mode_ = GetCacheMode();
-  data->service_worker_mode_ = service_worker_mode_;
+  data->skip_service_worker_ = skip_service_worker_;
   data->should_reset_app_cache_ = should_reset_app_cache_;
   data->requestor_id_ = requestor_id_;
   data->plugin_child_id_ = plugin_child_id_;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
index 6ed3349..4fc584b 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
@@ -100,7 +100,7 @@
       const KURL& new_site_for_cookies,
       const String& new_referrer,
       ReferrerPolicy new_referrer_policy,
-      WebURLRequest::ServiceWorkerMode new_sw_mode) const;
+      bool skip_service_worker) const;
 
   // Gets a copy of the data suitable for passing to another thread.
   std::unique_ptr<CrossThreadResourceRequestData> CopyData() const;
@@ -232,14 +232,10 @@
   bool GetKeepalive() const { return keepalive_; }
   void SetKeepalive(bool keepalive) { keepalive_ = keepalive; }
 
-  // The service worker mode indicating which service workers should get events
-  // for this request.
-  WebURLRequest::ServiceWorkerMode GetServiceWorkerMode() const {
-    return service_worker_mode_;
-  }
-  void SetServiceWorkerMode(
-      WebURLRequest::ServiceWorkerMode service_worker_mode) {
-    service_worker_mode_ = service_worker_mode;
+  // True if service workers should not get events for the request.
+  bool GetSkipServiceWorker() const { return skip_service_worker_; }
+  void SetSkipServiceWorker(bool skip_service_worker) {
+    skip_service_worker_ = skip_service_worker;
   }
 
   // True if corresponding AppCache group should be resetted.
@@ -396,7 +392,7 @@
   bool keepalive_ : 1;
   bool should_reset_app_cache_ : 1;
   mojom::FetchCacheMode cache_mode_;
-  WebURLRequest::ServiceWorkerMode service_worker_mode_;
+  bool skip_service_worker_ : 1;
   ResourceLoadPriority priority_;
   int intra_priority_value_;
   int requestor_id_;
@@ -458,7 +454,7 @@
   bool report_upload_progress_;
   bool has_user_gesture_;
   bool download_to_file_;
-  WebURLRequest::ServiceWorkerMode service_worker_mode_;
+  bool skip_service_worker_;
   bool use_stream_on_response_;
   bool keepalive_;
   bool should_reset_app_cache_;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequestTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequestTest.cpp
index dd3bc480..165898d 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequestTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequestTest.cpp
@@ -34,7 +34,7 @@
   original.SetReportUploadProgress(false);
   original.SetHasUserGesture(false);
   original.SetDownloadToFile(false);
-  original.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kAll);
+  original.SetSkipServiceWorker(false);
   original.SetFetchRequestMode(network::mojom::FetchRequestMode::kCORS);
   original.SetFetchCredentialsMode(
       network::mojom::FetchCredentialsMode::kSameOrigin);
@@ -64,8 +64,7 @@
   EXPECT_FALSE(original.ReportUploadProgress());
   EXPECT_FALSE(original.HasUserGesture());
   EXPECT_FALSE(original.DownloadToFile());
-  EXPECT_EQ(WebURLRequest::ServiceWorkerMode::kAll,
-            original.GetServiceWorkerMode());
+  EXPECT_FALSE(original.GetSkipServiceWorker());
   EXPECT_EQ(network::mojom::FetchRequestMode::kCORS,
             original.GetFetchRequestMode());
   EXPECT_EQ(network::mojom::FetchCredentialsMode::kSameOrigin,
@@ -99,8 +98,7 @@
   EXPECT_FALSE(copy1.ReportUploadProgress());
   EXPECT_FALSE(copy1.HasUserGesture());
   EXPECT_FALSE(copy1.DownloadToFile());
-  EXPECT_EQ(WebURLRequest::ServiceWorkerMode::kAll,
-            copy1.GetServiceWorkerMode());
+  EXPECT_FALSE(copy1.GetSkipServiceWorker());
   EXPECT_EQ(network::mojom::FetchRequestMode::kCORS,
             copy1.GetFetchRequestMode());
   EXPECT_EQ(network::mojom::FetchCredentialsMode::kSameOrigin,
@@ -119,7 +117,7 @@
   copy1.SetReportUploadProgress(true);
   copy1.SetHasUserGesture(true);
   copy1.SetDownloadToFile(true);
-  copy1.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
+  copy1.SetSkipServiceWorker(true);
   copy1.SetFetchRequestMode(network::mojom::FetchRequestMode::kNoCORS);
   copy1.SetFetchCredentialsMode(network::mojom::FetchCredentialsMode::kInclude);
 
@@ -129,8 +127,7 @@
   EXPECT_TRUE(copy2.ReportUploadProgress());
   EXPECT_TRUE(copy2.HasUserGesture());
   EXPECT_TRUE(copy2.DownloadToFile());
-  EXPECT_EQ(WebURLRequest::ServiceWorkerMode::kNone,
-            copy2.GetServiceWorkerMode());
+  EXPECT_TRUE(copy2.GetSkipServiceWorker());
   EXPECT_EQ(network::mojom::FetchRequestMode::kNoCORS,
             copy1.GetFetchRequestMode());
   EXPECT_EQ(network::mojom::FetchCredentialsMode::kInclude,
diff --git a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
index bdddfd4a..68390c8 100644
--- a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
+++ b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
@@ -703,8 +703,10 @@
 
 ScrollAnimatorMac::ScrollAnimatorMac(blink::ScrollableArea* scrollable_area)
     : ScrollAnimatorBase(scrollable_area),
-      task_runner_(
-          Platform::Current()->CurrentThread()->Scheduler()->TimerTaskRunner()),
+      task_runner_(Platform::Current()
+                       ->CurrentThread()
+                       ->Scheduler()
+                       ->CompositorTaskRunner()),
       have_scrolled_since_page_load_(false),
       needs_scroller_style_update_(false) {
   scroll_animation_helper_delegate_.AdoptNS(
diff --git a/third_party/WebKit/Source/platform/runtime_enabled_features.json5 b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
index fbd6827..3420746f 100644
--- a/third_party/WebKit/Source/platform/runtime_enabled_features.json5
+++ b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
@@ -839,6 +839,10 @@
       status: "stable",
     },
     {
+      name: "PreloadImageSrcSet",
+      status: "experimental",
+    },
+    {
       name: "Presentation",
       status: "stable",
     },
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler.h b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler.h
index c73d366..9987f8a 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler.h
@@ -68,9 +68,6 @@
   virtual void PostNonNestableIdleTask(const base::Location&,
                                        WebThread::IdleTask) = 0;
 
-  // Returns a task runner for timer tasks. Can be called from any thread.
-  virtual base::SingleThreadTaskRunner* TimerTaskRunner() = 0;
-
   // Returns a task runner for kV8 tasks. Can be called from any thread.
   virtual base::SingleThreadTaskRunner* V8TaskRunner() = 0;
 
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
index d49a506..fc9ac06a 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
@@ -18,12 +18,9 @@
 WebSchedulerImpl::WebSchedulerImpl(
     ChildScheduler* child_scheduler,
     scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner,
-    scoped_refptr<TaskQueue> timer_task_runner,
     scoped_refptr<TaskQueue> v8_task_runner)
     : child_scheduler_(child_scheduler),
       idle_task_runner_(idle_task_runner),
-      timer_task_runner_(
-          TaskRunnerImpl::Create(std::move(timer_task_runner), base::nullopt)),
       v8_task_runner_(
           TaskRunnerImpl::Create(std::move(v8_task_runner), base::nullopt)) {}
 
@@ -63,10 +60,6 @@
       base::BindOnce(&WebSchedulerImpl::RunIdleTask, std::move(task)));
 }
 
-base::SingleThreadTaskRunner* WebSchedulerImpl::TimerTaskRunner() {
-  return timer_task_runner_.get();
-}
-
 base::SingleThreadTaskRunner* WebSchedulerImpl::V8TaskRunner() {
   return v8_task_runner_.get();
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
index f3cf1a99..d600488 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
@@ -26,7 +26,6 @@
  public:
   WebSchedulerImpl(ChildScheduler* child_scheduler,
                    scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner,
-                   scoped_refptr<TaskQueue> timer_task_runner,
                    scoped_refptr<TaskQueue> v8_task_runner);
   ~WebSchedulerImpl() override;
 
@@ -38,7 +37,6 @@
                     WebThread::IdleTask task) override;
   void PostNonNestableIdleTask(const base::Location& location,
                                WebThread::IdleTask task) override;
-  base::SingleThreadTaskRunner* TimerTaskRunner() override;
   base::SingleThreadTaskRunner* V8TaskRunner() override;
   base::SingleThreadTaskRunner* CompositorTaskRunner() override;
   std::unique_ptr<WebViewScheduler> CreateWebViewScheduler(
@@ -59,7 +57,6 @@
 
   ChildScheduler* child_scheduler_;  // NOT OWNED
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
-  scoped_refptr<TaskRunnerImpl> timer_task_runner_;
   scoped_refptr<TaskRunnerImpl> v8_task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(WebSchedulerImpl);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
index 97ac2991..71d2ffa 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
@@ -66,7 +66,6 @@
   idle_task_runner_ = worker_scheduler_->IdleTaskRunner();
   web_scheduler_.reset(new WebSchedulerImpl(
       worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(),
-      worker_scheduler_->DefaultTaskQueue(),
       worker_scheduler_->DefaultTaskQueue()));
   base::MessageLoop::current()->AddDestructionObserver(this);
   completion->Signal();
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
index cd313b9..40f2b57 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.cc
@@ -18,8 +18,6 @@
       return "control_tq";
     case MainThreadTaskQueue::QueueType::kDefault:
       return "default_tq";
-    case MainThreadTaskQueue::QueueType::kDefaultTimer:
-      return "default_timer_tq";
     case MainThreadTaskQueue::QueueType::kUnthrottled:
       return "unthrottled_tq";
     case MainThreadTaskQueue::QueueType::kFrameLoading:
@@ -69,7 +67,6 @@
     case QueueType::kFrameLoading:
     case QueueType::kFrameLoadingControl:
       return QueueClass::kLoading;
-    case QueueType::kDefaultTimer:
     case QueueType::kUnthrottled:
     case QueueType::kFrameThrottleable:
     case QueueType::kFrameDeferrable:
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
index 9e933e7..7934e05 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/main_thread_task_queue.h
@@ -28,9 +28,8 @@
 
     // 2 was used for default loading task runner but this was deprecated.
 
-    // kDefaultTimer is deprecated and should be replaced with appropriate
-    // per-frame task queues.
-    kDefaultTimer = 3,
+    // 3 was used for default timer task runner but this was deprecated.
+
     kUnthrottled = 4,
     kFrameLoading = 5,
     // 6 : kFrameThrottleable, replaced with FRAME_THROTTLEABLE.
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
index 8bd8bf0a..893fb6b 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/queueing_time_estimator.cc
@@ -120,7 +120,6 @@
     case MainThreadTaskQueue::QueueType::kFramePausable:
       return TASK_QUEUE_PREFIX "FramePausable";
     case MainThreadTaskQueue::QueueType::kControl:
-    case MainThreadTaskQueue::QueueType::kDefaultTimer:
     case MainThreadTaskQueue::QueueType::kIdle:
     case MainThreadTaskQueue::QueueType::kTest:
     case MainThreadTaskQueue::QueueType::kFrameLoadingControl:
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
index 3c7be23c..27614551 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
@@ -221,8 +221,6 @@
 
   RunTask(QueueType::kControl, Milliseconds(400),
           base::TimeDelta::FromMilliseconds(30));
-  RunTask(QueueType::kDefaultTimer, Milliseconds(600),
-          base::TimeDelta::FromMilliseconds(5));
   RunTask(QueueType::kFrameLoading, Milliseconds(800),
           base::TimeDelta::FromMilliseconds(70));
   RunTask(QueueType::kFramePausable, Milliseconds(1000),
@@ -262,7 +260,6 @@
   std::vector<base::Bucket> expected_samples = {
       {static_cast<int>(QueueType::kControl), 75},
       {static_cast<int>(QueueType::kDefault), 2},
-      {static_cast<int>(QueueType::kDefaultTimer), 5},
       {static_cast<int>(QueueType::kUnthrottled), 25},
       {static_cast<int>(QueueType::kFrameLoading), 105},
       {static_cast<int>(QueueType::kCompositor), 45},
@@ -280,7 +277,6 @@
               UnorderedElementsAre(
                   Bucket(static_cast<int>(QueueType::kControl), 30),
                   Bucket(static_cast<int>(QueueType::kDefault), 2),
-                  Bucket(static_cast<int>(QueueType::kDefaultTimer), 5),
                   Bucket(static_cast<int>(QueueType::kFrameLoading), 70),
                   Bucket(static_cast<int>(QueueType::kCompositor), 25),
                   Bucket(static_cast<int>(QueueType::kTest), 85),
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index 88b5fe8..fd8aa72 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -265,8 +265,6 @@
   task_runners_.insert(std::make_pair(
       input_task_queue_, input_task_queue_->CreateQueueEnabledVoter()));
 
-  default_timer_task_queue_ =
-      NewTimerTaskQueue(MainThreadTaskQueue::QueueType::kDefaultTimer);
   v8_task_queue_ = NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
       MainThreadTaskQueue::QueueType::kV8));
   ipc_task_queue_ = NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
@@ -660,11 +658,6 @@
   return input_task_queue_;
 }
 
-scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::TimerTaskQueue() {
-  helper_.CheckOnValidThread();
-  return default_timer_task_queue_;
-}
-
 scoped_refptr<MainThreadTaskQueue> RendererSchedulerImpl::V8TaskQueue() {
   helper_.CheckOnValidThread();
   return v8_task_queue_;
@@ -2360,7 +2353,6 @@
   // with renderer scheduler which do not have a corresponding frame.
   control_task_queue_->SetBlameContext(blame_context);
   DefaultTaskQueue()->SetBlameContext(blame_context);
-  default_timer_task_queue_->SetBlameContext(blame_context);
   compositor_task_queue_->SetBlameContext(blame_context);
   idle_helper_.IdleTaskRunner()->SetBlameContext(blame_context);
   v8_task_queue_->SetBlameContext(blame_context);
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
index d04dc56a..0b2c764 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -189,7 +189,6 @@
   scoped_refptr<MainThreadTaskQueue> DefaultTaskQueue();
   scoped_refptr<MainThreadTaskQueue> CompositorTaskQueue();
   scoped_refptr<MainThreadTaskQueue> InputTaskQueue();
-  scoped_refptr<MainThreadTaskQueue> TimerTaskQueue();
   scoped_refptr<MainThreadTaskQueue> V8TaskQueue();
 
   // Returns a new task queue created with given params.
@@ -627,7 +626,6 @@
 
   TaskQueueVoterMap task_runners_;
 
-  scoped_refptr<MainThreadTaskQueue> default_timer_task_queue_;
   scoped_refptr<MainThreadTaskQueue> v8_task_queue_;
   scoped_refptr<MainThreadTaskQueue> ipc_task_queue_;
 
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index bd169b6..d666bde5 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -311,7 +311,8 @@
     loading_control_task_runner_ = scheduler_->NewLoadingTaskQueue(
         MainThreadTaskQueue::QueueType::kFrameLoadingControl);
     idle_task_runner_ = scheduler_->IdleTaskRunner();
-    timer_task_runner_ = scheduler_->TimerTaskQueue();
+    timer_task_runner_ = scheduler_->NewTimerTaskQueue(
+        MainThreadTaskQueue::QueueType::kFrameThrottleable);
     v8_task_runner_ = scheduler_->V8TaskQueue();
     fake_queue_ = scheduler_->NewLoadingTaskQueue(
         MainThreadTaskQueue::QueueType::kFrameLoading);
@@ -740,7 +741,7 @@
   scoped_refptr<TaskQueue> loading_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> loading_control_task_runner_;
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> timer_task_runner_;
+  scoped_refptr<TaskQueue> timer_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> v8_task_runner_;
   bool simulate_timer_task_ran_;
   bool simulate_compositor_task_ran_;
@@ -3264,9 +3265,9 @@
   size_t count = 0;
   // With the compositor task taking 10ms, there is not enough time to run this
   // 7ms timer task in the 16ms frame.
-  scheduler_->TimerTaskQueue()->PostTask(
-      FROM_HERE, base::Bind(SlowCountingTask, &count, &clock_, 7,
-                            scheduler_->TimerTaskQueue()));
+  timer_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(SlowCountingTask, &count, &clock_, 7, timer_task_runner_));
 
   for (int i = 0; i < 1000; i++) {
     viz::BeginFrameArgs begin_frame_args = viz::BeginFrameArgs::Create(
@@ -3296,7 +3297,7 @@
     bool expect_queue_throttled = (i > 0);
     EXPECT_EQ(expect_queue_throttled,
               scheduler_->task_queue_throttler()->IsThrottled(
-                  scheduler_->TimerTaskQueue().get()))
+                  timer_task_runner_.get()))
         << "i = " << i;
 
     if (expect_queue_throttled) {
@@ -3327,9 +3328,9 @@
   size_t count = 0;
   // With the compositor task taking 10ms, there is not enough time to run this
   // 7ms timer task in the 16ms frame.
-  scheduler_->TimerTaskQueue()->PostTask(
-      FROM_HERE, base::Bind(SlowCountingTask, &count, &clock_, 7,
-                            scheduler_->TimerTaskQueue()));
+  timer_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(SlowCountingTask, &count, &clock_, 7, timer_task_runner_));
 
   std::unique_ptr<RendererScheduler::RendererPauseHandle> paused;
   for (int i = 0; i < 1000; i++) {
@@ -3361,8 +3362,7 @@
         (i == 0) || (clock_.NowTicks() > first_throttled_run_time);
     if (paused)
       expect_queue_enabled = false;
-    EXPECT_EQ(expect_queue_enabled,
-              scheduler_->TimerTaskQueue()->IsQueueEnabled())
+    EXPECT_EQ(expect_queue_enabled, timer_task_runner_->IsQueueEnabled())
         << "i = " << i;
 
     // After we've run any expensive tasks suspend the queue.  The throttling
@@ -3385,9 +3385,9 @@
   size_t count = 0;
   // With the compositor task taking 10ms, there is enough time to run this 6ms
   // timer task in the 16ms frame.
-  scheduler_->TimerTaskQueue()->PostTask(
-      FROM_HERE, base::Bind(SlowCountingTask, &count, &clock_, 6,
-                            scheduler_->TimerTaskQueue()));
+  timer_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(SlowCountingTask, &count, &clock_, 6, timer_task_runner_));
 
   for (int i = 0; i < 1000; i++) {
     viz::BeginFrameArgs begin_frame_args = viz::BeginFrameArgs::Create(
@@ -3411,7 +3411,7 @@
         base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending,
                    base::Unretained(this)));
     EXPECT_EQ(UseCase::kSynchronizedGesture, CurrentUseCase()) << "i = " << i;
-    EXPECT_TRUE(scheduler_->TimerTaskQueue()->IsQueueEnabled()) << "i = " << i;
+    EXPECT_TRUE(timer_task_runner_->IsQueueEnabled()) << "i = " << i;
   }
 
   // Task is not throttled.
@@ -3442,7 +3442,7 @@
 
   EXPECT_TRUE(TimerTasksSeemExpensive());
   EXPECT_TRUE(TouchStartExpectedSoon());
-  EXPECT_FALSE(scheduler_->TimerTaskQueue()->IsQueueEnabled());
+  EXPECT_FALSE(timer_task_runner_->IsQueueEnabled());
 }
 
 TEST_F(RendererSchedulerImplTest, DenyLongIdleDuringTouchStart) {
@@ -3695,9 +3695,9 @@
 
   size_t timer_count = 0;
   size_t unthrottled_count = 0;
-  scheduler_->TimerTaskQueue()->PostTask(
+  timer_task_runner_->PostTask(
       FROM_HERE, base::Bind(SlowCountingTask, &timer_count, &clock_, 7,
-                            scheduler_->TimerTaskQueue()));
+                            timer_task_runner_));
   unthrottled_task_runner->PostTask(
       FROM_HERE, base::Bind(SlowCountingTask, &unthrottled_count, &clock_, 7,
                             unthrottled_task_runner));
@@ -3753,7 +3753,7 @@
             scheduler_->GetVirtualTimeDomain());
   EXPECT_EQ(loading_task_runner_->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
-  EXPECT_EQ(scheduler_->TimerTaskQueue()->GetTimeDomain(),
+  EXPECT_EQ(timer_task_runner_->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
   EXPECT_EQ(scheduler_->VirtualTimeControlTaskQueue()->GetTimeDomain(),
             scheduler_->GetVirtualTimeDomain());
@@ -3833,7 +3833,7 @@
             scheduler_->real_time_domain());
   EXPECT_EQ(loading_task_runner_->GetTimeDomain(),
             scheduler_->real_time_domain());
-  EXPECT_EQ(scheduler_->TimerTaskQueue()->GetTimeDomain(),
+  EXPECT_EQ(timer_task_runner_->GetTimeDomain(),
             scheduler_->real_time_domain());
   EXPECT_EQ(scheduler_->ControlTaskQueue()->GetTimeDomain(),
             scheduler_->real_time_domain());
@@ -3900,10 +3900,9 @@
   CPUTimeBudgetPool* time_budget_pool =
       scheduler_->task_queue_throttler()->CreateCPUTimeBudgetPool("test");
 
-  time_budget_pool->AddQueue(base::TimeTicks(),
-                             scheduler_->TimerTaskQueue().get());
+  time_budget_pool->AddQueue(base::TimeTicks(), timer_task_runner_.get());
 
-  scheduler_->TimerTaskQueue()->PostTask(FROM_HERE, base::Bind(NullTask));
+  timer_task_runner_->PostTask(FROM_HERE, base::BindOnce(NullTask));
 
   loading_task_runner_->PostDelayedTask(FROM_HERE, base::BindOnce(NullTask),
                                         base::TimeDelta::FromMilliseconds(10));
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_web_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_web_scheduler_impl.cc
index e8b521d9..79d9af7 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_web_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_web_scheduler_impl.cc
@@ -20,7 +20,6 @@
     RendererSchedulerImpl* renderer_scheduler)
     : WebSchedulerImpl(renderer_scheduler,
                        renderer_scheduler->IdleTaskRunner(),
-                       renderer_scheduler->TimerTaskQueue(),
                        renderer_scheduler->V8TaskQueue()),
       renderer_scheduler_(renderer_scheduler),
       compositor_task_runner_(
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
index ec01c02..2ad8b36 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
@@ -74,6 +74,17 @@
     frame_scheduler_->DidCloseActiveConnection();
 }
 
+WebFrameSchedulerImpl::ThrottlingObserverHandleImpl::
+    ThrottlingObserverHandleImpl(WebFrameSchedulerImpl* frame_scheduler,
+                                 Observer* observer)
+    : frame_scheduler_(frame_scheduler->AsWeakPtr()), observer_(observer) {}
+
+WebFrameSchedulerImpl::ThrottlingObserverHandleImpl::
+    ~ThrottlingObserverHandleImpl() {
+  if (frame_scheduler_)
+    frame_scheduler_->RemoveThrottlingObserver(observer_);
+}
+
 WebFrameSchedulerImpl::WebFrameSchedulerImpl(
     RendererSchedulerImpl* renderer_scheduler,
     WebViewSchedulerImpl* parent_web_view_scheduler,
@@ -171,17 +182,17 @@
                                 throttleable_task_queue_.get());
 }
 
-void WebFrameSchedulerImpl::AddThrottlingObserver(ObserverType type,
-                                                  Observer* observer) {
+std::unique_ptr<WebFrameScheduler::ThrottlingObserverHandle>
+WebFrameSchedulerImpl::AddThrottlingObserver(ObserverType type,
+                                             Observer* observer) {
   DCHECK_EQ(ObserverType::kLoader, type);
   DCHECK(observer);
   observer->OnThrottlingStateChanged(CalculateThrottlingState());
   loader_observers_.insert(observer);
+  return std::make_unique<ThrottlingObserverHandleImpl>(this, observer);
 }
 
-void WebFrameSchedulerImpl::RemoveThrottlingObserver(ObserverType type,
-                                                     Observer* observer) {
-  DCHECK_EQ(ObserverType::kLoader, type);
+void WebFrameSchedulerImpl::RemoveThrottlingObserver(Observer* observer) {
   DCHECK(observer);
   const auto found = loader_observers_.find(observer);
   DCHECK(loader_observers_.end() != found);
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
index ae554dccc..0f37248 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
@@ -54,8 +54,9 @@
   ~WebFrameSchedulerImpl() override;
 
   // WebFrameScheduler implementation:
-  void AddThrottlingObserver(ObserverType, Observer*) override;
-  void RemoveThrottlingObserver(ObserverType, Observer*) override;
+  std::unique_ptr<ThrottlingObserverHandle> AddThrottlingObserver(
+      ObserverType,
+      Observer*) override;
   void SetFrameVisible(bool frame_visible) override;
   bool IsFrameVisible() const override;
   void SetPageVisible(bool page_visible) override;
@@ -102,6 +103,19 @@
     DISALLOW_COPY_AND_ASSIGN(ActiveConnectionHandleImpl);
   };
 
+  class ThrottlingObserverHandleImpl : public ThrottlingObserverHandle {
+   public:
+    ThrottlingObserverHandleImpl(WebFrameSchedulerImpl* frame_scheduler,
+                                 Observer* observer);
+    ~ThrottlingObserverHandleImpl() override;
+
+   private:
+    base::WeakPtr<WebFrameSchedulerImpl> frame_scheduler_;
+    Observer* observer_;
+
+    DISALLOW_COPY_AND_ASSIGN(ThrottlingObserverHandleImpl);
+  };
+
   void DetachFromWebViewScheduler();
   void RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool();
   void ApplyPolicyToThrottleableQueue();
@@ -109,6 +123,7 @@
   void UpdateThrottling(bool was_throttled);
   WebFrameScheduler::ThrottlingState CalculateThrottlingState() const;
   void UpdateThrottlingState();
+  void RemoveThrottlingObserver(Observer* observer);
 
   void DidOpenActiveConnection();
   void DidCloseActiveConnection();
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
index 50b792ed..cd5252e 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
@@ -275,7 +275,7 @@
   observer->CheckObserverState(throttled_count, not_throttled_count,
                                stopped_count);
 
-  web_frame_scheduler_->AddThrottlingObserver(
+  auto observer_handle = web_frame_scheduler_->AddThrottlingObserver(
       WebFrameScheduler::ObserverType::kLoader, observer.get());
 
   // Initial state should be synchronously notified here.
@@ -314,8 +314,7 @@
 
   // Remove from the observer list, and see if any other callback should not be
   // invoked when the condition is changed.
-  web_frame_scheduler_->RemoveThrottlingObserver(
-      WebFrameScheduler::ObserverType::kLoader, observer.get());
+  observer_handle.reset();
   web_view_scheduler_->SetPageVisible(false);
 
   // Wait 100 secs virtually and run pending tasks just in case.
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h b/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h
index 6073d4e0..5ab18047 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_frame_scheduler.h
@@ -101,8 +101,11 @@
   };
 
   // WebFrameScheduler implementation:
-  void AddThrottlingObserver(ObserverType, Observer*) override {}
-  void RemoveThrottlingObserver(ObserverType, Observer*) override {}
+  std::unique_ptr<ThrottlingObserverHandle> AddThrottlingObserver(
+      ObserverType,
+      Observer*) override {
+    return nullptr;
+  }
   void SetFrameVisible(bool) override {}
   bool IsFrameVisible() const override { return is_frame_visible_; }
   void SetPageVisible(bool) override {}
diff --git a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
index d75e00f..ba1e285 100644
--- a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.cpp
@@ -123,7 +123,7 @@
 
   if (run_state_ == RunState::kWaitingToSendToCompositor) {
     if (!element_id_)
-      ReattachCompositorPlayerIfNeeded(
+      ReattachCompositorAnimationIfNeeded(
           GetScrollableArea()->GetCompositorAnimationTimeline());
 
     bool sent_to_compositor = false;
@@ -163,7 +163,7 @@
 
 void ProgrammaticScrollAnimator::LayerForCompositedScrollingDidChange(
     CompositorAnimationTimeline* timeline) {
-  ReattachCompositorPlayerIfNeeded(timeline);
+  ReattachCompositorAnimationIfNeeded(timeline);
 
   // If the composited scrolling layer is lost during a composited animation,
   // continue the animation on the main thread.
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
index 4e1610a..6aab37ac 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
@@ -342,7 +342,7 @@
 
   if (run_state_ == RunState::kWaitingToSendToCompositor) {
     if (!element_id_)
-      ReattachCompositorPlayerIfNeeded(
+      ReattachCompositorAnimationIfNeeded(
           GetScrollableArea()->GetCompositorAnimationTimeline());
 
     if (!animation_curve_)
@@ -429,7 +429,7 @@
 
 void ScrollAnimator::LayerForCompositedScrollingDidChange(
     CompositorAnimationTimeline* timeline) {
-  if (ReattachCompositorPlayerIfNeeded(timeline) && animation_curve_)
+  if (ReattachCompositorAnimationIfNeeded(timeline) && animation_curve_)
     AddMainThreadScrollingReason();
 }
 
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.h b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.h
index e9ca2479..f73fa2ec 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.h
@@ -31,12 +31,12 @@
 #ifndef ScrollAnimator_h
 #define ScrollAnimator_h
 
+#include <memory>
 #include "platform/Timer.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 #include "platform/animation/CompositorScrollOffsetAnimationCurve.h"
 #include "platform/scroll/ScrollAnimatorBase.h"
-#include <memory>
 
 namespace blink {
 
@@ -74,7 +74,7 @@
 //     thread.
 //
 // In scenarios (1) and (2) the animation is created as a cc::Animation with
-// TargetProperty::SCROLL_OFFSET and added to a cc::AnimationPlayer that is
+// TargetProperty::SCROLL_OFFSET and added to a cc::Animation that is
 // serviced on the compositor thread (in cc::AnimationHost::TickAnimations).
 // This lets the animation play smoothly even if the main thread is janked.
 //
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
index 872fdd5e..c0d1fac 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
@@ -6,8 +6,8 @@
 
 #include <memory>
 #include "cc/animation/scroll_offset_animation_curve.h"
+#include "platform/animation/CompositorAnimation.h"
 #include "platform/animation/CompositorAnimationHost.h"
-#include "platform/animation/CompositorAnimationPlayer.h"
 #include "platform/animation/CompositorAnimationTimeline.h"
 #include "platform/animation/CompositorKeyframeModel.h"
 #include "platform/graphics/GraphicsLayer.h"
@@ -25,17 +25,17 @@
       compositor_animation_id_(0),
       compositor_animation_group_id_(0),
       impl_only_animation_takeover_(false) {
-  compositor_player_ = CompositorAnimationPlayer::Create();
-  DCHECK(compositor_player_);
-  compositor_player_->SetAnimationDelegate(this);
+  compositor_animation_ = CompositorAnimation::Create();
+  DCHECK(compositor_animation_);
+  compositor_animation_->SetAnimationDelegate(this);
 }
 
 ScrollAnimatorCompositorCoordinator::~ScrollAnimatorCompositorCoordinator() =
     default;
 
 void ScrollAnimatorCompositorCoordinator::Dispose() {
-  compositor_player_->SetAnimationDelegate(nullptr);
-  compositor_player_.reset();
+  compositor_animation_->SetAnimationDelegate(nullptr);
+  compositor_animation_.reset();
 }
 
 void ScrollAnimatorCompositorCoordinator::ResetAnimationIds() {
@@ -73,21 +73,21 @@
 
 bool ScrollAnimatorCompositorCoordinator::AddAnimation(
     std::unique_ptr<CompositorKeyframeModel> keyframe_model) {
-  if (compositor_player_->IsElementAttached()) {
-    compositor_player_->AddKeyframeModel(std::move(keyframe_model));
+  if (compositor_animation_->IsElementAttached()) {
+    compositor_animation_->AddKeyframeModel(std::move(keyframe_model));
     return true;
   }
   return false;
 }
 
 void ScrollAnimatorCompositorCoordinator::RemoveAnimation() {
-  if (compositor_player_->IsElementAttached())
-    compositor_player_->RemoveKeyframeModel(compositor_animation_id_);
+  if (compositor_animation_->IsElementAttached())
+    compositor_animation_->RemoveKeyframeModel(compositor_animation_id_);
 }
 
 void ScrollAnimatorCompositorCoordinator::AbortAnimation() {
-  if (compositor_player_->IsElementAttached())
-    compositor_player_->AbortKeyframeModel(compositor_animation_id_);
+  if (compositor_animation_->IsElementAttached())
+    compositor_animation_->AbortKeyframeModel(compositor_animation_id_);
 }
 
 void ScrollAnimatorCompositorCoordinator::CancelAnimation() {
@@ -177,7 +177,7 @@
   }
 }
 
-bool ScrollAnimatorCompositorCoordinator::ReattachCompositorPlayerIfNeeded(
+bool ScrollAnimatorCompositorCoordinator::ReattachCompositorAnimationIfNeeded(
     CompositorAnimationTimeline* timeline) {
   bool reattached = false;
   CompositorElementId element_id = GetScrollElementId();
@@ -185,18 +185,18 @@
                         !GetScrollableArea()->LayerForScrolling()));
 
   if (element_id != element_id_) {
-    if (compositor_player_ && timeline) {
+    if (compositor_animation_ && timeline) {
       // Detach from old layer (if any).
       if (element_id_) {
-        if (compositor_player_->IsElementAttached())
-          compositor_player_->DetachElement();
-        timeline->PlayerDestroyed(*this);
+        if (compositor_animation_->IsElementAttached())
+          compositor_animation_->DetachElement();
+        timeline->AnimationDestroyed(*this);
       }
       // Attach to new layer (if any).
       if (element_id) {
-        DCHECK(!compositor_player_->IsElementAttached());
-        timeline->PlayerAttached(*this);
-        compositor_player_->AttachElement(element_id);
+        DCHECK(!compositor_animation_->IsElementAttached());
+        timeline->AnimationAttached(*this);
+        compositor_animation_->AttachElement(element_id);
         reattached = true;
       }
       element_id_ = element_id;
@@ -224,9 +224,9 @@
   NotifyCompositorAnimationFinished(group);
 }
 
-CompositorAnimationPlayer*
-ScrollAnimatorCompositorCoordinator::CompositorPlayer() const {
-  return compositor_player_.get();
+CompositorAnimation*
+ScrollAnimatorCompositorCoordinator::GetCompositorAnimation() const {
+  return compositor_animation_.get();
 }
 
 FloatPoint ScrollAnimatorCompositorCoordinator::CompositorOffsetFromBlinkOffset(
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
index 0414a5e..dcb58160 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
@@ -10,8 +10,8 @@
 #include "cc/animation/animation_curve.h"
 #include "cc/animation/scroll_offset_animations.h"
 #include "platform/PlatformExport.h"
+#include "platform/animation/CompositorAnimationClient.h"
 #include "platform/animation/CompositorAnimationDelegate.h"
-#include "platform/animation/CompositorAnimationPlayerClient.h"
 #include "platform/graphics/CompositorElementId.h"
 #include "platform/heap/Handle.h"
 #include "platform/scroll/ScrollTypes.h"
@@ -21,7 +21,7 @@
 namespace blink {
 
 class ScrollableArea;
-class CompositorAnimationPlayer;
+class CompositorAnimation;
 class CompositorAnimationTimeline;
 class CompositorKeyframeModel;
 
@@ -33,7 +33,7 @@
 
 class PLATFORM_EXPORT ScrollAnimatorCompositorCoordinator
     : public GarbageCollectedFinalized<ScrollAnimatorCompositorCoordinator>,
-      private CompositorAnimationPlayerClient,
+      private CompositorAnimationClient,
       CompositorAnimationDelegate {
   WTF_MAKE_NONCOPYABLE(ScrollAnimatorCompositorCoordinator);
   USING_PRE_FINALIZER(ScrollAnimatorCompositorCoordinator, Dispose);
@@ -145,8 +145,8 @@
   ScrollOffset BlinkOffsetFromCompositorOffset(FloatPoint);
 
   void CompositorAnimationFinished(int group_id);
-  // Returns true if the compositor player was attached to a new layer.
-  bool ReattachCompositorPlayerIfNeeded(CompositorAnimationTimeline*);
+  // Returns true if the compositor animation was attached to a new layer.
+  bool ReattachCompositorAnimationIfNeeded(CompositorAnimationTimeline*);
 
   // CompositorAnimationDelegate implementation.
   void NotifyAnimationStarted(double monotonic_time, int group) override;
@@ -156,8 +156,8 @@
                                double animation_start_time,
                                std::unique_ptr<cc::AnimationCurve>) override {}
 
-  // CompositorAnimationPlayerClient implementation.
-  CompositorAnimationPlayer* CompositorPlayer() const override;
+  // CompositorAnimationClient implementation.
+  CompositorAnimation* GetCompositorAnimation() const override;
 
   friend class Internals;
   // TODO(ymalik): Tests are added as friends to access m_RunState. Use the
@@ -168,7 +168,7 @@
   FRIEND_TEST_ALL_PREFIXES(ScrollAnimatorTest, CancellingCompositorAnimation);
   FRIEND_TEST_ALL_PREFIXES(ScrollAnimatorTest, ImplOnlyAnimationUpdatesCleared);
 
-  std::unique_ptr<CompositorAnimationPlayer> compositor_player_;
+  std::unique_ptr<CompositorAnimation> compositor_animation_;
   // The element id to which the compositor animation is attached when
   // the animation is present.
   CompositorElementId element_id_;
diff --git a/third_party/WebKit/Source/platform/wtf/BUILD.gn b/third_party/WebKit/Source/platform/wtf/BUILD.gn
index 20672f76..ff0f86a 100644
--- a/third_party/WebKit/Source/platform/wtf/BUILD.gn
+++ b/third_party/WebKit/Source/platform/wtf/BUILD.gn
@@ -267,7 +267,6 @@
 
   public_deps = [
     "//base",
-    "//sandbox",
     "//third_party/icu",
   ]
 
diff --git a/third_party/WebKit/Source/platform/wtf/DEPS b/third_party/WebKit/Source/platform/wtf/DEPS
index 7e80997..a2b6603 100644
--- a/third_party/WebKit/Source/platform/wtf/DEPS
+++ b/third_party/WebKit/Source/platform/wtf/DEPS
@@ -23,7 +23,6 @@
     # platform files. Think carefully if you want to relax this restriction.
     "-platform",
     "+platform/wtf",
-    "+sandbox/linux/services/resource_limits.h",
     "-v8",
 ]
 
diff --git a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
index 8bb63139..dab26bd 100644
--- a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
+++ b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
@@ -28,9 +28,6 @@
 #include "build/build_config.h"
 
 #include <string.h>
-#if defined(OS_LINUX)
-#include "sandbox/linux/services/resource_limits.h"  // nogncheck
-#endif
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "platform/wtf/Assertions.h"
 #include "platform/wtf/allocator/Partitions.h"
@@ -124,49 +121,10 @@
   return AllocateMemoryWithFlags(size, policy, base::PartitionAllocReturnNull);
 }
 
-// This method is used by V8's WebAssembly implementation to reserve a large
-// amount of inaccessible address space. This is used to enforce memory safety
-// in Wasm programs.
-void* ArrayBufferContents::ReserveMemory(size_t size) {
-  void* const hint = nullptr;
-  const size_t align = 64 << 10;  // Wasm page size
-
-#if defined(OS_LINUX)
-  // Linux by default has a small address space limit, which we chew up pretty
-  // quickly with large memory reservations. To mitigate this, we bump up the
-  // limit for array buffer reservations. See https://crbug.com/750378
-  //
-  // In general, returning nullptr is dangerous, as unsuspecting code may do an
-  // offset-from-null and end up with an accessible but incorrect address.  This
-  // function (ReserveMemory) is only used in contexts that expect allocation
-  // may fail and explicitly handle the nullptr return case. This code is also
-  // only used on 64-bit to create guard regions, which provides further
-  // protection.
-  if (!sandbox::ResourceLimits::AdjustCurrent(RLIMIT_AS, size)) {
-    return nullptr;
-  }
-#endif
-
-  constexpr bool commit = true;
-  return base::AllocPages(hint, size, align, base::PageInaccessible,
-                          base::PageTag::kChromium, !commit);
-}
-
 void ArrayBufferContents::FreeMemory(void* data) {
   Partitions::ArrayBufferPartition()->Free(data);
 }
 
-void ArrayBufferContents::ReleaseReservedMemory(void* data, size_t size) {
-#if defined(OS_LINUX)
-  // Linux by default has a small address space limit, which we chew up pretty
-  // quickly with large memory reservations. To mitigate this, we bump up the
-  // limit for array buffer reservations. Here we need to lower it back down.
-  // See https://crbug.com/750378
-  CHECK(sandbox::ResourceLimits::AdjustCurrent(RLIMIT_AS, -size));
-#endif
-  base::FreePages(data, size);
-}
-
 ArrayBufferContents::DataHandle ArrayBufferContents::CreateDataHandle(
     size_t size,
     InitializationPolicy policy) {
diff --git a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
index bd50895..de63006a 100644
--- a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
+++ b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
@@ -27,6 +27,7 @@
 #ifndef ArrayBufferContents_h
 #define ArrayBufferContents_h
 
+#include "base/allocator/partition_allocator/page_allocator.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "platform/wtf/Allocator.h"
@@ -98,7 +99,7 @@
           deleter_(data_);
           return;
         case AllocationKind::kReservation:
-          ReleaseReservedMemory(allocation_base_, allocation_length_);
+          base::FreePages(allocation_base_, allocation_length_);
           return;
       }
     }
@@ -177,9 +178,7 @@
   void CopyTo(ArrayBufferContents& other);
 
   static void* AllocateMemoryOrNull(size_t, InitializationPolicy);
-  static void* ReserveMemory(size_t);
   static void FreeMemory(void*);
-  static void ReleaseReservedMemory(void*, size_t);
   static DataHandle CreateDataHandle(size_t, InitializationPolicy);
   static void Initialize(
       AdjustAmountOfExternalAllocatedMemoryFunction function) {
diff --git a/third_party/WebKit/Tools/Scripts/audit-non-blink-usage.py b/third_party/WebKit/Tools/Scripts/audit-non-blink-usage.py
index 29be187b..0f58880 100755
--- a/third_party/WebKit/Tools/Scripts/audit-non-blink-usage.py
+++ b/third_party/WebKit/Tools/Scripts/audit-non-blink-usage.py
@@ -128,6 +128,12 @@
         ],
     },
     {
+        'paths': ['third_party/WebKit/Source/core/inspector/InspectorMemoryAgent.cpp'],
+        'allowed': [
+            'base::SamplingHeapProfiler',
+        ],
+    },
+    {
         'paths': [
             'third_party/WebKit/Source/modules/device_orientation/',
             'third_party/WebKit/Source/modules/gamepad/',
diff --git a/third_party/WebKit/common/BUILD.gn b/third_party/WebKit/common/BUILD.gn
index 5d0f78d..07c2aa9 100644
--- a/third_party/WebKit/common/BUILD.gn
+++ b/third_party/WebKit/common/BUILD.gn
@@ -42,7 +42,6 @@
     "origin_manifest/origin_manifest.cc",
     "origin_trials/trial_token.cc",
     "origin_trials/trial_token_validator.cc",
-    "sampling_heap_profiler/sampling_heap_profiler.cc",
 
     # TODO(kinuko): Split out the target for public headers.
     "../public/common/associated_interfaces/associated_interface_provider.h",
@@ -60,7 +59,6 @@
     "../public/common/origin_trials/trial_token.h",
     "../public/common/origin_trials/trial_token_validator.h",
     "../public/common/page/launching_process_state.h",
-    "../public/common/sampling_heap_profiler/sampling_heap_profiler.h",
   ]
 
   public_deps = [
@@ -98,7 +96,6 @@
     "origin_manifest/origin_manifest_unittest.cc",
     "origin_trials/trial_token_unittest.cc",
     "origin_trials/trial_token_validator_unittest.cc",
-    "sampling_heap_profiler/sampling_heap_profiler_unittest.cc",
     "test/run_all_unittests.cc",
   ]
 
diff --git a/third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h b/third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h
deleted file mode 100644
index 222e5067..0000000
--- a/third_party/WebKit/public/common/sampling_heap_profiler/sampling_heap_profiler.h
+++ /dev/null
@@ -1,94 +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_WEBKIT_PUBLIC_COMMON_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
-#define THIRD_PARTY_WEBKIT_PUBLIC_COMMON_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
-
-#include <unordered_map>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_local.h"
-#include "third_party/WebKit/common/common_export.h"
-
-namespace base {
-template <typename T>
-struct DefaultSingletonTraits;
-}  // namespace base
-
-namespace blink {
-
-// The class implements sampling of native memory heap.
-// It hooks on three basic allocators:
-//   - base::allocator
-//   - base::PartitionAlloc
-//   - Blink GC
-// When started it records allocation samples based on the sampling_interval
-// parameter. The recorded samples can be retrieve using GetSamples method.
-class BLINK_COMMON_EXPORT SamplingHeapProfiler {
- public:
-  class Sample {
-   public:
-    size_t size;
-    size_t count;
-    std::vector<void*> stack;
-
-   private:
-    friend class SamplingHeapProfiler;
-
-    Sample(size_t, size_t count, uint32_t ordinal);
-
-    uint32_t ordinal;
-  };
-
-  class SamplesObserver {
-   public:
-    virtual ~SamplesObserver() = default;
-    virtual void SampleAdded(uint32_t id, size_t size, size_t count) = 0;
-    virtual void SampleRemoved(uint32_t id) = 0;
-  };
-
-  void AddSamplesObserver(SamplesObserver*);
-  void RemoveSamplesObserver(SamplesObserver*);
-
-  uint32_t Start();
-  void Stop();
-  void SetSamplingInterval(size_t sampling_interval);
-  void SuppressRandomnessForTest();
-
-  std::vector<Sample> GetSamples(uint32_t profile_id);
-
-  static inline void MaybeRecordAlloc(void* address, size_t, uint32_t);
-  static inline void MaybeRecordFree(void* address);
-
-  static SamplingHeapProfiler* GetInstance();
-
- private:
-  SamplingHeapProfiler();
-
-  static void InstallAllocatorHooksOnce();
-  static bool InstallAllocatorHooks();
-  static size_t GetNextSampleInterval(size_t base_interval);
-
-  void RecordAlloc(size_t total_allocated,
-                   size_t allocation_size,
-                   void* address,
-                   uint32_t skip_frames);
-  void RecordFree(void* address);
-  void RecordStackTrace(Sample*, uint32_t skip_frames);
-
-  base::ThreadLocalBoolean entered_;
-  base::Lock mutex_;
-  std::unordered_map<void*, Sample> samples_;
-  std::vector<SamplesObserver*> observers_;
-
-  friend struct base::DefaultSingletonTraits<SamplingHeapProfiler>;
-
-  DISALLOW_COPY_AND_ASSIGN(SamplingHeapProfiler);
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_WEBKIT_PUBLIC_COMMON_SAMPLING_HEAP_PROFILER_SAMPLING_HEAP_PROFILER_H
diff --git a/third_party/WebKit/public/platform/WebCORS.h b/third_party/WebKit/public/platform/WebCORS.h
index 0adf3f4..dafc11d 100644
--- a/third_party/WebKit/public/platform/WebCORS.h
+++ b/third_party/WebKit/public/platform/WebCORS.h
@@ -44,10 +44,7 @@
 
 namespace WebCORS {
 
-BLINK_PLATFORM_EXPORT WebURLRequest
-CreateAccessControlPreflightRequest(const WebURLRequest&);
-
-// TODO(tyoshino): Using platform/loader/fetch/ResourceLoaderOptions violates
+// TODO(toyoshim): Using platform/loader/fetch/ResourceLoaderOptions violates
 // the DEPS rule. This will be fixed soon by making HandleRedirect() not
 // depending on ResourceLoaderOptions.
 BLINK_PLATFORM_EXPORT base::Optional<network::mojom::CORSError> HandleRedirect(
@@ -68,11 +65,10 @@
 
 // Checks whether request mode 'no-cors' is allowed for a certain context and
 // service-worker mode.
-BLINK_PLATFORM_EXPORT bool IsNoCORSAllowedContext(
-    WebURLRequest::RequestContext,
-    WebURLRequest::ServiceWorkerMode);
+BLINK_PLATFORM_EXPORT bool IsNoCORSAllowedContext(WebURLRequest::RequestContext,
+                                                  bool skip_service_worker);
 
-// TODO(hintzed): The following three methods delegate to SchemeRegistry and
+// TODO(toyoshim): The following three methods delegate to SchemeRegistry and
 // FetchUtils respectively to expose them for outofblink-CORS in CORSURLLoader.
 // This is a temporary solution with the mid-term goal being to move e.g.
 // FetchUtils somewhere where it can be used from /content. The long term goal
diff --git a/third_party/WebKit/public/platform/WebComputedAXTree.h b/third_party/WebKit/public/platform/WebComputedAXTree.h
index 70ddbdc..e91a919 100644
--- a/third_party/WebKit/public/platform/WebComputedAXTree.h
+++ b/third_party/WebKit/public/platform/WebComputedAXTree.h
@@ -36,7 +36,9 @@
   AOM_BOOL_ATTRIBUTE_NONE,
   AOM_ATTR_ATOMIC,
   AOM_ATTR_BUSY,
+  AOM_ATTR_DISABLED,
   AOM_ATTR_MODAL,
+  AOM_ATTR_READONLY,
 };
 
 class WebComputedAXTree {
@@ -58,13 +60,15 @@
   virtual bool GetIntAttributeForAXNode(int32_t ax_id,
                                         WebAOMIntAttribute,
                                         int32_t* out_param) = 0;
-  virtual bool GetStringAttributeForAXNode(int32_t,
+  virtual bool GetStringAttributeForAXNode(int32_t ax_id,
                                            WebAOMStringAttribute,
                                            WebString* out_param) = 0;
 
   // The role is stored seperately from other attributes in the AXNode, so we
   // expose a seperate method for retrieving this.
   virtual bool GetRoleForAXNode(int32_t ax_id, blink::WebString* out_param) = 0;
+  virtual bool GetCheckedStateForAXNode(int32_t ax_id,
+                                        blink::WebString* out_param) = 0;
   virtual bool GetParentIdForAXNode(int32_t ax_id, int32_t* out_param) = 0;
   virtual bool GetFirstChildIdForAXNode(int32_t ax_id, int32_t* out_param) = 0;
   virtual bool GetLastChildIdForAXNode(int32_t ax_id, int32_t* out_param) = 0;
diff --git a/third_party/WebKit/public/platform/WebURLRequest.h b/third_party/WebKit/public/platform/WebURLRequest.h
index bf1cddf9..93c93f0a 100644
--- a/third_party/WebKit/public/platform/WebURLRequest.h
+++ b/third_party/WebKit/public/platform/WebURLRequest.h
@@ -140,14 +140,6 @@
     kPreviewsStateLast = kPreviewsOff
   };
 
-  // Indicates whether service workers will receive fetch events for this
-  // request. Same as ServiceWorkerMode in
-  // content/public/common/service_worker_modes.h.
-  enum class ServiceWorkerMode : uint8_t {
-    kAll,
-    kNone
-  };
-
   class ExtraData {
    public:
     virtual ~ExtraData() = default;
@@ -259,10 +251,9 @@
   BLINK_PLATFORM_EXPORT bool GetKeepalive() const;
   BLINK_PLATFORM_EXPORT void SetKeepalive(bool);
 
-  // The service worker mode indicating which service workers should get events
-  // for this request.
-  BLINK_PLATFORM_EXPORT ServiceWorkerMode GetServiceWorkerMode() const;
-  BLINK_PLATFORM_EXPORT void SetServiceWorkerMode(ServiceWorkerMode);
+  // True if the service workers should not get events for the request.
+  BLINK_PLATFORM_EXPORT bool GetSkipServiceWorker() const;
+  BLINK_PLATFORM_EXPORT void SetSkipServiceWorker(bool);
 
   // True if corresponding AppCache group should be resetted.
   BLINK_PLATFORM_EXPORT bool ShouldResetAppCache() const;
diff --git a/third_party/WebKit/public/web/modules/autofill/OWNERS b/third_party/WebKit/public/web/modules/autofill/OWNERS
new file mode 100644
index 0000000..86b79a6
--- /dev/null
+++ b/third_party/WebKit/public/web/modules/autofill/OWNERS
@@ -0,0 +1,3 @@
+jochen@chromium.org
+
+# COMPONENT: UI>Browser>Autofill
diff --git a/third_party/WebKit/public/web/modules/password_manager/WebFormElementObserver.h b/third_party/WebKit/public/web/modules/autofill/WebFormElementObserver.h
similarity index 93%
rename from third_party/WebKit/public/web/modules/password_manager/WebFormElementObserver.h
rename to third_party/WebKit/public/web/modules/autofill/WebFormElementObserver.h
index 0bfd2de..af96cc9 100644
--- a/third_party/WebKit/public/web/modules/password_manager/WebFormElementObserver.h
+++ b/third_party/WebKit/public/web/modules/autofill/WebFormElementObserver.h
@@ -11,9 +11,9 @@
 
 namespace blink {
 
+class WebFormControlElement;
 class WebFormElement;
 class WebFormElementObserverCallback;
-class WebInputElement;
 
 class BLINK_EXPORT WebFormElementObserver {
  public:
@@ -23,7 +23,7 @@
       WebFormElement&,
       std::unique_ptr<WebFormElementObserverCallback>);
   static WebFormElementObserver* Create(
-      WebInputElement&,
+      WebFormControlElement&,
       std::unique_ptr<WebFormElementObserverCallback>);
 
   virtual void Disconnect() = 0;
diff --git a/third_party/WebKit/public/web/modules/password_manager/WebFormElementObserverCallback.h b/third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h
similarity index 100%
rename from third_party/WebKit/public/web/modules/password_manager/WebFormElementObserverCallback.h
rename to third_party/WebKit/public/web/modules/autofill/WebFormElementObserverCallback.h
diff --git a/third_party/WebKit/public/web/modules/password_manager/OWNERS b/third_party/WebKit/public/web/modules/password_manager/OWNERS
deleted file mode 100644
index 70f3bfc..0000000
--- a/third_party/WebKit/public/web/modules/password_manager/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-jochen@chromium.org
-
-# COMPONENT: UI>Browser>Passwords
diff --git a/third_party/libovr/BUILD.gn b/third_party/libovr/BUILD.gn
index 901bf6e8..ad3e214 100644
--- a/third_party/libovr/BUILD.gn
+++ b/third_party/libovr/BUILD.gn
@@ -3,8 +3,9 @@
 # found in the LICENSE file.
 
 config("libovr-config") {
-  if (is_clang)
+  if (is_clang) {
     cflags = [ "-Wno-unused-function" ]
+  }
 }
 
 static_library("libovr") {
diff --git a/third_party/libwebp/README.chromium b/third_party/libwebp/README.chromium
index 7e8dafa..194742e 100644
--- a/third_party/libwebp/README.chromium
+++ b/third_party/libwebp/README.chromium
@@ -25,3 +25,4 @@
   Revert patch f7fc4bc: dec/webp.c: don't wait for data before reporting w/h
   296c7dc4 fix lossless decoding w/WEBP_REDUCE_SIZE
   05f6fe24 upsampling: rm asserts w/REDUCE_CSP+OMIT_C_CODE
+  6de58603 MIPS64: Fix defined-but-not-used errors with WEBP_REDUCE_CSP
diff --git a/third_party/libwebp/src/dsp/upsampling_msa.c b/third_party/libwebp/src/dsp/upsampling_msa.c
index 535ffb7..99eea70 100644
--- a/third_party/libwebp/src/dsp/upsampling_msa.c
+++ b/third_party/libwebp/src/dsp/upsampling_msa.c
@@ -264,6 +264,7 @@
   bgr[2] = Clip8(r1 >> 6);
 }
 
+#if !defined(WEBP_REDUCE_CSP)
 static void YuvToRgb565(int y, int u, int v, uint8_t* const rgb) {
   const int y1 = MultHi(y, 19077);
   const int r1 = y1 + MultHi(v, 26149) - 14234;
@@ -306,6 +307,7 @@
   argb[0] = 0xff;
   YuvToRgb(y, u, v, argb + 1);
 }
+#endif  // WEBP_REDUCE_CSP
 
 static void YuvToBgra(uint8_t y, uint8_t u, uint8_t v, uint8_t* const bgra) {
   YuvToBgr(y, u, v, bgra);
@@ -317,6 +319,7 @@
   rgba[3] = 0xff;
 }
 
+#if !defined(WEBP_REDUCE_CSP)
 static void YuvToRgbLine(const uint8_t* y, const uint8_t* u,
                          const uint8_t* v, uint8_t* dst, int length) {
   v16u8 R, G, B;
@@ -370,6 +373,7 @@
     memcpy(dst, temp, length * 3 * sizeof(*dst));
   }
 }
+#endif  // WEBP_REDUCE_CSP
 
 static void YuvToRgbaLine(const uint8_t* y, const uint8_t* u,
                           const uint8_t* v, uint8_t* dst, int length) {
@@ -427,6 +431,7 @@
   }
 }
 
+#if !defined(WEBP_REDUCE_CSP)
 static void YuvToArgbLine(const uint8_t* y, const uint8_t* u,
                           const uint8_t* v, uint8_t* dst, int length) {
   v16u8 R, G, B;
@@ -526,6 +531,7 @@
     memcpy(dst, temp, length * 2 * sizeof(*dst));
   }
 }
+#endif  // WEBP_REDUCE_CSP
 
 #define UPSAMPLE_32PIXELS(a, b, c, d) do {    \
   v16u8 s = __msa_aver_u_b(a, d);             \
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json
index 1435284..3813c8d 100644
--- a/third_party/polymer/v1_0/bower.json
+++ b/third_party/polymer/v1_0/bower.json
@@ -11,7 +11,7 @@
     "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1.0.5",
     "iron-collapse": "PolymerElements/iron-collapse#2.1.0",
     "iron-dropdown": "PolymerElements/iron-dropdown#2.1.0",
-    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#1.2.5",
+    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#2.1.0",
     "iron-flex-layout": "PolymerElements/iron-flex-layout#1.3.1",
     "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#1.0.6",
     "iron-icon": "PolymerElements/iron-icon#1.0.10",
@@ -32,7 +32,7 @@
     "iron-selector": "PolymerElements/iron-selector#1.5.2",
     "iron-test-helpers": "PolymerElements/iron-test-helpers#2.0.0",
     "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#1.1.1",
-    "neon-animation": "PolymerElements/neon-animation#1.2.4",
+    "neon-animation": "PolymerElements/neon-animation#2.1.0",
     "paper-behaviors": "PolymerElements/paper-behaviors#1.0.12",
     "paper-button": "PolymerElements/paper-button#2.0.0",
     "paper-checkbox": "PolymerElements/paper-checkbox#2.0.2",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
index 7e4ce51..9e4209e 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-fit-behavior",
-  "version": "1.2.5",
+  "version": "2.1.0",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Fits an element inside another element",
   "private": true,
@@ -18,14 +18,32 @@
     "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
   },
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
+    "polymer": "Polymer/polymer#1.9 - 2"
   },
   "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
+    "web-component-tester": "^6.0.0",
+    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
   },
-  "ignore": []
+  "variants": {
+    "1.x": {
+      "dependencies": {
+        "polymer": "Polymer/polymer#^1.9"
+      },
+      "devDependencies": {
+        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+        "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
+        "web-component-tester": "^4.0.0",
+        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+      },
+      "resolutions": {
+        "webcomponentsjs": "^0.7"
+      }
+    }
+  },
+  "ignore": [],
+  "resolutions": {
+    "webcomponentsjs": "^1.0.0"
+  }
 }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
index 33c668121..7d8d1c3 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
@@ -30,10 +30,20 @@
         </iron-fit-impl>
       </div>
 
+Use `horizontalOffset, verticalOffset` to offset the element from its `positionTarget`;
+`Polymer.IronFitBehavior` will collapse these in order to keep the element
+within `fitInto` boundaries, while preserving the element's CSS margin values.
+
+      <div class="container">
+        <iron-fit-impl vertical-align="top" vertical-offset="20">
+          With vertical offset
+        </iron-fit-impl>
+      </div>
+
+
 @demo demo/index.html
 @polymerBehavior
 */
-
   Polymer.IronFitBehavior = {
 
     properties: {
@@ -77,7 +87,7 @@
 
       /**
        * The orientation against which to align the element horizontally
-       * relative to the `positionTarget`. Possible values are "left", "right", "auto".
+       * relative to the `positionTarget`. Possible values are "left", "right", "center", "auto".
        */
       horizontalAlign: {
         type: String
@@ -85,7 +95,7 @@
 
       /**
        * The orientation against which to align the element vertically
-       * relative to the `positionTarget`. Possible values are "top", "bottom", "auto".
+       * relative to the `positionTarget`. Possible values are "top", "bottom", "middle", "auto".
        */
       verticalAlign: {
         type: String
@@ -100,8 +110,18 @@
       },
 
       /**
-       * The same as setting margin-left and margin-right css properties.
-       * @deprecated
+       * A pixel value that will be added to the position calculated for the
+       * given `horizontalAlign`, in the direction of alignment. You can think
+       * of it as increasing or decreasing the distance to the side of the
+       * screen given by `horizontalAlign`.
+       *
+       * If `horizontalAlign` is "left" or "center", this offset will increase or
+       * decrease the distance to the left side of the screen: a negative offset will
+       * move the dropdown to the left; a positive one, to the right.
+       *
+       * Conversely if `horizontalAlign` is "right", this offset will increase
+       * or decrease the distance to the right side of the screen: a negative
+       * offset will move the dropdown to the right; a positive one, to the left.
        */
       horizontalOffset: {
         type: Number,
@@ -110,8 +130,18 @@
       },
 
       /**
-       * The same as setting margin-top and margin-bottom css properties.
-       * @deprecated
+       * A pixel value that will be added to the position calculated for the
+       * given `verticalAlign`, in the direction of alignment. You can think
+       * of it as increasing or decreasing the distance to the side of the
+       * screen given by `verticalAlign`.
+       *
+       * If `verticalAlign` is "top" or "middle", this offset will increase or
+       * decrease the distance to the top side of the screen: a negative offset will
+       * move the dropdown upwards; a positive one, downwards.
+       *
+       * Conversely if `verticalAlign` is "bottom", this offset will increase
+       * or decrease the distance to the bottom side of the screen: a negative
+       * offset will move the dropdown downwards; a positive one, upwards.
        */
       verticalOffset: {
         type: Number,
@@ -203,9 +233,21 @@
       return this.horizontalAlign;
     },
 
+    /**
+     * True if the element should be positioned instead of centered.
+     * @private
+     */
+    get __shouldPosition() {
+      return (this.horizontalAlign || this.verticalAlign) &&
+        (this.horizontalAlign !== 'center' || this.verticalAlign !== 'middle');
+    },
+
     attached: function() {
       // Memoize this to avoid expensive calculations & relayouts.
-      this._isRTL = window.getComputedStyle(this).direction == 'rtl';
+      // Make sure we do it only once
+      if (typeof this._isRTL === 'undefined') {
+        this._isRTL = window.getComputedStyle(this).direction == 'rtl';
+      }
       this.positionTarget = this.positionTarget || this._defaultPositionTarget;
       if (this.autoFitOnAttach) {
         if (window.getComputedStyle(this).display === 'none') {
@@ -213,11 +255,22 @@
             this.fit();
           }.bind(this));
         } else {
+          // NOTE: shadydom applies distribution asynchronously
+          // for performance reasons webcomponents/shadydom#120
+          // Flush to get correct layout info.
+          window.ShadyDOM && ShadyDOM.flush();
           this.fit();
         }
       }
     },
 
+    detached: function() {
+      if (this.__deferredFit) {
+        clearTimeout(this.__deferredFit);
+        this.__deferredFit = null;
+      }
+    },
+
     /**
      * Positions and fits the element into the `fitInto` element.
      */
@@ -268,20 +321,6 @@
           left: parseInt(target.marginLeft, 10) || 0
         }
       };
-
-      // Support these properties until they are removed.
-      if (this.verticalOffset) {
-        this._fitInfo.margin.top = this._fitInfo.margin.bottom = this.verticalOffset;
-        this._fitInfo.inlineStyle.marginTop = this.style.marginTop || '';
-        this._fitInfo.inlineStyle.marginBottom = this.style.marginBottom || '';
-        this.style.marginTop = this.style.marginBottom = this.verticalOffset + 'px';
-      }
-      if (this.horizontalOffset) {
-        this._fitInfo.margin.left = this._fitInfo.margin.right = this.horizontalOffset;
-        this._fitInfo.inlineStyle.marginLeft = this.style.marginLeft || '';
-        this._fitInfo.inlineStyle.marginRight = this.style.marginRight || '';
-        this.style.marginLeft = this.style.marginRight = this.horizontalOffset + 'px';
-      }
     },
 
     /**
@@ -319,7 +358,7 @@
      * Positions the element according to `horizontalAlign, verticalAlign`.
      */
     position: function() {
-      if (!this.horizontalAlign && !this.verticalAlign) {
+      if (!this.__shouldPosition) {
         // needs to be centered, and it is done after constrain.
         return;
       }
@@ -344,32 +383,26 @@
         height: rect.height + margin.top + margin.bottom
       };
 
-      var position = this.__getPosition(this._localeHorizontalAlign, this.verticalAlign, size, positionRect, fitRect);
+      var position = this.__getPosition(this._localeHorizontalAlign, this.verticalAlign, size, rect, positionRect,
+        fitRect);
 
       var left = position.left + margin.left;
       var top = position.top + margin.top;
 
-      // Use original size (without margin).
+      // We first limit right/bottom within fitInto respecting the margin,
+      // then use those values to limit top/left.
       var right = Math.min(fitRect.right - margin.right, left + rect.width);
       var bottom = Math.min(fitRect.bottom - margin.bottom, top + rect.height);
 
-      var minWidth = this._fitInfo.sizedBy.minWidth;
-      var minHeight = this._fitInfo.sizedBy.minHeight;
-      if (left < margin.left) {
-        left = margin.left;
-        if (right - left < minWidth) {
-          left = right - minWidth;
-        }
-      }
-      if (top < margin.top) {
-        top = margin.top;
-        if (bottom - top < minHeight) {
-          top = bottom - minHeight;
-        }
-      }
+      // Keep left/top within fitInto respecting the margin.
+      left = Math.max(fitRect.left + margin.left,
+        Math.min(left, right - this._fitInfo.sizedBy.minWidth));
+      top = Math.max(fitRect.top + margin.top,
+        Math.min(top, bottom - this._fitInfo.sizedBy.minHeight));
 
-      this.sizingTarget.style.maxWidth = (right - left) + 'px';
-      this.sizingTarget.style.maxHeight = (bottom - top) + 'px';
+      // Use right/bottom to set maxWidth/maxHeight, and respect minWidth/minHeight.
+      this.sizingTarget.style.maxWidth = Math.max(right - left, this._fitInfo.sizedBy.minWidth) + 'px';
+      this.sizingTarget.style.maxHeight = Math.max(bottom - top, this._fitInfo.sizedBy.minHeight) + 'px';
 
       // Remove the offset caused by any stacking context.
       this.style.left = (left - rect.left) + 'px';
@@ -381,7 +414,7 @@
      * and/or `max-width`.
      */
     constrain: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
+      if (this.__shouldPosition) {
         return;
       }
       this._discoverInfo();
@@ -437,7 +470,7 @@
      * `position:fixed`.
      */
     center: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
+      if (this.__shouldPosition) {
         return;
       }
       this._discoverInfo();
@@ -485,36 +518,36 @@
       return target.getBoundingClientRect();
     },
 
-    __getCroppedArea: function(position, size, fitRect) {
+    __getOffscreenArea: function(position, size, fitRect) {
       var verticalCrop = Math.min(0, position.top) + Math.min(0, fitRect.bottom - (position.top + size.height));
       var horizontalCrop = Math.min(0, position.left) + Math.min(0, fitRect.right - (position.left + size.width));
       return Math.abs(verticalCrop) * size.width + Math.abs(horizontalCrop) * size.height;
     },
 
 
-    __getPosition: function(hAlign, vAlign, size, positionRect, fitRect) {
+    __getPosition: function(hAlign, vAlign, size, sizeNoMargins, positionRect, fitRect) {
       // All the possible configurations.
       // Ordered as top-left, top-right, bottom-left, bottom-right.
       var positions = [{
         verticalAlign: 'top',
         horizontalAlign: 'left',
-        top: positionRect.top,
-        left: positionRect.left
+        top: positionRect.top + this.verticalOffset,
+        left: positionRect.left + this.horizontalOffset
       }, {
         verticalAlign: 'top',
         horizontalAlign: 'right',
-        top: positionRect.top,
-        left: positionRect.right - size.width
+        top: positionRect.top + this.verticalOffset,
+        left: positionRect.right - size.width - this.horizontalOffset
       }, {
         verticalAlign: 'bottom',
         horizontalAlign: 'left',
-        top: positionRect.bottom - size.height,
-        left: positionRect.left
+        top: positionRect.bottom - size.height - this.verticalOffset,
+        left: positionRect.left + this.horizontalOffset
       }, {
         verticalAlign: 'bottom',
         horizontalAlign: 'right',
-        top: positionRect.bottom - size.height,
-        left: positionRect.right - size.width
+        top: positionRect.bottom - size.height - this.verticalOffset,
+        left: positionRect.right - size.width - this.horizontalOffset
       }];
 
       if (this.noOverlap) {
@@ -538,23 +571,53 @@
       vAlign = vAlign === 'auto' ? null : vAlign;
       hAlign = hAlign === 'auto' ? null : hAlign;
 
+      if (!hAlign || hAlign === 'center') {
+        positions.push({
+          verticalAlign: 'top',
+          horizontalAlign: 'center',
+          top: positionRect.top + this.verticalOffset + (this.noOverlap ? positionRect.height : 0),
+          left: positionRect.left - sizeNoMargins.width / 2 + positionRect.width / 2 + this.horizontalOffset
+        });
+        positions.push({
+          verticalAlign: 'bottom',
+          horizontalAlign: 'center',
+          top: positionRect.bottom - size.height - this.verticalOffset - (this.noOverlap ? positionRect.height : 0),
+          left: positionRect.left - sizeNoMargins.width / 2 + positionRect.width / 2 + this.horizontalOffset
+        });
+      }
+
+      if (!vAlign || vAlign === 'middle') {
+        positions.push({
+          verticalAlign: 'middle',
+          horizontalAlign: 'left',
+          top: positionRect.top - sizeNoMargins.height / 2 + positionRect.height / 2 + this.verticalOffset,
+          left: positionRect.left + this.horizontalOffset + (this.noOverlap ? positionRect.width : 0)
+        });
+        positions.push({
+          verticalAlign: 'middle',
+          horizontalAlign: 'right',
+          top: positionRect.top - sizeNoMargins.height / 2 + positionRect.height / 2 + this.verticalOffset,
+          left: positionRect.right - size.width - this.horizontalOffset - (this.noOverlap ? positionRect.width : 0)
+        });
+      }
+
       var position;
       for (var i = 0; i < positions.length; i++) {
-        var pos = positions[i];
+        var candidate = positions[i];
+        var vAlignOk = candidate.verticalAlign === vAlign;
+        var hAlignOk = candidate.horizontalAlign === hAlign;
 
         // If both vAlign and hAlign are defined, return exact match.
         // For dynamicAlign and noOverlap we'll have more than one candidate, so
-        // we'll have to check the croppedArea to make the best choice.
-        if (!this.dynamicAlign && !this.noOverlap &&
-            pos.verticalAlign === vAlign && pos.horizontalAlign === hAlign) {
-          position = pos;
+        // we'll have to check the offscreenArea to make the best choice.
+        if (!this.dynamicAlign && !this.noOverlap && vAlignOk && hAlignOk) {
+          position = candidate;
           break;
         }
 
         // Align is ok if alignment preferences are respected. If no preferences,
         // it is considered ok.
-        var alignOk = (!vAlign || pos.verticalAlign === vAlign) &&
-                      (!hAlign || pos.horizontalAlign === hAlign);
+        var alignOk = (!vAlign || vAlignOk) && (!hAlign || hAlignOk);
 
         // Filter out elements that don't match the alignment (if defined).
         // With dynamicAlign, we need to consider all the positions to find the
@@ -563,19 +626,21 @@
           continue;
         }
 
-        position = position || pos;
-        pos.croppedArea = this.__getCroppedArea(pos, size, fitRect);
-        var diff = pos.croppedArea - position.croppedArea;
-        // Check which crops less. If it crops equally, check if align is ok.
-        if (diff < 0 || (diff === 0 && alignOk)) {
-          position = pos;
-        }
+        candidate.offscreenArea = this.__getOffscreenArea(candidate, size, fitRect);
         // If not cropped and respects the align requirements, keep it.
         // This allows to prefer positions overlapping horizontally over the
         // ones overlapping vertically.
-        if (position.croppedArea === 0 && alignOk) {
+        if (candidate.offscreenArea === 0 && alignOk) {
+          position = candidate;
           break;
         }
+        position = position || candidate;
+        var diff = candidate.offscreenArea - position.offscreenArea;
+        // Check which crops less. If it crops equally, check if at least one
+        // align setting is ok.
+        if (diff < 0 || (diff === 0 && (vAlignOk || hAlignOk))) {
+          position = candidate;
+        }
       }
 
       return position;
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn b/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn
index 1354ab7be..48025b6 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/BUILD.gn
@@ -25,15 +25,11 @@
 }
 
 js_library("neon-animation-behavior-extracted") {
-  deps = [
-    "../iron-meta:iron-meta-extracted",
-  ]
 }
 
 js_library("neon-animation-runner-behavior-extracted") {
   deps = [
     ":neon-animatable-behavior-extracted",
-    "../iron-meta:iron-meta-extracted",
   ]
 }
 
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn
index e3a466e..ae8dcf27 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/BUILD.gn
@@ -10,124 +10,106 @@
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("fade-in-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("fade-out-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("hero-animation-extracted") {
   deps = [
     "..:neon-shared-element-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("opaque-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("reverse-ripple-animation-extracted") {
   deps = [
     "..:neon-shared-element-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("ripple-animation-extracted") {
   deps = [
     "..:neon-shared-element-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("scale-down-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("scale-up-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-down-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-from-bottom-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-from-left-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-from-right-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-from-top-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-left-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-right-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("slide-up-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
 
 js_library("transform-animation-extracted") {
   deps = [
     "..:neon-animation-behavior-extracted",
   ]
-  externs_list = [ "//third_party/closure_compiler/externs/web_animations.js" ]
 }
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/cascaded-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/cascaded-animation.html
index 51c9ce9a3..1485ba824 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/cascaded-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/cascaded-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<cascaded-animation>` applies an animation on an array of elements with a delay between each.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp
index ff5b71835..a8b59c5 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/compiled_resources2.gyp
@@ -9,7 +9,6 @@
       'target_name': 'cascaded-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -17,7 +16,6 @@
       'target_name': 'fade-in-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -25,7 +23,6 @@
       'target_name': 'fade-out-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -33,7 +30,6 @@
       'target_name': 'hero-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-shared-element-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -41,7 +37,6 @@
       'target_name': 'opaque-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -49,7 +44,6 @@
       'target_name': 'reverse-ripple-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-shared-element-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -57,7 +51,6 @@
       'target_name': 'ripple-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-shared-element-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -65,7 +58,6 @@
       'target_name': 'scale-down-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -73,7 +65,6 @@
       'target_name': 'scale-up-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -81,7 +72,6 @@
       'target_name': 'slide-down-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -89,7 +79,6 @@
       'target_name': 'slide-from-bottom-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -97,7 +86,6 @@
       'target_name': 'slide-from-left-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -105,7 +93,6 @@
       'target_name': 'slide-from-right-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -113,7 +100,6 @@
       'target_name': 'slide-from-top-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -121,7 +107,6 @@
       'target_name': 'slide-left-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -129,7 +114,6 @@
       'target_name': 'slide-right-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -137,7 +121,6 @@
       'target_name': 'slide-up-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
@@ -145,7 +128,6 @@
       'target_name': 'transform-animation-extracted',
       'dependencies': [
         '../compiled_resources2.gyp:neon-animation-behavior-extracted',
-        '<(EXTERNS_GYP):web_animations',
       ],
       'includes': ['../../../../../closure_compiler/compile_js2.gypi'],
     },
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation.html
index d45421f8..f97d3e8 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<fade-in-animation>` animates the opacity of an element from 0 to 1.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation.html
index df80eb8..bddf2ed 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<fade-out-animation>` animates the opacity of an element from 1 to 0.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/hero-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/hero-animation.html
index b2ad28b..1f2744e 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/hero-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/hero-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<hero-animation>` is a shared element animation that scales and transform an element such that it
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/opaque-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/opaque-animation.html
index 2ba7d769..405df80 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/opaque-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/opaque-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<opaque-animation>` makes an element `opacity:1` for the duration of the animation. Used to prevent
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/reverse-ripple-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/reverse-ripple-animation.html
index d4f6ced..efead1b 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/reverse-ripple-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/reverse-ripple-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<reverse-ripple-animation>` scales and transform an element such that it appears to ripple down from this element, to either
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/ripple-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/ripple-animation.html
index e600cde..0938223 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/ripple-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/ripple-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<ripple-animation>` scales and transform an element such that it appears to ripple from either
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-down-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-down-animation.html
index 13b8127..f88e175f 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-down-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-down-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<scale-down-animation>` animates the scale transform of an element from 1 to 0. By default it
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-up-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-up-animation.html
index e228b29..8ce722ff 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-up-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/scale-up-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<scale-up-animation>` animates the scale transform of an element from 0 to 1. By default it
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-down-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-down-animation.html
index 1a1ae875..bc7a373 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-down-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-down-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-down-animation>` animates the transform of an element from `none` `translateY(100%)`.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-bottom-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-bottom-animation.html
index 9f87c53..c2c45b9 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-bottom-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-bottom-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-from-bottom-animation>` animates the transform of an element from `none` to `translateY(100%)`.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-left-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-left-animation.html
index 7c80eca..1b852f8 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-left-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-left-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-from-left-animation>` animates the transform of an element from
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-right-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-right-animation.html
index c862baf..e011d65 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-right-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-right-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-from-right-animation>` animates the transform of an element from
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-top-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-top-animation.html
index 8f39791..5e1f6f6 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-top-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-from-top-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-from-top-animation>` animates the transform of an element from `translateY(-100%)` to
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-left-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-left-animation.html
index 518d1aa8..9df30e9 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-left-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-left-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-left-animation>` animates the transform of an element from `none` to `translateX(-100%)`.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-right-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-right-animation.html
index 29c48a5..3645fb5 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-right-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-right-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-right-animation>` animates the transform of an element from `none` to `translateX(100%)`.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-up-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-up-animation.html
index 2468bbde..ba9b5224 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-up-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/slide-up-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<slide-up-animation>` animates the transform of an element from `translateY(0)` to
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/transform-animation.html b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/transform-animation.html
index 8a92bd2..64f93e69 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/animations/transform-animation.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/animations/transform-animation.html
@@ -8,7 +8,6 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../../polymer/polymer.html">
 <link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
 
 <!--
 `<transform-animation>` animates a custom transform on an element. Use this to animate multiple
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json b/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
index 8af634ef..cbe57cf9 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
@@ -1,7 +1,7 @@
 {
   "name": "neon-animation",
   "description": "A system for animating Polymer-based web components",
-  "version": "1.2.4",
+  "version": "2.1.0",
   "authors": [
     "The Polymer Authors"
   ],
@@ -30,23 +30,49 @@
   "homepage": "https://github.com/PolymerElements/neon-animation",
   "ignore": [],
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-meta": "PolymerElements/iron-meta#^1.0.0",
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-    "iron-selector": "PolymerElements/iron-selector#^1.0.0",
-    "web-animations-js": "web-animations/web-animations-js#^2.2.0"
+    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
+    "iron-selector": "PolymerElements/iron-selector#1 - 2",
+    "polymer": "Polymer/polymer#1.9 - 2"
   },
   "devDependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0"
+    "app-layout": "PolymerElements/app-layout#1 - 2",
+    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
+    "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
+    "iron-icon": "PolymerElements/iron-icon#1 - 2",
+    "iron-icons": "PolymerElements/iron-icons#1 - 2",
+    "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
+    "paper-item": "PolymerElements/paper-item#1 - 2",
+    "paper-styles": "PolymerElements/paper-styles#1 - 2",
+    "web-animations-js": "web-animations/web-animations-js#^2.2.0",
+    "web-component-tester": "^6.0.0",
+    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
+  },
+  "variants": {
+    "1.x": {
+      "dependencies": {
+        "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
+        "iron-selector": "PolymerElements/iron-selector#^1.0.0",
+        "polymer": "Polymer/polymer#^1.9",
+        "web-animations-js": "web-animations/web-animations-js#^2.2.0"
+      },
+      "devDependencies": {
+        "app-layout": "PolymerElements/app-layout#^0.10.0",
+        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+        "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
+        "iron-icon": "PolymerElements/iron-icon#^1.0.0",
+        "iron-icons": "PolymerElements/iron-icons#^1.0.0",
+        "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
+        "paper-item": "PolymerElements/paper-item#^1.0.0",
+        "paper-styles": "PolymerElements/paper-styles#^1.0.0",
+        "web-component-tester": "^4.0.0",
+        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
+      },
+      "resolutions": {
+        "webcomponentsjs": "^0.7"
+      }
+    }
+  },
+  "resolutions": {
+    "webcomponentsjs": "^1.0.0"
   }
 }
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
index 8cdd202..a72fc50d 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
@@ -28,15 +28,11 @@
     },
     {
       'target_name': 'neon-animation-behavior-extracted',
-      'dependencies': [
-        '../iron-meta/compiled_resources2.gyp:iron-meta-extracted',
-      ],
       'includes': ['../../../../closure_compiler/compile_js2.gypi'],
     },
     {
       'target_name': 'neon-animation-runner-behavior-extracted',
       'dependencies': [
-        '../iron-meta/compiled_resources2.gyp:iron-meta-extracted',
         'neon-animatable-behavior-extracted',
       ],
       'includes': ['../../../../closure_compiler/compile_js2.gypi'],
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior-extracted.js
index 9390405..7638206 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior-extracted.js
@@ -98,7 +98,7 @@
               if (cachedConfig) {
                 // merge configurations with the same id, making a clone lazily
                 if (!cachedConfig.isClone) {
-                  map[config.id] = this._cloneConfig(cachedConfig)
+                  map[config.id] = this._cloneConfig(cachedConfig);
                   cachedConfig = map[config.id];
                 }
                 this._copyProperties(cachedConfig, config);
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
index 7c95477..e4410b57 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
@@ -30,8 +30,8 @@
         display: block;
       }
     </style>
-    
-    <content></content>
+
+    <slot></slot>
   </template>
 
 </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages-extracted.js
index a30ed09..787bf37 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages-extracted.js
@@ -153,10 +153,9 @@
       var selectedPage = this.selectedItem || this._valueToItem(this.selected);
       this.resizerShouldNotify = function(element) {
         return element == selectedPage;
-      }
+      };
       this.notifyResize();
     }
-
   })
 
 })();
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
index 422bfde4..c4d4c362 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
@@ -31,7 +31,7 @@
         position: relative;
       }
 
-      :host > ::content > * {
+      :host > ::slotted(*) {
         position: absolute;
         top: 0;
         left: 0;
@@ -39,16 +39,17 @@
         right: 0;
       }
 
-      :host > ::content > :not(.iron-selected):not(.neon-animating) {
+      :host > ::slotted(:not(.iron-selected):not(.neon-animating))
+       {
         display: none !important;
       }
 
-      :host > ::content > .neon-animating {
+      :host > ::slotted(.neon-animating) {
         pointer-events: none;
       }
     </style>
-    
-    <content id="content"></content>
+
+    <slot id="content"></slot>
   </template>
 
 </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior-extracted.js
index bfd3c71..1437cee 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior-extracted.js
@@ -33,6 +33,13 @@
     // configure: function(config) {
     // },
 
+    created: function() {
+      if (!document.body.animate) {
+        console.warn('No web animations detected. This element will not' +
+            ' function without a web animations polyfill.');
+      }
+    },
+
     /**
      * Returns the animation timing by mixing in properties from `config` to the defaults defined
      * by the animation.
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior.html
index 121e9b7a..4cac750 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior.html
@@ -7,6 +7,5 @@
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
 
 </head><body><script src="neon-animation-behavior-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
index c34d4e2..9661322 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
@@ -7,35 +7,57 @@
 
     _configureAnimations: function(configs) {
       var results = [];
+      var resultsToPlay = [];
+
       if (configs.length > 0) {
         for (var config, index = 0; config = configs[index]; index++) {
           var neonAnimation = document.createElement(config.name);
           // is this element actually a neon animation?
           if (neonAnimation.isNeonAnimation) {
             var result = null;
-            // configuration or play could fail if polyfills aren't loaded
-            try {
-              result = neonAnimation.configure(config);
-              // Check if we have an Effect rather than an Animation
-              if (typeof result.cancel != 'function') { 
-                result = document.timeline.play(result);
+            // Closure compiler does not work well with a try / catch here. .configure needs to be
+            // explicitly defined
+            if (!neonAnimation.configure) {
+              /**
+               * @param {Object} config
+               * @return {AnimationEffectReadOnly}
+               */
+              neonAnimation.configure = function(config) {
+                return null;
               }
-            } catch (e) {
-              result = null;
-              console.warn('Couldnt play', '(', config.name, ').', e);
             }
-            if (result) {
-              results.push({
-                neonAnimation: neonAnimation,
-                config: config,
-                animation: result,
-              });
-            }
+
+            result = neonAnimation.configure(config);
+            resultsToPlay.push({ result: result, config: config });
           } else {
             console.warn(this.is + ':', config.name, 'not found!');
           }
         }
       }
+
+      for (var i = 0; i < resultsToPlay.length; i++) {
+        var result = resultsToPlay[i].result;
+        var config = resultsToPlay[i].config;
+        // configuration or play could fail if polyfills aren't loaded
+        try {
+          // Check if we have an Effect rather than an Animation
+          if (typeof result.cancel != 'function') {
+            result = document.timeline.play(result);
+          }
+        } catch (e) {
+          result = null;
+          console.warn('Couldnt play', '(', config.name, ').', e);
+        }
+
+        if (result) {
+          results.push({
+            neonAnimation: neonAnimation,
+            config: config,
+            animation: result,
+          });
+        }
+      }
+
       return results;
     },
 
@@ -99,10 +121,15 @@
      * Cancels the currently running animations.
      */
     cancelAnimation: function() {
-      for (var k in this._animations) {
-        this._animations[k].cancel();
+      for (var k in this._active) {
+        var entries = this._active[k]
+
+        for (var j in entries) {
+          entries[j].animation.cancel();
+        }
       }
-      this._animations = {};
+
+      this._active = {};
     }
   };
 
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior.html
index f50a250b..ada00e4 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior.html
@@ -7,7 +7,6 @@
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
 <link rel="import" href="neon-animatable-behavior.html">
 
 </head><body><script src="neon-animation-runner-behavior-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-shared-element-animation-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-shared-element-animation-behavior-extracted.js
index dd799aa..65dda47 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-shared-element-animation-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-shared-element-animation-behavior-extracted.js
@@ -31,7 +31,7 @@
         return null;
       };
 
-      var from = fromPage.sharedElements[config.id]
+      var from = fromPage.sharedElements[config.id];
       var to = toPage.sharedElements[config.id];
 
       if (!from || !to) {
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt
index 85a9d94..b768f8c 100644
--- a/third_party/polymer/v1_0/components_summary.txt
+++ b/third_party/polymer/v1_0/components_summary.txt
@@ -54,9 +54,9 @@
 
 Name: iron-fit-behavior
 Repository: https://github.com/PolymerElements/iron-fit-behavior.git
-Tree: v1.2.5
-Revision: 8bc774b9376882ae5ba09f9e007764c6ee9fbbca
-Tree link: https://github.com/PolymerElements/iron-fit-behavior/tree/v1.2.5
+Tree: v2.1.0
+Revision: d112c1c0c4fb6ac7a848c8a5712d9a9021242bdb
+Tree link: https://github.com/PolymerElements/iron-fit-behavior/tree/v2.1.0
 
 Name: iron-flex-layout
 Repository: https://github.com/PolymerElements/iron-flex-layout.git
@@ -180,9 +180,9 @@
 
 Name: neon-animation
 Repository: https://github.com/PolymerElements/neon-animation.git
-Tree: v1.2.4
-Revision: bd4f50c9a84023363e80513e10456a18232b21a7
-Tree link: https://github.com/PolymerElements/neon-animation/tree/v1.2.4
+Tree: v2.1.0
+Revision: e49c5715dd27f8f13dfa4c480b049827ddff4e51
+Tree link: https://github.com/PolymerElements/neon-animation/tree/v2.1.0
 
 Name: paper-behaviors
 Repository: https://github.com/PolymerElements/paper-behaviors.git
diff --git a/tools/check_grd_for_unused_strings.py b/tools/check_grd_for_unused_strings.py
index 7e5e919..d997db6 100755
--- a/tools/check_grd_for_unused_strings.py
+++ b/tools/check_grd_for_unused_strings.py
@@ -127,6 +127,7 @@
   # If no GRD files were given, default them:
   if len(grd_files) == 0:
     ash_base_dir = os.path.join(src_dir, 'ash')
+    ash_components_dir = os.path.join(ash_base_dir, 'components')
     chrome_dir = os.path.join(src_dir, 'chrome')
     chrome_app_dir = os.path.join(chrome_dir, 'app')
     chrome_app_res_dir = os.path.join(chrome_app_dir, 'resources')
@@ -137,6 +138,9 @@
     grd_files = [
       os.path.join(ash_base_dir, 'ash_strings.grd'),
       os.path.join(ash_base_dir, 'resources', 'ash_resources.grd'),
+      os.path.join(ash_components_dir, 'ash_components_strings.grd'),
+      os.path.join(ash_components_dir, 'resources',
+                   'ash_components_resources.grd'),
       os.path.join(chrome_app_dir, 'chromium_strings.grd'),
       os.path.join(chrome_app_dir, 'generated_resources.grd'),
       os.path.join(chrome_app_dir, 'google_chrome_strings.grd'),
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index de21496..5fedfaa4 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '324578'
+CLANG_REVISION = '325667'
 
 use_head_revision = bool(os.environ.get('LLVM_FORCE_HEAD_REVISION', '0')
                          in ('1', 'YES'))
@@ -870,6 +870,8 @@
   parser.add_argument('--use-system-cmake', action='store_true',
                       help='use the cmake from PATH instead of downloading '
                       'and using prebuilt cmake binaries')
+  parser.add_argument('--verify-version',
+                      help='verify that clang has the passed-in version')
   parser.add_argument('--without-android', action='store_false',
                       help='don\'t build Android ASan runtime (linux only)',
                       dest='with_android',
@@ -888,6 +890,12 @@
       args.force_local_build):
     AddSvnToPathOnWin()
 
+  if args.verify_version and args.verify_version != VERSION:
+    print 'VERSION is %s but --verify-version argument was %s, exiting.' % (
+        VERSION, args.verify_version)
+    print 'clang_version in build/toolchain/toolchain.gni is likely outdated.'
+    return 1
+
   global CLANG_REVISION, PACKAGE_VERSION
   if args.print_revision:
     if use_head_revision or args.llvm_force_head_revision:
diff --git a/tools/cygprofile/BUILD.gn b/tools/cygprofile/BUILD.gn
index 0ba8b6a..f5f9016 100644
--- a/tools/cygprofile/BUILD.gn
+++ b/tools/cygprofile/BUILD.gn
@@ -5,9 +5,8 @@
 import("//build/config/android/config.gni")
 
 if (target_cpu == "arm") {
-  static_library("cygprofile") {
+  static_library("lightweight_cygprofile") {
     sources = [
-      "delayed_dumper.cc",
       "lightweight_cygprofile.cc",
       "lightweight_cygprofile.h",
     ]
@@ -18,8 +17,71 @@
     configs -= [ "//build/config/android:default_cygprofile_instrumentation" ]
     configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
   }
+}
 
-  executable("cygprofile_perftests") {
+static_library("cygprofile") {
+  deps = [
+    # This adds uninstrumented symbols to the static library from base.
+    # These symbols are likely *not* to be used because there are many other
+    # duplicates in other objects/libraries.
+    "//base",
+  ]
+
+  if (use_lightweight_order_profiling) {
+    assert(use_order_profiling)
+    assert(target_cpu == "arm")
+    sources = [
+      "delayed_dumper.cc",
+    ]
+    deps += [ ":lightweight_cygprofile" ]
+  } else {
+    sources = [
+      "cygprofile.cc",
+      "cygprofile.h",
+    ]
+  }
+
+  configs -= [ "//build/config/android:default_cygprofile_instrumentation" ]
+  configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
+}
+
+executable("cygprofile_unittests") {
+  testonly = true
+
+  sources = [
+    "cygprofile_unittest.cc",
+  ]
+
+  configs -= [ "//build/config/android:default_cygprofile_instrumentation" ]
+  configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
+
+  deps = [
+    ":cygprofile",
+    "//base",
+    "//testing/gtest",
+  ]
+}
+
+executable("cygprofile_perftests") {
+  testonly = true
+
+  sources = [
+    "cygprofile_perftest.cc",
+  ]
+
+  configs -= [ "//build/config/android:default_cygprofile_instrumentation" ]
+  configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
+
+  deps = [
+    ":cygprofile",
+    "//base",
+    "//testing/gtest",
+    "//testing/perf",
+  ]
+}
+
+if (target_cpu == "arm") {
+  executable("lightweight_cygprofile_perftests") {
     testonly = true
 
     sources = [
@@ -30,7 +92,7 @@
     configs += [ "//build/config/android:no_cygprofile_instrumentation" ]
 
     deps = [
-      ":cygprofile",
+      ":lightweight_cygprofile",
       "//base",
       "//testing/gtest",
       "//testing/perf",
diff --git a/tools/cygprofile/cyglog_to_orderfile.py b/tools/cygprofile/cyglog_to_orderfile.py
index aecb101..0fb2e90 100755
--- a/tools/cygprofile/cyglog_to_orderfile.py
+++ b/tools/cygprofile/cyglog_to_orderfile.py
@@ -13,6 +13,7 @@
 import multiprocessing
 import os
 import re
+import string
 import sys
 import tempfile
 
@@ -122,7 +123,6 @@
     symbol_infos_nested = pool.map(
         symbol_extractor.SymbolInfosFromBinary, obj_files)
     pool.close()
-    pool.join()
     result = []
     for symbol_infos in symbol_infos_nested:
       result += symbol_infos
@@ -201,6 +201,47 @@
       raise _SymbolNotFoundException(offset)
 
 
+def _ParseLogLines(log_file_lines):
+  """Parses a merged cyglog produced by mergetraces.py.
+
+  Args:
+    log_file_lines: array of lines in log file produced by profiled run
+
+    Below is an example of a small log file:
+    5086e000-52e92000 r-xp 00000000 b3:02 51276      libchromeview.so
+    secs       usecs      pid:threadid    func
+    START
+    1314897086 795828     3587:1074648168 0x509e105c
+    1314897086 795874     3587:1074648168 0x509e0eb4
+    1314897086 796326     3587:1074648168 0x509e0e3c
+    1314897086 796552     3587:1074648168 0x509e07bc
+    END
+
+  Returns:
+    An ordered list of callee offsets.
+  """
+  call_lines = []
+  vm_start = 0
+  line = log_file_lines[0]
+  assert 'r-xp' in line
+  end_index = line.find('-')
+  vm_start = int(line[:end_index], 16)
+  for line in log_file_lines[3:]:
+    fields = line.split()
+    if len(fields) == 4:
+      call_lines.append(fields)
+    else:
+      assert fields[0] == 'END'
+  # Convert strings to int in fields.
+  call_info = []
+  for call_line in call_lines:
+    addr = int(call_line[3], 16)
+    if vm_start < addr:
+      addr -= vm_start
+      call_info.append(addr)
+  return call_info
+
+
 def _WarnAboutDuplicates(offsets):
   """Warns about duplicate offsets.
 
@@ -234,7 +275,9 @@
   parser.add_argument('--target-arch', required=False,
                       choices=['arm', 'arm64', 'x86', 'x86_64', 'x64', 'mips'],
                       help='The target architecture for libchrome.so')
-  parser.add_argument('--reached-offsets', type=str, required=True,
+  parser.add_argument('--merged-cyglog', type=str, required=False,
+                      help='Path to the merged cyglog')
+  parser.add_argument('--reached-offsets', type=str, required=False,
                       help='Path to the reached offsets')
   parser.add_argument('--native-library', type=str, required=True,
                       help='Path to the unstripped instrumented library')
@@ -247,13 +290,20 @@
   parser = _CreateArgumentParser()
   args = parser.parse_args()
 
+  assert bool(args.merged_cyglog) ^ bool(args.reached_offsets)
+
   if not args.target_arch:
     args.arch = cygprofile_utils.DetectArchitecture()
   symbol_extractor.SetArchitecture(args.target_arch)
 
   obj_dir = cygprofile_utils.GetObjDir(args.native_library)
 
-  offsets = _ReadReachedOffsets(args.reached_offsets)
+  offsets = []
+  if args.merged_cyglog:
+    log_file_lines = map(string.rstrip, open(args.merged_cyglog).readlines())
+    offsets = _ParseLogLines(log_file_lines)
+  else:
+    offsets = _ReadReachedOffsets(args.reached_offsets)
   assert offsets
   _WarnAboutDuplicates(offsets)
 
diff --git a/tools/cygprofile/cyglog_to_orderfile_unittest.py b/tools/cygprofile/cyglog_to_orderfile_unittest.py
index 2aae4d4..37722570 100755
--- a/tools/cygprofile/cyglog_to_orderfile_unittest.py
+++ b/tools/cygprofile/cyglog_to_orderfile_unittest.py
@@ -76,6 +76,17 @@
     if failure_items:
       raise self.failureException('\n'.join(failure_items))
 
+  def testParseLogLines(self):
+    lines = """5086e000-52e92000 r-xp 00000000 b3:02 51276      libchromeview.so
+secs       usecs      pid:threadid    func
+START
+1314897086 795828     3587:1074648168 0x509e105c
+1314897086 795874     3587:1074648168 0x509e0eb4
+END""".split('\n')
+    offsets = cyglog_to_orderfile._ParseLogLines(lines)
+    self.assertListEqual(
+        offsets, [0x509e105c - 0x5086e000, 0x509e0eb4 - 0x5086e000])
+
   def testWarnAboutDuplicates(self):
     offsets = [0x1, 0x2, 0x3]
     self.assertTrue(cyglog_to_orderfile._WarnAboutDuplicates(offsets))
diff --git a/tools/cygprofile/cygprofile.cc b/tools/cygprofile/cygprofile.cc
new file mode 100644
index 0000000..7c04fed
--- /dev/null
+++ b/tools/cygprofile/cygprofile.cc
@@ -0,0 +1,400 @@
+// Copyright (c) 2011 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 "tools/cygprofile/cygprofile.h"
+
+#include <fcntl.h>
+#include <pthread.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <cstdio>
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/containers/hash_tables.h"
+#include "base/files/scoped_file.h"
+#include "base/lazy_instance.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/stringprintf.h"
+#include "base/synchronization/lock.h"
+
+namespace cygprofile {
+namespace {
+
+// Allow 8 MBytes of data for each thread log.
+const size_t kMaxBufferSize = 8 * 1024 * 1024 / sizeof(LogEntry);
+
+// Have the background internal thread do its flush every 15 sec.
+const int kFlushThreadIdleTimeSec = 15;
+
+const char kLogFileNamePrefix[] = "/data/local/tmp/chrome/cyglog/";
+
+// "cyglog.PID.LWP.PPID"
+const char kLogFilenameFormat[] = "%scyglog.%d.%d-%d";
+
+// Magic value of above to prevent instrumentation. Used when ThreadLog is being
+// constructed (to prevent reentering by malloc, for example) and by the flush
+// log thread (to prevent it from being logged0.
+ThreadLog* const kMagicBeingConstructed = reinterpret_cast<ThreadLog*>(1);
+
+// Per-thread pointer to the current log object.
+pthread_key_t g_tls_slot;
+
+// Used to initialize the tls slot, once per the entire process.
+pthread_once_t g_tls_slot_initializer_once = PTHREAD_ONCE_INIT;
+
+// This variable is to prevent re-entrancy in the __cyg_profile_func_enter()
+// while the TLS slot itself is being initialized. Volatile here is required
+// to avoid compiler optimizations as this need to be read in a re-entrant way.
+// This variable is written by one thread only, which is the first thread that
+// happens to run the TLSSlotInitializer(). In practice this will happen very
+// early in the startup process, as soon as the first instrumented function is
+// called.
+volatile bool g_tls_slot_being_initialized = false;
+
+// Initializes the global TLS slot. This is invoked only once per process.
+static void TLSSlotInitializer()
+{
+    g_tls_slot_being_initialized = true;
+    PCHECK(0 == pthread_key_create(&g_tls_slot, NULL));
+    g_tls_slot_being_initialized = false;
+}
+
+// Returns light-weight process ID. On Linux, this is a system-wide unique
+// thread id.
+pid_t GetTID() {
+  return syscall(__NR_gettid);
+}
+
+timespec GetCurrentTime() {
+  timespec timestamp;
+  clock_gettime(CLOCK_MONOTONIC, &timestamp);
+  return timestamp;
+}
+
+// Sleeps for |sec| seconds.
+void SleepSec(int sec) {
+  for (int secs_to_sleep = sec; secs_to_sleep != 0;)
+    secs_to_sleep = sleep(secs_to_sleep);
+}
+
+// Exposes the string header that will appear at the top of every trace file.
+// This string contains memory mapping information for the mapped
+// library/executable which is used offline during symbolization. Note that
+// this class is meant to be instantiated once per process and lazily (during
+// the first flush).
+struct ImmutableFileHeaderLine {
+  ImmutableFileHeaderLine() : value(MakeFileHeaderLine()) {}
+
+  const std::string value;
+
+ private:
+  // Returns whether the integer representation of the hexadecimal address
+  // stored in |line| at position |start_offset| was successfully stored in
+  // |result|.
+  static bool ParseAddress(const std::string& line,
+                           size_t start_offset,
+                           size_t length,
+                           uint64_t* result) {
+    if (start_offset >= line.length())
+      return false;
+
+    uint64_t address;
+    const bool ret = HexStringToUInt64(
+        base::StringPiece(line.c_str() + start_offset, length), &address);
+    if (!ret)
+      return false;
+
+    *result = address;
+    return true;
+  }
+
+  // Parses /proc/self/maps and returns a two line string such as:
+  // 758c6000-79f4b000 r-xp 00000000 b3:17 309475 libchrome.2009.0.so
+  // secs    usecs   pid:threadid    func
+  static std::string MakeFileHeaderLine() {
+    std::ifstream mapsfile("/proc/self/maps");
+    CHECK(mapsfile.good());
+    std::string result;
+
+    for (std::string line; std::getline(mapsfile, line); ) {
+      if (line.find("r-xp") == std::string::npos)
+        continue;
+
+      const size_t address_length = line.find('-');
+      uint64_t start_address = 0;
+      CHECK(ParseAddress(line, 0, address_length, &start_address));
+
+      uint64_t end_address = 0;
+      CHECK(ParseAddress(line, address_length + 1, address_length,
+                         &end_address));
+
+      const uintptr_t current_func_addr = reinterpret_cast<uintptr_t>(
+          &MakeFileHeaderLine);
+      if (current_func_addr >= start_address &&
+          current_func_addr < end_address) {
+        result.swap(line);
+        break;
+      }
+    }
+    CHECK(!result.empty());
+    result.append("\nsecs\tusecs\tpid:threadid\tfunc\n");
+    return result;
+  }
+};
+
+base::LazyInstance<ThreadLogsManager>::Leaky g_logs_manager =
+    LAZY_INSTANCE_INITIALIZER;
+
+base::LazyInstance<ImmutableFileHeaderLine>::Leaky g_file_header_line =
+    LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
+
+// Custom thread implementation that joins on destruction. Note that
+// base::Thread has non-trivial dependencies on e.g. AtExitManager which makes
+// it hard to use it early.
+class Thread {
+ public:
+  Thread(const base::Closure& thread_callback)
+      : thread_callback_(thread_callback) {
+    PCHECK(0 == pthread_create(&handle_, NULL, &Thread::EntryPoint, this));
+  }
+
+  ~Thread() {
+    PCHECK(0 == pthread_join(handle_, NULL));
+  }
+
+ private:
+  static void* EntryPoint(void* data) {
+    // Disable logging on this thread. Although this routine is not instrumented
+    // (cygprofile.gyp provides that), the called routines are and thus will
+    // call instrumentation.
+    pthread_once(&g_tls_slot_initializer_once, TLSSlotInitializer);
+    ThreadLog* thread_log = reinterpret_cast<ThreadLog*>(
+        pthread_getspecific(g_tls_slot));
+    CHECK(thread_log == NULL);  // Must be 0 as this is a new thread.
+    PCHECK(0 == pthread_setspecific(g_tls_slot, kMagicBeingConstructed));
+
+    Thread* const instance = reinterpret_cast<Thread*>(data);
+    instance->thread_callback_.Run();
+    return NULL;
+  }
+
+  const base::Closure thread_callback_;
+  pthread_t handle_;
+
+  DISALLOW_COPY_AND_ASSIGN(Thread);
+};
+
+// Single log entry recorded for each function call.
+LogEntry::LogEntry(const void* address, pid_t pid, pid_t tid)
+    : time(GetCurrentTime()), pid(pid), tid(tid), address(address) {}
+
+ThreadLog::ThreadLog()
+    : pid_(getpid()),
+      tid_(GetTID()),
+      in_use_(false),
+      flush_callback_(
+          base::Bind(&ThreadLog::FlushInternal, base::Unretained(this))) {}
+
+ThreadLog::ThreadLog(const FlushCallback& flush_callback)
+    : pid_(getpid()),
+      tid_(GetTID()),
+      in_use_(false),
+      flush_callback_(flush_callback) {}
+
+ThreadLog::~ThreadLog() {
+  PCHECK(0 == pthread_setspecific(g_tls_slot, NULL));
+}
+
+void ThreadLog::AddEntry(void* address) {
+  if (in_use_)
+    return;
+  in_use_ = true;
+
+  DCHECK_EQ(tid_, GetTID());
+  bool did_insert = called_functions_.insert(address).second;
+
+  if (did_insert) {
+    base::AutoLock auto_lock(lock_);
+    entries_.emplace_back(address, pid_, tid_);
+    // Crash in a quickly understandable way instead of crashing (or maybe not
+    // though) due to OOM.
+    CHECK_LE(entries_.size(), kMaxBufferSize);
+  }
+
+  in_use_ = false;
+}
+
+void ThreadLog::TakeEntries(std::vector<LogEntry>* destination) {
+  base::AutoLock auto_lock(lock_);
+  destination->swap(entries_);
+  base::STLClearObject(&entries_);
+}
+
+void ThreadLog::Flush(std::vector<LogEntry>* entries) const {
+  flush_callback_.Run(entries);
+}
+
+void ThreadLog::FlushInternal(std::vector<LogEntry>* entries) const {
+  const std::string log_filename(
+      base::StringPrintf(
+          kLogFilenameFormat, kLogFileNamePrefix, getpid(), tid_, getppid()));
+  const base::ScopedFILE file(fopen(log_filename.c_str(), "a"));
+  CHECK(file.get());
+
+  const long offset = ftell(file.get());
+  if (offset == 0)
+    fprintf(file.get(), "%s", g_file_header_line.Get().value.c_str());
+
+  for (std::vector<LogEntry>::const_iterator it = entries->begin();
+       it != entries->end(); ++it) {
+    fprintf(file.get(), "%ld %ld\t%d:%d\t%p\n", it->time.tv_sec,
+            it->time.tv_nsec / 1000, it->pid, it->tid, it->address);
+  }
+
+  base::STLClearObject(entries);
+}
+
+ThreadLogsManager::ThreadLogsManager()
+    : wait_callback_(base::Bind(&SleepSec, kFlushThreadIdleTimeSec)) {
+}
+
+ThreadLogsManager::ThreadLogsManager(const base::Closure& wait_callback,
+                                     const base::Closure& notify_callback)
+
+    : wait_callback_(wait_callback),
+      notify_callback_(notify_callback) {
+}
+
+ThreadLogsManager::~ThreadLogsManager() {
+  // Note that the internal thread does some work until it sees |flush_thread_|
+  // = NULL.
+  std::unique_ptr<Thread> flush_thread;
+  {
+    base::AutoLock auto_lock(lock_);
+    flush_thread_.swap(flush_thread);
+  }
+  flush_thread.reset();  // Joins the flush thread.
+}
+
+void ThreadLogsManager::AddLog(std::unique_ptr<ThreadLog> new_log) {
+  base::AutoLock auto_lock(lock_);
+
+  if (logs_.empty())
+    StartInternalFlushThread_Locked();
+
+  logs_.push_back(std::move(new_log));
+}
+
+void ThreadLogsManager::StartInternalFlushThread_Locked() {
+  lock_.AssertAcquired();
+  CHECK(!flush_thread_);
+  // Note that the |flush_thread_| joins at destruction which guarantees that it
+  // will never outlive |this|, i.e. it's safe not to use ref-counting.
+  flush_thread_.reset(
+      new Thread(base::Bind(&ThreadLogsManager::FlushAllLogsOnFlushThread,
+                            base::Unretained(this))));
+}
+
+// Type used below for flushing.
+struct LogData {
+  LogData(ThreadLog* thread_log) : thread_log(thread_log) {}
+
+  ThreadLog* const thread_log;
+  std::vector<LogEntry> entries;
+};
+
+void ThreadLogsManager::FlushAllLogsOnFlushThread() {
+  while (true) {
+    {
+      base::AutoLock auto_lock(lock_);
+      // The |flush_thread_| field is reset during destruction.
+      if (!flush_thread_)
+        return;
+    }
+    // Sleep for a few secs and then flush all thread's buffers. There is a
+    // danger that, when quitting Chrome, this thread may see unallocated data
+    // and segfault. We do not care because we need logs when Chrome is working.
+    wait_callback_.Run();
+
+    // Copy the ThreadLog pointers to avoid acquiring both the logs manager's
+    // lock and the one for individual thread logs.
+    std::vector<ThreadLog*> thread_logs_copy;
+    {
+      base::AutoLock auto_lock(lock_);
+      for (const auto& log : logs_)
+        thread_logs_copy.push_back(log.get());
+    }
+
+    // Move the logs' data before flushing them so that the mutexes are not
+    // acquired for too long.
+    std::vector<LogData> logs;
+    for (std::vector<ThreadLog*>::const_iterator it =
+             thread_logs_copy.begin();
+         it != thread_logs_copy.end(); ++it) {
+      ThreadLog* const thread_log = *it;
+      LogData log_data(thread_log);
+      logs.push_back(log_data);
+      thread_log->TakeEntries(&logs.back().entries);
+    }
+
+    for (std::vector<LogData>::iterator it = logs.begin();
+         it != logs.end(); ++it) {
+      if (!it->entries.empty())
+        it->thread_log->Flush(&it->entries);
+    }
+
+    if (!notify_callback_.is_null())
+      notify_callback_.Run();
+  }
+}
+
+extern "C" {
+
+// The GCC compiler callbacks, called on every function invocation providing
+// addresses of caller and callee codes.
+void __cyg_profile_func_enter(void* this_fn, void* call_site)
+    __attribute__((no_instrument_function));
+void __cyg_profile_func_exit(void* this_fn, void* call_site)
+    __attribute__((no_instrument_function));
+
+void __cyg_profile_func_enter(void* this_fn, void* callee_unused) {
+  // Avoid re-entrancy while initializing the TLS slot (once per process).
+  if (g_tls_slot_being_initialized)
+    return;
+
+  pthread_once(&g_tls_slot_initializer_once, TLSSlotInitializer);
+  ThreadLog* thread_log = reinterpret_cast<ThreadLog*>(
+      pthread_getspecific(g_tls_slot));
+
+  if (thread_log == NULL) {
+    PCHECK(0 == pthread_setspecific(g_tls_slot, kMagicBeingConstructed));
+    thread_log = new ThreadLog();
+    CHECK(thread_log);
+    g_logs_manager.Pointer()->AddLog(base::WrapUnique(thread_log));
+    PCHECK(0 == pthread_setspecific(g_tls_slot, thread_log));
+  }
+
+  if (thread_log != kMagicBeingConstructed)
+    thread_log->AddEntry(this_fn);
+}
+
+void __cyg_profile_func_exit(void* this_fn, void* call_site) {}
+
+}  // extern "C"
+}  // namespace cygprofile
diff --git a/tools/cygprofile/cygprofile.h b/tools/cygprofile/cygprofile.h
new file mode 100644
index 0000000..97684e78
--- /dev/null
+++ b/tools/cygprofile/cygprofile.h
@@ -0,0 +1,169 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Tool to log the execution of the process (Chrome). Writes logs containing
+// time and address of the callback being called for the first time.
+//
+// For performance reasons logs are buffered. Every thread has its own buffer
+// and log file so the contention between threads is minimal. As a side-effect,
+// functions called might be mentioned in many thread logs.
+//
+// A special thread is created in the process to periodically flush logs for all
+// threads in case the thread had stopped before flushing its logs.
+//
+// Also note that the instrumentation code is self-activated. It begins to
+// record the log data when it is called first, including the run-time startup.
+// Have it in mind when modifying it, in particular do not use global objects
+// with constructors as they are called during startup (too late for us).
+
+#ifndef TOOLS_CYGPROFILE_CYGPROFILE_H_
+#define TOOLS_CYGPROFILE_CYGPROFILE_H_
+
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/containers/hash_tables.h"
+#include "base/macros.h"
+#include "base/synchronization/lock.h"
+#include "build/build_config.h"
+
+#if !defined(OS_ANDROID)
+// This is only supported on Android thanks to the fact that on Android
+// processes (other than the system's zygote) don't fork.
+//
+// To make cygprofile truly work (i.e. without any deadlock) on Chrome
+// platforms that use fork(), cygprofile.cc should be written in a way that
+// guarantees that:
+// - No lock is acquired by a foreign thread during fork(). In particular this
+// means that cygprofile.cc should not perform any heap allocation (since heap
+// allocators, including TCMalloc generally use locks).
+// - Only cygprofile.cc uses pthread_atfork() in the whole process. Unlike POSIX
+// signals, pthread_atfork() doesn't provide a way to install multiple handlers.
+// Calling pthread_atfork() in cygprofile.cc would override any handler that
+// could have been installed previously.
+//
+// Chrome happens to violate the first requirement at least once by having its
+// process launcher thread fork. However the child process in that case, when
+// it's not instrumented with cygprofile, directly calls exec(). This is safe
+// since the child process doesn't try to release a lock acquired by another
+// thread in the parent process which would lead to a deadlock. This problem was
+// actually observed by trying to port the current version of cygprofile.cc to
+// Linux.
+#error This is only supported on Android.
+#endif
+
+// The following is only exposed for testing.
+namespace cygprofile {
+
+class Thread;
+
+// Single log entry recorded for each function call.
+struct LogEntry {
+  LogEntry(const void* address, pid_t pid, pid_t tid);
+
+  const timespec time;
+  const pid_t pid;
+  const pid_t tid;
+  const void* const address;
+};
+
+// Per-thread function calls log.
+class ThreadLog {
+ public:
+  // Callback invoked for flushing that can be provided for testing.
+  typedef base::Callback<void (std::vector<LogEntry>*)> FlushCallback;
+
+  ThreadLog();
+
+  // Used for testing.
+  ThreadLog(const FlushCallback& flush_callback);
+
+  ~ThreadLog();
+
+  // Must only be called from the thread this ThreadLog instance is watching.
+  void AddEntry(void* address);
+
+  // Can be called from any thread.
+  void TakeEntries(std::vector<LogEntry>* output);
+
+  // Flushes the provided vector of entries to a file and clears it. Note that
+  // this can be called from any thread.
+  void Flush(std::vector<LogEntry>* entries) const;
+
+ private:
+  // Default implementation (that can be overridden for testing) of the method
+  // above.
+  void FlushInternal(std::vector<LogEntry>* entries) const;
+
+  // Process ID, as returned by getpid().
+  const pid_t pid_;
+
+  // Thread identifier as Linux kernel shows it.  LWP (light-weight process) is
+  // a unique ID of the thread in the system, unlike pthread_self() which is the
+  // same for fork()-ed threads.
+  const pid_t tid_;
+
+  // Current thread is inside the instrumentation routine.
+  bool in_use_;
+
+  // Callback used to flush entries.
+  const FlushCallback flush_callback_;
+
+  // Keeps track of all functions that have been logged on this thread so we do
+  // not record duplicates.
+  base::hash_set<void*> called_functions_;
+
+  // A lock that guards |entries_| usage between per-thread instrumentation
+  // routine and timer flush callback. So the contention could happen only
+  // during the flush, every 15 secs.
+  base::Lock lock_;
+
+  std::vector<LogEntry> entries_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadLog);
+};
+
+// Manages a list of per-thread logs.
+class ThreadLogsManager {
+ public:
+  ThreadLogsManager();
+
+  // Used for testing. The provided callbacks are used for testing to
+  // synchronize the internal thread with the unit test running on the main
+  // thread.
+  ThreadLogsManager(const base::Closure& wait_callback,
+                    const base::Closure& notify_callback);
+
+  ~ThreadLogsManager();
+
+  // Can be called from any thread.
+  void AddLog(std::unique_ptr<ThreadLog> new_log);
+
+ private:
+  void StartInternalFlushThread_Locked();
+
+  // Flush thread's entry point.
+  void FlushAllLogsOnFlushThread();
+
+  // Used to make the internal thread sleep before each flush iteration.
+  const base::Closure wait_callback_;
+  // Used to trigger a notification when a flush happened on the internal
+  // thread.
+  const base::Closure notify_callback_;
+
+  // Protects the state below.
+  base::Lock lock_;
+  std::unique_ptr<Thread> flush_thread_;
+  std::vector<std::unique_ptr<ThreadLog>> logs_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadLogsManager);
+};
+
+}  // namespace cygprofile
+
+#endif  // TOOLS_CYGPROFILE_CYGPROFILE_H_
diff --git a/tools/cygprofile/cygprofile_perftest.cc b/tools/cygprofile/cygprofile_perftest.cc
new file mode 100644
index 0000000..ae8fe3e7
--- /dev/null
+++ b/tools/cygprofile/cygprofile_perftest.cc
@@ -0,0 +1,67 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "tools/cygprofile/cygprofile.h"
+
+#include <cstdint>
+#include <vector>
+
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/perf/perf_test.h"
+
+namespace cygprofile {
+
+namespace {
+
+void AddEntryCost(int iterations, int addresses_count) {
+  // This is intentionally leaky. ThreadLog() destructor would call abort(),
+  // limiting us to a single test. Leaking ThreadLog is fine as long as we clean
+  // up the entries.
+  auto* thread_log = new ThreadLog();
+
+  auto tick = base::TimeTicks::Now();
+  for (int i = 0; i < iterations; i++) {
+    for (int address = 0; address < addresses_count; address++) {
+      thread_log->AddEntry(reinterpret_cast<void*>(address));
+    }
+  }
+  auto tock = base::TimeTicks::Now();
+  double nanos = static_cast<double>((tock - tick).InNanoseconds());
+  auto ns_per_call =
+      nanos / (iterations * static_cast<double>(addresses_count));
+  auto modifier = base::StringPrintf("_%d_%d", iterations, addresses_count);
+  perf_test::PrintResult("AddEntryCostPerCall", modifier, "", ns_per_call, "ns",
+                         true);
+
+  // Entries cleanup, see comment at the beginning of the function.
+  std::vector<LogEntry> entries;
+  thread_log->TakeEntries(&entries);
+}
+}  // namespace
+
+TEST(CygprofilePerfTest, CreateEntries_10_10000) {
+  AddEntryCost(10, 10000);
+}
+
+TEST(CygprofilePerfTest, CreateEntries_100_10000) {
+  AddEntryCost(100, 10000);
+}
+
+TEST(CygprofilePerfTest, CreateEntries_10_100000) {
+  AddEntryCost(10, 100000);
+}
+
+TEST(CygprofilePerfTest, CreateEntries_100_1000000) {
+  AddEntryCost(100, 100000);
+}
+
+}  // namespace cygprofile
+
+// Custom runner implementation since base's one requires JNI on Android.
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/tools/cygprofile/cygprofile_unittest.cc b/tools/cygprofile/cygprofile_unittest.cc
new file mode 100644
index 0000000..5be4804
--- /dev/null
+++ b/tools/cygprofile/cygprofile_unittest.cc
@@ -0,0 +1,106 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "tools/cygprofile/cygprofile.h"
+
+#include <stdint.h>
+#include <sys/time.h>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/synchronization/waitable_event.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cygprofile {
+namespace {
+
+void FlushEntries(std::vector<LogEntry>* destination,
+                  std::vector<LogEntry>* entries) {
+  CHECK_EQ(0U, destination->size());
+  // Move the provided |entries| vector to the provided |destination| so that
+  // the unit test that triggered the flush can check it.
+  destination->swap(*entries);
+}
+
+// Flush callback that should not be invoked.
+void CheckFlushDoesNotHappen(std::vector<LogEntry>* entries) {
+  NOTREACHED();
+}
+
+uint64_t GetUsecSecTimeFromTimeSpec(struct timespec timespec) {
+  return timespec.tv_sec * 1000 * 1000 + timespec.tv_nsec / 1000;
+}
+
+TEST(CygprofileTest, ThreadLogBasic) {
+  ThreadLog thread_log(base::Bind(&CheckFlushDoesNotHappen));
+
+  thread_log.AddEntry(reinterpret_cast<void*>(0x2));
+  thread_log.AddEntry(reinterpret_cast<void*>(0x1));
+
+  std::vector<LogEntry> entries;
+  thread_log.TakeEntries(&entries);
+
+  ASSERT_EQ(2U, entries.size());
+  // The entries should appear in their insertion order.
+  const LogEntry& first_entry = entries[0];
+  ASSERT_EQ(reinterpret_cast<uintptr_t>(first_entry.address), 2U);
+  ASSERT_EQ(getpid(), first_entry.pid);
+  ASSERT_LT(0, first_entry.tid);
+
+  const LogEntry& second_entry = entries[1];
+  ASSERT_EQ(1U, reinterpret_cast<uintptr_t>(second_entry.address));
+  ASSERT_EQ(first_entry.pid, second_entry.pid);
+  ASSERT_EQ(first_entry.tid, second_entry.tid);
+
+  ASSERT_GE(GetUsecSecTimeFromTimeSpec(second_entry.time),
+            GetUsecSecTimeFromTimeSpec(first_entry.time));
+}
+
+TEST(CygprofileTest, ManagerBasic) {
+  base::WaitableEvent wait_event(
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED);
+  base::WaitableEvent notify_event(
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  ThreadLogsManager manager(
+      base::Bind(&base::WaitableEvent::Wait, base::Unretained(&wait_event)),
+      base::Bind(&base::WaitableEvent::Signal,
+                 base::Unretained(&notify_event)));
+
+  std::vector<LogEntry> entries;
+  std::unique_ptr<ThreadLog> thread_log(
+      new ThreadLog(base::Bind(&FlushEntries, base::Unretained(&entries))));
+
+  thread_log->AddEntry(reinterpret_cast<void*>(0x2));
+  thread_log->AddEntry(reinterpret_cast<void*>(0x3));
+
+  // This should make the manager spawn its internal flush thread which will
+  // wait for a notification before it starts doing some work.
+  manager.AddLog(std::move(thread_log));
+
+  EXPECT_EQ(0U, entries.size());
+  // This will wake up the internal thread.
+  wait_event.Signal();
+  // Now it's our turn to wait until it performed the flush.
+  notify_event.Wait();
+
+  // The flush should have moved the data to the local vector of entries.
+  EXPECT_EQ(2U, entries.size());
+  ASSERT_EQ(2U, reinterpret_cast<uintptr_t>(entries[0].address));
+  ASSERT_EQ(3U, reinterpret_cast<uintptr_t>(entries[1].address));
+}
+
+}  // namespace
+}  // namespace cygprofile
+
+// Custom runner implementation since base's one requires JNI on Android.
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/tools/cygprofile/mergetraces.py b/tools/cygprofile/mergetraces.py
new file mode 100755
index 0000000..2ac8393
--- /dev/null
+++ b/tools/cygprofile/mergetraces.py
@@ -0,0 +1,254 @@
+#!/usr/bin/python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Use: ../mergetraces.py `ls cyglog.* -Sr` > merged_cyglog
+
+""""Merge multiple logs files from different processes into a single log.
+
+Given two log files of execution traces, merge the traces into a single trace.
+Merging will use timestamps (i.e. the first two columns of logged calls) to
+create a single log that is an ordered trace of calls by both processes.
+"""
+
+import optparse
+import string
+import sys
+
+
+def ParseLogLines(lines):
+  """Parse log file lines.
+
+  Args:
+    lines: lines from log file produced by profiled run
+
+    Below is an example of a small log file:
+    5086e000-52e92000 r-xp 00000000 b3:02 51276      libchromeview.so
+    secs       usecs      pid:threadid    func
+    START
+    1314897086 795828     3587:1074648168 0x509e105c
+    1314897086 795874     3587:1074648168 0x509e0eb4
+    1314897086 796326     3587:1074648168 0x509e0e3c
+    1314897086 796552     3587:1074648168 0x509e07bc
+    END
+
+  Returns:
+    tuple conisiting of 1) an ordered list of the logged calls, as an array of
+    fields, 2) the virtual start address of the library, used to compute the
+    offset of the symbol in the library and 3) the virtual end address
+  """
+  call_lines = []
+  vm_start = 0
+  vm_end = 0
+  dash_index = lines[0].find ('-')
+  space_index = lines[0].find (' ')
+  vm_start = int (lines[0][:dash_index], 16)
+  vm_end = int (lines[0][dash_index+1:space_index], 16)
+  for line in lines[2:]:
+    line = line.strip()
+    fields = line.split()
+    call_lines.append (fields)
+
+  return (call_lines, vm_start, vm_end)
+
+
+def HasDuplicates(calls):
+  """Makes sure that calls are only logged once.
+
+  Args:
+    calls: list of calls logged
+
+  Returns:
+    boolean indicating if calls has duplicate calls
+  """
+  seen = set([])
+  for call in calls:
+    if call[3] in seen:
+      return True
+    seen.add(call[3])
+  return False
+
+def CheckTimestamps(calls):
+  """Prints warning to stderr if the call timestamps are not in order.
+
+  Args:
+    calls: list of calls logged
+  """
+  index = 0
+  last_timestamp_secs = -1
+  last_timestamp_us = -1
+  while (index < len (calls)):
+    timestamp_secs = int (calls[index][0])
+    timestamp_us = int (calls[index][1])
+    timestamp = (timestamp_secs * 1000000) + timestamp_us
+    last_timestamp = (last_timestamp_secs * 1000000) + last_timestamp_us
+    if (timestamp < last_timestamp):
+      raise Exception("last_timestamp: " + str(last_timestamp_secs)
+                       + " " + str(last_timestamp_us) + " timestamp: "
+                       + str(timestamp_secs) + " " + str(timestamp_us) + "\n")
+    last_timestamp_secs = timestamp_secs
+    last_timestamp_us = timestamp_us
+    index = index + 1
+
+
+def Convert(call_lines, start_address, end_address):
+  """Converts the call addresses to static offsets and removes invalid calls.
+
+  Removes profiled calls not in shared library using start and end virtual
+  addresses, converts strings to integer values, coverts virtual addresses to
+  address in shared library.
+
+  Returns:
+     list of calls as tuples (sec, usec, pid:tid, callee)
+  """
+  converted_calls = []
+  call_addresses = set()
+  for fields in call_lines:
+    secs = int (fields[0])
+    usecs = int (fields[1])
+    callee = int (fields[3], 16)
+    # Eliminate repetitions of the same function.
+    if callee in call_addresses:
+      continue
+    # Eliminate small addresses. It should be safe to do so because these point
+    # before the .text section (it is in .plt or earlier).
+    # TODO(pasko): understand why __cyg_profile_func_enter may output a small
+    # offset sometimes.
+    if callee < start_address + 4096:
+      sys.stderr.write('WARNING: ignoring small address: %s' %
+          hex(callee - start_address))
+      call_addresses.add(callee)
+      continue
+    if start_address <= callee < end_address:
+      converted_calls.append((secs, usecs, fields[2], (callee - start_address)))
+      call_addresses.add(callee)
+  return converted_calls
+
+
+def Timestamp(trace_entry):
+  return int (trace_entry[0]) * 1000000 + int(trace_entry[1])
+
+
+def AddTrace (tracemap, trace):
+  """Adds a trace to the tracemap.
+
+  Adds entries in the trace to the tracemap. All new calls will be added to
+  the tracemap. If the calls already exist in the tracemap then they will be
+  replaced if they happened sooner in the new trace.
+
+  Args:
+    tracemap: the tracemap
+    trace: the trace
+
+  """
+  for trace_entry in trace:
+    call = trace_entry[3]
+    if (not call in tracemap) or (
+        Timestamp(tracemap[call]) > Timestamp(trace_entry)):
+      tracemap[call] = trace_entry
+
+
+def GroupByProcessAndThreadId(input_trace):
+  """Returns an array of traces grouped by pid and tid.
+
+  This is used to make the order of functions not depend on thread scheduling
+  which can be greatly impacted when profiling is done with cygprofile. As a
+  result each thread has its own contiguous segment of code (ordered by
+  timestamp) and processes also have their code isolated (i.e. not interleaved).
+  """
+  def MakeTimestamp(sec, usec):
+    return sec * 1000000 + usec
+
+  def PidAndTidFromString(pid_and_tid):
+    strings = pid_and_tid.split(':')
+    return (int(strings[0]), int(strings[1]))
+
+  tid_to_pid_map = {}
+  pid_first_seen = {}
+  tid_first_seen = {}
+
+  for (sec, usec, pid_and_tid, _) in input_trace:
+    (pid, tid) = PidAndTidFromString(pid_and_tid)
+
+    # Make sure that thread IDs are unique since this is a property we rely on.
+    if tid_to_pid_map.setdefault(tid, pid) != pid:
+      raise Exception(
+          'Seen PIDs %d and %d for TID=%d. Thread-IDs must be unique' % (
+              tid_to_pid_map[tid], pid, tid))
+
+    if not pid in pid_first_seen:
+      pid_first_seen[pid] = MakeTimestamp(sec, usec)
+    if not tid in tid_first_seen:
+      tid_first_seen[tid] = MakeTimestamp(sec, usec)
+
+  def CompareEvents(event1, event2):
+    (sec1, usec1, pid_and_tid, _) = event1
+    (pid1, tid1) = PidAndTidFromString(pid_and_tid)
+    (sec2, usec2, pid_and_tid, _) = event2
+    (pid2, tid2) = PidAndTidFromString(pid_and_tid)
+
+    pid_cmp = cmp(pid_first_seen[pid1], pid_first_seen[pid2])
+    if pid_cmp != 0:
+      return pid_cmp
+    tid_cmp = cmp(tid_first_seen[tid1], tid_first_seen[tid2])
+    if tid_cmp != 0:
+      return tid_cmp
+    return cmp(MakeTimestamp(sec1, usec1), MakeTimestamp(sec2, usec2))
+
+  return sorted(input_trace, cmp=CompareEvents)
+
+
+def Main():
+  """Merge two traces for code in specified library and write to stdout.
+
+  Merges the two traces and coverts the virtual addresses to the offsets in the
+  library.  First line of merged trace has dummy virtual address of 0-ffffffff
+  so that symbolizing the addresses uses the addresses in the log, since the
+  addresses have already been converted to static offsets.
+  """
+  parser = optparse.OptionParser('usage: %prog trace1 ... traceN')
+  (_, args) = parser.parse_args()
+  if len(args) <= 1:
+    parser.error('expected at least the following args: trace1 trace2')
+
+  step = 0
+
+  # Maps function addresses to their corresponding trace entry.
+  tracemap = dict()
+
+  for trace_file in args:
+    step += 1
+    sys.stderr.write("    " + str(step) + "/" + str(len(args)) +
+                     ": " + trace_file + ":\n")
+
+    trace_lines = map(string.rstrip, open(trace_file).readlines())
+    (trace_calls, trace_start, trace_end) = ParseLogLines(trace_lines)
+    CheckTimestamps(trace_calls)
+    sys.stderr.write("Len: " + str(len(trace_calls)) +
+                     ". Start: " + hex(trace_start) +
+                     ", end: " + hex(trace_end) + '\n')
+
+    trace_calls = Convert(trace_calls, trace_start, trace_end)
+    sys.stderr.write("Converted len: " + str(len(trace_calls)) + "\n")
+
+    AddTrace(tracemap, trace_calls)
+    sys.stderr.write("Merged len: " + str(len(tracemap)) + "\n")
+
+  # Extract the resulting trace from the tracemap
+  merged_trace = []
+  for call in tracemap:
+    merged_trace.append(tracemap[call])
+  merged_trace.sort(key=Timestamp)
+
+  grouped_trace = GroupByProcessAndThreadId(merged_trace)
+
+  print "0-ffffffff r-xp 00000000 xx:00 00000 ./"
+  print "secs\tusecs\tpid:threadid\tfunc"
+  for call in grouped_trace:
+    print (str(call[0]) + "\t" + str(call[1]) + "\t" + call[2] + "\t" +
+           hex(call[3]))
+
+
+if __name__ == '__main__':
+  Main()
diff --git a/tools/cygprofile/mergetraces_unittest.py b/tools/cygprofile/mergetraces_unittest.py
new file mode 100644
index 0000000..de88137
--- /dev/null
+++ b/tools/cygprofile/mergetraces_unittest.py
@@ -0,0 +1,51 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+import mergetraces
+
+class GroupByProcessAndThreadIdTestBasic(unittest.TestCase):
+  def runTest(self):
+    # (sec, usec, 'pid:tid', function address).
+    input_trace = [
+        (100, 10, '2000:2001', 0x5),
+        (100, 11, '2000:2001', 0x3),
+        (100, 13, '2000:1999', 0x8),
+        (100, 14, '2000:2000', 0x7),
+        (120, 13, '2001:2003', 0x9),
+        (150, 12, '2001:2004', 0x6),
+        (180, 11, '2000:2000', 0x1),
+    ]
+
+    # Functions should be grouped by thread-id and PIDs should not be
+    # interleaved.
+    expected_trace = [
+        (100, 10, '2000:2001', 0x5),
+        (100, 11, '2000:2001', 0x3),
+        (100, 13, '2000:1999', 0x8),
+        (100, 14, '2000:2000', 0x7),
+        (180, 11, '2000:2000', 0x1),
+        (120, 13, '2001:2003', 0x9),
+        (150, 12, '2001:2004', 0x6),
+    ]
+
+    grouped_trace = mergetraces.GroupByProcessAndThreadId(input_trace)
+
+    self.assertEqual(grouped_trace, expected_trace)
+
+class GroupByProcessAndThreadIdFailsWithNonUniqueTIDs(unittest.TestCase):
+  def runTest(self):
+    # (sec, usec, 'pid:tid', function address).
+    input_trace = [
+        (100, 10, '1999:2001', 0x5),
+        (100, 10, '1988:2001', 0x5),
+    ]
+
+    try:
+      mergetraces.GroupByProcessAndThreadId(input_trace)
+    except Exception:
+      return
+
+    self.fail('Multiple processes should not have a same thread-ID.')
diff --git a/tools/cygprofile/orderfile_generator_backend.py b/tools/cygprofile/orderfile_generator_backend.py
index 96348a5..147a067 100755
--- a/tools/cygprofile/orderfile_generator_backend.py
+++ b/tools/cygprofile/orderfile_generator_backend.py
@@ -250,7 +250,7 @@
   """Handles compilation of clank."""
 
   def __init__(self, out_dir, step_recorder, arch, jobs, max_load, use_goma,
-               goma_dir):
+               goma_dir, lightweight_instrumentation):
     self._out_dir = out_dir
     self._step_recorder = step_recorder
     self._arch = arch
@@ -258,6 +258,7 @@
     self._max_load = max_load
     self._use_goma = use_goma
     self._goma_dir = goma_dir
+    self._lightweight_instrumentation = lightweight_instrumentation
     lib_chrome_so_dir = 'lib.unstripped'
     self.lib_chrome_so = os.path.join(
         self._out_dir, 'Release', lib_chrome_so_dir, 'libchrome.so')
@@ -287,6 +288,8 @@
         'use_goma=' + str(self._use_goma).lower(),
         'use_order_profiling=' + str(instrumented).lower(),
     ]
+    if instrumented and self._lightweight_instrumentation:
+      args.append('use_lightweight_order_profiling=true')
     if self._goma_dir:
       args += ['goma_dir="%s"' % self._goma_dir]
 
@@ -417,6 +420,8 @@
   generates an updated orderfile.
   """
   _CLANK_REPO = os.path.join(constants.DIR_SOURCE_ROOT, 'clank')
+  _MERGE_TRACES_SCRIPT = os.path.join(
+      constants.DIR_SOURCE_ROOT, 'tools', 'cygprofile', 'mergetraces.py')
   _CYGLOG_TO_ORDERFILE_SCRIPT = os.path.join(
       constants.DIR_SOURCE_ROOT, 'tools', 'cygprofile',
       'cyglog_to_orderfile.py')
@@ -455,12 +460,18 @@
     if options.profile:
       output_directory = os.path.join(self._instrumented_out_dir, 'Release')
       host_cyglog_dir = os.path.join(output_directory, 'cyglog_data')
+      # Only override the defaults when using lightweight instrumentation,
+      # as the regular profiling code is likely too slow for these.
       urls = [profile_android_startup.AndroidProfileTool.TEST_URL]
       use_wpr = True
       simulate_user = False
-      urls = options.urls
-      use_wpr = not options.no_wpr
-      simulate_user = options.simulate_user
+      if options.simulate_user and not options.lightweight_instrumentation:
+        logging.error(
+            '--simulate-user required --lightweight-instrumentation, ignoring.')
+      if options.lightweight_instrumentation:
+        urls = options.urls
+        use_wpr = not options.no_wpr
+        simulate_user = options.simulate_user
       self._profiler = profile_android_startup.AndroidProfileTool(
           output_directory, host_cyglog_dir, use_wpr, urls, simulate_user)
 
@@ -475,6 +486,27 @@
     assert os.path.isdir(constants.DIR_SOURCE_ROOT), 'No src directory found'
     symbol_extractor.SetArchitecture(options.arch)
 
+  def _RunCygprofileUnitTests(self):
+    """Builds, deploys and runs cygprofile_unittests."""
+    # There an no unittests (yet) for the lightweight instrumentation.
+    # TODO(lizeb): Fix this.
+    if self._options.lightweight_instrumentation:
+      return
+    tools_compiler = ClankCompiler(
+        os.path.dirname(constants.GetOutDirectory()),
+        self._step_recorder, self._options.arch, self._options.jobs,
+        self._options.max_load, self._options.use_goma, self._options.goma_dir,
+        self._options.lightweight_instrumentation)
+    tools_compiler.Build(instrumented=False, target='android_tools')
+    self._compiler.Build(instrumented=True, target='cygprofile_unittests')
+
+    self._step_recorder.BeginStep('Deploy and run cygprofile_unittests')
+    exit_code = self._profiler.RunCygprofileTests()
+
+    if exit_code != 0:
+      self._step_recorder.FailStep(
+          'cygprofile_unittests exited with non-0 status: %d' % exit_code)
+
   @staticmethod
   def _RemoveBlanks(src_file, dest_file):
     """A utility to remove blank lines from a file.
@@ -505,14 +537,20 @@
           self._compiler.chrome_apk,
           constants.PACKAGE_INFO['chrome'])
       self._step_recorder.BeginStep('Process cyglog')
-      assert os.path.exists(self._compiler.lib_chrome_so)
-      offsets = process_profiles.GetReachedOffsetsFromDumpFiles(
-          files, self._compiler.lib_chrome_so)
-      if not offsets:
-        raise Exception('No profiler offsets found in {}'.format(
-            '\n'.join(files)))
-      with open(self._MERGED_CYGLOG_FILENAME, 'w') as f:
-        f.write('\n'.join(map(str, offsets)))
+      if self._options.lightweight_instrumentation:
+        assert os.path.exists(self._compiler.lib_chrome_so)
+        offsets = process_profiles.GetReachedOffsetsFromDumpFiles(
+            files, self._compiler.lib_chrome_so)
+        if not offsets:
+          raise Exception('No profiler offsets found in {}'.format(
+                          '\n'.join(files)))
+        with open(self._MERGED_CYGLOG_FILENAME, 'w') as f:
+          f.write('\n'.join(map(str, offsets)))
+      else:
+        with open(self._MERGED_CYGLOG_FILENAME, 'w') as merged_cyglog:
+          self._step_recorder.RunCommand([self._MERGE_TRACES_SCRIPT] + files,
+                                         constants.DIR_SOURCE_ROOT,
+                                         stdout=merged_cyglog)
     except Exception:
       for f in files:
         self._SaveForDebugging(f)
@@ -526,7 +564,10 @@
           '--target-arch=' + self._options.arch,
           '--native-library=' + self._compiler.lib_chrome_so,
           '--output=' + self._GetUnpatchedOrderfileFilename()]
-      command_args.append('--reached-offsets=' + self._MERGED_CYGLOG_FILENAME)
+      if self._options.lightweight_instrumentation:
+        command_args.append('--reached-offsets=' + self._MERGED_CYGLOG_FILENAME)
+      else:
+        command_args.append('--merged-cyglog=' + self._MERGED_CYGLOG_FILENAME)
       self._step_recorder.RunCommand(
           [self._CYGLOG_TO_ORDERFILE_SCRIPT] + command_args)
     except CommandError:
@@ -647,9 +688,13 @@
             self._instrumented_out_dir,
             self._step_recorder, self._options.arch, self._options.jobs,
             self._options.max_load, self._options.use_goma,
-            self._options.goma_dir)
-        _EnsureOrderfileStartsWithAnchorSection(self._GetPathToOrderfile())
-        self._compiler.CompileChromeApk(True)
+            self._options.goma_dir,
+            self._options.lightweight_instrumentation)
+        self._RunCygprofileUnitTests()
+        if self._options.lightweight_instrumentation:
+          _EnsureOrderfileStartsWithAnchorSection(self._GetPathToOrderfile())
+        self._compiler.CompileChromeApk(
+            True, self._options.lightweight_instrumentation)
         self._GenerateAndProcessProfile()
         self._MaybeArchiveOrderfile(self._GetUnpatchedOrderfileFilename())
         profile_uploaded = True
@@ -665,7 +710,8 @@
         self._compiler = ClankCompiler(
             self._uninstrumented_out_dir, self._step_recorder,
             self._options.arch, self._options.jobs, self._options.max_load,
-            self._options.use_goma, self._options.goma_dir)
+            self._options.use_goma, self._options.goma_dir,
+            self._options.lightweight_instrumentation)
         self._compiler.CompileLibchrome(False)
         self._PatchOrderfile()
         # Because identical code folding is a bit different with and without
@@ -702,6 +748,10 @@
   """Creates and returns the argument parser."""
   parser = argparse.ArgumentParser()
   parser.add_argument(
+      '--regular-instrumentation', action='store_false',
+      dest='lightweight_instrumentation',
+      help='Use the regular instrumentation path')
+  parser.add_argument(
       '--buildbot', action='store_true',
       help='If true, the script expects to be run on a buildbot')
   parser.add_argument(
diff --git a/tools/cygprofile/profile_android_startup.py b/tools/cygprofile/profile_android_startup.py
index c71fb53..ba96bce8 100755
--- a/tools/cygprofile/profile_android_startup.py
+++ b/tools/cygprofile/profile_android_startup.py
@@ -393,9 +393,6 @@
       cyglog_dir = os.path.join(self._host_cyglog_dir, 'cyglog')
       files = os.listdir(cyglog_dir)
 
-    if len(files) == 0:
-      raise NoCyglogDataError('No cyglog data was collected')
-
     return [os.path.join(cyglog_dir, x) for x in files]
 
 
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py
index 35c0945..c013f7d 100755
--- a/tools/gn/bootstrap/bootstrap.py
+++ b/tools/gn/bootstrap/bootstrap.py
@@ -180,13 +180,14 @@
 
   write_buildflag_header_manually(
       root_gen_dir,
-      'base/synchronization/synchronization_flags.h',
+      'base/synchronization/synchronization_buildflags.h',
       {'ENABLE_MUTEX_PRIORITY_INHERITANCE': 'false'})
 
-  write_buildflag_header_manually(root_gen_dir, 'base/allocator/features.h',
+  write_buildflag_header_manually(root_gen_dir, 'base/allocator/buildflags.h',
       {'USE_ALLOCATOR_SHIM': 'true' if is_linux else 'false'})
 
-  write_buildflag_header_manually(root_gen_dir, 'base/debug/debugging_flags.h',
+  write_buildflag_header_manually(root_gen_dir,
+                                  'base/debug/debugging_buildflags.h',
       {
           'ENABLE_LOCATION_SOURCE': 'false',
           'ENABLE_PROFILING': 'false',
@@ -195,10 +196,10 @@
       })
 
   write_buildflag_header_manually(root_gen_dir,
-                                  'base/memory/protected_memory_flags.h',
+                                  'base/memory/protected_memory_buildflags.h',
                                   { 'USE_LLD': 'false' })
 
-  write_buildflag_header_manually(root_gen_dir, 'base/cfi_flags.h',
+  write_buildflag_header_manually(root_gen_dir, 'base/cfi_buildflags.h',
       {
           'CFI_CAST_CHECK': 'false',
           'CFI_ICALL_CHECK': 'false',
@@ -219,7 +220,8 @@
     ])
 
   if is_win:
-    write_buildflag_header_manually(root_gen_dir, 'base/win/base_features.h',
+    write_buildflag_header_manually(root_gen_dir,
+                                    'base/win/base_win_buildflags.h',
         {'SINGLE_MODULE_MODE_HANDLE_VERIFIER': 'true'})
 
     write_compiled_message(root_gen_dir,
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids
index f3233044..d4ef37e 100644
--- a/tools/gritsettings/resource_ids
+++ b/tools/gritsettings/resource_ids
@@ -271,11 +271,15 @@
   "ash/ash_strings.grd": {
     "messages": [23520],
   },
-  "ash/resources/ash_resources.grd": {
-    "structures": [23920],
+  "ash/components/ash_components_strings.grd": {
+    "messages": [23950],
   },
-
-  # //blimp used to have IDs from 24200-24299, which are now free to use.
+  "ash/components/resources/ash_components_resources.grd": {
+    "structures": [24250],
+  },
+  "ash/resources/ash_resources.grd": {
+    "structures": [24260],
+  },
 
   "chromecast/browser/cast_browser_resources.grd": {
     "includes": [24300],
diff --git a/tools/gritsettings/startup_resources_mac.txt b/tools/gritsettings/startup_resources_mac.txt
index dbfbe4a..2d021285 100644
--- a/tools/gritsettings/startup_resources_mac.txt
+++ b/tools/gritsettings/startup_resources_mac.txt
@@ -204,9 +204,9 @@
 IDS_FEEDBACK 304
 IDS_HELP_MENU 305
 IDS_ACCNAME_BACK 306
-IDS_ACCNAME_TOOLTIP_BACK 307
+IDS_ACCDESCRIPTION_BACK 307
 IDS_ACCNAME_FORWARD 308
-IDS_ACCNAME_TOOLTIP_FORWARD 309
+IDS_ACCDESCRIPTION_FORWARD 309
 IDS_ACCNAME_RELOAD 310
 IDS_ACCNAME_HOME 311
 IDS_ACCNAME_LOCATION 312
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl
index ff89d5a..8961c2bc 100644
--- a/tools/gritsettings/translation_expectations.pyl
+++ b/tools/gritsettings/translation_expectations.pyl
@@ -22,6 +22,7 @@
     "files": [
       "android_webview/ui/aw_strings.grd",
       "ash/ash_strings.grd",
+      "ash/components/ash_components_strings.grd",
       "chrome/app/chromium_strings.grd",
       "chrome/app/generated_resources.grd",
       "chrome/app/google_chrome_strings.grd",
diff --git a/tools/ipc_fuzzer/message_lib/all_messages.h b/tools/ipc_fuzzer/message_lib/all_messages.h
index ce72950..10a0baf 100644
--- a/tools/ipc_fuzzer/message_lib/all_messages.h
+++ b/tools/ipc_fuzzer/message_lib/all_messages.h
@@ -22,7 +22,6 @@
 #endif
 #include "components/guest_view/common/guest_view_message_generator.h"
 #include "components/network_hints/common/network_hints_message_generator.h"
-#include "components/safe_browsing/common/safebrowsing_message_generator.h"
 #include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/tracing/common/tracing_messages.h"
 #include "content/common/all_messages.h"
diff --git a/tools/json_schema_compiler/cpp_type_generator.py b/tools/json_schema_compiler/cpp_type_generator.py
index 35133865..4db77507 100644
--- a/tools/json_schema_compiler/cpp_type_generator.py
+++ b/tools/json_schema_compiler/cpp_type_generator.py
@@ -253,11 +253,15 @@
     if prop.value is not None:
       cpp_type = self.GetCppType(prop.type_)
       cpp_value = prop.value
+      cpp_name = prop.name
+
       if cpp_type == 'std::string':
-        cpp_value = '"%s"' % cpp_type
+        cpp_value = '"%s"' % cpp_value
+        cpp_type = 'char'
+        cpp_name = '%s[]' % cpp_name
       c.Append(line % {
         "type": cpp_type,
-        "name": prop.name,
+        "name": cpp_name,
         "value": cpp_value
       })
     else:
diff --git a/tools/json_schema_compiler/idl_schema_test.py b/tools/json_schema_compiler/idl_schema_test.py
index 4b47b44f..dd05571 100755
--- a/tools/json_schema_compiler/idl_schema_test.py
+++ b/tools/json_schema_compiler/idl_schema_test.py
@@ -422,7 +422,7 @@
         ('description', 'Double property.'),
         ('jsexterns', None),
         ('type', 'number'),
-        ('value', 42.0),
+        ('value', 42.1),
       ])),
       ('third', OrderedDict([
         ('description', 'String property.'),
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py
index 6dc87a96..b6126b8 100644
--- a/tools/json_schema_compiler/model.py
+++ b/tools/json_schema_compiler/model.py
@@ -375,6 +375,7 @@
     is_allowed_value = (
         '$ref' not in json and
         ('type' not in json or json['type'] == 'integer'
+                            or json['type'] == 'number'
                             or json['type'] == 'string'))
 
     self.value = None
@@ -385,6 +386,8 @@
         # it out for ourselves.
         if isinstance(self.value, int):
           json['type'] = 'integer'
+        elif isinstance(self.value, float):
+          json['type'] = 'double'
         elif isinstance(self.value, basestring):
           json['type'] = 'string'
         else:
diff --git a/tools/json_schema_compiler/test/BUILD.gn b/tools/json_schema_compiler/test/BUILD.gn
index dd08558..20dc149 100644
--- a/tools/json_schema_compiler/test/BUILD.gn
+++ b/tools/json_schema_compiler/test/BUILD.gn
@@ -27,6 +27,7 @@
     "idl_object_types.idl",
     "idl_other_namespace.idl",
     "idl_other_namespace_sub_namespace.idl",
+    "idl_properties.idl",
     "objects.json",
     "objects_movable.idl",
     "objects_movable_json.json",
diff --git a/tools/json_schema_compiler/test/idl_properties.idl b/tools/json_schema_compiler/test/idl_properties.idl
index 5501602..efa1d66 100644
--- a/tools/json_schema_compiler/test/idl_properties.idl
+++ b/tools/json_schema_compiler/test/idl_properties.idl
@@ -9,7 +9,7 @@
     [value=42] static long first();
 
     // Double property.
-    [value=42.0] static double second();
+    [value=42.1] static double second();
 
     // String property.
     [value="hello world"] static DOMString third();
diff --git a/tools/json_schema_compiler/test/idl_schemas_unittest.cc b/tools/json_schema_compiler/test/idl_schemas_unittest.cc
index 1b9fbac3..43e98ff 100644
--- a/tools/json_schema_compiler/test/idl_schemas_unittest.cc
+++ b/tools/json_schema_compiler/test/idl_schemas_unittest.cc
@@ -9,6 +9,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "tools/json_schema_compiler/test/idl_basics.h"
 #include "tools/json_schema_compiler/test/idl_object_types.h"
+#include "tools/json_schema_compiler/test/idl_properties.h"
 
 using test::api::idl_basics::MyType1;
 using test::api::idl_object_types::BarType;
@@ -207,3 +208,9 @@
   EXPECT_TRUE(params->icon.additional_properties.GetString("hello", &tmp));
   EXPECT_EQ("world", tmp);
 }
+
+TEST(IdlCompiler, PropertyValues) {
+  EXPECT_EQ(42, test::api::idl_properties::first);
+  EXPECT_EQ(42.1, test::api::idl_properties::second);
+  EXPECT_STREQ("hello world", test::api::idl_properties::third);
+}
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f85f9729..dbf6a7f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -1891,7 +1891,7 @@
   <int value="7" label="Auth failed because of bad realm or network"/>
   <int value="8" label="kinit exited with unspecified error"/>
   <int value="9" label="net exited with unspecified error"/>
-  <int value="10" label="smdclient exited with unspecified error"/>
+  <int value="10" label="smbclient exited with unspecified error"/>
   <int value="11" label="authpolicy_parser exited with unknown error"/>
   <int value="12" label="Parsing GPOs failed"/>
   <int value="13" label="GPO data is bad"/>
@@ -1915,6 +1915,27 @@
   <int value="29"
       label="Could not store device policy since install attributes are not
              locked yet; stored policy in cache instead."/>
+  <int value="30"
+      label="Domain join failed because the computer organizational unit does
+             not exist."/>
+  <int value="31"
+      label="Domain join failed because the computer organizational unit is
+             invalid."/>
+  <int value="32"
+      label="Setting the computer organizational unit failed with
+             insufficient permissions."/>
+  <int value="33"
+      label="Setting the computer organizational unit failed with unspecified
+             error."/>
+  <int value="34"
+      label="Fetching user policy failed because device policy was
+             unavailable."/>
+  <int value="35"
+      label="Domain join failed because the device is already joined."/>
+  <int value="36"
+      label="Domain join failed because KDC does not support encryption
+             types."/>
+  <int value="37" label="kpasswd exited with unspecified error."/>
 </enum>
 
 <enum name="AutocheckoutBubble">
@@ -12563,6 +12584,7 @@
   <int value="425" label="DeviceMachinePasswordChangeRate"/>
   <int value="426" label="DeviceRollbackAllowedMilestones"/>
   <int value="427" label="DeviceRollbackToTargetVersion"/>
+  <int value="428" label="MachineLevelUserCloudPolicyEnrollmentToken"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -22692,7 +22714,7 @@
   <int value="77" label="FRAMEBUST_BLOCK_INFOBAR_ANDROID"/>
   <int value="78" label="SURVEY_INFOBAR_ANDROID"/>
   <int value="79" label="NEAR_OOM_INFOBAR_ANDROID"/>
-  <int value="80" label="PWA_AMBIENT_BADGE_INFOBAR_DELEGATE_ANDROID"/>
+  <int value="80" label="INSTALLABLE_AMBIENT_BADGE_INFOBAR_DELEGATE"/>
 </enum>
 
 <enum name="InfoBarResponse">
@@ -25760,6 +25782,7 @@
   <int value="-1337185440" label="enable-webvr"/>
   <int value="-1335017208" label="KeyboardLockAPI:enabled"/>
   <int value="-1334327410" label="ash-enable-touch-view-testing"/>
+  <int value="-1332267458" label="RemoveNavigationHistory:enabled"/>
   <int value="-1327676774" label="disable-accelerated-mjpeg-decode"/>
   <int value="-1325887476" label="NewPrintPreview:enabled"/>
   <int value="-1322882747" label="disable-datasaver-prompt"/>
@@ -25986,6 +26009,7 @@
   <int value="-771080109" label="GrantNotificationsToDSE:disabled"/>
   <int value="-770319039" label="enable-touch-editing"/>
   <int value="-763759697" label="enable-audio-support-for-desktop-share"/>
+  <int value="-762687134" label="ExperimentalCrostiniUI:enabled"/>
   <int value="-759830869" label="enable-tab-discarding"/>
   <int value="-757946835"
       label="OmniboxUIExperimentShowSuggestionFavicons:enabled"/>
@@ -26469,6 +26493,7 @@
   <int value="492985975" label="use-monitor-color-space"/>
   <int value="493903641" label="disable-appcontainer"/>
   <int value="494733611" label="disable-drop-sync-credential"/>
+  <int value="497137719" label="OmniboxVoiceSearchAlwaysVisible:disabled"/>
   <int value="501477022" label="DrawOcclusion:enabled"/>
   <int value="503245473" label="disable-translate-new-ux"/>
   <int value="504994663" label="GenericSensor:disabled"/>
@@ -26567,6 +26592,7 @@
   <int value="730024226" label="enable-out-of-process-pdf"/>
   <int value="730750097" label="PermissionsBlacklist:disabled"/>
   <int value="732703958" label="enable-gesture-tap-highlight"/>
+  <int value="736911267" label="ExperimentalCrostiniUI:disabled"/>
   <int value="738868972" label="GdiTextPrinting:disabled"/>
   <int value="745868416" label="disable-system-timezone-automatic-detection"/>
   <int value="746944193" label="enable-automatic-password-saving:disabled"/>
@@ -26631,7 +26657,6 @@
   <int value="909439558" label="disable-device-discovery"/>
   <int value="916316159" label="disable-new-app-list-mixer"/>
   <int value="918046854" label="NtlmV2Enabled:disabled"/>
-  <int value="924038134" label="Oculus-VR:enabled"/>
   <int value="926852901" label="DataReductionProxyMainMenu:disabled"/>
   <int value="929462705" label="disable-link-disambiguation-popup"/>
   <int value="935655516" label="password-import-export:disabled"/>
@@ -26739,6 +26764,7 @@
   <int value="1179013979"
       label="OmniboxUIExperimentMaxAutocompleteMatches:enabled"/>
   <int value="1179936481" label="enable-android-pay-integration-v1"/>
+  <int value="1180722846" label="OculusVR:disabled"/>
   <int value="1181056275" label="enable-cloud-backup"/>
   <int value="1183431946" label="v8-cache-options"/>
   <int value="1185424279" label="enable-media-router"/>
@@ -27041,6 +27067,7 @@
   <int value="1906942630" label="enable-easy-unlock"/>
   <int value="1907859249" label="ash-disable-trilinear-filtering"/>
   <int value="1910240042" label="enable-experimental-fullscreen-exit-ui"/>
+  <int value="1913263516" label="OculusVR:enabled"/>
   <int value="1913298816" label="OverlayScrollbar:enabled"/>
   <int value="1915178511" label="disable-blink-features"/>
   <int value="1925627218" label="FullscreenToolbarReveal:disabled"/>
@@ -27051,7 +27078,6 @@
   <int value="1932732886" label="OpenVR:enabled"/>
   <int value="1936810062" label="WebVrVsyncAlign:enabled"/>
   <int value="1939413645" label="enable-invalid-cert-collection"/>
-  <int value="1939691262" label="Oculus-VR:disabled"/>
   <int value="1942911276" label="enable-grouped-history"/>
   <int value="1944156526" label="sync-url"/>
   <int value="1947350992" label="drop-sync-credential:disabled"/>
@@ -27112,6 +27138,7 @@
   <int value="2085186092" label="BulkPrinters:disabled"/>
   <int value="2085438501" label="ChromeHome:enabled"/>
   <int value="2089897928" label="enable-audio-focus"/>
+  <int value="2091002949" label="RemoveNavigationHistory:disabled"/>
   <int value="2092605092" label="ChromeHomeShowGoogleGWhenUrlCleared:disabled"/>
   <int value="2093235103" label="default-tile-width"/>
   <int value="2093949489" label="ArrayPrototypeValues:enabled"/>
@@ -27132,6 +27159,7 @@
   <int value="2129929643" label="enable-use-zoom-for-dsf"/>
   <int value="2137347307" label="enable-drive-apps-in-app-list"/>
   <int value="2137599770" label="enable-win32k-renderer-lockdown"/>
+  <int value="2138146331" label="OmniboxVoiceSearchAlwaysVisible:enabled"/>
   <int value="2139048614" label="UseSurfaceLayerForVideo:enabled"/>
   <int value="2141463681" label="enable-offer-upload-credit-cards"/>
   <int value="2142979536" label="EnableManualFallbacksFilling:disabled"/>
@@ -34895,6 +34923,53 @@
   <int value="6" label="PARSE_ERROR">Data could not be parsed.</int>
 </enum>
 
+<enum name="PlatformTPMHardwareAlerts">
+  <int value="1" label="camo0/breach"/>
+  <int value="2" label="crypto0/dmem_parity"/>
+  <int value="3" label="crypto0/drf_parity"/>
+  <int value="4" label="crypto0/imem_parity"/>
+  <int value="5" label="crypto0/pgm_fault"/>
+  <int value="6" label="dbctrl_cpu0_D_if/bus_err"/>
+  <int value="7" label="dbctrl_cpu0_D_if/update_watchdog"/>
+  <int value="8" label="dbctrl_cpu0_I_if/bus_err"/>
+  <int value="9" label="dbctrl_cpu0_I_if/update_watchdog"/>
+  <int value="10" label="dbctrl_cpu0_S_if/bus_err"/>
+  <int value="11" label="dbctrl_cpu0_S_if/update_watchdog"/>
+  <int value="12" label="dbctrl_ddma0_if/bus_err"/>
+  <int value="13" label="dbctrl_ddma0_if/update_watchdog"/>
+  <int value="14" label="dbctrl_dsps0_if/bus_err"/>
+  <int value="15" label="dbctrl_dsps0_if/update_watchdog"/>
+  <int value="16" label="dbctrl_dusb0_if/bus_err"/>
+  <int value="17" label="dbctrl_dusb0_if/update_watchdog"/>
+  <int value="18" label="fuse0/fuse_defaults"/>
+  <int value="19" label="globalsec/diff_fail"/>
+  <int value="20" label="globalsec/fw0"/>
+  <int value="21" label="globalsec/fw1"/>
+  <int value="22" label="globalsec/fw2"/>
+  <int value="23" label="globalsec/fw3"/>
+  <int value="24" label="globalsec/heartbeat_fail"/>
+  <int value="25" label="globalsec/proc_opcode_hash"/>
+  <int value="26" label="globalsec/sram_parity_scrub"/>
+  <int value="27" label="keymgr0/aes_exec_ctr_max"/>
+  <int value="28" label="keymgr0/aes_hkey"/>
+  <int value="29" label="keymgr0/cert_lookup"/>
+  <int value="30" label="keymgr0/flash_entry"/>
+  <int value="31" label="keymgr0/pw"/>
+  <int value="32" label="keymgr0/sha_exec_ctr_max"/>
+  <int value="33" label="keymgr0/sha_fault"/>
+  <int value="34" label="keymgr0/sha_hkey"/>
+  <int value="35" label="pmu/battery_mon"/>
+  <int value="36" label="pmu/pmu_wdog"/>
+  <int value="37" label="rtc0/rtc_dead"/>
+  <int value="38" label="temp0/max_temp"/>
+  <int value="39" label="temp0/max_temp_diff"/>
+  <int value="40" label="temp0/min_temp"/>
+  <int value="41" label="trng0/out_of_spec"/>
+  <int value="42" label="trng0/timeout"/>
+  <int value="43" label="volt0/volt_err"/>
+  <int value="44" label="xo0/jittery_trim_dis"/>
+</enum>
+
 <enum name="PlayPromiseRejectReason">
   <int value="0" label="Failed autoplay policy"/>
   <int value="1" label="Sources not supported"/>
@@ -41191,6 +41266,12 @@
   <int value="12" label="OS_REPORTS_CAPTIVE_PORTAL"/>
 </enum>
 
+<enum name="SSLErrorLearnMoreNavigationResult">
+  <int value="0" label="Navigation Succeeded"/>
+  <int value="1" label="Navigation Failed with Interstitial"/>
+  <int value="2" label="Navigation Failed with Other Error"/>
+</enum>
+
 <enum name="SSLErrorTypes">
   <int value="0" label="CERT_COMMON_NAME_INVALID"/>
   <int value="1" label="CERT_DATE_INVALID"/>
@@ -42718,6 +42799,13 @@
   <int value="63" label="AUTO"/>
 </enum>
 
+<enum name="TouchAdjustmentNodeRelation">
+  <int value="0" label="Same node"/>
+  <int value="1" label="Touchstart node is descendant of tap node"/>
+  <int value="2" label="Tap node is descendant of TouchStart node"/>
+  <int value="3" label="Others"/>
+</enum>
+
 <enum name="TouchEventDispatchResultType">
   <int value="0" label="Unhandled touch events"/>
   <int value="1" label="Handled touch events"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 2a80737..45a193e 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4924,11 +4924,34 @@
   </summary>
 </histogram>
 
+<histogram name="AuthPolicy.ErrorTypeOfAutoMachinePasswordChange"
+    enum="AuthPolicyErrorType">
+  <owner>ljusten@chromium.org</owner>
+  <summary>Result from automatic background machine password renewal.</summary>
+</histogram>
+
+<histogram name="AuthPolicy.ErrorTypeOfAutoTgtRenewal"
+    enum="AuthPolicyErrorType">
+  <owner>ljusten@chromium.org</owner>
+  <summary>
+    Result from automatic background ticket-granting-ticket renewal.
+  </summary>
+</histogram>
+
+<histogram name="AuthPolicy.ErrorTypeOfGetUserKerberosFiles"
+    enum="AuthPolicyErrorType">
+  <owner>ljusten@chromium.org</owner>
+  <summary>
+    Result of an attempt to get an Active Directory user's Kerberos
+    ticket-granting-ticket and configuration data.
+  </summary>
+</histogram>
+
 <histogram name="AuthPolicy.ErrorTypeOfGetUserStatus"
     enum="AuthPolicyErrorType">
   <owner>ljusten@chromium.org</owner>
   <summary>
-    Result from an attempt to get the status of an Active Directory user's
+    Result of an attempt to get the status of an Active Directory user's
     Kerberos ticket, password and account.
   </summary>
 </histogram>
@@ -4994,6 +5017,15 @@
   </summary>
 </histogram>
 
+<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms">
+  <owner>ljusten@chromium.org</owner>
+  <summary>
+    Time in milliseconds to get the Kerberos ticket-granting-ticket and
+    configuration data of an Active Directory user. The value is recorded no
+    matter if the operation was successful or not.
+  </summary>
+</histogram>
+
 <histogram name="AuthPolicy.TimeToGetUserStatus" units="ms">
   <owner>ljusten@chromium.org</owner>
   <summary>
@@ -5049,6 +5081,16 @@
   </summary>
 </histogram>
 
+<histogram name="AuthPolicy.TimeToRunKpasswd" units="ms">
+  <owner>ljusten@chromium.org</owner>
+  <summary>
+    Time in milliseconds to call 'kpasswd' (change Active Directory password).
+    The command is used to change the machine account password. By default, it
+    is run every 30 days by the AuthPolicy daemon. The value is recorded no
+    matter if the operation was successful or not.
+  </summary>
+</histogram>
+
 <histogram name="AuthPolicy.TimeToRunNetAdsGpo" units="ms">
   <owner>ljusten@chromium.org</owner>
   <summary>
@@ -22081,7 +22123,23 @@
   </summary>
 </histogram>
 
+<histogram name="Event.Touch.TouchAdjustment.AdjustedNode"
+    enum="TouchAdjustmentNodeRelation">
+  <owner>eirage@chromium.org</owner>
+  <summary>
+    Records if doing touch adjustment on touchstart have same hit test node as
+    doing touch adjustment on GestureTap. If not, record if one is descendant of
+    the other. Others means neither of the nodes are descendant of the other.
+    This only records GestureTap events.
+
+    Team: input-dev@chromium.org.
+  </summary>
+</histogram>
+
 <histogram name="Event.Touch.TouchAdjustment.AdjustToSameNode" enum="Boolean">
+  <obsolete>
+    Deprecated 02/2018 and replaced by Event.Touch.TouchAdjustment.AdjustedNode.
+  </obsolete>
   <owner>eirage@chromium.org</owner>
   <summary>
     Records if doing touch adjustment on touchstart have same hit test node as
@@ -45263,6 +45321,13 @@
   </summary>
 </histogram>
 
+<histogram name="Net.NumQuicSessionsAtShutdown">
+  <owner>rch@chromium.org</owner>
+  <summary>
+    The number of QUIC sessions when the QuicStreamFactory is destroyed.
+  </summary>
+</histogram>
+
 <histogram name="Net.OCSPRequestFailedTimeMs" units="ms">
   <obsolete>
     Deprecated 2017-04-21 as it was Linux/CrOS only.
@@ -64698,6 +64763,14 @@
   <summary>Exit status of the TPM firmware updater script.</summary>
 </histogram>
 
+<histogram name="Platform.TPM.HardwareAlerts" enum="PlatformTPMHardwareAlerts">
+  <owner>anatol@google.com</owner>
+  <summary>
+    Trusted Platform Module hardware alerts that signal about the chip abnormal
+    situation.
+  </summary>
+</histogram>
+
 <histogram name="Platform.TPM.VersionFingerprint" enum="TPMVersionFingerprint">
   <owner>mnissler@chromium.org</owner>
   <summary>
@@ -79792,6 +79865,9 @@
 </histogram>
 
 <histogram name="SequencedWorkerPool.ShutdownDelayTime" units="ms">
+  <obsolete>
+    Deprecated 02/2018. SequencedWorkerPool has been removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     How long it takes to wait for tasks that block shutdown to complete.
@@ -85550,6 +85626,16 @@
   </summary>
 </histogram>
 
+<histogram name="SSL.CertificateErrorHelpCenterVisited"
+    enum="SSLErrorLearnMoreNavigationResult">
+  <owner>carlosil@chromium.org</owner>
+  <summary>
+    When the &quot;Learn more&quot; link on an SSL interstitial is clicked, this
+    histogram records if the navigation succeded, if it failed with an
+    interstitial, or if it failed with a different error.
+  </summary>
+</histogram>
+
 <histogram name="SSL.CertificateErrorReportFailure" enum="NetErrorCodes">
   <owner>estark@chromium.org</owner>
   <summary>
@@ -89890,6 +89976,9 @@
 </histogram>
 
 <histogram name="Sync.YoungestForeignTabAgeOnNTP" units="seconds">
+  <obsolete>
+    Deprecated in M66.
+  </obsolete>
   <owner>skym@chromium.org</owner>
   <summary>Upon NTP load, the age of the youngest synced foreign tab.</summary>
 </histogram>
diff --git a/tools/perf/core/oauth_api.py b/tools/perf/core/oauth_api.py
new file mode 100644
index 0000000..2942925
--- /dev/null
+++ b/tools/perf/core/oauth_api.py
@@ -0,0 +1,31 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""API for generating OAuth2 access tokens from service account
+keys predeployed to Chrome Ops bots via Puppet.
+"""
+
+import contextlib
+import os
+import subprocess
+import tempfile
+
+
+@contextlib.contextmanager
+def with_access_token(service_account_json):
+  """Yields an access token for the service account.
+
+  Args:
+    service_account_json: The path to the service account JSON file.
+  """
+  fd, path = tempfile.mkstemp(suffix='.json', prefix='tok')
+  os.close(fd)
+  try:
+    args = ['luci-auth', 'token', '-json-output', path]
+    if service_account_json:
+      args += ['-service-account-json', service_account_json]
+    subprocess.check_call(args)
+    yield path
+  finally:
+    os.remove(path)
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py
index 7ee94478..8369338 100755
--- a/tools/perf/process_perf_results.py
+++ b/tools/perf/process_perf_results.py
@@ -7,6 +7,7 @@
 import json
 import sys
 
+from core import oauth_api
 from core import upload_results_to_perf_dashboard
 from core import results_merger
 from os import listdir
@@ -16,7 +17,7 @@
 RESULTS_URL = 'https://chromeperf.appspot.com'
 
 def _upload_perf_results(json_to_upload, name, configuration_name,
-    build_properties):
+    build_properties, oauth_file):
   """Upload the contents of result JSON(s) to the perf dashboard."""
   build_properties = json.loads(build_properties)
   args = [
@@ -31,6 +32,7 @@
       '--got-v8-revision', build_properties['got_v8_revision'],
       '--got-webrtc-revision', build_properties['got_webrtc_revision'],
       '--chromium-checkout-dir', '/b/c/b/obbs_fyi',
+      '--oauth-token-file', oauth_file,
   ]
   if _is_histogram(json_to_upload):
     args.append('--send-as-histograms')
@@ -62,6 +64,7 @@
 
 
 def _process_perf_results(output_json, configuration_name,
+                          service_account_file,
                           build_properties, task_output_dir):
   """Process one or more perf JSON results.
 
@@ -96,10 +99,10 @@
       test_results_list.append(json.load(json_data))
   _merge_json_output(output_json, test_results_list)
 
-  for directory in benchmark_directory_list:
-    _upload_perf_results(join(directory, 'perf_results.json'),
-        directory, configuration_name, build_properties)
-
+  with oauth_api.with_access_token(service_account_file) as oauth_file:
+    for directory in benchmark_directory_list:
+      _upload_perf_results(join(directory, 'perf_results.json'),
+          directory, configuration_name, build_properties, oauth_file)
   return 0
 
 
@@ -111,6 +114,7 @@
   # configuration-name and results-url are set in the json file which is going
   # away tools/perf/core/chromium.perf.fyi.extras.json
   parser.add_argument('--configuration-name', help=argparse.SUPPRESS)
+  parser.add_argument('--service-account-file', help=argparse.SUPPRESS)
 
   parser.add_argument('--build-properties', help=argparse.SUPPRESS)
   parser.add_argument('--summary-json', help=argparse.SUPPRESS)
@@ -123,6 +127,7 @@
 
   return _process_perf_results(
       args.output_json, args.configuration_name,
+      args.service_account_file,
       args.build_properties, args.task_output_dir)
 
 
diff --git a/tools/perf/scripts_smoke_unittest.py b/tools/perf/scripts_smoke_unittest.py
index 6005df60..374ec22 100644
--- a/tools/perf/scripts_smoke_unittest.py
+++ b/tools/perf/scripts_smoke_unittest.py
@@ -48,6 +48,7 @@
     self.assertEquals(return_code, 0, stdout)
     self.assertIn('optional arguments:', stdout)
 
+  @decorators.Disabled('chromeos')  # crbug.com/814068
   def testRunRecordWprList(self):
     return_code, stdout = self.RunPerfScript('record_wpr --list-benchmarks',
         venv=True)
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index a8b6663..f8584b4 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -75,6 +75,7 @@
  <item id="devtools_network_resource" hash_code="129652775" type="0" content_hash_code="24059212" os_list="linux,windows" file_path="chrome/browser/devtools/devtools_ui_bindings.cc"/>
  <item id="dial_get_app_info" hash_code="15952025" type="0" content_hash_code="90542080" os_list="linux,windows" file_path="chrome/browser/media/router/discovery/dial/dial_app_info_fetcher.cc"/>
  <item id="dial_get_device_description" hash_code="50422598" type="0" content_hash_code="129827780" os_list="linux,windows" file_path="chrome/browser/media/router/discovery/dial/device_description_fetcher.cc"/>
+ <item id="dns_over_https" hash_code="79895226" type="0" content_hash_code="45123510" os_list="linux,windows" file_path="net/dns/dns_transaction.cc"/>
  <item id="dns_transaction" hash_code="79227717" type="0" content_hash_code="132206495" os_list="linux,windows" file_path="net/dns/dns_transaction.cc"/>
  <item id="dom_distiller" hash_code="3989826" type="0" content_hash_code="106153970" os_list="linux,windows" file_path="components/dom_distiller/core/distiller_url_fetcher.cc"/>
  <item id="domain_reliability_report_upload" hash_code="108804096" type="0" content_hash_code="35902036" os_list="linux,windows" file_path="components/domain_reliability/uploader.cc"/>
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc
index b10ad04a..62f9daa 100644
--- a/ui/accessibility/ax_node_data.cc
+++ b/ui/accessibility/ax_node_data.cc
@@ -469,6 +469,23 @@
   SetNameFrom(ax::mojom::NameFrom::kAttributeExplicitlyEmpty);
 }
 
+void AXNodeData::SetDescription(const std::string& description) {
+  for (std::pair<ax::mojom::StringAttribute, std::string>& string_attribute :
+       string_attributes) {
+    if (string_attribute.first == ax::mojom::StringAttribute::kDescription) {
+      string_attribute.second = description;
+      return;
+    }
+  }
+
+  string_attributes.push_back(
+      std::make_pair(ax::mojom::StringAttribute::kDescription, description));
+}
+
+void AXNodeData::SetDescription(const base::string16& description) {
+  SetDescription(base::UTF16ToUTF8(description));
+}
+
 void AXNodeData::SetValue(const std::string& value) {
   for (size_t i = 0; i < string_attributes.size(); ++i) {
     if (string_attributes[i].first == ax::mojom::StringAttribute::kValue) {
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h
index 9a57d56..5741f15c 100644
--- a/ui/accessibility/ax_node_data.h
+++ b/ui/accessibility/ax_node_data.h
@@ -106,15 +106,22 @@
   void AddStringListAttribute(ax::mojom::StringListAttribute attribute,
                               const std::vector<std::string>& value);
 
+  //
   // Convenience functions.
-  // Equivalent to AddStringAttribute(ATTR_NAME, name).
+  //
+
+  // Adds the name attribute or replaces it if already present.
   void SetName(const std::string& name);
   void SetName(const base::string16& name);
-  // Equivalent to AddIntAttribute(ax::mojom::IntAttribute::NameFrom,
-  //                    ax::mojom::NameFrom::kAttributeExplicitlyEmpty)
+
   // Allows nameless objects to pass accessibility checks.
   void SetNameExplicitlyEmpty();
-  // Equivalent to AddStringAttribute(ATTR_VALUE, value).
+
+  // Adds the description attribute or replaces it if already present.
+  void SetDescription(const std::string& description);
+  void SetDescription(const base::string16& description);
+
+  // Adds the value attribute or replaces it if already present.
   void SetValue(const std::string& value);
   void SetValue(const base::string16& value);
 
diff --git a/ui/android/delegated_frame_host_android.cc b/ui/android/delegated_frame_host_android.cc
index c8fbbbb..18ccc94 100644
--- a/ui/android/delegated_frame_host_android.cc
+++ b/ui/android/delegated_frame_host_android.cc
@@ -80,7 +80,8 @@
 
 void DelegatedFrameHostAndroid::SubmitCompositorFrame(
     const viz::LocalSurfaceId& local_surface_id,
-    viz::CompositorFrame frame) {
+    viz::CompositorFrame frame,
+    viz::mojom::HitTestRegionListPtr hit_test_region_list) {
   if (local_surface_id != surface_info_.id().local_surface_id()) {
     DestroyDelegatedContent();
     DCHECK(!content_layer_);
@@ -91,13 +92,15 @@
         viz::SurfaceId(frame_sink_id_, local_surface_id), 1.f, frame_size);
     has_transparent_background_ = root_pass->has_transparent_background;
 
-    support_->SubmitCompositorFrame(local_surface_id, std::move(frame));
+    support_->SubmitCompositorFrame(local_surface_id, std::move(frame),
+                                    std::move(hit_test_region_list));
 
     content_layer_ =
         CreateSurfaceLayer(surface_info_, !has_transparent_background_);
     view_->GetLayer()->AddChild(content_layer_);
   } else {
-    support_->SubmitCompositorFrame(local_surface_id, std::move(frame));
+    support_->SubmitCompositorFrame(local_surface_id, std::move(frame),
+                                    std::move(hit_test_region_list));
   }
   compositor_attach_until_frame_lock_.reset();
 }
diff --git a/ui/android/delegated_frame_host_android.h b/ui/android/delegated_frame_host_android.h
index 9831d62..4f65223 100644
--- a/ui/android/delegated_frame_host_android.h
+++ b/ui/android/delegated_frame_host_android.h
@@ -54,8 +54,10 @@
 
   ~DelegatedFrameHostAndroid() override;
 
-  void SubmitCompositorFrame(const viz::LocalSurfaceId& local_surface_id,
-                             viz::CompositorFrame frame);
+  void SubmitCompositorFrame(
+      const viz::LocalSurfaceId& local_surface_id,
+      viz::CompositorFrame frame,
+      viz::mojom::HitTestRegionListPtr hit_test_region_list);
   void DidNotProduceFrame(const viz::BeginFrameAck& ack);
 
   void DestroyDelegatedContent();
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc
index 1e8d75b..cf86054 100644
--- a/ui/app_list/views/app_list_view.cc
+++ b/ui/app_list/views/app_list_view.cc
@@ -1025,14 +1025,17 @@
     }
   }
 
-  if (ShouldIgnoreScrollEvents())
+  // Ignore 0-offset events to prevent spurious dismissal, see crbug.com/806338
+  // The system generates 0-offset ET_SCROLL_FLING_CANCEL events during simple
+  // touchpad mouse moves. Those may be passed via mojo APIs and handled here.
+  if (ShouldIgnoreScrollEvents() || offset == 0)
     return true;
 
   // If the event is a mousewheel event, the offset is always large enough,
   // otherwise the offset must be larger than the scroll threshold.
   if (type == ui::ET_MOUSEWHEEL ||
       abs(offset) > kAppListMinScrollToSwitchStates) {
-    if (offset >= 0) {
+    if (offset > 0) {
       Dismiss();
     } else {
       if (app_list_state_ == AppListViewState::FULLSCREEN_ALL_APPS)
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 38102b3..06aba57d 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -65,6 +65,8 @@
   output_name = "ui_base"
 
   sources = [
+    "accelerators/media_keys_listener.cc",
+    "accelerators/media_keys_listener.h",
     "accelerators/menu_label_accelerator_util_linux.cc",
     "accelerators/menu_label_accelerator_util_linux.h",
     "accelerators/platform_accelerator.h",
@@ -372,6 +374,12 @@
     ]
   }
 
+  if (is_mac) {
+    sources += [ "accelerators/media_keys_listener_mac.mm" ]
+  } else {
+    sources += [ "accelerators/media_keys_listener_stub.cc" ]
+  }
+
   if (is_win) {
     sources += [ "touch/touch_device_win.cc" ]
   } else if (is_android) {
diff --git a/ui/base/accelerators/media_keys_listener.cc b/ui/base/accelerators/media_keys_listener.cc
new file mode 100644
index 0000000..4429e44f
--- /dev/null
+++ b/ui/base/accelerators/media_keys_listener.cc
@@ -0,0 +1,13 @@
+// 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 "ui/base/accelerators/media_keys_listener.h"
+
+namespace ui {
+
+MediaKeysListener::Delegate::~Delegate() = default;
+
+MediaKeysListener::~MediaKeysListener() = default;
+
+}  // namespace ui
diff --git a/ui/base/accelerators/media_keys_listener.h b/ui/base/accelerators/media_keys_listener.h
new file mode 100644
index 0000000..5ffeafc
--- /dev/null
+++ b/ui/base/accelerators/media_keys_listener.h
@@ -0,0 +1,60 @@
+// 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 UI_BASE_ACCELERATORS_MEDIA_KEYS_LISTENER_H_
+#define UI_BASE_ACCELERATORS_MEDIA_KEYS_LISTENER_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "ui/base/ui_base_export.h"
+
+namespace ui {
+
+class Accelerator;
+
+// Create MediaKeyListener to receive accelerators on media keys.
+class UI_BASE_EXPORT MediaKeysListener {
+ public:
+  enum class Scope {
+    kGlobal,   // Listener works whenever application in focus or not.
+    kFocused,  // Listener only works whan application has focus.
+  };
+
+  enum class MediaKeysHandleResult {
+    kIgnore,  // Ignore the key and continue propagation to other system apps.
+    kSuppressPropagation,  // Handled. Prevent propagation to other system
+                           // apps.
+  };
+
+  // Media keys accelerators receiver.
+  class UI_BASE_EXPORT Delegate {
+   public:
+    virtual ~Delegate();
+
+    // Called on media key event.
+    // Return result - whether event is handled and propagation of event should
+    // be suppressed.
+    virtual MediaKeysHandleResult OnMediaKeysAccelerator(
+        const Accelerator& accelerator) = 0;
+  };
+
+  // Can return nullptr if media keys listening is not implemented.
+  // Currently implemented only on mac.
+  static std::unique_ptr<MediaKeysListener> Create(Delegate* delegate,
+                                                   Scope scope);
+
+  virtual ~MediaKeysListener();
+
+  // Start receiving media keys events.
+  virtual void StartWatchingMediaKeys() = 0;
+  // Stop receiving media keys events.
+  virtual void StopWatchingMediaKeys() = 0;
+  // Whether listener started receiving media keys events.
+  virtual bool IsWatchingMediaKeys() const = 0;
+};
+
+}  // namespace ui
+
+#endif  // UI_BASE_ACCELERATORS_MEDIA_KEYS_LISTENER_H_
diff --git a/ui/base/accelerators/media_keys_listener_mac.mm b/ui/base/accelerators/media_keys_listener_mac.mm
new file mode 100644
index 0000000..cd595b0
--- /dev/null
+++ b/ui/base/accelerators/media_keys_listener_mac.mm
@@ -0,0 +1,214 @@
+// 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 "ui/base/accelerators/media_keys_listener.h"
+
+#include <ApplicationServices/ApplicationServices.h>
+#include <Carbon/Carbon.h>
+#import <Cocoa/Cocoa.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <IOKit/hidsystem/ev_keymap.h>
+
+#include "ui/base/accelerators/accelerator.h"
+
+namespace ui {
+
+namespace {
+
+// The media keys subtype. No official docs found, but widely known.
+// http://lists.apple.com/archives/cocoa-dev/2007/Aug/msg00499.html
+const int kSystemDefinedEventMediaKeysSubtype = 8;
+
+ui::KeyboardCode MediaKeyCodeToKeyboardCode(int key_code) {
+  switch (key_code) {
+    case NX_KEYTYPE_PLAY:
+      return ui::VKEY_MEDIA_PLAY_PAUSE;
+    case NX_KEYTYPE_PREVIOUS:
+    case NX_KEYTYPE_REWIND:
+      return ui::VKEY_MEDIA_PREV_TRACK;
+    case NX_KEYTYPE_NEXT:
+    case NX_KEYTYPE_FAST:
+      return ui::VKEY_MEDIA_NEXT_TRACK;
+  }
+  return ui::VKEY_UNKNOWN;
+}
+
+class MediaKeysListenerImpl : public MediaKeysListener {
+ public:
+  MediaKeysListenerImpl(MediaKeysListener::Delegate* delegate, Scope scope);
+
+  ~MediaKeysListenerImpl() override;
+
+  // MediaKeysListener:
+  void StartWatchingMediaKeys() override;
+  void StopWatchingMediaKeys() override;
+  bool IsWatchingMediaKeys() const override;
+
+ private:
+  // Callback on media key event.
+  MediaKeysHandleResult OnMediaKeyEvent(int media_key_code);
+
+  // The callback for when an event tap happens.
+  static CGEventRef EventTapCallback(CGEventTapProxy proxy,
+                                     CGEventType type,
+                                     CGEventRef event,
+                                     void* refcon);
+
+  MediaKeysListener::Delegate* delegate_;
+  const Scope scope_;
+  // Event tap for intercepting mac media keys.
+  CFMachPortRef event_tap_ = nullptr;
+  CFRunLoopSourceRef event_tap_source_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(MediaKeysListenerImpl);
+};
+
+MediaKeysListenerImpl::MediaKeysListenerImpl(
+    MediaKeysListener::Delegate* delegate,
+    Scope scope)
+    : delegate_(delegate), scope_(scope) {
+  CHECK_NE(delegate_, nullptr);
+}
+
+MediaKeysListenerImpl::~MediaKeysListenerImpl() {
+  if (event_tap_) {
+    StopWatchingMediaKeys();
+  }
+}
+
+void MediaKeysListenerImpl::StartWatchingMediaKeys() {
+  // Make sure there's no existing event tap.
+  if (event_tap_) {
+    return;
+  }
+  DCHECK_EQ(event_tap_, nullptr);
+  DCHECK_EQ(event_tap_source_, nullptr);
+
+  // Add an event tap to intercept the system defined media key events.
+  event_tap_ = CGEventTapCreate(
+      kCGSessionEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault,
+      CGEventMaskBit(NX_SYSDEFINED), EventTapCallback, this);
+  if (event_tap_ == nullptr) {
+    LOG(ERROR) << "Error: failed to create event tap.";
+    return;
+  }
+
+  event_tap_source_ =
+      CFMachPortCreateRunLoopSource(kCFAllocatorSystemDefault, event_tap_, 0);
+  if (event_tap_source_ == nullptr) {
+    LOG(ERROR) << "Error: failed to create new run loop source.";
+    return;
+  }
+
+  CFRunLoopAddSource(CFRunLoopGetCurrent(), event_tap_source_,
+                     kCFRunLoopCommonModes);
+}
+
+void MediaKeysListenerImpl::StopWatchingMediaKeys() {
+  if (!event_tap_) {
+    return;
+  }
+  CFRunLoopRemoveSource(CFRunLoopGetCurrent(), event_tap_source_,
+                        kCFRunLoopCommonModes);
+  // Ensure both event tap and source are initialized.
+  DCHECK_NE(event_tap_, nullptr);
+  DCHECK_NE(event_tap_source_, nullptr);
+
+  // Invalidate the event tap.
+  CFMachPortInvalidate(event_tap_);
+  CFRelease(event_tap_);
+  event_tap_ = nullptr;
+
+  // Release the event tap source.
+  CFRelease(event_tap_source_);
+  event_tap_source_ = nullptr;
+}
+
+bool MediaKeysListenerImpl::IsWatchingMediaKeys() const {
+  return event_tap_ != nullptr;
+}
+
+MediaKeysListener::MediaKeysHandleResult MediaKeysListenerImpl::OnMediaKeyEvent(
+    int media_key_code) {
+  const ui::KeyboardCode key_code = MediaKeyCodeToKeyboardCode(media_key_code);
+  // Create an accelerator corresponding to the keyCode.
+  const ui::Accelerator accelerator(key_code, 0);
+  return delegate_->OnMediaKeysAccelerator(accelerator);
+}
+
+// Processed events should propagate if they aren't handled by any listeners.
+// For events that don't matter, this handler should return as quickly as
+// possible.
+// Returning event causes the event to propagate to other applications.
+// Returning nullptr prevents the event from propagating.
+// static
+CGEventRef MediaKeysListenerImpl::EventTapCallback(CGEventTapProxy proxy,
+                                                   CGEventType type,
+                                                   CGEventRef event,
+                                                   void* refcon) {
+  MediaKeysListenerImpl* shortcut_listener =
+      static_cast<MediaKeysListenerImpl*>(refcon);
+
+  const bool is_active = [NSApp isActive];
+
+  if (shortcut_listener->scope_ == Scope::kFocused && !is_active) {
+    return event;
+  }
+
+  // Handle the timeout case by re-enabling the tap.
+  if (type == kCGEventTapDisabledByTimeout) {
+    CGEventTapEnable(shortcut_listener->event_tap_, true);
+    return event;
+  }
+
+  // Convert the CGEvent to an NSEvent for access to the data1 field.
+  NSEvent* ns_event = [NSEvent eventWithCGEvent:event];
+  if (ns_event == nil) {
+    return event;
+  }
+
+  // Ignore events that are not system defined media keys.
+  if (type != NX_SYSDEFINED || [ns_event type] != NSSystemDefined ||
+      [ns_event subtype] != kSystemDefinedEventMediaKeysSubtype) {
+    return event;
+  }
+
+  NSInteger data1 = [ns_event data1];
+  // Ignore media keys that aren't previous, next and play/pause.
+  // Magical constants are from http://weblog.rogueamoeba.com/2007/09/29/
+  int key_code = (data1 & 0xFFFF0000) >> 16;
+  if (key_code != NX_KEYTYPE_PLAY && key_code != NX_KEYTYPE_NEXT &&
+      key_code != NX_KEYTYPE_PREVIOUS && key_code != NX_KEYTYPE_FAST &&
+      key_code != NX_KEYTYPE_REWIND) {
+    return event;
+  }
+
+  int key_flags = data1 & 0x0000FFFF;
+  bool is_key_pressed = ((key_flags & 0xFF00) >> 8) == 0xA;
+
+  // If the key wasn't pressed (eg. was released), ignore this event.
+  if (!is_key_pressed)
+    return event;
+
+  // Now we have a media key that we care about. Send it to the caller.
+  auto result = shortcut_listener->OnMediaKeyEvent(key_code);
+
+  // Prevent event from proagating to other apps if handled by Chrome.
+  if (result == MediaKeysHandleResult::kSuppressPropagation) {
+    return nullptr;
+  }
+
+  // By default, pass the event through.
+  return event;
+}
+
+}  // namespace
+
+std::unique_ptr<MediaKeysListener> MediaKeysListener::Create(
+    MediaKeysListener::Delegate* delegate,
+    MediaKeysListener::Scope scope) {
+  return std::make_unique<MediaKeysListenerImpl>(delegate, scope);
+}
+
+}  // namespace ui
diff --git a/ui/base/accelerators/media_keys_listener_stub.cc b/ui/base/accelerators/media_keys_listener_stub.cc
new file mode 100644
index 0000000..67005291
--- /dev/null
+++ b/ui/base/accelerators/media_keys_listener_stub.cc
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/accelerators/media_keys_listener.h"
+
+namespace ui {
+
+// TODO(ganenkokb): Need implementation for non-mac platforms.
+std::unique_ptr<MediaKeysListener> MediaKeysListener::Create(
+    MediaKeysListener::Delegate* delegate,
+    MediaKeysListener::Scope scope) {
+  return nullptr;
+}
+
+}  // namespace ui
diff --git a/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.cc b/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.cc
index b5659e04c..762151a 100644
--- a/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.cc
+++ b/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/events/keyboard_layout_util.h"
@@ -136,6 +135,39 @@
   return base::UTF8ToUTF16(ui::KeycodeConverter::DomKeyToKeyString(dom_key));
 }
 
+const gfx::VectorIcon* GetVectorIconForKeyboardCode(ui::KeyboardCode key_code) {
+  switch (key_code) {
+    case ui::VKEY_BROWSER_BACK:
+      return &kKsvBrowserBackIcon;
+    case ui::VKEY_BROWSER_REFRESH:
+      return &kKsvReloadIcon;
+    case ui::VKEY_MEDIA_LAUNCH_APP2:
+      return &kKsvFullscreenIcon;
+    case ui::VKEY_MEDIA_LAUNCH_APP1:
+      return &kKsvOverviewIcon;
+    case ui::VKEY_BRIGHTNESS_DOWN:
+      return &kKsvBrightnessDownIcon;
+    case ui::VKEY_BRIGHTNESS_UP:
+      return &kKsvBrightnessUpIcon;
+    case ui::VKEY_VOLUME_MUTE:
+      return &kKsvMuteIcon;
+    case ui::VKEY_VOLUME_DOWN:
+      return &kKsvVolumeDownIcon;
+    case ui::VKEY_VOLUME_UP:
+      return &kKsvVolumeUpIcon;
+    case ui::VKEY_UP:
+      return &kKsvArrowUpIcon;
+    case ui::VKEY_DOWN:
+      return &kKsvArrowDownIcon;
+    case ui::VKEY_LEFT:
+      return &kKsvArrowLeftIcon;
+    case ui::VKEY_RIGHT:
+      return &kKsvArrowRightIcon;
+    default:
+      return nullptr;
+  }
+}
+
 const std::vector<KeyboardShortcutItem>& GetKeyboardShortcutItemList() {
   CR_DEFINE_STATIC_LOCAL(
       std::vector<KeyboardShortcutItem>, item_list,
diff --git a/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.h b/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.h
index 6ad3ee68..f172c71 100644
--- a/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.h
+++ b/ui/chromeos/ksv/keyboard_shortcut_viewer_metadata.h
@@ -8,9 +8,11 @@
 #include <vector>
 
 #include "base/containers/span.h"
+#include "base/optional.h"
 #include "base/strings/string16.h"
 #include "ui/chromeos/ksv/ksv_export.h"
 #include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/gfx/vector_icon_types.h"
 
 namespace keyboard_shortcut_viewer {
 
@@ -29,6 +31,10 @@
 // TODO(https://crbug.com/803502): Get strings for non US keyboard layout.
 base::string16 GetStringForKeyboardCode(ui::KeyboardCode key_code);
 
+// Returns the VectorIcon if |key_code| need to be represented as an icon.
+// Returns nullptr if |key_code| should not be represented as an icon.
+const gfx::VectorIcon* GetVectorIconForKeyboardCode(ui::KeyboardCode key_code);
+
 }  // namespace keyboard_shortcut_viewer
 
 #endif  // UI_CHROMEOS_KSV_KEYBOARD_SHORTCUT_VIEWER_METADATA_H_
diff --git a/ui/chromeos/ksv/vector_icons/BUILD.gn b/ui/chromeos/ksv/vector_icons/BUILD.gn
index 48695a7..f9fb828a 100644
--- a/ui/chromeos/ksv/vector_icons/BUILD.gn
+++ b/ui/chromeos/ksv/vector_icons/BUILD.gn
@@ -20,6 +20,32 @@
     "ksv_search_start.icon",
     "ksv_separator_plus.1x.icon",
     "ksv_separator_plus.icon",
+    "ksv_arrow_down.1x.icon",
+    "ksv_arrow_down.icon",
+    "ksv_arrow_left.1x.icon",
+    "ksv_arrow_left.icon",
+    "ksv_arrow_right.1x.icon",
+    "ksv_arrow_right.icon",
+    "ksv_arrow_up.1x.icon",
+    "ksv_arrow_up.icon",
+    "ksv_brightness_down.1x.icon",
+    "ksv_brightness_down.icon",
+    "ksv_brightness_up.1x.icon",
+    "ksv_brightness_up.icon",
+    "ksv_browser_back.1x.icon",
+    "ksv_browser_back.icon",
+    "ksv_fullscreen.1x.icon",
+    "ksv_fullscreen.icon",
+    "ksv_mute.1x.icon",
+    "ksv_mute.icon",
+    "ksv_overview.1x.icon",
+    "ksv_overview.icon",
+    "ksv_reload.1x.icon",
+    "ksv_reload.icon",
+    "ksv_volume_down.1x.icon",
+    "ksv_volume_down.icon",
+    "ksv_volume_up.1x.icon",
+    "ksv_volume_up.icon",
   ]
 }
 
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_down.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_down.1x.icon
new file mode 100644
index 0000000..ed82bb8
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_down.1x.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 11.5f,
+LINE_TO, 2.5f, 6.04f,
+LINE_TO, 3.55f, 5,
+R_LINE_TO, 4.45f, 4.41f,
+LINE_TO, 12.45f, 5,
+LINE_TO, 13.5f, 6.04f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_down.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_down.icon
new file mode 100644
index 0000000..673d57c
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_down.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 16, 23,
+LINE_TO, 5, 12.09f,
+LINE_TO, 7.1f, 10,
+R_LINE_TO, 8.9f, 8.82f,
+LINE_TO, 24.9f, 10,
+LINE_TO, 27, 12.09f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_left.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_left.1x.icon
new file mode 100644
index 0000000..5271a7f
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_left.1x.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 4.75f, 8.25f,
+R_LINE_TO, 5.46f, 5.5f,
+R_LINE_TO, 1.04f, -1.05f,
+R_LINE_TO, -4.41f, -4.45f,
+R_LINE_TO, 4.41f, -4.45f,
+R_LINE_TO, -1.04f, -1.05f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_left.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_left.icon
new file mode 100644
index 0000000..a5c0ad1
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_left.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 9.5f, 16.5f,
+LINE_TO, 20.41f, 27.5f,
+R_LINE_TO, 2.09f, -2.1f,
+R_LINE_TO, -8.82f, -8.9f,
+LINE_TO, 22.5f, 7.6f,
+LINE_TO, 20.41f, 5.5f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_right.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_right.1x.icon
new file mode 100644
index 0000000..69819d7
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_right.1x.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 11.25f, 8.25f,
+LINE_TO, 5.79f, 13.75f,
+LINE_TO, 4.75f, 12.7f,
+R_LINE_TO, 4.41f, -4.45f,
+LINE_TO, 4.75f, 3.8f,
+LINE_TO, 5.79f, 2.75f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_right.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_right.icon
new file mode 100644
index 0000000..dd17694
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_right.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 22.5f, 16.5f,
+LINE_TO, 11.59f, 27.5f,
+LINE_TO, 9.5f, 25.4f,
+R_LINE_TO, 8.82f, -8.9f,
+LINE_TO, 9.5f, 7.6f,
+LINE_TO, 11.59f, 5.5f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_up.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_up.1x.icon
new file mode 100644
index 0000000..d4b3fb4
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_up.1x.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 5,
+LINE_TO, 2.5f, 10.46f,
+LINE_TO, 3.55f, 11.5f,
+R_LINE_TO, 4.45f, -4.41f,
+R_LINE_TO, 4.45f, 4.41f,
+R_LINE_TO, 1.05f, -1.04f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_arrow_up.icon b/ui/chromeos/ksv/vector_icons/ksv_arrow_up.icon
new file mode 100644
index 0000000..f8c9a72
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_arrow_up.icon
@@ -0,0 +1,13 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 16, 10,
+LINE_TO, 5, 20.91f,
+LINE_TO, 7.1f, 23,
+R_LINE_TO, 8.9f, -8.82f,
+LINE_TO, 24.9f, 23,
+LINE_TO, 27, 20.91f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_brightness_down.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_brightness_down.1x.icon
new file mode 100644
index 0000000..0a52101
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_brightness_down.1x.icon
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 7.91f, 9.85f,
+CUBIC_TO, 6.84f, 9.85f, 5.98f, 8.98f, 5.98f, 7.91f,
+CUBIC_TO, 5.98f, 6.84f, 6.84f, 5.98f, 7.91f, 5.98f,
+CUBIC_TO, 8.98f, 5.98f, 9.84f, 6.84f, 9.84f, 7.91f,
+CUBIC_TO, 9.84f, 8.98f, 8.98f, 9.85f, 7.91f, 9.85f,
+CLOSE,
+MOVE_TO, 10.68f, 6.76f,
+LINE_TO, 10.68f, 5.15f,
+LINE_TO, 9.06f, 5.15f,
+LINE_TO, 7.91f, 4,
+LINE_TO, 6.77f, 5.15f,
+LINE_TO, 5.15f, 5.15f,
+LINE_TO, 5.15f, 6.76f,
+LINE_TO, 4, 7.91f,
+LINE_TO, 5.15f, 9.06f,
+LINE_TO, 5.15f, 10.68f,
+LINE_TO, 6.77f, 10.68f,
+LINE_TO, 7.91f, 11.82f,
+LINE_TO, 9.06f, 10.68f,
+LINE_TO, 10.68f, 10.68f,
+LINE_TO, 10.68f, 9.06f,
+LINE_TO, 11.82f, 7.91f,
+LINE_TO, 10.68f, 6.76f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_brightness_down.icon b/ui/chromeos/ksv/vector_icons/ksv_brightness_down.icon
new file mode 100644
index 0000000..788987e67
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_brightness_down.icon
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 15.82f, 19.69f,
+CUBIC_TO, 13.69f, 19.69f, 11.95f, 17.96f, 11.95f, 15.82f,
+CUBIC_TO, 11.95f, 13.69f, 13.69f, 11.96f, 15.82f, 11.96f,
+CUBIC_TO, 17.96f, 11.96f, 19.69f, 13.69f, 19.69f, 15.82f,
+CUBIC_TO, 19.69f, 17.96f, 17.96f, 19.69f, 15.82f, 19.69f,
+CLOSE,
+MOVE_TO, 21.35f, 13.53f,
+LINE_TO, 21.35f, 10.29f,
+LINE_TO, 18.11f, 10.29f,
+LINE_TO, 15.82f, 8,
+LINE_TO, 13.53f, 10.29f,
+LINE_TO, 10.29f, 10.29f,
+LINE_TO, 10.29f, 13.53f,
+LINE_TO, 8, 15.82f,
+LINE_TO, 10.29f, 18.12f,
+LINE_TO, 10.29f, 21.35f,
+LINE_TO, 13.53f, 21.35f,
+LINE_TO, 15.82f, 23.64f,
+LINE_TO, 18.11f, 21.35f,
+LINE_TO, 21.35f, 21.35f,
+LINE_TO, 21.35f, 18.11f,
+LINE_TO, 23.64f, 15.82f,
+LINE_TO, 21.35f, 13.53f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_brightness_up.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_brightness_up.1x.icon
new file mode 100644
index 0000000..0a06d200
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_brightness_up.1x.icon
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 7.86f, 10.88f,
+R_ARC_TO, 3.03f, 3.03f, 0, 0, 1, -3.02f, -3.02f,
+R_ARC_TO, 3.03f, 3.03f, 0, 0, 1, 3.02f, -3.02f,
+R_ARC_TO, 3.03f, 3.03f, 0, 0, 1, 3.02f, 3.02f,
+R_ARC_TO, 3.03f, 3.03f, 0, 0, 1, -3.02f, 3.03f,
+CLOSE,
+R_MOVE_TO, 3.79f, -4.59f,
+V_LINE_TO, 4.07f,
+R_H_LINE_TO, -2.22f,
+LINE_TO, 7.86f, 2.5f,
+LINE_TO, 6.29f, 4.07f,
+H_LINE_TO, 4.07f,
+R_V_LINE_TO, 2.22f,
+LINE_TO, 2.5f, 7.86f,
+R_LINE_TO, 1.57f, 1.57f,
+R_V_LINE_TO, 2.22f,
+R_H_LINE_TO, 2.22f,
+R_LINE_TO, 1.57f, 1.57f,
+R_LINE_TO, 1.57f, -1.57f,
+R_H_LINE_TO, 2.22f,
+R_V_LINE_TO, -2.22f,
+R_LINE_TO, 1.57f, -1.57f,
+R_LINE_TO, -1.57f, -1.57f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_brightness_up.icon b/ui/chromeos/ksv/vector_icons/ksv_brightness_up.icon
new file mode 100644
index 0000000..87fbd256
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_brightness_up.icon
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 15.71f, 21.77f,
+R_ARC_TO, 6.06f, 6.06f, 0, 0, 1, -6.05f, -6.05f,
+R_ARC_TO, 6.05f, 6.05f, 0, 0, 1, 6.05f, -6.05f,
+R_ARC_TO, 6.05f, 6.05f, 0, 0, 1, 6.05f, 6.05f,
+R_CUBIC_TO, 0, 3.33f, -2.71f, 6.05f, -6.05f, 6.05f,
+CLOSE,
+R_MOVE_TO, 7.58f, -9.19f,
+V_LINE_TO, 8.14f,
+R_H_LINE_TO, -4.44f,
+LINE_TO, 15.71f, 5,
+R_LINE_TO, -3.14f, 3.14f,
+H_LINE_TO, 8.14f,
+R_V_LINE_TO, 4.43f,
+LINE_TO, 5, 15.72f,
+R_LINE_TO, 3.14f, 3.14f,
+R_V_LINE_TO, 4.44f,
+R_H_LINE_TO, 4.44f,
+R_LINE_TO, 3.14f, 3.14f,
+R_LINE_TO, 3.14f, -3.14f,
+R_H_LINE_TO, 4.44f,
+R_V_LINE_TO, -4.44f,
+R_LINE_TO, 3.14f, -3.14f,
+R_LINE_TO, -3.14f, -3.14f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_browser_back.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_browser_back.1x.icon
new file mode 100644
index 0000000..86935b03f
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_browser_back.1x.icon
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 7.76f, 3.5f,
+LINE_TO, 3, 8.22f,
+LINE_TO, 7.75f, 13,
+R_LINE_TO, 1.15f, -1.13f,
+R_LINE_TO, -2.8f, -2.82f,
+H_LINE_TO, 13,
+V_LINE_TO, 7.45f,
+H_LINE_TO, 6.07f,
+R_LINE_TO, 2.84f, -2.81f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_browser_back.icon b/ui/chromeos/ksv/vector_icons/ksv_browser_back.icon
new file mode 100644
index 0000000..ce6926a
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_browser_back.icon
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 15.51f, 7,
+LINE_TO, 6, 16.43f,
+LINE_TO, 15.5f, 26,
+R_LINE_TO, 2.31f, -2.25f,
+R_LINE_TO, -5.6f, -5.64f,
+H_LINE_TO, 26,
+R_V_LINE_TO, -3.21f,
+H_LINE_TO, 12.13f,
+R_LINE_TO, 5.67f, -5.62f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_fullscreen.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_fullscreen.1x.icon
new file mode 100644
index 0000000..5d536489
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_fullscreen.1x.icon
@@ -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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8.89f, 4,
+R_V_LINE_TO, 1.3f,
+R_H_LINE_TO, 2.79f,
+R_V_LINE_TO, 1.84f,
+R_H_LINE_TO, 1.32f,
+V_LINE_TO, 4,
+H_LINE_TO, 8.89f,
+CLOSE,
+MOVE_TO, 2.5f, 4,
+R_V_LINE_TO, 3.14f,
+R_H_LINE_TO, 1.32f,
+V_LINE_TO, 5.3f,
+R_H_LINE_TO, 2.8f,
+V_LINE_TO, 4,
+H_LINE_TO, 2.5f,
+CLOSE,
+R_MOVE_TO, 0, 5.35f,
+V_LINE_TO, 12.5f,
+R_H_LINE_TO, 4.11f,
+R_V_LINE_TO, -1.31f,
+H_LINE_TO, 3.82f,
+V_LINE_TO, 9.35f,
+H_LINE_TO, 2.5f,
+CLOSE,
+R_MOVE_TO, 9.18f, 0,
+R_V_LINE_TO, 1.84f,
+R_H_LINE_TO, -2.79f,
+V_LINE_TO, 12.5f,
+H_LINE_TO, 13,
+V_LINE_TO, 9.35f,
+R_H_LINE_TO, -1.32f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_fullscreen.icon b/ui/chromeos/ksv/vector_icons/ksv_fullscreen.icon
new file mode 100644
index 0000000..0555eb276
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_fullscreen.icon
@@ -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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 17.78f, 8,
+R_V_LINE_TO, 2.61f,
+R_H_LINE_TO, 5.58f,
+R_V_LINE_TO, 3.68f,
+R_H_LINE_TO, 2.65f,
+V_LINE_TO, 8,
+R_H_LINE_TO, -8.22f,
+CLOSE,
+MOVE_TO, 5, 8,
+R_V_LINE_TO, 6.29f,
+R_H_LINE_TO, 2.64f,
+R_V_LINE_TO, -3.7f,
+R_H_LINE_TO, 5.59f,
+V_LINE_TO, 8,
+H_LINE_TO, 5,
+CLOSE,
+R_MOVE_TO, 0, 10.69f,
+V_LINE_TO, 25,
+R_H_LINE_TO, 8.23f,
+R_V_LINE_TO, -2.61f,
+H_LINE_TO, 7.64f,
+R_V_LINE_TO, -3.69f,
+H_LINE_TO, 5,
+CLOSE,
+R_MOVE_TO, 18.36f, 0.01f,
+R_V_LINE_TO, 3.69f,
+R_H_LINE_TO, -5.58f,
+V_LINE_TO, 25,
+R_H_LINE_TO, 8.23f,
+R_V_LINE_TO, -6.3f,
+R_H_LINE_TO, -2.64f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_mute.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_mute.1x.icon
new file mode 100644
index 0000000..59033b2
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_mute.1x.icon
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 3.56f,
+LINE_TO, 6.84f, 4.72f,
+LINE_TO, 8, 5.88f,
+LINE_TO, 8, 3.56f,
+CLOSE,
+MOVE_TO, 3.71f, 3,
+LINE_TO, 3, 3.71f,
+LINE_TO, 5.63f, 6.33f,
+LINE_TO, 3, 6.33f,
+LINE_TO, 3, 9.67f,
+LINE_TO, 5.22f, 9.67f,
+LINE_TO, 8, 12.44f,
+LINE_TO, 8, 8.71f,
+LINE_TO, 10.36f, 11.07f,
+CUBIC_TO, 9.99f, 11.36f, 9.57f, 11.58f, 9.11f, 11.72f,
+LINE_TO, 9.11f, 12.87f,
+CUBIC_TO, 9.88f, 12.69f, 10.57f, 12.34f, 11.16f, 11.86f,
+LINE_TO, 12.29f, 13,
+LINE_TO, 13, 12.29f,
+LINE_TO, 8, 7.29f,
+LINE_TO, 3.71f, 3,
+CLOSE,
+MOVE_TO, 11.89f, 8,
+CUBIC_TO, 11.89f, 8.52f, 11.78f, 9.01f, 11.59f, 9.47f,
+LINE_TO, 12.43f, 10.31f,
+CUBIC_TO, 12.79f, 9.62f, 13, 8.83f, 13, 8,
+CUBIC_TO, 13, 5.62f, 11.34f, 3.63f, 9.11f, 3.13f,
+LINE_TO, 9.11f, 4.27f,
+CUBIC_TO, 10.72f, 4.75f, 11.89f, 6.24f, 11.89f, 8,
+CLOSE,
+MOVE_TO, 10.5f, 8,
+CUBIC_TO, 10.5f, 7.02f, 9.93f, 6.17f, 9.11f, 5.76f,
+LINE_TO, 9.11f, 6.99f,
+LINE_TO, 10.47f, 8.35f,
+CUBIC_TO, 10.49f, 8.24f, 10.5f, 8.12f, 10.5f, 8,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_mute.icon b/ui/chromeos/ksv/vector_icons/ksv_mute.icon
new file mode 100644
index 0000000..f57a16c
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_mute.icon
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 16, 7.11f,
+LINE_TO, 13.68f, 9.43f,
+LINE_TO, 16, 11.76f,
+LINE_TO, 16, 7.11f,
+CLOSE,
+MOVE_TO, 7.41f, 6,
+LINE_TO, 6, 7.41f,
+LINE_TO, 11.26f, 12.67f,
+LINE_TO, 6, 12.67f,
+LINE_TO, 6, 19.33f,
+LINE_TO, 10.44f, 19.33f,
+LINE_TO, 16, 24.89f,
+LINE_TO, 16, 17.41f,
+LINE_TO, 20.72f, 22.13f,
+CUBIC_TO, 19.98f, 22.71f, 19.14f, 23.17f, 18.22f, 23.44f,
+LINE_TO, 18.22f, 25.73f,
+CUBIC_TO, 19.75f, 25.39f, 21.15f, 24.68f, 22.32f, 23.72f,
+LINE_TO, 24.59f, 26,
+LINE_TO, 26, 24.59f,
+LINE_TO, 16, 14.59f,
+LINE_TO, 7.41f, 6,
+CLOSE,
+MOVE_TO, 23.78f, 16,
+CUBIC_TO, 23.78f, 17.04f, 23.55f, 18.02f, 23.18f, 18.93f,
+LINE_TO, 24.85f, 20.61f,
+CUBIC_TO, 25.59f, 19.23f, 26, 17.67f, 26, 16,
+CUBIC_TO, 26, 11.24f, 22.68f, 7.27f, 18.22f, 6.25f,
+LINE_TO, 18.22f, 8.54f,
+CUBIC_TO, 21.43f, 9.5f, 23.78f, 12.48f, 23.78f, 16,
+CLOSE,
+MOVE_TO, 21, 16,
+CUBIC_TO, 21, 14.03f, 19.87f, 12.34f, 18.22f, 11.52f,
+LINE_TO, 18.22f, 13.98f,
+LINE_TO, 20.94f, 16.7f,
+CUBIC_TO, 20.98f, 16.48f, 21, 16.25f, 21, 16,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_overview.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_overview.1x.icon
new file mode 100644
index 0000000..b0254a4
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_overview.1x.icon
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 1, 11.49f,
+R_H_LINE_TO, 9,
+V_LINE_TO, 4.5f,
+H_LINE_TO, 1,
+R_V_LINE_TO, 6.99f,
+CLOSE,
+R_MOVE_TO, 1, -0.99f,
+R_H_LINE_TO, 7,
+R_V_LINE_TO, -5,
+H_LINE_TO, 2,
+R_V_LINE_TO, 5,
+CLOSE,
+MOVE_TO, 11.5f, 11.49f,
+R_H_LINE_TO, 1,
+V_LINE_TO, 4.5f,
+R_H_LINE_TO, -1,
+CLOSE,
+MOVE_TO, 13.5f, 11.5f,
+R_H_LINE_TO, 1,
+R_V_LINE_TO, -7,
+R_H_LINE_TO, -1,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_overview.icon b/ui/chromeos/ksv/vector_icons/ksv_overview.icon
new file mode 100644
index 0000000..d5b942a
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_overview.icon
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 2, 22.98f,
+R_H_LINE_TO, 18,
+V_LINE_TO, 9,
+H_LINE_TO, 2,
+R_V_LINE_TO, 13.98f,
+CLOSE,
+MOVE_TO, 4, 21,
+R_H_LINE_TO, 14,
+V_LINE_TO, 11,
+H_LINE_TO, 4,
+R_V_LINE_TO, 10,
+CLOSE,
+MOVE_TO, 23, 22.98f,
+R_H_LINE_TO, 2,
+V_LINE_TO, 9,
+R_H_LINE_TO, -2,
+CLOSE,
+MOVE_TO, 27, 23,
+R_H_LINE_TO, 2,
+V_LINE_TO, 9,
+R_H_LINE_TO, -2,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_reload.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_reload.1x.icon
new file mode 100644
index 0000000..97f9d9f
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_reload.1x.icon
@@ -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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 13.19f, 7.27f,
+LINE_TO, 13.19f, 3,
+LINE_TO, 11.53f, 4.66f,
+CUBIC_TO, 10.63f, 3.65f, 9.35f, 3.03f, 7.97f, 3,
+CUBIC_TO, 6.69f, 2.98f, 5.43f, 3.46f, 4.5f, 4.37f,
+CUBIC_TO, 3.56f, 5.27f, 3.03f, 6.49f, 3, 7.79f,
+CUBIC_TO, 2.95f, 10.48f, 5.1f, 12.71f, 7.79f, 12.76f,
+CUBIC_TO, 7.82f, 12.77f, 7.85f, 12.77f, 7.88f, 12.77f,
+CUBIC_TO, 9.58f, 12.77f, 11.17f, 11.87f, 12.06f, 10.4f,
+LINE_TO, 10.86f, 9.68f,
+CUBIC_TO, 10.22f, 10.74f, 9.05f, 11.36f, 7.82f, 11.37f,
+CUBIC_TO, 5.9f, 11.33f, 4.37f, 9.74f, 4.4f, 7.82f,
+CUBIC_TO, 4.42f, 6.89f, 4.8f, 6.02f, 5.47f, 5.38f,
+CUBIC_TO, 6.14f, 4.73f, 6.98f, 4.39f, 7.95f, 4.4f,
+CUBIC_TO, 8.96f, 4.42f, 9.9f, 4.89f, 10.54f, 5.65f,
+LINE_TO, 8.92f, 7.27f,
+LINE_TO, 13.19f, 7.27f,
+CLOSE,
+END
+
diff --git a/ui/chromeos/ksv/vector_icons/ksv_reload.icon b/ui/chromeos/ksv/vector_icons/ksv_reload.icon
new file mode 100644
index 0000000..ce946af
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_reload.icon
@@ -0,0 +1,24 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 26.37f, 14.53f,
+LINE_TO, 26.37f, 6,
+LINE_TO, 23.06f, 9.32f,
+CUBIC_TO, 21.26f, 7.29f, 18.69f, 6.06f, 15.95f, 6.01f,
+CUBIC_TO, 13.37f, 5.95f, 10.87f, 6.92f, 8.99f, 8.73f,
+CUBIC_TO, 7.11f, 10.54f, 6.05f, 12.98f, 6, 15.59f,
+CUBIC_TO, 5.9f, 20.97f, 10.2f, 25.43f, 15.58f, 25.53f,
+CUBIC_TO, 15.64f, 25.53f, 15.7f, 25.53f, 15.76f, 25.53f,
+CUBIC_TO, 19.16f, 25.53f, 22.35f, 23.73f, 24.12f, 20.81f,
+LINE_TO, 21.73f, 19.36f,
+CUBIC_TO, 20.44f, 21.48f, 18.1f, 22.72f, 15.63f, 22.73f,
+CUBIC_TO, 11.8f, 22.66f, 8.73f, 19.48f, 8.8f, 15.64f,
+CUBIC_TO, 8.83f, 13.78f, 9.59f, 12.04f, 10.93f, 10.75f,
+CUBIC_TO, 12.27f, 9.46f, 13.95f, 8.78f, 15.89f, 8.8f,
+CUBIC_TO, 17.91f, 8.84f, 19.79f, 9.78f, 21.07f, 11.3f,
+LINE_TO, 17.84f, 14.53f,
+LINE_TO, 26.37f, 14.53f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_volume_down.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_volume_down.1x.icon
new file mode 100644
index 0000000..cf5063d
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_volume_down.1x.icon
@@ -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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 4, 6.31f,
+LINE_TO, 4, 9.69f,
+LINE_TO, 6.25f, 9.69f,
+LINE_TO, 9.06f, 12.5f,
+LINE_TO, 9.06f, 3.5f,
+LINE_TO, 6.25f, 6.31f,
+LINE_TO, 4, 6.31f,
+CLOSE,
+MOVE_TO, 11.59f, 8,
+CUBIC_TO, 11.59f, 7, 11.02f, 6.15f, 10.19f, 5.73f,
+LINE_TO, 10.19f, 10.26f,
+CUBIC_TO, 11.02f, 9.85f, 11.59f, 9, 11.59f, 8,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_volume_down.icon b/ui/chromeos/ksv/vector_icons/ksv_volume_down.icon
new file mode 100644
index 0000000..8427713
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_volume_down.icon
@@ -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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 8, 12.63f,
+LINE_TO, 8, 19.38f,
+LINE_TO, 12.5f, 19.38f,
+LINE_TO, 18.12f, 25,
+LINE_TO, 18.12f, 7,
+LINE_TO, 12.5f, 12.63f,
+LINE_TO, 8, 12.63f,
+CLOSE,
+MOVE_TO, 23.19f, 16,
+CUBIC_TO, 23.19f, 14.01f, 22.04f, 12.3f, 20.37f, 11.47f,
+LINE_TO, 20.37f, 20.52f,
+CUBIC_TO, 22.04f, 19.7f, 23.19f, 17.99f, 23.19f, 16,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_volume_up.1x.icon b/ui/chromeos/ksv/vector_icons/ksv_volume_up.1x.icon
new file mode 100644
index 0000000..b0a1da0
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_volume_up.1x.icon
@@ -0,0 +1,27 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 9.18f, 3,
+LINE_TO, 9.18f, 4.16f,
+CUBIC_TO, 10.8f, 4.64f, 11.99f, 6.15f, 11.99f, 7.93f,
+CUBIC_TO, 11.99f, 9.71f, 10.8f, 11.21f, 9.18f, 11.7f,
+LINE_TO, 9.18f, 12.85f,
+CUBIC_TO, 11.43f, 12.34f, 13.11f, 10.33f, 13.11f, 7.93f,
+CUBIC_TO, 13.11f, 5.52f, 11.43f, 3.51f, 9.18f, 3,
+CLOSE,
+MOVE_TO, 10.58f, 7.93f,
+CUBIC_TO, 10.58f, 6.93f, 10.01f, 6.08f, 9.18f, 5.66f,
+LINE_TO, 9.18f, 10.19f,
+CUBIC_TO, 10.01f, 9.78f, 10.58f, 8.92f, 10.58f, 7.93f,
+CLOSE,
+MOVE_TO, 3, 6.24f,
+LINE_TO, 3, 9.61f,
+LINE_TO, 5.25f, 9.61f,
+LINE_TO, 8.06f, 12.42f,
+LINE_TO, 8.06f, 3.43f,
+LINE_TO, 5.25f, 6.24f,
+LINE_TO, 3, 6.24f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/vector_icons/ksv_volume_up.icon b/ui/chromeos/ksv/vector_icons/ksv_volume_up.icon
new file mode 100644
index 0000000..55dfe52
--- /dev/null
+++ b/ui/chromeos/ksv/vector_icons/ksv_volume_up.icon
@@ -0,0 +1,27 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 18.36f, 6,
+LINE_TO, 18.36f, 8.31f,
+CUBIC_TO, 21.61f, 9.28f, 23.98f, 12.29f, 23.98f, 15.85f,
+CUBIC_TO, 23.98f, 19.42f, 21.61f, 22.43f, 18.36f, 23.39f,
+LINE_TO, 18.36f, 25.71f,
+CUBIC_TO, 22.87f, 24.69f, 26.23f, 20.66f, 26.23f, 15.85f,
+CUBIC_TO, 26.23f, 11.04f, 22.87f, 7.02f, 18.36f, 6,
+CLOSE,
+MOVE_TO, 21.17f, 15.85f,
+CUBIC_TO, 21.17f, 13.87f, 20.02f, 12.16f, 18.36f, 11.33f,
+LINE_TO, 18.36f, 20.37f,
+CUBIC_TO, 20.02f, 19.55f, 21.17f, 17.84f, 21.17f, 15.85f,
+CLOSE,
+MOVE_TO, 6, 12.48f,
+LINE_TO, 6, 19.22f,
+LINE_TO, 10.49f, 19.22f,
+LINE_TO, 16.11f, 24.84f,
+LINE_TO, 16.11f, 6.87f,
+LINE_TO, 10.49f, 12.48f,
+LINE_TO, 6, 12.48f,
+CLOSE,
+END
diff --git a/ui/chromeos/ksv/views/bubble_view.cc b/ui/chromeos/ksv/views/bubble_view.cc
index dd23041..cce38e06 100644
--- a/ui/chromeos/ksv/views/bubble_view.cc
+++ b/ui/chromeos/ksv/views/bubble_view.cc
@@ -22,9 +22,6 @@
 
 namespace {
 
-constexpr SkColor kBubbleContentsColor =
-    SkColorSetARGBMacro(0xFF, 0x5F, 0x63, 0x68);
-
 constexpr int kIconTextSpacing = 6;
 
 }  // namespace
@@ -59,15 +56,17 @@
     AddChildViewAt(icon_, 0);
   }
 
-  constexpr int kIconSize = 12;
-  icon_->SetImage(gfx::CreateVectorIcon(icon, kBubbleContentsColor));
+  constexpr int kIconSize = 18;
+  constexpr SkColor kIconColor = SkColorSetARGBMacro(0xFF, 0x5C, 0x5D, 0x60);
+  icon_->SetImage(gfx::CreateVectorIcon(icon, kIconColor));
   icon_->SetImageSize(gfx::Size(kIconSize, kIconSize));
 }
 
 void BubbleView::SetText(const base::string16& text) {
   if (!text_) {
     text_ = new views::Label();
-    text_->SetEnabledColor(kBubbleContentsColor);
+    constexpr SkColor kTextColor = SkColorSetARGBMacro(0xFF, 0x5F, 0x63, 0x68);
+    text_->SetEnabledColor(kTextColor);
     text_->SetElideBehavior(gfx::NO_ELIDE);
     constexpr int kLabelFontSizeDelta = 1;
     text_->SetFontList(
diff --git a/ui/chromeos/ksv/views/keyboard_shortcut_item_view.cc b/ui/chromeos/ksv/views/keyboard_shortcut_item_view.cc
index 588be76..58de98f 100644
--- a/ui/chromeos/ksv/views/keyboard_shortcut_item_view.cc
+++ b/ui/chromeos/ksv/views/keyboard_shortcut_item_view.cc
@@ -43,12 +43,15 @@
 }
 
 // Creates the bubble view for modifiers and key.
-std::unique_ptr<views::View> CreateBubbleView(
-    const base::string16& bubble_text) {
+std::unique_ptr<views::View> CreateBubbleView(const base::string16& bubble_text,
+                                              ui::KeyboardCode key_code) {
   auto bubble_view = std::make_unique<BubbleView>();
   bubble_view->set_owned_by_client();
-  // TODO(wutao): add icons for keys.
-  bubble_view->SetText(bubble_text);
+  const gfx::VectorIcon* vector_icon = GetVectorIconForKeyboardCode(key_code);
+  if (vector_icon)
+    bubble_view->SetIcon(*vector_icon);
+  else
+    bubble_view->SetText(bubble_text);
   return bubble_view;
 }
 
@@ -99,7 +102,7 @@
     std::unique_ptr<views::View> custom_view =
         replacement_string == separator_string
             ? CreateSeparatorView()
-            : CreateBubbleView(replacement_string);
+            : CreateBubbleView(replacement_string, item.shortcut_key_codes[i]);
     style_info.custom_view = custom_view.get();
     shortcut_label_view_->AddCustomView(std::move(custom_view));
     shortcut_label_view_->AddStyleRange(
diff --git a/ui/chromeos/ksv/views/keyboard_shortcut_view.cc b/ui/chromeos/ksv/views/keyboard_shortcut_view.cc
index 5d85041..95edc4d 100644
--- a/ui/chromeos/ksv/views/keyboard_shortcut_view.cc
+++ b/ui/chromeos/ksv/views/keyboard_shortcut_view.cc
@@ -45,7 +45,7 @@
                                  int message_id) {
   constexpr int kSearchIllustrationIconSize = 150;
   constexpr SkColor kSearchIllustrationIconColor =
-      SkColorSetARGBMacro(0xFF, 0xCA, 0xCA, 0xCA);
+      SkColorSetARGBMacro(0xFF, 0xDA, 0xDC, 0xE0);
 
   illustration_view->set_owned_by_client();
   views::BoxLayout* layout = illustration_view->SetLayoutManager(
@@ -62,9 +62,10 @@
       SkColorSetARGBMacro(0xFF, 0x20, 0x21, 0x24);
   views::Label* text = new views::Label(l10n_util::GetStringUTF16(message_id));
   text->SetEnabledColor(kSearchIllustrationTextColor);
+  constexpr int kLabelFontSizeDelta = 1;
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   text->SetFontList(rb.GetFontListWithDelta(
-      ui::kLabelFontSizeDelta, gfx::Font::NORMAL, gfx::Font::Weight::BOLD));
+      kLabelFontSizeDelta, gfx::Font::NORMAL, gfx::Font::Weight::BOLD));
   illustration_view->AddChildView(text);
 }
 
@@ -84,20 +85,26 @@
 
 // static
 views::Widget* KeyboardShortcutView::Show(gfx::NativeWindow context) {
-  constexpr int kKSVWindowWidth = 768;
-  constexpr int kKSVWindowHeight = 512;
-
   if (g_ksv_view) {
     // If there is a KeyboardShortcutView window open already, just activate it.
     g_ksv_view->GetWidget()->Activate();
   } else {
+    constexpr gfx::Size kKSVWindowSize(768, 512);
+    gfx::Point offset;
+    if (context) {
+      gfx::Rect root_bounds(context->GetRootWindow()->bounds());
+      offset.SetPoint((root_bounds.width() - kKSVWindowSize.width()) / 2,
+                      (root_bounds.height() - kKSVWindowSize.height()) / 2);
+    }
     views::Widget::CreateWindowWithContextAndBounds(
-        new KeyboardShortcutView(), context,
-        gfx::Rect(0, 0, kKSVWindowWidth, kKSVWindowHeight));
+        new KeyboardShortcutView(), context, gfx::Rect(offset, kKSVWindowSize));
+
+    // Set frame view Active and Inactive colors, both are SK_ColorWHITE.
     g_ksv_view->GetWidget()->GetNativeWindow()->SetProperty(
         ash::kFrameActiveColorKey, SK_ColorWHITE);
     g_ksv_view->GetWidget()->GetNativeWindow()->SetProperty(
         ash::kFrameInactiveColorKey, SK_ColorWHITE);
+
     g_ksv_view->GetWidget()->Show();
     g_ksv_view->RequestFocusForActiveTab();
   }
diff --git a/ui/chromeos/ksv/views/ksv_search_box_view.cc b/ui/chromeos/ksv/views/ksv_search_box_view.cc
index 196d0fcc..9131322 100644
--- a/ui/chromeos/ksv/views/ksv_search_box_view.cc
+++ b/ui/chromeos/ksv/views/ksv_search_box_view.cc
@@ -13,6 +13,8 @@
 #include "ui/views/border.h"
 #include "ui/views/controls/textfield/textfield.h"
 
+namespace keyboard_shortcut_viewer {
+
 namespace {
 
 constexpr SkColor kDefaultSearchBoxBackgroundColor =
@@ -25,8 +27,6 @@
 
 }  // namespace
 
-namespace keyboard_shortcut_viewer {
-
 KSVSearchBoxView::KSVSearchBoxView(search_box::SearchBoxViewDelegate* delegate)
     : search_box::SearchBoxViewBase(delegate) {
   SetSearchBoxBackgroundCornerRadius(kBorderCornerRadius);
diff --git a/ui/chromeos/resources/ui_chromeos_resources.grd b/ui/chromeos/resources/ui_chromeos_resources.grd
index 6dd2daee..6c9b62f5 100644
--- a/ui/chromeos/resources/ui_chromeos_resources.grd
+++ b/ui/chromeos/resources/ui_chromeos_resources.grd
@@ -96,6 +96,7 @@
       <structure type="chrome_scaled_image" name="IDR_PRINT_NOTIFICATION_PAUSE" file="print_notification/pause.png" />
       <structure type="chrome_scaled_image" name="IDR_PRINT_NOTIFICATION_PLAY" file="print_notification/play.png" />
       <structure type="chrome_scaled_image" name="IDR_PRINT_NOTIFICATION_HELP" file="print_notification/help.png" />
+
     </structures>
   </release>
 </grit>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
index 5d07f09..67324f8 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Американска (Уъркман) клавиатура</translation>
 <translation id="6970230597523682626">български</translation>
 <translation id="6981982820502123353">Достъпност</translation>
+<translation id="7020813747703216897">Не бяха намерени съответстващи резултати</translation>
 <translation id="7025325401470358758">Следващият панел</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Транслитерация (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Естонска клавиатура</translation>
 <translation id="719009910964971313">Американска (Дворак) клавиатура за програмисти</translation>
 <translation id="7222624196722476520">Българска фонетична клавиатура</translation>
+<translation id="7272373489634936181">Търсене на комбинации</translation>
 <translation id="7348749398828259943">Американска (Уъркман) международна клавиатура</translation>
 <translation id="7389722738210761877">Тайландска клавиатура (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Клавиатура на хинди (фонетична)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Американска (Коулмак) клавиатура</translation>
 <translation id="7969525169268594403">словенски</translation>
 <translation id="7987485481246785146">Кюрдски (сорани), базирана на арабски клавиатура</translation>
+<translation id="8004192919599017226">Начало на търсенето...</translation>
 <translation id="8008366997883261463">Джак Ръсел териер</translation>
 <translation id="8031722894461705849">Словашка клавиатура</translation>
 <translation id="8045462269890919536">румънски</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Руска фонетична клавиатура</translation>
 <translation id="913758436357682283">Бирманска клавиатура (Myansan)</translation>
 <translation id="9153744823707037316">Табличен метод на въвеждане</translation>
+<translation id="9179672198516322668">Популярни комбинации</translation>
 <translation id="9206487995878691001">Метод на въвеждане за цандзие</translation>
 <translation id="9219908252191632183">Лунен пейзаж</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
index 5de9167e..204ae1a1 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">মার্কিন ওয়ার্কম্যান কীবোর্ড</translation>
 <translation id="6970230597523682626">বুলগেরীয়</translation>
 <translation id="6981982820502123353">অ্যাক্সেযোগ্যতা</translation>
+<translation id="7020813747703216897">মিলে যাওয়া কোনও ফলাফল খুঁজে পাওয়া যায়নি</translation>
 <translation id="7025325401470358758">পরবর্তী ফলক</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">লিপ্যন্তরকরণ (salam → ሰላም)</translation>
 <translation id="7172053773111046550">এস্তোনীয় কীবোর্ড</translation>
 <translation id="719009910964971313">মার্কিন যুক্তরাষ্ট্র প্রোগ্রামার ডিভোরাক কীবোর্ড</translation>
 <translation id="7222624196722476520">বুলগেরিয় ফোনেটিক কীবোর্ড</translation>
+<translation id="7272373489634936181">শর্টকাটগুলি খুঁজুন</translation>
 <translation id="7348749398828259943">মার্কিন ওয়ার্কম্যান আন্তর্জাতিক কীবোর্ড</translation>
 <translation id="7389722738210761877">থাই কীবোর্ড (TIS 820-2531)</translation>
 <translation id="7396038720194014279">হিন্দি কীবোর্ড (ফোনেটিক)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">মার্কিন যুক্তরাষ্ট্রীয় কোলেম্যাক</translation>
 <translation id="7969525169268594403">স্লোভেনিয়ান</translation>
 <translation id="7987485481246785146">সোরানি কুর্দিশ আরবী-নির্ভর কীবোর্ড</translation>
+<translation id="8004192919599017226">খুঁজুন...</translation>
 <translation id="8008366997883261463">জ্যাক রাসেল ক্ষুদ্রকায় কুকুর</translation>
 <translation id="8031722894461705849">স্লোভাক কীবোর্ড</translation>
 <translation id="8045462269890919536">রোমানিয়</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">রাশিয়ান ফনেটিক</translation>
 <translation id="913758436357682283">মায়ানমার মায়ানসান কীবোর্ড</translation>
 <translation id="9153744823707037316">অ্যারে ইনপুট পদ্ধতি</translation>
+<translation id="9179672198516322668">জনপ্রিয় শর্টকাট</translation>
 <translation id="9206487995878691001">কাংগজি ইনপুট পদ্ধতি</translation>
 <translation id="9219908252191632183">লুনার</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
index 6db753b..591188019c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Teclat Workman nord-americà</translation>
 <translation id="6970230597523682626">Búlgar</translation>
 <translation id="6981982820502123353">Accessibilitat</translation>
+<translation id="7020813747703216897">No s'ha trobat cap resultat coincident</translation>
 <translation id="7025325401470358758">Subfinestra següent</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteració (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Teclat estonià</translation>
 <translation id="719009910964971313">Teclat Dvorak nord-americà per a programadors</translation>
 <translation id="7222624196722476520">Teclat de búlgar fonètic</translation>
+<translation id="7272373489634936181">Cerca dreceres</translation>
 <translation id="7348749398828259943">Teclat Workman nord-americà internacional</translation>
 <translation id="7389722738210761877">Teclat tailandès (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Teclat hindi (fonètic)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Colemak nord-americà</translation>
 <translation id="7969525169268594403">Eslovè</translation>
 <translation id="7987485481246785146">Teclat de kurd sorani basat en l'àrab</translation>
+<translation id="8004192919599017226">Inicia la cerca...</translation>
 <translation id="8008366997883261463">Gos</translation>
 <translation id="8031722894461705849">Teclat eslovac</translation>
 <translation id="8045462269890919536">Romanès</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Fonètic rus</translation>
 <translation id="913758436357682283">Teclat myansan de Birmània</translation>
 <translation id="9153744823707037316">Mètode d'introducció de la matriu</translation>
+<translation id="9179672198516322668">Dreceres populars</translation>
 <translation id="9206487995878691001">Mètode d'introducció de cangjie</translation>
 <translation id="9219908252191632183">Paisatge lunar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
index bd27f0b..9854418 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Americká klávesnice s rozložením Workman</translation>
 <translation id="6970230597523682626">bulharština</translation>
 <translation id="6981982820502123353">Usnadnění</translation>
+<translation id="7020813747703216897">Nebyly nalezeny žádné odpovídající výsledky</translation>
 <translation id="7025325401470358758">Další podokno</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Přepis (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estonská klávesnice</translation>
 <translation id="719009910964971313">Americká programátorská klávesnice Dvorak</translation>
 <translation id="7222624196722476520">Bulharská fonetická klávesnice</translation>
+<translation id="7272373489634936181">Hledat zkratky</translation>
 <translation id="7348749398828259943">Americká mezinárodní klávesnice s rozložením Workman</translation>
 <translation id="7389722738210761877">Thajská klávesnice (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindská klávesnice (fonetická)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Americká klávesnice Colemak</translation>
 <translation id="7969525169268594403">slovinština</translation>
 <translation id="7987485481246785146">Kurdská klávesnice (sorání) s arabským rozložením</translation>
+<translation id="8004192919599017226">Zahájit hledání...</translation>
 <translation id="8008366997883261463">Jack Russell teriér</translation>
 <translation id="8031722894461705849">Slovenská klávesnice</translation>
 <translation id="8045462269890919536">rumunština</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Ruská fonetická klávesnice</translation>
 <translation id="913758436357682283">Myanmarská klávesnice Myansan</translation>
 <translation id="9153744823707037316">Maticová metoda zadávání</translation>
+<translation id="9179672198516322668">Oblíbené klávesové zkratky</translation>
 <translation id="9206487995878691001">Metoda zadávání textu Cchang-ťie</translation>
 <translation id="9219908252191632183">Měsíční krajina</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
index 2318d02..f1f2503 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">US-amerikanische Workman-Tastatur</translation>
 <translation id="6970230597523682626">Bulgarisch</translation>
 <translation id="6981982820502123353">Bedienungshilfen</translation>
+<translation id="7020813747703216897">Keine passenden Ergebnisse gefunden</translation>
 <translation id="7025325401470358758">Nächster Bereich</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteration (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estnische Tastatur</translation>
 <translation id="719009910964971313">US-amerikanische "Programmer Dvorak"-Tastatur</translation>
 <translation id="7222624196722476520">Bulgarische Tastatur (phonetisch)</translation>
+<translation id="7272373489634936181">Tastenkombinationen suchen</translation>
 <translation id="7348749398828259943">Internationale US-amerikanische Workman-Tastatur</translation>
 <translation id="7389722738210761877">Thailändische Tastatur (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindi-Tastatur (phonetisch)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA – Colemak</translation>
 <translation id="7969525169268594403">Slowenisch</translation>
 <translation id="7987485481246785146">Sorani-Tastatur nach arabischem Layout</translation>
+<translation id="8004192919599017226">Suche starten…</translation>
 <translation id="8008366997883261463">Jack Russell</translation>
 <translation id="8031722894461705849">Slowakische Tastatur</translation>
 <translation id="8045462269890919536">Rumänisch</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Russisch – phonetisch</translation>
 <translation id="913758436357682283">Myanmar-Myansan-Tastatur</translation>
 <translation id="9153744823707037316">Array-Eingabemethode</translation>
+<translation id="9179672198516322668">Häufig verwendete Tastenkombinationen</translation>
 <translation id="9206487995878691001">Cangjie-Eingabemethode</translation>
 <translation id="9219908252191632183">Mondlandschaft</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
index 7b627bd..6a94ab9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">Hangul de triple alternancia (final)</translation>
 <translation id="5838825566232597749">Internacional Workman (EE. UU.)</translation>
 <translation id="5892290200158927959">Teclado francés BÉPO</translation>
-<translation id="5928303187149237472">Cambiar la resolución de la pantalla</translation>
+<translation id="5928303187149237472">Cambia la resolución de la pantalla</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">Teclado latinoamericano</translation>
 <translation id="6012987430370760224">Teclado maratí (fonético)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Teclado Workman (EE. UU.)</translation>
 <translation id="6970230597523682626">Búlgaro</translation>
 <translation id="6981982820502123353">Accesibilidad</translation>
+<translation id="7020813747703216897">No se encontraron resultados que coincidan</translation>
 <translation id="7025325401470358758">Siguiente panel</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteración (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Teclado estonio</translation>
 <translation id="719009910964971313">Teclado Programmer Dvorak, EE. UU.</translation>
 <translation id="7222624196722476520">Teclado búlgaro fonético</translation>
+<translation id="7272373489634936181">Buscar combinaciones de teclas</translation>
 <translation id="7348749398828259943">Teclado internacional Workman (EE. UU.)</translation>
 <translation id="7389722738210761877">Teclado tailandés (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Teclado hindi (fonético)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Inglés (Estados Unidos; Colemak)</translation>
 <translation id="7969525169268594403">Esloveno</translation>
 <translation id="7987485481246785146">Teclado kurdo sorani basado en el árabe</translation>
+<translation id="8004192919599017226">Iniciar la búsqueda…</translation>
 <translation id="8008366997883261463">Perro</translation>
 <translation id="8031722894461705849">Teclado eslovaco</translation>
 <translation id="8045462269890919536">Rumano</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Ruso fonético</translation>
 <translation id="913758436357682283">Teclado Myansan de Myanmar</translation>
 <translation id="9153744823707037316">Método de entrada de matriz</translation>
+<translation id="9179672198516322668">Combinaciones de teclas populares</translation>
 <translation id="9206487995878691001">Método de entrada cangjie</translation>
 <translation id="9219908252191632183">Superficie lunar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
index 319cb1c..b8988b74 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Teclado estilo Workman (EE. UU.)</translation>
 <translation id="6970230597523682626">Búlgaro</translation>
 <translation id="6981982820502123353">Accesibilidad</translation>
+<translation id="7020813747703216897">No se han podido encontrar resultados que coincidan</translation>
 <translation id="7025325401470358758">Siguiente panel</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteración (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Teclado estonio</translation>
 <translation id="719009910964971313">Teclado Programmer Dvorak de EE. UU.</translation>
 <translation id="7222624196722476520">Teclado búlgaro fonético</translation>
+<translation id="7272373489634936181">Buscar combinaciones de teclas</translation>
 <translation id="7348749398828259943">Teclado internacional estilo Workman (EE. UU.)</translation>
 <translation id="7389722738210761877">Teclado tailandés (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Teclado hindi (fonético)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Estados Unidos (Colemak)</translation>
 <translation id="7969525169268594403">Esloveno</translation>
 <translation id="7987485481246785146">Teclado kurdo sorani basado en el árabe</translation>
+<translation id="8004192919599017226">Iniciar búsqueda...</translation>
 <translation id="8008366997883261463">Terrier Jack Russell</translation>
 <translation id="8031722894461705849">Teclado de eslovaco</translation>
 <translation id="8045462269890919536">Rumano</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Ruso fonético</translation>
 <translation id="913758436357682283">Teclado birmano myansan</translation>
 <translation id="9153744823707037316">Método de entrada de conjunto</translation>
+<translation id="9179672198516322668">Combinaciones de teclas populares</translation>
 <translation id="9206487995878691001">Método de entrada de cangjie</translation>
 <translation id="9219908252191632183">Lunar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
index 957c7cd6..d40f2e85 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">USA Workmani klaviatuur</translation>
 <translation id="6970230597523682626">bulgaaria keel</translation>
 <translation id="6981982820502123353">Juurdepääsetavus</translation>
+<translation id="7020813747703216897">Sobivaid tulemusi ei leitud</translation>
 <translation id="7025325401470358758">Järgmine paan</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteratsioon (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Eesti klaviatuur</translation>
 <translation id="719009910964971313">USA programmeerija Dvoraki klaviatuur</translation>
 <translation id="7222624196722476520">Bulgaaria foneetiline klaviatuur</translation>
+<translation id="7272373489634936181">Otseteede otsimine</translation>
 <translation id="7348749398828259943">USA Workmani rahvusvaheline klaviatuur</translation>
 <translation id="7389722738210761877">Tai klaviatuur (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindi klaviatuur (foneetiline)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA Colemak</translation>
 <translation id="7969525169268594403">sloveeni keel</translation>
 <translation id="7987485481246785146">Sorani kurdi araabia keele põhine klaviatuur</translation>
+<translation id="8004192919599017226">Alusta otsingut</translation>
 <translation id="8008366997883261463">Jack Russelli terjer</translation>
 <translation id="8031722894461705849">Slovaki klaviatuur</translation>
 <translation id="8045462269890919536">rumeenia keel</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Vene foneetiline</translation>
 <translation id="913758436357682283">Myanmar Myansani klaviatuur</translation>
 <translation id="9153744823707037316">Rea sisestusmeetod</translation>
+<translation id="9179672198516322668">Populaarsed otseteed</translation>
 <translation id="9206487995878691001">Cangjie sisestusmeetod</translation>
 <translation id="9219908252191632183">Kuu</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
index d3c42647..31fcf197 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">Hangul 3-set (lopullinen)</translation>
 <translation id="5838825566232597749">Yhdysvallat, kansainvälinen Workman</translation>
 <translation id="5892290200158927959">Ranskalainen BÉPO-näppäimistö</translation>
-<translation id="5928303187149237472">Muuta näytön resoluutiota</translation>
+<translation id="5928303187149237472">Näytön resoluution muuttaminen</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">Näppäimistö: Latinalainen Amerikka</translation>
 <translation id="6012987430370760224">Marathinkielinen näppäimistö (foneettinen)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Näppäimistö: Yhdysvallat, Workman</translation>
 <translation id="6970230597523682626">bulgaria</translation>
 <translation id="6981982820502123353">Esteettömyys</translation>
+<translation id="7020813747703216897">Hakua vastaavia tuloksia ei löytynyt.</translation>
 <translation id="7025325401470358758">Seuraava ruutu</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Translitterointi (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Näppäimistö: viro</translation>
 <translation id="719009910964971313">Näppäimistö: US, Dvorak ohjelmoijille</translation>
 <translation id="7222624196722476520">Bulgarian foneettinen näppäimistö</translation>
+<translation id="7272373489634936181">Hae pikanäppäimiä</translation>
 <translation id="7348749398828259943">Näppäimistö: Yhdysvallat, kansainvälinen Workman</translation>
 <translation id="7389722738210761877">Thainkielinen näppäimistö (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindinkielinen näppäimistö (foneettinen)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA, Colemak</translation>
 <translation id="7969525169268594403">sloveeni</translation>
 <translation id="7987485481246785146">Soranîn arabiaan perustuva näppäimistö</translation>
+<translation id="8004192919599017226">Aloita haku…</translation>
 <translation id="8008366997883261463">Jackrussellinterrieri</translation>
 <translation id="8031722894461705849">Näppäimistö: slovakki</translation>
 <translation id="8045462269890919536">romania</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">venäjä, foneettinen</translation>
 <translation id="913758436357682283">Myanmarin myansan-näppäimistö</translation>
 <translation id="9153744823707037316">Array-syöttötapa</translation>
+<translation id="9179672198516322668">Suositut pikanäppäimet</translation>
 <translation id="9206487995878691001">Cangjie-syöttötapa</translation>
 <translation id="9219908252191632183">Kuu</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
index 3bad58e..beaf1b4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Clavier Workman américain</translation>
 <translation id="6970230597523682626">Bulgare</translation>
 <translation id="6981982820502123353">Accessibilité</translation>
+<translation id="7020813747703216897">Aucun résultat ne correspond à votre recherche</translation>
 <translation id="7025325401470358758">Volet suivant</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Translittération (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Clavier estonien</translation>
 <translation id="719009910964971313">Clavier Dvorak américain pour programmeurs</translation>
 <translation id="7222624196722476520">Clavier bulgare (phonétique)</translation>
+<translation id="7272373489634936181">Rechercher des raccourcis</translation>
 <translation id="7348749398828259943">Clavier Workman international américain</translation>
 <translation id="7389722738210761877">Clavier thaï (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Clavier hindi (phonétique)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Colemak américain</translation>
 <translation id="7969525169268594403">Slovène</translation>
 <translation id="7987485481246785146">Clavier kurde sorani (arabe)</translation>
+<translation id="8004192919599017226">Lancer la recherche…</translation>
 <translation id="8008366997883261463">Jack Russell Terrier</translation>
 <translation id="8031722894461705849">Clavier slovaque</translation>
 <translation id="8045462269890919536">Roumain</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Phonétique russe</translation>
 <translation id="913758436357682283">Clavier birman myansan</translation>
 <translation id="9153744823707037316">Mode de saisie tableau</translation>
+<translation id="9179672198516322668">Raccourcis courants</translation>
 <translation id="9206487995878691001">Mode de saisie cangjie</translation>
 <translation id="9219908252191632183">Paysage lunaire</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
index 1032f0b..0e28bfb1 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">US Workman કીબોર્ડ</translation>
 <translation id="6970230597523682626">બલ્ગેરિયન</translation>
 <translation id="6981982820502123353">ઍક્સેસિબિલિટી</translation>
+<translation id="7020813747703216897">કોઈ મેળ ખાતા પરિણામો મળ્યાં નથી</translation>
 <translation id="7025325401470358758">આગલી પૅન</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">લિવ્યંતરણ (salam → ሰላም)</translation>
 <translation id="7172053773111046550">એસ્ટોનિયન કીબોર્ડ</translation>
 <translation id="719009910964971313">યુએસ પ્રોગ્રામર ડ્વોરેક કીબોર્ડ</translation>
 <translation id="7222624196722476520">બલ્ગેરિયન ધ્વન્યાત્મક કીબોર્ડ</translation>
+<translation id="7272373489634936181">શૉર્ટકટ શોધો</translation>
 <translation id="7348749398828259943">US Workman આંતરરાષ્ટ્રીય કીબોર્ડ</translation>
 <translation id="7389722738210761877">થાઈ કીબોર્ડ (TIS 820-2531)</translation>
 <translation id="7396038720194014279">હિન્દી કીબોર્ડ (ફોનેટિક)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">યુએસ કોલમેક</translation>
 <translation id="7969525169268594403">સ્લોવેનિયન</translation>
 <translation id="7987485481246785146">સોરાની કુર્દિશ અરબી-આધારિત કીબોર્ડ</translation>
+<translation id="8004192919599017226">શોધ શરૂ કરો…</translation>
 <translation id="8008366997883261463">કૂતરો</translation>
 <translation id="8031722894461705849">સ્લોવૅક કીબોર્ડ</translation>
 <translation id="8045462269890919536">રોમાનિયન</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">રશિયન ધ્વન્યાત્મક</translation>
 <translation id="913758436357682283">મ્યાનમાર મ્યાનસન કીબોર્ડ</translation>
 <translation id="9153744823707037316">એરે ઇનપુટ પદ્ધતિ</translation>
+<translation id="9179672198516322668">લોકપ્રિય શૉર્ટકટ</translation>
 <translation id="9206487995878691001">કૅંગી ઇનપુટ પદ્ધતિ</translation>
 <translation id="9219908252191632183">ચંદ્ર</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index be936b04..d3e639d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">यूएस वर्कमैन कीबोर्ड</translation>
 <translation id="6970230597523682626">बल्गारियाई</translation>
 <translation id="6981982820502123353">पहुंच क्षमता</translation>
+<translation id="7020813747703216897">मिलान करने वाला कोई नतीजा नहीं मिला</translation>
 <translation id="7025325401470358758">अगला फलक</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">लिप्यंतरण (salam → ሰላም)</translation>
 <translation id="7172053773111046550">एस्टोनियाई कीबोर्ड</translation>
 <translation id="719009910964971313">US प्रोग्रामर ड्वोरक कीबोर्ड</translation>
 <translation id="7222624196722476520">बुल्गारियाई फ़ोनेटिक कीबोर्ड</translation>
+<translation id="7272373489634936181">शॉर्टकट खोजें</translation>
 <translation id="7348749398828259943">यूएस वर्कमैन अंतर्राष्‍ट्रीय कीबोर्ड</translation>
 <translation id="7389722738210761877">थाई कीबोर्ड (TIS 820-2531)</translation>
 <translation id="7396038720194014279">हिन्दी कीबोर्ड (फ़ोनेटिक)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">यूएस कोलमैक</translation>
 <translation id="7969525169268594403">स्लोवेनियाई</translation>
 <translation id="7987485481246785146">सोरानी कुर्दिश अरबी-आधारित कीबोर्ड</translation>
+<translation id="8004192919599017226">खोज शुरू करें...</translation>
 <translation id="8008366997883261463">श्वान</translation>
 <translation id="8031722894461705849">स्‍लोवाक कीबोर्ड</translation>
 <translation id="8045462269890919536">रोमानियाई</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">रूसी फ़ोनेटिक</translation>
 <translation id="913758436357682283">म्यांमार म्यांसन कीबोर्ड</translation>
 <translation id="9153744823707037316">सरणी इनपुट पद्धति</translation>
+<translation id="9179672198516322668">लोकप्रिय शॉर्टकट</translation>
 <translation id="9206487995878691001">कैंग्जी इनपुट पद्धति</translation>
 <translation id="9219908252191632183">लूनर</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
index 037c27f..61122c3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">USA „Workman” billentyűzet</translation>
 <translation id="6970230597523682626">bolgár</translation>
 <translation id="6981982820502123353">Kisegítő lehetőségek</translation>
+<translation id="7020813747703216897">Nincs megfelelő találat</translation>
 <translation id="7025325401470358758">Következő ablaktábla</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Átírás (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Észt billentyűzet</translation>
 <translation id="719009910964971313">US Dvorak programozó billentyűzet</translation>
 <translation id="7222624196722476520">Bolgár fonetikus billentyűzet</translation>
+<translation id="7272373489634936181">Billentyűparancsok keresése</translation>
 <translation id="7348749398828259943">USA „Workman” nemzetközi billentyűzet</translation>
 <translation id="7389722738210761877">Thai billentyűzet (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindi billentyűzet (fonetikus)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA Colemak</translation>
 <translation id="7969525169268594403">szlovén</translation>
 <translation id="7987485481246785146">Sorani kurd arab alapú billentyűzet</translation>
+<translation id="8004192919599017226">Keresés indítása…</translation>
 <translation id="8008366997883261463">Jack Russell-terrier</translation>
 <translation id="8031722894461705849">Szlovák billentyűzet</translation>
 <translation id="8045462269890919536">román</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">orosz fonetikus</translation>
 <translation id="913758436357682283">Mianmari myansan billentyűzet</translation>
 <translation id="9153744823707037316">Tömbös beviteli mód</translation>
+<translation id="9179672198516322668">Népszerű billentyűparancsok</translation>
 <translation id="9206487995878691001">Cang-csie beviteli mód</translation>
 <translation id="9219908252191632183">Hold</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
index 0b329b3a..4975577 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Tastiera Workman USA</translation>
 <translation id="6970230597523682626">Bulgaro</translation>
 <translation id="6981982820502123353">Accessibilità</translation>
+<translation id="7020813747703216897">Nessun risultato corrispondente trovato</translation>
 <translation id="7025325401470358758">Riquadro successivo</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Traslitterazione (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Tastiera estone</translation>
 <translation id="719009910964971313">Tastiera US Programmer Dvorak</translation>
 <translation id="7222624196722476520">Tastiera fonetica Bulgaro</translation>
+<translation id="7272373489634936181">Cerca scorciatoie</translation>
 <translation id="7348749398828259943">Tastiera internazionale Workman USA</translation>
 <translation id="7389722738210761877">Tastiera Thailandese (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Tastiera Hindi (fonetica)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Colemak USA</translation>
 <translation id="7969525169268594403">Sloveno</translation>
 <translation id="7987485481246785146">Tastiera basata su arabo curdo sorani</translation>
+<translation id="8004192919599017226">Inizia ricerca...</translation>
 <translation id="8008366997883261463">Cane</translation>
 <translation id="8031722894461705849">Tastiera Slovacco</translation>
 <translation id="8045462269890919536">Rumeno</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Fonetica russa</translation>
 <translation id="913758436357682283">Tastiera Birmano myansan</translation>
 <translation id="9153744823707037316">Metodo di immissione Array</translation>
+<translation id="9179672198516322668">Scorciatoie comuni</translation>
 <translation id="9206487995878691001">Metodo di immissione Cangjie</translation>
 <translation id="9219908252191632183">Lunare</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
index 39b41131..cf7aa3db 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">US Workman キーボード</translation>
 <translation id="6970230597523682626">ブルガリア語</translation>
 <translation id="6981982820502123353">ユーザー補助機能</translation>
+<translation id="7020813747703216897">一致する結果は見つかりませんでした</translation>
 <translation id="7025325401470358758">次のウィンドウ</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">文字変換(salam → ሰላም)</translation>
 <translation id="7172053773111046550">エストニア語のキーボード</translation>
 <translation id="719009910964971313">US Programmer Dvorak キーボード</translation>
 <translation id="7222624196722476520">ブルガリア語(表音)キーボード</translation>
+<translation id="7272373489634936181">ショートカットを検索</translation>
 <translation id="7348749398828259943">US Workman インターナショナル キーボード</translation>
 <translation id="7389722738210761877">タイ語キーボード(TIS 820~2531)</translation>
 <translation id="7396038720194014279">ヒンディー語キーボード(表音)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">US Colemak 配列</translation>
 <translation id="7969525169268594403">スロベニア語</translation>
 <translation id="7987485481246785146">ソラニークルド語キーボード(アラビア語ベース)</translation>
+<translation id="8004192919599017226">検索を開始...</translation>
 <translation id="8008366997883261463">犬</translation>
 <translation id="8031722894461705849">スロバキア語キーボード</translation>
 <translation id="8045462269890919536">ルーマニア語</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">ロシア語(表音)</translation>
 <translation id="913758436357682283">ミャンマー Myansan キーボード</translation>
 <translation id="9153744823707037316">行列入力方法</translation>
+<translation id="9179672198516322668">定番のショートカット</translation>
 <translation id="9206487995878691001">倉頡入力方法</translation>
 <translation id="9219908252191632183">月面</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index 298f916..e0b7bdc2 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">한글 세벌식(최종)</translation>
 <translation id="5838825566232597749">미국 워크맨(국제)</translation>
 <translation id="5892290200158927959">프랑스어 BÉPO 키보드</translation>
-<translation id="5928303187149237472">화면 해상도 변경</translation>
+<translation id="5928303187149237472">해상도 변경</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">남미 언어 키보드</translation>
 <translation id="6012987430370760224">마라티어 키보드(음역 방식)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">미국 워크맨 키보드</translation>
 <translation id="6970230597523682626">불가리아어</translation>
 <translation id="6981982820502123353">접근성</translation>
+<translation id="7020813747703216897">일치하는 결과 없음</translation>
 <translation id="7025325401470358758">다음 창</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">음역(salam → ሰላም)</translation>
 <translation id="7172053773111046550">에스토니아어 키보드</translation>
 <translation id="719009910964971313">US 프로그래머 드보락 키보드</translation>
 <translation id="7222624196722476520">불가리아어 표음식 키보드</translation>
+<translation id="7272373489634936181">단축키 검색</translation>
 <translation id="7348749398828259943">미국 워크맨(국제) 키보드</translation>
 <translation id="7389722738210761877">태국어 키보드(TIS 820-2531)</translation>
 <translation id="7396038720194014279">힌디어 키보드(음역 방식)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">영어(미국) 콜마크</translation>
 <translation id="7969525169268594403">슬로베니아어</translation>
 <translation id="7987485481246785146">소라니 쿠르드어 아랍어 기반 키보드</translation>
+<translation id="8004192919599017226">검색 시작...</translation>
 <translation id="8008366997883261463">개</translation>
 <translation id="8031722894461705849">슬로바키아어 키보드</translation>
 <translation id="8045462269890919536">루마니아어</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">러시아어 표음</translation>
 <translation id="913758436357682283">미얀마 미얀산 키보드</translation>
 <translation id="9153744823707037316">배열 입력 방법</translation>
+<translation id="9179672198516322668">자주 쓰는 단축키</translation>
 <translation id="9206487995878691001">창힐 입력 방법</translation>
 <translation id="9219908252191632183">달</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
index 69aabf9f..8def99a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -90,7 +90,7 @@
 <translation id="3519867315646775981">ലിപ്യന്തരണം (shalom ← שלום)</translation>
 <translation id="3522708245912499433">പോര്‍ച്ചുഗീസ്</translation>
 <translation id="357479282490346887">ലിത്വാനിയന്‍</translation>
-<translation id="3592821358219525223">സിസ്‌റ്റവും, ഡിസ്‌പ്ലേ ക്രമീകരണവും</translation>
+<translation id="3592821358219525223">സിസ്‌റ്റം, ഡിസ്‌പ്ലേ ക്രമീകരണം</translation>
 <translation id="3603385196401704894">കനേഡിയന്‍ ഫ്രഞ്ച്</translation>
 <translation id="3606220979431771195">ടർക്കിഷ്-എഫ്</translation>
 <translation id="3619115746895587757">കാപ്പുചീനോ</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">യുഎസ് വർക്ക്‌മാൻ കീബോർഡ്</translation>
 <translation id="6970230597523682626">ബള്‍ഗേറിയന്‍</translation>
 <translation id="6981982820502123353">ഉപയോഗസഹായി</translation>
+<translation id="7020813747703216897">പൊരുത്തമുള്ള ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation>
 <translation id="7025325401470358758">അടുത്ത പാൻ</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">ലിപ്യന്തരണം (salam → ሰላም)</translation>
 <translation id="7172053773111046550">എസ്റ്റോണിയന്‍ കീബോര്‍ഡ്</translation>
 <translation id="719009910964971313">യുഎസ് പ്രോഗ്രാമർ ഡൊറാക്ക് കീബോർഡ്</translation>
 <translation id="7222624196722476520">ബൾഗേറിയൻ ഫൊണറ്റിക് കീബോർഡ്</translation>
+<translation id="7272373489634936181">കുറുക്കുവഴികൾക്കായി തിരയുക</translation>
 <translation id="7348749398828259943">യുഎസ് വർക്ക്മാൻ ഇന്റർനാഷണൽ കീബോർഡ്</translation>
 <translation id="7389722738210761877">തായ് കീബോർഡ് (TIS 820-2531)</translation>
 <translation id="7396038720194014279">ഹിന്ദി കീബോർഡ് (സ്വരസൂചകം)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">യുഎസ് കോൾമാക്ക്</translation>
 <translation id="7969525169268594403">സ്ലോവേനിയന്‍</translation>
 <translation id="7987485481246785146">സൊറാനി കുർദ്ദിഷ് അറബിക് അധിഷ്‌ഠിത കീബോർഡ്</translation>
+<translation id="8004192919599017226">തിരയൽ ആരംഭിക്കുക...</translation>
 <translation id="8008366997883261463">ജാക്ക് റസ്സൽ ടെറിയർ</translation>
 <translation id="8031722894461705849">സ്ലോവാക് കീബോർഡ്</translation>
 <translation id="8045462269890919536">റുമാനിയന്‍</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">റഷ്യൻ സ്വരസൂചകം</translation>
 <translation id="913758436357682283">മ്യാൻമാർ മ്യാൻസൻ കീബോർഡ്</translation>
 <translation id="9153744823707037316">അറേ ടൈപ്പുചെയ്യൽ രീതി</translation>
+<translation id="9179672198516322668">ജനപ്രിയ കുറുക്കുവഴികൾ</translation>
 <translation id="9206487995878691001">സാങ്‌ചി ടൈപ്പുചെയ്യൽ രീതി</translation>
 <translation id="9219908252191632183">ലൂണാർ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
index 5461697..ffe599de 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">यूएस कामगार कीबोर्ड</translation>
 <translation id="6970230597523682626">बल्गेरियन</translation>
 <translation id="6981982820502123353">प्रवेशयोग्यता</translation>
+<translation id="7020813747703216897">जुळणारे परिणाम आढळले नाहीत</translation>
 <translation id="7025325401470358758">पुढील उपखंड</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">लिप्यंतरण (salam → ሰላም)</translation>
 <translation id="7172053773111046550">एस्टोनियन कीबोर्ड</translation>
 <translation id="719009910964971313">यूएस प्रोग्रामर द्वोराक कीबोर्ड</translation>
 <translation id="7222624196722476520">बल्गेरियन Phonetic कीबोर्ड</translation>
+<translation id="7272373489634936181">शॉर्टकट शोधा</translation>
 <translation id="7348749398828259943">यूएस कामगार आंतरराष्ट्रीय कीबोर्ड</translation>
 <translation id="7389722738210761877">थाई कीबोर्ड (TIS 820-2531)</translation>
 <translation id="7396038720194014279">हिंदी कीबोर्ड (फोनेटिक)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">यूएस कोलमॅक</translation>
 <translation id="7969525169268594403">स्लोव्हेनियन</translation>
 <translation id="7987485481246785146">सोरानी कुर्दिश अरेबिक-आधारित कीबोर्ड</translation>
+<translation id="8004192919599017226">शोध सुरू करा...</translation>
 <translation id="8008366997883261463">कुत्रा</translation>
 <translation id="8031722894461705849">स्लोव्हाक कीबोर्ड</translation>
 <translation id="8045462269890919536">रोमानियन</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">रशियन ध्वन्यात्मक</translation>
 <translation id="913758436357682283">म्यानमार म्यानसान कीबोर्ड</translation>
 <translation id="9153744823707037316">अॅरे इनपुट पद्धत</translation>
+<translation id="9179672198516322668">लोकप्रिय शॉर्टकट</translation>
 <translation id="9206487995878691001">कँगजी इनपुट पद्धत</translation>
 <translation id="9219908252191632183">लुनार</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
index a88ac55..51597902 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">Hangul 3 Set (Final)</translation>
 <translation id="5838825566232597749">Amerikaans Workman (internationaal)</translation>
 <translation id="5892290200158927959">Frans BÉPO-toetsenbord</translation>
-<translation id="5928303187149237472">Schermresolutie wijzigen</translation>
+<translation id="5928303187149237472">Resolutie wijzigen</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">Latijns-Amerikaans toetsenbord</translation>
 <translation id="6012987430370760224">Marathi toetsenbord (fonetisch)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Amerikaans Workman-toetsenbord</translation>
 <translation id="6970230597523682626">Bulgaars</translation>
 <translation id="6981982820502123353">Toegankelijkheid</translation>
+<translation id="7020813747703216897">Geen overeenkomende resultaten gevonden</translation>
 <translation id="7025325401470358758">Volgend deelvenster</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliteratie (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estlands toetsenbord</translation>
 <translation id="719009910964971313">Amerikaans Programmer Dvorak-toetsenbord</translation>
 <translation id="7222624196722476520">Bulgaars fonetisch toetsenbord</translation>
+<translation id="7272373489634936181">Zoeken naar sneltoetsen</translation>
 <translation id="7348749398828259943">Amerikaans Workman-toetsenbord (internationaal)</translation>
 <translation id="7389722738210761877">Thais toetsenbord (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindi toetsenbord (fonetisch)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Amerikaans Colemak</translation>
 <translation id="7969525169268594403">Sloveens</translation>
 <translation id="7987485481246785146">Op Arabisch gebaseerd toetsenbord voor Soranî</translation>
+<translation id="8004192919599017226">Zoeken starten...</translation>
 <translation id="8008366997883261463">Jack Russell-terriër</translation>
 <translation id="8031722894461705849">Slowaaks toetsenbord</translation>
 <translation id="8045462269890919536">Roemeens</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Russisch fonetisch</translation>
 <translation id="913758436357682283">Myanmar MyanSan-toetsenbord</translation>
 <translation id="9153744823707037316">Array-invoermethode</translation>
+<translation id="9179672198516322668">Populaire sneltoetsen</translation>
 <translation id="9206487995878691001">Cangjie-invoermethode</translation>
 <translation id="9219908252191632183">Lunair</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
index 0ae0a10..1d630a3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Workman-tastatur (USA)</translation>
 <translation id="6970230597523682626">Bulgarsk</translation>
 <translation id="6981982820502123353">Tilgjengelighet</translation>
+<translation id="7020813747703216897">Ingen treff</translation>
 <translation id="7025325401470358758">Neste rute</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Translitterasjon (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estisk tastatur</translation>
 <translation id="719009910964971313">Amerikansk programmeringstastatur (Dvorak)</translation>
 <translation id="7222624196722476520">Bulgarsk tastatur (fonetisk)</translation>
+<translation id="7272373489634936181">Søk etter hurtigtaster</translation>
 <translation id="7348749398828259943">Internasjonalt Workman-tastatur (USA)</translation>
 <translation id="7389722738210761877">Thai-tastatur (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hindi-tastatur (fonetisk)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA Colemak</translation>
 <translation id="7969525169268594403">Slovensk</translation>
 <translation id="7987485481246785146">Arabisk-basert tastatur for kurdisk (sorani)</translation>
+<translation id="8004192919599017226">Start søket</translation>
 <translation id="8008366997883261463">Jack Russell-terrier</translation>
 <translation id="8031722894461705849">Slovakisk tastatur</translation>
 <translation id="8045462269890919536">Rumensk</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Russisk fonetisk</translation>
 <translation id="913758436357682283">Myanmar Myansan-tastatur</translation>
 <translation id="9153744823707037316">Inndatametode for matrise</translation>
+<translation id="9179672198516322668">Populære hurtigtaster</translation>
 <translation id="9206487995878691001">Cangjie-inndatametode</translation>
 <translation id="9219908252191632183">Månelandskap</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index dbf227d..26470c0 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Tastatură S.U.A. Workman</translation>
 <translation id="6970230597523682626">Bulgară</translation>
 <translation id="6981982820502123353">Accesibilitate</translation>
+<translation id="7020813747703216897">Nu s-a găsit niciun rezultat de căutare</translation>
 <translation id="7025325401470358758">Panoul următor</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Transliterație (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Tastatură estonă</translation>
 <translation id="719009910964971313">Tastatura pentru programatori S.U.A Dvorak</translation>
 <translation id="7222624196722476520">Tastatură bulgară fonetică</translation>
+<translation id="7272373489634936181">Caută comenzi rapide</translation>
 <translation id="7348749398828259943">Tastatură S.U.A. Workman internațională</translation>
 <translation id="7389722738210761877">Tastatură thailandeză (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Tastatură hindi (Fonetică)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">S.U.A. Colemak</translation>
 <translation id="7969525169268594403">Slovenă</translation>
 <translation id="7987485481246785146">Tastatură kurdă sorani bazată pe arabă</translation>
+<translation id="8004192919599017226">Începe căutarea...</translation>
 <translation id="8008366997883261463">Terier</translation>
 <translation id="8031722894461705849">Tastatură slovacă</translation>
 <translation id="8045462269890919536">Română</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Rusă fonetică</translation>
 <translation id="913758436357682283">Tastatură birmană Myansan</translation>
 <translation id="9153744823707037316">Metoda de introducere a textului Array</translation>
+<translation id="9179672198516322668">Comenzi rapide populare</translation>
 <translation id="9206487995878691001">Metoda de introducere a textului Cangjie</translation>
 <translation id="9219908252191632183">Peisaj lunar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
index 1c0546a..f92b86a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">Корейская раскладка (Sebeolsik Final)</translation>
 <translation id="5838825566232597749">США (Workman, международная)</translation>
 <translation id="5892290200158927959">Французская раскладка (BÉPO)</translation>
-<translation id="5928303187149237472">Изменить разрешение экрана</translation>
+<translation id="5928303187149237472">Изменить разрешение экрана.</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">Латиноамериканская раскладка</translation>
 <translation id="6012987430370760224">Клавиатура маратхи (фонетическая)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Раскладка США (Workman)</translation>
 <translation id="6970230597523682626">Болгарский</translation>
 <translation id="6981982820502123353">Специальные возможности</translation>
+<translation id="7020813747703216897">Ничего не найдено.</translation>
 <translation id="7025325401470358758">Следующая панель</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Транслитерация (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Эстонская раскладка</translation>
 <translation id="719009910964971313">Клавиатура Дворака для программистов (США)</translation>
 <translation id="7222624196722476520">Болгарская раскладка (фонетическая)</translation>
+<translation id="7272373489634936181">Поиск быстрых клавиш</translation>
 <translation id="7348749398828259943">Раскладка США (Workman, международная)</translation>
 <translation id="7389722738210761877">Тайская раскладка (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Клавиатура хинди (фонетическая)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">США (Colemak)</translation>
 <translation id="7969525169268594403">Словенский</translation>
 <translation id="7987485481246785146">Раскладка сорани (арабский алфавит)</translation>
+<translation id="8004192919599017226">Начать поиск…</translation>
 <translation id="8008366997883261463">Собака</translation>
 <translation id="8031722894461705849">Словацкая раскладка</translation>
 <translation id="8045462269890919536">Румынский</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Русская (фонетическая)</translation>
 <translation id="913758436357682283">Мьянманская раскладка (Myansan)</translation>
 <translation id="9153744823707037316">Способ ввода массива</translation>
+<translation id="9179672198516322668">Часто используемые быстрые клавиши</translation>
 <translation id="9206487995878691001">Цан-цзе</translation>
 <translation id="9219908252191632183">Луна</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
index cff88bbd..e1cb188 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -215,12 +215,14 @@
 <translation id="6939777852457331078">Tipkovnica za angleščino (Združene države) – Workman</translation>
 <translation id="6970230597523682626">bolgarščina</translation>
 <translation id="6981982820502123353">Dostopnost</translation>
+<translation id="7020813747703216897">Ni ustreznih rezultatov</translation>
 <translation id="7025325401470358758">Naslednje podokno</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Prečrkovanje (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estonska tipkovnica</translation>
 <translation id="719009910964971313">ameriška tpkovnica Dvorak za programerje</translation>
 <translation id="7222624196722476520">Fonetična tipkovnica za bolgarščino</translation>
+<translation id="7272373489634936181">Iskanje bližnjic</translation>
 <translation id="7348749398828259943">Mednarodna tipkovnica za angleščino (Združene države) – Workman</translation>
 <translation id="7389722738210761877">Tipkovnica za tajščino (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Tipkovnica za hindijščino (fonetična)</translation>
@@ -245,6 +247,7 @@
 <translation id="7943385054491506837">Združene države – Colemak</translation>
 <translation id="7969525169268594403">slovenščina</translation>
 <translation id="7987485481246785146">Tipkovnica za soransko kurdščino na arabski osnovi</translation>
+<translation id="8004192919599017226">Začni iskanje …</translation>
 <translation id="8008366997883261463">Pes</translation>
 <translation id="8031722894461705849">Slovaška tipkovnica</translation>
 <translation id="8045462269890919536">romunščina</translation>
@@ -284,6 +287,7 @@
 <translation id="9017798300203431059">ruščina (fonetična)</translation>
 <translation id="913758436357682283">Tipkovnica za mjanmarščino (Myansan)</translation>
 <translation id="9153744823707037316">Način vnosa s tabelo</translation>
+<translation id="9179672198516322668">Priljubljene bližnjice</translation>
 <translation id="9206487995878691001">Način vnosa cangče</translation>
 <translation id="9219908252191632183">Mesečeva pokrajina</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
index 7a687fd..6e78fb67 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Америчка Workman тастатура</translation>
 <translation id="6970230597523682626">бугарски</translation>
 <translation id="6981982820502123353">Приступачност</translation>
+<translation id="7020813747703216897">Нисмо пронашли ниједан одговарајући резултат</translation>
 <translation id="7025325401470358758">Следећи оквир</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Транслитерација (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Језик тастатуре: естонски</translation>
 <translation id="719009910964971313">Америчка Дворак тастатура за програмере</translation>
 <translation id="7222624196722476520">Бугарска фонетска тастатура</translation>
+<translation id="7272373489634936181">Претражите пречице</translation>
 <translation id="7348749398828259943">Америчка Workman интернационална тастатура</translation>
 <translation id="7389722738210761877">Тајска тастатура (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Хинди тастатура (фонетска)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">америчка Colemak</translation>
 <translation id="7969525169268594403">словеначки</translation>
 <translation id="7987485481246785146">Сорани курдска тастатура заснована на арапском</translation>
+<translation id="8004192919599017226">Започни претрагу...</translation>
 <translation id="8008366997883261463">Пас</translation>
 <translation id="8031722894461705849">Словачка тастатура</translation>
 <translation id="8045462269890919536">румунски</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">руска фонетска</translation>
 <translation id="913758436357682283">Мјанмарска мјансан тастатура</translation>
 <translation id="9153744823707037316">Метод уноса Array</translation>
+<translation id="9179672198516322668">Популарне пречице</translation>
 <translation id="9206487995878691001">Метод уноса чангчије</translation>
 <translation id="9219908252191632183">Месечева површина</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
index a361cfcf..426627c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">Workman-tangentbord för USA</translation>
 <translation id="6970230597523682626">bulgariska</translation>
 <translation id="6981982820502123353">Tillgänglighet</translation>
+<translation id="7020813747703216897">Inga matchande sökresultat hittades</translation>
 <translation id="7025325401470358758">Nästa ruta</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Translitterering (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estniskt tangentbord</translation>
 <translation id="719009910964971313">Dvorak-tangentbord för programmerare i USA</translation>
 <translation id="7222624196722476520">Bulgariskt fonetiskt tangentbord</translation>
+<translation id="7272373489634936181">Sök efter kortkommandon</translation>
 <translation id="7348749398828259943">Internationellt Workman-tangentbord för USA</translation>
 <translation id="7389722738210761877">Tangentbord för thailändska (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Tangentbord för hindi (fonetiskt)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">USA (colemak)</translation>
 <translation id="7969525169268594403">slovenska</translation>
 <translation id="7987485481246785146">Tangentbord baserat på sorani/kurdiska och arabiska</translation>
+<translation id="8004192919599017226">Starta sökningen …</translation>
 <translation id="8008366997883261463">Hund</translation>
 <translation id="8031722894461705849">Slovakiskt tangentbord</translation>
 <translation id="8045462269890919536">rumänska</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Ryska (fonetiskt)</translation>
 <translation id="913758436357682283">Myanmar myansan-tangentbord</translation>
 <translation id="9153744823707037316">Inmatningsmetoden Array</translation>
+<translation id="9179672198516322668">Populära kortkommandon</translation>
 <translation id="9206487995878691001">Inmatningsmetoden Cangjie</translation>
 <translation id="9219908252191632183">Måne</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index 8fd0c53..d2bfdb8 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">யுஎஸ் ஒர்க்மேன் விசைப்பலகை</translation>
 <translation id="6970230597523682626">பல்கேரியன்</translation>
 <translation id="6981982820502123353">அணுகல் தன்மை</translation>
+<translation id="7020813747703216897">பொருந்தும் முடிவுகள் எதுவுமில்லை</translation>
 <translation id="7025325401470358758">அடுத்த பலகம்</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">ஒலிபெயர்ப்பு (salam → ሰላም)</translation>
 <translation id="7172053773111046550">எஸ்தோனியன் விசைப்பலகை</translation>
 <translation id="719009910964971313">US புரோகிராமர் டிவோரக் விசைப்பலகை</translation>
 <translation id="7222624196722476520">பல்கேரியன் ஒலிப்புமுறை விசைப்பலகை</translation>
+<translation id="7272373489634936181">குறுக்குவழிகளைத் தேடவும்</translation>
 <translation id="7348749398828259943">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல் விசைப்பலகை</translation>
 <translation id="7389722738210761877">தாய் விசைப்பலகை (TIS 820-2531)</translation>
 <translation id="7396038720194014279">இந்தி விசைப்பலகை (ஒலிப்புமுறை)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">யு.எஸ். கோல்மேக்</translation>
 <translation id="7969525169268594403">ஸ்லோவேனியன்</translation>
 <translation id="7987485481246785146">சொரானி குர்டிஷ் அரபிக் விசைப்பலகை</translation>
+<translation id="8004192919599017226">தேடலைத் தொடங்கு...</translation>
 <translation id="8008366997883261463">ஜாக் ரஸ்ஸல் டெர்ரியர்</translation>
 <translation id="8031722894461705849">ஸ்லோவாக் விசைப்பலகை</translation>
 <translation id="8045462269890919536">ரோமானியன்</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">ரஷ்யன் ஒலிப்புமுறை</translation>
 <translation id="913758436357682283">மியான்மர் மியான்சன் விசைப்பலகை</translation>
 <translation id="9153744823707037316">வரிசை உள்ளீட்டு முறை</translation>
+<translation id="9179672198516322668">பிரபல ஷார்ட்கட்கள்</translation>
 <translation id="9206487995878691001">கான்ஜி உள்ளீட்டு முறை</translation>
 <translation id="9219908252191632183">லூனார்</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
index 6ccb743..7b8c90a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">US వర్క్‌మాన్ కీబోర్డ్</translation>
 <translation id="6970230597523682626">బల్గేరియన్</translation>
 <translation id="6981982820502123353">ప్రాప్యత</translation>
+<translation id="7020813747703216897">సరిపోలే ఫలితాలు ఏవీ కనుగొనబడలేదు</translation>
 <translation id="7025325401470358758">తదుపరి పేన్</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">లిప్యంతరీకరణ (salam → ሰላም)</translation>
 <translation id="7172053773111046550">ఎస్టోనియన్ కీబోర్డ్</translation>
 <translation id="719009910964971313">US ప్రోగ్రామర్ డ్వోరక్ కీబోర్డ్</translation>
 <translation id="7222624196722476520">బల్గేరియన్ ఫొనెటిక్ కీబోర్డ్</translation>
+<translation id="7272373489634936181">సత్వరమార్గాల కోసం శోధించండి</translation>
 <translation id="7348749398828259943">US వర్క్‌మాన్ అంతర్జాతీయ కీబోర్డ్</translation>
 <translation id="7389722738210761877">థాయ్ కీబోర్డ్ (TIS 820-2531)</translation>
 <translation id="7396038720194014279">హిందీ కీబోర్డ్ (ఫొనెటిక్)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">యుఎస్ కోల్‌మక్</translation>
 <translation id="7969525169268594403">స్లోవేనియన్</translation>
 <translation id="7987485481246785146">సొరానీ కుర్డిష్ అరబిక్-ఆధారిత కీబోర్డ్</translation>
+<translation id="8004192919599017226">శోధనను ప్రారంభించండి...</translation>
 <translation id="8008366997883261463">జాక్ రస్సెల్ టెర్రియర్</translation>
 <translation id="8031722894461705849">స్లోవక్ కీబోర్డ్</translation>
 <translation id="8045462269890919536">రొమేనియన్</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">రష్యన్ ఫోనెటిక్</translation>
 <translation id="913758436357682283">మయన్మార్ మయన్‌సన్ కీబోర్డ్</translation>
 <translation id="9153744823707037316">శ్రేణి ఇన్‌పుట్ పద్ధతి</translation>
+<translation id="9179672198516322668">జనాదరణ పొందిన సత్వరమార్గాలు</translation>
 <translation id="9206487995878691001">కాంగ్జీ ఇన్‌పుట్ పద్ధతి</translation>
 <translation id="9219908252191632183">లూనార్</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
index 1bc4765..bd0863cf 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">Hangul 3 Grubu (Son)</translation>
 <translation id="5838825566232597749">ABD Workman uluslararası</translation>
 <translation id="5892290200158927959">Fransızca BÉPO klavyesi</translation>
-<translation id="5928303187149237472">Ekran çözünürlüğünü değiştirir</translation>
+<translation id="5928303187149237472">Ekran çözünürlüğünü değiştirin</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">Latin Amerika klavyesi</translation>
 <translation id="6012987430370760224">Marathi klavye (Fonetik)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">ABD Workman klavye</translation>
 <translation id="6970230597523682626">Bulgarca</translation>
 <translation id="6981982820502123353">Erişilebilirlik</translation>
+<translation id="7020813747703216897">Eşleşen sonuç bulunamadı</translation>
 <translation id="7025325401470358758">Sonraki bölme</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">Harf çevirisi (salam → ሰላም)</translation>
 <translation id="7172053773111046550">Estonca klavye</translation>
 <translation id="719009910964971313">ABD Programcı Dvorak klavye</translation>
 <translation id="7222624196722476520">Bulgarca Fonetik klavye</translation>
+<translation id="7272373489634936181">Kısayol ara</translation>
 <translation id="7348749398828259943">ABD Workman uluslararası klavye</translation>
 <translation id="7389722738210761877">Tayca klavye (TIS 820-2531)</translation>
 <translation id="7396038720194014279">Hintçe klavye (Fonetik)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">ABD Colemak</translation>
 <translation id="7969525169268594403">Slovence</translation>
 <translation id="7987485481246785146">Sorani Kürtçe Arapça temelli klavye</translation>
+<translation id="8004192919599017226">Aramayı başlat...</translation>
 <translation id="8008366997883261463">Jack Russell Teriyeri</translation>
 <translation id="8031722894461705849">Slovakça klavye</translation>
 <translation id="8045462269890919536">Rumence</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">Rusça fonetik</translation>
 <translation id="913758436357682283">Myanmar Myansan klavyesi</translation>
 <translation id="9153744823707037316">Dizi giriş yöntemi</translation>
+<translation id="9179672198516322668">Popüler Kısayollar</translation>
 <translation id="9206487995878691001">Kanji giriş yöntemi</translation>
 <translation id="9219908252191632183">Ay</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
index 363b93b..e314eff 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -175,7 +175,7 @@
 <translation id="5819442873484330149">韩语(3 Set,终极版)</translation>
 <translation id="5838825566232597749">美式 Workman 国际</translation>
 <translation id="5892290200158927959">法语 BÉPO 键盘</translation>
-<translation id="5928303187149237472">更改显示分辨率</translation>
+<translation id="5928303187149237472">更改屏幕分辨率</translation>
 <translation id="5932901536148835538">Chromebit</translation>
 <translation id="6005282720244019462">拉丁美洲文键盘</translation>
 <translation id="6012987430370760224">马拉地语键盘(注音)</translation>
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">美式 Workman 键盘</translation>
 <translation id="6970230597523682626">保加利亚语</translation>
 <translation id="6981982820502123353">无障碍</translation>
+<translation id="7020813747703216897">找不到相符的搜索结果</translation>
 <translation id="7025325401470358758">下一窗格</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">音译(salam → ሰላም)</translation>
 <translation id="7172053773111046550">爱沙尼亚语键盘</translation>
 <translation id="719009910964971313">美式 Programmer Dvorak 键盘</translation>
 <translation id="7222624196722476520">保加利亚语注音键盘</translation>
+<translation id="7272373489634936181">搜索快捷键</translation>
 <translation id="7348749398828259943">美式 Workman 国际键盘</translation>
 <translation id="7389722738210761877">泰语键盘(TIS 820-2531)</translation>
 <translation id="7396038720194014279">印地语键盘(注音)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">美国英语(Colemak)</translation>
 <translation id="7969525169268594403">斯洛维尼亚语</translation>
 <translation id="7987485481246785146">索拉尼库尔德语(阿拉伯语字母)键盘</translation>
+<translation id="8004192919599017226">开始搜索…</translation>
 <translation id="8008366997883261463">杰克罗素梗犬</translation>
 <translation id="8031722894461705849">斯洛伐克语键盘</translation>
 <translation id="8045462269890919536">罗马尼亚语</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">俄语(注音)</translation>
 <translation id="913758436357682283">缅甸语Myansan键盘</translation>
 <translation id="9153744823707037316">行列输入法</translation>
+<translation id="9179672198516322668">常用快捷键</translation>
 <translation id="9206487995878691001">仓颉输入法</translation>
 <translation id="9219908252191632183">月球表面</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
index 5096264e..4aedd21 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -216,12 +216,14 @@
 <translation id="6939777852457331078">美式 Workman 鍵盤</translation>
 <translation id="6970230597523682626">保加利亞文</translation>
 <translation id="6981982820502123353">協助工具</translation>
+<translation id="7020813747703216897">找不到相符的搜尋結果</translation>
 <translation id="7025325401470358758">下一個窗格</translation>
 <translation id="714034171374937760">Chromebase</translation>
 <translation id="7170467426996704624">音譯 (salam → ሰላም)</translation>
 <translation id="7172053773111046550">愛沙尼亞文鍵盤</translation>
 <translation id="719009910964971313">美式 Programmer Dvorak 鍵盤</translation>
 <translation id="7222624196722476520">保加利亞文拼音鍵盤</translation>
+<translation id="7272373489634936181">搜尋快速鍵</translation>
 <translation id="7348749398828259943">美式 Workman 國際鍵盤</translation>
 <translation id="7389722738210761877">泰文鍵盤 (TIS 820-2531)</translation>
 <translation id="7396038720194014279">北印度文鍵盤 (拼音)</translation>
@@ -246,6 +248,7 @@
 <translation id="7943385054491506837">Colemak 美式配置</translation>
 <translation id="7969525169268594403">斯洛維尼亞文</translation>
 <translation id="7987485481246785146">索拉尼庫爾德式阿拉伯文鍵盤</translation>
+<translation id="8004192919599017226">開始搜尋...</translation>
 <translation id="8008366997883261463">傑克羅素梗</translation>
 <translation id="8031722894461705849">斯洛伐克文鍵盤</translation>
 <translation id="8045462269890919536">羅馬尼亞文</translation>
@@ -285,6 +288,7 @@
 <translation id="9017798300203431059">俄文 (拼音)</translation>
 <translation id="913758436357682283">緬甸文 Myansan 鍵盤</translation>
 <translation id="9153744823707037316">行列輸入法</translation>
+<translation id="9179672198516322668">常用快速鍵</translation>
 <translation id="9206487995878691001">倉頡輸入法</translation>
 <translation id="9219908252191632183">月球表面</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ui/compositor/layer_animator.cc b/ui/compositor/layer_animator.cc
index b4a344489..5809b9d 100644
--- a/ui/compositor/layer_animator.cc
+++ b/ui/compositor/layer_animator.cc
@@ -14,7 +14,7 @@
 #include "cc/animation/animation_id_provider.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/animation/element_animations.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/layer.h"
@@ -55,8 +55,8 @@
       disable_timer_for_test_(false),
       adding_animations_(false),
       animation_metrics_reporter_(nullptr) {
-  animation_player_ = cc::SingleKeyframeEffectAnimationPlayer::Create(
-      cc::AnimationIdProvider::NextPlayerId());
+  animation_ = cc::SingleKeyframeEffectAnimation::Create(
+      cc::AnimationIdProvider::NextAnimationId());
 }
 
 LayerAnimator::~LayerAnimator() {
@@ -66,7 +66,7 @@
   }
   ClearAnimationsInternal();
   delegate_ = NULL;
-  DCHECK(!animation_player_->animation_timeline());
+  DCHECK(!animation_->animation_timeline());
 }
 
 // static
@@ -138,9 +138,9 @@
 
 void LayerAnimator::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
   if (delegate_)
-    DetachLayerFromAnimationPlayer();
+    DetachLayerFromAnimation();
   if (new_layer)
-    AttachLayerToAnimationPlayer(new_layer->id());
+    AttachLayerToAnimation(new_layer->id());
 }
 
 void LayerAnimator::AttachLayerAndTimeline(Compositor* compositor) {
@@ -148,10 +148,10 @@
 
   cc::AnimationTimeline* timeline = compositor->GetAnimationTimeline();
   DCHECK(timeline);
-  timeline->AttachPlayer(animation_player_);
+  timeline->AttachAnimation(animation_);
 
   DCHECK(delegate_->GetCcLayer());
-  AttachLayerToAnimationPlayer(delegate_->GetCcLayer()->id());
+  AttachLayerToAnimation(delegate_->GetCcLayer()->id());
 }
 
 void LayerAnimator::DetachLayerAndTimeline(Compositor* compositor) {
@@ -160,40 +160,40 @@
   cc::AnimationTimeline* timeline = compositor->GetAnimationTimeline();
   DCHECK(timeline);
 
-  DetachLayerFromAnimationPlayer();
-  timeline->DetachPlayer(animation_player_);
+  DetachLayerFromAnimation();
+  timeline->DetachAnimation(animation_);
 }
 
-void LayerAnimator::AttachLayerToAnimationPlayer(int layer_id) {
+void LayerAnimator::AttachLayerToAnimation(int layer_id) {
   // For ui, layer and element ids are equivalent.
   cc::ElementId element_id(layer_id);
-  if (!animation_player_->element_id())
-    animation_player_->AttachElement(element_id);
+  if (!animation_->element_id())
+    animation_->AttachElement(element_id);
   else
-    DCHECK_EQ(animation_player_->element_id(), element_id);
+    DCHECK_EQ(animation_->element_id(), element_id);
 
-  animation_player_->set_animation_delegate(this);
+  animation_->set_animation_delegate(this);
 }
 
-void LayerAnimator::DetachLayerFromAnimationPlayer() {
-  animation_player_->set_animation_delegate(nullptr);
+void LayerAnimator::DetachLayerFromAnimation() {
+  animation_->set_animation_delegate(nullptr);
 
-  if (animation_player_->element_id())
-    animation_player_->DetachElement();
+  if (animation_->element_id())
+    animation_->DetachElement();
 }
 
 void LayerAnimator::AddThreadedAnimation(
     std::unique_ptr<cc::KeyframeModel> animation) {
-  animation_player_->AddKeyframeModel(std::move(animation));
+  animation_->AddKeyframeModel(std::move(animation));
 }
 
 void LayerAnimator::RemoveThreadedAnimation(int keyframe_model_id) {
-  animation_player_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(keyframe_model_id);
 }
 
-cc::SingleKeyframeEffectAnimationPlayer*
-LayerAnimator::GetAnimationPlayerForTesting() const {
-  return animation_player_.get();
+cc::SingleKeyframeEffectAnimation* LayerAnimator::GetAnimationForTesting()
+    const {
+  return animation_.get();
 }
 
 void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) {
diff --git a/ui/compositor/layer_animator.h b/ui/compositor/layer_animator.h
index 785bfdb..9f19dce 100644
--- a/ui/compositor/layer_animator.h
+++ b/ui/compositor/layer_animator.h
@@ -26,7 +26,7 @@
 class Animation;
 class AnimationTimeline;
 class Layer;
-class SingleKeyframeEffectAnimationPlayer;
+class SingleKeyframeEffectAnimation;
 }
 
 namespace gfx {
@@ -114,12 +114,12 @@
   // Unsubscribe from |cc_layer_| and subscribe to |new_layer|.
   void SwitchToLayer(scoped_refptr<cc::Layer> new_layer);
 
-  // Attach AnimationPlayer to Layer and AnimationTimeline
+  // Attach Animation to Layer and AnimationTimeline
   void AttachLayerAndTimeline(Compositor* compositor);
-  // Detach AnimationPlayer from Layer and AnimationTimeline
+  // Detach Animation from Layer and AnimationTimeline
   void DetachLayerAndTimeline(Compositor* compositor);
 
-  cc::SingleKeyframeEffectAnimationPlayer* GetAnimationPlayerForTesting() const;
+  cc::SingleKeyframeEffectAnimation* GetAnimationForTesting() const;
 
   // Sets the animation preemption strategy. This determines the behaviour if
   // a property is set during an animation. The default is
@@ -375,8 +375,8 @@
       std::unique_ptr<cc::KeyframeModel> keyframe_model) override;
   void RemoveThreadedAnimation(int keyframe_model_id) override;
 
-  void AttachLayerToAnimationPlayer(int layer_id);
-  void DetachLayerFromAnimationPlayer();
+  void AttachLayerToAnimation(int layer_id);
+  void DetachLayerFromAnimation();
 
   void set_animation_metrics_reporter(AnimationMetricsReporter* reporter) {
     animation_metrics_reporter_ = reporter;
@@ -389,7 +389,7 @@
   LayerAnimationDelegate* delegate_;
 
   // Plays CC animations.
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> animation_player_;
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> animation_;
 
   // The currently running animations.
   RunningAnimations running_animations_;
diff --git a/ui/compositor/layer_owner_unittest.cc b/ui/compositor/layer_owner_unittest.cc
index ad9761c..3a6b60b 100644
--- a/ui/compositor/layer_owner_unittest.cc
+++ b/ui/compositor/layer_owner_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/test/null_task_runner.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/layer.h"
@@ -176,7 +176,7 @@
 }
 
 // Tests that if LayerOwner-derived class destroys layer, then
-// LayerAnimator's player becomes detached from compositor timeline.
+// LayerAnimator's animation becomes detached from compositor timeline.
 TEST_F(LayerOwnerTestWithCompositor, DetachTimelineOnAnimatorDeletion) {
   std::unique_ptr<Layer> root_layer(new Layer);
   compositor()->SetRootLayer(root_layer.get());
@@ -186,18 +186,18 @@
   layer->SetOpacity(0.5f);
   root_layer->Add(layer);
 
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> player =
-      layer->GetAnimator()->GetAnimationPlayerForTesting();
-  EXPECT_TRUE(player);
-  EXPECT_TRUE(player->animation_timeline());
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> animation =
+      layer->GetAnimator()->GetAnimationForTesting();
+  EXPECT_TRUE(animation);
+  EXPECT_TRUE(animation->animation_timeline());
 
-  // Destroying layer/animator must detach animator's player from timeline.
+  // Destroying layer/animator must detach animator's animation from timeline.
   owner.DestroyLayerForTesting();
-  EXPECT_FALSE(player->animation_timeline());
+  EXPECT_FALSE(animation->animation_timeline());
 }
 
 // Tests that if we run threaded opacity animation on already added layer
-// then LayerAnimator's player becomes attached to timeline.
+// then LayerAnimator's animation becomes attached to timeline.
 TEST_F(LayerOwnerTestWithCompositor,
        AttachTimelineIfAnimatorCreatedAfterSetCompositor) {
   std::unique_ptr<Layer> root_layer(new Layer);
@@ -209,10 +209,10 @@
 
   layer->SetOpacity(0.5f);
 
-  scoped_refptr<cc::SingleKeyframeEffectAnimationPlayer> player =
-      layer->GetAnimator()->GetAnimationPlayerForTesting();
-  EXPECT_TRUE(player);
-  EXPECT_TRUE(player->animation_timeline());
+  scoped_refptr<cc::SingleKeyframeEffectAnimation> animation =
+      layer->GetAnimator()->GetAnimationForTesting();
+  EXPECT_TRUE(animation);
+  EXPECT_TRUE(animation->animation_timeline());
 }
 
 }  // namespace ui
diff --git a/ui/compositor/layer_unittest.cc b/ui/compositor/layer_unittest.cc
index 84178f75..a544b33 100644
--- a/ui/compositor/layer_unittest.cc
+++ b/ui/compositor/layer_unittest.cc
@@ -27,7 +27,7 @@
 #include "cc/animation/animation_events.h"
 #include "cc/animation/animation_host.h"
 #include "cc/animation/keyframe_effect.h"
-#include "cc/animation/single_keyframe_effect_animation_player.h"
+#include "cc/animation/single_keyframe_effect_animation.h"
 #include "cc/layers/layer.h"
 #include "cc/test/pixel_test_utils.h"
 #include "components/viz/common/frame_sinks/copy_output_request.h"
@@ -1933,43 +1933,43 @@
   l1->SetAnimator(LayerAnimator::CreateImplicitAnimator());
   l2->SetAnimator(LayerAnimator::CreateImplicitAnimator());
 
-  auto* player1 = l1->GetAnimator()->GetAnimationPlayerForTesting();
-  auto* player2 = l2->GetAnimator()->GetAnimationPlayerForTesting();
+  auto* animation1 = l1->GetAnimator()->GetAnimationForTesting();
+  auto* animation2 = l2->GetAnimator()->GetAnimationForTesting();
 
-  EXPECT_FALSE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   // Trigger a threaded animation.
   l1->SetOpacity(0.5f);
 
-  EXPECT_TRUE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_TRUE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   // Ensure we can remove a pending threaded animation.
   l1->GetAnimator()->StopAnimating();
 
-  EXPECT_FALSE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   // Trigger another threaded animation.
   l1->SetOpacity(0.2f);
 
-  EXPECT_TRUE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_TRUE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   root->Add(l1.get());
   GetCompositor()->SetRootLayer(root.get());
 
   // Now l1 is part of a tree.
-  EXPECT_TRUE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_TRUE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   l1->SetOpacity(0.1f);
   // IMMEDIATELY_SET_NEW_TARGET is a default preemption strategy for conflicting
   // animations.
-  EXPECT_FALSE(player1->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_FALSE(animation1->keyframe_effect()->has_any_keyframe_model());
 
   // Adding a layer to an existing tree.
   l2->SetOpacity(0.5f);
-  EXPECT_TRUE(player2->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_TRUE(animation2->keyframe_effect()->has_any_keyframe_model());
 
   l1->Add(l2.get());
-  EXPECT_TRUE(player2->keyframe_effect()->has_any_keyframe_model());
+  EXPECT_TRUE(animation2->keyframe_effect()->has_any_keyframe_model());
 }
 
 // Tests that in-progress threaded animations complete when a Layer's
diff --git a/ui/gfx/geometry/vector2d.h b/ui/gfx/geometry/vector2d.h
index 4b45667a..d996453 100644
--- a/ui/gfx/geometry/vector2d.h
+++ b/ui/gfx/geometry/vector2d.h
@@ -39,6 +39,9 @@
   // Subtract the components of the |other| vector from the current vector.
   void Subtract(const Vector2d& other);
 
+  constexpr bool operator==(const Vector2d& other) const {
+    return x_ == other.x_ && y_ == other.y_;
+  }
   void operator+=(const Vector2d& other) { Add(other); }
   void operator-=(const Vector2d& other) { Subtract(other); }
 
@@ -70,11 +73,7 @@
   int y_;
 };
 
-inline bool operator==(const Vector2d& lhs, const Vector2d& rhs) {
-  return lhs.x() == rhs.x() && lhs.y() == rhs.y();
-}
-
-inline Vector2d operator-(const Vector2d& v) {
+inline constexpr Vector2d operator-(const Vector2d& v) {
   return Vector2d(-v.x(), -v.y());
 }
 
diff --git a/ui/gfx/geometry/vector2d_f.h b/ui/gfx/geometry/vector2d_f.h
index 92f7f8775..7e40ea8 100644
--- a/ui/gfx/geometry/vector2d_f.h
+++ b/ui/gfx/geometry/vector2d_f.h
@@ -67,15 +67,15 @@
   float y_;
 };
 
-inline bool operator==(const Vector2dF& lhs, const Vector2dF& rhs) {
+inline constexpr bool operator==(const Vector2dF& lhs, const Vector2dF& rhs) {
   return lhs.x() == rhs.x() && lhs.y() == rhs.y();
 }
 
-inline bool operator!=(const Vector2dF& lhs, const Vector2dF& rhs) {
+inline constexpr bool operator!=(const Vector2dF& lhs, const Vector2dF& rhs) {
   return !(lhs == rhs);
 }
 
-inline Vector2dF operator-(const Vector2dF& v) {
+inline constexpr Vector2dF operator-(const Vector2dF& v) {
   return Vector2dF(-v.x(), -v.y());
 }
 
diff --git a/ui/gfx/shadow_value.cc b/ui/gfx/shadow_value.cc
index 9f17797..ba552ba 100644
--- a/ui/gfx/shadow_value.cc
+++ b/ui/gfx/shadow_value.cc
@@ -10,6 +10,7 @@
 
 #include "base/strings/stringprintf.h"
 #include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/geometry/safe_integer_conversions.h"
 #include "ui/gfx/geometry/vector2d_conversions.h"
 
 namespace gfx {
@@ -28,8 +29,7 @@
     double blur = shadow.blur();
     if (!include_inner_blur)
       blur /= 2;
-    // Add 0.5 to round up to the next integer.
-    int blur_length = static_cast<int>(blur + 0.5);
+    int blur_length = ToRoundedInt(blur);
 
     left = std::max(left, blur_length - shadow.x());
     top = std::max(top, blur_length - shadow.y());
@@ -42,16 +42,6 @@
 
 }  // namespace
 
-ShadowValue::ShadowValue() : blur_(0), color_(0) {}
-
-ShadowValue::ShadowValue(const gfx::Vector2d& offset,
-                         double blur,
-                         SkColor color)
-    : offset_(offset), blur_(blur), color_(color) {
-}
-
-ShadowValue::~ShadowValue() {}
-
 ShadowValue ShadowValue::Scale(float scale) const {
   gfx::Vector2d scaled_offset =
       gfx::ToFlooredVector2d(gfx::ScaleVector2d(offset_, scale));
diff --git a/ui/gfx/shadow_value.h b/ui/gfx/shadow_value.h
index 7723a8b1..d212678 100644
--- a/ui/gfx/shadow_value.h
+++ b/ui/gfx/shadow_value.h
@@ -6,6 +6,7 @@
 #define UI_GFX_SHADOW_VALUE_H_
 
 #include <string>
+#include <tuple>
 #include <vector>
 
 #include "third_party/skia/include/core/SkColor.h"
@@ -23,15 +24,20 @@
 // shadow's offset, blur amount and color.
 class GFX_EXPORT ShadowValue {
  public:
-  ShadowValue();
-  ShadowValue(const gfx::Vector2d& offset, double blur, SkColor color);
-  ~ShadowValue();
+  constexpr ShadowValue() = default;
+  constexpr ShadowValue(const gfx::Vector2d& offset, double blur, SkColor color)
+      : offset_(offset), blur_(blur), color_(color) {}
 
-  int x() const { return offset_.x(); }
-  int y() const { return offset_.y(); }
-  const gfx::Vector2d& offset() const { return offset_; }
-  double blur() const { return blur_; }
-  SkColor color() const { return color_; }
+  constexpr int x() const { return offset_.x(); }
+  constexpr int y() const { return offset_.y(); }
+  constexpr const gfx::Vector2d& offset() const { return offset_; }
+  constexpr double blur() const { return blur_; }
+  constexpr SkColor color() const { return color_; }
+
+  constexpr bool operator==(const ShadowValue& other) const {
+    return offset_ == other.offset_ && blur_ == other.blur_ &&
+           color_ == other.color_;
+  }
 
   ShadowValue Scale(float scale) const;
 
@@ -63,16 +69,11 @@
   // amount of 4.0 means to have a blurry shadow edge of 4 pixels that
   // transitions from full shadow color to fully transparent and with 2 pixels
   // inside the shadow and 2 pixels goes beyond the edge.
-  double blur_;
+  double blur_ = 0.;
 
-  SkColor color_;
+  SkColor color_ = SK_ColorTRANSPARENT;
 };
 
-inline bool operator==(const ShadowValue& lhs, const ShadowValue& rhs) {
-  return lhs.offset() == rhs.offset() && lhs.blur() == rhs.blur() &&
-         lhs.color() == rhs.color();
-}
-
 }  // namespace gfx
 
 #endif  // UI_GFX_SHADOW_VALUE_H_
diff --git a/ui/gfx/shadow_value_unittest.cc b/ui/gfx/shadow_value_unittest.cc
index fb065b8..d93e0967 100644
--- a/ui/gfx/shadow_value_unittest.cc
+++ b/ui/gfx/shadow_value_unittest.cc
@@ -13,45 +13,49 @@
 namespace gfx {
 
 TEST(ShadowValueTest, GetMargin) {
-  const struct TestCase {
+  constexpr struct TestCase {
     Insets expected_margin;
     size_t shadow_count;
     ShadowValue shadows[2];
   } kTestCases[] = {
-    {
-      Insets(), 0, {},
-    },
-    {
-      Insets(-2, -2, -2, -2),
-      1,
-      { ShadowValue(gfx::Vector2d(0, 0), 4, 0), },
-    },
-    {
-      Insets(0, -1, -4, -3),
-      1,
-      { ShadowValue(gfx::Vector2d(1, 2), 4, 0), },
-    },
-    {
-      Insets(-4, -3, 0, -1),
-      1,
-      { ShadowValue(gfx::Vector2d(-1, -2), 4, 0), },
-    },
-    {
-      Insets(0, -1, -5, -4),
-      2,
       {
-        ShadowValue(gfx::Vector2d(1, 2), 4, 0),
-        ShadowValue(gfx::Vector2d(2, 3), 4, 0),
+          Insets(), 0, {},
       },
-    },
-    {
-      Insets(-4, -3, -5, -4),
-      2,
       {
-        ShadowValue(gfx::Vector2d(-1, -2), 4, 0),
-        ShadowValue(gfx::Vector2d(2, 3), 4, 0),
+          Insets(-2, -2, -2, -2),
+          1,
+          {
+              {gfx::Vector2d(0, 0), 4, 0},
+          },
       },
-    },
+      {
+          Insets(0, -1, -4, -3),
+          1,
+          {
+              {gfx::Vector2d(1, 2), 4, 0},
+          },
+      },
+      {
+          Insets(-4, -3, 0, -1),
+          1,
+          {
+              {gfx::Vector2d(-1, -2), 4, 0},
+          },
+      },
+      {
+          Insets(0, -1, -5, -4),
+          2,
+          {
+              {gfx::Vector2d(1, 2), 4, 0}, {gfx::Vector2d(2, 3), 4, 0},
+          },
+      },
+      {
+          Insets(-4, -3, -5, -4),
+          2,
+          {
+              {gfx::Vector2d(-1, -2), 4, 0}, {gfx::Vector2d(2, 3), 4, 0},
+          },
+      },
   };
 
   for (size_t i = 0; i < arraysize(kTestCases); ++i) {
diff --git a/ui/gl/init/gl_factory_mac.cc b/ui/gl/init/gl_factory_mac.cc
index 9ae60698..5254465 100644
--- a/ui/gl/init/gl_factory_mac.cc
+++ b/ui/gl/init/gl_factory_mac.cc
@@ -86,10 +86,6 @@
     case kGLImplementationDesktopGL:
     case kGLImplementationDesktopGLCoreProfile:
     case kGLImplementationAppleGL:
-      // Note that with virtualization we might still be able to make current
-      // a different onscreen surface with this context later. But we should
-      // always be creating the context with an offscreen surface first.
-      DCHECK(compatible_surface->IsOffscreen());
       return InitializeGLContext(new GLContextCGL(share_group),
                                  compatible_surface, attribs);
 #if BUILDFLAG(USE_EGL_ON_MAC)
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc
index 7e4b435..47a9f3d1 100644
--- a/ui/keyboard/keyboard_controller_unittest.cc
+++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -14,7 +14,7 @@
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/client/focus_client.h"
-#include "ui/aura/test/aura_test_helper.h"
+#include "ui/aura/test/aura_test_base.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
 #include "ui/base/ime/dummy_text_input_client.h"
@@ -204,13 +204,11 @@
 
 }  // namespace
 
-class KeyboardControllerTest : public testing::Test,
+class KeyboardControllerTest : public aura::test::AuraTestBase,
                                public KeyboardControllerObserver {
  public:
   KeyboardControllerTest()
-      : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::MainThreadType::UI),
-        visible_bounds_number_of_calls_(0),
+      : visible_bounds_number_of_calls_(0),
         occluding_bounds_number_of_calls_(0),
         is_available_number_of_calls_(0),
         is_available_(false),
@@ -218,24 +216,14 @@
   ~KeyboardControllerTest() override {}
 
   void SetUp() override {
-    // The ContextFactory must exist before any Compositors are created.
-    bool enable_pixel_output = false;
-    ui::ContextFactory* context_factory = nullptr;
-    ui::ContextFactoryPrivate* context_factory_private = nullptr;
-
-    ui::InitializeContextFactoryForTests(enable_pixel_output, &context_factory,
-                                         &context_factory_private);
-
     ui::SetUpInputMethodFactoryForTesting();
-    aura_test_helper_.reset(new aura::test::AuraTestHelper());
-    aura_test_helper_->SetUp(context_factory, context_factory_private);
-    new wm::DefaultActivationClient(aura_test_helper_->root_window());
+    aura::test::AuraTestBase::SetUp();
+    new wm::DefaultActivationClient(root_window());
     focus_controller_.reset(new TestFocusController(root_window()));
     layout_delegate_.reset(new TestKeyboardLayoutDelegate());
-    controller_.reset(
-        new KeyboardController(std::make_unique<TestKeyboardUI>(
-                                   aura_test_helper_->host()->GetInputMethod()),
-                               layout_delegate_.get()));
+    controller_.reset(new KeyboardController(
+        std::make_unique<TestKeyboardUI>(host()->GetInputMethod()),
+        layout_delegate_.get()));
     controller()->AddObserver(this);
   }
 
@@ -244,11 +232,9 @@
       controller()->RemoveObserver(this);
     controller_.reset();
     focus_controller_.reset();
-    aura_test_helper_->TearDown();
-    ui::TerminateContextFactoryForTests();
+    aura::test::AuraTestBase::TearDown();
   }
 
-  aura::Window* root_window() { return aura_test_helper_->root_window(); }
   KeyboardUI* ui() { return controller_->ui(); }
   KeyboardController* controller() { return controller_.get(); }
 
@@ -334,8 +320,6 @@
     run_loop->Run();
   }
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-  std::unique_ptr<aura::test::AuraTestHelper> aura_test_helper_;
   std::unique_ptr<TestFocusController> focus_controller_;
 
  private:
diff --git a/ui/keyboard/test/run_all_unittests.cc b/ui/keyboard/test/run_all_unittests.cc
index 7f0c291..11c49af 100644
--- a/ui/keyboard/test/run_all_unittests.cc
+++ b/ui/keyboard/test/run_all_unittests.cc
@@ -10,6 +10,7 @@
 #include "base/test/test_suite.h"
 #include "mojo/edk/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/gl/test/gl_surface_test_support.h"
@@ -24,6 +25,7 @@
   void Initialize() override {
     base::TestSuite::Initialize();
     gl::GLSurfaceTestSupport::InitializeOneOff();
+    env_ = aura::Env::CreateInstance();
     ui::RegisterPathProvider();
 
     base::FilePath ui_test_pak_path;
@@ -32,11 +34,14 @@
   }
 
   void Shutdown() override {
+    env_.reset();
     ui::ResourceBundle::CleanupSharedInstance();
     base::TestSuite::Shutdown();
   }
 
  private:
+  std::unique_ptr<aura::Env> env_;
+
   DISALLOW_COPY_AND_ASSIGN(KeyboardTestSuite);
 };
 
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb
index 630adbd3..9ab7dee 100644
--- a/ui/strings/translations/ui_strings_am.xtb
+++ b/ui/strings/translations/ui_strings_am.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">ወደ እዚህ ሸብልል</translation>
 <translation id="3234408098842461169">ዝቅዝቅ ቀስት</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 ቀን}one{# ቀኖች}other{# ቀኖች}}</translation>
+<translation id="335581015389089642">ንግግር</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 ቀን ቀርቷል}one{# ቀኖች ቀርቷል}other{# ቀኖች ቀርተዋል}}</translation>
+<translation id="3618849550573277856">«<ph name="LOOKUP_STRING" />»ን ፈልግ</translation>
 <translation id="364720409959344976">የሚሰቀል ዓቃፊ ይምረጡ</translation>
 <translation id="3660179305079774227">የላይ ቀስት</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> ጊባ/ሰ</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ዝለል</translation>
 <translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{ከ1 ወር በፊት}one{ከ# ወሮች በፊት}other{ከ# ወሮች በፊት}}</translation>
+<translation id="4289300219472526559">መናገር ይጀምሩ</translation>
 <translation id="4316910396681052118">ሁሉም መተግበሪያዎች</translation>
 <translation id="4588090240171750605">ወደ ቀኝ ሸብልል</translation>
 <translation id="4724120544754982507">የማሳወቂያ ማዕከል፣ <ph name="UNREAD_NOTIFICATION_COUNT" /> ያልተነበቡ ማሳወቂያዎች</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">የመተግበሪያ አስተያየት ጥቆማዎች</translation>
 <translation id="6364916375976753737">ወደ ግራ ሸብልል</translation>
 <translation id="6394627529324717982">ኮማ</translation>
+<translation id="6397363302884558537">መናገር አቁም</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 ሰከንድ በፊት}one{# ሰከንዶች በፊት}other{# ሰከንዶች በፊት}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{ከ1 ሰከንድ በፊት}one{ከ# ሰከንዶች በፊት}other{ከ# ሰከንዶች በፊት}}</translation>
 <translation id="654149438358937226">ሁሉንም ማሳወቂያዎች አግድ</translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb
index a8aea46c..cd1b2af 100644
--- a/ui/strings/translations/ui_strings_ar.xtb
+++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">التمرير إلى هنا</translation>
 <translation id="3234408098842461169">مفتاح سهم  إلى أسفل</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{يوم واحد}zero{# من الأيام}two{يومان (#)}few{# أيام}many{# يومًا}other{# من الأيام}}</translation>
+<translation id="335581015389089642">الحديث</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{يتبقى يوم واحد}zero{يتبقى عدد # من الأيام}two{يتبقى يومان (#)}few{يتبقى # أيام}many{يتبقى # يومًا}other{يتبقى # من الأيام}}</translation>
+<translation id="3618849550573277856">البحث عن "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">حدد مجلدًا للتحميل</translation>
 <translation id="3660179305079774227">مفتاح سهم إلى أعلى</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> غيغابايت/ثانية</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">الدخول</translation>
 <translation id="4250229828105606438">لقطة شاشة</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{قبل شهر واحد}zero{قبل # شهر}two{قبل شهرين (#)}few{قبل # أشهر}many{قبل # شهرًا}other{قبل # شهر}}</translation>
+<translation id="4289300219472526559">بدء التحدث</translation>
 <translation id="4316910396681052118">جميع التطبيقات</translation>
 <translation id="4588090240171750605">التمرير إلى اليسار</translation>
 <translation id="4724120544754982507">مركز الإشعارات، <ph name="UNREAD_NOTIFICATION_COUNT" /> من الإشعارات غير المقروءة</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">اقتراحات التطبيقات</translation>
 <translation id="6364916375976753737">التمرير إلى اليمين</translation>
 <translation id="6394627529324717982">فاصلة</translation>
+<translation id="6397363302884558537">إيقاف التحدث</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{قبل ثانية واحدة}zero{ قبل # من الثواني}two{ قبل ثانيتين (#)}few{قبل # ثوانٍ}many{قبل # ثانية}other{قبل # من الثواني}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{قبل ثانية واحدة}zero{قبل # ثانية}two{قبل ثانيتين (#)}few{قبل # ثوانٍ}many{قبل # ثانية}other{قبل # ثانية}}</translation>
 <translation id="654149438358937226">حظر جميع الإشعارات</translation>
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb
index 94d3a0d0..c1c0c33 100644
--- a/ui/strings/translations/ui_strings_bg.xtb
+++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Превъртане до тук</translation>
 <translation id="3234408098842461169">Стрелка надолу</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 ден}other{# дни}}</translation>
+<translation id="335581015389089642">Speech</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Остава 1 ден}other{Остават # дни}}</translation>
+<translation id="3618849550573277856">Търсене на „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Избиране на папка за качване</translation>
 <translation id="3660179305079774227">Стрелка нагоре</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/сек</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">преминаване</translation>
 <translation id="4250229828105606438">Eкранна снимка</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Преди 1 месец}other{Преди # месеца}}</translation>
+<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4316910396681052118">ВСИЧКИ ПРИЛОЖЕНИЯ</translation>
 <translation id="4588090240171750605">Превъртане надясно</translation>
 <translation id="4724120544754982507">Център за известия, <ph name="UNREAD_NOTIFICATION_COUNT" /> непрочетени</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ПРЕДЛОЖЕНИЯ ЗА ПРИЛОЖЕНИЯ</translation>
 <translation id="6364916375976753737">Превъртане наляво</translation>
 <translation id="6394627529324717982">Запетая</translation>
+<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Преди 1 сек}other{Преди # сек}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Преди 1 секунда}other{Преди # секунди}}</translation>
 <translation id="654149438358937226">Блокиране на всички известия</translation>
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb
index 62747cb..c9d19fdc 100644
--- a/ui/strings/translations/ui_strings_bn.xtb
+++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">এখান পর্যন্ত স্ক্রোল করুন</translation>
 <translation id="3234408098842461169">Down Arrow</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{১ দিন}one{# দিন}other{# দিন}}</translation>
+<translation id="335581015389089642">স্পিচ</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{১ দিন বাকি}one{# দিন বাকি}other{# দিন বাকি}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” খুঁজে দেখুন</translation>
 <translation id="364720409959344976">আপলোড করার জন্য ফোল্ডার বেছে নিন</translation>
 <translation id="3660179305079774227">Up Arrow</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">লাফ দিন</translation>
 <translation id="4250229828105606438">স্ক্রীনশট</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{১ মাস আগে}one{# মাস আগে}other{# মাস আগে}}</translation>
+<translation id="4289300219472526559">কথা বলা শুরু করুন</translation>
 <translation id="4316910396681052118">সব অ্যাপ</translation>
 <translation id="4588090240171750605">ডান দিকে স্ক্রোল করুন</translation>
 <translation id="4724120544754982507">বিজ্ঞপ্তি কেন্দ্র, <ph name="UNREAD_NOTIFICATION_COUNT" />টি না পড়া বিজ্ঞপ্তি</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">অ্যাপের প্রস্তাবনা</translation>
 <translation id="6364916375976753737">বাঁ দিকে স্ক্রোল করুন</translation>
 <translation id="6394627529324717982">কমা</translation>
+<translation id="6397363302884558537">কথা বলা বন্ধ করুন</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{১ সেকেন্ড পূর্বে}one{# সেকেন্ড পূর্বে}other{# সেকেন্ড পূর্বে}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{১ সেকেন্ড আগে}one{# সেকেন্ড আগে}other{# সেকেন্ড আগে}}</translation>
 <translation id="654149438358937226">সমস্ত বিজ্ঞপ্তি ব্লক করুন</translation>
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb
index 95115eb..ab96638 100644
--- a/ui/strings/translations/ui_strings_ca.xtb
+++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Desplaçament fins aquí</translation>
 <translation id="3234408098842461169">Fletxa avall</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dia}other{# dies}}</translation>
+<translation id="335581015389089642">Veu</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dia restant}other{# dies restants}}</translation>
+<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Selecció d'una carpeta per penjar</translation>
 <translation id="3660179305079774227">Fletxa amunt</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">salta</translation>
 <translation id="4250229828105606438">Captura de pantalla</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Fa 1 mes}other{Fa # mesos}}</translation>
+<translation id="4289300219472526559">Comença a parlar</translation>
 <translation id="4316910396681052118">TOTES LES APLICACIONS</translation>
 <translation id="4588090240171750605">Desplaçament a la dreta</translation>
 <translation id="4724120544754982507">Centre de notificacions, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificacions no llegides</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGGERIMENTS D'APLICACIONS</translation>
 <translation id="6364916375976753737">Desplaçament a l'esquerra</translation>
 <translation id="6394627529324717982">Coma</translation>
+<translation id="6397363302884558537">Deixa de parlar</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{fa 1 s}other{fa # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Fa 1 segon}other{Fa # segons}}</translation>
 <translation id="654149438358937226">Bloqueja totes les notificacions</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb
index c354db9..ec35eae 100644
--- a/ui/strings/translations/ui_strings_cs.xtb
+++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Posunout sem</translation>
 <translation id="3234408098842461169">Klávesa šipka dolů</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 den}few{# dny}many{# dne}other{# dnů}}</translation>
+<translation id="335581015389089642">Řeč</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="3618849550573277856">Vyhledat „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Vyberte složku pro nahrávání</translation>
 <translation id="3660179305079774227">Klávesa šipka nahoru</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">přejít</translation>
 <translation id="4250229828105606438">Snímek obrazovky</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{před 1 měsícem}few{před # měsíci}many{před # měsíce}other{před # měsíci}}</translation>
+<translation id="4289300219472526559">Začít mluvit</translation>
 <translation id="4316910396681052118">VŠECHNY APLIKACE</translation>
 <translation id="4588090240171750605">Posuv doprava</translation>
 <translation id="4724120544754982507">Centrum oznámení – nepřečtená oznámení: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">NÁVRHY APLIKACÍ</translation>
 <translation id="6364916375976753737">Posuv doleva</translation>
 <translation id="6394627529324717982">Čárka</translation>
+<translation id="6397363302884558537">Přestat mluvit</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Před 1 s}few{Před # s}many{Před # s}other{Před # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{před sekundou}few{před # sekundami}many{před # sekundy}other{před # sekundami}}</translation>
 <translation id="654149438358937226">Blokovat všechna oznámení</translation>
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb
index 0af46ca..2c0d416 100644
--- a/ui/strings/translations/ui_strings_da.xtb
+++ b/ui/strings/translations/ui_strings_da.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Scroll hertil</translation>
 <translation id="3234408098842461169">Pil nedad</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dag}one{# dage}other{# dage}}</translation>
+<translation id="335581015389089642">Tale</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag tilbage}one{# dage tilbage}other{# dage tilbage}}</translation>
+<translation id="3618849550573277856">Slå "<ph name="LOOKUP_STRING" />" op</translation>
 <translation id="364720409959344976">Vælg den mappe, der skal uploades</translation>
 <translation id="3660179305079774227">Pil opad</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sek.</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">hop</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{For 1 måned siden}one{For # måned siden}other{For # måneder siden}}</translation>
+<translation id="4289300219472526559">Start indtaling</translation>
 <translation id="4316910396681052118">ALLE APPS</translation>
 <translation id="4588090240171750605">Scroll til højre</translation>
 <translation id="4724120544754982507">Underretningscenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> ulæste underretninger</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APPFORSLAG</translation>
 <translation id="6364916375976753737">Scroll Left</translation>
 <translation id="6394627529324717982">Komma</translation>
+<translation id="6397363302884558537">Stop indtaling</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{for 1 sek. siden}one{for # sek. siden}other{for # sek. siden}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{For 1 sekund siden}one{For # sekund siden}other{For # sekunder siden}}</translation>
 <translation id="654149438358937226">Bloker alle underretninger</translation>
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb
index 2b8e1358..0f9135c 100644
--- a/ui/strings/translations/ui_strings_de.xtb
+++ b/ui/strings/translations/ui_strings_de.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Hierher blättern</translation>
 <translation id="3234408098842461169">Abwärtspfeil</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 Tag}other{# Tage}}</translation>
+<translation id="335581015389089642">Sprachausgabe</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 Tag übrig}other{# Tage übrig}}</translation>
+<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" nachschlagen</translation>
 <translation id="364720409959344976">Ordner zum Hochladen auswählen</translation>
 <translation id="3660179305079774227">Aufwärtspfeil</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">springen</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{vor 1 Monat}other{vor # Monaten}}</translation>
+<translation id="4289300219472526559">Sprachausgabe starten</translation>
 <translation id="4316910396681052118">ALLE APPS</translation>
 <translation id="4588090240171750605">Nach rechts blättern</translation>
 <translation id="4724120544754982507">Benachrichtigungscenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> ungelesene Benachrichtigungen</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APP-VORSCHLÄGE</translation>
 <translation id="6364916375976753737">Nach links blättern</translation>
 <translation id="6394627529324717982">Komma</translation>
+<translation id="6397363302884558537">Sprachausgabe stoppen</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 Sek. her}other{# Sek. her}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Vor 1 Sekunde}other{Vor # Sekunden}}</translation>
 <translation id="654149438358937226">Alle Benachrichtigungen blockieren</translation>
diff --git a/ui/strings/translations/ui_strings_el.xtb b/ui/strings/translations/ui_strings_el.xtb
index 76007a83..319b9aa 100644
--- a/ui/strings/translations/ui_strings_el.xtb
+++ b/ui/strings/translations/ui_strings_el.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Κύλιση εδώ</translation>
 <translation id="3234408098842461169">Κάτω βέλος</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 ημέρα}other{# ημέρες}}</translation>
+<translation id="335581015389089642">Ομιλία</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Απομένει 1 ημέρα}other{Απομένουν # ημέρες}}</translation>
+<translation id="3618849550573277856">Αναζήτηση "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Επιλέξτε φάκελο για μεταφόρτωση</translation>
 <translation id="3660179305079774227">Πάνω βέλος</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">μεταπήδηση</translation>
 <translation id="4250229828105606438">Στιγμιότυπο οθόνης</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Πριν από 1 μήνα}other{Πριν από # μήνες}}</translation>
+<translation id="4289300219472526559">Έναρξη ομιλίας</translation>
 <translation id="4316910396681052118">ΟΛΕΣ ΟΙ ΕΦΑΡΜΟΓΕΣ</translation>
 <translation id="4588090240171750605">Κύλιση δεξιά</translation>
 <translation id="4724120544754982507">Κέντρο ειδοποιήσεων, <ph name="UNREAD_NOTIFICATION_COUNT" /> μη αναγνωσμένες ειδοποιήσεις</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ΠΡΟΤΑΣΕΙΣ ΕΦΑΡΜΟΓΩΝ</translation>
 <translation id="6364916375976753737">Κύλιση αριστερά</translation>
 <translation id="6394627529324717982">Κόμμα</translation>
+<translation id="6397363302884558537">Διακοπή ομιλίας</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Πριν από 1 δευτερόλεπτο}other{Πριν από # δευτερόλεπτα}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Πριν από 1 δευτερόλεπτο}other{Πριν από # δευτερόλεπτα}}</translation>
 <translation id="654149438358937226">Αποκλεισμός όλων των ειδοποιήσεων</translation>
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index 0f35145..b9587a6 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Scroll to Here</translation>
 <translation id="3234408098842461169">Down Arrow</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 day}other{# days}}</translation>
+<translation id="335581015389089642">Speech</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 day left}other{# days left}}</translation>
+<translation id="3618849550573277856">Look Up “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Select Folder to Upload</translation>
 <translation id="3660179305079774227">Up Arrow</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">jump</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 month ago}other{# months ago}}</translation>
+<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4316910396681052118">ALL APPS</translation>
 <translation id="4588090240171750605">Scroll Right</translation>
 <translation id="4724120544754982507">Notification Centre, <ph name="UNREAD_NOTIFICATION_COUNT" /> unread notifications</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APP SUGGESTIONS</translation>
 <translation id="6364916375976753737">Scroll Left</translation>
 <translation id="6394627529324717982">Comma</translation>
+<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 sec ago}other{# secs ago}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 second ago}other{# seconds ago}}</translation>
 <translation id="654149438358937226">Block all notifications</translation>
diff --git a/ui/strings/translations/ui_strings_es-419.xtb b/ui/strings/translations/ui_strings_es-419.xtb
index 30e1fef..a56892c 100644
--- a/ui/strings/translations/ui_strings_es-419.xtb
+++ b/ui/strings/translations/ui_strings_es-419.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Desplazarse hasta aquí</translation>
 <translation id="3234408098842461169">Flecha abajo</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 día}other{# días}}</translation>
+<translation id="335581015389089642">Voz</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Falta 1 día.}other{Faltan # días.}}</translation>
+<translation id="3618849550573277856">Buscar "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Seleccionar carpeta para cargar</translation>
 <translation id="3660179305079774227">Flecha arriba</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">saltar</translation>
 <translation id="4250229828105606438">Captura de pantalla</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Hace 1 mes}other{Hace # meses}}</translation>
+<translation id="4289300219472526559">Empezar a hablar</translation>
 <translation id="4316910396681052118">TODAS LAS APPS</translation>
 <translation id="4588090240171750605">Desplazar a la derecha</translation>
 <translation id="4724120544754982507">Centro de notificaciones, notificaciones sin leer: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGERENCIAS DE APPS</translation>
 <translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
 <translation id="6394627529324717982">Coma</translation>
+<translation id="6397363302884558537">Dejar de hablar</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Hace 1 s.}other{Hace # s.}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Hace 1 segundo}other{Hace # segundos}}</translation>
 <translation id="654149438358937226">Bloquear todas las notificaciones</translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb
index a91dcfd3c..76c0a1e 100644
--- a/ui/strings/translations/ui_strings_es.xtb
+++ b/ui/strings/translations/ui_strings_es.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Desplazarse hasta aquí</translation>
 <translation id="3234408098842461169">Flecha abajo</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 día}other{# días}}</translation>
+<translation id="335581015389089642">Voz</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Queda 1 día}other{Quedan # días}}</translation>
+<translation id="3618849550573277856">Buscar <ph name="LOOKUP_STRING" /></translation>
 <translation id="364720409959344976">Seleccionar una carpeta para subirla</translation>
 <translation id="3660179305079774227">Flecha arriba</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">saltar</translation>
 <translation id="4250229828105606438">Captura de pantalla</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Hace 1 mes}other{Hace # meses}}</translation>
+<translation id="4289300219472526559">Empezar a hablar</translation>
 <translation id="4316910396681052118">TODAS LAS APLICACIONES</translation>
 <translation id="4588090240171750605">Desplazar a la derecha</translation>
 <translation id="4724120544754982507">Centro de notificaciones: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificaciones sin leer</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGERENCIAS DE APLICACIONES</translation>
 <translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
 <translation id="6394627529324717982">Coma</translation>
+<translation id="6397363302884558537">Dejar de hablar</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Hace 1 s}other{Hace # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Hace 1 segundo}other{Hace # segundos}}</translation>
 <translation id="654149438358937226">Bloquear todas las notificaciones</translation>
diff --git a/ui/strings/translations/ui_strings_et.xtb b/ui/strings/translations/ui_strings_et.xtb
index 827bfaa..c927730 100644
--- a/ui/strings/translations/ui_strings_et.xtb
+++ b/ui/strings/translations/ui_strings_et.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Keri siia</translation>
 <translation id="3234408098842461169">Allanool</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 päev}other{# päeva}}</translation>
+<translation id="335581015389089642">Kõne</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 päev on jäänud}other{# päeva on jäänud}}</translation>
+<translation id="3618849550573277856">Otsi terminit „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Kausta valimine üleslaadimiseks</translation>
 <translation id="3660179305079774227">Ülesnool</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">liigu</translation>
 <translation id="4250229828105606438">Ekraanipilt</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 kuu tagasi}other{# kuud tagasi}}</translation>
+<translation id="4289300219472526559">Alusta rääkimist</translation>
 <translation id="4316910396681052118">KÕIK RAKENDUSED</translation>
 <translation id="4588090240171750605">Keri paremale</translation>
 <translation id="4724120544754982507">Märguandekeskus, <ph name="UNREAD_NOTIFICATION_COUNT" /> lugemata märguannet</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">RAKENDUSTE SOOVITUSED</translation>
 <translation id="6364916375976753737">Keri vasakule</translation>
 <translation id="6394627529324717982">Koma</translation>
+<translation id="6397363302884558537">Lõpeta rääkimine</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 s tagasi}other{# s tagasi}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 sekund tagasi}other{# sekundit tagasi}}</translation>
 <translation id="654149438358937226">Blokeeri kõik märguanded</translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb
index e2de228e..6136a6a 100644
--- a/ui/strings/translations/ui_strings_fa.xtb
+++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">پیمایش به اینجا</translation>
 <translation id="3234408098842461169">پیکان پایین</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{۱ روز}one{# روز}other{# روز}}</translation>
+<translation id="335581015389089642">صدا</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{۱ روز باقی مانده است}one{# روز باقی مانده است}other{# روز باقی مانده است}}</translation>
+<translation id="3618849550573277856">جستجوی «<ph name="LOOKUP_STRING" />»</translation>
 <translation id="364720409959344976">انتخاب پوشه برای بارگذاری</translation>
 <translation id="3660179305079774227">پیکان بالا</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> گیگابایت/ثانیه</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">پرش</translation>
 <translation id="4250229828105606438">عکس صفحه‌نمایش</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{۱ ماه قبل}one{# ماه قبل}other{# ماه قبل}}</translation>
+<translation id="4289300219472526559">شروع صحبت</translation>
 <translation id="4316910396681052118">همه برنامه‌ها</translation>
 <translation id="4588090240171750605">پیمایش به راست</translation>
 <translation id="4724120544754982507">مرکز اعلان، <ph name="UNREAD_NOTIFICATION_COUNT" /> اعلان خوانده‌نشده</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">پیشنهادات برنامه</translation>
 <translation id="6364916375976753737">پیمایش به چپ</translation>
 <translation id="6394627529324717982">کاما</translation>
+<translation id="6397363302884558537">توقف صحبت</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{۱ ثانیه قبل}one{# ثانیه قبل}other{# ثانیه قبل}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{۱ ثانیه قبل}one{# ثانیه قبل}other{# ثانیه قبل}}</translation>
 <translation id="654149438358937226">مسدود کردن همه اعلان‌ها</translation>
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb
index ffe4e36..ce42e80 100644
--- a/ui/strings/translations/ui_strings_fi.xtb
+++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Vieritä tähän</translation>
 <translation id="3234408098842461169">Nuoli al.</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 päivä}other{# päivää}}</translation>
+<translation id="335581015389089642">Puhe</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 päivä jäljellä}other{# päivää jäljellä}}</translation>
+<translation id="3618849550573277856">Hae ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Valitse lähetettävä kansio</translation>
 <translation id="3660179305079774227">Nuoli yl.</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> Gt/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">siirry</translation>
 <translation id="4250229828105606438">Kuvakaappaus</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 kuukausi sitten}other{# kuukautta sitten}}</translation>
+<translation id="4289300219472526559">Aloita puhuminen</translation>
 <translation id="4316910396681052118">KAIKKI SOVELLUKSET</translation>
 <translation id="4588090240171750605">Vieritä oikealle</translation>
 <translation id="4724120544754982507">Ilmoituskeskus, <ph name="UNREAD_NOTIFICATION_COUNT" /> lukematonta ilmoitusta</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SOVELLUSEHDOTUKSET</translation>
 <translation id="6364916375976753737">Vieritä vasemmalle</translation>
 <translation id="6394627529324717982">Pilkku</translation>
+<translation id="6397363302884558537">Lopeta puhuminen</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 s sitten}other{# s sitten}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 sekunti sitten}other{# sekuntia sitten}}</translation>
 <translation id="654149438358937226">Estä kaikki ilmoitukset</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb
index 9464d3e..1b65c59f 100644
--- a/ui/strings/translations/ui_strings_fil.xtb
+++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Mag-scroll dito</translation>
 <translation id="3234408098842461169">Down Arrow</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 araw}one{# araw}other{# na araw}}</translation>
+<translation id="335581015389089642">Pananalita</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="3618849550573277856">Hanapin ang “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Pumili ng Folder na I-a-upload</translation>
 <translation id="3660179305079774227">Up Arrow</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> (na) GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">tumalon</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 buwan ang nakalipas}one{# buwan ang nakalipas}other{# na buwan ang nakalipas}}</translation>
+<translation id="4289300219472526559">Simulan ang Pagsasalita</translation>
 <translation id="4316910396681052118">LAHAT NG APP</translation>
 <translation id="4588090240171750605">Mag-scroll Pakanan</translation>
 <translation id="4724120544754982507">Notification Center, <ph name="UNREAD_NOTIFICATION_COUNT" /> (na) hindi pa nababasang notification</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">MGA IMINUMUNGKAHING APP</translation>
 <translation id="6364916375976753737">Mag-scroll Pakaliwa</translation>
 <translation id="6394627529324717982">Kuwit</translation>
+<translation id="6397363302884558537">Ihinto ang Pagsasalita</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 segundo ang nakalipas}one{# segundo ang nakalipas}other{# na segundo ang nakalipas}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 segundo ang nakalipas}one{# segundo ang nakalipas}other{# na segundo ang nakalipas}}</translation>
 <translation id="654149438358937226">I-block ang lahat ng notification</translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb
index ee7bd21..73a3a0b 100644
--- a/ui/strings/translations/ui_strings_fr.xtb
+++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Défilement jusqu'ici</translation>
 <translation id="3234408098842461169">Bas</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 jour}one{# jour}other{# jours}}</translation>
+<translation id="335581015389089642">Voix</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 jour restant}one{# jour restant}other{# jours restants}}</translation>
+<translation id="3618849550573277856">Rechercher "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Sélectionner le dossier d'importation</translation>
 <translation id="3660179305079774227">Haut</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> Go/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">accéder</translation>
 <translation id="4250229828105606438">Capture d'écran</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Il y a 1 mois}one{Il y a # mois}other{Il y a # mois}}</translation>
+<translation id="4289300219472526559">Commencer à parler</translation>
 <translation id="4316910396681052118">TOUTES LES APPLICATIONS</translation>
 <translation id="4588090240171750605">Défilement vers la droite</translation>
 <translation id="4724120544754982507">Centre de notification, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifications non lues</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGGESTIONS D'APPLICATIONS</translation>
 <translation id="6364916375976753737">Défilement vers la gauche</translation>
 <translation id="6394627529324717982">Virgule</translation>
+<translation id="6397363302884558537">Arrêter de parler</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Il y a 1 s}one{Il y a # s}other{Il y a # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Il y a une seconde}one{Il y a # seconde}other{Il y a # secondes}}</translation>
 <translation id="654149438358937226">Bloquer toutes les notifications</translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb
index 73eb569c..75a78fb 100644
--- a/ui/strings/translations/ui_strings_gu.xtb
+++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">અહીં સુધી સ્ક્રોલ કરો</translation>
 <translation id="3234408098842461169">નીચલો એરો</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 દિવસ}one{# દિવસ}other{# દિવસ}}</translation>
+<translation id="335581015389089642">ભાષા</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 દિવસ બાકી}one{# દિવસ બાકી}other{# દિવસ બાકી}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” શોધો</translation>
 <translation id="364720409959344976">અપલોડ કરવા માટે ફોલ્ડર પસંદ કરો</translation>
 <translation id="3660179305079774227">ઉપર એરો</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">જંપ કરો</translation>
 <translation id="4250229828105606438">સ્ક્રીનશૉટ</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 મહિના પહેલાં}one{# મહિના પહેલાં}other{# મહિના પહેલાં}}</translation>
+<translation id="4289300219472526559">બોલવાનું પ્રારંભ કરો</translation>
 <translation id="4316910396681052118">બધી ઍપ્લિકેશનો</translation>
 <translation id="4588090240171750605">જમણે સ્ક્રોલ કરો</translation>
 <translation id="4724120544754982507">સૂચના કેન્દ્ર, વાંચ્યા વગરની <ph name="UNREAD_NOTIFICATION_COUNT" /> સૂચનાઓ</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ઍપ સૂચનો</translation>
 <translation id="6364916375976753737">ડાબે સ્ક્રોલ કરો</translation>
 <translation id="6394627529324717982">અલ્પવિરામ</translation>
+<translation id="6397363302884558537">બોલવાનું રોકો</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 સે પહેલાં}one{# સે પહેલાં}other{# સે પહેલાં}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 સેકંડ પહેલાં}one{# સેકંડ પહેલાં}other{# સેકંડ પહેલાં}}</translation>
 <translation id="654149438358937226">તમામ નોટિફિકેશનને બ્લૉક કરો</translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb
index f968e47c..079c3ed2 100644
--- a/ui/strings/translations/ui_strings_hi.xtb
+++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">यहां तक स्क्रॉल करें</translation>
 <translation id="3234408098842461169">नीचे तीर</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 दिन}one{# दिन}other{# दिन}}</translation>
+<translation id="335581015389089642">बोली</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 दिन शेष}one{# दिन शेष}other{# दिन शेष}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” को खोजें</translation>
 <translation id="364720409959344976">अपलोड करने के लिए फ़ोल्‍डर चुनें</translation>
 <translation id="3660179305079774227">ऊपर तीर</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">जाएं</translation>
 <translation id="4250229828105606438">स्क्रीनशॉट</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 माह पहले}one{# माह पहले}other{# माह पहले}}</translation>
+<translation id="4289300219472526559">बोलना प्रारंभ करें</translation>
 <translation id="4316910396681052118">सभी ऐप्लिकेशन</translation>
 <translation id="4588090240171750605">दाएं स्क्रॉल करें</translation>
 <translation id="4724120544754982507">सूचना केंद्र, <ph name="UNREAD_NOTIFICATION_COUNT" /> गैर-पढ़ी गई सूचनाएं</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ऐप्लिकेशन सुझाव</translation>
 <translation id="6364916375976753737">बाएं स्क्रॉल करें</translation>
 <translation id="6394627529324717982">अल्पविराम</translation>
+<translation id="6397363302884558537">बोलना रोकें</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 सेकंड पहले}one{# सेकंड पहले}other{# सेकंड पहले}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 सेकंड पहले}one{# सेकंड पहले}other{# सेकंड पहले}}</translation>
 <translation id="654149438358937226">सभी सूचनाएं ब्लॉक करें</translation>
diff --git a/ui/strings/translations/ui_strings_hr.xtb b/ui/strings/translations/ui_strings_hr.xtb
index 1e6f5eb..db65fb6e 100644
--- a/ui/strings/translations/ui_strings_hr.xtb
+++ b/ui/strings/translations/ui_strings_hr.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Pomakni ovdje</translation>
 <translation id="3234408098842461169">Strelica dolje</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}</translation>
+<translation id="335581015389089642">Govor</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Još 1 dan}one{Još # dan}few{Još # dana}other{Još # dana}}</translation>
+<translation id="3618849550573277856">Potraži "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Odabir mape za prijenos</translation>
 <translation id="3660179305079774227">Strelica prema gore</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">skoči</translation>
 <translation id="4250229828105606438">Snimka zaslona</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Prije mjesec dana}one{Prije # mjeseca}few{Prije # mjeseca}other{Prije # mjeseci}}</translation>
+<translation id="4289300219472526559">Počni govoriti</translation>
 <translation id="4316910396681052118">SVE APLIKACIJE</translation>
 <translation id="4588090240171750605">Pomakni se desno</translation>
 <translation id="4724120544754982507">Centar za obavijesti, nepročitanih obavijesti: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">PRIJEDLOZI APLIKACIJA</translation>
 <translation id="6364916375976753737">Pomakni se lijevo</translation>
 <translation id="6394627529324717982">Zarez</translation>
+<translation id="6397363302884558537">Prestani govoriti</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Prije 1 s}one{Prije # s}few{Prije # s}other{Prije # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Prije 1 sekunde}one{Prije # sekunde}few{Prije # sekunde}other{Prije # sekundi}}</translation>
 <translation id="654149438358937226">Blokiraj sve obavijesti</translation>
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb
index e7ee140..6ee16ccf 100644
--- a/ui/strings/translations/ui_strings_hu.xtb
+++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Görgessen ide</translation>
 <translation id="3234408098842461169">Lefelé nyíl</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 nap}other{# nap}}</translation>
+<translation id="335581015389089642">Beszéd</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 nap van hátra}other{# nap van hátra}}</translation>
+<translation id="3618849550573277856">A(z) „<ph name="LOOKUP_STRING" />” keresése</translation>
 <translation id="364720409959344976">Mappa kiválasztása a feltöltéshez</translation>
 <translation id="3660179305079774227">Felfelé nyíl</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">Mehet</translation>
 <translation id="4250229828105606438">Képernyőkép</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 hónapja}other{# hónapja}}</translation>
+<translation id="4289300219472526559">Beszéd megkezdése</translation>
 <translation id="4316910396681052118">MINDEN ALKALMAZÁS</translation>
 <translation id="4588090240171750605">Görgetés jobbra</translation>
 <translation id="4724120544754982507">Értesítési központ, <ph name="UNREAD_NOTIFICATION_COUNT" /> olvasatlan értesítés</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ALKALMAZÁSJAVASLATOK</translation>
 <translation id="6364916375976753737">Görgetés balra</translation>
 <translation id="6394627529324717982">Vessző</translation>
+<translation id="6397363302884558537">Beszéd leállítása</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 másodperce}other{# másodperce}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 másodperce}other{# másodperce}}</translation>
 <translation id="654149438358937226">Minden értesítés letiltása</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb
index a70ae90d..db2d7dab 100644
--- a/ui/strings/translations/ui_strings_id.xtb
+++ b/ui/strings/translations/ui_strings_id.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Gulir ke Sini</translation>
 <translation id="3234408098842461169">Panah Bawah</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 hari}other{# hari}}</translation>
+<translation id="335581015389089642">Ucapan</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 hari lagi}other{# hari lagi}}</translation>
+<translation id="3618849550573277856">Cari "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Pilih Folder untuk Diunggah</translation>
 <translation id="3660179305079774227">Panah Atas</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/dtk</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">lompati</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 bulan yang lalu}other{# bulan yang lalu}}</translation>
+<translation id="4289300219472526559">Mulai Berbicara</translation>
 <translation id="4316910396681052118">SEMUA APLIKASI</translation>
 <translation id="4588090240171750605">Gulir ke Kanan</translation>
 <translation id="4724120544754982507">Pusat Notifikasi, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifikasi belum dibaca</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SARAN APLIKASI</translation>
 <translation id="6364916375976753737">Gulir ke Kiri</translation>
 <translation id="6394627529324717982">Koma</translation>
+<translation id="6397363302884558537">Berhenti Berbicara</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 dtk yang lalu}other{# dtk yang lalu}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 detik yang lalu}other{# detik yang lalu}}</translation>
 <translation id="654149438358937226">Blokir semua notifikasi</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb
index 683afde..a626c7f 100644
--- a/ui/strings/translations/ui_strings_it.xtb
+++ b/ui/strings/translations/ui_strings_it.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Scorri fino a qui</translation>
 <translation id="3234408098842461169">Freccia GIÙ</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 giorno}other{# giorni}}</translation>
+<translation id="335581015389089642">Voce</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 giorno rimanente}other{# giorni rimanenti}}</translation>
+<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Seleziona la cartella da caricare</translation>
 <translation id="3660179305079774227">Freccia SU</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">vai</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 mese fa}other{# mesi fa}}</translation>
+<translation id="4289300219472526559">Avvia comandi vocali</translation>
 <translation id="4316910396681052118">TUTTE LE APP</translation>
 <translation id="4588090240171750605">Scorri a destra</translation>
 <translation id="4724120544754982507">Centro notifiche, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifiche da leggere</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APP SUGGERITE</translation>
 <translation id="6364916375976753737">Scorri a sinistra</translation>
 <translation id="6394627529324717982">Virgola</translation>
+<translation id="6397363302884558537">Interrompi comandi vocali</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 sec fa}other{# sec fa}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 secondo fa}other{# secondi fa}}</translation>
 <translation id="654149438358937226">Blocca tutte le notifiche</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb
index 41a580c..4dd83044 100644
--- a/ui/strings/translations/ui_strings_iw.xtb
+++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">גלול ל'כאן'</translation>
 <translation id="3234408098842461169">חץ למטה</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{יום אחד}two{יומיים}many{# ימים}other{# ימים}}</translation>
+<translation id="335581015389089642">דיבור</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{נותר יום אחד}two{נותרו יומיים}many{נותרו # ימים}other{נותרו # ימים}}</translation>
+<translation id="3618849550573277856">חפש “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">בחירת תיקיה להעלאה</translation>
 <translation id="3660179305079774227">חץ למעלה</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">קפוץ</translation>
 <translation id="4250229828105606438">צילום מסך</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{לפני חודש אחד}two{לפני חודשיים}many{לפני # חודשים}other{לפני # חודשים}}</translation>
+<translation id="4289300219472526559">התחל לדבר</translation>
 <translation id="4316910396681052118">כל האפליקציות</translation>
 <translation id="4588090240171750605">גלול ימינה</translation>
 <translation id="4724120544754982507">מרכז הודעות, <ph name="UNREAD_NOTIFICATION_COUNT" /> הודעות שלא נקראו</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">הצעות לאפליקציות</translation>
 <translation id="6364916375976753737">גלול שמאלה</translation>
 <translation id="6394627529324717982">פסיק</translation>
+<translation id="6397363302884558537">הפסק לדבר</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{לפני שנ‘ אחת}two{לפני # שנ‘}many{לפני # שנ‘}other{לפני # שנ‘}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{לפני שנייה אחת}two{לפני # שניות}many{לפני # שניות}other{לפני # שניות}}</translation>
 <translation id="654149438358937226">חסימת כל ההודעות</translation>
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb
index 87d9532..24059a6 100644
--- a/ui/strings/translations/ui_strings_ja.xtb
+++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">ここまでスクロール</translation>
 <translation id="3234408098842461169">下矢印キー</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 日}other{# 日}}</translation>
+<translation id="335581015389089642">スピーチ</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{残り 1 日}other{残り # 日}}</translation>
+<translation id="3618849550573277856">「<ph name="LOOKUP_STRING" />」を検索</translation>
 <translation id="364720409959344976">アップロードするフォルダを選択</translation>
 <translation id="3660179305079774227">上矢印キー</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/秒</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ジャンプ</translation>
 <translation id="4250229828105606438">スクリーンショット</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 か月前}other{# か月前}}</translation>
+<translation id="4289300219472526559">読み上げを開始</translation>
 <translation id="4316910396681052118">すべてのアプリ</translation>
 <translation id="4588090240171750605">右にスクロール</translation>
 <translation id="4724120544754982507">通知センター: <ph name="UNREAD_NOTIFICATION_COUNT" /> 件の未読通知</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">アプリの候補</translation>
 <translation id="6364916375976753737">左にスクロール</translation>
 <translation id="6394627529324717982">カンマ</translation>
+<translation id="6397363302884558537">読み上げを停止</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="654149438358937226">通知をすべてブロックする</translation>
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb
index 6e7be2dd..6a3bd64e 100644
--- a/ui/strings/translations/ui_strings_kn.xtb
+++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">ಇಲ್ಲಿಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
 <translation id="3234408098842461169">ಕೆಳಗಿನ ಬಾಣದ ಗುರುತು</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 ದಿನ}one{# ದಿನಗಳು}other{# ದಿನಗಳು}}</translation>
+<translation id="335581015389089642">ಧ್ವನಿ</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 ದಿನ ಬಾಕಿ ಉಳಿದಿದೆ}one{# ದಿನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}other{# ದಿನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” ನೋಡಿ</translation>
 <translation id="364720409959344976">ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ಹಾರು</translation>
 <translation id="4250229828105606438">ಸ್ಕ್ರೀನ್‌ಶಾಟ್</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 ತಿಂಗಳ ಹಿಂದೆ}one{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}other{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}}</translation>
+<translation id="4289300219472526559">ಮಾತನಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="4316910396681052118">ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು</translation>
 <translation id="4588090240171750605">ಬಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
 <translation id="4724120544754982507">ಅಧಿಸೂಚನೆ ಕೇಂದ್ರ, <ph name="UNREAD_NOTIFICATION_COUNT" /> ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ಅಪ್ಲಿಕೇಶನ್ ಸಲಹೆಗಳು</translation>
 <translation id="6364916375976753737">ಎಡಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
 <translation id="6394627529324717982">ಅರ್ಧವಿರಾಮ</translation>
+<translation id="6397363302884558537">ಮಾತನಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 ಸೆಕೆಂ ಹಿಂದೆ}one{# ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ}other{# ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್ ಹಿಂದೆ}one{# ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ}other{# ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ}}</translation>
 <translation id="654149438358937226">ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb
index 1d1868b..d15ca10 100644
--- a/ui/strings/translations/ui_strings_ko.xtb
+++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">여기로 스크롤</translation>
 <translation id="3234408098842461169">아래 화살표</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1일}other{#일}}</translation>
+<translation id="335581015389089642">음성</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1일 남음}other{#일 남음}}</translation>
+<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' 찾기</translation>
 <translation id="364720409959344976">업로드할 폴더 선택</translation>
 <translation id="3660179305079774227">위쪽 화살표</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" />GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">건너뛰기</translation>
 <translation id="4250229828105606438">캡처화면</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1개월 전}other{#개월 전}}</translation>
+<translation id="4289300219472526559">말하기 시작</translation>
 <translation id="4316910396681052118">모든 앱</translation>
 <translation id="4588090240171750605">오른쪽 스크롤</translation>
 <translation id="4724120544754982507">알림 센터, 읽지 않은 알림 <ph name="UNREAD_NOTIFICATION_COUNT" />개</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">앱 추천</translation>
 <translation id="6364916375976753737">왼쪽으로 스크롤</translation>
 <translation id="6394627529324717982">콤마</translation>
+<translation id="6397363302884558537">말하기 중지</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1초 전}other{#초 전}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1초 전}other{#초 전}}</translation>
 <translation id="654149438358937226">모든 알림 차단</translation>
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb
index 3570995..3eb999c 100644
--- a/ui/strings/translations/ui_strings_lt.xtb
+++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Slinkti iki čia</translation>
 <translation id="3234408098842461169">Rodyklė „Žemyn“</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 diena}one{# diena}few{# dienos}many{# dienos}other{# dienų}}</translation>
+<translation id="335581015389089642">Kalba</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Liko 1 diena}one{Liko # diena}few{Liko # dienos}many{Liko # dienos}other{Liko # dienų}}</translation>
+<translation id="3618849550573277856">Ieškoti „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Pasirinkite norimą įkelti aplanką</translation>
 <translation id="3660179305079774227">Rodyklė „Aukštyn“</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">peršokti</translation>
 <translation id="4250229828105606438">Ekrano kopija</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Prieš 1 mėnesį}one{Prieš # mėnesį}few{Prieš # mėnesius}many{Prieš # mėnesio}other{Prieš # mėnesių}}</translation>
+<translation id="4289300219472526559">Pradėti kalbėti</translation>
 <translation id="4316910396681052118">VISOS PROGRAMOS</translation>
 <translation id="4588090240171750605">Slinkti į dešinę</translation>
 <translation id="4724120544754982507">Pranešimų centras, neskaitytų pranešimų: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">PROGRAMŲ PASIŪLYMAI</translation>
 <translation id="6364916375976753737">Slinkti į kairę</translation>
 <translation id="6394627529324717982">Kablelis</translation>
+<translation id="6397363302884558537">Baigti kalbėti</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Prieš 1 sek.}one{Prieš # sek.}few{Prieš # sek.}many{Prieš # sek.}other{Prieš # sek.}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Prieš 1 sekundę}one{Prieš # sekundę}few{Prieš # sekundes}many{Prieš # sekundės}other{Prieš # sekundžių}}</translation>
 <translation id="654149438358937226">Blokuoti visus pranešimus</translation>
diff --git a/ui/strings/translations/ui_strings_lv.xtb b/ui/strings/translations/ui_strings_lv.xtb
index 12c640a..bb4d85e 100644
--- a/ui/strings/translations/ui_strings_lv.xtb
+++ b/ui/strings/translations/ui_strings_lv.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Ritināt šeit</translation>
 <translation id="3234408098842461169">Bulta Lejup</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 diena}zero{# dienas}one{# diena}other{# dienas}}</translation>
+<translation id="335581015389089642">Runa</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Atlikusi 1 diena}zero{Atlikušas # dienas}one{Atlikusi # diena}other{Atlikušas # dienas}}</translation>
+<translation id="3618849550573277856">Meklēt “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Augšupielādējamās mapes atlase</translation>
 <translation id="3660179305079774227">Bulta augšup</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">lekt</translation>
 <translation id="4250229828105606438">Ekrānuzņēmums</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Pirms 1 mēneša}zero{Pirms # mēnešiem}one{Pirms # mēneša}other{Pirms # mēnešiem}}</translation>
+<translation id="4289300219472526559">Sākt runāt</translation>
 <translation id="4316910396681052118">VISAS LIETOTNES</translation>
 <translation id="4588090240171750605">Ritināt pa labi</translation>
 <translation id="4724120544754982507">Paziņojumu centrs, <ph name="UNREAD_NOTIFICATION_COUNT" /> nelasīts(-i) paziņojums(-i)</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">LIETOTŅU IETEIKUMI</translation>
 <translation id="6364916375976753737">Ritināt pa kreisi</translation>
 <translation id="6394627529324717982">Komats</translation>
+<translation id="6397363302884558537">Pārtraukt runāt</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Pirms 1 s}zero{Pirms # s}one{Pirms # s}other{Pirms # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Pirms 1 sekundes}zero{Pirms # sekundēm}one{Pirms # sekundes}other{Pirms # sekundēm}}</translation>
 <translation id="654149438358937226">Bloķēt visus paziņojumus</translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb
index d3cdadd..8cb420f5 100644
--- a/ui/strings/translations/ui_strings_ml.xtb
+++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">ഇവിടെ സ്ക്രോള്‍ ചെയ്യുക</translation>
 <translation id="3234408098842461169">താഴേക്കുള്ള ആരോ അടയാളം</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{ഒരു ദിവസം}other{# ദിവസം}}</translation>
+<translation id="335581015389089642">സംഭാഷണം</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{ഒരു ദിവസം ശേഷിക്കുന്നു}other{# ദിവസം ശേഷിക്കുന്നു}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” തിരയുക</translation>
 <translation id="364720409959344976">അപ്‌ലോഡുചെയ്യുന്നതിന് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">jump</translation>
 <translation id="4250229828105606438">സ്‌ക്രീൻഷോട്ട്</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{ഒരു മാസം മുമ്പ്}other{# മാസം മുമ്പ്}}</translation>
+<translation id="4289300219472526559">സംഭാഷണം ആരംഭിക്കുക</translation>
 <translation id="4316910396681052118">എല്ലാ ആപ്പുകളും</translation>
 <translation id="4588090240171750605">വലത്തോട്ട് സ്ക്രോള്‍ ചെയ്യുക</translation>
 <translation id="4724120544754982507">അറിയിപ്പ് കേന്ദ്രം, <ph name="UNREAD_NOTIFICATION_COUNT" /> വായിക്കാത്ത അറിയിപ്പുകൾ</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ആപ്പ് നിർദ്ദേശങ്ങൾ</translation>
 <translation id="6364916375976753737">ഇടത്തേക്ക് സ്ക്രോള്‍ ചെയ്യുക</translation>
 <translation id="6394627529324717982">കോമ</translation>
+<translation id="6397363302884558537">സംഭാഷണം നിർത്തുക</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{ഒരു സെക്കൻഡ് മുമ്പ്}other{# സെക്കൻഡ് മുമ്പ്}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 സെക്കൻഡ് മുമ്പ്}other{# സെക്കൻഡ് മുമ്പ്}}</translation>
 <translation id="654149438358937226">എല്ലാ അറിയിപ്പുകളും ബ്ലോക്ക് ചെയ്യുക</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb
index 0a4f27b..ac1865f3 100644
--- a/ui/strings/translations/ui_strings_mr.xtb
+++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">येथे स्क्रोल करा</translation>
 <translation id="3234408098842461169">Down Arrow</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 दिवस}one{# दिवस}other{# दिवस}}</translation>
+<translation id="335581015389089642">भाषण</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 दिवस शिल्लक}one{# दिवस शिल्लक}other{# दिवस शिल्लक}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” पहा</translation>
 <translation id="364720409959344976">अपलोड करण्यासाठी फोल्डर निवडा</translation>
 <translation id="3660179305079774227">Up Arrow</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">जंप करा</translation>
 <translation id="4250229828105606438">स्क्रीनशॉट</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 महिन्यापूर्वी}one{# महिन्यापूर्वी}other{# महिन्यांपूर्वी}}</translation>
+<translation id="4289300219472526559">बोलणे प्रारंभ करा</translation>
 <translation id="4316910396681052118">सर्व अ‍ॅप्स</translation>
 <translation id="4588090240171750605">उजवे स्क्रोल करा</translation>
 <translation id="4724120544754982507">सूचना केंद्र, <ph name="UNREAD_NOTIFICATION_COUNT" /> न वाचलेल्या सूचना</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">अॅप सूचना</translation>
 <translation id="6364916375976753737">डावीकडे स्क्रोल करा</translation>
 <translation id="6394627529324717982">स्वल्पविराम</translation>
+<translation id="6397363302884558537">बोलणे थांबवा</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 सेकंदापूर्वी}one{# सेकंदापूर्वी}other{# सेकंदांपूर्वी}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 सेकंदापूर्वी}one{# सेकंदापूर्वी}other{# सेकंदांपूर्वी}}</translation>
 <translation id="654149438358937226">सर्व सूचना ब्लॉक करा</translation>
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb
index 69898fe..a8787ef 100644
--- a/ui/strings/translations/ui_strings_ms.xtb
+++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Tatal ke Sini</translation>
 <translation id="3234408098842461169">Anak Panah Bawah</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 hari}other{# hari}}</translation>
+<translation id="335581015389089642">Pertuturan</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 hari lagi}other{# hari lagi}}</translation>
+<translation id="3618849550573277856">Cari “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Pilih Folder untuk Dimuat Naik</translation>
 <translation id="3660179305079774227">Anak Panah Atas</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">lompat</translation>
 <translation id="4250229828105606438">Tangkapan skrin</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 bulan yang lalu}other{# bulan yang lalu}}</translation>
+<translation id="4289300219472526559">Mula Bercakap</translation>
 <translation id="4316910396681052118">SEMUA APL</translation>
 <translation id="4588090240171750605">Tatal ke Kanan</translation>
 <translation id="4724120544754982507">Pusat Pemberitahuan, <ph name="UNREAD_NOTIFICATION_COUNT" /> pemberitahuan belum dibaca</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">CADANGAN APL</translation>
 <translation id="6364916375976753737">Tatal Ke Kiri</translation>
 <translation id="6394627529324717982">Koma</translation>
+<translation id="6397363302884558537">Berhenti Bercakap</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 saat yang lalu}other{# saat yang lalu}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Sesaat yang lalu}other{# saat yang lalu}}</translation>
 <translation id="654149438358937226">Sekat semua pemberitahuan</translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb
index 3c126e4..8dde3b8c 100644
--- a/ui/strings/translations/ui_strings_nl.xtb
+++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Hiernaartoe bladeren</translation>
 <translation id="3234408098842461169">Pijl-omlaag</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dag}other{# dagen}}</translation>
+<translation id="335581015389089642">Spraak</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag resterend}other{# dagen resterend}}</translation>
+<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' opzoeken</translation>
 <translation id="364720409959344976">Map voor uploaden selecteren</translation>
 <translation id="3660179305079774227">Pijl-omhoog</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">Gaan naar</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 maand geleden}other{# maanden geleden}}</translation>
+<translation id="4289300219472526559">Inspreken starten</translation>
 <translation id="4316910396681052118">ALLE APPS</translation>
 <translation id="4588090240171750605">Naar rechts bladeren</translation>
 <translation id="4724120544754982507">Meldingscentrum, <ph name="UNREAD_NOTIFICATION_COUNT" /> ongelezen meldingen</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APP-SUGGESTIES</translation>
 <translation id="6364916375976753737">Naar links bladeren</translation>
 <translation id="6394627529324717982">Komma</translation>
+<translation id="6397363302884558537">Inspreken stoppen</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 sec. geleden}other{# sec. geleden}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 seconde geleden}other{# seconden geleden}}</translation>
 <translation id="654149438358937226">Alle meldingen blokkeren</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb
index fccbef0..3cb3008 100644
--- a/ui/strings/translations/ui_strings_no.xtb
+++ b/ui/strings/translations/ui_strings_no.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Rull hit</translation>
 <translation id="3234408098842461169">Pil ned</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dag}other{# dager}}</translation>
+<translation id="335581015389089642">Tale</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag igjen}other{# dager igjen}}</translation>
+<translation id="3618849550573277856">Slå opp «<ph name="LOOKUP_STRING" />»</translation>
 <translation id="364720409959344976">Velg mappen du vil laste opp</translation>
 <translation id="3660179305079774227">Pil opp</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB per sek</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">hopp</translation>
 <translation id="4250229828105606438">Skjermdump</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{for 1 måned siden}other{for # måneder siden}}</translation>
+<translation id="4289300219472526559">Begynn å snakke</translation>
 <translation id="4316910396681052118">ALLE APPER</translation>
 <translation id="4588090240171750605">Rull mot høyre</translation>
 <translation id="4724120544754982507">Varselsenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> uleste varsler</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APPFORSLAG</translation>
 <translation id="6364916375976753737">Rull mot venstre</translation>
 <translation id="6394627529324717982">Komma</translation>
+<translation id="6397363302884558537">Stopp å snakke</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{For 1 sekund siden}other{For # sekunder siden}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{for 1 sekund siden}other{for # sekunder siden}}</translation>
 <translation id="654149438358937226">Blokkér alle varsler</translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb
index 4d2cd60..9d1c016 100644
--- a/ui/strings/translations/ui_strings_pl.xtb
+++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Przewiń tutaj</translation>
 <translation id="3234408098842461169">Strzałka w dół</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dzień}few{# dni}many{# dni}other{# dnia}}</translation>
+<translation id="335581015389089642">Mowa</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Pozostał 1 dzień}few{Pozostały # dni}many{Pozostało # dni}other{Pozostało # dnia}}</translation>
+<translation id="3618849550573277856">Sprawdź słowo „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Wybierz folder do przesłania</translation>
 <translation id="3660179305079774227">Strzałka w górę</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">przejdź</translation>
 <translation id="4250229828105606438">Zrzut ekranu</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{miesiąc temu}few{# miesiące temu}many{# miesięcy temu}other{# miesiąca temu}}</translation>
+<translation id="4289300219472526559">Zacznij mówić</translation>
 <translation id="4316910396681052118">WSZYSTKIE APLIKACJE</translation>
 <translation id="4588090240171750605">Przewiń w prawo</translation>
 <translation id="4724120544754982507">Centrum powiadomień, liczba nieprzeczytanych powiadomień: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGEROWANE APLIKACJE</translation>
 <translation id="6364916375976753737">Przewiń w lewo</translation>
 <translation id="6394627529324717982">Przecinek</translation>
+<translation id="6397363302884558537">Przestań mówić</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 s temu}few{# s temu}many{# s temu}other{# s temu}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{sekundę temu}few{# sekundy temu}many{# sekund temu}other{# sekundy temu}}</translation>
 <translation id="654149438358937226">Blokuj wszystkie powiadomienia</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb
index 0afd3358..a715736 100644
--- a/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Percorrer até aqui</translation>
 <translation id="3234408098842461169">Seta para baixo</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{Um dia}one{# dias}other{# dias}}</translation>
+<translation id="335581015389089642">Voz</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Um dia restante}one{# dias restantes}other{# dias restantes}}</translation>
+<translation id="3618849550573277856">Pesquisar “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Selecionar pasta para upload</translation>
 <translation id="3660179305079774227">Seta para cima</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">pular</translation>
 <translation id="4250229828105606438">Captura de tela</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 mês atrás}one{# mês atrás}other{# meses atrás}}</translation>
+<translation id="4289300219472526559">Comece a falar</translation>
 <translation id="4316910396681052118">TODOS OS APPS</translation>
 <translation id="4588090240171750605">Percorrer à direita</translation>
 <translation id="4724120544754982507">Central de Notificações: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificações não lidas</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGESTÕES DE APPS</translation>
 <translation id="6364916375976753737">Percorrer à esquerda</translation>
 <translation id="6394627529324717982">Vírgula</translation>
+<translation id="6397363302884558537">Pare de falar</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Um segundo atrás}one{# segundos atrás}other{# segundos atrás}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 segundo atrás}one{# segundo atrás}other{# segundos atrás}}</translation>
 <translation id="654149438358937226">Bloquear todas as notificações</translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb
index de57f816..0dbfd02 100644
--- a/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Deslocar-se para aqui</translation>
 <translation id="3234408098842461169">Seta para baixo</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dia}other{# dias}}</translation>
+<translation id="335581015389089642">Voz</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Falta 1 dia}other{Faltam # dias}}</translation>
+<translation id="3618849550573277856">Procurar "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Selecionar Pasta a Carregar</translation>
 <translation id="3660179305079774227">Seta para cima</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ir para</translation>
 <translation id="4250229828105606438">Captura de ecrã</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Há 1 mês}other{Há # meses}}</translation>
+<translation id="4289300219472526559">Comece a Falar</translation>
 <translation id="4316910396681052118">TODAS AS APLICAÇÕES</translation>
 <translation id="4588090240171750605">Deslocar-se para a direita</translation>
 <translation id="4724120544754982507">Centro de notificações, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificações não lidas</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGESTÕES DE APLICAÇÕES</translation>
 <translation id="6364916375976753737">Deslocar-se para a esquerda</translation>
 <translation id="6394627529324717982">Vírgula</translation>
+<translation id="6397363302884558537">Pare de Falar</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Há 1 seg}other{Há # seg}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Há 1 segundo}other{Há # segundos}}</translation>
 <translation id="654149438358937226">Bloquear todas as notificações</translation>
diff --git a/ui/strings/translations/ui_strings_ro.xtb b/ui/strings/translations/ui_strings_ro.xtb
index 9e5ca5c4..d8c2168 100644
--- a/ui/strings/translations/ui_strings_ro.xtb
+++ b/ui/strings/translations/ui_strings_ro.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Derulează până aici</translation>
 <translation id="3234408098842461169">Săgeată în jos</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{O zi}few{# zile}other{# de zile}}</translation>
+<translation id="335581015389089642">Voce</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{O zi rămasă}few{# zile rămase}other{# de zile rămase}}</translation>
+<translation id="3618849550573277856">Caută „<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Selectați un dosar de încărcat</translation>
 <translation id="3660179305079774227">Săgeată în sus</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">accesează</translation>
 <translation id="4250229828105606438">Captură de ecran</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Acum 1 lună}few{Acum # luni}other{Acum # de luni}}</translation>
+<translation id="4289300219472526559">Începeți să vorbiți</translation>
 <translation id="4316910396681052118">TOATE APLICAȚIILE</translation>
 <translation id="4588090240171750605">Derulează spre dreapta</translation>
 <translation id="4724120544754982507">Centrul de notificări, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificări necitite</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">SUGESTII DE APLICAȚII</translation>
 <translation id="6364916375976753737">Derulează spre stânga</translation>
 <translation id="6394627529324717982">Virgulă</translation>
+<translation id="6397363302884558537">Opriți-vă din vorbit</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Acum o sec.}few{Acum # sec}other{Acum # sec}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Acum 1 secundă}few{Acum # secunde}other{Acum # de secunde}}</translation>
 <translation id="654149438358937226">Blochează toate notificările</translation>
diff --git a/ui/strings/translations/ui_strings_ru.xtb b/ui/strings/translations/ui_strings_ru.xtb
index e959c391..c70c9eb 100644
--- a/ui/strings/translations/ui_strings_ru.xtb
+++ b/ui/strings/translations/ui_strings_ru.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Прокрутить до этого места</translation>
 <translation id="3234408098842461169">Стрелка вниз</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 день}one{# день}few{# дня}many{# дней}other{# дня}}</translation>
+<translation id="335581015389089642">Озвучить</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Остался 1 день}one{Остался # день}few{Осталось # дня}many{Осталось # дней}other{Осталось # дня}}</translation>
+<translation id="3618849550573277856">Найти "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Выберите папку для загрузки</translation>
 <translation id="3660179305079774227">Стрелка вверх</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/с</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">перейти</translation>
 <translation id="4250229828105606438">Скриншот</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{месяц назад}one{# месяц назад}few{# месяца назад}many{# месяцев назад}other{# месяца назад}}</translation>
+<translation id="4289300219472526559">Начать голосовой ввод</translation>
 <translation id="4316910396681052118">ВСЕ ПРИЛОЖЕНИЯ</translation>
 <translation id="4588090240171750605">Прокрутка вправо</translation>
 <translation id="4724120544754982507">Центр уведомлений. Непрочитанных: <ph name="UNREAD_NOTIFICATION_COUNT" />.</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ПРЕДЛАГАЕМЫЕ ПРИЛОЖЕНИЯ</translation>
 <translation id="6364916375976753737">Прокрутка влево</translation>
 <translation id="6394627529324717982">Запятая</translation>
+<translation id="6397363302884558537">Прекратить голосовой ввод</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 сек. назад}one{# сек. назад}few{# сек. назад}many{# сек. назад}other{# сек. назад}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{только что}one{# секунду назад}few{# секунды назад}many{# секунд назад}other{# секунды назад}}</translation>
 <translation id="654149438358937226">Блокировать все уведомления</translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb
index 53ec4c5..6060f95 100644
--- a/ui/strings/translations/ui_strings_sk.xtb
+++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Rolovať na toto miesto</translation>
 <translation id="3234408098842461169">Šípka nadol</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 deň}few{# dni}many{# dňa}other{# dní}}</translation>
+<translation id="335581015389089642">Reč</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Zostáva 1 deň}few{Zostávajú # dni}many{Zostáva # dňa}other{Zostáva # dní}}</translation>
+<translation id="3618849550573277856">Vyhľadať „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Výber priečinka na nahranie</translation>
 <translation id="3660179305079774227">Šípka nahor</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">skok</translation>
 <translation id="4250229828105606438">Snímka obrazovky</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{pred mesiacom}few{pred # mesiacmi}many{pred # mesiacom}other{pred # mesiacmi}}</translation>
+<translation id="4289300219472526559">Začať hovoriť</translation>
 <translation id="4316910396681052118">VŠETKY APLIKÁCIE</translation>
 <translation id="4588090240171750605">Rolovať doprava</translation>
 <translation id="4724120544754982507">Centrum upozornení – počet neprečítaných upozornení: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">NÁVRHY APLIKÁCIÍ</translation>
 <translation id="6364916375976753737">Rolovať doľava</translation>
 <translation id="6394627529324717982">Čiarka</translation>
+<translation id="6397363302884558537">Prestať hovoriť</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Pred 1 s}few{Pred # s}many{Pred # s}other{Pred # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{pred sekundou}few{pred # sekundami}many{pred # sekundami}other{pred # sekundami}}</translation>
 <translation id="654149438358937226">Blokovať všetky upozornenia</translation>
diff --git a/ui/strings/translations/ui_strings_sl.xtb b/ui/strings/translations/ui_strings_sl.xtb
index a24e892..c6e4422 100644
--- a/ui/strings/translations/ui_strings_sl.xtb
+++ b/ui/strings/translations/ui_strings_sl.xtb
@@ -46,7 +46,9 @@
 <translation id="3183922693828471536">Pomik do sem</translation>
 <translation id="3234408098842461169">Puščica dol</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dan}one{# dan}two{# dneva}few{# dni}other{# dni}}</translation>
+<translation id="335581015389089642">Speech</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Še 1 dan}one{Še # dan}two{Še # dneva}few{Še # dni}other{Še # dni}}</translation>
+<translation id="3618849550573277856">Poišči »<ph name="LOOKUP_STRING" />«</translation>
 <translation id="364720409959344976">Izberite mapo, ki jo želite prenesti</translation>
 <translation id="3660179305079774227">Puščica gor</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -59,6 +61,7 @@
 <translation id="4202807286478387388">skoči</translation>
 <translation id="4250229828105606438">Posnetek zaslona</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Pred 1 mesecem}one{Pred # mesecem}two{Pred # mesecema}few{Pred # meseci}other{Pred # meseci}}</translation>
+<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4316910396681052118">VSE APLIKACIJE</translation>
 <translation id="4588090240171750605">Pomik desno</translation>
 <translation id="4724120544754982507">Središče za obvestila, št. neprebranih sporočil: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -95,6 +98,7 @@
 <translation id="6351032674660237738">PREDLOGI ZA APLIKACIJE</translation>
 <translation id="6364916375976753737">Pomik levo</translation>
 <translation id="6394627529324717982">Vejica</translation>
+<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Pred 1 s}one{Pred # s}two{Pred # s}few{Pred # s}other{Pred # s}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Pred 1 sekundo}one{Pred # sekundo}two{Pred # sekundama}few{Pred # sekundami}other{Pred # sekundami}}</translation>
 <translation id="654149438358937226">Blokiraj vsa obvestila</translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb
index 13ea0720..97b5c97 100644
--- a/ui/strings/translations/ui_strings_sr.xtb
+++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Помери се овде</translation>
 <translation id="3234408098842461169">Стрелица надоле</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 дан}one{# дан}few{# дана}other{# дана}}</translation>
+<translation id="335581015389089642">Говор</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Још 1 дан}one{Још # дан}few{Још # дана}other{Још # дана}}</translation>
+<translation id="3618849550573277856">Потражи „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Избор директоријума за отпремање</translation>
 <translation id="3660179305079774227">Стрелица нагоре</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">прескочи</translation>
 <translation id="4250229828105606438">Снимак екрана</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Пре месец дана}one{Пре # месец}few{Пре # месеца}other{Пре # месеци}}</translation>
+<translation id="4289300219472526559">Почните да говорите</translation>
 <translation id="4316910396681052118">СВЕ АПЛИКАЦИЈЕ</translation>
 <translation id="4588090240171750605">Помери надесно</translation>
 <translation id="4724120544754982507">Центар за обавештења, непрочитаних обавештења: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ПРЕДЛОЗИ АПЛИКАЦИЈА</translation>
 <translation id="6364916375976753737">Помери налево</translation>
 <translation id="6394627529324717982">Зарез</translation>
+<translation id="6397363302884558537">Престаните да говорите</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Пре 1 сек}one{Пре # сек}few{Пре # сек}other{Пре # сек}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Пре 1 секунду}one{Пре # секунду}few{Пре # секунде}other{Пре # секунди}}</translation>
 <translation id="654149438358937226">Блокирај сва обавештења</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb
index eba4c49..62285d2d 100644
--- a/ui/strings/translations/ui_strings_sv.xtb
+++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Rulla hit</translation>
 <translation id="3234408098842461169">Nedpil</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 dag}other{# dagar}}</translation>
+<translation id="335581015389089642">Tal</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag kvar}other{# dagar kvar}}</translation>
+<translation id="3618849550573277856">Sök efter ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Välj en mapp för uppladdning</translation>
 <translation id="3660179305079774227">Uppil</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sek</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">fortsätta</translation>
 <translation id="4250229828105606438">Skärmdump</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 månad sedan}other{# månader sedan}}</translation>
+<translation id="4289300219472526559">Börja tala</translation>
 <translation id="4316910396681052118">ALLA APPAR</translation>
 <translation id="4588090240171750605">Rulla åt höger</translation>
 <translation id="4724120544754982507"><ph name="UNREAD_NOTIFICATION_COUNT" /> olästa aviseringar i meddelandecentret</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">APPFÖRSLAG</translation>
 <translation id="6364916375976753737">Rulla åt vänster</translation>
 <translation id="6394627529324717982">Komma</translation>
+<translation id="6397363302884558537">Sluta tala</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{för 1 sek sedan}other{för # sek sedan}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 sekund sedan}other{# sekunder sedan}}</translation>
 <translation id="654149438358937226">Blockera alla aviseringar</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb
index be4089a..80f9c4d 100644
--- a/ui/strings/translations/ui_strings_sw.xtb
+++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Sogeza Hadi Hapa</translation>
 <translation id="3234408098842461169">Mshale Chini</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{Siku 1}other{Siku #}}</translation>
+<translation id="335581015389089642">Usemi</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Imesalia siku 1}other{Zimesalia siku #}}</translation>
+<translation id="3618849550573277856">Angalia “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Chagua Folda ya Kupakia</translation>
 <translation id="3660179305079774227">Mshale Juu</translation>
 <translation id="3740362395218339114">GB/s <ph name="QUANTITY" /></translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ruka</translation>
 <translation id="4250229828105606438">Picha ya skrini</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{Mwezi 1 uliopita}other{Miezi # iliyopita}}</translation>
+<translation id="4289300219472526559">Anza Kuzungumza</translation>
 <translation id="4316910396681052118">PROGRAMU ZOTE</translation>
 <translation id="4588090240171750605">Sogeza Kulia</translation>
 <translation id="4724120544754982507">Kituo cha Arifa, arifa <ph name="UNREAD_NOTIFICATION_COUNT" /> ambazo hujasoma</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">MAPENDEKEZO YA PROGRAMU</translation>
 <translation id="6364916375976753737">Sogeza Kushoto</translation>
 <translation id="6394627529324717982">Koma</translation>
+<translation id="6397363302884558537">Koma Kuongea</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{Sekunde 1 iliyopita}other{Sekunde # zilizopita}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{Sekunde 1 iliyopita}other{Sekunde # zilizopita}}</translation>
 <translation id="654149438358937226">Zuia arifa zote</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index 7345030c..29d8a2e 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">இங்கே உருட்டு</translation>
 <translation id="3234408098842461169">கீழ்நோக்கிய அம்பு</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 நாள்}other{# நாட்கள்}}</translation>
+<translation id="335581015389089642">பேச்சு</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 நாள் உள்ளது}other{# நாட்கள் உள்ளன}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” எனத் தேடு</translation>
 <translation id="364720409959344976">பதிவேற்றுவதற்குக் கோப்புறையைத் தேர்ந்தெடு</translation>
 <translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> ஜி.பை/வி</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">தாவு</translation>
 <translation id="4250229828105606438">ஸ்கிரீன் ஷாட்</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 மாதத்திற்கு முன்}other{# மாதங்களுக்கு முன்}}</translation>
+<translation id="4289300219472526559">பேச்சைத் தொடங்கு</translation>
 <translation id="4316910396681052118">எல்லாப் பயன்பாடுகளும்</translation>
 <translation id="4588090240171750605">வலப்புறம் உருட்டு</translation>
 <translation id="4724120544754982507">அறிவிப்பு மையம், <ph name="UNREAD_NOTIFICATION_COUNT" /> படிக்காத அறிவிப்புகள்</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">பயன்பாட்டுப் பரிந்துரைகள்</translation>
 <translation id="6364916375976753737">இடப்புறம் உருட்டு</translation>
 <translation id="6394627529324717982">கமா</translation>
+<translation id="6397363302884558537">பேச்சை நிறுத்து</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 நிமிடம் முன்பு}other{# நிமிடங்கள் முன்பு}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 வினாடிக்கு முன்பு}other{# வினாடிகளுக்கு முன்பு}}</translation>
 <translation id="654149438358937226">எல்லா அறிவிப்புகளையும் தடு</translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb
index 183e1e8a..33d36ad 100644
--- a/ui/strings/translations/ui_strings_te.xtb
+++ b/ui/strings/translations/ui_strings_te.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">ఇక్కడ స్క్రోల్ చెయ్యండి</translation>
 <translation id="3234408098842461169">క్రింది బాణం</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 రోజు}other{# రోజులు}}</translation>
+<translation id="335581015389089642">ప్రసంగం</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 రోజు మిగిలి ఉంది}other{# రోజులు మిగిలి ఉన్నాయి}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />”ని వెతకండి</translation>
 <translation id="364720409959344976">అప్‌లోడ్ చేయడానికి ఫోల్డర్‌ని ఎంచుకోండి</translation>
 <translation id="3660179305079774227">ఎగువ బాణం</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">వెళ్ళు</translation>
 <translation id="4250229828105606438">స్క్రీన్‌షాట్</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 నెల క్రితం}other{# నెలల క్రితం}}</translation>
+<translation id="4289300219472526559">మాట్లాడటాన్ని ప్రారంభించు</translation>
 <translation id="4316910396681052118">అన్ని అనువర్తనాలు</translation>
 <translation id="4588090240171750605">కుడికి స్క్రోల్ చెయ్యి</translation>
 <translation id="4724120544754982507">నోటిఫికేషన్ కేంద్రం, <ph name="UNREAD_NOTIFICATION_COUNT" /> చదవని నోటిఫికేషన్‌లు</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">యాప్ సూచనలు</translation>
 <translation id="6364916375976753737">ఎడమకి స్క్రోల్ చేయి</translation>
 <translation id="6394627529324717982">కామా</translation>
+<translation id="6397363302884558537">మాట్లాడటాన్ని ఆపివేయి</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 సెక. క్రితం}other{# సెక. క్రితం}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 సెకను క్రితం}other{# సెకన్ల క్రితం}}</translation>
 <translation id="654149438358937226">అన్ని నోటిఫికేషన్‌లను బ్లాక్ చేయి</translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb
index e6af5ec..5cfe28b 100644
--- a/ui/strings/translations/ui_strings_th.xtb
+++ b/ui/strings/translations/ui_strings_th.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">เลื่อนมาที่นี่</translation>
 <translation id="3234408098842461169">ลูกศรลง</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 วัน}other{# วัน}}</translation>
+<translation id="335581015389089642">คำพูด</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{เหลือ 1 วัน}other{เหลือ # วัน}}</translation>
+<translation id="3618849550573277856">ค้นหา “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation>
 <translation id="3660179305079774227">ลูกศรขึ้น</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/วินาที</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">ข้าม</translation>
 <translation id="4250229828105606438">ภาพหน้าจอ</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 เดือนที่ผ่านมา}other{# เดือนที่ผ่านมา}}</translation>
+<translation id="4289300219472526559">เริ่มพูด</translation>
 <translation id="4316910396681052118">แอปทั้งหมด</translation>
 <translation id="4588090240171750605">เลื่อนทางขวา</translation>
 <translation id="4724120544754982507">ศูนย์การแจ้งเตือนมีการแจ้งเตือนที่ยังไม่อ่าน <ph name="UNREAD_NOTIFICATION_COUNT" /> รายการ</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">คำแนะนำเกี่ยวกับแอป</translation>
 <translation id="6364916375976753737">เลื่อนทางซ้าย</translation>
 <translation id="6394627529324717982">จุลภาค</translation>
+<translation id="6397363302884558537">หยุดพูด</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 วินาทีที่ผ่านมา}other{# วินาทีที่ผ่านมา}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{ 1 วินาทีที่ผ่านมา}other{# วินาทีที่ผ่านมา}}</translation>
 <translation id="654149438358937226">บล็อกการแจ้งเตือนทั้งหมด</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb
index 0f9c0e7..6e95c9c 100644
--- a/ui/strings/translations/ui_strings_tr.xtb
+++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Buraya Kaydır</translation>
 <translation id="3234408098842461169">Aşağı Ok</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 gün}other{# gün}}</translation>
+<translation id="335581015389089642">Konuşma</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 gün kaldı}other{# gün kaldı}}</translation>
+<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” Araması Yap</translation>
 <translation id="364720409959344976">Yüklenecek Klasörü Seçin</translation>
 <translation id="3660179305079774227">Yukarı Ok</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/sn</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">git</translation>
 <translation id="4250229828105606438">Ekran görüntüsü</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 ay önce}other{# ay önce}}</translation>
+<translation id="4289300219472526559">Konuşmaya Başla</translation>
 <translation id="4316910396681052118">TÜM UYGULAMALAR</translation>
 <translation id="4588090240171750605">Sağa Kaydır</translation>
 <translation id="4724120544754982507">Bildirim Merkezi, <ph name="UNREAD_NOTIFICATION_COUNT" /> okunmamış bildirim</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">UYGULAMA ÖNERİLERİ</translation>
 <translation id="6364916375976753737">Sola Kaydır</translation>
 <translation id="6394627529324717982">Virgül</translation>
+<translation id="6397363302884558537">Konuşmayı Durdur</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 sn. önce}other{# sn. önce}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 saniye önce}other{# saniye önce}}</translation>
 <translation id="654149438358937226">Tüm bildirimleri engelle</translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb
index 61a92f1..b95f3c2 100644
--- a/ui/strings/translations/ui_strings_uk.xtb
+++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Прокрутка до цього місця</translation>
 <translation id="3234408098842461169">Курсор униз</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 день}one{# день}few{# дні}many{# днів}other{# дня}}</translation>
+<translation id="335581015389089642">Speech</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Залишився 1 день}one{Залишився # день}few{Залишилося # дні}many{Залишилося # днів}other{Залишилося # дня}}</translation>
+<translation id="3618849550573277856">Шукати "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Виберіть папку для завантаження</translation>
 <translation id="3660179305079774227">Курсор угору</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> ГБ/сек.</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">перейти</translation>
 <translation id="4250229828105606438">Знімок екрана</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 місяць тому}one{# місяць тому}few{# місяці тому}many{# місяців тому}other{# місяця тому}}</translation>
+<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4316910396681052118">УСІ ДОДАТКИ</translation>
 <translation id="4588090240171750605">Прокрутка вправо</translation>
 <translation id="4724120544754982507">Центр сповіщень, непрочитаних сповіщень: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ПРОПОЗИЦІЇ ДОДАТКІВ</translation>
 <translation id="6364916375976753737">Прокрутка вліво</translation>
 <translation id="6394627529324717982">Кома</translation>
+<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 с тому}one{# с тому}few{# с тому}many{# с тому}other{# с тому}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 секунду тому}one{# секунду тому}few{# секунди тому}many{# секунд тому}other{# секунди тому}}</translation>
 <translation id="654149438358937226">Блокувати всі сповіщення</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb
index a22b01f8..ad605d73 100644
--- a/ui/strings/translations/ui_strings_vi.xtb
+++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">Cuộn tới Đây</translation>
 <translation id="3234408098842461169">Phím mũi tên Xuống</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 ngày}other{# ngày}}</translation>
+<translation id="335581015389089642">Giọng nói</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Còn 1 ngày}other{Còn # ngày}}</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>
 <translation id="3660179305079774227">Phím mũi tên Lên</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/giây</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">chuyển</translation>
 <translation id="4250229828105606438">Ảnh chụp màn hình</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 tháng trước}other{# tháng trước}}</translation>
+<translation id="4289300219472526559">Bắt đầu nói</translation>
 <translation id="4316910396681052118">TẤT CẢ ỨNG DỤNG</translation>
 <translation id="4588090240171750605">Cuộn qua Phải</translation>
 <translation id="4724120544754982507">Trung tâm thông báo, <ph name="UNREAD_NOTIFICATION_COUNT" /> thông báo chưa đọc</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">ĐỀ XUẤT ỨNG DỤNG</translation>
 <translation id="6364916375976753737">Cuộn qua Trái</translation>
 <translation id="6394627529324717982">Dấu phẩy</translation>
+<translation id="6397363302884558537">Dừng nói</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 giây trước}other{# giây trước}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 giây trước}other{# giây trước}}</translation>
 <translation id="654149438358937226">Chặn tất cả thông báo</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb
index 18148d9..1a3e11e 100644
--- a/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">滚动到此处</translation>
 <translation id="3234408098842461169">向下箭头</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 天}other{# 天}}</translation>
+<translation id="335581015389089642">语音</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{还剩 1 天}other{还剩 # 天}}</translation>
+<translation id="3618849550573277856">查询“<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">选择要上传的文件夹</translation>
 <translation id="3660179305079774227">向上箭头</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/s</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">略过</translation>
 <translation id="4250229828105606438">屏幕截图</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 个月前}other{# 个月前}}</translation>
+<translation id="4289300219472526559">开始讲话</translation>
 <translation id="4316910396681052118">所有应用</translation>
 <translation id="4588090240171750605">向右滚动</translation>
 <translation id="4724120544754982507">通知中心,<ph name="UNREAD_NOTIFICATION_COUNT" /> 条未读通知</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">应用推荐</translation>
 <translation id="6364916375976753737">向左滚动</translation>
 <translation id="6394627529324717982">逗号</translation>
+<translation id="6397363302884558537">停止讲话</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="654149438358937226">屏蔽所有通知</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb
index bb9f58a8..182f1b6 100644
--- a/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -50,7 +50,9 @@
 <translation id="3183922693828471536">捲動至此</translation>
 <translation id="3234408098842461169">向下鍵</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{1 天}other{# 天}}</translation>
+<translation id="335581015389089642">語音</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{還剩 1 天}other{還剩 # 天}}</translation>
+<translation id="3618849550573277856">查詢「<ph name="LOOKUP_STRING" />」</translation>
 <translation id="364720409959344976">選取要上傳的資料夾</translation>
 <translation id="3660179305079774227">向上鍵</translation>
 <translation id="3740362395218339114"><ph name="QUANTITY" /> GB/秒</translation>
@@ -63,6 +65,7 @@
 <translation id="4202807286478387388">跳至另一頁</translation>
 <translation id="4250229828105606438">螢幕擷取畫面</translation>
 <translation id="4266252015790371705">{MONTHS,plural, =1{1 個月前}other{# 個月前}}</translation>
+<translation id="4289300219472526559">Start Speaking</translation>
 <translation id="4316910396681052118">所有應用程式</translation>
 <translation id="4588090240171750605">向右捲動</translation>
 <translation id="4724120544754982507">通知中心,<ph name="UNREAD_NOTIFICATION_COUNT" /> 則未讀通知</translation>
@@ -101,6 +104,7 @@
 <translation id="6351032674660237738">應用程式建議</translation>
 <translation id="6364916375976753737">向左捲動</translation>
 <translation id="6394627529324717982">逗號</translation>
+<translation id="6397363302884558537">Stop Speaking</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation>
 <translation id="654149438358937226">封鎖所有通知</translation>
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc
index fae5d20c..4ba8863 100644
--- a/ui/views/accessibility/view_accessibility.cc
+++ b/ui/views/accessibility/view_accessibility.cc
@@ -60,19 +60,33 @@
   owner_view_->GetAccessibleNodeData(data);
   if (custom_data_.role != ax::mojom::Role::kUnknown)
     data->role = custom_data_.role;
+
   if (custom_data_.HasStringAttribute(ax::mojom::StringAttribute::kName)) {
     data->SetName(
         custom_data_.GetStringAttribute(ax::mojom::StringAttribute::kName));
   }
 
-  data->location = gfx::RectF(owner_view_->GetBoundsInScreen());
-  if (!data->HasStringAttribute(ax::mojom::StringAttribute::kDescription)) {
-    base::string16 description;
-    owner_view_->GetTooltipText(gfx::Point(), &description);
-    data->AddStringAttribute(ax::mojom::StringAttribute::kDescription,
-                             base::UTF16ToUTF8(description));
+  if (custom_data_.HasStringAttribute(
+          ax::mojom::StringAttribute::kDescription)) {
+    data->SetDescription(custom_data_.GetStringAttribute(
+        ax::mojom::StringAttribute::kDescription));
   }
 
+  if (!data->HasStringAttribute(ax::mojom::StringAttribute::kDescription)) {
+    base::string16 tooltip;
+    owner_view_->GetTooltipText(gfx::Point(), &tooltip);
+    // Some screen readers announce the accessible description right after the
+    // accessible name. Only use the tooltip as the accessible description if
+    // it's different from the name, otherwise users might be puzzled as to why
+    // their screen reader is announcing the same thing twice.
+    if (tooltip !=
+        data->GetString16Attribute(ax::mojom::StringAttribute::kName)) {
+      data->AddStringAttribute(ax::mojom::StringAttribute::kDescription,
+                               base::UTF16ToUTF8(tooltip));
+    }
+  }
+
+  data->location = gfx::RectF(owner_view_->GetBoundsInScreen());
   data->AddStringAttribute(ax::mojom::StringAttribute::kClassName,
                            owner_view_->GetClassName());
 
diff --git a/ui/views/bubble/bubble_border.cc b/ui/views/bubble/bubble_border.cc
index 797fb98..e2292a8f 100644
--- a/ui/views/bubble/bubble_border.cc
+++ b/ui/views/bubble/bubble_border.cc
@@ -8,12 +8,12 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "cc/paint/paint_flags.h"
 #include "third_party/skia/include/core/SkDrawLooper.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/path.h"
 #include "ui/gfx/scoped_canvas.h"
@@ -65,17 +65,6 @@
 // The border is stroked at 1px, but for the purposes of reserving space we have
 // to deal in dip coordinates, so round up to 1dip.
 const int kBorderThicknessDip = 1;
-const int kBorderStrokeThicknessPx = 1;
-
-// Blur and offset values for the two shadows drawn around each dialog. The
-// values are all in dip.
-const int kSmallShadowVerticalOffset = 2;
-const int kSmallShadowBlur = 4;
-const SkColor kSmallShadowColor = SkColorSetA(SK_ColorBLACK, 0x33);
-
-const int kLargeShadowVerticalOffset = 2;
-const int kLargeShadowBlur = 6;
-const SkColor kLargeShadowColor = SkColorSetA(SK_ColorBLACK, 0x1A);
 
 bool UseMaterialDesign() {
   return ui::MaterialDesignController::IsSecondaryUiMaterial();
@@ -199,6 +188,14 @@
 
 BubbleBorder::~BubbleBorder() {}
 
+// static
+gfx::Insets BubbleBorder::GetBorderAndShadowInsets() {
+  constexpr gfx::Insets blur(kShadowBlur + kBorderThicknessDip);
+  constexpr gfx::Insets offset(-kShadowVerticalOffset, 0, kShadowVerticalOffset,
+                               0);
+  return blur + offset;
+}
+
 void BubbleBorder::set_paint_arrow(ArrowPaintType value) {
   if (UseMaterialDesign())
     return;
@@ -368,15 +365,8 @@
 }
 
 gfx::Insets BubbleBorder::GetInsets() const {
-  if (UseMaterialDesign()) {
-    if (shadow_ == NO_ASSETS)
-      return gfx::Insets();
-
-    gfx::Insets blur(kLargeShadowBlur);
-    gfx::Insets offset(-kLargeShadowVerticalOffset, 0,
-                       kLargeShadowVerticalOffset, 0);
-    return blur + offset;
-  }
+  if (UseMaterialDesign())
+    return (shadow_ == NO_ASSETS) ? gfx::Insets() : GetBorderAndShadowInsets();
 
   // The insets contain the stroke and shadow pixels outside the bubble fill.
   const int inset = GetBorderThickness();
@@ -397,6 +387,33 @@
   return GetSizeForContentsSize(gfx::Size());
 }
 
+// static
+const cc::PaintFlags& BubbleBorder::GetBorderAndShadowFlags() {
+  // This object is always the same, so construct it once and cache.
+  static const base::NoDestructor<cc::PaintFlags> flags([] {
+    cc::PaintFlags f;
+    constexpr SkColor kBorderColor = SkColorSetA(SK_ColorBLACK, 0x26);
+    f.setColor(kBorderColor);
+    f.setAntiAlias(true);
+
+    constexpr int kSmallShadowVerticalOffset = 2;
+    constexpr int kSmallShadowBlur = 4;
+    constexpr SkColor kSmallShadowColor = SkColorSetA(SK_ColorBLACK, 0x33);
+    constexpr SkColor kLargeShadowColor = SkColorSetA(SK_ColorBLACK, 0x1A);
+    // gfx::ShadowValue counts blur pixels both inside and outside the shape,
+    // whereas these blur values only describe the outside portion, hence they
+    // must be doubled.
+    f.setLooper(gfx::CreateShadowDrawLooper({
+        {gfx::Vector2d(0, kSmallShadowVerticalOffset), 2 * kSmallShadowBlur,
+         kSmallShadowColor},
+        {gfx::Vector2d(0, kShadowVerticalOffset), 2 * kShadowBlur,
+         kLargeShadowColor},
+    }));
+    return f;
+  }());
+  return *flags;
+}
+
 gfx::Size BubbleBorder::GetSizeForContentsSize(
     const gfx::Size& contents_size) const {
   // Enlarge the contents size by the thickness of the border images.
@@ -526,28 +543,11 @@
 
   gfx::ScopedCanvas scoped(canvas);
 
-  cc::PaintFlags flags;
-  std::vector<gfx::ShadowValue> shadows;
-  // gfx::ShadowValue counts blur pixels both inside and outside the shape,
-  // whereas these blur values only describe the outside portion, hence they
-  // must be doubled.
-  shadows.emplace_back(gfx::Vector2d(0, kSmallShadowVerticalOffset),
-                       2 * kSmallShadowBlur, kSmallShadowColor);
-  shadows.emplace_back(gfx::Vector2d(0, kLargeShadowVerticalOffset),
-                       2 * kLargeShadowBlur, kLargeShadowColor);
-  flags.setLooper(gfx::CreateShadowDrawLooper(shadows));
-  flags.setColor(SkColorSetA(SK_ColorBLACK, 0x26));
-  flags.setAntiAlias(true);
-
   SkRRect r_rect = GetClientRect(view);
   canvas->sk_canvas()->clipRRect(r_rect, SkClipOp::kDifference,
                                  true /*doAntiAlias*/);
 
-  // The border is drawn outside the content area.
-  const SkScalar one_pixel =
-      SkFloatToScalar(kBorderStrokeThicknessPx / canvas->image_scale());
-  r_rect.inset(-one_pixel, -one_pixel);
-  canvas->sk_canvas()->drawRRect(r_rect, flags);
+  DrawBorderAndShadow(std::move(r_rect), &cc::PaintCanvas::drawRRect, canvas);
 }
 
 void BubbleBorder::PaintNoAssets(const View& view, gfx::Canvas* canvas) {
diff --git a/ui/views/bubble/bubble_border.h b/ui/views/bubble/bubble_border.h
index fdf0c360..46531ed 100644
--- a/ui/views/bubble/bubble_border.h
+++ b/ui/views/bubble/bubble_border.h
@@ -11,6 +11,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "build/build_config.h"
+#include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
@@ -135,6 +136,11 @@
     PAINT_NONE,
   };
 
+  // Specific to MD bubbles: size of shadow blur (outside the bubble) and
+  // vertical offset, both in DIP.
+  static constexpr int kShadowBlur = 6;
+  static constexpr int kShadowVerticalOffset = 2;
+
   BubbleBorder(Arrow arrow, Shadow shadow, SkColor color);
   ~BubbleBorder() override;
 
@@ -166,6 +172,26 @@
         a : static_cast<Arrow>(a ^ BOTTOM);
   }
 
+  // Returns the insets required by a border and shadow.  This is only used for
+  // MD bubbles.
+  static gfx::Insets GetBorderAndShadowInsets();
+
+  // Draws a border and shadow outside the |rect| on |canvas|, using |draw| as
+  // the draw function.  Templated so as to accept either SkRect or SkRRect.
+  template <typename T>
+  static void DrawBorderAndShadow(
+      T rect,
+      void (cc::PaintCanvas::*draw)(const T&, const cc::PaintFlags&),
+      gfx::Canvas* canvas) {
+    // Provide a 1 px border outside the bounds.
+    const int kBorderStrokeThicknessPx = 1;
+    const SkScalar one_pixel =
+        SkFloatToScalar(kBorderStrokeThicknessPx / canvas->image_scale());
+    rect.outset(one_pixel, one_pixel);
+
+    (canvas->sk_canvas()->*draw)(rect, GetBorderAndShadowFlags());
+  }
+
   // Get or set the arrow type.
   void set_arrow(Arrow arrow) { arrow_ = arrow; }
   Arrow arrow() const { return arrow_; }
@@ -233,6 +259,10 @@
   FRIEND_TEST_ALL_PREFIXES(BubbleBorderTest, GetBoundsOriginTest);
   FRIEND_TEST_ALL_PREFIXES(BubbleBorderTest, ShadowTypes);
 
+  // Returns the paint flags to use for painting the border and shadow.  This is
+  // only used for MD bubbles.
+  static const cc::PaintFlags& GetBorderAndShadowFlags();
+
   // The border and arrow stroke size used in image assets, in pixels.
   static const int kStroke;
 
diff --git a/ui/views/controls/button/toggle_button.cc b/ui/views/controls/button/toggle_button.cc
index f17b36d..650d85b 100644
--- a/ui/views/controls/button/toggle_button.cc
+++ b/ui/views/controls/button/toggle_button.cc
@@ -23,13 +23,13 @@
 namespace {
 
 // Constants are measured in dip.
-const int kTrackHeight = 12;
-const int kTrackWidth = 28;
+constexpr int kTrackHeight = 12;
+constexpr int kTrackWidth = 28;
 // Margins from edge of track to edge of view.
-const int kTrackVerticalMargin = 5;
-const int kTrackHorizontalMargin = 6;
+constexpr int kTrackVerticalMargin = 5;
+constexpr int kTrackHorizontalMargin = 6;
 // Inset from the rounded edge of the thumb to the rounded edge of the track.
-const int kThumbInset = 2;
+constexpr int kThumbInset = 2;
 
 }  // namespace
 
@@ -60,9 +60,9 @@
   }
 
  private:
-  static const int kShadowOffsetX = 0;
-  static const int kShadowOffsetY = 1;
-  static const int kShadowBlur = 2;
+  static constexpr int kShadowOffsetX = 0;
+  static constexpr int kShadowOffsetY = 1;
+  static constexpr int kShadowBlur = 2;
 
   // views::View:
   const char* GetClassName() const override {
diff --git a/ui/views/examples/label_example.cc b/ui/views/examples/label_example.cc
index 05e30aa..4af9232 100644
--- a/ui/views/examples/label_example.cc
+++ b/ui/views/examples/label_example.cc
@@ -101,7 +101,7 @@
   label->SetFontList(gfx::FontList("Courier, 18px"));
   gfx::ShadowValues shadows(1,
                             gfx::ShadowValue(gfx::Vector2d(), 1, SK_ColorRED));
-  gfx::ShadowValue shadow(gfx::Vector2d(2, 2), 0, SK_ColorGRAY);
+  constexpr gfx::ShadowValue shadow(gfx::Vector2d(2, 2), 0, SK_ColorGRAY);
   shadows.push_back(shadow);
   label->SetShadows(shadows);
   container->AddChildView(label);
diff --git a/ui/views/widget/native_widget_mac_accessibility_unittest.mm b/ui/views/widget/native_widget_mac_accessibility_unittest.mm
index 259489e..a6baee3 100644
--- a/ui/views/widget/native_widget_mac_accessibility_unittest.mm
+++ b/ui/views/widget/native_widget_mac_accessibility_unittest.mm
@@ -391,7 +391,7 @@
 
 // Test for NSAccessibilityHelpAttribute.
 TEST_F(NativeWidgetMacAccessibilityTest, HelpAttribute) {
-  Label* label = new Label(base::SysNSStringToUTF16(kTestPlaceholderText));
+  Label* label = new Label(base::SysNSStringToUTF16(kTestStringValue));
   label->SetSize(GetWidgetBounds().size());
   EXPECT_NSEQ(@"", AttributeValueAtMidpoint(NSAccessibilityHelpAttribute));
   label->SetTooltipText(base::SysNSStringToUTF16(kTestPlaceholderText));
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.html b/ui/webui/resources/cr_components/chromeos/network/network_config.html
index 20f57aa..32c5b74 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.html
@@ -1,6 +1,5 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
-<link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_network_icon.html">
 <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys/iron-a11y-keys.html">
@@ -13,14 +12,6 @@
 <dom-module id="network-config">
   <template>
     <style include="network-shared iron-flex">
-      #error {
-        color: red;
-        font-weight: 500;
-      }
-
-      cr-network-icon {
-        -webkit-margin-end: 10px;
-      }
     </style>
 
     <!-- SSID (WiFi) -->
@@ -168,26 +159,6 @@
       </div>
     </template>
 
-    <template is="dom-if"
-        if="[[connectingIsVisible_(propertiesSent_, error_)]]" restamp>
-      <div class="property-box">
-        <div class="start layout horizontal center">
-          <cr-network-icon is-list-item
-              network-state="[[getIconState_(configProperties_)]]">
-          </cr-network-icon>
-          <div>[[i18n('OncConnecting')]]</div>
-        </div>
-      </div>
-    </template>
-
-    <template is="dom-if" if="[[error_]]" restamp>
-      <div class="property-box">
-        <div id="error" class="start">
-          [[getError_(error_)]]
-        </div>
-      </div>
-    </template>
-
   </template>
   <script src="network_config.js"></script>
 </dom-module>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index 54aabcf..6e9a978 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -86,6 +86,12 @@
       notify: true,
     },
 
+    /** Set to any error from the last configuration result. */
+    error: {
+      type: String,
+      notify: true,
+    },
+
     /** Set if |guid| is not empty once networkProperties are received. */
     propertiesReceived_: Boolean,
 
@@ -219,9 +225,6 @@
       value: null,
     },
 
-    /** @private */
-    error_: String,
-
     /**
      * Object providing network type values for data binding. Note: Currently
      * we only support WiFi, but support for other types will be following
@@ -361,7 +364,7 @@
     if (this.propertiesSent_)
       return;
     this.propertiesSent_ = true;
-    this.error_ = '';
+    this.error = '';
 
     var propertiesToSet = this.getPropertiesToSet_();
     if (this.getSource_() == CrOnc.Source.NONE) {
@@ -901,7 +904,7 @@
   /** @private */
   updateCertError_: function() {
     /** @const */ var certError = 'networkErrorNoUserCertificate';
-    if (this.error_ && this.error_ != certError)
+    if (this.error && this.error != certError)
       return;
 
     var requireCerts = (this.showEap_ && this.showEap_.UserCert) ||
@@ -1037,14 +1040,6 @@
    * @return {boolean}
    * @private
    */
-  connectingIsVisible_: function() {
-    return this.propertiesSent_ && !this.error_;
-  },
-
-  /**
-   * @return {boolean}
-   * @private
-   */
   shareIsEnabled_: function() {
     if (!this.shareAllowEnable || this.getSource_() != CrOnc.Source.NONE)
       return false;
@@ -1211,8 +1206,8 @@
   /** @private */
   setPropertiesCallback_: function() {
     this.setError_(this.getRuntimeError_());
-    if (this.error_) {
-      console.error('setProperties error: ' + this.guid + ': ' + this.error_);
+    if (this.error) {
+      console.error('setProperties error: ' + this.guid + ': ' + this.error);
       this.propertiesSent_ = false;
       return;
     }
@@ -1232,10 +1227,10 @@
    */
   createNetworkCallback_: function(guid) {
     this.setError_(this.getRuntimeError_());
-    if (this.error_) {
+    if (this.error) {
       console.error(
           'createNetworkError, type: ' + this.networkProperties.Type + ': ' +
-          'error: ' + this.error_);
+          'error: ' + this.error);
       this.propertiesSent_ = false;
       return;
     }
@@ -1287,38 +1282,11 @@
   },
 
   /**
-   * @param {!chrome.networkingPrivate.NetworkConfigProperties} properties
-   * @return {!CrOnc.NetworkStateProperties}
-   * @private
-   */
-  getIconState_: function(properties) {
-    return {
-      ConnectionState: CrOnc.ConnectionState.CONNECTING,
-      GUID: properties.GUID || '',
-      Type: this.type,
-    };
-  },
-
-  /**
    * @param {string|undefined} error
    * @private
    */
   setError_: function(error) {
-    if (!error) {
-      this.error_ = '';
-      return;
-    }
-    this.error_ = error;
+    this.error = error || '';
   },
-
-  /**
-   * @return {string}
-   * @private
-   */
-  getError_: function() {
-    if (this.i18nExists(this.error_))
-      return this.i18n(this.error_);
-    return this.i18n('networkErrorUnknown');
-  }
 });
 })();