diff --git a/AUTHORS b/AUTHORS
index a4de4f4..3c996511 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -366,6 +366,7 @@
 Ilia Demianenko <ilia.demianenko@gmail.com>
 Ilia K <ki.stfu@gmail.com>
 Ilya Konstantinov <ilya.konstantinov@gmail.com>
+Imranur Rahman <i.rahman@samsung.com>
 Imranur Rahman <ir.shimul@gmail.com>
 Ion Rosca <rosca@adobe.com>
 Irmak Kavasoglu <irmakkavasoglu@gmail.com>
@@ -984,7 +985,6 @@
 Yael Aharon <yael.aharon@intel.com>
 Yan Wang <yan0422.wang@samsung.com>
 Yang Gu <yang.gu@intel.com>
-Yannic Bonenberger <contact@yannic-bonenberger.com>
 Yannic Bonenberger <yannic.bonenberger@gmail.com>
 Yarin Kaul <yarin.kaul@gmail.com>
 Yash Vempati <vempatiy@amazon.com>
diff --git a/DEPS b/DEPS
index 039f4f0f..a36f258 100644
--- a/DEPS
+++ b/DEPS
@@ -162,11 +162,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'df432d5efb70947c5424b690992899f7b45b8d82',
+  'skia_revision': '932a2c0e3bb614c77bd4293f56bb5619f902e507',
   # 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': '4b4c63ad2abc4471b0051edcc16ad77fb2846e2f',
+  'v8_revision': '84da790b879ff03a75ea94c6de263704f04658fe',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -174,7 +174,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': '41079d70e4695544a9d0d0bcc41788a92f9d1c6a',
+  'angle_revision': '65a5036eb0419047789d5ee66c02577ef251e07b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -213,7 +213,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': 'cc17f852d575a8a66f9be51461af550d0f413891',
+  'freetype_revision': '99f23d6ff2203966d210bccd49eacc62a20328f9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -225,7 +225,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'b19a360c1269c795eff8dcf1e6d44093d20aeefe',
+  'catapult_revision': 'b4e53c4a99381cd07cbfda1d6e3561bd3ed80f52',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -853,7 +853,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '08a7e90d730a745faa146a02217cd3e0d0968e6e',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '818d963727de2aa9d1b7252e9657d425ec856001',
       'condition': 'checkout_linux',
   },
 
@@ -1257,7 +1257,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b895066e074a45851279c34e730195d95837efc6',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e7a75776335a1735f41268a150193c67fc964bcd',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1425,7 +1425,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'abaae129d9a0c6e1e092067e0b105475df43352e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3d1647412c08f589b03aed641a3cca5f0b05555d',
+    Var('webrtc_git') + '/src.git' + '@' + '809198edfff416fce8d75b574a43afab5e67b1cd',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1487,7 +1487,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6e25bd5bbc4fafca4698b293e2c1e74e172cdea3',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ea5731baa00cf8b8e3041795ccaa13f419b41699',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_settings.cc b/android_webview/browser/aw_settings.cc
index 5c668e43..09c8b05 100644
--- a/android_webview/browser/aw_settings.cc
+++ b/android_webview/browser/aw_settings.cc
@@ -43,6 +43,7 @@
   web_prefs->viewport_meta_enabled = true;
   web_prefs->picture_in_picture_enabled = false;
   web_prefs->disable_features_depending_on_viz = true;
+  web_prefs->disable_accelerated_small_canvases = true;
 }
 
 const void* const kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
diff --git a/android_webview/common/crash_reporter/crash_keys.cc b/android_webview/common/crash_reporter/crash_keys.cc
index 2b61406c..3fbc1414 100644
--- a/android_webview/common/crash_reporter/crash_keys.cc
+++ b/android_webview/common/crash_reporter/crash_keys.cc
@@ -36,6 +36,7 @@
     "gpu-gl-vendor__1",
     "gpu-gl-vendor__2",
     "gpu-gl-renderer",
+    "oop_read_failure",
 
     // content/:
     "bad_message_reason",
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForM.java b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForM.java
index d322fcf..74172aad 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForM.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForM.java
@@ -12,7 +12,7 @@
 
 import org.chromium.android_webview.AwContentsClient;
 import org.chromium.android_webview.AwWebResourceResponse;
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnM;
 
 /**
  * Utility class to use new APIs that were added in M (API level 23). These need to exist in a
@@ -21,7 +21,7 @@
  * in base/, for reasons such as using system APIs or instantiating an adapter class that is
  * specific to glue layer.
  */
-@DoNotInline
+@VerifiesOnM
 @TargetApi(Build.VERSION_CODES.M)
 public final class GlueApiHelperForM {
     private GlueApiHelperForM() {}
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForN.java b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForN.java
index a9efd2c9..db5464d3 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForN.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForN.java
@@ -14,7 +14,7 @@
 import android.webkit.WebView;
 import android.webkit.WebViewDelegate;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnN;
 
 /**
  * Utility class to use new APIs that were added in N (API level 24). These need to exist in a
@@ -23,7 +23,7 @@
  * in base/, for reasons such as using system APIs or instantiating an adapter class that is
  * specific to glue layer.
  */
-@DoNotInline
+@VerifiesOnN
 @TargetApi(Build.VERSION_CODES.N)
 public final class GlueApiHelperForN {
     private GlueApiHelperForN() {}
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForO.java b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForO.java
index 37e658f..7658c1d8 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForO.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForO.java
@@ -12,7 +12,7 @@
 import android.webkit.WebViewDelegate;
 
 import org.chromium.android_webview.AwRenderProcessGoneDetail;
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnO;
 
 /**
  * Utility class to use new APIs that were added in O (API level 26). These need to exist in a
@@ -21,7 +21,7 @@
  * in base/, for reasons such as using system APIs or instantiating an adapter class that is
  * specific to glue layer.
  */
-@DoNotInline
+@VerifiesOnO
 @TargetApi(Build.VERSION_CODES.O)
 public final class GlueApiHelperForO {
     private GlueApiHelperForO() {}
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java
index a1f61df..c06add3a 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java
@@ -12,7 +12,7 @@
 import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest;
 import org.chromium.android_webview.AwSafeBrowsingResponse;
 import org.chromium.base.Callback;
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnOMR1;
 
 /**
  * Utility class to use new APIs that were added in OMR1 (API level 27). These need to exist in a
@@ -21,7 +21,7 @@
  * in base/, for reasons such as using system APIs or instantiating an adapter class that is
  * specific to glue layer.
  */
-@DoNotInline
+@VerifiesOnOMR1
 @TargetApi(Build.VERSION_CODES.O_MR1)
 public final class GlueApiHelperForOMR1 {
     private GlueApiHelperForOMR1() {}
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForP.java b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForP.java
index 04ff2ea..fffe1a0 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForP.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/GlueApiHelperForP.java
@@ -9,7 +9,7 @@
 import android.webkit.TracingController;
 import android.webkit.WebViewDelegate;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnP;
 
 /**
  * Utility class to use new APIs that were added in P (API level 28). These need to exist in a
@@ -18,7 +18,7 @@
  * in base/, for reasons such as using system APIs or instantiating an adapter class that is
  * specific to glue layer.
  */
-@DoNotInline
+@VerifiesOnP
 @TargetApi(Build.VERSION_CODES.P)
 public final class GlueApiHelperForP {
     private GlueApiHelperForP() {}
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
index cb2adb7..295ac0a 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -47,7 +47,8 @@
 import org.chromium.base.PathUtils;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.ThreadUtils;
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnN;
+import org.chromium.base.annotations.VerifiesOnP;
 import org.chromium.base.library_loader.NativeLibraries;
 import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
 import org.chromium.base.metrics.ScopedSysTraceEvent;
@@ -78,7 +79,7 @@
      * verification does not occur until it is actually used for N and above.
      */
     @TargetApi(Build.VERSION_CODES.N)
-    @DoNotInline
+    @VerifiesOnN
     private static class ObjectHolderForN {
         public ServiceWorkerController mServiceWorkerController;
     }
@@ -88,12 +89,12 @@
      * verification does not occur until it is actually used for P and above.
      */
     @TargetApi(Build.VERSION_CODES.P)
-    @DoNotInline
+    @VerifiesOnP
     private static class ObjectHolderForP {
         public TracingController mTracingController;
     }
 
-    private final static Object sSingletonLock = new Object();
+    private static final Object sSingletonLock = new Object();
     private static WebViewChromiumFactoryProvider sSingleton;
 
     private final WebViewChromiumRunQueue mRunQueue = new WebViewChromiumRunQueue(
diff --git a/android_webview/tools/remove_preinstalled_webview.py b/android_webview/tools/remove_preinstalled_webview.py
index 5eaff7f..b2f97b9 100755
--- a/android_webview/tools/remove_preinstalled_webview.py
+++ b/android_webview/tools/remove_preinstalled_webview.py
@@ -74,11 +74,10 @@
 def CheckWebViewIsUninstalled(device):
   """Throws if WebView is still installed."""
   for webview_package in WEBVIEW_PACKAGES:
-    paths = device.GetApplicationPaths(webview_package)
-    if paths:
+    if device.IsApplicationInstalled(webview_package):
       raise device_errors.CommandFailedError(
-          '{} is still installed on the device at {}'.format(
-              webview_package, paths), device)
+          '{} is still installed on the device'.format(webview_package),
+          device)
 
 
 def RemovePreinstalledWebViews(device):
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 52a018d9..ae7cc45 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -963,6 +963,13 @@
   if (bounds_animator_->IsAnimating())
     bounds_animator_->Cancel();
 
+  if (GetContentsBounds().IsEmpty())
+    return;
+
+  // Update cached tile padding first, as grid size calculations depend on the
+  // cached padding value.
+  UpdateTilePadding();
+
   // Prepare |page_size| * number-of-pages for |items_container_|, and sets the
   // origin properly to show the correct page.
   const gfx::Size page_size = GetTileGridSize();
@@ -983,13 +990,9 @@
                                               page_height * pages));
   }
 
-  if (GetContentsBounds().IsEmpty())
-    return;
-
   if (fadeout_layer_delegate_)
     fadeout_layer_delegate_->layer()->SetBounds(layer()->bounds());
 
-  UpdateTilePadding();
   CalculateIdealBoundsForFolder();
   for (int i = 0; i < view_model_.view_size(); ++i) {
     AppListItemView* view = GetItemViewAt(i);
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 522f398..f2c3351 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -1233,8 +1233,10 @@
       last_visible_index_++;
     } else {
       strategy.overflow = true;
-      // Make space for the overflow button by showing one fewer app icon.
-      last_visible_index_--;
+      // Make space for the overflow button by showing one fewer app icon. If
+      // we already don't have enough space, don't decrement the last visible
+      // index further than -1.
+      last_visible_index_ = std::max(-1, last_visible_index_ - 1);
       break;
     }
   }
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h
index d4820df0..2b0196f5 100644
--- a/ash/shelf/shelf_view.h
+++ b/ash/shelf/shelf_view.h
@@ -575,7 +575,8 @@
   int first_visible_index_ = -1;
 
   // Last index of an app launcher button that is visible (does not go into
-  // overflow), or -1 if there are no apps.
+  // overflow), or -1 if there are no apps (or if only the overflow button is
+  // visible).
   int last_visible_index_ = -1;
 
   std::unique_ptr<views::BoundsAnimator> bounds_animator_;
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index 781a5145..d28e37f1 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -2049,6 +2049,27 @@
   test_api_->HideOverflowBubble();
 }
 
+// Checks how the overflow button and menu get laid out when the display is
+// very narrow.
+TEST_F(ShelfViewTest, TestOverflowWithNarrowDisplay) {
+  // No overflow bubble when scrollable shelf enabled.
+  // TODO(https://crbug.com/1002576): revisit when scrollable shelf is launched.
+  if (chromeos::switches::ShouldShowScrollableShelf())
+    return;
+
+  UpdateDisplay("200x600");
+
+  AddAppShortcutsUntilOverflow();
+  OverflowButton* overflow_button = shelf_view_->GetOverflowButton();
+  EXPECT_TRUE(overflow_button->GetVisible());
+
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->set_current_screen_location(
+      overflow_button->GetBoundsInScreen().CenterPoint());
+  generator->ClickLeftButton();
+  ASSERT_TRUE(shelf_view_->IsShowingOverflowBubble());
+}
+
 // Checks creating app shortcut for an opened platform app in overflow bubble
 // should be invisible to the shelf. See crbug.com/605793.
 TEST_F(ShelfViewTest, CheckOverflowStatusPinOpenedAppToShelf) {
diff --git a/ash/shell/content/test/ash_content_perf_test_launcher.cc b/ash/shell/content/test/ash_content_perf_test_launcher.cc
index 947b77ff..fb68206 100644
--- a/ash/shell/content/test/ash_content_perf_test_launcher.cc
+++ b/ash/shell/content/test/ash_content_perf_test_launcher.cc
@@ -34,9 +34,10 @@
  protected:
   // content::ContentTestSuiteBase:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals. (Must run
-    // before the base class is initialized.)
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
     ContentTestSuiteBase::Initialize();
     ui_controls::InstallUIControlsAura(ash::test::CreateAshUIControls());
   }
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 839a0c4..3544b79b 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -3262,6 +3262,15 @@
       "android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
       "android/java/src/org/chromium/base/annotations/RemovableInRelease.java",
       "android/java/src/org/chromium/base/annotations/UsedByReflection.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnLollipop.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnLollipopMR1.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnM.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnN.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnNMR1.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnO.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnOMR1.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnP.java",
+      "android/java/src/org/chromium/base/annotations/VerifiesOnQ.java",
       "android/java/src/org/chromium/base/compat/ApiHelperForM.java",
       "android/java/src/org/chromium/base/compat/ApiHelperForN.java",
       "android/java/src/org/chromium/base/compat/ApiHelperForO.java",
diff --git a/base/android/java/src/org/chromium/base/annotations/DoNotInline.java b/base/android/java/src/org/chromium/base/annotations/DoNotInline.java
index 9252f3a..8960f52 100644
--- a/base/android/java/src/org/chromium/base/annotations/DoNotInline.java
+++ b/base/android/java/src/org/chromium/base/annotations/DoNotInline.java
@@ -13,7 +13,8 @@
  * The annotated method or class should never be inlined.
  *
  * The annotated method (or methods on the annotated class) are guaranteed not to be inlined by
- * Proguard. Other optimizations may still apply.
+ * Proguard. Other optimizations may still apply. Do not use this annotation to fix class
+ * verification errors - use the @VerifiesOnX annotations instead.
  */
 @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
 @Retention(RetentionPolicy.CLASS)
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipop.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipop.java
new file mode 100644
index 0000000..196820c
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipop.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on L, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below L. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnLollipop {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipopMR1.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipopMR1.java
new file mode 100644
index 0000000..9165552
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnLollipopMR1.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on L_MR1, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below L_MR1. This prevents class verification errors (which results in a very
+ * slow retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnLollipopMR1 {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnM.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnM.java
new file mode 100644
index 0000000..44693497
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnM.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on M, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below M. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnM {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnN.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnN.java
new file mode 100644
index 0000000..783854a
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnN.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on N, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below N. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnN {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnNMR1.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnNMR1.java
new file mode 100644
index 0000000..c970429
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnNMR1.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on N_MR1, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below N_MR1. This prevents class verification errors (which results in a very
+ * slow retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnNMR1 {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnO.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnO.java
new file mode 100644
index 0000000..7eb83b90
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnO.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on O, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below O. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnO {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnOMR1.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnOMR1.java
new file mode 100644
index 0000000..2b6b5c69
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnOMR1.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on O_MR1, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below O_MR1. This prevents class verification errors (which results in a very
+ * slow retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnOMR1 {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnP.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnP.java
new file mode 100644
index 0000000..c5883604
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnP.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on P, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below P. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnP {}
diff --git a/base/android/java/src/org/chromium/base/annotations/VerifiesOnQ.java b/base/android/java/src/org/chromium/base/annotations/VerifiesOnQ.java
new file mode 100644
index 0000000..bc3f740
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/annotations/VerifiesOnQ.java
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated method or class verifies on Q, but not below.
+ *
+ * The annotated method (or methods on the annotated class) are guaranteed to not be inlined by R8
+ * on builds targeted below Q. This prevents class verification errors (which results in a very slow
+ * retry-verification-at-runtime) from spreading into other classes on these lower versions.
+ */
+@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.CLASS)
+public @interface VerifiesOnQ {}
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForM.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForM.java
index a8c1dfb..f44ad540 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForM.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForM.java
@@ -17,14 +17,14 @@
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnM;
 
 /**
  * Utility class to use new APIs that were added in M (API level 23). These need to exist in a
  * separate class so that Android framework can successfully verify classes without
  * encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnM
 @TargetApi(Build.VERSION_CODES.M)
 public final class ApiHelperForM {
     private ApiHelperForM() {}
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java
index 3b3b61c..17104ea 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java
@@ -15,6 +15,7 @@
 import android.media.MediaCodec.CryptoInfo;
 import android.os.Build;
 import android.security.NetworkSecurityPolicy;
+import android.view.MotionEvent;
 import android.view.PointerIcon;
 import android.view.View;
 import android.view.View.DragShadowBuilder;
@@ -22,14 +23,14 @@
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnN;
 
 /**
  * Utility class to use new APIs that were added in N (API level 24). These need to exist in a
  * separate class so that Android framework can successfully verify classes without
  * encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnN
 @TargetApi(Build.VERSION_CODES.N)
 public final class ApiHelperForN {
     private ApiHelperForN() {}
@@ -79,4 +80,9 @@
     public static boolean isCleartextTrafficPermitted(String host) {
         return NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(host);
     }
+
+    /** See {@link View#onResolvePointerIcon(MotionEvent, int)}. */
+    public static PointerIcon onResolvePointerIcon(View view, MotionEvent event, int pointerIndex) {
+        return view.onResolvePointerIcon(event, pointerIndex);
+    }
 }
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForO.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForO.java
index c704827..f97dded 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForO.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForO.java
@@ -11,14 +11,14 @@
 import android.view.Display;
 import android.view.View;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnO;
 
 /**
  * Utility class to use new APIs that were added in O (API level 26). These need to exist in a
  * separate class so that Android framework can successfully verify classes without
  * encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnO
 @TargetApi(Build.VERSION_CODES.O)
 public final class ApiHelperForO {
     private ApiHelperForO() {}
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java
index 8724793c..38db288 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java
@@ -8,14 +8,14 @@
 import android.os.Build;
 import android.view.Window;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnOMR1;
 
 /**
  * Utility class to use new APIs that were added in O_MR1 (API level 27). These need to exist in a
  * separate class so that Android framework can successfully verify classes without
  * encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnOMR1
 @TargetApi(Build.VERSION_CODES.O_MR1)
 public final class ApiHelperForOMR1 {
     private ApiHelperForOMR1() {}
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForP.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForP.java
index b7973211..c4b41cf 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForP.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForP.java
@@ -10,14 +10,14 @@
 import android.net.LinkProperties;
 import android.os.Build;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnP;
 
 /**
  * Utility class to use new APIs that were added in P (API level 28). These need to exist in a
  * separate class so that Android framework can successfully verify classes without
  * encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnP
 @TargetApi(Build.VERSION_CODES.P)
 public final class ApiHelperForP {
     private ApiHelperForP() {}
diff --git a/base/containers/checked_iterators.h b/base/containers/checked_iterators.h
index b7eb7b4..0fd63e3 100644
--- a/base/containers/checked_iterators.h
+++ b/base/containers/checked_iterators.h
@@ -62,6 +62,16 @@
     return current_ <= other.current_;
   }
 
+  bool operator>(const CheckedRandomAccessIterator& other) const {
+    CheckComparable(other);
+    return current_ > other.current_;
+  }
+
+  bool operator>=(const CheckedRandomAccessIterator& other) const {
+    CheckComparable(other);
+    return current_ >= other.current_;
+  }
+
   CheckedRandomAccessIterator& operator++() {
     CHECK(current_ != end_);
     ++current_;
@@ -135,6 +145,12 @@
     return current_;
   }
 
+  reference operator[](difference_type rhs) const {
+    CHECK_GE(rhs, 0);
+    CHECK_LT(rhs, end_ - current_);
+    return current_[rhs];
+  }
+
   static bool IsRangeMoveSafe(const CheckedRandomAccessIterator& from_begin,
                               const CheckedRandomAccessIterator& from_end,
                               const CheckedRandomAccessIterator& to)
@@ -217,6 +233,16 @@
     return current_ <= other.current_;
   }
 
+  bool operator>(const CheckedRandomAccessConstIterator& other) const {
+    CheckComparable(other);
+    return current_ > other.current_;
+  }
+
+  bool operator>=(const CheckedRandomAccessConstIterator& other) const {
+    CheckComparable(other);
+    return current_ >= other.current_;
+  }
+
   CheckedRandomAccessConstIterator& operator++() {
     CHECK(current_ != end_);
     ++current_;
@@ -291,6 +317,12 @@
     return current_;
   }
 
+  reference operator[](difference_type rhs) const {
+    CHECK_GE(rhs, 0);
+    CHECK_LT(rhs, end_ - current_);
+    return current_[rhs];
+  }
+
   static bool IsRangeMoveSafe(
       const CheckedRandomAccessConstIterator& from_begin,
       const CheckedRandomAccessConstIterator& from_end,
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
index 5ec3f3f..e2d437a 100644
--- a/base/containers/span_unittest.cc
+++ b/base/containers/span_unittest.cc
@@ -474,6 +474,17 @@
   }
 }
 
+TEST(SpanTest, SubscriptedBeginIterator) {
+  int array[] = {1, 2, 3};
+  span<const int> const_span(array);
+  for (size_t i = 0; i < const_span.size(); ++i)
+    EXPECT_EQ(array[i], const_span.begin()[i]);
+
+  span<int> mutable_span(array);
+  for (size_t i = 0; i < mutable_span.size(); ++i)
+    EXPECT_EQ(array[i], mutable_span.begin()[i]);
+}
+
 TEST(SpanTest, TemplatedFirstOnDynamicSpan) {
   int array[] = {1, 2, 3};
   span<const int> span(array);
@@ -1212,12 +1223,16 @@
 TEST(SpanTest, OutOfBoundsDeath) {
   constexpr span<int, 0> kEmptySpan;
   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan[0], "");
+  ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.begin()[0], "");
+  ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.end()[0], "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.first(1), "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.last(1), "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptySpan.subspan(1), "");
 
   constexpr span<int> kEmptyDynamicSpan;
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan[0], "");
+  ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.begin()[0], "");
+  ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.end()[0], "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.front(), "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.first(1), "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.last(1), "");
@@ -1228,6 +1243,8 @@
   constexpr span<const int> kNonEmptyDynamicSpan(kArray);
   EXPECT_EQ(3U, kNonEmptyDynamicSpan.size());
   ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan[4], "");
+  ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.begin()[-1], "");
+  ASSERT_DEATH_IF_SUPPORTED(kNonEmptyDynamicSpan.begin()[3], "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.subspan(10), "");
   ASSERT_DEATH_IF_SUPPORTED(kEmptyDynamicSpan.subspan(1, 7), "");
 }
@@ -1285,4 +1302,20 @@
       CheckedRandomAccessConstIterator<const int>(span.data(), span.data())));
 }
 
+TEST(SpanTest, Sort) {
+  int array[] = {5, 4, 3, 2, 1};
+
+  span<int> dynamic_span = array;
+  std::sort(dynamic_span.begin(), dynamic_span.end());
+  EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
+  std::sort(dynamic_span.rbegin(), dynamic_span.rend());
+  EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
+
+  span<int, 5> static_span = array;
+  std::sort(static_span.rbegin(), static_span.rend(), std::greater<>());
+  EXPECT_THAT(array, ElementsAre(1, 2, 3, 4, 5));
+  std::sort(static_span.begin(), static_span.end(), std::greater<>());
+  EXPECT_THAT(array, ElementsAre(5, 4, 3, 2, 1));
+}
+
 }  // namespace base
diff --git a/base/task/sequence_manager/sequence_manager.h b/base/task/sequence_manager/sequence_manager.h
index cd2163d..003fab0 100644
--- a/base/task/sequence_manager/sequence_manager.h
+++ b/base/task/sequence_manager/sequence_manager.h
@@ -102,6 +102,11 @@
       kNone,
       kEnabled,
       kEnabledWithBacktrace,
+
+      // Logs high priority tasks and the lower priority tasks they skipped
+      // past.  Useful for debugging test failures caused by scheduler policy
+      // changes.
+      kReorderedOnly,
     };
     TaskLogging task_execution_logging = TaskLogging::kNone;
 
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 26977d6687..88aabe0 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -503,52 +503,60 @@
                      "task_type", executing_task.task_type);
   TRACE_EVENT_BEGIN0("sequence_manager", executing_task.task_queue_name);
 
-#if DCHECK_IS_ON() && !defined(OS_NACL)
-  LogTaskDebugInfo(executing_task);
-#endif
-
   return task;
 }
 
 #if DCHECK_IS_ON() && !defined(OS_NACL)
 void SequenceManagerImpl::LogTaskDebugInfo(
-    const ExecutingTask& executing_task) {
+    const WorkQueue* selected_work_queue) const {
+  const Task* task = selected_work_queue->GetFrontTask();
   switch (settings_.task_execution_logging) {
     case Settings::TaskLogging::kNone:
       break;
 
     case Settings::TaskLogging::kEnabled:
-      LOG(INFO) << "#"
-                << static_cast<uint64_t>(
-                       executing_task.pending_task.enqueue_order())
-                << " " << executing_task.task_queue_name
-                << (executing_task.pending_task.cross_thread_
-                        ? " Run crossthread "
-                        : " Run ")
-                << executing_task.pending_task.posted_from.ToString();
+      LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " "
+                << selected_work_queue->task_queue()->GetName()
+                << (task->cross_thread_ ? " Run crossthread " : " Run ")
+                << task->posted_from.ToString();
       break;
 
     case Settings::TaskLogging::kEnabledWithBacktrace: {
       std::array<const void*, PendingTask::kTaskBacktraceLength + 1> task_trace;
-      task_trace[0] = executing_task.pending_task.posted_from.program_counter();
-      std::copy(executing_task.pending_task.task_backtrace.begin(),
-                executing_task.pending_task.task_backtrace.end(),
+      task_trace[0] = task->posted_from.program_counter();
+      std::copy(task->task_backtrace.begin(), task->task_backtrace.end(),
                 task_trace.begin() + 1);
       size_t length = 0;
       while (length < task_trace.size() && task_trace[length])
         ++length;
       if (length == 0)
         break;
-      LOG(INFO) << "#"
-                << static_cast<uint64_t>(
-                       executing_task.pending_task.enqueue_order())
-                << " " << executing_task.task_queue_name
-                << (executing_task.pending_task.cross_thread_
-                        ? " Run crossthread "
-                        : " Run ")
+      LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " "
+                << selected_work_queue->task_queue()->GetName()
+                << (task->cross_thread_ ? " Run crossthread " : " Run ")
                 << debug::StackTrace(task_trace.data(), length);
       break;
     }
+
+    case Settings::TaskLogging::kReorderedOnly: {
+      std::vector<const Task*> skipped_tasks;
+      main_thread_only().selector.CollectSkippedOverLowerPriorityTasks(
+          selected_work_queue, &skipped_tasks);
+
+      if (skipped_tasks.empty())
+        break;
+
+      LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " "
+                << selected_work_queue->task_queue()->GetName()
+                << (task->cross_thread_ ? " Run crossthread " : " Run ")
+                << task->posted_from.ToString();
+
+      for (const Task* skipped_task : skipped_tasks) {
+        LOG(INFO) << "# (skipped over) "
+                  << static_cast<uint64_t>(skipped_task->enqueue_order()) << " "
+                  << skipped_task->posted_from.ToString();
+      }
+    }
   }
 }
 #endif  // DCHECK_IS_ON() && !defined(OS_NACL)
@@ -607,6 +615,10 @@
       return nullopt;
     }
 
+#if DCHECK_IS_ON() && !defined(OS_NACL)
+    LogTaskDebugInfo(work_queue);
+#endif  // DCHECK_IS_ON() && !defined(OS_NACL)
+
     main_thread_only().task_execution_stack.emplace_back(
         work_queue->TakeTaskFromWorkQueue(), work_queue->task_queue(),
         InitializeTaskTiming(work_queue->task_queue()));
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h
index a8c1659..bb699170 100644
--- a/base/task/sequence_manager/sequence_manager_impl.h
+++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -388,7 +388,7 @@
   TimeDelta GetDelayTillNextDelayedTask(LazyNow* lazy_now) const;
 
 #if DCHECK_IS_ON()
-  void LogTaskDebugInfo(const ExecutingTask& executing_task);
+  void LogTaskDebugInfo(const internal::WorkQueue* work_queue) const;
 #endif
 
   // Determines if wall time or thread time should be recorded for the next
diff --git a/base/task/sequence_manager/task_queue_selector.cc b/base/task/sequence_manager/task_queue_selector.cc
index 5e3a14a..cb58d9b4 100644
--- a/base/task/sequence_manager/task_queue_selector.cc
+++ b/base/task/sequence_manager/task_queue_selector.cc
@@ -159,6 +159,15 @@
   }
 }
 
+void TaskQueueSelector::CollectSkippedOverLowerPriorityTasks(
+    const internal::WorkQueue* selected_work_queue,
+    std::vector<const Task*>* result) const {
+  delayed_work_queue_sets_.CollectSkippedOverLowerPriorityTasks(
+      selected_work_queue, result);
+  immediate_work_queue_sets_.CollectSkippedOverLowerPriorityTasks(
+      selected_work_queue, result);
+}
+
 #if DCHECK_IS_ON() || !defined(NDEBUG)
 bool TaskQueueSelector::CheckContainsQueueForTest(
     const internal::TaskQueueImpl* queue) const {
diff --git a/base/task/sequence_manager/task_queue_selector.h b/base/task/sequence_manager/task_queue_selector.h
index 2ae9b52..8a79a5e5 100644
--- a/base/task/sequence_manager/task_queue_selector.h
+++ b/base/task/sequence_manager/task_queue_selector.h
@@ -76,6 +76,12 @@
   void WorkQueueSetBecameEmpty(size_t set_index) override;
   void WorkQueueSetBecameNonEmpty(size_t set_index) override;
 
+  // Populates |result| with tasks with lower priority than the first task from
+  // |selected_work_queue| which could otherwise run now.
+  void CollectSkippedOverLowerPriorityTasks(
+      const internal::WorkQueue* selected_work_queue,
+      std::vector<const Task*>* result) const;
+
  protected:
   WorkQueueSets* delayed_work_queue_sets() { return &delayed_work_queue_sets_; }
 
diff --git a/base/task/sequence_manager/task_queue_selector_unittest.cc b/base/task/sequence_manager/task_queue_selector_unittest.cc
index c993664..c99520b 100644
--- a/base/task/sequence_manager/task_queue_selector_unittest.cc
+++ b/base/task/sequence_manager/task_queue_selector_unittest.cc
@@ -762,6 +762,21 @@
   task_queue2->UnregisterTaskQueue();
 }
 
+TEST_F(TaskQueueSelectorTest, CollectSkippedOverLowerPriorityTasks) {
+  size_t queue_order[] = {0, 1, 2, 3, 2, 1, 0};
+  PushTasks(queue_order, 7);
+  selector_.SetQueuePriority(task_queues_[3].get(), TaskQueue::kHighPriority);
+
+  std::vector<const Task*> result;
+  selector_.CollectSkippedOverLowerPriorityTasks(
+      task_queues_[3]->immediate_work_queue(), &result);
+
+  ASSERT_EQ(3u, result.size());
+  EXPECT_EQ(2u, result[0]->enqueue_order());  // The order here isn't important.
+  EXPECT_EQ(3u, result[1]->enqueue_order());
+  EXPECT_EQ(4u, result[2]->enqueue_order());
+}
+
 class DisabledAntiStarvationLogicTaskQueueSelectorTest
     : public TaskQueueSelectorTestBase,
       public testing::WithParamInterface<TaskQueue::QueuePriority> {
diff --git a/base/task/sequence_manager/work_queue.cc b/base/task/sequence_manager/work_queue.cc
index 0d9df4a..2dfd04da 100644
--- a/base/task/sequence_manager/work_queue.cc
+++ b/base/task/sequence_manager/work_queue.cc
@@ -305,6 +305,16 @@
   tasks_.pop_front();
 }
 
+void WorkQueue::CollectTasksOlderThan(EnqueueOrder reference,
+                                      std::vector<const Task*>* result) const {
+  for (const Task& task : tasks_) {
+    if (task.enqueue_order() >= reference)
+      break;
+
+    result->push_back(&task);
+  }
+}
+
 }  // namespace internal
 }  // namespace sequence_manager
 }  // namespace base
diff --git a/base/task/sequence_manager/work_queue.h b/base/task/sequence_manager/work_queue.h
index 849d48cac..65fdee4c 100644
--- a/base/task/sequence_manager/work_queue.h
+++ b/base/task/sequence_manager/work_queue.h
@@ -161,6 +161,11 @@
   // Test support function. This should not be used in production code.
   void PopTaskForTesting();
 
+  // Iterates through |tasks_| adding any that are older than |reference| to
+  // |result|.
+  void CollectTasksOlderThan(EnqueueOrder reference,
+                             std::vector<const Task*>* result) const;
+
  private:
   bool InsertFenceImpl(EnqueueOrder fence);
 
diff --git a/base/task/sequence_manager/work_queue_sets.cc b/base/task/sequence_manager/work_queue_sets.cc
index c2f9886..68ec9613 100644
--- a/base/task/sequence_manager/work_queue_sets.cc
+++ b/base/task/sequence_manager/work_queue_sets.cc
@@ -237,6 +237,19 @@
 }
 #endif
 
+void WorkQueueSets::CollectSkippedOverLowerPriorityTasks(
+    const internal::WorkQueue* selected_work_queue,
+    std::vector<const Task*>* result) const {
+  EnqueueOrder selected_enqueue_order;
+  CHECK(selected_work_queue->GetFrontTaskEnqueueOrder(&selected_enqueue_order));
+  for (size_t priority = selected_work_queue->work_queue_set_index() + 1;
+       priority < TaskQueue::kQueuePriorityCount; priority++) {
+    for (const OldestTaskEnqueueOrder& pair : work_queue_heaps_[priority]) {
+      pair.value->CollectTasksOlderThan(selected_enqueue_order, result);
+    }
+  }
+}
+
 }  // namespace internal
 }  // namespace sequence_manager
 }  // namespace base
diff --git a/base/task/sequence_manager/work_queue_sets.h b/base/task/sequence_manager/work_queue_sets.h
index 90cc6d7..f128c62c 100644
--- a/base/task/sequence_manager/work_queue_sets.h
+++ b/base/task/sequence_manager/work_queue_sets.h
@@ -95,6 +95,12 @@
 
   const char* GetName() const { return name_; }
 
+  // Collects ready tasks which where skipped over when |selected_work_queue|
+  // was selected. Note this is somewhat expensive.
+  void CollectSkippedOverLowerPriorityTasks(
+      const internal::WorkQueue* selected_work_queue,
+      std::vector<const Task*>* result) const;
+
  private:
   struct OldestTaskEnqueueOrder {
     EnqueueOrder key;
diff --git a/base/task/sequence_manager/work_queue_sets_unittest.cc b/base/task/sequence_manager/work_queue_sets_unittest.cc
index 30f3bb8f..fa014c6 100644
--- a/base/task/sequence_manager/work_queue_sets_unittest.cc
+++ b/base/task/sequence_manager/work_queue_sets_unittest.cc
@@ -331,6 +331,32 @@
   EXPECT_EQ(queue1, work_queue_sets_->GetOldestQueueInSet(set));
 }
 
+TEST_F(WorkQueueSetsTest, CollectSkippedOverLowerPriorityTasks) {
+  WorkQueue* queue1 = NewTaskQueue("queue1");
+  WorkQueue* queue2 = NewTaskQueue("queue2");
+  WorkQueue* queue3 = NewTaskQueue("queue3");
+
+  work_queue_sets_->ChangeSetIndex(queue1, 3);
+  work_queue_sets_->ChangeSetIndex(queue2, 2);
+  work_queue_sets_->ChangeSetIndex(queue3, 1);
+
+  queue1->Push(FakeTaskWithEnqueueOrder(1));
+  queue1->Push(FakeTaskWithEnqueueOrder(2));
+  queue2->Push(FakeTaskWithEnqueueOrder(3));
+  queue3->Push(FakeTaskWithEnqueueOrder(4));
+  queue3->Push(FakeTaskWithEnqueueOrder(5));
+  queue2->Push(FakeTaskWithEnqueueOrder(6));
+  queue1->Push(FakeTaskWithEnqueueOrder(7));
+
+  std::vector<const Task*> result;
+  work_queue_sets_->CollectSkippedOverLowerPriorityTasks(queue3, &result);
+
+  ASSERT_EQ(3u, result.size());
+  EXPECT_EQ(3u, result[0]->enqueue_order());  // The order here isn't important.
+  EXPECT_EQ(1u, result[1]->enqueue_order());
+  EXPECT_EQ(2u, result[2]->enqueue_order());
+}
+
 }  // namespace internal
 }  // namespace sequence_manager
 }  // namespace base
diff --git a/base/task/sequence_manager/work_queue_unittest.cc b/base/task/sequence_manager/work_queue_unittest.cc
index 721f60f..e695b99 100644
--- a/base/task/sequence_manager/work_queue_unittest.cc
+++ b/base/task/sequence_manager/work_queue_unittest.cc
@@ -555,6 +555,20 @@
   EXPECT_FALSE(work_queue_->GetFrontTaskEnqueueOrder(&enqueue_order));
 }
 
+TEST_F(WorkQueueTest, CollectTasksOlderThan) {
+  work_queue_->Push(FakeTaskWithEnqueueOrder(2));
+  work_queue_->Push(FakeTaskWithEnqueueOrder(3));
+  work_queue_->Push(FakeTaskWithEnqueueOrder(4));
+
+  std::vector<const Task*> result;
+  work_queue_->CollectTasksOlderThan(EnqueueOrder::FromIntForTesting(4),
+                                     &result);
+
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ(2u, result[0]->enqueue_order());
+  EXPECT_EQ(3u, result[1]->enqueue_order());
+}
+
 }  // namespace internal
 }  // namespace sequence_manager
 }  // namespace base
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
index 3b1de80..fb9a444 100644
--- a/base/test/test_suite.cc
+++ b/base/test/test_suite.cc
@@ -37,6 +37,7 @@
 #include "base/test/multiprocess_test.h"
 #include "base/test/test_switches.h"
 #include "base/test/test_timeouts.h"
+#include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -188,6 +189,31 @@
 };
 #endif  // !defined(OS_IOS)
 
+class CheckThreadPriority : public testing::EmptyTestEventListener {
+ public:
+  CheckThreadPriority(bool check_thread_priority_at_test_end)
+      : check_thread_priority_at_test_end_(check_thread_priority_at_test_end) {
+    CHECK_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+             base::ThreadPriority::NORMAL);
+  }
+
+  void OnTestStart(const testing::TestInfo& test) override {
+    EXPECT_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+              base::ThreadPriority::NORMAL);
+  }
+  void OnTestEnd(const testing::TestInfo& test) override {
+    if (check_thread_priority_at_test_end_) {
+      EXPECT_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+                base::ThreadPriority::NORMAL);
+    }
+  }
+
+ private:
+  const bool check_thread_priority_at_test_end_;
+
+  DISALLOW_COPY_AND_ASSIGN(CheckThreadPriority);
+};
+
 const std::string& GetProfileName() {
   static const NoDestructor<std::string> profile_name([]() {
     const CommandLine& command_line = *CommandLine::ForCurrentProcess();
@@ -381,6 +407,11 @@
   check_for_process_priority_ = false;
 }
 
+void TestSuite::DisableCheckForThreadPriorityAtTestEnd() {
+  DCHECK(!is_initialized_);
+  check_for_thread_priority_at_test_end_ = false;
+}
+
 void TestSuite::UnitTestAssertHandler(const char* file,
                                       int line,
                                       const StringPiece summary,
@@ -571,6 +602,8 @@
   if (check_for_process_priority_)
     listeners.Append(new CheckProcessPriority);
 #endif
+  listeners.Append(
+      new CheckThreadPriority(check_for_thread_priority_at_test_end_));
 
   AddTestLauncherResultPrinter();
 
diff --git a/base/test/test_suite.h b/base/test/test_suite.h
index 6e1e750..0565c5e 100644
--- a/base/test/test_suite.h
+++ b/base/test/test_suite.h
@@ -46,6 +46,10 @@
   // Disables checks for process priority. Most tests should not use this.
   void DisableCheckForProcessPriority();
 
+  // Disables checks for thread priority at test end. This may be used for tests
+  // that each run in their own process.
+  void DisableCheckForThreadPriorityAtTestEnd();
+
   // Disables checks for certain global objects being leaked across tests.
   void DisableCheckForLeakedGlobals();
 
@@ -94,6 +98,7 @@
 
   bool check_for_leaked_globals_ = true;
   bool check_for_process_priority_ = true;
+  bool check_for_thread_priority_at_test_end_ = true;
 
   bool is_initialized_ = false;
 
diff --git a/build/android/docs/class_verification_failures.md b/build/android/docs/class_verification_failures.md
index bf9a8a29..36ee97e 100644
--- a/build/android/docs/class_verification_failures.md
+++ b/build/android/docs/class_verification_failures.md
@@ -127,7 +127,7 @@
  * These need to exist in a separate class so that Android framework can successfully verify
  * classes without encountering the new APIs.
  */
-@DoNotInline
+@VerifiesOnOMR1
 @TargetApi(Build.VERSION_CODES.O_MR1)
 public class ApiHelperForOMR1 {
     private ApiHelperForOMR1() {}
@@ -136,8 +136,8 @@
 }
 ```
 
-* `@DoNotInline`: this is a chromium-defined annotation to tell proguard (and
-  similar tools) not to inline this class or its methods (since that would
+* `@VerifiesOnO_MR1`: this is a chromium-defined annotation to tell proguard
+  (and similar tools) not to inline this class or its methods (since that would
   defeat the point of out-of-lining!)
 * `@TargetApi(Build.VERSION_CODES.O_MR1)`: this tells Android Lint it's OK to
   use OMR1 APIs since this class is only used on OMR1 and above. Substitute
diff --git a/build/android/gyp/proguard.py b/build/android/gyp/proguard.py
index 328434110..5d5d6dda 100755
--- a/build/android/gyp/proguard.py
+++ b/build/android/gyp/proguard.py
@@ -14,6 +14,18 @@
 from util import build_utils
 from util import diff_utils
 
+_API_LEVEL_VERSION_CODE = [
+    (21, 'L'),
+    (22, 'LolliopoMR1'),
+    (23, 'M'),
+    (24, 'N'),
+    (25, 'NMR1'),
+    (26, 'O'),
+    (27, 'OMR1'),
+    (28, 'P'),
+    (29, 'Q'),
+]
+
 
 class _ProguardOutputFilter(object):
   """ProGuard outputs boring stuff to stdout (ProGuard version, jar path, etc)
@@ -322,6 +334,20 @@
     ret.append("-applymapping '%s'" % options.apply_mapping)
   if options.repackage_classes:
     ret.append("-repackageclasses '%s'" % options.repackage_classes)
+
+  _min_api = int(options.min_api) if options.min_api else 0
+  for api_level, version_code in _API_LEVEL_VERSION_CODE:
+    annotation_name = 'org.chromium.base.annotations.VerifiesOn' + version_code
+    if api_level > _min_api:
+      ret.append('-keep @interface %s' % annotation_name)
+      ret.append("""\
+-keep,allowobfuscation,allowoptimization @%s class ** {
+  <methods>;
+}""" % annotation_name)
+      ret.append("""\
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @%s <methods>;
+}""" % annotation_name)
   return '\n'.join(ret)
 
 
diff --git a/build/android/update_verification.py b/build/android/update_verification.py
index 40cb64a..c2f3243 100755
--- a/build/android/update_verification.py
+++ b/build/android/update_verification.py
@@ -49,8 +49,7 @@
   # Restore command is not synchronous
   raw_input('Select "Restore my data" on the device. Then press enter to '
             'continue.')
-  device_path = device.GetApplicationPaths(package_name)
-  if not device_path:
+  if not device.IsApplicationInstalled(package_name):
     raise Exception('Expected package %s to already be installed. '
                     'Package name might have changed!' % package_name)
 
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index a46ce76..a1cca37 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -980,8 +980,9 @@
     "//chrome/android:app_hooks_java",
     "//chrome/android:chrome_java",
     "//chrome/android/features/vr:java",
-    "//chrome/test/android:chrome_java_test_support",
+    "//chrome/browser/util/android:java",
     "//chrome/lib/util/public/android:java",
+    "//chrome/test/android:chrome_java_test_support",
     "//components/policy/android:policy_java",
     "//content/public/android:content_java",
     "//content/public/test/android:content_java_test_support",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 7488ffc..f1b2f69 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1725,7 +1725,6 @@
   "java/src/org/chromium/chrome/browser/util/ChromeIntentUtil.java",
   "java/src/org/chromium/chrome/browser/util/ColorUtils.java",
   "java/src/org/chromium/chrome/browser/util/FeatureUtilities.java",
-  "java/src/org/chromium/chrome/browser/util/IntentUtils.java",
   "java/src/org/chromium/chrome/browser/util/PlatformUtil.java",
   "java/src/org/chromium/chrome/browser/util/ViewUtils.java",
   "java/src/org/chromium/chrome/browser/vr/ArDelegate.java",
diff --git a/chrome/android/features/vr/BUILD.gn b/chrome/android/features/vr/BUILD.gn
index 218d773..c38cbc2 100644
--- a/chrome/android/features/vr/BUILD.gn
+++ b/chrome/android/features/vr/BUILD.gn
@@ -119,6 +119,7 @@
     "//base:base_java",
     "//base:jni_java",
     "//chrome/android:chrome_java",
+    "//chrome/browser/util/android:java",
     "//components/policy/android:policy_java",
     "//content/public/android:content_java",
     "//device/vr:java",
diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
index 182431d..30f34e1 100644
--- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
@@ -746,3 +746,42 @@
 -keepclassmembers class * {
     @com.google.vr.dynamite.client.UsedByReflection *;
 }
+
+################################################################################
+# Dynamically generated from build/android/gyp/proguard.py
+################################################################################
+-keep @interface org.chromium.base.annotations.VerifiesOnNMR1
+-keep,allowobfuscation,allowoptimization @org.chromium.base.annotations.VerifiesOnNMR1 class ** {
+  <methods>;
+}
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @org.chromium.base.annotations.VerifiesOnNMR1 <methods>;
+}
+-keep @interface org.chromium.base.annotations.VerifiesOnO
+-keep,allowobfuscation,allowoptimization @org.chromium.base.annotations.VerifiesOnO class ** {
+  <methods>;
+}
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @org.chromium.base.annotations.VerifiesOnO <methods>;
+}
+-keep @interface org.chromium.base.annotations.VerifiesOnOMR1
+-keep,allowobfuscation,allowoptimization @org.chromium.base.annotations.VerifiesOnOMR1 class ** {
+  <methods>;
+}
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @org.chromium.base.annotations.VerifiesOnOMR1 <methods>;
+}
+-keep @interface org.chromium.base.annotations.VerifiesOnP
+-keep,allowobfuscation,allowoptimization @org.chromium.base.annotations.VerifiesOnP class ** {
+  <methods>;
+}
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @org.chromium.base.annotations.VerifiesOnP <methods>;
+}
+-keep @interface org.chromium.base.annotations.VerifiesOnQ
+-keep,allowobfuscation,allowoptimization @org.chromium.base.annotations.VerifiesOnQ class ** {
+  <methods>;
+}
+-keepclassmembers,allowobfuscation,allowoptimization class ** {
+  @org.chromium.base.annotations.VerifiesOnQ <methods>;
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java
index be48db3a..7f672d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 package org.chromium.chrome.browser;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * JNI call glue for AfterStartupTaskUtils in C++.
@@ -16,8 +17,11 @@
      * to run and newly posted tasks will no longer be deferred.
      */
     public static void setStartupComplete() {
-        nativeSetStartupComplete();
+        AfterStartupTaskUtilsJni.get().setStartupComplete();
     }
 
-    private static native void nativeSetStartupComplete();
+    @NativeMethods
+    interface Natives {
+        void setStartupComplete();
+    }
 }
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 78ed598..e1d2052f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -7,6 +7,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.MainDex;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.library_loader.LibraryLoader;
 
 import java.util.Map;
@@ -52,7 +53,7 @@
         //
         // The FeatureList is however guaranteed to be initialized by the time
         // AsyncInitializationActivity#finishNativeInitialization is called.
-        return nativeIsInitialized();
+        return ChromeFeatureListJni.get().isInitialized();
     }
 
     /**
@@ -72,7 +73,7 @@
         }
 
         assert isInitialized();
-        return nativeIsEnabled(featureName);
+        return ChromeFeatureListJni.get().isEnabled(featureName);
     }
 
     /**
@@ -89,7 +90,7 @@
     public static String getFieldTrialParamByFeature(String featureName, String paramName) {
         if (sTestFeatures != null) return "";
         assert isInitialized();
-        return nativeGetFieldTrialParamByFeature(featureName, paramName);
+        return ChromeFeatureListJni.get().getFieldTrialParamByFeature(featureName, paramName);
     }
 
     /**
@@ -108,7 +109,8 @@
             String featureName, String paramName, int defaultValue) {
         if (sTestFeatures != null) return defaultValue;
         assert isInitialized();
-        return nativeGetFieldTrialParamByFeatureAsInt(featureName, paramName, defaultValue);
+        return ChromeFeatureListJni.get().getFieldTrialParamByFeatureAsInt(
+                featureName, paramName, defaultValue);
     }
 
     /**
@@ -127,7 +129,8 @@
             String featureName, String paramName, double defaultValue) {
         if (sTestFeatures != null) return defaultValue;
         assert isInitialized();
-        return nativeGetFieldTrialParamByFeatureAsDouble(featureName, paramName, defaultValue);
+        return ChromeFeatureListJni.get().getFieldTrialParamByFeatureAsDouble(
+                featureName, paramName, defaultValue);
     }
 
     /**
@@ -146,7 +149,8 @@
             String featureName, String paramName, boolean defaultValue) {
         if (sTestFeatures != null) return defaultValue;
         assert isInitialized();
-        return nativeGetFieldTrialParamByFeatureAsBoolean(featureName, paramName, defaultValue);
+        return ChromeFeatureListJni.get().getFieldTrialParamByFeatureAsBoolean(
+                featureName, paramName, defaultValue);
     }
 
     // Alphabetical:
@@ -360,14 +364,16 @@
     public static final String SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH =
             "ServiceManagerForBackgroundPrefetch";
 
-    private static native boolean nativeIsInitialized();
-    private static native boolean nativeIsEnabled(String featureName);
-    private static native String nativeGetFieldTrialParamByFeature(
-            String featureName, String paramName);
-    private static native int nativeGetFieldTrialParamByFeatureAsInt(
-            String featureName, String paramName, int defaultValue);
-    private static native double nativeGetFieldTrialParamByFeatureAsDouble(
-            String featureName, String paramName, double defaultValue);
-    private static native boolean nativeGetFieldTrialParamByFeatureAsBoolean(
-            String featureName, String paramName, boolean defaultValue);
+    @NativeMethods
+    interface Natives {
+        boolean isInitialized();
+        boolean isEnabled(String featureName);
+        String getFieldTrialParamByFeature(String featureName, String paramName);
+        int getFieldTrialParamByFeatureAsInt(
+                String featureName, String paramName, int defaultValue);
+        double getFieldTrialParamByFeatureAsDouble(
+                String featureName, String paramName, double defaultValue);
+        boolean getFieldTrialParamByFeatureAsBoolean(
+                String featureName, String paramName, boolean defaultValue);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DevToolsServer.java b/chrome/android/java/src/org/chromium/chrome/browser/DevToolsServer.java
index b0598fb2..cbe2ec512 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/DevToolsServer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DevToolsServer.java
@@ -11,6 +11,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -35,33 +36,30 @@
     }
 
     public DevToolsServer(String socketNamePrefix) {
-        mNativeDevToolsServer = nativeInitRemoteDebugging(socketNamePrefix);
+        mNativeDevToolsServer =
+                DevToolsServerJni.get().initRemoteDebugging(DevToolsServer.this, socketNamePrefix);
     }
 
     public void destroy() {
-        nativeDestroyRemoteDebugging(mNativeDevToolsServer);
+        DevToolsServerJni.get().destroyRemoteDebugging(DevToolsServer.this, mNativeDevToolsServer);
         mNativeDevToolsServer = 0;
     }
 
     public boolean isRemoteDebuggingEnabled() {
-        return nativeIsRemoteDebuggingEnabled(mNativeDevToolsServer);
+        return DevToolsServerJni.get().isRemoteDebuggingEnabled(
+                DevToolsServer.this, mNativeDevToolsServer);
     }
 
     public void setRemoteDebuggingEnabled(boolean enabled, @Security int security) {
         boolean allowDebugPermission = security == Security.ALLOW_DEBUG_PERMISSION;
-        nativeSetRemoteDebuggingEnabled(mNativeDevToolsServer, enabled, allowDebugPermission);
+        DevToolsServerJni.get().setRemoteDebuggingEnabled(
+                DevToolsServer.this, mNativeDevToolsServer, enabled, allowDebugPermission);
     }
 
     public void setRemoteDebuggingEnabled(boolean enabled) {
         setRemoteDebuggingEnabled(enabled, Security.DEFAULT);
     }
 
-    private native long nativeInitRemoteDebugging(String socketNamePrefix);
-    private native void nativeDestroyRemoteDebugging(long devToolsServer);
-    private native boolean nativeIsRemoteDebuggingEnabled(long devToolsServer);
-    private native void nativeSetRemoteDebuggingEnabled(
-            long devToolsServer, boolean enabled, boolean allowDebugPermission);
-
     @CalledByNative
     private static boolean checkDebugPermission(int pid, int uid) {
         String debugPermissionName =
@@ -70,4 +68,13 @@
                        ContextUtils.getApplicationContext(), debugPermissionName, pid, uid)
                 == PackageManager.PERMISSION_GRANTED;
     }
+
+    @NativeMethods
+    interface Natives {
+        long initRemoteDebugging(DevToolsServer caller, String socketNamePrefix);
+        void destroyRemoteDebugging(DevToolsServer caller, long devToolsServer);
+        boolean isRemoteDebuggingEnabled(DevToolsServer caller, long devToolsServer);
+        void setRemoteDebuggingEnabled(DevToolsServer caller, long devToolsServer, boolean enabled,
+                boolean allowDebugPermission);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHeadersRecorder.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHeadersRecorder.java
index 9840b71..70388d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHeadersRecorder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHeadersRecorder.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 
 import java.lang.annotation.Retention;
@@ -26,12 +27,10 @@
     @JNINamespace("chrome::android")
     /* package */ static class HeaderClassifier {
         /* package */ boolean isCorsSafelistedHeader(String name, String value) {
-            return nativeIsCorsSafelistedHeader(name, value);
+            return IntentHeadersRecorderJni.get().isCorsSafelistedHeader(name, value);
         }
     }
 
-    private static native boolean nativeIsCorsSafelistedHeader(String name, String value);
-
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({IntentHeadersResult.FIRST_PARTY_NO_HEADERS,
             IntentHeadersResult.FIRST_PARTY_ONLY_SAFE_HEADERS,
@@ -100,4 +99,9 @@
         RecordHistogram.recordEnumeratedHistogram("Android.IntentHeaders", result,
                 IntentHeadersResult.NUM_ENTRIES);
     }
+
+    @NativeMethods
+    interface Natives {
+        boolean isCorsSafelistedHeader(String name, String value);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/NearOomMonitor.java b/chrome/android/java/src/org/chromium/chrome/browser/NearOomMonitor.java
index fbcd02be..1759d7f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/NearOomMonitor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/NearOomMonitor.java
@@ -9,6 +9,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Android part of NearOomMonitor. This collects Java memory pressure signals
@@ -32,11 +33,14 @@
 
     @Override
     public void onLowMemory() {
-        nativeOnLowMemory(mNearOomMonitor);
+        NearOomMonitorJni.get().onLowMemory(mNearOomMonitor, NearOomMonitor.this);
     }
 
     @Override
     public void onConfigurationChanged(Configuration config) {}
 
-    private native void nativeOnLowMemory(long nativeNearOomMonitor);
+    @NativeMethods
+    interface Natives {
+        void onLowMemory(long nativeNearOomMonitor, NearOomMonitor caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java
index 23135a3..fa612ba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java
@@ -19,6 +19,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
@@ -104,7 +105,8 @@
         @Override
         protected void onPostExecute(Void result) {
             ThreadUtils.assertOnUiThread();
-            nativeOnSystemRequestCompletion(mNativePtr, mEncodedChain, mPrivateKey);
+            SSLClientCertificateRequestJni.get().onSystemRequestCompletion(
+                    mNativePtr, mEncodedChain, mPrivateKey);
         }
 
         private String getAlias() {
@@ -157,7 +159,9 @@
                 if (alias == null) {
                     // No certificate was selected.
                     PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT,
-                            () -> nativeOnSystemRequestCompletion(mNativePtr, null, null));
+                            ()
+                                    -> SSLClientCertificateRequestJni.get()
+                                               .onSystemRequestCompletion(mNativePtr, null, null));
                 } else {
                     new CertAsyncTaskKeyChain(mContext, mNativePtr, alias)
                             .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
@@ -301,12 +305,13 @@
 
     public static void notifyClientCertificatesChangedOnIOThread() {
         Log.d(TAG, "ClientCertificatesChanged!");
-        nativeNotifyClientCertificatesChangedOnIOThread();
+        SSLClientCertificateRequestJni.get().notifyClientCertificatesChangedOnIOThread();
     }
 
-    private static native void nativeNotifyClientCertificatesChangedOnIOThread();
-
-    // Called to pass request results to native side.
-    private static native void nativeOnSystemRequestCompletion(
-            long requestPtr, byte[][] certChain, PrivateKey privateKey);
+    @NativeMethods
+    interface Natives {
+        void notifyClientCertificatesChangedOnIOThread();
+        // Called to pass request results to native side.
+        void onSystemRequestCompletion(long requestPtr, byte[][] certChain, PrivateKey privateKey);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java
index 316dd59a..2451211 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/SearchGeolocationDisclosureTabHelper.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser;
 
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Helper that shows the search geolocation disclosure when required. This class currently is only
@@ -13,14 +14,17 @@
 public class SearchGeolocationDisclosureTabHelper {
     @VisibleForTesting
     public static void setIgnoreUrlChecksForTesting() {
-        nativeSetIgnoreUrlChecksForTesting();
+        SearchGeolocationDisclosureTabHelperJni.get().setIgnoreUrlChecksForTesting();
     }
 
     @VisibleForTesting
     public static void setDayOffsetForTesting(int days) {
-        nativeSetDayOffsetForTesting(days);
+        SearchGeolocationDisclosureTabHelperJni.get().setDayOffsetForTesting(days);
     }
 
-    private static native void nativeSetIgnoreUrlChecksForTesting();
-    private static native void nativeSetDayOffsetForTesting(int days);
+    @NativeMethods
+    interface Natives {
+        void setIgnoreUrlChecksForTesting();
+        void setDayOffsetForTesting(int days);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java
index 7546cf4..20ede9e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java
@@ -17,6 +17,7 @@
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browserservices.BrowserServicesMetrics;
@@ -214,9 +215,11 @@
      */
     public static void onWebContentsForRequestAvailable(
             int requestId, @Nullable WebContents webContents) {
-        nativeOnWebContentsForRequestAvailable(requestId, webContents);
+        ServiceTabLauncherJni.get().onWebContentsForRequestAvailable(requestId, webContents);
     }
 
-    private static native void nativeOnWebContentsForRequestAvailable(
-            int requestId, WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        void onWebContentsForRequestAvailable(int requestId, WebContents webContents);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
index 71b87516..133ac879 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
@@ -36,6 +36,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.blink_public.platform.WebDisplayMode;
 import org.chromium.chrome.R;
@@ -235,7 +236,9 @@
                 // download.
                 WebappRegistry.getInstance().register(id, storage -> {
                     storage.updateFromShortcutIntent(resultIntent);
-                    if (callbackPointer != 0) nativeOnWebappDataStored(callbackPointer);
+                    if (callbackPointer != 0) {
+                        ShortcutHelperJni.get().onWebappDataStored(callbackPointer);
+                    }
                 });
                 if (shouldShowToastWhenAddingShortcut()) {
                     showAddedToHomescreenToast(userTitle);
@@ -783,5 +786,8 @@
         }
     }
 
-    private static native void nativeOnWebappDataStored(long callbackPointer);
+    @NativeMethods
+    interface Natives {
+        void onWebappDataStored(long callbackPointer);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
index fb01b95..d688e49 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -23,6 +23,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.TraceEvent;
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.AsyncTask;
@@ -270,7 +271,7 @@
      */
     public static void startPreconnectPredictorInitialization(Profile profile) {
         ThreadUtils.assertOnUiThread();
-        nativeStartPreconnectPredictorInitialization(profile);
+        WarmupManagerJni.get().startPreconnectPredictorInitialization(profile);
     }
 
     /** Asynchronously preconnects to a given URL if the data reduction proxy is not in use.
@@ -301,7 +302,7 @@
             // one will win.
             mPendingPreconnectWithProfile.put(url, profile);
         } else {
-            nativePreconnectUrlAndSubresources(profile, url);
+            WarmupManagerJni.get().preconnectUrlAndSubresources(profile, url);
         }
     }
 
@@ -323,7 +324,7 @@
             // Spare WebContents should not be used with spare RenderProcessHosts, but if one
             // has been created, destroy it in order not to consume too many processes.
             destroySpareWebContents();
-            nativeWarmupSpareRenderer(profile);
+            WarmupManagerJni.get().warmupSpareRenderer(profile);
         }
     }
 
@@ -401,7 +402,10 @@
                 WEBCONTENTS_STATUS_HISTOGRAM, status, WebContentsStatus.NUM_ENTRIES);
     }
 
-    private static native void nativeStartPreconnectPredictorInitialization(Profile profile);
-    private static native void nativePreconnectUrlAndSubresources(Profile profile, String url);
-    private static native void nativeWarmupSpareRenderer(Profile profile);
+    @NativeMethods
+    interface Natives {
+        void startPreconnectPredictorInitialization(Profile profile);
+        void preconnectUrlAndSubresources(Profile profile, String url);
+        void warmupSpareRenderer(Profile profile);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WebContentsFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/WebContentsFactory.java
index 7371699..ddb0391 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/WebContentsFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/WebContentsFactory.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.content_public.browser.WebContents;
 
@@ -28,7 +29,7 @@
      */
     // TODO(pshmakov): remove static for unit-testability.
     public static WebContents createWebContents(boolean incognito, boolean initiallyHidden) {
-        return nativeCreateWebContents(
+        return WebContentsFactoryJni.get().createWebContents(
                 Profile.getLastUsedProfile(), incognito, initiallyHidden, false);
     }
 
@@ -44,10 +45,13 @@
      */
     public WebContents createWebContentsWithWarmRenderer(
             boolean incognito, boolean initiallyHidden) {
-        return nativeCreateWebContents(
+        return WebContentsFactoryJni.get().createWebContents(
                 Profile.getLastUsedProfile(), incognito, initiallyHidden, true);
     }
 
-    private static native WebContents nativeCreateWebContents(Profile profile, boolean incognito,
-            boolean initiallyHidden, boolean initializeRenderer);
+    @NativeMethods
+    interface Natives {
+        WebContents createWebContents(Profile profile, boolean incognito, boolean initiallyHidden,
+                boolean initializeRenderer);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureDevicesDispatcherAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureDevicesDispatcherAndroid.java
index 2acee4c..2c131bbf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureDevicesDispatcherAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureDevicesDispatcherAndroid.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.media;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 /**
@@ -13,26 +14,29 @@
 public class MediaCaptureDevicesDispatcherAndroid {
     public static boolean isCapturingAudio(WebContents webContents) {
         if (webContents == null) return false;
-        return nativeIsCapturingAudio(webContents);
+        return MediaCaptureDevicesDispatcherAndroidJni.get().isCapturingAudio(webContents);
     }
 
     public static boolean isCapturingVideo(WebContents webContents) {
         if (webContents == null) return false;
-        return nativeIsCapturingVideo(webContents);
+        return MediaCaptureDevicesDispatcherAndroidJni.get().isCapturingVideo(webContents);
     }
 
     public static boolean isCapturingScreen(WebContents webContents) {
         if (webContents == null) return false;
-        return nativeIsCapturingScreen(webContents);
+        return MediaCaptureDevicesDispatcherAndroidJni.get().isCapturingScreen(webContents);
     }
 
     public static void notifyStopped(WebContents webContents) {
         if (webContents == null) return;
-        nativeNotifyStopped(webContents);
+        MediaCaptureDevicesDispatcherAndroidJni.get().notifyStopped(webContents);
     }
 
-    private static native boolean nativeIsCapturingAudio(WebContents webContents);
-    private static native boolean nativeIsCapturingVideo(WebContents webContents);
-    private static native boolean nativeIsCapturingScreen(WebContents webContents);
-    private static native void nativeNotifyStopped(WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        boolean isCapturingAudio(WebContents webContents);
+        boolean isCapturingVideo(WebContents webContents);
+        boolean isCapturingScreen(WebContents webContents);
+        void notifyStopped(WebContents webContents);
+    }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java
index c04c7b9..61710bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/BackgroundTaskMemoryMetricsEmitter.java
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 package org.chromium.chrome.browser.metrics;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Emits background task memory usage UMA metrics.
@@ -18,8 +19,11 @@
      *         "Memory.BackgroundTask.Browser.*" histograms will still be emitted, regardless.
      */
     public static void reportMemoryUsage(boolean isReducedMode, String taskTypeAffix) {
-        nativeReportMemoryUsage(isReducedMode, taskTypeAffix);
+        BackgroundTaskMemoryMetricsEmitterJni.get().reportMemoryUsage(isReducedMode, taskTypeAffix);
     }
 
-    private static native void nativeReportMemoryUsage(boolean isReducedMode, String taskTypeAffix);
+    @NativeMethods
+    interface Natives {
+        void reportMemoryUsage(boolean isReducedMode, String taskTypeAffix);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java
index 488eee2..78718fb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java
@@ -17,6 +17,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.ui.base.LocalizationUtils;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * A preference that navigates to an URL.
@@ -40,7 +41,7 @@
 
     @Override
     protected void onClick() {
-        CustomTabActivity.showInfoPage(getContext(),
+        CustomTabActivity.showInfoPage(WindowAndroid.activityFromContext(getContext()),
                 LocalizationUtils.substituteLocalePlaceholder(getContext().getString(mUrlResId)));
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
index e0a926b..8804478 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
@@ -92,7 +92,7 @@
                 getPreferenceScreen().removePreference(findPreference(Type.CLIPBOARD));
             }
             CommandLine commandLine = CommandLine.getInstance();
-            if (!commandLine.hasSwitch(ContentSwitches.ENABLE_WEB_BLUETOOTH_SCANNING)) {
+            if (!commandLine.hasSwitch(ContentSwitches.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES)) {
                 getPreferenceScreen().removePreference(findPreference(Type.BLUETOOTH_SCANNING));
             }
         }
@@ -113,7 +113,7 @@
             websitePrefs.add(Type.AUTOMATIC_DOWNLOADS);
             websitePrefs.add(Type.BACKGROUND_SYNC);
             CommandLine commandLine = CommandLine.getInstance();
-            if (commandLine.hasSwitch(ContentSwitches.ENABLE_WEB_BLUETOOTH_SCANNING)) {
+            if (commandLine.hasSwitch(ContentSwitches.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES)) {
                 websitePrefs.add(Type.BLUETOOTH_SCANNING);
             }
             websitePrefs.add(Type.CAMERA);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
index 32d5f9a..f2183e6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
@@ -129,7 +129,7 @@
         // Sensors permission is per-origin.
         queue.add(new PermissionInfoFetcher(PermissionInfo.Type.SENSORS));
         CommandLine commandLine = CommandLine.getInstance();
-        if (commandLine.hasSwitch(ContentSwitches.ENABLE_WEB_BLUETOOTH_SCANNING)) {
+        if (commandLine.hasSwitch(ContentSwitches.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES)) {
             // Bluetooth scanning permission is per-origin.
             queue.add(new ExceptionInfoFetcher(
                     ContentSettingsType.CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING));
@@ -218,7 +218,7 @@
             queue.add(new PermissionInfoFetcher(PermissionInfo.Type.SENSORS));
         } else if (category.showSites(SiteSettingsCategory.Type.BLUETOOTH_SCANNING)) {
             CommandLine commandLine = CommandLine.getInstance();
-            if (commandLine.hasSwitch(ContentSwitches.ENABLE_WEB_BLUETOOTH_SCANNING)) {
+            if (commandLine.hasSwitch(ContentSwitches.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES)) {
                 // Bluetooth scanning permission is per-origin.
                 queue.add(new ExceptionInfoFetcher(
                         ContentSettingsType.CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING));
@@ -253,8 +253,9 @@
         for (exceptionType = 0; exceptionType < ContentSettingException.Type.NUM_ENTRIES;
                 exceptionType++) {
             if (contentSettingsType
-                    == ContentSettingException.getContentSettingsType(exceptionType))
+                    == ContentSettingException.getContentSettingsType(exceptionType)) {
                 break;
+            }
         }
         assert contentSettingsType
                 == ContentSettingException.getContentSettingsType(exceptionType)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java
index 1744dfc7..6751e6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.rappor;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * JNI bridge to the native Rappor service from Java.
@@ -16,13 +17,16 @@
     }
 
     public static void sampleString(String metric, String sampleValue) {
-        nativeSampleString(metric, sampleValue);
+        RapporServiceBridgeJni.get().sampleString(metric, sampleValue);
     }
 
     public static void sampleDomainAndRegistryFromURL(String metric, String url) {
-        nativeSampleDomainAndRegistryFromURL(metric, url);
+        RapporServiceBridgeJni.get().sampleDomainAndRegistryFromURL(metric, url);
     }
 
-    private static native void nativeSampleDomainAndRegistryFromURL(String metric, String url);
-    private static native void nativeSampleString(String metric, String sampleValue);
+    @NativeMethods
+    interface Natives {
+        void sampleDomainAndRegistryFromURL(String metric, String url);
+        void sampleString(String metric, String sampleValue);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java
index 05dc153..2006dc4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java
@@ -9,6 +9,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.tab.Tab;
 
@@ -61,16 +62,19 @@
      * Sets search client id.
      */
     protected static void setSearchClient(String client) {
-        nativeSetSearchClient(client);
+        RevenueStatsJni.get().setSearchClient(client);
     }
 
     /**
      * Sets rlz value.
      */
     protected static void setRlzParameterValue(String rlz) {
-        nativeSetRlzParameterValue(rlz);
+        RevenueStatsJni.get().setRlzParameterValue(rlz);
     }
 
-    private static native void nativeSetSearchClient(String client);
-    private static native void nativeSetRlzParameterValue(String rlz);
+    @NativeMethods
+    interface Natives {
+        void setSearchClient(String client);
+        void setRlzParameterValue(String rlz);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java
index 04d43c5..dcf22030 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java
@@ -9,6 +9,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.identity.SettingsSecureBasedIdentificationGenerator;
 import org.chromium.chrome.browser.profiles.Profile;
 
@@ -40,7 +41,7 @@
                         .getUniqueId(ID_SALT);
         id = generate50CharacterId(id.toUpperCase(Locale.getDefault()));
 
-        nativeStartPing(Profile.getLastUsedProfile().getOriginalProfile(), brand,
+        RlzPingHandlerJni.get().startPing(Profile.getLastUsedProfile().getOriginalProfile(), brand,
                 Locale.getDefault().getLanguage(), TextUtils.join(",", events), id, callback);
     }
 
@@ -52,6 +53,9 @@
         return idBuilder.substring(0, 50);
     }
 
-    private static native void nativeStartPing(Profile profile, String brand, String language,
-            String events, String id, Callback<Boolean> callback);
+    @NativeMethods
+    interface Natives {
+        void startPing(Profile profile, String brand, String language, String events, String id,
+                Callback<Boolean> callback);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/FileTypePolicies.java b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/FileTypePolicies.java
index 6de2d59..956105f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/FileTypePolicies.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/FileTypePolicies.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.safe_browsing;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * This class reports UMA values based on files' extensions.
@@ -16,8 +17,11 @@
      * @return The UMA value for the file.
      */
     public static int umaValueForFile(String path) {
-        return nativeUmaValueForFile(path);
+        return FileTypePoliciesJni.get().umaValueForFile(path);
     }
 
-    private static native int nativeUmaValueForFile(String path);
+    @NativeMethods
+    interface Natives {
+        int umaValueForFile(String path);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java
index f6b0884..c4573e43 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.components.search_engines.TemplateUrlService;
 
 /**
@@ -23,7 +24,7 @@
     public static TemplateUrlService get() {
         ThreadUtils.assertOnUiThread();
         if (sTemplateUrlService == null) {
-            sTemplateUrlService = nativeGetTemplateUrlService();
+            sTemplateUrlService = TemplateUrlServiceFactoryJni.get().getTemplateUrlService();
         }
         return sTemplateUrlService;
     }
@@ -37,9 +38,12 @@
      * TODO(crbug.com/968156): Move to TemplateUrlServiceHelper.
      */
     public static boolean doesDefaultSearchEngineHaveLogo() {
-        return nativeDoesDefaultSearchEngineHaveLogo();
+        return TemplateUrlServiceFactoryJni.get().doesDefaultSearchEngineHaveLogo();
     }
 
-    private static native TemplateUrlService nativeGetTemplateUrlService();
-    private static native boolean nativeDoesDefaultSearchEngineHaveLogo();
+    @NativeMethods
+    interface Natives {
+        TemplateUrlService getTemplateUrlService();
+        boolean doesDefaultSearchEngineHaveLogo();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java
index 658b9b23..6b52522 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.sessions;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 /**
@@ -19,8 +20,11 @@
      * @param tab The WebContents to get the tab id for.
      */
     public static int sessionIdForTab(WebContents webContents) {
-        return nativeIdForTab(webContents);
+        return SessionTabHelperJni.get().idForTab(webContents);
     }
 
-    private static native int nativeIdForTab(WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        int idForTab(WebContents webContents);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java
index 8b948a3..515345d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java
@@ -10,6 +10,7 @@
 import org.chromium.base.ObserverList;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.signin.AccountTrackerService;
 
@@ -95,7 +96,7 @@
             while (numberOfPendingRequests > 0) {
                 // Pending requests here must be pre-signin request since SigninManager will wait
                 // system accounts been seeded into AccountTrackerService before finishing sign in.
-                nativeStartFetchingAccountInfoFor(
+                ProfileDownloaderJni.get().startFetchingAccountInfoFor(
                         mProfiles.get(0), mAccountIds.get(0), mImageSidePixels.get(0), true);
                 mProfiles.remove(0);
                 mAccountIds.remove(0);
@@ -127,7 +128,8 @@
                     profile, accountId, imageSidePixels);
             return;
         }
-        nativeStartFetchingAccountInfoFor(profile, accountId, imageSidePixels, isPreSignin);
+        ProfileDownloaderJni.get().startFetchingAccountInfoFor(
+                profile, accountId, imageSidePixels, isPreSignin);
     }
 
     @CalledByNative
@@ -144,7 +146,7 @@
      * @return The profile full name if cached, or null.
      */
     public static String getCachedFullName(Profile profile) {
-        return nativeGetCachedFullNameForPrimaryAccount(profile);
+        return ProfileDownloaderJni.get().getCachedFullNameForPrimaryAccount(profile);
     }
 
     /**
@@ -152,7 +154,7 @@
      * @return The profile given name if cached, or null.
      */
     public static String getCachedGivenName(Profile profile) {
-        return nativeGetCachedGivenNameForPrimaryAccount(profile);
+        return ProfileDownloaderJni.get().getCachedGivenNameForPrimaryAccount(profile);
     }
 
     /**
@@ -160,13 +162,15 @@
      * @return The profile avatar if cached, or null.
      */
     public static Bitmap getCachedAvatar(Profile profile) {
-        return nativeGetCachedAvatarForPrimaryAccount(profile);
+        return ProfileDownloaderJni.get().getCachedAvatarForPrimaryAccount(profile);
     }
 
-    // Native methods.
-    private static native void nativeStartFetchingAccountInfoFor(
-            Profile profile, String accountId, int imageSidePixels, boolean isPreSignin);
-    private static native String nativeGetCachedFullNameForPrimaryAccount(Profile profile);
-    private static native String nativeGetCachedGivenNameForPrimaryAccount(Profile profile);
-    private static native Bitmap nativeGetCachedAvatarForPrimaryAccount(Profile profile);
+    @NativeMethods
+    interface Natives {
+        void startFetchingAccountInfoFor(
+                Profile profile, String accountId, int imageSidePixels, boolean isPreSignin);
+        String getCachedFullNameForPrimaryAccount(Profile profile);
+        String getCachedGivenNameForPrimaryAccount(Profile profile);
+        Bitmap getCachedAvatarForPrimaryAccount(Profile profile);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java
index 9c3718fb..8ef7839f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java
@@ -587,7 +587,8 @@
 
         mAccountNames = getAccountNames(maybeAccountNames);
         mHasGmsError = mAccountNames == null;
-        if (mAccountNames == null) return;
+        mView.getAcceptButton().setEnabled(!mHasGmsError);
+        if (mHasGmsError) return;
 
         if (mAccountNames.isEmpty()) {
             mSelectedAccountName = null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java
index 9857d9df..e9398dcc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.signin;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.signin.InvestigatedScenario;
 
 /**
@@ -19,9 +20,11 @@
      * @return int value that corresponds to enum InvestigatedScenario.
      */
     public static @InvestigatedScenario int investigate(String currentEmail) {
-        return nativeInvestigate(currentEmail);
+        return SigninInvestigatorJni.get().investigate(currentEmail);
     }
 
-    // Native methods
-    private static native int nativeInvestigate(String currentEmail);
+    @NativeMethods
+    interface Natives {
+        int investigate(String currentEmail);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
index fe82993..2eae0f38 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.sync.AccountManagementFragment;
 import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
@@ -153,9 +154,11 @@
      * @param gaiaServiceType A signin::GAIAServiceType.
      */
     public static void logEvent(int metric, int gaiaServiceType) {
-        nativeLogEvent(metric, gaiaServiceType);
+        SigninUtilsJni.get().logEvent(metric, gaiaServiceType);
     }
 
-    // Native methods.
-    private static native void nativeLogEvent(int metric, int gaiaServiceType);
+    @NativeMethods
+    interface Natives {
+        void logEvent(int metric, int gaiaServiceType);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
index bda1b3e..d38c1cf6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.signin;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 
 /**
@@ -14,17 +15,20 @@
 
     /** Returns whether collection of URL-keyed anonymized data is enabled. */
     public static boolean isUrlKeyedAnonymizedDataCollectionEnabled() {
-        return nativeIsUrlKeyedAnonymizedDataCollectionEnabled(Profile.getLastUsedProfile());
+        return UnifiedConsentServiceBridgeJni.get().isUrlKeyedAnonymizedDataCollectionEnabled(
+                Profile.getLastUsedProfile());
     }
 
     /** Sets whether collection of URL-keyed anonymized data is enabled. */
     public static void setUrlKeyedAnonymizedDataCollectionEnabled(boolean enabled) {
-        nativeSetUrlKeyedAnonymizedDataCollectionEnabled(Profile.getLastUsedProfile(), enabled);
+        UnifiedConsentServiceBridgeJni.get().setUrlKeyedAnonymizedDataCollectionEnabled(
+                Profile.getLastUsedProfile(), enabled);
     }
 
     /** Returns whether collection of URL-keyed anonymized data is configured by policy. */
     public static boolean isUrlKeyedAnonymizedDataCollectionManaged() {
-        return nativeIsUrlKeyedAnonymizedDataCollectionManaged(Profile.getLastUsedProfile());
+        return UnifiedConsentServiceBridgeJni.get().isUrlKeyedAnonymizedDataCollectionManaged(
+                Profile.getLastUsedProfile());
     }
 
     /**
@@ -32,12 +36,15 @@
      * See C++ unified_consent::metrics::RecordSyncSetupDataTypesHistrogam for details.
      */
     public static void recordSyncSetupDataTypesHistogram() {
-        nativeRecordSyncSetupDataTypesHistogram(Profile.getLastUsedProfile());
+        UnifiedConsentServiceBridgeJni.get().recordSyncSetupDataTypesHistogram(
+                Profile.getLastUsedProfile());
     }
 
-    private static native boolean nativeIsUrlKeyedAnonymizedDataCollectionEnabled(Profile profile);
-    private static native void nativeSetUrlKeyedAnonymizedDataCollectionEnabled(
-            Profile profile, boolean enabled);
-    private static native boolean nativeIsUrlKeyedAnonymizedDataCollectionManaged(Profile profile);
-    private static native void nativeRecordSyncSetupDataTypesHistogram(Profile profile);
+    @NativeMethods
+    interface Natives {
+        boolean isUrlKeyedAnonymizedDataCollectionEnabled(Profile profile);
+        void setUrlKeyedAnonymizedDataCollectionEnabled(Profile profile, boolean enabled);
+        boolean isUrlKeyedAnonymizedDataCollectionManaged(Profile profile);
+        void recordSyncSetupDataTypesHistogram(Profile profile);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java
index 3f39ee8..6234ee4c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java
@@ -13,6 +13,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -24,11 +25,11 @@
             "http://connectivitycheck.gstatic.com/generate_204";
 
     public static void setCaptivePortalCertificateForTesting(String spkiHash) {
-        nativeSetCaptivePortalCertificateForTesting(spkiHash);
+        CaptivePortalHelperJni.get().setCaptivePortalCertificateForTesting(spkiHash);
     }
 
     public static void setOSReportsCaptivePortalForTesting(boolean osReportsCaptivePortal) {
-        nativeSetOSReportsCaptivePortalForTesting(osReportsCaptivePortal);
+        CaptivePortalHelperJni.get().setOSReportsCaptivePortalForTesting(osReportsCaptivePortal);
     }
 
     @CalledByNative
@@ -98,8 +99,9 @@
 
     private CaptivePortalHelper() {}
 
-    private static native void nativeSetCaptivePortalCertificateForTesting(String spkiHash);
-
-    private static native void nativeSetOSReportsCaptivePortalForTesting(
-            boolean osReportsCaptivePortal);
+    @NativeMethods
+    interface Natives {
+        void setCaptivePortalCertificateForTesting(String spkiHash);
+        void setOSReportsCaptivePortalForTesting(boolean osReportsCaptivePortal);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java b/chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java
index 70c4272b..7915c8b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.ssl;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content_public.browser.WebContents;
 
@@ -21,10 +22,13 @@
      */
     public static int getSecurityLevelForWebContents(WebContents webContents) {
         if (webContents == null) return ConnectionSecurityLevel.NONE;
-        return nativeGetSecurityLevelForWebContents(webContents);
+        return SecurityStateModelJni.get().getSecurityLevelForWebContents(webContents);
     }
 
     private SecurityStateModel() {}
 
-    private static native int nativeGetSecurityLevelForWebContents(WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        int getSecurityLevelForWebContents(WebContents webContents);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
index bf3b4820..cab7f6b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
@@ -7,6 +7,7 @@
 import android.graphics.RectF;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
@@ -58,20 +59,22 @@
     @Override
     protected void initializeNative() {
         if (mNativePtr == 0) {
-            mNativePtr = nativeInit();
+            mNativePtr = StatusIndicatorSceneLayerJni.get().init(StatusIndicatorSceneLayer.this);
         }
         assert mNativePtr != 0;
     }
 
     @Override
     public void setContentTree(SceneLayer contentTree) {
-        nativeSetContentTree(mNativePtr, contentTree);
+        StatusIndicatorSceneLayerJni.get().setContentTree(
+                mNativePtr, StatusIndicatorSceneLayer.this, contentTree);
     }
 
     @Override
     public SceneOverlayLayer getUpdatedSceneOverlayTree(RectF viewport, RectF visibleViewport,
             LayerTitleCache layerTitleCache, ResourceManager resourceManager, float yOffset) {
-        nativeUpdateStatusIndicatorLayer(mNativePtr, resourceManager, mResourceId);
+        StatusIndicatorSceneLayerJni.get().updateStatusIndicatorLayer(
+                mNativePtr, StatusIndicatorSceneLayer.this, resourceManager, mResourceId);
         return this;
     }
 
@@ -127,9 +130,13 @@
     @Override
     public void tabCreated(long time, boolean incognito, int id, int prevId, boolean selected) {}
 
-    private native long nativeInit();
-    private native void nativeSetContentTree(
-            long nativeStatusIndicatorSceneLayer, SceneLayer contentTree);
-    private native void nativeUpdateStatusIndicatorLayer(long nativeStatusIndicatorSceneLayer,
-            ResourceManager resourceManager, int viewResourceId);
+    @NativeMethods
+    interface Natives {
+        long init(StatusIndicatorSceneLayer caller);
+        void setContentTree(long nativeStatusIndicatorSceneLayer, StatusIndicatorSceneLayer caller,
+                SceneLayer contentTree);
+        void updateStatusIndicatorLayer(long nativeStatusIndicatorSceneLayer,
+                StatusIndicatorSceneLayer caller, ResourceManager resourceManager,
+                int viewResourceId);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
index c73cff50..82ded558 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.suggestions;
 
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ntp.cards.ActionItem;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
@@ -14,75 +15,82 @@
 public class SuggestionsEventReporterBridge implements SuggestionsEventReporter {
     @Override
     public void onSurfaceOpened() {
-        nativeOnSurfaceOpened();
+        SuggestionsEventReporterBridgeJni.get().onSurfaceOpened();
     }
 
     @Override
     public void onPageShown(
             int[] categories, int[] suggestionsPerCategory, boolean[] isCategoryVisible) {
-        nativeOnPageShown(categories, suggestionsPerCategory, isCategoryVisible);
+        SuggestionsEventReporterBridgeJni.get().onPageShown(
+                categories, suggestionsPerCategory, isCategoryVisible);
     }
 
     @Override
     public void onSuggestionShown(SnippetArticle suggestion) {
-        nativeOnSuggestionShown(suggestion.getGlobalRank(), suggestion.mCategory,
-                suggestion.getPerSectionRank(), suggestion.mPublishTimestampMilliseconds,
-                suggestion.mScore, suggestion.mFetchTimestampMilliseconds);
+        SuggestionsEventReporterBridgeJni.get().onSuggestionShown(suggestion.getGlobalRank(),
+                suggestion.mCategory, suggestion.getPerSectionRank(),
+                suggestion.mPublishTimestampMilliseconds, suggestion.mScore,
+                suggestion.mFetchTimestampMilliseconds);
     }
 
     @Override
     public void onSuggestionOpened(SnippetArticle suggestion, int windowOpenDisposition,
             SuggestionsRanker suggestionsRanker) {
         int categoryIndex = suggestionsRanker.getCategoryRank(suggestion.mCategory);
-        nativeOnSuggestionOpened(suggestion.getGlobalRank(), suggestion.mCategory, categoryIndex,
-                suggestion.getPerSectionRank(), suggestion.mPublishTimestampMilliseconds,
-                suggestion.mScore, windowOpenDisposition, suggestion.isPrefetched());
+        SuggestionsEventReporterBridgeJni.get().onSuggestionOpened(suggestion.getGlobalRank(),
+                suggestion.mCategory, categoryIndex, suggestion.getPerSectionRank(),
+                suggestion.mPublishTimestampMilliseconds, suggestion.mScore, windowOpenDisposition,
+                suggestion.isPrefetched());
     }
 
     @Override
     public void onSuggestionMenuOpened(SnippetArticle suggestion) {
-        nativeOnSuggestionMenuOpened(suggestion.getGlobalRank(), suggestion.mCategory,
-                suggestion.getPerSectionRank(), suggestion.mPublishTimestampMilliseconds,
-                suggestion.mScore);
+        SuggestionsEventReporterBridgeJni.get().onSuggestionMenuOpened(suggestion.getGlobalRank(),
+                suggestion.mCategory, suggestion.getPerSectionRank(),
+                suggestion.mPublishTimestampMilliseconds, suggestion.mScore);
     }
     @Override
     public void onMoreButtonShown(ActionItem actionItem) {
-        nativeOnMoreButtonShown(actionItem.getCategory(), actionItem.getPerSectionRank());
+        SuggestionsEventReporterBridgeJni.get().onMoreButtonShown(
+                actionItem.getCategory(), actionItem.getPerSectionRank());
     }
 
     @Override
     public void onMoreButtonClicked(ActionItem actionItem) {
         @CategoryInt
         int category = actionItem.getCategory();
-        nativeOnMoreButtonClicked(category, actionItem.getPerSectionRank());
+        SuggestionsEventReporterBridgeJni.get().onMoreButtonClicked(
+                category, actionItem.getPerSectionRank());
     }
 
     public static void onSuggestionTargetVisited(int category, long visitTimeMs) {
-        nativeOnSuggestionTargetVisited(category, visitTimeMs);
+        SuggestionsEventReporterBridgeJni.get().onSuggestionTargetVisited(category, visitTimeMs);
     }
 
     public static void onActivityWarmResumed() {
-        nativeOnActivityWarmResumed();
+        SuggestionsEventReporterBridgeJni.get().onActivityWarmResumed();
     }
 
     public static void onColdStart() {
-        nativeOnColdStart();
+        SuggestionsEventReporterBridgeJni.get().onColdStart();
     }
 
-    private static native void nativeOnPageShown(
-            int[] categories, int[] suggestionsPerCategory, boolean[] isCategoryVisible);
-    private static native void nativeOnSuggestionShown(int globalPosition, int category,
-            int positionInCategory, long publishTimestampMs, float score, long fetchTimestampMs);
-    private static native void nativeOnSuggestionOpened(int globalPosition, int category,
-            int categoryIndex, int positionInCategory, long publishTimestampMs, float score,
-            int windowOpenDisposition, boolean isPrefetched);
-    private static native void nativeOnSuggestionMenuOpened(int globalPosition, int category,
-            int positionInCategory, long publishTimestampMs, float score);
-    private static native void nativeOnMoreButtonShown(int category, int position);
-    private static native void nativeOnMoreButtonClicked(int category, int position);
-    private static native void nativeOnSurfaceOpened();
-
-    private static native void nativeOnActivityWarmResumed();
-    private static native void nativeOnColdStart();
-    private static native void nativeOnSuggestionTargetVisited(int category, long visitTimeMs);
+    @NativeMethods
+    interface Natives {
+        void onPageShown(
+                int[] categories, int[] suggestionsPerCategory, boolean[] isCategoryVisible);
+        void onSuggestionShown(int globalPosition, int category, int positionInCategory,
+                long publishTimestampMs, float score, long fetchTimestampMs);
+        void onSuggestionOpened(int globalPosition, int category, int categoryIndex,
+                int positionInCategory, long publishTimestampMs, float score,
+                int windowOpenDisposition, boolean isPrefetched);
+        void onSuggestionMenuOpened(int globalPosition, int category, int positionInCategory,
+                long publishTimestampMs, float score);
+        void onMoreButtonShown(int category, int position);
+        void onMoreButtonClicked(int category, int position);
+        void onSurfaceOpened();
+        void onActivityWarmResumed();
+        void onColdStart();
+        void onSuggestionTargetVisited(int category, long visitTimeMs);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
index deb495f..efaf82e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNIAdditionalImport;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.suggestions.SiteSuggestion;
 import org.chromium.chrome.browser.suggestions.tile.Tile;
@@ -35,7 +36,8 @@
      * @param profile The profile for which to fetch most visited sites.
      */
     public MostVisitedSitesBridge(Profile profile) {
-        mNativeMostVisitedSitesBridge = nativeInit(profile);
+        mNativeMostVisitedSitesBridge =
+                MostVisitedSitesBridgeJni.get().init(MostVisitedSitesBridge.this, profile);
     }
 
     /**
@@ -45,7 +47,8 @@
     public void destroy() {
         // Stop listening even if it was not started in the first place. (Handled without errors.)
         assert mNativeMostVisitedSitesBridge != 0;
-        nativeDestroy(mNativeMostVisitedSitesBridge);
+        MostVisitedSitesBridgeJni.get().destroy(
+                mNativeMostVisitedSitesBridge, MostVisitedSitesBridge.this);
         mNativeMostVisitedSitesBridge = 0;
     }
 
@@ -54,41 +57,46 @@
         assert numSites <= MAX_TILE_COUNT;
         mWrappedObserver = observer;
 
-        nativeSetObserver(mNativeMostVisitedSitesBridge, this, numSites);
+        MostVisitedSitesBridgeJni.get().setObserver(
+                mNativeMostVisitedSitesBridge, MostVisitedSitesBridge.this, this, numSites);
     }
 
     @Override
     public void addBlacklistedUrl(String url) {
         if (mNativeMostVisitedSitesBridge == 0) return;
-        nativeAddOrRemoveBlacklistedUrl(mNativeMostVisitedSitesBridge, url, true);
+        MostVisitedSitesBridgeJni.get().addOrRemoveBlacklistedUrl(
+                mNativeMostVisitedSitesBridge, MostVisitedSitesBridge.this, url, true);
     }
 
     @Override
     public void removeBlacklistedUrl(String url) {
         if (mNativeMostVisitedSitesBridge == 0) return;
-        nativeAddOrRemoveBlacklistedUrl(mNativeMostVisitedSitesBridge, url, false);
+        MostVisitedSitesBridgeJni.get().addOrRemoveBlacklistedUrl(
+                mNativeMostVisitedSitesBridge, MostVisitedSitesBridge.this, url, false);
     }
 
     @Override
     public void recordPageImpression(int tilesCount) {
         if (mNativeMostVisitedSitesBridge == 0) return;
-        nativeRecordPageImpression(mNativeMostVisitedSitesBridge, tilesCount);
+        MostVisitedSitesBridgeJni.get().recordPageImpression(
+                mNativeMostVisitedSitesBridge, MostVisitedSitesBridge.this, tilesCount);
     }
 
     @Override
     public void recordTileImpression(Tile tile) {
         if (mNativeMostVisitedSitesBridge == 0) return;
-        nativeRecordTileImpression(mNativeMostVisitedSitesBridge, tile.getIndex(), tile.getType(),
-                tile.getIconType(), tile.getTitleSource(), tile.getSource(),
+        MostVisitedSitesBridgeJni.get().recordTileImpression(mNativeMostVisitedSitesBridge,
+                MostVisitedSitesBridge.this, tile.getIndex(), tile.getType(), tile.getIconType(),
+                tile.getTitleSource(), tile.getSource(),
                 tile.getData().dataGenerationTime.getTime(), tile.getUrl());
     }
 
     @Override
     public void recordOpenedMostVisitedItem(Tile tile) {
         if (mNativeMostVisitedSitesBridge == 0) return;
-        nativeRecordOpenedMostVisitedItem(mNativeMostVisitedSitesBridge, tile.getIndex(),
-                tile.getType(), tile.getTitleSource(), tile.getSource(),
-                tile.getData().dataGenerationTime.getTime());
+        MostVisitedSitesBridgeJni.get().recordOpenedMostVisitedItem(mNativeMostVisitedSitesBridge,
+                MostVisitedSitesBridge.this, tile.getIndex(), tile.getType(), tile.getTitleSource(),
+                tile.getSource(), tile.getData().dataGenerationTime.getTime());
     }
 
     /**
@@ -147,20 +155,25 @@
         }
     }
 
-    private native long nativeInit(Profile profile);
-    private native void nativeDestroy(long nativeMostVisitedSitesBridge);
-    private native void nativeOnHomepageStateChanged(long nativeMostVisitedSitesBridge);
-    private native void nativeSetHomepageClient(
-            long nativeMostVisitedSitesBridge, MostVisitedSites.HomepageClient homePageClient);
-    private native void nativeSetObserver(
-            long nativeMostVisitedSitesBridge, MostVisitedSitesBridge observer, int numSites);
-    private native void nativeAddOrRemoveBlacklistedUrl(
-            long nativeMostVisitedSitesBridge, String url, boolean addUrl);
-    private native void nativeRecordPageImpression(
-            long nativeMostVisitedSitesBridge, int tilesCount);
-    private native void nativeRecordTileImpression(long nativeMostVisitedSitesBridge, int index,
-            int type, int iconType, int titleSource, int source, long dataGenerationTimeMs,
-            String url);
-    private native void nativeRecordOpenedMostVisitedItem(long nativeMostVisitedSitesBridge,
-            int index, int tileType, int titleSource, int source, long dataGenerationTimeMs);
+    @NativeMethods
+    interface Natives {
+        long init(MostVisitedSitesBridge caller, Profile profile);
+        void destroy(long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller);
+        void onHomepageStateChanged(
+                long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller);
+        void setHomepageClient(long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller,
+                MostVisitedSites.HomepageClient homePageClient);
+        void setObserver(long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller,
+                MostVisitedSitesBridge observer, int numSites);
+        void addOrRemoveBlacklistedUrl(long nativeMostVisitedSitesBridge,
+                MostVisitedSitesBridge caller, String url, boolean addUrl);
+        void recordPageImpression(
+                long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller, int tilesCount);
+        void recordTileImpression(long nativeMostVisitedSitesBridge, MostVisitedSitesBridge caller,
+                int index, int type, int iconType, int titleSource, int source,
+                long dataGenerationTimeMs, String url);
+        void recordOpenedMostVisitedItem(long nativeMostVisitedSitesBridge,
+                MostVisitedSitesBridge caller, int index, int tileType, int titleSource, int source,
+                long dataGenerationTimeMs);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
index bf04f7e..f9e68e8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
@@ -12,6 +12,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.components.sync.ModelType;
@@ -149,7 +150,8 @@
         // This may cause us to create ProfileSyncService even if sync has not
         // been set up, but ProfileSyncService::Startup() won't be called until
         // credentials are available.
-        mNativeProfileSyncServiceAndroid = nativeInit();
+        mNativeProfileSyncServiceAndroid =
+                ProfileSyncServiceJni.get().init(ProfileSyncService.this);
     }
 
     @CalledByNative
@@ -162,7 +164,8 @@
      */
     public void setSessionsId(String sessionTag) {
         ThreadUtils.assertOnUiThread();
-        nativeSetSyncSessionsId(mNativeProfileSyncServiceAndroid, sessionTag);
+        ProfileSyncServiceJni.get().setSyncSessionsId(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, sessionTag);
     }
 
     /**
@@ -174,7 +177,8 @@
      */
     public @Passphrase.Type int getPassphraseType() {
         assert isEngineInitialized();
-        int passphraseType = nativeGetPassphraseType(mNativeProfileSyncServiceAndroid);
+        int passphraseType = ProfileSyncServiceJni.get().getPassphraseType(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
         if (passphraseType < 0 || passphraseType >= Passphrase.Type.NUM_ENTRIES) {
             throw new IllegalArgumentException();
         }
@@ -186,7 +190,8 @@
      */
     public boolean hasExplicitPassphraseTime() {
         assert isEngineInitialized();
-        return nativeHasExplicitPassphraseTime(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().hasExplicitPassphraseTime(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -194,30 +199,36 @@
      */
     public long getExplicitPassphraseTime() {
         assert isEngineInitialized();
-        return nativeGetExplicitPassphraseTime(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getExplicitPassphraseTime(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public String getSyncEnterGooglePassphraseBodyWithDateText() {
         assert isEngineInitialized();
-        return nativeGetSyncEnterGooglePassphraseBodyWithDateText(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getSyncEnterGooglePassphraseBodyWithDateText(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public String getSyncEnterCustomPassphraseBodyWithDateText() {
         assert isEngineInitialized();
-        return nativeGetSyncEnterCustomPassphraseBodyWithDateText(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getSyncEnterCustomPassphraseBodyWithDateText(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public String getCurrentSignedInAccountText() {
         assert isEngineInitialized();
-        return nativeGetCurrentSignedInAccountText(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getCurrentSignedInAccountText(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public String getSyncEnterCustomPassphraseBodyText() {
-        return nativeGetSyncEnterCustomPassphraseBodyText(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getSyncEnterCustomPassphraseBodyText(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public int getNumberOfSyncedDevices() {
-        return nativeGetNumberOfSyncedDevices(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getNumberOfSyncedDevices(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -228,7 +239,8 @@
      */
     public boolean isUsingSecondaryPassphrase() {
         assert isEngineInitialized();
-        return nativeIsUsingSecondaryPassphrase(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isUsingSecondaryPassphrase(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -239,7 +251,8 @@
      */
     public boolean isPassphraseRequiredForDecryption() {
         assert isEngineInitialized();
-        return nativeIsPassphraseRequiredForDecryption(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isPassphraseRequiredForDecryption(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -248,7 +261,8 @@
      * @return true if sync is initialized/running.
      */
     public boolean isEngineInitialized() {
-        return nativeIsEngineInitialized(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isEngineInitialized(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -259,7 +273,8 @@
      */
     public boolean isEncryptEverythingAllowed() {
         assert isEngineInitialized();
-        return nativeIsEncryptEverythingAllowed(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isEncryptEverythingAllowed(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -270,7 +285,8 @@
      */
     public boolean isEncryptEverythingEnabled() {
         assert isEngineInitialized();
-        return nativeIsEncryptEverythingEnabled(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isEncryptEverythingEnabled(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -279,21 +295,25 @@
      */
     public void enableEncryptEverything() {
         assert isEngineInitialized();
-        nativeEnableEncryptEverything(mNativeProfileSyncServiceAndroid);
+        ProfileSyncServiceJni.get().enableEncryptEverything(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public void setEncryptionPassphrase(String passphrase) {
         assert isEngineInitialized();
-        nativeSetEncryptionPassphrase(mNativeProfileSyncServiceAndroid, passphrase);
+        ProfileSyncServiceJni.get().setEncryptionPassphrase(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, passphrase);
     }
 
     public boolean setDecryptionPassphrase(String passphrase) {
         assert isEngineInitialized();
-        return nativeSetDecryptionPassphrase(mNativeProfileSyncServiceAndroid, passphrase);
+        return ProfileSyncServiceJni.get().setDecryptionPassphrase(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, passphrase);
     }
 
     public @GoogleServiceAuthError.State int getAuthError() {
-        int authErrorCode = nativeGetAuthError(mNativeProfileSyncServiceAndroid);
+        int authErrorCode = ProfileSyncServiceJni.get().getAuthError(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
         if (authErrorCode < 0 || authErrorCode >= GoogleServiceAuthError.State.NUM_ENTRIES) {
             throw new IllegalArgumentException("No state for code: " + authErrorCode);
         }
@@ -301,7 +321,8 @@
     }
 
     public boolean requiresClientUpgrade() {
-        return nativeRequiresClientUpgrade(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().requiresClientUpgrade(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -312,7 +333,8 @@
      * @return Set of active data types.
      */
     public Set<Integer> getActiveDataTypes() {
-        int[] activeDataTypes = nativeGetActiveDataTypes(mNativeProfileSyncServiceAndroid);
+        int[] activeDataTypes = ProfileSyncServiceJni.get().getActiveDataTypes(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
         return modelTypeArrayToSet(activeDataTypes);
     }
 
@@ -325,7 +347,8 @@
      * @return Set of chosen types.
      */
     public Set<Integer> getChosenDataTypes() {
-        int[] modelTypeArray = nativeGetChosenDataTypes(mNativeProfileSyncServiceAndroid);
+        int[] modelTypeArray = ProfileSyncServiceJni.get().getChosenDataTypes(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
         return modelTypeArrayToSet(modelTypeArray);
     }
 
@@ -338,7 +361,8 @@
      * @return Set of preferred types.
      */
     public Set<Integer> getPreferredDataTypes() {
-        int[] modelTypeArray = nativeGetPreferredDataTypes(mNativeProfileSyncServiceAndroid);
+        int[] modelTypeArray = ProfileSyncServiceJni.get().getPreferredDataTypes(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
         return modelTypeArrayToSet(modelTypeArray);
     }
 
@@ -360,7 +384,8 @@
     }
 
     public boolean hasKeepEverythingSynced() {
-        return nativeHasKeepEverythingSynced(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().hasKeepEverythingSynced(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -372,20 +397,24 @@
      *                       syncEverything is true.
      */
     public void setChosenDataTypes(boolean syncEverything, Set<Integer> enabledTypes) {
-        nativeSetChosenDataTypes(mNativeProfileSyncServiceAndroid, syncEverything,
+        ProfileSyncServiceJni.get().setChosenDataTypes(mNativeProfileSyncServiceAndroid,
+                ProfileSyncService.this, syncEverything,
                 syncEverything ? ALL_SELECTABLE_TYPES : modelTypeSetToArray(enabledTypes));
     }
 
     public void triggerRefresh() {
-        nativeTriggerRefresh(mNativeProfileSyncServiceAndroid);
+        ProfileSyncServiceJni.get().triggerRefresh(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public void setFirstSetupComplete(int syncFirstSetupCompleteSource) {
-        nativeSetFirstSetupComplete(mNativeProfileSyncServiceAndroid, syncFirstSetupCompleteSource);
+        ProfileSyncServiceJni.get().setFirstSetupComplete(mNativeProfileSyncServiceAndroid,
+                ProfileSyncService.this, syncFirstSetupCompleteSource);
     }
 
     public boolean isFirstSetupComplete() {
-        return nativeIsFirstSetupComplete(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isFirstSetupComplete(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -396,7 +425,8 @@
      * @return true if the user wants to sync, false otherwise.
      */
     public boolean isSyncRequested() {
-        return nativeIsSyncRequested(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isSyncRequested(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -407,7 +437,8 @@
      * @return true if Sync can start, false otherwise.
      */
     public boolean canSyncFeatureStart() {
-        return nativeCanSyncFeatureStart(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().canSyncFeatureStart(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -417,7 +448,8 @@
      * @return true if Sync is active, false otherwise.
      */
     public boolean isSyncActive() {
-        return nativeIsSyncActive(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isSyncActive(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -427,7 +459,8 @@
      * @return true if Sync is disabled, false otherwise.
      */
     public boolean isSyncDisabledByEnterprisePolicy() {
-        return nativeIsSyncDisabledByEnterprisePolicy(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isSyncDisabledByEnterprisePolicy(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -476,7 +509,8 @@
     }
 
     private void setSetupInProgress(boolean inProgress) {
-        nativeSetSetupInProgress(mNativeProfileSyncServiceAndroid, inProgress);
+        ProfileSyncServiceJni.get().setSetupInProgress(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, inProgress);
     }
 
     public void addSyncStateChangedListener(SyncStateChangedListener listener) {
@@ -490,7 +524,8 @@
     }
 
     public boolean hasUnrecoverableError() {
-        return nativeHasUnrecoverableError(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().hasUnrecoverableError(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -508,25 +543,29 @@
      * Starts the sync engine.
      */
     public void requestStart() {
-        nativeRequestStart(mNativeProfileSyncServiceAndroid);
+        ProfileSyncServiceJni.get().requestStart(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
      * Stops the sync engine.
      */
     public void requestStop() {
-        nativeRequestStop(mNativeProfileSyncServiceAndroid);
+        ProfileSyncServiceJni.get().requestStop(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     public void setSyncAllowedByPlatform(boolean allowed) {
-        nativeSetSyncAllowedByPlatform(mNativeProfileSyncServiceAndroid, allowed);
+        ProfileSyncServiceJni.get().setSyncAllowedByPlatform(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, allowed);
     }
 
     /**
      * Flushes the sync directory.
      */
     public void flushDirectory() {
-        nativeFlushDirectory(mNativeProfileSyncServiceAndroid);
+        ProfileSyncServiceJni.get().flushDirectory(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -537,7 +576,8 @@
      */
     @VisibleForTesting
     public long getLastSyncedTimeForTest() {
-        return nativeGetLastSyncedTimeForTest(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().getLastSyncedTimeForTest(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -550,7 +590,8 @@
      */
     @VisibleForTesting
     public void overrideNetworkResourcesForTest(long networkResources) {
-        nativeOverrideNetworkResourcesForTest(mNativeProfileSyncServiceAndroid, networkResources);
+        ProfileSyncServiceJni.get().overrideNetworkResourcesForTest(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, networkResources);
     }
 
     /**
@@ -562,7 +603,8 @@
      * @return Whether client has prompted for a passphrase error previously.
      */
     public boolean isPassphrasePrompted() {
-        return nativeIsPassphrasePrompted(mNativeProfileSyncServiceAndroid);
+        return ProfileSyncServiceJni.get().isPassphrasePrompted(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this);
     }
 
     /**
@@ -574,8 +616,8 @@
      * @param prompted whether the client has prompted the user previously.
      */
     public void setPassphrasePrompted(boolean prompted) {
-        nativeSetPassphrasePrompted(mNativeProfileSyncServiceAndroid,
-                                    prompted);
+        ProfileSyncServiceJni.get().setPassphrasePrompted(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, prompted);
     }
 
     /**
@@ -616,66 +658,87 @@
      */
     @VisibleForTesting
     public void getAllNodes(GetAllNodesCallback callback) {
-        nativeGetAllNodes(mNativeProfileSyncServiceAndroid, callback);
+        ProfileSyncServiceJni.get().getAllNodes(
+                mNativeProfileSyncServiceAndroid, ProfileSyncService.this, callback);
     }
 
-    // Native methods
-    private native long nativeInit();
-    private native void nativeRequestStart(long nativeProfileSyncServiceAndroid);
-    private native void nativeRequestStop(long nativeProfileSyncServiceAndroid);
-    private native void nativeSetSyncAllowedByPlatform(
-            long nativeProfileSyncServiceAndroid, boolean allowed);
-    private native void nativeFlushDirectory(long nativeProfileSyncServiceAndroid);
-    private native void nativeSetSyncSessionsId(long nativeProfileSyncServiceAndroid, String tag);
-    private native int nativeGetAuthError(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeRequiresClientUpgrade(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsEngineInitialized(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsEncryptEverythingAllowed(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsEncryptEverythingEnabled(long nativeProfileSyncServiceAndroid);
-    private native void nativeEnableEncryptEverything(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsPassphraseRequiredForDecryption(
-            long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsUsingSecondaryPassphrase(long nativeProfileSyncServiceAndroid);
+    @NativeMethods
+    interface Natives {
+        long init(ProfileSyncService caller);
 
-    private native boolean nativeSetDecryptionPassphrase(
-            long nativeProfileSyncServiceAndroid, String passphrase);
-    private native void nativeSetEncryptionPassphrase(
-            long nativeProfileSyncServiceAndroid, String passphrase);
-    private native int nativeGetPassphraseType(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeHasExplicitPassphraseTime(long nativeProfileSyncServiceAndroid);
-    private native long nativeGetExplicitPassphraseTime(long nativeProfileSyncServiceAndroid);
-    private native String nativeGetSyncEnterGooglePassphraseBodyWithDateText(
-            long nativeProfileSyncServiceAndroid);
-    private native String nativeGetSyncEnterCustomPassphraseBodyWithDateText(
-            long nativeProfileSyncServiceAndroid);
-    private native String nativeGetCurrentSignedInAccountText(long nativeProfileSyncServiceAndroid);
-    private native String nativeGetSyncEnterCustomPassphraseBodyText(
-            long nativeProfileSyncServiceAndroid);
-    private native int nativeGetNumberOfSyncedDevices(long nativeProfileSyncServiceAndroid);
-    private native int[] nativeGetActiveDataTypes(long nativeProfileSyncServiceAndroid);
-    private native int[] nativeGetChosenDataTypes(long nativeProfileSyncServiceAndroid);
-    private native int[] nativeGetPreferredDataTypes(long nativeProfileSyncServiceAndroid);
-    private native void nativeSetChosenDataTypes(
-            long nativeProfileSyncServiceAndroid, boolean syncEverything, int[] modelTypeArray);
-    private native void nativeTriggerRefresh(long nativeProfileSyncServiceAndroid);
-    private native void nativeSetSetupInProgress(
-            long nativeProfileSyncServiceAndroid, boolean inProgress);
-    private native void nativeSetFirstSetupComplete(
-            long nativeProfileSyncServiceAndroid, int syncFirstSetupCompleteSource);
-    private native boolean nativeIsFirstSetupComplete(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsSyncRequested(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeCanSyncFeatureStart(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsSyncActive(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsSyncDisabledByEnterprisePolicy(
-            long nativeProfileSyncServiceAndroid);
-    private native boolean nativeHasKeepEverythingSynced(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeHasUnrecoverableError(long nativeProfileSyncServiceAndroid);
-    private native boolean nativeIsPassphrasePrompted(long nativeProfileSyncServiceAndroid);
-    private native void nativeSetPassphrasePrompted(long nativeProfileSyncServiceAndroid,
-                                                    boolean prompted);
-    private native long nativeGetLastSyncedTimeForTest(long nativeProfileSyncServiceAndroid);
-    private native void nativeOverrideNetworkResourcesForTest(
-            long nativeProfileSyncServiceAndroid, long networkResources);
-    private native void nativeGetAllNodes(
-            long nativeProfileSyncServiceAndroid, GetAllNodesCallback callback);
+        void requestStart(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void requestStop(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void setSyncAllowedByPlatform(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller, boolean allowed);
+        void flushDirectory(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void setSyncSessionsId(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller, String tag);
+        int getAuthError(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean requiresClientUpgrade(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isEngineInitialized(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isEncryptEverythingAllowed(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isEncryptEverythingEnabled(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void enableEncryptEverything(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isPassphraseRequiredForDecryption(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isUsingSecondaryPassphrase(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean setDecryptionPassphrase(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller, String passphrase);
+        void setEncryptionPassphrase(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller, String passphrase);
+        int getPassphraseType(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean hasExplicitPassphraseTime(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        long getExplicitPassphraseTime(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        String getSyncEnterGooglePassphraseBodyWithDateText(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        String getSyncEnterCustomPassphraseBodyWithDateText(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        String getCurrentSignedInAccountText(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        String getSyncEnterCustomPassphraseBodyText(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        int getNumberOfSyncedDevices(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        int[] getActiveDataTypes(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        int[] getChosenDataTypes(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        int[] getPreferredDataTypes(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void setChosenDataTypes(long nativeProfileSyncServiceAndroid, ProfileSyncService caller,
+                boolean syncEverything, int[] modelTypeArray);
+        void triggerRefresh(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void setSetupInProgress(long nativeProfileSyncServiceAndroid, ProfileSyncService caller,
+                boolean inProgress);
+        void setFirstSetupComplete(long nativeProfileSyncServiceAndroid, ProfileSyncService caller,
+                int syncFirstSetupCompleteSource);
+        boolean isFirstSetupComplete(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isSyncRequested(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean canSyncFeatureStart(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isSyncActive(long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isSyncDisabledByEnterprisePolicy(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean hasKeepEverythingSynced(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean hasUnrecoverableError(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        boolean isPassphrasePrompted(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void setPassphrasePrompted(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller, boolean prompted);
+        long getLastSyncedTimeForTest(
+                long nativeProfileSyncServiceAndroid, ProfileSyncService caller);
+        void overrideNetworkResourcesForTest(long nativeProfileSyncServiceAndroid,
+                ProfileSyncService caller, long networkResources);
+        void getAllNodes(long nativeProfileSyncServiceAndroid, ProfileSyncService caller,
+                GetAllNodesCallback callback);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
index 20d715f..a4b190a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.UserData;
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
@@ -115,7 +116,7 @@
             setExternalNavigationHandler(
                     mTab.getDelegateFactory().createExternalNavigationHandler(mTab));
         }
-        nativeAssociateWithWebContents(this, mWebContents);
+        InterceptNavigationDelegateImplJni.get().associateWithWebContents(this, mWebContents);
     }
 
     public boolean shouldIgnoreNewTab(String url, boolean incognito) {
@@ -346,7 +347,10 @@
         tab.getUserDataHost().setUserData(USER_DATA_KEY, delegate);
     }
 
-    private static native void nativeAssociateWithWebContents(
-            InterceptNavigationDelegateImpl nativeInterceptNavigationDelegateImpl,
-            WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        void associateWithWebContents(
+                InterceptNavigationDelegateImpl nativeInterceptNavigationDelegateImpl,
+                WebContents webContents);
+    }
 }
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 d0496ec..de9fe9a7 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
@@ -30,6 +30,7 @@
 import org.chromium.base.UserDataHost;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -406,7 +407,8 @@
     public int loadUrl(LoadUrlParams params) {
         try {
             TraceEvent.begin("Tab.loadUrl");
-            // TODO(tedchoc): When showing the android NTP, delay the call to nativeLoadUrl until
+            // TODO(tedchoc): When showing the android NTP, delay the call to TabJni.get().loadUrl
+            // until
             //                the android view has entirely rendered.
             if (!mIsNativePageCommitPending) {
                 mIsNativePageCommitPending = maybeShowNativePage(params.getUrl(), false);
@@ -425,7 +427,7 @@
 
             // We load the URL from the tab rather than directly from the ContentView so the tab has
             // a chance of using a prerenderer page is any.
-            int loadType = nativeLoadUrl(mNativeTabAndroid, params.getUrl(),
+            int loadType = TabJni.get().loadUrl(mNativeTabAndroid, Tab.this, params.getUrl(),
                     params.getInitiatorOrigin(), params.getVerbatimHeaders(), params.getPostData(),
                     params.getTransitionType(),
                     params.getReferrer() != null ? params.getReferrer().getUrl() : null,
@@ -467,7 +469,7 @@
      * Load the original image (uncompressed by spdy proxy) in this tab.
      */
     void loadOriginalImage() {
-        if (mNativeTabAndroid != 0) nativeLoadOriginalImage(mNativeTabAndroid);
+        if (mNativeTabAndroid != 0) TabJni.get().loadOriginalImage(mNativeTabAndroid, Tab.this);
     }
 
     /**
@@ -628,7 +630,7 @@
      */
     public Profile getProfile() {
         if (mNativeTabAndroid == 0) return null;
-        return nativeGetProfileAndroid(mNativeTabAndroid);
+        return TabJni.get().getProfileAndroid(mNativeTabAndroid, Tab.this);
     }
 
     /**
@@ -1017,10 +1019,10 @@
         // activity.
         maybeShowNativePage(getUrl(), true);
 
-        nativeAttachDetachedTab(mNativeTabAndroid);
+        TabJni.get().attachDetachedTab(mNativeTabAndroid, Tab.this);
 
         if (getWebContents() != null) {
-            nativeUpdateDelegates(mNativeTabAndroid, mWebContentsDelegate,
+            TabJni.get().updateDelegates(mNativeTabAndroid, Tab.this, mWebContentsDelegate,
                     new TabContextMenuPopulator(
                             mDelegateFactory.createContextMenuPopulator(this), this));
         }
@@ -1135,7 +1137,7 @@
      * TODO(dfalcantara): Make this function harder to access.
      */
     public void initializeNative() {
-        if (mNativeTabAndroid == 0) nativeInit();
+        if (mNativeTabAndroid == 0) TabJni.get().init(Tab.this);
         assert mNativeTabAndroid != 0;
         mIsInitialized = true;
     }
@@ -1182,8 +1184,8 @@
             mWebContentsDelegate = mDelegateFactory.createWebContentsDelegate(this);
 
             assert mNativeTabAndroid != 0;
-            nativeInitWebContents(mNativeTabAndroid, mIncognito, isDetached(), webContents,
-                    mSourceTabId, mWebContentsDelegate,
+            TabJni.get().initWebContents(mNativeTabAndroid, Tab.this, mIncognito, isDetached(),
+                    webContents, mSourceTabId, mWebContentsDelegate,
                     new TabContextMenuPopulator(
                             mDelegateFactory.createContextMenuPopulator(this), this));
 
@@ -1273,7 +1275,7 @@
         // destroying the native tab cleanups up any remaining infobars. The infobar container
         // expects all infobars to be cleaned up before its own destruction.
         assert mNativeTabAndroid != 0;
-        nativeDestroy(mNativeTabAndroid);
+        TabJni.get().destroy(mNativeTabAndroid, Tab.this);
         assert mNativeTabAndroid == 0;
     }
 
@@ -1580,9 +1582,9 @@
         if (deleteNativeWebContents) {
             // Destruction of the native WebContents will call back into Java to destroy the Java
             // WebContents.
-            nativeDestroyWebContents(mNativeTabAndroid);
+            TabJni.get().destroyWebContents(mNativeTabAndroid, Tab.this);
         } else {
-            nativeReleaseWebContents(mNativeTabAndroid);
+            TabJni.get().releaseWebContents(mNativeTabAndroid, Tab.this);
             // Since the native WebContents is still alive, we need to clear its reference to the
             // Java WebContents. While doing so, it will also call back into Java to destroy the
             // Java WebContents.
@@ -1661,8 +1663,8 @@
         webContents.setSize(originalWidth, originalHeight);
 
         if (!bounds.isEmpty()) {
-            nativeOnPhysicalBackingSizeChanged(
-                    mNativeTabAndroid, webContents, bounds.right, bounds.bottom);
+            TabJni.get().onPhysicalBackingSizeChanged(
+                    mNativeTabAndroid, Tab.this, webContents, bounds.right, bounds.bottom);
         }
         webContents.onShow();
         initWebContents(webContents);
@@ -1740,7 +1742,7 @@
      */
     public void createHistoricalTab() {
         if (!isFrozen()) {
-            nativeCreateHistoricalTab(mNativeTabAndroid);
+            TabJni.get().createHistoricalTab(mNativeTabAndroid, Tab.this);
         } else if (mFrozenContentsState != null) {
             mFrozenContentsState.createHistoricalTab();
         }
@@ -1818,8 +1820,8 @@
      */
     void pushNativePageStateToNavigationEntry() {
         assert mNativeTabAndroid != 0 && getNativePage() != null;
-        nativeSetActiveNavigationEntryTitleForUrl(mNativeTabAndroid, getNativePage().getUrl(),
-                getNativePage().getTitle());
+        TabJni.get().setActiveNavigationEntryTitleForUrl(
+                mNativeTabAndroid, Tab.this, getNativePage().getUrl(), getNativePage().getTitle());
     }
 
     /**
@@ -1827,7 +1829,8 @@
      *         {@link #INVALID_BOOKMARK_ID} if no such bookmark exists.
      */
     public long getBookmarkId() {
-        return isFrozen() ? INVALID_BOOKMARK_ID : nativeGetBookmarkId(mNativeTabAndroid, false);
+        return isFrozen() ? INVALID_BOOKMARK_ID
+                          : TabJni.get().getBookmarkId(mNativeTabAndroid, Tab.this, false);
     }
 
     /**
@@ -1835,7 +1838,8 @@
      * that can't be edited by the user.
      */
     public long getUserBookmarkId() {
-        return isFrozen() ? INVALID_BOOKMARK_ID : nativeGetBookmarkId(mNativeTabAndroid, true);
+        return isFrozen() ? INVALID_BOOKMARK_ID
+                          : TabJni.get().getBookmarkId(mNativeTabAndroid, Tab.this, true);
     }
 
     /**
@@ -1856,7 +1860,7 @@
 
     @VisibleForTesting
     public boolean hasPrerenderedUrl(String url) {
-        return nativeHasPrerenderedUrl(mNativeTabAndroid, url);
+        return TabJni.get().hasPrerenderedUrl(mNativeTabAndroid, Tab.this, url);
     }
 
     /**
@@ -1908,32 +1912,36 @@
      * @return Whether input events from the renderer are ignored on the browser side.
      */
     public boolean areRendererInputEventsIgnored() {
-        return nativeAreRendererInputEventsIgnored(mNativeTabAndroid);
+        return TabJni.get().areRendererInputEventsIgnored(mNativeTabAndroid, Tab.this);
     }
 
-    private native void nativeInit();
-    private native void nativeDestroy(long nativeTabAndroid);
-    private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito,
-            boolean isBackgroundTab, WebContents webContents, int parentTabId,
-            TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator);
-    private native void nativeUpdateDelegates(long nativeTabAndroid,
-            TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator);
-    private native void nativeDestroyWebContents(long nativeTabAndroid);
-    private native void nativeReleaseWebContents(long nativeTabAndroid);
-    private native void nativeOnPhysicalBackingSizeChanged(
-            long nativeTabAndroid, WebContents webContents, int width, int height);
-    private native Profile nativeGetProfileAndroid(long nativeTabAndroid);
-    private native int nativeLoadUrl(long nativeTabAndroid, String url, String initiatorOrigin,
-            String extraHeaders, ResourceRequestBody postData, int transition, String referrerUrl,
-            int referrerPolicy, boolean isRendererInitiated, boolean shoulReplaceCurrentEntry,
-            boolean hasUserGesture, boolean shouldClearHistoryList, long inputStartTimestamp,
-            long intentReceivedTimestamp);
-    private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url,
-            String title);
-    private native void nativeCreateHistoricalTab(long nativeTabAndroid);
-    private native void nativeLoadOriginalImage(long nativeTabAndroid);
-    private native long nativeGetBookmarkId(long nativeTabAndroid, boolean onlyEditable);
-    private native boolean nativeHasPrerenderedUrl(long nativeTabAndroid, String url);
-    private native void nativeAttachDetachedTab(long nativeTabAndroid);
-    private native boolean nativeAreRendererInputEventsIgnored(long nativeTabAndroid);
+    @NativeMethods
+    interface Natives {
+        void init(Tab caller);
+        void destroy(long nativeTabAndroid, Tab caller);
+        void initWebContents(long nativeTabAndroid, Tab caller, boolean incognito,
+                boolean isBackgroundTab, WebContents webContents, int parentTabId,
+                TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator);
+        void updateDelegates(long nativeTabAndroid, Tab caller,
+                TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator);
+        void destroyWebContents(long nativeTabAndroid, Tab caller);
+        void releaseWebContents(long nativeTabAndroid, Tab caller);
+        void onPhysicalBackingSizeChanged(
+                long nativeTabAndroid, Tab caller, WebContents webContents, int width, int height);
+        Profile getProfileAndroid(long nativeTabAndroid, Tab caller);
+        int loadUrl(long nativeTabAndroid, Tab caller, String url, String initiatorOrigin,
+                String extraHeaders, ResourceRequestBody postData, int transition,
+                String referrerUrl, int referrerPolicy, boolean isRendererInitiated,
+                boolean shoulReplaceCurrentEntry, boolean hasUserGesture,
+                boolean shouldClearHistoryList, long inputStartTimestamp,
+                long intentReceivedTimestamp);
+        void setActiveNavigationEntryTitleForUrl(
+                long nativeTabAndroid, Tab caller, String url, String title);
+        void createHistoricalTab(long nativeTabAndroid, Tab caller);
+        void loadOriginalImage(long nativeTabAndroid, Tab caller);
+        long getBookmarkId(long nativeTabAndroid, Tab caller, boolean onlyEditable);
+        boolean hasPrerenderedUrl(long nativeTabAndroid, Tab caller, String url);
+        void attachDetachedTab(long nativeTabAndroid, Tab caller);
+        boolean areRendererInputEventsIgnored(long nativeTabAndroid, Tab caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java
index 43c0232..0ab2d52 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.tab;
 
 import org.chromium.base.ObserverList.RewindableIterator;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.ImeAdapter;
 import org.chromium.content_public.browser.ImeEventObserver;
 import org.chromium.content_public.browser.WebContents;
@@ -161,7 +162,10 @@
 
     @Override
     public void destroyInternal() {
-        if (mNativeTabBrowserControlsState != 0) nativeOnDestroyed(mNativeTabBrowserControlsState);
+        if (mNativeTabBrowserControlsState != 0) {
+            TabBrowserControlsStateJni.get().onDestroyed(
+                    mNativeTabBrowserControlsState, TabBrowserControlsState.this);
+        }
     }
 
     @Override
@@ -196,9 +200,12 @@
                         && current == BrowserControlsState.HIDDEN)) {
             return;
         }
-        if (mNativeTabBrowserControlsState == 0) mNativeTabBrowserControlsState = nativeInit();
-        nativeUpdateState(mNativeTabBrowserControlsState, mTab.getWebContents(), constraints,
-                current, animate);
+        if (mNativeTabBrowserControlsState == 0) {
+            mNativeTabBrowserControlsState =
+                    TabBrowserControlsStateJni.get().init(TabBrowserControlsState.this);
+        }
+        TabBrowserControlsStateJni.get().updateState(mNativeTabBrowserControlsState,
+                TabBrowserControlsState.this, mTab.getWebContents(), constraints, current, animate);
         if (constraints == mConstraints) return;
 
         mConstraints = constraints;
@@ -262,8 +269,11 @@
         updateEnabledState();
     }
 
-    private native long nativeInit();
-    private native void nativeOnDestroyed(long nativeTabBrowserControlsState);
-    private native void nativeUpdateState(long nativeTabBrowserControlsState,
-            WebContents webContents, int contraints, int current, boolean animate);
+    @NativeMethods
+    interface Natives {
+        long init(TabBrowserControlsState caller);
+        void onDestroyed(long nativeTabBrowserControlsState, TabBrowserControlsState caller);
+        void updateState(long nativeTabBrowserControlsState, TabBrowserControlsState caller,
+                WebContents webContents, int contraints, int current, boolean animate);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFavicon.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFavicon.java
index 7da72d75..78a2f3b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFavicon.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFavicon.java
@@ -9,6 +9,7 @@
 
 import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.content_public.browser.WebContents;
 
@@ -59,22 +60,22 @@
         Resources resources = tab.getThemedApplicationContext().getResources();
         mIdealFaviconSize = resources.getDimensionPixelSize(R.dimen.default_favicon_size);
         mTab = tab;
-        mNativeTabFavicon = nativeInit();
+        mNativeTabFavicon = TabFaviconJni.get().init(TabFavicon.this);
     }
 
     @Override
     public void initWebContents(WebContents webContents) {
-        nativeSetWebContents(mNativeTabFavicon, webContents);
+        TabFaviconJni.get().setWebContents(mNativeTabFavicon, TabFavicon.this, webContents);
     }
 
     @Override
     public void cleanupWebContents(WebContents webContents) {
-        nativeResetWebContents(mNativeTabFavicon);
+        TabFaviconJni.get().resetWebContents(mNativeTabFavicon, TabFavicon.this);
     }
 
     @Override
     public void destroyInternal() {
-        nativeOnDestroyed(mNativeTabFavicon);
+        TabFaviconJni.get().onDestroyed(mNativeTabFavicon, TabFavicon.this);
     }
 
     /**
@@ -90,7 +91,7 @@
             return mFavicon;
         }
 
-        return nativeGetFavicon(mNativeTabFavicon);
+        return TabFaviconJni.get().getFavicon(mNativeTabFavicon, TabFavicon.this);
     }
 
     /**
@@ -137,9 +138,12 @@
         while (observers.hasNext()) observers.next().onFaviconUpdated(mTab, icon);
     }
 
-    private native long nativeInit();
-    private native void nativeOnDestroyed(long nativeTabFavicon);
-    private native void nativeSetWebContents(long nativeTabFavicon, WebContents webContents);
-    private native void nativeResetWebContents(long nativeTabFavicon);
-    private native Bitmap nativeGetFavicon(long nativeTabFavicon);
+    @NativeMethods
+    interface Natives {
+        long init(TabFavicon caller);
+        void onDestroyed(long nativeTabFavicon, TabFavicon caller);
+        void setWebContents(long nativeTabFavicon, TabFavicon caller, WebContents webContents);
+        void resetWebContents(long nativeTabFavicon, TabFavicon caller);
+        Bitmap getFavicon(long nativeTabFavicon, TabFavicon caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabState.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabState.java
index 476a1b9..c592e4fb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabState.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabState.java
@@ -14,6 +14,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.StreamUtil;
 import org.chromium.base.VisibleForTesting;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeVersionInfo;
 import org.chromium.chrome.browser.crypto.CipherFactory;
 import org.chromium.chrome.browser.tabmodel.TabLaunchType;
@@ -50,7 +51,7 @@
 
     /**
      * Version number of the format used to save the WebContents navigation history, as returned by
-     * nativeGetContentsStateAsByteBuffer(). Version labels:
+     * TabStateJni.get().getContentsStateAsByteBuffer(). Version labels:
      *   0 - Chrome m18
      *   1 - Chrome m25
      *   2 - Chrome m26+
@@ -112,7 +113,7 @@
          * @return Pointer A WebContents object.
          */
         public WebContents restoreContentsFromByteBuffer(boolean isHidden) {
-            return nativeRestoreContentsFromByteBuffer(mBuffer, mVersion, isHidden);
+            return TabStateJni.get().restoreContentsFromByteBuffer(mBuffer, mVersion, isHidden);
         }
 
         /**
@@ -123,7 +124,8 @@
          */
         @Nullable
         public WebContentsState deleteNavigationEntries(long predicate) {
-            ByteBuffer newBuffer = nativeDeleteNavigationEntries(mBuffer, mVersion, predicate);
+            ByteBuffer newBuffer =
+                    TabStateJni.get().deleteNavigationEntries(mBuffer, mVersion, predicate);
             if (newBuffer == null) return null;
             WebContentsState newState = new TabState.WebContentsState(newBuffer);
             newState.setVersion(TabState.CONTENTS_STATE_CURRENT_VERSION);
@@ -135,7 +137,7 @@
          * deletes the WebContents.
          */
         public void createHistoricalTab() {
-            nativeCreateHistoricalTab(mBuffer, mVersion);
+            TabStateJni.get().createHistoricalTab(mBuffer, mVersion);
         }
     }
 
@@ -512,12 +514,14 @@
 
     /** @return Title currently being displayed in the saved state's current entry. */
     public String getDisplayTitleFromState() {
-        return nativeGetDisplayTitleFromByteBuffer(contentsState.buffer(), contentsState.version());
+        return TabStateJni.get().getDisplayTitleFromByteBuffer(
+                contentsState.buffer(), contentsState.version());
     }
 
     /** @return URL currently being displayed in the saved state's current entry. */
     public String getVirtualUrlFromState() {
-        return nativeGetVirtualUrlFromByteBuffer(contentsState.buffer(), contentsState.version());
+        return TabStateJni.get().getVirtualUrlFromByteBuffer(
+                contentsState.buffer(), contentsState.version());
     }
 
     /** @return Whether an incognito TabState was loaded by {@link #readState}. */
@@ -546,7 +550,7 @@
      */
     public static ByteBuffer createSingleNavigationStateAsByteBuffer(String url, String referrerUrl,
             int referrerPolicy, String initiatorOrigin, boolean isIncognito) {
-        return nativeCreateSingleNavigationStateAsByteBuffer(
+        return TabStateJni.get().createSingleNavigationStateAsByteBuffer(
                 url, referrerUrl, referrerPolicy, initiatorOrigin, isIncognito);
     }
 
@@ -556,7 +560,7 @@
      * @return ByteBuffer containing the state of the WebContents.
      */
     public static ByteBuffer getContentsStateAsByteBuffer(Tab tab) {
-        return nativeGetContentsStateAsByteBuffer(tab);
+        return TabStateJni.get().getContentsStateAsByteBuffer(tab);
     }
 
     /**
@@ -601,22 +605,16 @@
         sChannelNameOverrideForTest = name;
     }
 
-    private static native WebContents nativeRestoreContentsFromByteBuffer(
-            ByteBuffer buffer, int savedStateVersion, boolean initiallyHidden);
-
-    private static native ByteBuffer nativeGetContentsStateAsByteBuffer(Tab tab);
-
-    private static native ByteBuffer nativeDeleteNavigationEntries(
-            ByteBuffer state, int saveStateVersion, long predicate);
-
-    private static native ByteBuffer nativeCreateSingleNavigationStateAsByteBuffer(String url,
-            String referrerUrl, int referrerPolicy, String initiatorOrigin, boolean isIncognito);
-
-    private static native String nativeGetDisplayTitleFromByteBuffer(
-            ByteBuffer state, int savedStateVersion);
-
-    private static native String nativeGetVirtualUrlFromByteBuffer(
-            ByteBuffer state, int savedStateVersion);
-
-    private static native void nativeCreateHistoricalTab(ByteBuffer state, int savedStateVersion);
+    @NativeMethods
+    interface Natives {
+        WebContents restoreContentsFromByteBuffer(
+                ByteBuffer buffer, int savedStateVersion, boolean initiallyHidden);
+        ByteBuffer getContentsStateAsByteBuffer(Tab tab);
+        ByteBuffer deleteNavigationEntries(ByteBuffer state, int saveStateVersion, long predicate);
+        ByteBuffer createSingleNavigationStateAsByteBuffer(String url, String referrerUrl,
+                int referrerPolicy, String initiatorOrigin, boolean isIncognito);
+        String getDisplayTitleFromByteBuffer(ByteBuffer state, int savedStateVersion);
+        String getVirtualUrlFromByteBuffer(ByteBuffer state, int savedStateVersion);
+        void createHistoricalTab(ByteBuffer state, int savedStateVersion);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
index 62aadcc..2ee6c29 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
@@ -13,6 +13,7 @@
 import org.chromium.base.BuildInfo;
 import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.blink_public.platform.WebDisplayMode;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.findinpage.FindMatchRectsDetails;
@@ -177,7 +178,9 @@
     @Override
     public void rendererUnresponsive() {
         super.rendererUnresponsive();
-        if (mTab.getWebContents() != null) nativeOnRendererUnresponsive(mTab.getWebContents());
+        if (mTab.getWebContents() != null) {
+            TabWebContentsDelegateAndroidJni.get().onRendererUnresponsive(mTab.getWebContents());
+        }
         mTab.handleRendererResponsiveStateChanged(false);
     }
 
@@ -185,7 +188,9 @@
     @Override
     public void rendererResponsive() {
         super.rendererResponsive();
-        if (mTab.getWebContents() != null) nativeOnRendererResponsive(mTab.getWebContents());
+        if (mTab.getWebContents() != null) {
+            TabWebContentsDelegateAndroidJni.get().onRendererResponsive(mTab.getWebContents());
+        }
         mTab.handleRendererResponsiveStateChanged(true);
     }
 
@@ -240,7 +245,8 @@
     }
 
     public void showFramebustBlockInfobarForTesting(String url) {
-        nativeShowFramebustBlockInfoBar(mTab.getWebContents(), url);
+        TabWebContentsDelegateAndroidJni.get().showFramebustBlockInfoBar(
+                mTab.getWebContents(), url);
     }
 
     /**
@@ -278,7 +284,10 @@
         return null;
     }
 
-    private static native void nativeOnRendererUnresponsive(WebContents webContents);
-    private static native void nativeOnRendererResponsive(WebContents webContents);
-    private static native void nativeShowFramebustBlockInfoBar(WebContents webContents, String url);
+    @NativeMethods
+    interface Natives {
+        void onRendererUnresponsive(WebContents webContents);
+        void onRendererResponsive(WebContents webContents);
+        void showFramebustBlockInfoBar(WebContents webContents, String url);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
index a2e87b8..8ad8d855 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
@@ -7,6 +7,7 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ssl.SecurityStateModel;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
@@ -50,23 +51,23 @@
     private TrustedCdn(Tab tab) {
         super(tab);
         mTab = tab;
-        mNativeTrustedCdn = nativeInit();
+        mNativeTrustedCdn = TrustedCdnJni.get().init(TrustedCdn.this);
     }
 
     @Override
     public void initWebContents(WebContents webContents) {
-        nativeSetWebContents(mNativeTrustedCdn, webContents);
+        TrustedCdnJni.get().setWebContents(mNativeTrustedCdn, TrustedCdn.this, webContents);
     }
 
     @Override
     public void cleanupWebContents(WebContents webContents) {
-        nativeResetWebContents(mNativeTrustedCdn);
+        TrustedCdnJni.get().resetWebContents(mNativeTrustedCdn, TrustedCdn.this);
         mPublisherUrl = null;
     }
 
     @Override
     public void destroyInternal() {
-        nativeOnDestroyed(mNativeTrustedCdn);
+        TrustedCdnJni.get().onDestroyed(mNativeTrustedCdn, TrustedCdn.this);
     }
 
     @Nullable
@@ -87,8 +88,11 @@
         mPublisherUrl = url;
     }
 
-    private native long nativeInit();
-    private native void nativeOnDestroyed(long nativeTrustedCdn);
-    private native void nativeSetWebContents(long nativeTrustedCdn, WebContents webContents);
-    private native void nativeResetWebContents(long nativeTrustedCdn);
+    @NativeMethods
+    interface Natives {
+        long init(TrustedCdn caller);
+        void onDestroyed(long nativeTrustedCdn, TrustedCdn caller);
+        void setWebContents(long nativeTrustedCdn, TrustedCdn caller, WebContents webContents);
+        void resetWebContents(long nativeTrustedCdn, TrustedCdn caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java
index c9493fa..a624c58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java
@@ -7,6 +7,7 @@
 import android.os.SystemClock;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator;
@@ -44,7 +45,8 @@
     /** Initializes the native-side counterpart to this class. */
     protected void initializeNative() {
         assert mNativeTabModelJniBridge == 0;
-        mNativeTabModelJniBridge = nativeInit(mIsIncognito, mIsTabbedActivityForSync);
+        mNativeTabModelJniBridge = TabModelJniBridgeJni.get().init(
+                TabModelJniBridge.this, mIsIncognito, mIsTabbedActivityForSync);
     }
 
     /** @return Whether the native-side pointer has been initialized. */
@@ -56,7 +58,7 @@
     public void destroy() {
         if (isNativeInitialized()) {
             // This will invalidate all other native references to this object in child classes.
-            nativeDestroy(mNativeTabModelJniBridge);
+            TabModelJniBridgeJni.get().destroy(mNativeTabModelJniBridge, TabModelJniBridge.this);
             mNativeTabModelJniBridge = 0;
         }
     }
@@ -68,13 +70,15 @@
 
     @Override
     public Profile getProfile() {
-        return nativeGetProfileAndroid(mNativeTabModelJniBridge);
+        return TabModelJniBridgeJni.get().getProfileAndroid(
+                mNativeTabModelJniBridge, TabModelJniBridge.this);
     }
 
     /** Broadcast a native-side notification that all tabs are now loaded from storage. */
     public void broadcastSessionRestoreComplete() {
         assert isNativeInitialized();
-        nativeBroadcastSessionRestoreComplete(mNativeTabModelJniBridge);
+        TabModelJniBridgeJni.get().broadcastSessionRestoreComplete(
+                mNativeTabModelJniBridge, TabModelJniBridge.this);
     }
 
     /**
@@ -82,7 +86,10 @@
      * @param tab Tab being added to the model.
      */
     protected void tabAddedToModel(Tab tab) {
-        if (isNativeInitialized()) nativeTabAddedToModel(mNativeTabModelJniBridge, tab);
+        if (isNativeInitialized()) {
+            TabModelJniBridgeJni.get().tabAddedToModel(
+                    mNativeTabModelJniBridge, TabModelJniBridge.this, tab);
+        }
     }
 
     /**
@@ -204,28 +211,33 @@
         final long ms = SystemClock.uptimeMillis() - sTabSwitchStartTime;
         switch (sTabSelectionType) {
             case TabSelectionType.FROM_CLOSE:
-                nativeLogFromCloseMetric(ms, perceived);
+                TabModelJniBridgeJni.get().logFromCloseMetric(ms, perceived);
                 break;
             case TabSelectionType.FROM_EXIT:
-                nativeLogFromExitMetric(ms, perceived);
+                TabModelJniBridgeJni.get().logFromExitMetric(ms, perceived);
                 break;
             case TabSelectionType.FROM_NEW:
-                nativeLogFromNewMetric(ms, perceived);
+                TabModelJniBridgeJni.get().logFromNewMetric(ms, perceived);
                 break;
             case TabSelectionType.FROM_USER:
-                nativeLogFromUserMetric(ms, perceived);
+                TabModelJniBridgeJni.get().logFromUserMetric(ms, perceived);
                 break;
         }
     }
 
-    private native long nativeInit(boolean isIncognito, boolean isTabbedActivity);
-    private native Profile nativeGetProfileAndroid(long nativeTabModelJniBridge);
-    private native void nativeBroadcastSessionRestoreComplete(long nativeTabModelJniBridge);
-    private native void nativeDestroy(long nativeTabModelJniBridge);
-    private native void nativeTabAddedToModel(long nativeTabModelJniBridge, Tab tab);
-    // Native methods for tab switch latency metrics.
-    private static native void nativeLogFromCloseMetric(long ms, boolean perceived);
-    private static native void nativeLogFromExitMetric(long ms, boolean perceived);
-    private static native void nativeLogFromNewMetric(long ms, boolean perceived);
-    private static native void nativeLogFromUserMetric(long ms, boolean perceived);
+    @NativeMethods
+    interface Natives {
+        long init(TabModelJniBridge caller, boolean isIncognito, boolean isTabbedActivity);
+        Profile getProfileAndroid(long nativeTabModelJniBridge, TabModelJniBridge caller);
+        void broadcastSessionRestoreComplete(
+                long nativeTabModelJniBridge, TabModelJniBridge caller);
+        void destroy(long nativeTabModelJniBridge, TabModelJniBridge caller);
+        void tabAddedToModel(long nativeTabModelJniBridge, TabModelJniBridge caller, Tab tab);
+
+        // Methods for tab switch latency metrics.
+        void logFromCloseMetric(long ms, boolean perceived);
+        void logFromExitMetric(long ms, boolean perceived);
+        void logFromNewMetric(long ms, boolean perceived);
+        void logFromUserMetric(long ms, boolean perceived);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java
index 5daef68..e79fd09 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.tabmodel;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.tab.Tab;
 
 import java.util.List;
@@ -37,55 +38,64 @@
     @Override
     public final void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeDidSelectTab(mNativeTabModelObserverJniBridge, tab, type, lastId);
+        TabModelObserverJniBridgeJni.get().didSelectTab(mNativeTabModelObserverJniBridge,
+                TabModelObserverJniBridge.this, tab, type, lastId);
     }
 
     @Override
     public final void willCloseTab(Tab tab, boolean animate) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeWillCloseTab(mNativeTabModelObserverJniBridge, tab, animate);
+        TabModelObserverJniBridgeJni.get().willCloseTab(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab, animate);
     }
 
     @Override
     public final void didCloseTab(int tabId, boolean incognito) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeDidCloseTab(mNativeTabModelObserverJniBridge, tabId, incognito);
+        TabModelObserverJniBridgeJni.get().didCloseTab(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tabId, incognito);
     }
 
     @Override
     public final void willAddTab(Tab tab, @TabLaunchType int type) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeWillAddTab(mNativeTabModelObserverJniBridge, tab, type);
+        TabModelObserverJniBridgeJni.get().willAddTab(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab, type);
     }
 
     @Override
     public final void didAddTab(Tab tab, @TabLaunchType int type) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeDidAddTab(mNativeTabModelObserverJniBridge, tab, type);
+        TabModelObserverJniBridgeJni.get().didAddTab(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab, type);
     }
 
     @Override
     public final void didMoveTab(Tab tab, int newIndex, int curIndex) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeDidMoveTab(mNativeTabModelObserverJniBridge, tab, newIndex, curIndex);
+        TabModelObserverJniBridgeJni.get().didMoveTab(mNativeTabModelObserverJniBridge,
+                TabModelObserverJniBridge.this, tab, newIndex, curIndex);
     }
 
     @Override
     public final void tabPendingClosure(Tab tab) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeTabPendingClosure(mNativeTabModelObserverJniBridge, tab);
+        TabModelObserverJniBridgeJni.get().tabPendingClosure(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab);
     }
 
     @Override
     public final void tabClosureUndone(Tab tab) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeTabClosureUndone(mNativeTabModelObserverJniBridge, tab);
+        TabModelObserverJniBridgeJni.get().tabClosureUndone(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab);
     }
 
     @Override
     public final void tabClosureCommitted(Tab tab) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeTabClosureCommitted(mNativeTabModelObserverJniBridge, tab);
+        TabModelObserverJniBridgeJni.get().tabClosureCommitted(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab);
     }
 
     @Override
@@ -93,19 +103,22 @@
         // Convert the List to an array of objects. This makes the corresponding C++ code much
         // easier.
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeAllTabsPendingClosure(mNativeTabModelObserverJniBridge, tabs.toArray());
+        TabModelObserverJniBridgeJni.get().allTabsPendingClosure(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tabs.toArray());
     }
 
     @Override
     public final void allTabsClosureCommitted() {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeAllTabsClosureCommitted(mNativeTabModelObserverJniBridge);
+        TabModelObserverJniBridgeJni.get().allTabsClosureCommitted(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this);
     }
 
     @Override
     public final void tabRemoved(Tab tab) {
         assert mNativeTabModelObserverJniBridge != 0;
-        nativeTabRemoved(mNativeTabModelObserverJniBridge, tab);
+        TabModelObserverJniBridgeJni.get().tabRemoved(
+                mNativeTabModelObserverJniBridge, TabModelObserverJniBridge.this, tab);
     }
 
     @Override
@@ -120,7 +133,7 @@
      * @param tabModel The tab model to which the observer bridge will be associated.
      */
     @CalledByNative
-    static private TabModelObserverJniBridge create(
+    private static TabModelObserverJniBridge create(
             long nativeTabModelObserverJniBridge, TabModel tabModel) {
         TabModelObserverJniBridge bridge =
                 new TabModelObserverJniBridge(nativeTabModelObserverJniBridge, tabModel);
@@ -144,21 +157,32 @@
 
     // Native functions that are implemented by
     // browser/ui/android/tab_model/tab_model_observer_jni_bridge.*.
-    private native void nativeDidSelectTab(
-            long nativeTabModelObserverJniBridge, Tab tab, int type, int lastId);
-    private native void nativeWillCloseTab(
-            long nativeTabModelObserverJniBridge, Tab tab, boolean animate);
-    private native void nativeDidCloseTab(
-            long nativeTabModelObserverJniBridge, int tabId, boolean incognito);
-    private native void nativeWillAddTab(long nativeTabModelObserverJniBridge, Tab tab, int type);
-    private native void nativeDidAddTab(long nativeTabModelObserverJniBridge, Tab tab, int type);
-    private native void nativeDidMoveTab(
-            long nativeTabModelObserverJniBridge, Tab tab, int newIndex, int curIndex);
-    private native void nativeTabPendingClosure(long nativeTabModelObserverJniBridge, Tab tab);
-    private native void nativeTabClosureUndone(long nativeTabModelObserverJniBridge, Tab tab);
-    private native void nativeTabClosureCommitted(long nativeTabModelObserverJniBridge, Tab tab);
-    private native void nativeAllTabsPendingClosure(
-            long nativeTabModelObserverJniBridge, Object[] tabs);
-    private native void nativeAllTabsClosureCommitted(long nativeTabModelObserverJniBridge);
-    private native void nativeTabRemoved(long nativeTabModelObserverJniBridge, Tab tab);
+    @NativeMethods
+    interface Natives {
+        void didSelectTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                Tab tab, int type, int lastId);
+
+        void willCloseTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                Tab tab, boolean animate);
+        void didCloseTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                int tabId, boolean incognito);
+        void willAddTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                Tab tab, int type);
+        void didAddTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                Tab tab, int type);
+        void didMoveTab(long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller,
+                Tab tab, int newIndex, int curIndex);
+        void tabPendingClosure(
+                long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller, Tab tab);
+        void tabClosureUndone(
+                long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller, Tab tab);
+        void tabClosureCommitted(
+                long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller, Tab tab);
+        void allTabsPendingClosure(long nativeTabModelObserverJniBridge,
+                TabModelObserverJniBridge caller, Object[] tabs);
+        void allTabsClosureCommitted(
+                long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller);
+        void tabRemoved(
+                long nativeTabModelObserverJniBridge, TabModelObserverJniBridge caller, Tab tab);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
index 0e630773..e175584 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -14,6 +14,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
@@ -70,7 +71,7 @@
      * Handle any initialization that must occur after native has been initialized.
      */
     public void initializeWithNative() {
-        mNativeLocationBarModelAndroid = nativeInit();
+        mNativeLocationBarModelAndroid = LocationBarModelJni.get().init(LocationBarModel.this);
     }
 
     /**
@@ -78,7 +79,7 @@
      */
     public void destroy() {
         if (mNativeLocationBarModelAndroid == 0) return;
-        nativeDestroy(mNativeLocationBarModelAndroid);
+        LocationBarModelJni.get().destroy(mNativeLocationBarModelAndroid, LocationBarModel.this);
         mNativeLocationBarModelAndroid = 0;
     }
 
@@ -354,7 +355,8 @@
     @Override
     public int getPageClassification(boolean isFocusedFromFakebox) {
         if (mNativeLocationBarModelAndroid == 0) return 0;
-        return nativeGetPageClassification(mNativeLocationBarModelAndroid, isFocusedFromFakebox);
+        return LocationBarModelJni.get().getPageClassification(
+                mNativeLocationBarModelAndroid, LocationBarModel.this, isFocusedFromFakebox);
     }
 
     @Override
@@ -465,26 +467,32 @@
         if (mNativeLocationBarModelAndroid == 0) return null;
         if (mTab != null && !(mTab.getActivity() instanceof ChromeTabbedActivity)) return null;
         if (isPreview()) return null;
-        return nativeGetDisplaySearchTerms(mNativeLocationBarModelAndroid);
+        return LocationBarModelJni.get().getDisplaySearchTerms(
+                mNativeLocationBarModelAndroid, LocationBarModel.this);
     }
 
     /** @return The formatted URL suitable for editing. */
     public String getFormattedFullUrl() {
         if (mNativeLocationBarModelAndroid == 0) return "";
-        return nativeGetFormattedFullURL(mNativeLocationBarModelAndroid);
+        return LocationBarModelJni.get().getFormattedFullURL(
+                mNativeLocationBarModelAndroid, LocationBarModel.this);
     }
 
     /** @return The formatted URL suitable for display only. */
     public String getUrlForDisplay() {
         if (mNativeLocationBarModelAndroid == 0) return "";
-        return nativeGetURLForDisplay(mNativeLocationBarModelAndroid);
+        return LocationBarModelJni.get().getURLForDisplay(
+                mNativeLocationBarModelAndroid, LocationBarModel.this);
     }
 
-    private native long nativeInit();
-    private native void nativeDestroy(long nativeLocationBarModelAndroid);
-    private native String nativeGetFormattedFullURL(long nativeLocationBarModelAndroid);
-    private native String nativeGetURLForDisplay(long nativeLocationBarModelAndroid);
-    private native String nativeGetDisplaySearchTerms(long nativeLocationBarModelAndroid);
-    private native int nativeGetPageClassification(
-            long nativeLocationBarModelAndroid, boolean isFocusedFromFakebox);
+    @NativeMethods
+    interface Natives {
+        long init(LocationBarModel caller);
+        void destroy(long nativeLocationBarModelAndroid, LocationBarModel caller);
+        String getFormattedFullURL(long nativeLocationBarModelAndroid, LocationBarModel caller);
+        String getURLForDisplay(long nativeLocationBarModelAndroid, LocationBarModel caller);
+        String getDisplaySearchTerms(long nativeLocationBarModelAndroid, LocationBarModel caller);
+        int getPageClassification(long nativeLocationBarModelAndroid, LocationBarModel caller,
+                boolean isFocusedFromFakebox);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
index 1a11013..0ffe61b7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.translate;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content_public.browser.WebContents;
 
@@ -18,21 +19,21 @@
      * Translates the given tab when the necessary state has been computed (e.g. source language).
      */
     public static void translateTabWhenReady(Tab tab) {
-        nativeManualTranslateWhenReady(tab.getWebContents());
+        TranslateBridgeJni.get().manualTranslateWhenReady(tab.getWebContents());
     }
 
     /**
      * Returns true iff the current tab can be manually translated.
      */
     public static boolean canManuallyTranslate(Tab tab) {
-        return nativeCanManuallyTranslate(tab.getWebContents());
+        return TranslateBridgeJni.get().canManuallyTranslate(tab.getWebContents());
     }
 
     /**
      * Returns true iff we're in a state where the manual translate IPH could be shown.
      */
     public static boolean shouldShowManualTranslateIPH(Tab tab) {
-        return nativeShouldShowManualTranslateIPH(tab.getWebContents());
+        return TranslateBridgeJni.get().shouldShowManualTranslateIPH(tab.getWebContents());
     }
 
     /**
@@ -42,19 +43,19 @@
      * @param targetLanguage language code in ISO 639 format.
      */
     public static void setPredefinedTargetLanguage(Tab tab, String targetLanguage) {
-        nativeSetPredefinedTargetLanguage(tab.getWebContents(), targetLanguage);
+        TranslateBridgeJni.get().setPredefinedTargetLanguage(tab.getWebContents(), targetLanguage);
     }
 
     /**
      * @return The best target language based on what the Translate Service knows about the user.
      */
     public static String getTargetLanguage() {
-        return nativeGetTargetLanguage();
+        return TranslateBridgeJni.get().getTargetLanguage();
     }
 
     /** @return whether the given string is blocked for translation. */
     public static boolean isBlockedLanguage(String language) {
-        return nativeIsBlockedLanguage(language);
+        return TranslateBridgeJni.get().isBlockedLanguage(language);
     }
 
     /**
@@ -64,23 +65,28 @@
     public static LinkedHashSet<String> getModelLanguages() {
         LinkedHashSet<String> set = new LinkedHashSet<String>();
         // Calls back through addModelLanguageToSet repeatedly.
-        nativeGetModelLanguages(set);
+        TranslateBridgeJni.get().getModelLanguages(set);
         return set;
     }
 
-    /** Called by {@link #nativeGetModelLanguages} with the set to add to and the language to add.*/
+    /**
+     * Called by {@link #TranslateBridgeJni.get().getModelLanguages} with the set to add to and the
+     * language to add.
+     */
     @CalledByNative
     private static void addModelLanguageToSet(
             LinkedHashSet<String> languages, String languageCode) {
         languages.add(languageCode);
     }
 
-    private static native void nativeManualTranslateWhenReady(WebContents webContents);
-    private static native boolean nativeCanManuallyTranslate(WebContents webContents);
-    private static native boolean nativeShouldShowManualTranslateIPH(WebContents webContents);
-    private static native void nativeSetPredefinedTargetLanguage(
-            WebContents webContents, String targetLanguage);
-    private static native String nativeGetTargetLanguage();
-    private static native boolean nativeIsBlockedLanguage(String language);
-    private static native void nativeGetModelLanguages(LinkedHashSet<String> set);
+    @NativeMethods
+    interface Natives {
+        void manualTranslateWhenReady(WebContents webContents);
+        boolean canManuallyTranslate(WebContents webContents);
+        boolean shouldShowManualTranslateIPH(WebContents webContents);
+        void setPredefinedTargetLanguage(WebContents webContents, String targetLanguage);
+        String getTargetLanguage();
+        boolean isBlockedLanguage(String language);
+        void getModelLanguages(LinkedHashSet<String> set);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java
index 422dea5..c04d024 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java
@@ -7,6 +7,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.usage_stats.WebsiteEventProtos.WebsiteEvent;
 
@@ -33,20 +34,21 @@
      * @param profile {@link Profile} of the user for whom we are tracking usage stats.
      */
     public UsageStatsBridge(Profile profile, UsageStatsService usageStatsService) {
-        mNativeUsageStatsBridge = nativeInit(profile);
+        mNativeUsageStatsBridge = UsageStatsBridgeJni.get().init(UsageStatsBridge.this, profile);
         mUsageStatsService = usageStatsService;
     }
 
     /** Cleans up native side of this bridge. */
     public void destroy() {
         assert mNativeUsageStatsBridge != 0;
-        nativeDestroy(mNativeUsageStatsBridge);
+        UsageStatsBridgeJni.get().destroy(mNativeUsageStatsBridge, UsageStatsBridge.this);
         mNativeUsageStatsBridge = 0;
     }
 
     public void getAllEvents(Callback<List<WebsiteEvent>> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeGetAllEvents(mNativeUsageStatsBridge, callback);
+        UsageStatsBridgeJni.get().getAllEvents(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, callback);
     }
 
     public void queryEventsInRange(
@@ -54,7 +56,8 @@
         assert mNativeUsageStatsBridge != 0;
         long startSeconds = TimeUnit.MILLISECONDS.toSeconds(startMs);
         long endSeconds = TimeUnit.MILLISECONDS.toSeconds(endMs);
-        nativeQueryEventsInRange(mNativeUsageStatsBridge, startSeconds, endSeconds, callback);
+        UsageStatsBridgeJni.get().queryEventsInRange(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, startSeconds, endSeconds, callback);
     }
 
     public void addEvents(List<WebsiteEvent> events, Callback<Boolean> callback) {
@@ -67,40 +70,46 @@
             serializedEvents[i] = event.toByteArray();
         }
 
-        nativeAddEvents(mNativeUsageStatsBridge, serializedEvents, callback);
+        UsageStatsBridgeJni.get().addEvents(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, serializedEvents, callback);
     }
 
     public void deleteAllEvents(Callback<Boolean> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeDeleteAllEvents(mNativeUsageStatsBridge, callback);
+        UsageStatsBridgeJni.get().deleteAllEvents(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, callback);
     }
 
     public void deleteEventsInRange(long startMs, long endMs, Callback<Boolean> callback) {
         assert mNativeUsageStatsBridge != 0;
         long startSeconds = TimeUnit.MILLISECONDS.toSeconds(startMs);
         long endSeconds = TimeUnit.MILLISECONDS.toSeconds(endMs);
-        nativeDeleteEventsInRange(mNativeUsageStatsBridge, startSeconds, endSeconds, callback);
+        UsageStatsBridgeJni.get().deleteEventsInRange(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, startSeconds, endSeconds, callback);
     }
 
     public void deleteEventsWithMatchingDomains(String[] domains, Callback<Boolean> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeDeleteEventsWithMatchingDomains(mNativeUsageStatsBridge, domains, callback);
+        UsageStatsBridgeJni.get().deleteEventsWithMatchingDomains(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, domains, callback);
     }
 
     public void getAllSuspensions(Callback<List<String>> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeGetAllSuspensions(mNativeUsageStatsBridge,
+        UsageStatsBridgeJni.get().getAllSuspensions(mNativeUsageStatsBridge, UsageStatsBridge.this,
                 arr -> { callback.onResult(new ArrayList<>(Arrays.asList(arr))); });
     }
 
     public void setSuspensions(String[] domains, Callback<Boolean> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeSetSuspensions(mNativeUsageStatsBridge, domains, callback);
+        UsageStatsBridgeJni.get().setSuspensions(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, domains, callback);
     }
 
     public void getAllTokenMappings(Callback<Map<String, String>> callback) {
         assert mNativeUsageStatsBridge != 0;
-        nativeGetAllTokenMappings(mNativeUsageStatsBridge, callback);
+        UsageStatsBridgeJni.get().getAllTokenMappings(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, callback);
     }
 
     public void setTokenMappings(Map<String, String> mappings, Callback<Boolean> callback) {
@@ -118,7 +127,8 @@
             i++;
         }
 
-        nativeSetTokenMappings(mNativeUsageStatsBridge, tokens, fqdns, callback);
+        UsageStatsBridgeJni.get().setTokenMappings(
+                mNativeUsageStatsBridge, UsageStatsBridge.this, tokens, fqdns, callback);
     }
 
     @CalledByNative
@@ -165,26 +175,29 @@
         mUsageStatsService.onHistoryDeletedForDomains(new ArrayList<>(Arrays.asList(fqdns)));
     }
 
-    private native long nativeInit(Profile profile);
-    private native void nativeDestroy(long nativeUsageStatsBridge);
-    private native void nativeGetAllEvents(
-            long nativeUsageStatsBridge, Callback<List<WebsiteEvent>> callback);
-    private native void nativeQueryEventsInRange(long nativeUsageStatsBridge, long start, long end,
-            Callback<List<WebsiteEvent>> callback);
-    private native void nativeAddEvents(
-            long nativeUsageStatsBridge, byte[][] events, Callback<Boolean> callback);
-    private native void nativeDeleteAllEvents(
-            long nativeUsageStatsBridge, Callback<Boolean> callback);
-    private native void nativeDeleteEventsInRange(
-            long nativeUsageStatsBridge, long start, long end, Callback<Boolean> callback);
-    private native void nativeDeleteEventsWithMatchingDomains(
-            long nativeUsageStatsBridge, String[] domains, Callback<Boolean> callback);
-    private native void nativeGetAllSuspensions(
-            long nativeUsageStatsBridge, Callback<String[]> callback);
-    private native void nativeSetSuspensions(
-            long nativeUsageStatsBridge, String[] domains, Callback<Boolean> callback);
-    private native void nativeGetAllTokenMappings(
-            long nativeUsageStatsBridge, Callback<Map<String, String>> callback);
-    private native void nativeSetTokenMappings(long nativeUsageStatsBridge, String[] tokens,
-            String[] fqdns, Callback<Boolean> callback);
+    @NativeMethods
+    interface Natives {
+        long init(UsageStatsBridge caller, Profile profile);
+        void destroy(long nativeUsageStatsBridge, UsageStatsBridge caller);
+        void getAllEvents(long nativeUsageStatsBridge, UsageStatsBridge caller,
+                Callback<List<WebsiteEvent>> callback);
+        void queryEventsInRange(long nativeUsageStatsBridge, UsageStatsBridge caller, long start,
+                long end, Callback<List<WebsiteEvent>> callback);
+        void addEvents(long nativeUsageStatsBridge, UsageStatsBridge caller, byte[][] events,
+                Callback<Boolean> callback);
+        void deleteAllEvents(
+                long nativeUsageStatsBridge, UsageStatsBridge caller, Callback<Boolean> callback);
+        void deleteEventsInRange(long nativeUsageStatsBridge, UsageStatsBridge caller, long start,
+                long end, Callback<Boolean> callback);
+        void deleteEventsWithMatchingDomains(long nativeUsageStatsBridge, UsageStatsBridge caller,
+                String[] domains, Callback<Boolean> callback);
+        void getAllSuspensions(
+                long nativeUsageStatsBridge, UsageStatsBridge caller, Callback<String[]> callback);
+        void setSuspensions(long nativeUsageStatsBridge, UsageStatsBridge caller, String[] domains,
+                Callback<Boolean> callback);
+        void getAllTokenMappings(long nativeUsageStatsBridge, UsageStatsBridge caller,
+                Callback<Map<String, String>> callback);
+        void setTokenMappings(long nativeUsageStatsBridge, UsageStatsBridge caller, String[] tokens,
+                String[] fqdns, Callback<Boolean> callback);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
index 88a98db..c4490d4e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -26,6 +26,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -153,7 +154,7 @@
      * @param visible Whether a custom tab is visible.
      */
     public static void setCustomTabVisible(boolean visible) {
-        nativeSetCustomTabVisible(visible);
+        FeatureUtilitiesJni.get().setCustomTabVisible(visible);
     }
 
     /**
@@ -161,7 +162,7 @@
      * @param isInMultiWindowMode Whether the activity is in Android N multi-window mode.
      */
     public static void setIsInMultiWindowMode(boolean isInMultiWindowMode) {
-        nativeSetIsInMultiWindowMode(isInMultiWindowMode);
+        FeatureUtilitiesJni.get().setIsInMultiWindowMode(isInMultiWindowMode);
     }
 
     /**
@@ -648,7 +649,7 @@
     private static void cacheNetworkServiceWarmUpEnabled() {
         ChromePreferenceManager.getInstance().writeBoolean(
                 ChromePreferenceManager.NETWORK_SERVICE_WARM_UP_ENABLED_KEY,
-                nativeIsNetworkServiceWarmUpEnabled());
+                FeatureUtilitiesJni.get().isNetworkServiceWarmUpEnabled());
     }
 
     /**
@@ -786,7 +787,10 @@
         }
     }
 
-    private static native void nativeSetCustomTabVisible(boolean visible);
-    private static native void nativeSetIsInMultiWindowMode(boolean isInMultiWindowMode);
-    private static native boolean nativeIsNetworkServiceWarmUpEnabled();
+    @NativeMethods
+    interface Natives {
+        void setCustomTabVisible(boolean visible);
+        void setIsInMultiWindowMode(boolean isInMultiWindowMode);
+        boolean isNetworkServiceWarmUpEnabled();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
index 4721855..512cc6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
@@ -15,6 +15,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.tab.Tab;
 
 /**
@@ -76,20 +77,23 @@
     public void onDrawingSurfaceReady(Surface surface, int rotation, int width, int height) {
         if (DEBUG_LOGS) Log.i(TAG, "onDrawingSurfaceReady");
         if (mNativeArCoreJavaUtils == 0) return;
-        nativeOnDrawingSurfaceReady(mNativeArCoreJavaUtils, surface, rotation, width, height);
+        ArCoreJavaUtilsJni.get().onDrawingSurfaceReady(
+                mNativeArCoreJavaUtils, ArCoreJavaUtils.this, surface, rotation, width, height);
     }
 
     public void onDrawingSurfaceTouch(boolean isTouching, float x, float y) {
         if (DEBUG_LOGS) Log.i(TAG, "onDrawingSurfaceTouch");
         if (mNativeArCoreJavaUtils == 0) return;
-        nativeOnDrawingSurfaceTouch(mNativeArCoreJavaUtils, isTouching, x, y);
+        ArCoreJavaUtilsJni.get().onDrawingSurfaceTouch(
+                mNativeArCoreJavaUtils, ArCoreJavaUtils.this, isTouching, x, y);
     }
 
     public void onDrawingSurfaceDestroyed() {
         if (DEBUG_LOGS) Log.i(TAG, "onDrawingSurfaceDestroyed");
         if (mNativeArCoreJavaUtils == 0) return;
         mArImmersiveOverlay = null;
-        nativeOnDrawingSurfaceDestroyed(mNativeArCoreJavaUtils);
+        ArCoreJavaUtilsJni.get().onDrawingSurfaceDestroyed(
+                mNativeArCoreJavaUtils, ArCoreJavaUtils.this);
     }
 
     @CalledByNative
@@ -97,9 +101,12 @@
         mNativeArCoreJavaUtils = 0;
     }
 
-    private native void nativeOnDrawingSurfaceReady(
-            long nativeArCoreJavaUtils, Surface surface, int rotation, int width, int height);
-    private native void nativeOnDrawingSurfaceTouch(
-            long nativeArCoreJavaUtils, boolean touching, float x, float y);
-    private native void nativeOnDrawingSurfaceDestroyed(long nativeArCoreJavaUtils);
+    @NativeMethods
+    interface Natives {
+        void onDrawingSurfaceReady(long nativeArCoreJavaUtils, ArCoreJavaUtils caller,
+                Surface surface, int rotation, int width, int height);
+        void onDrawingSurfaceTouch(long nativeArCoreJavaUtils, ArCoreJavaUtils caller,
+                boolean touching, float x, float y);
+        void onDrawingSurfaceDestroyed(long nativeArCoreJavaUtils, ArCoreJavaUtils caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
index 5f34856..dbd2c1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
@@ -10,6 +10,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.PackageUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.metrics.WebApkUma;
@@ -94,7 +95,8 @@
 
     private void notify(@WebApkInstallResult int result) {
         if (mNativePointer != 0) {
-            nativeOnInstallFinished(mNativePointer, result);
+            WebApkInstallerJni.get().onInstallFinished(
+                    mNativePointer, WebApkInstaller.this, result);
         }
     }
 
@@ -140,7 +142,8 @@
 
             @Override
             protected void onPostExecute(Integer result) {
-                nativeOnGotSpaceStatus(mNativePointer, result);
+                WebApkInstallerJni.get().onGotSpaceStatus(
+                        mNativePointer, WebApkInstaller.this, result);
             }
         }
                 .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
@@ -150,7 +153,10 @@
         return PackageUtils.isPackageInstalled(ContextUtils.getApplicationContext(), packageName);
     }
 
-    private native void nativeOnInstallFinished(
-            long nativeWebApkInstaller, @WebApkInstallResult int result);
-    private native void nativeOnGotSpaceStatus(long nativeWebApkInstaller, int status);
+    @NativeMethods
+    interface Natives {
+        void onInstallFinished(long nativeWebApkInstaller, WebApkInstaller caller,
+                @WebApkInstallResult int result);
+        void onGotSpaceStatus(long nativeWebApkInstaller, WebApkInstaller caller, int status);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
index 705b1c1..38d8cbd5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 package org.chromium.chrome.browser.webapps;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * A class to record User Keyed Metrics relevant to WebAPKs. This
@@ -15,7 +16,8 @@
      */
     public static void recordWebApkSessionDuration(String manifestUrl,
             @WebApkDistributor int distributor, int versionCode, long duration) {
-        nativeRecordSessionDuration(manifestUrl, distributor, versionCode, duration);
+        WebApkUkmRecorderJni.get().recordSessionDuration(
+                manifestUrl, distributor, versionCode, duration);
     }
 
     /**
@@ -23,11 +25,13 @@
      */
     public static void recordWebApkLaunch(
             String manifestUrl, @WebApkDistributor int distributor, int versionCode, int source) {
-        nativeRecordVisit(manifestUrl, distributor, versionCode, source);
+        WebApkUkmRecorderJni.get().recordVisit(manifestUrl, distributor, versionCode, source);
     }
 
-    private static native void nativeRecordSessionDuration(
-            String manifestUrl, int distributor, int versionCode, long duration);
-    private static native void nativeRecordVisit(
-            String manifestUrl, int distributor, int versionCode, int source);
+    @NativeMethods
+    interface Natives {
+        void recordSessionDuration(
+                String manifestUrl, int distributor, int versionCode, long duration);
+        void recordVisit(String manifestUrl, int distributor, int versionCode, int source);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
index 3624408..affa42cd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
@@ -10,6 +10,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.blink_public.platform.WebDisplayMode;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
@@ -62,8 +63,10 @@
         mObserver = observer;
 
         mTab.addObserver(this);
-        mNativePointer = nativeInitialize(mOldInfo.scopeUrl(), mOldInfo.manifestUrl());
-        nativeStart(mNativePointer, mTab.getWebContents());
+        mNativePointer = WebApkUpdateDataFetcherJni.get().initialize(
+                WebApkUpdateDataFetcher.this, mOldInfo.scopeUrl(), mOldInfo.manifestUrl());
+        WebApkUpdateDataFetcherJni.get().start(
+                mNativePointer, WebApkUpdateDataFetcher.this, mTab.getWebContents());
         return true;
     }
 
@@ -72,7 +75,7 @@
      */
     public void destroy() {
         mTab.removeObserver(this);
-        nativeDestroy(mNativePointer);
+        WebApkUpdateDataFetcherJni.get().destroy(mNativePointer, WebApkUpdateDataFetcher.this);
         mNativePointer = 0;
     }
 
@@ -91,7 +94,8 @@
      * Updates which WebContents the native WebApkUpdateDataFetcher is monitoring.
      */
     private void updatePointers() {
-        nativeReplaceWebContents(mNativePointer, mTab.getWebContents());
+        WebApkUpdateDataFetcherJni.get().replaceWebContents(
+                mNativePointer, WebApkUpdateDataFetcher.this, mTab.getWebContents());
     }
 
     /**
@@ -138,9 +142,13 @@
         mObserver.onGotManifestData(info, primaryIconUrl, badgeIconUrl);
     }
 
-    private native long nativeInitialize(String scope, String webManifestUrl);
-    private native void nativeReplaceWebContents(
-            long nativeWebApkUpdateDataFetcher, WebContents webContents);
-    private native void nativeDestroy(long nativeWebApkUpdateDataFetcher);
-    private native void nativeStart(long nativeWebApkUpdateDataFetcher, WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        long initialize(WebApkUpdateDataFetcher caller, String scope, String webManifestUrl);
+        void replaceWebContents(long nativeWebApkUpdateDataFetcher, WebApkUpdateDataFetcher caller,
+                WebContents webContents);
+        void destroy(long nativeWebApkUpdateDataFetcher, WebApkUpdateDataFetcher caller);
+        void start(long nativeWebApkUpdateDataFetcher, WebApkUpdateDataFetcher caller,
+                WebContents webContents);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenManager.java
index 5fd3ed0..d82ef0c6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenManager.java
@@ -10,6 +10,7 @@
 import android.text.TextUtils;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content_public.browser.WebContents;
 
@@ -38,7 +39,8 @@
         // Don't start if we've already started or if there is no visible URL to add.
         if (mNativeAddToHomescreenManager != 0 || TextUtils.isEmpty(mTab.getUrl())) return;
 
-        mNativeAddToHomescreenManager = nativeInitializeAndStart(mTab.getWebContents());
+        mNativeAddToHomescreenManager = AddToHomescreenManagerJni.get().initializeAndStart(
+                AddToHomescreenManager.this, mTab.getWebContents());
     }
 
     /**
@@ -48,7 +50,8 @@
         mDialog = null;
         if (mNativeAddToHomescreenManager == 0) return;
 
-        nativeDestroy(mNativeAddToHomescreenManager);
+        AddToHomescreenManagerJni.get().destroy(
+                mNativeAddToHomescreenManager, AddToHomescreenManager.this);
         mNativeAddToHomescreenManager = 0;
     }
 
@@ -60,7 +63,8 @@
     public void addToHomescreen(String userRequestedTitle) {
         assert mNativeAddToHomescreenManager != 0;
 
-        nativeAddToHomescreen(mNativeAddToHomescreenManager, userRequestedTitle);
+        AddToHomescreenManagerJni.get().addToHomescreen(
+                mNativeAddToHomescreenManager, AddToHomescreenManager.this, userRequestedTitle);
     }
 
     @Override
@@ -103,8 +107,11 @@
         }
     }
 
-    private native long nativeInitializeAndStart(WebContents webContents);
-    private native void nativeAddToHomescreen(
-            long nativeAddToHomescreenManager, String userRequestedTitle);
-    private native void nativeDestroy(long nativeAddToHomescreenManager);
+    @NativeMethods
+    interface Natives {
+        long initializeAndStart(AddToHomescreenManager caller, WebContents webContents);
+        void addToHomescreen(long nativeAddToHomescreenManager, AddToHomescreenManager caller,
+                String userRequestedTitle);
+        void destroy(long nativeAddToHomescreenManager, AddToHomescreenManager caller);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ThumbnailGenerator.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ThumbnailGenerator.java
index 03fd0fa..561630a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ThumbnailGenerator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ThumbnailGenerator.java
@@ -13,6 +13,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * This class generates thumbnails for a given {@link ThumbnailRequest} by calling the native
@@ -27,7 +28,7 @@
 
     private long getNativeThumbnailGenerator() {
         if (mNativeThumbnailGenerator == 0) {
-            mNativeThumbnailGenerator = nativeInit();
+            mNativeThumbnailGenerator = ThumbnailGeneratorJni.get().init(ThumbnailGenerator.this);
         }
         return mNativeThumbnailGenerator;
     }
@@ -42,8 +43,9 @@
         ThreadUtils.assertOnUiThread();
         boolean hasFilePath = !TextUtils.isEmpty(request.getFilePath());
         assert hasFilePath;
-        nativeRetrieveThumbnail(getNativeThumbnailGenerator(), request.getContentId(),
-                request.getFilePath(), request.getMimeType(), request.getIconSize(), callback);
+        ThumbnailGeneratorJni.get().retrieveThumbnail(getNativeThumbnailGenerator(),
+                ThumbnailGenerator.this, request.getContentId(), request.getFilePath(),
+                request.getMimeType(), request.getIconSize(), callback);
     }
 
     /**
@@ -52,7 +54,7 @@
     public void destroy() {
         ThreadUtils.assertOnUiThread();
         if (mNativeThumbnailGenerator == 0) return;
-        nativeDestroy(mNativeThumbnailGenerator);
+        ThumbnailGeneratorJni.get().destroy(mNativeThumbnailGenerator, ThumbnailGenerator.this);
         mNativeThumbnailGenerator = 0;
     }
 
@@ -78,9 +80,12 @@
         callback.onThumbnailRetrieved(contentId, bitmap, requestedIconSizePx);
     }
 
-    private native long nativeInit();
-    private native void nativeDestroy(long nativeThumbnailGenerator);
-    private native void nativeRetrieveThumbnail(long nativeThumbnailGenerator, String contentId,
-            String filePath, String mimeType, int thumbnailSize,
-            ThumbnailGeneratorCallback callback);
+    @NativeMethods
+    interface Natives {
+        long init(ThumbnailGenerator caller);
+        void destroy(long nativeThumbnailGenerator, ThumbnailGenerator caller);
+        void retrieveThumbnail(long nativeThumbnailGenerator, ThumbnailGenerator caller,
+                String contentId, String filePath, String mimeType, int thumbnailSize,
+                ThumbnailGeneratorCallback callback);
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
index 4ead758..5d1bb88e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialogTest.java
@@ -22,6 +22,7 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -447,6 +448,7 @@
 
     @Test
     @LargeTest
+    @DisabledTest(message = "https://crbug.com/1004762")
     public void testPropertiesRequested() throws Throwable {
         // Create a dialog showing names only.
         createDialog(/* multiselect = */ false, /* includeNames = */ true,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
index 99ffc1a..91c1d1e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
@@ -71,7 +71,7 @@
         Assert.assertFalse(SyncTestUtil.isSyncRequested());
 
         // Signing back in should re-enable sync.
-        mSyncTestRule.signIn(account);
+        mSyncTestRule.signinAndEnableSync(account);
         SyncTestUtil.waitForSyncActive();
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
index a9cf7a5c..f66174ab 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
@@ -14,12 +14,15 @@
 import org.junit.runners.model.Statement;
 
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.identity.UniqueIdentificationGenerator;
 import org.chromium.chrome.browser.identity.UniqueIdentificationGeneratorFactory;
 import org.chromium.chrome.browser.identity.UuidBasedUniqueIdentificationGenerator;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
+import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.util.browser.signin.SigninTestUtil;
@@ -135,7 +138,7 @@
 
     public Account setUpTestAccountAndSignIn() {
         Account account = setUpTestAccount();
-        signIn(account);
+        signinAndEnableSync(account);
         return account;
     }
 
@@ -153,9 +156,24 @@
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
-    public void signIn(final Account account) {
+    public void signinAndEnableSync(final Account account) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            IdentityServicesProvider.getSigninManager().signIn(account, null, null);
+            IdentityServicesProvider.getSigninManager().signIn(
+                    account, null, new SigninManager.SignInCallback() {
+                        @Override
+                        public void onSignInComplete() {
+                            if (ChromeFeatureList.isEnabled(
+                                        ChromeFeatureList.SYNC_MANUAL_START_ANDROID)) {
+                                mProfileSyncService.setFirstSetupComplete(
+                                        SyncFirstSetupCompleteSource.BASIC_FLOW);
+                            }
+                        }
+
+                        @Override
+                        public void onSignInAborted() {
+                            Assert.fail("Sign-in was aborted");
+                        }
+                    });
             // Outside of tests, URL-keyed anonymized data collection is enabled by sign-in UI.
             UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled(true);
         });
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 63af61f..b1d0b3a 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2492,7 +2492,7 @@
       <message name="IDS_COOKIE_CONTROLS_TURN_ON_BUTTON" desc="Label shown on a button that turns cookie blocking on after it was disabled for a specific site.">
         Turn on
       </message>
-      <message name="IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON" desc="Label shown on a button that turns of cookie blocking for a specific site.">
+      <message name="IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON" desc="Label shown on a button that turns off cookie blocking for a specific site.">
         Turn off for this site
       </message>
       <message name="IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking. Shows the number of sites for which cookies have been blocked.">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 21d993e..c53e2e04 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -3905,13 +3905,13 @@
       Add account
     </message>
     <message name="IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION" desc="Description of the Account Manager Settings page. Shown just below the title of the page.">
-      Manage your signed-in Google Accounts. Websites, apps, and extensions in Chrome and Google Play may use these accounts to customize your experience, depending on permissions.
+      Manage your signed-in accounts. Websites, apps, and extensions in Chrome and Google Play may use these accounts to customize your experience, depending on permissions.
     </message>
     <message name="IDS_SETTINGS_ACCOUNT_MANAGER_LIST_HEADER" desc="List header for Account List in Account Manager Settings page.">
       Accounts
     </message>
     <message name="IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE" desc="Title of Account Manager Settings page.">
-      Google Accounts
+      My accounts
     </message>
     <message name="IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL" desc="Label of Account Manager submenu in Settings page.">
       Google Accounts
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION.png.sha1
index 12dbf1d..92056f5 100644
--- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION.png.sha1
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_DESCRIPTION.png.sha1
@@ -1 +1 @@
-13150cd24a0c5a68defce4422aa8c1bce98966d6
\ No newline at end of file
+822e36f9f65353e46f311c47143a3bbf9dcb6922
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE.png.sha1
new file mode 100644
index 0000000..77d4536
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ACCOUNT_MANAGER_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@
+d305b163282c69226376425c5cbe9ed103d566f2
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 2aaedda5..da6838f8 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4535,6 +4535,10 @@
      FEATURE_VALUE_TYPE(
          autofill::features::kAutofillAlwaysReturnCloudTokenizedCard)},
 
+    {"back-forward-cache", flag_descriptions::kBackForwardCacheName,
+     flag_descriptions::kBackForwardCacheDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kBackForwardCache)},
+
     // 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/vr/gvr_input_delegate.cc b/chrome/browser/android/vr/gvr_input_delegate.cc
index e6266e6b..91407a9 100644
--- a/chrome/browser/android/vr/gvr_input_delegate.cc
+++ b/chrome/browser/android/vr/gvr_input_delegate.cc
@@ -186,7 +186,7 @@
     controller_->GetRelativePointerTransform(&pointer);
     state->description->pointer_offset = pointer;
 
-    state->description->profiles.push_back("daydream-controller");
+    state->description->profiles.push_back("google-daydream");
 
     // This Gamepad data is used to expose touchpad position to WebXR.
     state->gamepad = CreateGamepad(controller_->GetGamepadData());
diff --git a/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc b/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc
index 0a8fc6ff..9dee48f 100644
--- a/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc
+++ b/chrome/browser/autofill/manual_filling_controller_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/optional.h"
+#include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
@@ -22,16 +23,15 @@
 #include "chrome/browser/autofill/mock_password_accessory_controller.h"
 #include "chrome/browser/password_manager/password_accessory_controller.h"
 #include "chrome/browser/password_manager/touch_to_fill_controller.h"
-#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/favicon/core/test/mock_favicon_service.h"
 #include "components/password_manager/core/common/password_manager_features.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_web_contents_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-// TODO(crbug/1004585) Crashes on Android
-#if !defined(OS_ANDROID)
-
 namespace {
 using autofill::AccessoryAction;
 using autofill::AccessorySheetData;
@@ -62,20 +62,16 @@
 
 }  // namespace
 
-class ManualFillingControllerTest : public ChromeRenderViewHostTestHarness {
+class ManualFillingControllerTest : public testing::Test {
  public:
   ManualFillingControllerTest() = default;
 
   void SetUp() override {
-    ChromeRenderViewHostTestHarness::SetUp();
-    NavigateAndCommit(GURL(kExampleSite));
-    touch_to_fill_controller_.emplace(web_contents());
     ManualFillingControllerImpl::CreateForWebContentsForTesting(
         web_contents(), favicon_service(), mock_pwd_controller_.AsWeakPtr(),
         mock_address_controller_.AsWeakPtr(), mock_cc_controller_.AsWeakPtr(),
-        touch_to_fill_controller_->AsWeakPtr(),
+        touch_to_fill_controller_.AsWeakPtr(),
         std::make_unique<NiceMock<MockManualFillingView>>());
-    NavigateAndCommit(GURL(kExampleSite));
   }
 
   void FocusFieldAndClearExpectations(FocusedFieldType fieldType) {
@@ -100,17 +96,24 @@
     return mock_favicon_service_.get();
   }
 
+  content::WebContents* web_contents() { return web_contents_; }
+
   MockManualFillingView* view() {
     return static_cast<MockManualFillingView*>(controller()->view());
   }
 
  protected:
+  content::BrowserTaskEnvironment task_environment_;
+  TestingProfile profile_;
+  content::TestWebContentsFactory web_contents_factory_;
+  content::WebContents* web_contents_ =
+      web_contents_factory_.CreateWebContents(&profile_);
+
   NiceMock<MockPasswordAccessoryController> mock_pwd_controller_;
   NiceMock<MockAddressAccessoryController> mock_address_controller_;
   NiceMock<MockCreditCardAccessoryController> mock_cc_controller_;
-  // Constructing a TouchToFillController needs a valid WebContents. Use a
-  // base::Optional to be able to delay the construction.
-  base::Optional<TouchToFillController> touch_to_fill_controller_;
+  TouchToFillController touch_to_fill_controller_{web_contents_};
+
   std::unique_ptr<StrictMock<favicon::MockFaviconService>>
       mock_favicon_service_ =
           std::make_unique<StrictMock<favicon::MockFaviconService>>();
@@ -349,5 +352,3 @@
 
   base::RunLoop().RunUntilIdle();
 }
-
-#endif  // !defined(OS_ANDROID)
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index caddacda..563aeb3 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1929,6 +1929,8 @@
     "printing/history/print_job_history_service.h",
     "printing/history/print_job_history_service_factory.cc",
     "printing/history/print_job_history_service_factory.h",
+    "printing/history/print_job_history_service_impl.cc",
+    "printing/history/print_job_history_service_impl.h",
     "printing/history/print_job_info_conversions.cc",
     "printing/history/print_job_info_conversions.h",
     "printing/ppd_provider_factory.cc",
@@ -2742,8 +2744,10 @@
     "printing/automatic_usb_printer_configurer_unittest.cc",
     "printing/bulk_printers_calculator_unittest.cc",
     "printing/cups_printers_manager_unittest.cc",
+    "printing/history/mock_print_job_history_service.cc",
+    "printing/history/mock_print_job_history_service.h",
     "printing/history/print_job_database_impl_unittest.cc",
-    "printing/history/print_job_history_service_unittest.cc",
+    "printing/history/print_job_history_service_impl_unittest.cc",
     "printing/history/print_job_info_conversions_unittest.cc",
     "printing/history/test_print_job_database.cc",
     "printing/history/test_print_job_database.h",
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 8e0f1d6..12d5ef29 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -71,19 +71,6 @@
   return chromeos::DBusThreadManager::Get()->GetConciergeClient();
 }
 
-void OnConciergeServiceAvailable(CrostiniManager::BoolCallback callback,
-                                 bool success) {
-  if (!success) {
-    LOG(ERROR) << "Concierge service did not become available";
-    std::move(callback).Run(success);
-    return;
-  }
-  VLOG(1) << "Concierge service announced availability";
-  VLOG(1) << "Waiting for Cicerone to announce availability.";
-
-  GetCiceroneClient()->WaitForServiceToBeAvailable(std::move(callback));
-}
-
 // Find any callbacks for the specified |vm_name|, invoke them with
 // |arguments|... and erase them from the map.
 template <typename... Parameters, typename... Arguments>
@@ -849,10 +836,9 @@
     return;
   }
   VLOG(1) << "Concierge service started";
-  VLOG(1) << "Waiting for Concierge to announce availability.";
+  VLOG(1) << "Waiting for Cicerone to announce availability.";
 
-  GetConciergeClient()->WaitForServiceToBeAvailable(
-      base::BindOnce(&OnConciergeServiceAvailable, std::move(callback)));
+  GetCiceroneClient()->WaitForServiceToBeAvailable(std::move(callback));
 }
 
 void CrostiniManager::StopConcierge(BoolCallback callback) {
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen.cc b/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
index cd8e527..4f7704d 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen.cc
@@ -486,8 +486,8 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   service_manager::Connector* connector = content::GetSystemConnector();
   DCHECK(connector);
-  connector->BindInterface(device::mojom::kServiceName,
-                           mojo::MakeRequest(&input_device_manager_));
+  connector->Connect(device::mojom::kServiceName,
+                     input_device_manager_.BindNewPipeAndPassReceiver());
 }
 
 void HIDDetectionScreen::OnGetInputDevicesListForCheck(
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen.h b/chrome/browser/chromeos/login/screens/hid_detection_screen.h
index 3b9f79b..032465e18 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen.h
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen.h
@@ -21,6 +21,7 @@
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_session.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/input_service.mojom.h"
 
 namespace chromeos {
@@ -198,7 +199,7 @@
   // Default bluetooth adapter, used for all operations.
   scoped_refptr<device::BluetoothAdapter> adapter_;
 
-  device::mojom::InputDeviceManagerPtr input_device_manager_;
+  mojo::Remote<device::mojom::InputDeviceManager> input_device_manager_;
 
   mojo::AssociatedBinding<device::mojom::InputDeviceManagerClient> binding_;
 
diff --git a/chrome/browser/chromeos/printing/history/mock_print_job_history_service.cc b/chrome/browser/chromeos/printing/history/mock_print_job_history_service.cc
new file mode 100644
index 0000000..054b578
--- /dev/null
+++ b/chrome/browser/chromeos/printing/history/mock_print_job_history_service.cc
@@ -0,0 +1,20 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/printing/history/mock_print_job_history_service.h"
+
+namespace chromeos {
+
+MockPrintJobHistoryService::MockPrintJobHistoryService() = default;
+
+MockPrintJobHistoryService::~MockPrintJobHistoryService() = default;
+
+void MockPrintJobHistoryService::SavePrintJobProto(
+    const printing::proto::PrintJobInfo& print_job_info) {
+  for (auto& observer : observers_) {
+    observer.OnPrintJobFinished(print_job_info);
+  }
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/mock_print_job_history_service.h b/chrome/browser/chromeos/printing/history/mock_print_job_history_service.h
new file mode 100644
index 0000000..8802e50
--- /dev/null
+++ b/chrome/browser/chromeos/printing/history/mock_print_job_history_service.h
@@ -0,0 +1,29 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_MOCK_PRINT_JOB_HISTORY_SERVICE_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_MOCK_PRINT_JOB_HISTORY_SERVICE_H_
+
+#include "base/callback.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace chromeos {
+
+class MockPrintJobHistoryService : public PrintJobHistoryService {
+ public:
+  MockPrintJobHistoryService();
+  ~MockPrintJobHistoryService() override;
+
+  void SavePrintJobProto(const printing::proto::PrintJobInfo& print_job_info);
+
+  MOCK_METHOD(void,
+              GetPrintJobs,
+              (PrintJobDatabase::GetPrintJobsCallback callback),
+              (override));
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_MOCK_PRINT_JOB_HISTORY_SERVICE_H_
diff --git a/chrome/browser/chromeos/printing/history/print_job_database.h b/chrome/browser/chromeos/printing/history/print_job_database.h
index 7d2f323b..6b7fb92 100644
--- a/chrome/browser/chromeos/printing/history/print_job_database.h
+++ b/chrome/browser/chromeos/printing/history/print_job_database.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_DATABASE_H_
 
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/callback_forward.h"
@@ -24,7 +25,7 @@
 
   using SavePrintJobCallback = base::OnceCallback<void(bool success)>;
 
-  using DeletePrintJobCallback = base::OnceCallback<void(bool success)>;
+  using DeletePrintJobsCallback = base::OnceCallback<void(bool success)>;
 
   using GetPrintJobsCallback = base::OnceCallback<void(
       bool success,
@@ -42,9 +43,9 @@
   virtual void SavePrintJob(const printing::proto::PrintJobInfo& print_job_info,
                             SavePrintJobCallback callback) = 0;
 
-  // Removes the print job associated with given |id| from the storage.
-  virtual void DeletePrintJob(const std::string& id,
-                              DeletePrintJobCallback callback) = 0;
+  // Removes the print jobs associated with given |ids| from the storage.
+  virtual void DeletePrintJobs(const std::vector<std::string>& ids,
+                               DeletePrintJobsCallback callback) = 0;
 
   // Retrieves all print jobs from the storage.
   virtual void GetPrintJobs(GetPrintJobsCallback callback) = 0;
diff --git a/chrome/browser/chromeos/printing/history/print_job_database_impl.cc b/chrome/browser/chromeos/printing/history/print_job_database_impl.cc
index 49f5728..b9330df 100644
--- a/chrome/browser/chromeos/printing/history/print_job_database_impl.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_database_impl.cc
@@ -30,7 +30,8 @@
 
 PrintJobDatabaseImpl::PrintJobDatabaseImpl(
     leveldb_proto::ProtoDatabaseProvider* database_provider,
-    base::FilePath profile_path) {
+    base::FilePath profile_path)
+    : init_status_(InitStatus::UNINITIALIZED) {
   auto print_job_database_path = profile_path.Append(kPrintJobDatabaseName);
 
   scoped_refptr<base::SequencedTaskRunner> database_task_runner =
@@ -45,23 +46,38 @@
 PrintJobDatabaseImpl::~PrintJobDatabaseImpl() {}
 
 void PrintJobDatabaseImpl::Initialize(InitializeCallback callback) {
+  if (init_status_ == InitStatus::PENDING)
+    return;
+  DCHECK_EQ(init_status_, InitStatus::UNINITIALIZED);
+  init_status_ = InitStatus::PENDING;
   database_->Init(base::BindOnce(&PrintJobDatabaseImpl::OnInitialized,
                                  weak_ptr_factory_.GetWeakPtr(),
                                  std::move(callback)));
 }
 
 bool PrintJobDatabaseImpl::IsInitialized() {
-  return is_initialized_;
+  return init_status_ == InitStatus::INITIALIZED;
 }
 
 void PrintJobDatabaseImpl::SavePrintJob(
     const printing::proto::PrintJobInfo& print_job_info,
     SavePrintJobCallback callback) {
-  if (!is_initialized_) {
+  if (init_status_ == InitStatus::FAILED) {
     base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), false));
     return;
   }
+
+  // Defer execution if database is uninitialized.
+  if (init_status_ != InitStatus::INITIALIZED) {
+    deferred_callbacks_.push(base::BindOnce(
+        &PrintJobDatabaseImpl::SavePrintJob, weak_ptr_factory_.GetWeakPtr(),
+        print_job_info, std::move(callback)));
+    return;
+  }
+
+  cache_[print_job_info.id()] = print_job_info;
+
   auto entries_to_save = std::make_unique<EntryVector>();
   entries_to_save->push_back(
       std::make_pair(print_job_info.id(), print_job_info));
@@ -73,23 +89,44 @@
                      std::move(callback)));
 }
 
-void PrintJobDatabaseImpl::DeletePrintJob(const std::string& id,
-                                          DeletePrintJobCallback callback) {
-  if (!is_initialized_) {
+void PrintJobDatabaseImpl::DeletePrintJobs(const std::vector<std::string>& ids,
+                                           DeletePrintJobsCallback callback) {
+  if (init_status_ == InitStatus::FAILED) {
     base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), false));
     return;
   }
-  auto keys_to_remove = std::make_unique<std::vector<std::string>>();
-  keys_to_remove->push_back(id);
+
+  // Defer execution if database is uninitialized.
+  if (init_status_ != InitStatus::INITIALIZED) {
+    deferred_callbacks_.push(base::BindOnce(
+        &PrintJobDatabaseImpl::DeletePrintJobs, weak_ptr_factory_.GetWeakPtr(),
+        ids, std::move(callback)));
+    return;
+  }
+
   database_->UpdateEntries(
       /*entries_to_save=*/std::make_unique<EntryVector>(),
-      /*keys_to_remove=*/std::move(keys_to_remove),
+      /*keys_to_remove=*/std::make_unique<std::vector<std::string>>(ids),
       base::BindOnce(&PrintJobDatabaseImpl::OnPrintJobDeleted,
-                     weak_ptr_factory_.GetWeakPtr(), id, std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), ids, std::move(callback)));
 }
 
 void PrintJobDatabaseImpl::GetPrintJobs(GetPrintJobsCallback callback) {
+  if (init_status_ == InitStatus::FAILED) {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), false, nullptr));
+    return;
+  }
+
+  // Defer execution if database is uninitialized.
+  if (init_status_ != InitStatus::INITIALIZED) {
+    deferred_callbacks_.push(base::BindOnce(&PrintJobDatabaseImpl::GetPrintJobs,
+                                            weak_ptr_factory_.GetWeakPtr(),
+                                            std::move(callback)));
+    return;
+  }
+
   auto entries = std::make_unique<std::vector<printing::proto::PrintJobInfo>>();
   for (const auto& pair : cache_)
     entries->emplace_back(pair.second);
@@ -129,7 +166,6 @@
     bool success,
     std::unique_ptr<std::map<std::string, printing::proto::PrintJobInfo>>
         entries) {
-  is_initialized_ = success;
   if (success)
     cache_.insert(entries->begin(), entries->end());
   FinishInitialization(std::move(callback), success);
@@ -137,36 +173,55 @@
 
 void PrintJobDatabaseImpl::FinishInitialization(InitializeCallback callback,
                                                 bool success) {
+  init_status_ = success ? InitStatus::INITIALIZED : InitStatus::FAILED;
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), success));
+  // We run deferred callbacks even if initialization failed not to cause
+  // possible client-side blocks of next calls to the database.
+  while (!deferred_callbacks_.empty()) {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, std::move(deferred_callbacks_.front()));
+    deferred_callbacks_.pop();
+  }
 }
 
 void PrintJobDatabaseImpl::OnPrintJobSaved(
     const printing::proto::PrintJobInfo& print_job_info,
     SavePrintJobCallback callback,
     bool success) {
-  if (success)
-    cache_[print_job_info.id()] = print_job_info;
+  if (!success)
+    cache_.erase(print_job_info.id());
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), success));
 }
 
-void PrintJobDatabaseImpl::OnPrintJobDeleted(const std::string& id,
-                                             DeletePrintJobCallback callback,
-                                             bool success) {
+void PrintJobDatabaseImpl::OnPrintJobDeleted(
+    const std::vector<std::string>& ids,
+    DeletePrintJobsCallback callback,
+    bool success) {
   if (success)
-    cache_.erase(id);
+    for (const std::string& id : ids)
+      cache_.erase(id);
   base::SequencedTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), success));
 }
 
 void PrintJobDatabaseImpl::GetPrintJobsFromProtoDatabase(
     GetPrintJobsCallback callback) {
-  if (!is_initialized_) {
+  if (init_status_ == InitStatus::FAILED) {
     base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), false, nullptr));
     return;
   }
+
+  // Defer execution if database is uninitialized.
+  if (init_status_ != InitStatus::INITIALIZED) {
+    deferred_callbacks_.push(
+        base::BindOnce(&PrintJobDatabaseImpl::GetPrintJobsFromProtoDatabase,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+    return;
+  }
+
   database_->LoadEntries(
       base::BindOnce(&PrintJobDatabaseImpl::OnPrintJobsRetrieved,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/chrome/browser/chromeos/printing/history/print_job_database_impl.h b/chrome/browser/chromeos/printing/history/print_job_database_impl.h
index a49eda8a..8653ef1 100644
--- a/chrome/browser/chromeos/printing/history/print_job_database_impl.h
+++ b/chrome/browser/chromeos/printing/history/print_job_database_impl.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_DATABASE_IMPL_H_
 #define CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_DATABASE_IMPL_H_
 
+#include <queue>
 #include <unordered_map>
 
 #include "base/macros.h"
@@ -33,13 +34,15 @@
   bool IsInitialized() override;
   void SavePrintJob(const printing::proto::PrintJobInfo& print_job_info,
                     SavePrintJobCallback callback) override;
-  void DeletePrintJob(const std::string& id,
-                      DeletePrintJobCallback callback) override;
+  void DeletePrintJobs(const std::vector<std::string>& ids,
+                       DeletePrintJobsCallback callback) override;
   void GetPrintJobs(GetPrintJobsCallback callback) override;
 
  private:
   friend class PrintJobDatabaseImplTest;
 
+  enum class InitStatus { UNINITIALIZED, PENDING, INITIALIZED, FAILED };
+
   void OnInitialized(InitializeCallback callback,
                      leveldb_proto::Enums::InitStatus status);
 
@@ -55,8 +58,8 @@
                        SavePrintJobCallback callback,
                        bool success);
 
-  void OnPrintJobDeleted(const std::string& id,
-                         DeletePrintJobCallback callback,
+  void OnPrintJobDeleted(const std::vector<std::string>& ids,
+                         DeletePrintJobsCallback callback,
                          bool success);
 
   void GetPrintJobsFromProtoDatabase(GetPrintJobsCallback callback);
@@ -73,13 +76,15 @@
   // Cached PrintJobInfo entries.
   std::unordered_map<std::string, printing::proto::PrintJobInfo> cache_;
 
-  // Whether or not the ProtoDatabase database has been initialized and entries
-  // have been loaded.
-  bool is_initialized_ = false;
+  // Indicates the status of database initialization.
+  InitStatus init_status_;
 
   // Number of initialize attempts.
   int initialize_attempts_ = 0;
 
+  // Stores callbacks for delayed execution once database is initialized.
+  std::queue<base::OnceClosure> deferred_callbacks_;
+
   base::WeakPtrFactory<PrintJobDatabaseImpl> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(PrintJobDatabaseImpl);
diff --git a/chrome/browser/chromeos/printing/history/print_job_database_impl_unittest.cc b/chrome/browser/chromeos/printing/history/print_job_database_impl_unittest.cc
index dbad1ead3..5901017d 100644
--- a/chrome/browser/chromeos/printing/history/print_job_database_impl_unittest.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_database_impl_unittest.cc
@@ -53,25 +53,34 @@
     print_job_database_.reset();
   }
 
+  void OnInitializedWithClosure(base::RepeatingClosure run_loop_closure,
+                                bool success) {
+    EXPECT_TRUE(success);
+    run_loop_closure.Run();
+  }
+
   void OnPrintJobSaved(base::RepeatingClosure run_loop_closure, bool success) {
     EXPECT_TRUE(success);
     run_loop_closure.Run();
   }
 
- protected:
-  void Initialize() {
-    base::RunLoop run_loop;
-    print_job_database_->Initialize(
-        base::BindOnce(&PrintJobDatabaseImplTest::OnInitialized,
-                       base::Unretained(this), run_loop.QuitClosure()));
-    run_loop.Run();
-  }
-
-  void OnInitialized(base::RepeatingClosure run_loop_closure, bool success) {
+  void OnPrintJobsRetrieved(
+      base::RepeatingClosure run_loop_closure,
+      bool success,
+      std::unique_ptr<std::vector<PrintJobInfo>> entries) {
     EXPECT_TRUE(success);
+    entries_ = *entries;
     run_loop_closure.Run();
   }
 
+ protected:
+  void Initialize() {
+    print_job_database_->Initialize(base::BindOnce(
+        &PrintJobDatabaseImplTest::OnInitialized, base::Unretained(this)));
+  }
+
+  void OnInitialized(bool success) { EXPECT_TRUE(success); }
+
   void SavePrintJob(const PrintJobInfo& print_job_info) {
     base::RunLoop run_loop;
     print_job_database_->SavePrintJob(
@@ -81,16 +90,16 @@
     run_loop.Run();
   }
 
-  void DeletePrintJob(const std::string& id) {
+  void DeletePrintJobs(const std::vector<std::string>& ids) {
     base::RunLoop run_loop;
-    print_job_database_->DeletePrintJob(
-        id, base::BindOnce(&PrintJobDatabaseImplTest::OnPrintJobDeleted,
-                           base::Unretained(this), run_loop.QuitClosure()));
+    print_job_database_->DeletePrintJobs(
+        ids, base::BindOnce(&PrintJobDatabaseImplTest::OnPrintJobsDeleted,
+                            base::Unretained(this), run_loop.QuitClosure()));
     run_loop.Run();
   }
 
-  void OnPrintJobDeleted(base::RepeatingClosure run_loop_closure,
-                         bool success) {
+  void OnPrintJobsDeleted(base::RepeatingClosure run_loop_closure,
+                          bool success) {
     EXPECT_TRUE(success);
     run_loop_closure.Run();
   }
@@ -113,14 +122,7 @@
     return entries_;
   }
 
-  void OnPrintJobsRetrieved(
-      base::RepeatingClosure run_loop_closure,
-      bool success,
-      std::unique_ptr<std::vector<PrintJobInfo>> entries) {
-    EXPECT_TRUE(success);
-    entries_ = *entries;
-    run_loop_closure.Run();
-  }
+  const std::vector<PrintJobInfo>& entries() { return entries_; }
 
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<PrintJobDatabaseImpl> print_job_database_;
@@ -132,7 +134,11 @@
 };
 
 TEST_F(PrintJobDatabaseImplTest, Initialize) {
-  Initialize();
+  base::RunLoop run_loop;
+  print_job_database_->Initialize(
+      base::BindOnce(&PrintJobDatabaseImplTest::OnInitializedWithClosure,
+                     base::Unretained(this), run_loop.QuitClosure()));
+  run_loop.Run();
   EXPECT_TRUE(print_job_database_->IsInitialized());
 }
 
@@ -146,13 +152,13 @@
   EXPECT_EQ(kTitle1, entries[0].title());
 }
 
-TEST_F(PrintJobDatabaseImplTest, DeletePrintJob) {
+TEST_F(PrintJobDatabaseImplTest, DeletePrintJobs) {
   Initialize();
   PrintJobInfo print_job_info1 = ConstructPrintJobInfo(kId1, kTitle1);
   SavePrintJob(print_job_info1);
   PrintJobInfo print_job_info2 = ConstructPrintJobInfo(kId2, kTitle2);
   SavePrintJob(print_job_info2);
-  DeletePrintJob(kId1);
+  DeletePrintJobs({kId1});
   std::vector<PrintJobInfo> entries = GetPrintJobs();
   EXPECT_EQ(1u, entries.size());
   EXPECT_EQ(kId2, entries[0].id());
@@ -194,4 +200,25 @@
   EXPECT_TRUE(std::find(ids.begin(), ids.end(), kId2) != ids.end());
 }
 
+TEST_F(PrintJobDatabaseImplTest, RequestsBeforeInitialization) {
+  PrintJobInfo print_job_info = ConstructPrintJobInfo(kId1, kTitle1);
+  base::RunLoop save_print_job_run_loop;
+  print_job_database_->SavePrintJob(
+      print_job_info, base::BindOnce(&PrintJobDatabaseImplTest::OnPrintJobSaved,
+                                     base::Unretained(this),
+                                     save_print_job_run_loop.QuitClosure()));
+  base::RunLoop get_print_jobs_run_loop;
+  print_job_database_->GetPrintJobs(base::BindOnce(
+      &PrintJobDatabaseImplTest::OnPrintJobsRetrieved, base::Unretained(this),
+      get_print_jobs_run_loop.QuitClosure()));
+  Initialize();
+  save_print_job_run_loop.Run();
+  get_print_jobs_run_loop.Run();
+
+  std::vector<PrintJobInfo> print_job_entries = entries();
+  EXPECT_EQ(1u, print_job_entries.size());
+  EXPECT_EQ(kId1, print_job_entries[0].id());
+  EXPECT_EQ(kTitle1, print_job_entries[0].title());
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service.cc b/chrome/browser/chromeos/printing/history/print_job_history_service.cc
index 2e5bed80..38fc8b2 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service.cc
@@ -4,34 +4,11 @@
 
 #include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
 
-#include "base/bind_helpers.h"
-#include "base/guid.h"
-#include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram_functions.h"
-#include "chrome/browser/chromeos/printing/cups_print_job.h"
-#include "chrome/browser/chromeos/printing/history/print_job_info_conversions.h"
-
 namespace chromeos {
 
-PrintJobHistoryService::PrintJobHistoryService(
-    std::unique_ptr<PrintJobDatabase> print_job_database,
-    CupsPrintJobManager* print_job_manager)
-    : print_job_database_(std::move(print_job_database)),
-      print_job_manager_(print_job_manager) {
-  DCHECK(print_job_manager_);
-  print_job_manager_->AddObserver(this);
-  print_job_database_->Initialize(base::DoNothing());
-}
+PrintJobHistoryService::PrintJobHistoryService() = default;
 
-PrintJobHistoryService::~PrintJobHistoryService() {
-  DCHECK(print_job_manager_);
-  print_job_manager_->RemoveObserver(this);
-}
-
-void PrintJobHistoryService::GetPrintJobs(
-    PrintJobDatabase::GetPrintJobsCallback callback) {
-  print_job_database_->GetPrintJobs(std::move(callback));
-}
+PrintJobHistoryService::~PrintJobHistoryService() = default;
 
 void PrintJobHistoryService::AddObserver(
     PrintJobHistoryService::Observer* observer) {
@@ -43,37 +20,4 @@
   observers_.RemoveObserver(observer);
 }
 
-void PrintJobHistoryService::OnPrintJobDone(base::WeakPtr<CupsPrintJob> job) {
-  SavePrintJob(job);
-}
-
-void PrintJobHistoryService::OnPrintJobError(base::WeakPtr<CupsPrintJob> job) {
-  SavePrintJob(job);
-}
-
-void PrintJobHistoryService::OnPrintJobCancelled(
-    base::WeakPtr<CupsPrintJob> job) {
-  SavePrintJob(job);
-}
-
-void PrintJobHistoryService::SavePrintJob(base::WeakPtr<CupsPrintJob> job) {
-  if (!job)
-    return;
-  printing::proto::PrintJobInfo print_job_info =
-      CupsPrintJobToProto(*job, /*id=*/base::GenerateGUID(), base::Time::Now());
-  print_job_database_->SavePrintJob(
-      print_job_info, base::BindOnce(&PrintJobHistoryService::OnPrintJobSaved,
-                                     base::Unretained(this), print_job_info));
-}
-
-void PrintJobHistoryService::OnPrintJobSaved(
-    const printing::proto::PrintJobInfo& print_job_info,
-    bool success) {
-  base::UmaHistogramBoolean("Printing.CUPS.PrintJobDatabasePrintJobSaved",
-                            success);
-  for (auto& observer : observers_) {
-    observer.OnPrintJobFinished(print_job_info);
-  }
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service.h b/chrome/browser/chromeos/printing/history/print_job_history_service.h
index 127b58f..9b13adf 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service.h
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service.h
@@ -7,19 +7,13 @@
 
 #include "base/macros.h"
 #include "base/observer_list.h"
-#include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
 #include "chrome/browser/chromeos/printing/history/print_job_database.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace chromeos {
 
-class CupsPrintJobManager;
-
 // This service is responsible for maintaining print job history.
-// It observes CupsPrintJobManager events and uses PrintJobDatabase as
-// persistent storage for print job history.
-class PrintJobHistoryService : public KeyedService,
-                               public chromeos::CupsPrintJobManager::Observer {
+class PrintJobHistoryService : public KeyedService {
  public:
   class Observer {
    public:
@@ -27,30 +21,17 @@
         const printing::proto::PrintJobInfo& print_job_info) = 0;
   };
 
-  PrintJobHistoryService(std::unique_ptr<PrintJobDatabase> print_job_database,
-                         CupsPrintJobManager* print_job_manager);
+  PrintJobHistoryService();
   ~PrintJobHistoryService() override;
 
   // Retrieves all print jobs from the database.
-  void GetPrintJobs(PrintJobDatabase::GetPrintJobsCallback callback);
+  virtual void GetPrintJobs(
+      PrintJobDatabase::GetPrintJobsCallback callback) = 0;
 
   void AddObserver(PrintJobHistoryService::Observer* observer);
   void RemoveObserver(PrintJobHistoryService::Observer* observer);
 
- private:
-  // CupsPrintJobManager::Observer
-  void OnPrintJobDone(base::WeakPtr<CupsPrintJob> job) override;
-  void OnPrintJobError(base::WeakPtr<CupsPrintJob> job) override;
-  void OnPrintJobCancelled(base::WeakPtr<CupsPrintJob> job) override;
-
-  void SavePrintJob(base::WeakPtr<CupsPrintJob> job);
-
-  void OnPrintJobSaved(const printing::proto::PrintJobInfo& print_job_info,
-                       bool success);
-
-  std::unique_ptr<PrintJobDatabase> print_job_database_;
-  CupsPrintJobManager* print_job_manager_;
-
+ protected:
   base::ObserverList<PrintJobHistoryService::Observer>::Unchecked observers_;
 
   DISALLOW_COPY_AND_ASSIGN(PrintJobHistoryService);
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
index b5a4205..6165f144 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
@@ -6,7 +6,7 @@
 
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
 #include "chrome/browser/chromeos/printing/history/print_job_database_impl.h"
-#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/storage_partition.h"
@@ -48,8 +48,8 @@
   CupsPrintJobManager* print_job_manager =
       chromeos::CupsPrintJobManagerFactory::GetForBrowserContext(profile);
 
-  return new PrintJobHistoryService(std::move(print_job_database),
-                                    print_job_manager);
+  return new PrintJobHistoryServiceImpl(std::move(print_job_database),
+                                        print_job_manager);
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_impl.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_impl.cc
new file mode 100644
index 0000000..f47dfb1
--- /dev/null
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_impl.cc
@@ -0,0 +1,71 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
+
+#include "base/bind_helpers.h"
+#include "base/guid.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/chromeos/printing/cups_print_job.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info_conversions.h"
+
+namespace chromeos {
+
+PrintJobHistoryServiceImpl::PrintJobHistoryServiceImpl(
+    std::unique_ptr<PrintJobDatabase> print_job_database,
+    CupsPrintJobManager* print_job_manager)
+    : print_job_database_(std::move(print_job_database)),
+      print_job_manager_(print_job_manager) {
+  DCHECK(print_job_manager_);
+  print_job_manager_->AddObserver(this);
+  print_job_database_->Initialize(base::DoNothing());
+}
+
+PrintJobHistoryServiceImpl::~PrintJobHistoryServiceImpl() {
+  DCHECK(print_job_manager_);
+  print_job_manager_->RemoveObserver(this);
+}
+
+void PrintJobHistoryServiceImpl::GetPrintJobs(
+    PrintJobDatabase::GetPrintJobsCallback callback) {
+  print_job_database_->GetPrintJobs(std::move(callback));
+}
+
+void PrintJobHistoryServiceImpl::OnPrintJobDone(
+    base::WeakPtr<CupsPrintJob> job) {
+  SavePrintJob(job);
+}
+
+void PrintJobHistoryServiceImpl::OnPrintJobError(
+    base::WeakPtr<CupsPrintJob> job) {
+  SavePrintJob(job);
+}
+
+void PrintJobHistoryServiceImpl::OnPrintJobCancelled(
+    base::WeakPtr<CupsPrintJob> job) {
+  SavePrintJob(job);
+}
+
+void PrintJobHistoryServiceImpl::SavePrintJob(base::WeakPtr<CupsPrintJob> job) {
+  if (!job)
+    return;
+  printing::proto::PrintJobInfo print_job_info =
+      CupsPrintJobToProto(*job, /*id=*/base::GenerateGUID(), base::Time::Now());
+  print_job_database_->SavePrintJob(
+      print_job_info,
+      base::BindOnce(&PrintJobHistoryServiceImpl::OnPrintJobSaved,
+                     base::Unretained(this), print_job_info));
+}
+
+void PrintJobHistoryServiceImpl::OnPrintJobSaved(
+    const printing::proto::PrintJobInfo& print_job_info,
+    bool success) {
+  UMA_HISTOGRAM_BOOLEAN("Printing.CUPS.PrintJobDatabasePrintJobSaved", success);
+  for (auto& observer : observers_) {
+    observer.OnPrintJobFinished(print_job_info);
+  }
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_impl.h b/chrome/browser/chromeos/printing/history/print_job_history_service_impl.h
new file mode 100644
index 0000000..cb2502478
--- /dev/null
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_impl.h
@@ -0,0 +1,50 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_HISTORY_SERVICE_IMPL_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_HISTORY_SERVICE_IMPL_H_
+
+#include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
+#include "chrome/browser/chromeos/printing/history/print_job_database.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
+
+namespace chromeos {
+
+class CupsPrintJobManager;
+
+// This service is responsible for maintaining print job history.
+// It observes CupsPrintJobManager events and uses PrintJobDatabase as
+// persistent storage for print job history.
+class PrintJobHistoryServiceImpl
+    : public PrintJobHistoryService,
+      public chromeos::CupsPrintJobManager::Observer {
+ public:
+  PrintJobHistoryServiceImpl(
+      std::unique_ptr<PrintJobDatabase> print_job_database,
+      CupsPrintJobManager* print_job_manager);
+  ~PrintJobHistoryServiceImpl() override;
+
+  // PrintJobHistoryService:
+  void GetPrintJobs(PrintJobDatabase::GetPrintJobsCallback callback) override;
+
+ private:
+  // CupsPrintJobManager::Observer:
+  void OnPrintJobDone(base::WeakPtr<CupsPrintJob> job) override;
+  void OnPrintJobError(base::WeakPtr<CupsPrintJob> job) override;
+  void OnPrintJobCancelled(base::WeakPtr<CupsPrintJob> job) override;
+
+  void SavePrintJob(base::WeakPtr<CupsPrintJob> job);
+
+  void OnPrintJobSaved(const printing::proto::PrintJobInfo& print_job_info,
+                       bool success);
+
+  std::unique_ptr<PrintJobDatabase> print_job_database_;
+  CupsPrintJobManager* print_job_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(PrintJobHistoryServiceImpl);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_HISTORY_SERVICE_IMPL_H_
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_unittest.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_impl_unittest.cc
similarity index 90%
rename from chrome/browser/chromeos/printing/history/print_job_history_service_unittest.cc
rename to chrome/browser/chromeos/printing/history/print_job_history_service_impl_unittest.cc
index aad75d22..37e5492 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service_unittest.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_impl_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
 
 #include "chrome/browser/chromeos/printing/cups_print_job.h"
 #include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
@@ -25,15 +25,15 @@
 
 }  // namespace
 
-class PrintJobHistoryServiceTest : public ::testing::Test {
+class PrintJobHistoryServiceImplTest : public ::testing::Test {
  public:
-  PrintJobHistoryServiceTest() {}
+  PrintJobHistoryServiceImplTest() {}
 
   void SetUp() override {
     std::unique_ptr<PrintJobDatabase> print_job_database =
         std::make_unique<TestPrintJobDatabase>();
     print_job_manager_ = std::make_unique<TestCupsPrintJobManager>(&profile_);
-    print_job_history_service_ = std::make_unique<PrintJobHistoryService>(
+    print_job_history_service_ = std::make_unique<PrintJobHistoryServiceImpl>(
         std::move(print_job_database), print_job_manager_.get());
   }
 
@@ -66,7 +66,7 @@
   TestingProfile profile_;
 };
 
-TEST_F(PrintJobHistoryServiceTest, SaveObservedCupsPrintJob) {
+TEST_F(PrintJobHistoryServiceImplTest, SaveObservedCupsPrintJob) {
   base::RunLoop save_print_job_run_loop;
   TestPrintJobHistoryServiceObserver observer(
       print_job_history_service_.get(), save_print_job_run_loop.QuitClosure());
@@ -81,8 +81,8 @@
 
   base::RunLoop get_print_jobs_run_loop;
   print_job_history_service_->GetPrintJobs(base::BindOnce(
-      &PrintJobHistoryServiceTest::OnPrintJobsRetrieved, base::Unretained(this),
-      get_print_jobs_run_loop.QuitClosure()));
+      &PrintJobHistoryServiceImplTest::OnPrintJobsRetrieved,
+      base::Unretained(this), get_print_jobs_run_loop.QuitClosure()));
   get_print_jobs_run_loop.Run();
 
   EXPECT_EQ(1u, entries_.size());
@@ -92,7 +92,7 @@
             entries_[0].status());
 }
 
-TEST_F(PrintJobHistoryServiceTest, ObserverTest) {
+TEST_F(PrintJobHistoryServiceImplTest, ObserverTest) {
   base::RunLoop run_loop;
   TestPrintJobHistoryServiceObserver observer(print_job_history_service_.get(),
                                               run_loop.QuitClosure());
diff --git a/chrome/browser/chromeos/printing/history/test_print_job_database.cc b/chrome/browser/chromeos/printing/history/test_print_job_database.cc
index 98d2aa5..838b3cc 100644
--- a/chrome/browser/chromeos/printing/history/test_print_job_database.cc
+++ b/chrome/browser/chromeos/printing/history/test_print_job_database.cc
@@ -28,9 +28,10 @@
   std::move(callback).Run(true);
 }
 
-void TestPrintJobDatabase::DeletePrintJob(const std::string& id,
-                                          DeletePrintJobCallback callback) {
-  database_.erase(id);
+void TestPrintJobDatabase::DeletePrintJobs(const std::vector<std::string>& ids,
+                                           DeletePrintJobsCallback callback) {
+  for (const std::string& id : ids)
+    database_.erase(id);
   std::move(callback).Run(true);
 }
 
diff --git a/chrome/browser/chromeos/printing/history/test_print_job_database.h b/chrome/browser/chromeos/printing/history/test_print_job_database.h
index c1901a4..f054c092 100644
--- a/chrome/browser/chromeos/printing/history/test_print_job_database.h
+++ b/chrome/browser/chromeos/printing/history/test_print_job_database.h
@@ -23,8 +23,8 @@
   bool IsInitialized() override;
   void SavePrintJob(const printing::proto::PrintJobInfo& print_job_info,
                     SavePrintJobCallback callback) override;
-  void DeletePrintJob(const std::string& id,
-                      DeletePrintJobCallback callback) override;
+  void DeletePrintJobs(const std::vector<std::string>& ids,
+                       DeletePrintJobsCallback callback) override;
   void GetPrintJobs(GetPrintJobsCallback callback) override;
 
  private:
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc
index 503acc4a..32a9b28 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.cc
@@ -4,67 +4,65 @@
 
 #include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
 
-#include <cstdint>
 #include <cstring>
-#include <utility>
 
-#include "base/file_descriptor_posix.h"
 #include "base/files/file.h"
-#include "base/memory/shared_memory_handle.h"
+#include "base/memory/platform_shared_memory_region.h"
+#include "base/memory/read_only_shared_memory_region.h"
 #include "base/unguessable_token.h"
 #include "mojo/public/c/system/types.h"
+#include "mojo/public/cpp/system/handle.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace chromeos {
 
 base::StringPiece GetStringPieceFromMojoHandle(
     mojo::ScopedHandle handle,
-    std::unique_ptr<base::SharedMemory>* shared_memory) {
+    base::ReadOnlySharedMemoryMapping* shared_memory) {
+  DCHECK(shared_memory);
+
   base::PlatformFile platform_file;
   auto result = mojo::UnwrapPlatformFile(std::move(handle), &platform_file);
-  shared_memory->reset();
-  if (result != MOJO_RESULT_OK) {
+  if (result != MOJO_RESULT_OK)
     return base::StringPiece();
-  }
-  base::UnguessableToken guid = base::UnguessableToken::Create();
-  *shared_memory = std::make_unique<base::SharedMemory>(
-      base::SharedMemoryHandle(
-          base::FileDescriptor(platform_file, true /* iauto_close */), 0u,
-          guid),
-      true /* read_only */);
 
-  base::SharedMemoryHandle dup_shared_memory_handle =
-      base::SharedMemory::DuplicateHandle((*shared_memory)->handle());
-  const int64_t file_size =
-      base::File(dup_shared_memory_handle.GetHandle()).GetLength();
-  if (file_size <= 0) {
-    shared_memory->reset();
+  base::File file(platform_file);
+  const size_t file_size = file.GetLength();
+  if (file_size <= 0)
     return base::StringPiece();
-  }
-  if (!(*shared_memory)->Map(file_size)) {
-    shared_memory->reset();
+
+  base::subtle::PlatformSharedMemoryRegion platform_region =
+      base::subtle::PlatformSharedMemoryRegion::Take(
+          base::ScopedFD(file.TakePlatformFile()),
+          base::subtle::PlatformSharedMemoryRegion::Mode::kReadOnly, file_size,
+          base::UnguessableToken::Create());
+
+  base::ReadOnlySharedMemoryRegion shm =
+      base::ReadOnlySharedMemoryRegion::Deserialize(std::move(platform_region));
+  *shared_memory = shm.Map();
+  if (!shared_memory->IsValid())
     return base::StringPiece();
-  }
-  return base::StringPiece(static_cast<const char*>((*shared_memory)->memory()),
-                           (*shared_memory)->mapped_size());
+
+  return base::StringPiece(static_cast<const char*>(shared_memory->memory()),
+                           shared_memory->size());
 }
 
 mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle(
     const std::string& content) {
-  if (content.empty()) {
+  if (content.empty())
     return mojo::ScopedHandle();
-  }
 
-  base::SharedMemory shared_memory;
-  base::SharedMemoryCreateOptions options;
-  options.size = content.length();
-  options.share_read_only = true;
-  if (!shared_memory.Create(base::SharedMemoryCreateOptions(options)) ||
-      !shared_memory.Map(content.length())) {
+  base::MappedReadOnlyRegion shm =
+      base::ReadOnlySharedMemoryRegion::Create(content.size());
+  if (!shm.IsValid())
     return mojo::ScopedHandle();
-  }
-  memcpy(shared_memory.memory(), content.data(), content.length());
-  return mojo::WrapPlatformFile(shared_memory.TakeHandle().GetHandle());
+  memcpy(shm.mapping.memory(), content.data(), content.length());
+
+  base::subtle::PlatformSharedMemoryRegion platform_region =
+      base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
+          std::move(shm.region));
+  return mojo::WrapPlatformFile(
+      platform_region.PassPlatformHandle().fd.release());
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h
index 6f6c1b6..25d491d 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h
@@ -8,23 +8,27 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/shared_memory.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/strings/string_piece.h"
 #include "mojo/public/cpp/system/handle.h"
 
 namespace chromeos {
 
 // Allows to get access to the buffer in read only shared memory. It converts
-// mojo::Handle to base::SharedMemory and returns a string content.
+// mojo::Handle to base::ReadOnlySharedMemoryMapping and returns a string
+// content.
 //
 // |handle| must be a valid mojo handle of the non-empty buffer in the shared
 // memory.
-// |shared_memory| must be a valid allocated unique pointer.
 //
-// Returns an empty string and nullptr |shared_memory| if error.
+// Returns an empty string and an invalid |shared_memory| if error.
+//
+// TODO(crbug.com/989503): Use mojo::ScopedSharedBufferHandle or
+// base::ReadOnlySharedMemoryRegion instead of mojo::ScopedHandle
+// once ChromeOS updates to the required version of mojo library.
 base::StringPiece GetStringPieceFromMojoHandle(
     mojo::ScopedHandle handle,
-    std::unique_ptr<base::SharedMemory>* shared_memory);
+    base::ReadOnlySharedMemoryMapping* shared_memory);
 
 // Allocates buffer in shared memory, copies |content| to the buffer and
 // converts shared buffer handle into |mojo::ScopedHandle|.
@@ -32,6 +36,9 @@
 // Allocated shared memory is read only for another process.
 //
 // Returns invalid |mojo::ScopedHandle| if |content| is empty or error happened.
+//
+// TODO(crbug.com/989503): Remove mojo::ScopedHandle wrapping once
+// ChromeOS updates to the required version of mojo library.
 mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle(
     const std::string& content);
 
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc
index f54b969..61c0bba7 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/memory/shared_memory.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/process/process_handle.h"
 #include "base/strings/string_piece.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -261,9 +261,9 @@
   // Extract a GURL value from a ScopedHandle.
   GURL gurl;
   if (url.is_valid()) {
-    std::unique_ptr<base::SharedMemory> shared_memory;
+    base::ReadOnlySharedMemoryMapping shared_memory;
     gurl = GURL(GetStringPieceFromMojoHandle(std::move(url), &shared_memory));
-    if (!shared_memory) {
+    if (!shared_memory.IsValid()) {
       LOG(ERROR) << "Failed to read data from mojo handle";
       std::move(callback).Run(
           wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus::
@@ -275,16 +275,16 @@
 
   // Extract headers from ScopedHandle's.
   std::vector<base::StringPiece> header_contents;
-  std::vector<std::unique_ptr<base::SharedMemory>> shared_memories;
+  std::vector<base::ReadOnlySharedMemoryMapping> shared_memories;
   for (auto& header : headers) {
     if (!header.is_valid()) {
       header_contents.push_back("");
       continue;
     }
-    shared_memories.push_back(nullptr);
+    shared_memories.emplace_back();
     header_contents.push_back(GetStringPieceFromMojoHandle(
         std::move(header), &shared_memories.back()));
-    if (!shared_memories.back()) {
+    if (!shared_memories.back().IsValid()) {
       LOG(ERROR) << "Failed to read data from mojo handle";
       std::move(callback).Run(
           wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus::
@@ -297,10 +297,10 @@
   // Extract a string value from a ScopedHandle.
   std::string request_body_content;
   if (request_body.is_valid()) {
-    std::unique_ptr<base::SharedMemory> shared_memory;
+    base::ReadOnlySharedMemoryMapping shared_memory;
     request_body_content = std::string(
         GetStringPieceFromMojoHandle(std::move(request_body), &shared_memory));
-    if (!shared_memory) {
+    if (!shared_memory.IsValid()) {
       LOG(ERROR) << "Failed to read data from mojo handle";
       std::move(callback).Run(
           wilco_dtc_supportd::mojom::WilcoDtcSupportdWebRequestStatus::
@@ -350,7 +350,7 @@
     SendWilcoDtcMessageToUiCallback callback) {
   // Extract the string value of the received message.
   DCHECK(json_message);
-  std::unique_ptr<base::SharedMemory> json_message_shared_memory;
+  base::ReadOnlySharedMemoryMapping json_message_shared_memory;
   base::StringPiece json_message_string = GetStringPieceFromMojoHandle(
       std::move(json_message), &json_message_shared_memory);
   if (json_message_string.empty()) {
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
index 6b04785..f3d0977 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
@@ -12,7 +12,7 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/shared_memory.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/memory/weak_ptr.h"
 #include "base/stl_util.h"
 #include "base/strings/string_piece.h"
@@ -167,7 +167,7 @@
       return;
     }
 
-    std::unique_ptr<base::SharedMemory> response_json_shared_memory;
+    base::ReadOnlySharedMemoryMapping response_json_shared_memory;
     base::StringPiece response_json_string = GetStringPieceFromMojoHandle(
         std::move(response_json_message), &response_json_shared_memory);
     if (response_json_string.empty()) {
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc
index 185be0dd..bba8a1d 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/memory/shared_memory.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
@@ -52,7 +52,7 @@
 std::string AssertGetStringFromMojoHandle(mojo::ScopedHandle handle) {
   if (!handle)
     return std::string();
-  std::unique_ptr<base::SharedMemory> shared_memory;
+  base::ReadOnlySharedMemoryMapping shared_memory;
   std::string contents =
       GetStringPieceFromMojoHandle(std::move(handle), &shared_memory)
           .as_string();
diff --git a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc
index 4a39fd9..fb0f3a2 100644
--- a/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc
+++ b/chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/memory/shared_memory.h"
+#include "base/memory/shared_memory_mapping.h"
 #include "base/run_loop.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
@@ -53,10 +53,10 @@
         response_body = "";
         return;
       }
-      std::unique_ptr<base::SharedMemory> shared_memory;
+      base::ReadOnlySharedMemoryMapping shared_memory;
       response_body = std::string(GetStringPieceFromMojoHandle(
           std::move(response_body_handle), &shared_memory));
-      if (!shared_memory) {
+      if (!shared_memory.IsValid()) {
         response_body = "";
         return;
       }
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
index c565a7c..27750f98 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -36,7 +36,7 @@
 const ComponentConfig kConfigs[] = {
     {"epson-inkjet-printer-escpr", "3.0",
      "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"},
-    {"cros-termina", "780.1",
+    {"cros-termina", "790.1",
      "e9d960f84f628e1f42d05de4046bb5b3154b6f1f65c08412c6af57a29aecaffb"},
     {"rtanalytics-light", "13.0",
      "69f09d33c439c2ab55bbbe24b47ab55cb3f6c0bd1f1ef46eefea3216ec925038"},
diff --git a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
index d7113a16..8a66db5 100644
--- a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
+++ b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/files/file_util.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/browser_process.h"
@@ -31,12 +32,18 @@
 // letters and removes all hyphens and underscores in the locale string,
 // e.g. "en-US" -> "ENUS".
 std::string GetNormalizedLocale() {
-  std::string locale = g_browser_process->GetApplicationLocale();
+  std::string locale = base::GetFieldTrialParamValueByFeature(
+      omnibox::kOnDeviceHeadProvider, "ForceModelLocaleConstraint");
+  if (locale.empty())
+    locale = g_browser_process->GetApplicationLocale();
+
   for (const auto c : "-_")
     locale.erase(std::remove(locale.begin(), locale.end(), c), locale.end());
 
   std::transform(locale.begin(), locale.end(), locale.begin(),
                  [](char c) -> char { return base::ToUpperASCII(c); });
+  VLOG(1) << "On Device Head Component will fetch model for locale: " << locale;
+
   return locale;
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 1202fda..67d91d3 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -336,6 +336,11 @@
     "expiry_milestone": 79
   },
   {
+    "name": "back-forward-cache",
+    "owners": [ "bfcache-dev" ],
+    "expiry_milestone": 83
+  },
+  {
     "name": "background-task-component-update",
     "owners": [ "sorin", "waffles", "tiborg" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 74a32eb..78ffac7d 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -248,6 +248,12 @@
     "Uses Auto Screen Brightness model to adjust screen brightness based on "
     "ambient light";
 
+const char kBackForwardCacheName[] = "Back-forward cache";
+const char kBackForwardCacheDescription[] =
+    "Enables back-forward cache. NOTE: this feature is highly experimental and "
+    "will lead to various breakages, up to and including user data loss. "
+    "Do not enable unless you work on this feature";
+
 const char kBrowserTaskSchedulerName[] = "Task Scheduler";
 const char kBrowserTaskSchedulerDescription[] =
     "Enables redirection of some task posting APIs to the task scheduler.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b69f621d..e7e3d8d 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -160,6 +160,9 @@
 extern const char kAutoScreenBrightnessName[];
 extern const char kAutoScreenBrightnessDescription[];
 
+extern const char kBackForwardCacheName[];
+extern const char kBackForwardCacheDescription[];
+
 extern const char kBrowserTaskSchedulerName[];
 extern const char kBrowserTaskSchedulerDescription[];
 
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index 65c4da1..6f7a49c7 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -873,9 +873,15 @@
 
   // Make a request whose response should be cached.
   GURL request_url = embedded_test_server()->GetURL("/cachetime");
+  url::Origin request_origin =
+      url::Origin::Create(embedded_test_server()->base_url());
   std::unique_ptr<network::ResourceRequest> request =
       std::make_unique<network::ResourceRequest>();
   request->url = request_url;
+  request->trusted_params = network::ResourceRequest::TrustedParams();
+  request->trusted_params->network_isolation_key =
+      net::NetworkIsolationKey(request_origin, request_origin);
+
   content::SimpleURLLoaderTestHelper simple_loader_helper;
   std::unique_ptr<network::SimpleURLLoader> simple_loader =
       network::SimpleURLLoader::Create(std::move(request),
@@ -896,6 +902,10 @@
   std::unique_ptr<network::ResourceRequest> request2 =
       std::make_unique<network::ResourceRequest>();
   request2->url = request_url;
+  request2->trusted_params = network::ResourceRequest::TrustedParams();
+  request2->trusted_params->network_isolation_key =
+      net::NetworkIsolationKey(request_origin, request_origin);
+
   content::SimpleURLLoaderTestHelper simple_loader_helper2;
   std::unique_ptr<network::SimpleURLLoader> simple_loader2 =
       network::SimpleURLLoader::Create(std::move(request2),
@@ -972,6 +982,7 @@
   // cache in the next test). The profile directory is preserved between the
   // PRE_DiskCache and DiskCache run, so can just keep a file there.
   GURL test_url = embedded_test_server()->GetURL(kCacheRandomPath);
+  url::Origin test_origin = url::Origin::Create(test_url);
   base::ScopedAllowBlockingForTesting allow_blocking;
   base::FilePath save_url_file_path = browser()->profile()->GetPath().Append(
       FILE_PATH_LITERAL("url_for_test.txt"));
@@ -980,6 +991,9 @@
   std::unique_ptr<network::ResourceRequest> request =
       std::make_unique<network::ResourceRequest>();
   request->url = test_url;
+  request->trusted_params = network::ResourceRequest::TrustedParams();
+  request->trusted_params->network_isolation_key =
+      net::NetworkIsolationKey(test_origin, test_origin);
 
   content::SimpleURLLoaderTestHelper simple_loader_helper;
   std::unique_ptr<network::SimpleURLLoader> simple_loader =
@@ -1027,6 +1041,7 @@
 
   GURL test_url = GURL(file_data.substr(0, newline_pos));
   ASSERT_TRUE(test_url.is_valid()) << test_url.possibly_invalid_spec();
+  url::Origin test_origin = url::Origin::Create(test_url);
 
   std::string original_response = file_data.substr(newline_pos + 1);
 
@@ -1034,6 +1049,10 @@
   std::unique_ptr<network::ResourceRequest> request =
       std::make_unique<network::ResourceRequest>();
   request->url = test_url;
+  request->trusted_params = network::ResourceRequest::TrustedParams();
+  request->trusted_params->network_isolation_key =
+      net::NetworkIsolationKey(test_origin, test_origin);
+
   content::SimpleURLLoaderTestHelper simple_loader_helper;
   request->load_flags = net::LOAD_ONLY_FROM_CACHE;
   std::unique_ptr<network::SimpleURLLoader> simple_loader =
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 4092e1f..b7c4055 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -332,6 +332,7 @@
       network::mojom::URLLoaderFactoryParams::New();
   params->process_id = network::mojom::kBrowserProcessId;
   params->is_corb_enabled = false;
+  params->is_trusted = true;
   GetContext()->CreateURLLoaderFactory(mojo::MakeRequest(&url_loader_factory_),
                                        std::move(params));
   return url_loader_factory_.get();
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
index 07a11b04..f9fe1cb4 100644
--- a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
@@ -195,6 +195,14 @@
   bool IsPrerender(content::WebContents* web_contents) override {
     return prerender::PrerenderContents::FromWebContents(web_contents);
   }
+  bool IsExtensionUrl(const GURL& url) override {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+    return url.SchemeIs(extensions::kExtensionScheme);
+#else
+    return false;
+#endif
+  }
+
   const std::vector<mojom::PageLoadTimingPtr>& updated_timings() const {
     return updated_timings_;
   }
diff --git a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
index d27b351..817eda33 100644
--- a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
+++ b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
@@ -20,11 +20,16 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/resource_load_info.mojom.h"
 #include "content/public/common/resource_type.h"
+#include "extensions/buildflags/buildflags.h"
 #include "net/base/ip_endpoint.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/web_input_event.h"
 #include "url/gurl.h"
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/common/constants.h"
+#endif
+
 namespace page_load_metrics {
 
 namespace {
@@ -54,6 +59,14 @@
     return prerender::PrerenderContents::FromWebContents(web_contents);
   }
 
+  bool IsExtensionUrl(const GURL& url) override {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+    return url.SchemeIs(extensions::kExtensionScheme);
+#else
+    return false;
+#endif
+  }
+
  private:
   PageLoadMetricsObserverTester* test_;
 
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h b/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
index 81238d6f..0fb3ae3 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
+++ b/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
@@ -30,6 +30,7 @@
   virtual void RegisterObservers(PageLoadTracker* metrics) = 0;
   virtual std::unique_ptr<base::OneShotTimer> CreateTimer() = 0;
   virtual bool IsPrerender(content::WebContents* web_contents) = 0;
+  virtual bool IsExtensionUrl(const GURL& url) = 0;
 };
 
 }  // namespace page_load_metrics
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
index 626df7ab..40f366f 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -51,6 +51,7 @@
 #include "chrome/browser/search/search.h"
 #include "components/rappor/rappor_service_impl.h"
 #include "content/public/browser/web_contents.h"
+#include "extensions/buildflags/buildflags.h"
 #include "url/gurl.h"
 
 #if defined(OS_ANDROID)
@@ -59,6 +60,10 @@
 #include "chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer.h"
 #endif
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/common/constants.h"
+#endif
+
 namespace chrome {
 
 namespace {
@@ -74,6 +79,7 @@
   void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override;
   std::unique_ptr<base::OneShotTimer> CreateTimer() override;
   bool IsPrerender(content::WebContents* web_contents) override;
+  bool IsExtensionUrl(const GURL& url) override;
 
  private:
   bool IsPrerendering() const;
@@ -194,6 +200,14 @@
   return prerender::PrerenderContents::FromWebContents(web_contents);
 }
 
+bool PageLoadMetricsEmbedder::IsExtensionUrl(const GURL& url) {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  return url.SchemeIs(extensions::kExtensionScheme);
+#else
+  return false;
+#endif
+}
+
 }  // namespace
 
 void InitializePageLoadMetricsForWebContents(
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.cc b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.cc
index 2c59263..f46df600 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.cc
@@ -17,7 +17,6 @@
 #include "components/page_load_metrics/common/page_load_metrics_constants.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
-#include "extensions/common/constants.h"
 #include "url/gurl.h"
 
 namespace page_load_metrics {
@@ -405,6 +404,7 @@
     content::NavigationHandle* navigation_handle,
     PageLoadMetricsEmbedderInterface* embedder_interface)
     : client_(client),
+      embedder_interface_(embedder_interface),
       timer_(embedder_interface->CreateTimer()),
       navigation_start_(navigation_handle->NavigationStart()),
       current_merged_page_timing_(CreatePageLoadTiming()),
@@ -438,8 +438,8 @@
     mojom::FrameRenderDataUpdatePtr render_data,
     mojom::CpuTimingPtr new_cpu_timing,
     mojom::DeferredResourceCountsPtr new_deferred_resource_data) {
-  if (render_frame_host->GetLastCommittedURL().SchemeIs(
-          extensions::kExtensionScheme)) {
+  if (embedder_interface_->IsExtensionUrl(
+          render_frame_host->GetLastCommittedURL())) {
     // Extensions can inject child frames into a page. We don't want to track
     // these as they could skew metrics. See http://crbug.com/761037
     return;
@@ -476,8 +476,8 @@
 void PageLoadMetricsUpdateDispatcher::UpdateFeatures(
     content::RenderFrameHost* render_frame_host,
     const mojom::PageLoadFeatures& new_features) {
-  if (render_frame_host->GetLastCommittedURL().SchemeIs(
-          extensions::kExtensionScheme)) {
+  if (embedder_interface_->IsExtensionUrl(
+          render_frame_host->GetLastCommittedURL())) {
     // Extensions can inject child frames into a page. We don't want to track
     // these as they could skew metrics. See http://crbug.com/761037
     return;
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
index 3a2b952..8ee0083c 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
+++ b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
@@ -195,6 +195,9 @@
   // The client is guaranteed to outlive this object.
   Client* const client_;
 
+  // Interface to chrome features. Must outlive the class.
+  PageLoadMetricsEmbedderInterface* const embedder_interface_;
+
   std::unique_ptr<base::OneShotTimer> timer_;
 
   // Time the navigation for this page load was initiated.
diff --git a/chrome/browser/performance_manager/performance_manager_tab_helper.cc b/chrome/browser/performance_manager/performance_manager_tab_helper.cc
index eba7783..b0de4ac 100644
--- a/chrome/browser/performance_manager/performance_manager_tab_helper.cc
+++ b/chrome/browser/performance_manager/performance_manager_tab_helper.cc
@@ -27,8 +27,16 @@
 
 // static
 void PerformanceManagerTabHelper::DetachAndDestroyAll() {
-  while (first_)
-    first_->web_contents()->RemoveUserData(UserDataKey());
+  while (first_) {
+    PerformanceManagerTabHelper* helper = first_;
+    // Tear it down and detach it from the WebContents, which will
+    // delete it.
+    content::WebContents* web_contents = helper->web_contents();
+    DCHECK(web_contents);
+    helper->TearDown();
+    DCHECK(!helper->web_contents());
+    web_contents->RemoveUserData(UserDataKey());
+  }
 }
 
 PerformanceManagerTabHelper::PerformanceManagerTabHelper(
@@ -72,6 +80,19 @@
 }
 
 PerformanceManagerTabHelper::~PerformanceManagerTabHelper() {
+  DCHECK(!page_node_);
+  DCHECK(frames_.empty());
+  DCHECK_NE(this, first_);
+  DCHECK(!prev_);
+  DCHECK(!next_);
+}
+
+void PerformanceManagerTabHelper::TearDown() {
+  // Validate that this instance is in list of tab helpers.
+  DCHECK(first_ == this || next_ || prev_);
+  DCHECK_NE(this, next_);
+  DCHECK_NE(this, prev_);
+
   // Ship our page and frame nodes to the PerformanceManagerImpl for
   // incineration.
   std::vector<std::unique_ptr<NodeBase>> nodes;
@@ -84,17 +105,25 @@
   // Delete the page and its entire frame tree from the graph.
   performance_manager_->BatchDeleteNodes(std::move(nodes));
 
-  if (first_ == this)
+  if (first_ == this) {
+    DCHECK(!prev_);
     first_ = next_;
+  }
 
   if (prev_) {
     DCHECK_EQ(prev_->next_, this);
     prev_->next_ = next_;
   }
+
   if (next_) {
     DCHECK_EQ(next_->prev_, this);
     next_->prev_ = prev_;
   }
+  prev_ = nullptr;
+  next_ = nullptr;
+
+  // Unsubscribe from the associated WebContents.
+  Observe(nullptr);
 }
 
 void PerformanceManagerTabHelper::RenderFrameCreated(
@@ -279,6 +308,10 @@
   PostToGraph(FROM_HERE, &PageNodeImpl::OnTitleUpdated, page_node_.get());
 }
 
+void PerformanceManagerTabHelper::WebContentsDestroyed() {
+  TearDown();
+}
+
 void PerformanceManagerTabHelper::DidUpdateFaviconURL(
     const std::vector<content::FaviconURL>& candidates) {
   // TODO(siggi): This logic belongs in the policy layer rather than here.
diff --git a/chrome/browser/performance_manager/performance_manager_tab_helper.h b/chrome/browser/performance_manager/performance_manager_tab_helper.h
index a2690f2..5ff5d4e 100644
--- a/chrome/browser/performance_manager/performance_manager_tab_helper.h
+++ b/chrome/browser/performance_manager/performance_manager_tab_helper.h
@@ -52,6 +52,7 @@
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
   void TitleWasSet(content::NavigationEntry* entry) override;
+  void WebContentsDestroyed() override;
   void DidUpdateFaviconURL(
       const std::vector<content::FaviconURL>& candidates) override;
   void OnInterfaceRequestFromFrame(
@@ -70,6 +71,7 @@
   friend class WebContentsProxyImpl;
 
   explicit PerformanceManagerTabHelper(content::WebContents* web_contents);
+  void TearDown();
 
   // Post a task to run in the performance manager sequence. The |node| will be
   // passed as unretained, and the closure will be created with BindOnce.
diff --git a/chrome/browser/policy/extension_policy_browsertest.cc b/chrome/browser/policy/extension_policy_browsertest.cc
index ce57bc1c..9ee1a21 100644
--- a/chrome/browser/policy/extension_policy_browsertest.cc
+++ b/chrome/browser/policy/extension_policy_browsertest.cc
@@ -5,6 +5,7 @@
 #include "base/test/bind_test_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/background/background_contents_service.h"
+#include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_management_constants.h"
 #include "chrome/browser/extensions/extension_management_test_util.h"
 #include "chrome/browser/extensions/extension_service.h"
@@ -12,11 +13,14 @@
 #include "chrome/browser/extensions/install_verifier.h"
 #include "chrome/browser/extensions/shared_module_service.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
+#include "chrome/browser/extensions/updater/extension_cache_fake.h"
+#include "chrome/browser/extensions/updater/extension_updater.h"
 #include "chrome/browser/policy/policy_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/extensions/extension_test_util.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
+#include "chrome/common/web_application_info.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/policy/policy_constants.h"
 #include "components/version_info/channel.h"
@@ -27,7 +31,9 @@
 #include "extensions/browser/extension_dialog_auto_confirm.h"
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/scoped_ignore_content_verifier_for_test.h"
 #include "extensions/browser/test_extension_registry_observer.h"
 #include "extensions/common/features/feature_channel.h"
 #include "extensions/common/manifest_handlers/shared_module_info.h"
@@ -93,9 +99,103 @@
       base::Unretained(test_server), match_path, template_file));
 }
 
+class ExtensionPolicyTest : public PolicyTest {
+ protected:
+  void SetUp() override {
+    PolicyTest::SetUp();
+    test_extension_cache_ = std::make_unique<extensions::ExtensionCacheFake>();
+  }
+
+  void SetUpOnMainThread() override {
+    PolicyTest::SetUpOnMainThread();
+    if (extension_service()->updater()) {
+      extension_service()->updater()->SetExtensionCacheForTesting(
+          test_extension_cache_.get());
+    }
+  }
+
+  extensions::ExtensionService* extension_service() {
+    extensions::ExtensionSystem* system =
+        extensions::ExtensionSystem::Get(browser()->profile());
+    return system->extension_service();
+  }
+
+  extensions::ExtensionRegistry* extension_registry() {
+    return extensions::ExtensionRegistry::Get(browser()->profile());
+  }
+
+  const extensions::Extension* InstallExtension(
+      const base::FilePath::StringType& name) {
+    base::FilePath extension_path(ui_test_utils::GetTestFilePath(
+        base::FilePath(kTestExtensionsDir), base::FilePath(name)));
+    scoped_refptr<extensions::CrxInstaller> installer =
+        extensions::CrxInstaller::CreateSilent(extension_service());
+    installer->set_allow_silent_install(true);
+    installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE);
+    installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE);
+    installer->set_off_store_install_allow_reason(
+        extensions::CrxInstaller::OffStoreInstallAllowReason::
+            OffStoreInstallAllowedInTest);
+
+    content::WindowedNotificationObserver observer(
+        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
+        content::NotificationService::AllSources());
+    installer->InstallCrx(extension_path);
+    observer.Wait();
+    content::Details<const extensions::Extension> details = observer.details();
+    return details.ptr();
+  }
+
+  const extensions::Extension* InstallBookmarkApp() {
+    WebApplicationInfo web_app;
+    web_app.title = base::ASCIIToUTF16("Bookmark App");
+    web_app.app_url = GURL("http://www.google.com");
+
+    scoped_refptr<extensions::CrxInstaller> installer =
+        extensions::CrxInstaller::CreateSilent(extension_service());
+
+    content::WindowedNotificationObserver observer(
+        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
+        content::NotificationService::AllSources());
+    installer->InstallWebApp(web_app);
+    observer.Wait();
+    content::Details<const extensions::Extension> details = observer.details();
+    return details.ptr();
+  }
+
+  void UninstallExtension(const std::string& id, bool expect_success) {
+    if (expect_success) {
+      extensions::TestExtensionRegistryObserver observer(extension_registry());
+      extension_service()->UninstallExtension(
+          id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr);
+      observer.WaitForExtensionUninstalled();
+    } else {
+      content::WindowedNotificationObserver observer(
+          extensions::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED,
+          content::NotificationService::AllSources());
+      extension_service()->UninstallExtension(
+          id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr);
+      observer.Wait();
+    }
+  }
+
+  void DisableExtension(const std::string& id) {
+    extensions::TestExtensionRegistryObserver observer(extension_registry());
+    extension_service()->DisableExtension(
+        id, extensions::disable_reason::DISABLE_USER_ACTION);
+    observer.WaitForExtensionUnloaded();
+  }
+
+  std::unique_ptr<extensions::ExtensionCacheFake> test_extension_cache_;
+  extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_;
+  extensions::ExtensionUpdater::ScopedSkipScheduledCheckForTest
+      skip_scheduled_extension_checks_;
+};
+
 }  // namespace
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSelective) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionInstallBlacklistSelective) {
   // Verifies that blacklisted extensions can't be installed.
   extensions::ExtensionRegistry* registry = extension_registry();
   ASSERT_FALSE(registry->GetExtensionById(
@@ -128,7 +228,8 @@
 
 // Ensure that bookmark apps are not blocked by the ExtensionInstallBlacklist
 // policy.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklist_BookmarkApp) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionInstallBlacklist_BookmarkApp) {
   const extensions::Extension* bookmark_app = InstallBookmarkApp();
   ASSERT_TRUE(bookmark_app);
   EXPECT_TRUE(InstallExtension(kGoodCrxName));
@@ -151,7 +252,7 @@
 
 // Ensure that when INSTALLATION_REMOVED is set
 // that blacklisted extensions are removed from the device.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallRemovedPolicy) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionInstallRemovedPolicy) {
   EXPECT_TRUE(InstallExtension(kGoodCrxName));
 
   extensions::ExtensionService* service = extension_service();
@@ -175,7 +276,7 @@
 
 // Ensure that when INSTALLATION_REMOVED is set for wildcard
 // that blacklisted extensions are removed from the device.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionWildcardRemovedPolicy) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionWildcardRemovedPolicy) {
   EXPECT_TRUE(InstallExtension(kGoodCrxName));
 
   extensions::ExtensionService* service = extension_service();
@@ -199,7 +300,7 @@
 
 // Ensure that bookmark apps are not blocked by the ExtensionAllowedTypes
 // policy.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes_BookmarkApp) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionAllowedTypes_BookmarkApp) {
   const extensions::Extension* bookmark_app = InstallBookmarkApp();
   ASSERT_TRUE(bookmark_app);
   EXPECT_TRUE(InstallExtension(kGoodCrxName));
@@ -223,7 +324,7 @@
 
 // Ensure that bookmark apps are not blocked by the ExtensionSettings
 // policy.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionSettings_BookmarkApp) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionSettings_BookmarkApp) {
   const extensions::Extension* bookmark_app = InstallBookmarkApp();
   ASSERT_TRUE(bookmark_app);
   EXPECT_TRUE(InstallExtension(kGoodCrxName));
@@ -282,7 +383,8 @@
 #define MAYBE_ExtensionInstallBlacklistWildcard \
   ExtensionInstallBlacklistWildcard
 #endif
-IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallBlacklistWildcard) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       MAYBE_ExtensionInstallBlacklistWildcard) {
   // Verify that a wildcard blacklist takes effect.
   EXPECT_TRUE(InstallExtension(kSimpleWithIconCrxName));
   extensions::ExtensionService* service = extension_service();
@@ -315,7 +417,8 @@
       kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY));
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallBlacklistSharedModules) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionInstallBlacklistSharedModules) {
   // Verifies that shared_modules are not affected by the blacklist.
 
   base::FilePath base_path;
@@ -400,7 +503,7 @@
   EXPECT_EQ(kSharedModuleId, imports[0].extension_id);
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallWhitelist) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionInstallWhitelist) {
   // Verifies that the whitelist can open exceptions to the blacklist.
   extensions::ExtensionRegistry* registry = extension_registry();
   ASSERT_FALSE(registry->GetExtensionById(
@@ -518,7 +621,7 @@
 
 }  // namespace
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionInstallForcelist) {
   // Verifies that extensions that are force-installed by policies are
   // installed and can't be uninstalled.
 
@@ -688,7 +791,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest,
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
                        ExtensionInstallForcelist_DefaultedUpdateUrl) {
   // Verifies the ExtensionInstallForcelist policy with an empty (defaulted)
   // "update" URL.
@@ -714,7 +817,8 @@
       kGoodCrxId, extensions::ExtensionRegistry::COMPATIBILITY));
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionRecommendedInstallationMode) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionRecommendedInstallationMode) {
   // Verifies that extensions that are recommended-installed by policies are
   // installed, can be disabled but not uninstalled.
 
@@ -768,7 +872,7 @@
   EXPECT_FALSE(service->IsExtensionEnabled(kGoodCrxId));
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionAllowedTypes) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionAllowedTypes) {
   // Verifies that extensions are blocked if policy specifies an allowed types
   // list and the extension's type is not on that list.
   extensions::ExtensionRegistry* registry = extension_registry();
@@ -811,7 +915,7 @@
 #else
 #define MAYBE_ExtensionInstallSources ExtensionInstallSources
 #endif
-IN_PROC_BROWSER_TEST_F(PolicyTest, MAYBE_ExtensionInstallSources) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, MAYBE_ExtensionInstallSources) {
   extensions::ScopedTestDialogAutoConfirm auto_confirm(
       extensions::ScopedTestDialogAutoConfirm::ACCEPT);
   extensions::ScopedInstallVerifierBypassForTest install_verifier_bypass;
@@ -860,7 +964,7 @@
 // Verifies that extensions with version older than the minimum version required
 // by policy will get disabled, and will be auto-updated and/or re-enabled upon
 // policy changes as well as regular auto-updater scheduled updates.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequired) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest, ExtensionMinimumVersionRequired) {
   ExtensionRequestInterceptor interceptor;
 
   base::AtomicRefCount update_extension_count;
@@ -938,7 +1042,8 @@
 
 // Similar to ExtensionMinimumVersionRequired test, but with different settings
 // and orders.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequiredAlt) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionMinimumVersionRequiredAlt) {
   ExtensionRequestInterceptor interceptor;
 
   base::AtomicRefCount update_extension_count;
@@ -1012,7 +1117,8 @@
 
 // Verifies that a force-installed extension which does not meet a subsequently
 // set minimum version requirement is handled well.
-IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionForceInstalled) {
+IN_PROC_BROWSER_TEST_F(ExtensionPolicyTest,
+                       ExtensionMinimumVersionForceInstalled) {
   ExtensionRequestInterceptor interceptor;
 
 // Mark as enterprise managed.
@@ -1055,15 +1161,15 @@
             extension_prefs->GetDisableReasons(kGoodCrxId));
 }
 
-// Similar to PolicyTest but sets the WebAppInstallForceList policy before the
-// browser is started.
-class WebAppInstallForceListPolicyTest : public PolicyTest {
+// Similar to ExtensionPolicyTest but sets the WebAppInstallForceList policy
+// before the browser is started.
+class WebAppInstallForceListPolicyTest : public ExtensionPolicyTest {
  public:
   WebAppInstallForceListPolicyTest() {}
   ~WebAppInstallForceListPolicyTest() override {}
 
   void SetUpInProcessBrowserTestFixture() override {
-    PolicyTest::SetUpInProcessBrowserTestFixture();
+    ExtensionPolicyTest::SetUpInProcessBrowserTestFixture();
     ASSERT_TRUE(embedded_test_server()->Start());
 
     policy_app_url_ =
diff --git a/chrome/browser/policy/policy_test_utils.cc b/chrome/browser/policy/policy_test_utils.cc
index 62d87c7a..9f2ff884 100644
--- a/chrome/browser/policy/policy_test_utils.cc
+++ b/chrome/browser/policy/policy_test_utils.cc
@@ -8,8 +8,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/extensions/chrome_test_extension_loader.h"
-#include "chrome/browser/extensions/crx_installer.h"
-#include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/chrome_screenshot_grabber.h"
 #include "chrome/browser/ui/ash/chrome_screenshot_grabber_test_observer.h"
@@ -19,7 +17,6 @@
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/net/safe_search_util.h"
-#include "chrome/common/web_application_info.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
@@ -37,10 +34,6 @@
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_system.h"
-#include "extensions/browser/notification_types.h"
-#include "extensions/browser/test_extension_registry_observer.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/transport_security_state.h"
 #include "services/network/public/mojom/network_service_test.mojom.h"
@@ -68,7 +61,6 @@
 PolicyTest::~PolicyTest() = default;
 
 void PolicyTest::SetUp() {
-  test_extension_cache_.reset(new extensions::ExtensionCacheFake());
   InProcessBrowserTest::SetUp();
 }
 
@@ -81,10 +73,6 @@
 
 void PolicyTest::SetUpOnMainThread() {
   host_resolver()->AddRule("*", "127.0.0.1");
-  if (extension_service()->updater()) {
-    extension_service()->updater()->SetExtensionCacheForTesting(
-        test_extension_cache_.get());
-  }
 }
 
 void PolicyTest::SetUpCommandLine(base::CommandLine* command_line) {
@@ -160,55 +148,6 @@
 }
 #endif  // defined(OS_CHROMEOS)
 
-extensions::ExtensionService* PolicyTest::extension_service() {
-  extensions::ExtensionSystem* system =
-      extensions::ExtensionSystem::Get(browser()->profile());
-  return system->extension_service();
-}
-
-extensions::ExtensionRegistry* PolicyTest::extension_registry() {
-  return extensions::ExtensionRegistry::Get(browser()->profile());
-}
-
-const extensions::Extension* PolicyTest::InstallExtension(
-    const base::FilePath::StringType& name) {
-  base::FilePath extension_path(ui_test_utils::GetTestFilePath(
-      base::FilePath(kTestExtensionsDir), base::FilePath(name)));
-  scoped_refptr<extensions::CrxInstaller> installer =
-      extensions::CrxInstaller::CreateSilent(extension_service());
-  installer->set_allow_silent_install(true);
-  installer->set_install_cause(extension_misc::INSTALL_CAUSE_UPDATE);
-  installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE);
-  installer->set_off_store_install_allow_reason(
-      extensions::CrxInstaller::OffStoreInstallAllowReason::
-          OffStoreInstallAllowedInTest);
-
-  content::WindowedNotificationObserver observer(
-      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
-      content::NotificationService::AllSources());
-  installer->InstallCrx(extension_path);
-  observer.Wait();
-  content::Details<const extensions::Extension> details = observer.details();
-  return details.ptr();
-}
-
-const extensions::Extension* PolicyTest::InstallBookmarkApp() {
-  WebApplicationInfo web_app;
-  web_app.title = base::ASCIIToUTF16("Bookmark App");
-  web_app.app_url = GURL("http://www.google.com");
-
-  scoped_refptr<extensions::CrxInstaller> installer =
-      extensions::CrxInstaller::CreateSilent(extension_service());
-
-  content::WindowedNotificationObserver observer(
-      extensions::NOTIFICATION_CRX_INSTALLER_DONE,
-      content::NotificationService::AllSources());
-  installer->InstallWebApp(web_app);
-  observer.Wait();
-  content::Details<const extensions::Extension> details = observer.details();
-  return details.ptr();
-}
-
 scoped_refptr<const extensions::Extension> PolicyTest::LoadUnpackedExtension(
     const base::FilePath::StringType& name) {
   base::FilePath extension_path(ui_test_utils::GetTestFilePath(
@@ -217,30 +156,6 @@
   return loader.LoadExtension(extension_path);
 }
 
-void PolicyTest::UninstallExtension(const std::string& id,
-                                    bool expect_success) {
-  if (expect_success) {
-    extensions::TestExtensionRegistryObserver observer(extension_registry());
-    extension_service()->UninstallExtension(
-        id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr);
-    observer.WaitForExtensionUninstalled();
-  } else {
-    content::WindowedNotificationObserver observer(
-        extensions::NOTIFICATION_EXTENSION_UNINSTALL_NOT_ALLOWED,
-        content::NotificationService::AllSources());
-    extension_service()->UninstallExtension(
-        id, extensions::UNINSTALL_REASON_FOR_TESTING, nullptr);
-    observer.Wait();
-  }
-}
-
-void PolicyTest::DisableExtension(const std::string& id) {
-  extensions::TestExtensionRegistryObserver observer(extension_registry());
-  extension_service()->DisableExtension(
-      id, extensions::disable_reason::DISABLE_USER_ACTION);
-  observer.WaitForExtensionUnloaded();
-}
-
 void PolicyTest::UpdateProviderPolicy(const PolicyMap& policy) {
   PolicyMap policy_with_defaults;
   policy_with_defaults.CopyFrom(policy);
diff --git a/chrome/browser/policy/policy_test_utils.h b/chrome/browser/policy/policy_test_utils.h
index 575faaa..e60d53e 100644
--- a/chrome/browser/policy/policy_test_utils.h
+++ b/chrome/browser/policy/policy_test_utils.h
@@ -7,17 +7,12 @@
 
 #include "ash/public/cpp/keyboard/keyboard_types.h"
 #include "base/files/file_path.h"
-#include "chrome/browser/extensions/updater/extension_cache_fake.h"
-#include "chrome/browser/extensions/updater/extension_updater.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/security_interstitials/core/controller_client.h"
-#include "extensions/browser/scoped_ignore_content_verifier_for_test.h"
 
 namespace extensions {
 class Extension;
-class ExtensionRegistry;
-class ExtensionService;
 }  // namespace extensions
 
 namespace policy {
@@ -45,22 +40,9 @@
 
   void SetShouldRequireCTForTesting(bool* required);
 
-  extensions::ExtensionService* extension_service();
-
-  extensions::ExtensionRegistry* extension_registry();
-
-  const extensions::Extension* InstallExtension(
-      const base::FilePath::StringType& name);
-
-  const extensions::Extension* InstallBookmarkApp();
-
   scoped_refptr<const extensions::Extension> LoadUnpackedExtension(
       const base::FilePath::StringType& name);
 
-  void UninstallExtension(const std::string& id, bool expect_success);
-
-  void DisableExtension(const std::string& id);
-
   void UpdateProviderPolicy(const PolicyMap& policy);
 
   // Sends a mouse click at the given coordinates to the current renderer.
@@ -113,10 +95,6 @@
       security_interstitials::SecurityInterstitialCommand command);
 
   MockConfigurationPolicyProvider provider_;
-  std::unique_ptr<extensions::ExtensionCacheFake> test_extension_cache_;
-  extensions::ScopedIgnoreContentVerifierForTest ignore_content_verifier_;
-  extensions::ExtensionUpdater::ScopedSkipScheduledCheckForTest
-      skip_scheduled_extension_checks_;
 };
 
 }  // namespace policy
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
index 69371f9..8fc28e5b 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/options.js
@@ -224,7 +224,7 @@
 cca.views.camera.Options.prototype.updateMirroring_ = function(facingMode) {
   // Update mirroring by detected facing-mode. Enable mirroring by default if
   // facing-mode isn't available.
-  var enabled = facingMode ? facingMode == 'user' : true;
+  var enabled = facingMode ? facingMode != 'environment' : true;
 
   // Override mirroring only if mirroring was toggled manually.
   if (this.videoDeviceId_ in this.mirroringToggles_) {
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js
index 471d806d..df120be9 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js
@@ -283,45 +283,30 @@
 
   this.updateIntraLineState_(this.line_);
 
-  /**
-   * @private {number|undefined}
-   */
+  /** @private {boolean} */
+  this.misspelled = false;
+  /** @private {boolean} */
+  this.grammarError = false;
+
+  /** @private {number|undefined} */
   this.fontSize_;
-  /**
-   * @private {string|undefined}
-   */
+  /** @private {string|undefined} */
   this.fontColor_;
-  /**
-   * @private {boolean|undefined}
-   */
+  /** @private {boolean|undefined} */
   this.linked_;
-  /**
-   * @private {boolean|undefined}
-   */
+  /** @private {boolean|undefined} */
   this.subscript_;
-  /**
-   * @private {boolean|undefined}
-   */
+  /** @private {boolean|undefined} */
   this.superscript_;
-  /**
-   * @private {boolean}
-   */
+  /** @private {boolean} */
   this.bold_ = false;
-  /**
-   * @private {boolean}
-   */
+  /** @private {boolean} */
   this.italic_ = false;
-  /**
-   * @private {boolean}
-   */
+  /** @private {boolean} */
   this.underline_ = false;
-  /**
-   * @private {boolean}
-   */
+  /** @private {boolean} */
   this.lineThrough_ = false;
-  /**
-   * @private {string|undefined}
-   */
+  /** @private {string|undefined} */
   this.fontFamily_;
 }
 
@@ -435,31 +420,8 @@
       if (!container)
         return;
 
-      if (container.markerTypes) {
-        // Only consider markers that start or end at the selection bounds.
-        var markerStartIndex = -1, markerEndIndex = -1;
-        var localStartOffset = cur.localStartOffset;
-        for (var i = 0; i < container.markerStarts.length; i++) {
-          if (container.markerStarts[i] == localStartOffset) {
-            markerStartIndex = i;
-            break;
-          }
-        }
-
-        var localEndOffset = cur.localEndOffset;
-        for (var i = 0; i < container.markerEnds.length; i++) {
-          if (container.markerEnds[i] == localEndOffset) {
-            markerEndIndex = i;
-            break;
-          }
-        }
-
-        if (markerStartIndex > -1)
-          this.speakTextMarker_(container.markerTypes[markerStartIndex]);
-
-        if (markerEndIndex > -1)
-          this.speakTextMarker_(container.markerTypes[markerEndIndex], true);
-      }
+      this.speakTextMarker_(
+          container, cur.localStartOffset, cur.localEndOffset);
 
       if (localStorage['announceRichTextAttributes'] == 'true')
         this.speakTextStyle_(container);
@@ -607,21 +569,31 @@
   },
 
   /**
-   * @param {number} markerType
-   * @param {boolean=} opt_end
+   * @param {AutomationNode!} container
+   * @param {number} selStart
+   * @param {number} selEnd
    * @private
    */
-  speakTextMarker_: function(markerType, opt_end) {
-    // TODO(dtseng): Plumb through constants to automation.
-    var msgs = [];
-    if (markerType & 1) {
-      if (localStorage['indicateMisspell'] == 'announce')
-        msgs.push(opt_end ? 'misspelling_end' : 'misspelling_start');
+  speakTextMarker_: function(container, selStart, selEnd) {
+    var markersWithinSelection = 0;
+    if (container.markerTypes) {
+      for (var i = 0; i < container.markerTypes.length; i++) {
+        // See if our selection intersects with this marker.
+        if (container.markerStarts[i] >= selStart ||
+            selEnd < container.markerEnds[i])
+          markersWithinSelection |= container.markerTypes[i];
+      }
     }
-    if (markerType & 2)
-      msgs.push(opt_end ? 'grammar_end' : 'grammar_start');
-    if (markerType & 4)
-      msgs.push(opt_end ? 'text_match_end' : 'text_match_start');
+
+    var msgs = [];
+    if (this.misspelled == !(markersWithinSelection & 1)) {
+      this.misspelled = !this.misspelled;
+      msgs.push(this.misspelled ? 'misspelling_start' : 'misspelling_end');
+    }
+    if (this.grammarError == !(markersWithinSelection & 2)) {
+      this.grammarError = !this.grammarError;
+      msgs.push(this.grammarError ? 'grammar_start' : 'grammar_end');
+    }
 
     if (msgs.length) {
       msgs.forEach(function(msg) {
@@ -913,6 +885,23 @@
   this.end_ = new Cursor(endNode, endIndex);
   this.end_ = this.end_.deepEquivalent || this.end_;
 
+  // Update |startIndex| and |endIndex| if the calls above to
+  // cursors.Cursor.deepEquivalent results in cursors to different container
+  // nodes. The cursors can point directly to inline text boxes, in which case
+  // we should not adjust the container start or end index.
+  if (startNode.role == RoleType.STATIC_TEXT && this.start_.node != startNode &&
+      this.start_.node.parent != startNode) {
+    startIndex = this.start_.index == cursors.NODE_INDEX ?
+        this.start_.node.name.length :
+        this.start_.index;
+  }
+  if (endNode.role == RoleType.STATIC_TEXT && this.end_.node != endNode &&
+      this.end_.node.parent != endNode) {
+    endIndex = this.end_.index == cursors.NODE_INDEX ?
+        this.end_.node.name.length :
+        this.end_.index;
+  }
+
   /** @private {number} */
   this.localContainerStartOffset_ = startIndex;
   /** @private {number} */
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs
index 91aab23..92409025 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs
@@ -1178,3 +1178,47 @@
     input.focus();
   });
 });
+
+TEST_F('ChromeVoxEditingTest', 'GrammarErrors', function() {
+  var mockFeedback = this.createMockFeedback();
+  this.runWithLoadedTree(function() {/*!
+    <div contenteditable="true" role="textbox">
+      This <span aria-invalid="grammar">are</span> a test
+    </div>
+    <button id="go">Go</button>
+
+    <script>
+      document.getElementById('go').addEventListener('click', function() {
+        var sel = getSelection();
+        sel.modify('move', 'forward', 'character');
+      }, true);
+    </script>
+  */}, function(root) {
+    var input = root.find({role: RoleType.TEXT_FIELD});
+    var go = root.find({role: RoleType.BUTTON});
+    var moveByChar = go.doDefault.bind(go);
+
+    this.listenOnce(input, 'focus', function() {
+      mockFeedback.call(moveByChar)
+          .expectSpeech('h')
+          .call(moveByChar)
+          .expectSpeech('i')
+          .call(moveByChar)
+          .expectSpeech('s')
+          .call(moveByChar)
+          .expectSpeech(' ')
+
+          .call(moveByChar)
+          .expectSpeech('a', 'Grammar error')
+          .call(moveByChar)
+          .expectSpeech('r')
+          .call(moveByChar)
+          .expectSpeech('e')
+          .call(moveByChar)
+          .expectSpeech(' ', 'Leaving grammar error')
+
+          .replay();
+    });
+    input.focus();
+  });
+});
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
index 47ca7c55..f9a2d552 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
@@ -2974,25 +2974,18 @@
       <message desc="Description of a command that toggles between 6 and 8 dot braille." name="IDS_CHROMEVOX_TOGGLE_BRAILLE_TABLE">
         Toggle between 6 and 8 dot braille
       </message>
-      <message desc="Spoken when a user navigates to the beginning of a misspelled word." name="IDS_CHROMEVOX_MISSPELLING_START">
-        Misspelling start
+      <message desc="Spoken when a user navigates into a misspelled word." name="IDS_CHROMEVOX_MISSPELLING_START">
+        Misspelled
       </message>
-      <message desc="Spoken when a user navigates to the end of a misspelled word." name="IDS_CHROMEVOX_MISSPELLING_END">
-        Misspelling end
+      <message desc="Spoken when a user navigates out of a misspelled word." name="IDS_CHROMEVOX_MISSPELLING_END">
+        Leaving misspelled
       </message>
-      <message desc="Spoken when a user navigates to the beginning of a grammar error." name="IDS_CHROMEVOX_GRAMMAR_START">
-        Grammar error start
+      <message desc="Spoken when a user navigates into a grammar error." name="IDS_CHROMEVOX_GRAMMAR_START">
+        Grammar error
       </message>
-      <message desc="Spoken when a user navigates to the end of a grammar error." name="IDS_CHROMEVOX_GRAMMAR_END">
-        Grammar error end
+      <message desc="Spoken when a user navigates out of a grammar error." name="IDS_CHROMEVOX_GRAMMAR_END">
+        Leaving grammar error
       </message>
-      <message desc="Spoken when a user navigates to the beginning of a text match from a find in page." name="IDS_CHROMEVOX_TEXT_MATCH_START">
-        Text match start
-      </message>
-      <message desc="Spoken when a user navigates to the end of a text match from a find in page." name="IDS_CHROMEVOX_TEXT_MATCH_END">
-        Text match end
-      </message>
-
       <message desc="Spoken to describe text that is superscript." name="IDS_CHROMEVOX_SUPERSCRIPT">
         Superscript
       </message>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index 1ad2935..11c6038 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -664,7 +664,7 @@
           </settings-subpage>
        </template>
       </template>
-      <template is="dom-if" if="[[enableBluetoothScanningContentSetting_]]">
+      <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]">
         <template is="dom-if" route-path="/content/bluetoothScanning" no-search>
           <settings-subpage page-title="$i18n{siteSettingsBluetoothScanning}"
               search-label="$i18n{siteSettingsAllSitesSearch}"
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js
index 57b42d06..e3d4481 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.js
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -136,14 +136,6 @@
     },
 
     /** @private */
-    enableBluetoothScanningContentSetting_: {
-      type: Boolean,
-      value: function() {
-        return loadTimeData.getBoolean('enableBluetoothScanningContentSetting');
-      }
-    },
-
-    /** @private */
     enableNativeFileSystemWriteContentSetting_: {
       type: Boolean,
       value: function() {
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
index 7569eea..c5f979a8 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
@@ -51,7 +51,8 @@
 
           <div id="pinPrompt">
             <p>$i18n{securityKeysBioEnrollmentPinPrompt}</p>
-            <settings-security-keys-pin-field id="pin">
+            <settings-security-keys-pin-field
+                id="pin" label="$i18n{securityKeysPIN}">
             </settings-security-keys-pin-field>
           </div>
 
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html
index 0045f54..070ed2d 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html
@@ -69,7 +69,8 @@
 
           <div id="pinPrompt">
             <p>$i18nRaw{securityKeysCredentialManagementPinPrompt}</p>
-            <settings-security-keys-pin-field id="pin">
+            <settings-security-keys-pin-field
+                id="pin" label="$i18n{securityKeysPIN}">
             </settings-security-keys-pin-field>
           </div>
 
@@ -92,9 +93,9 @@
                     </div>
                     <div class="user">[[formatUser_(item)]]</div>
                     <cr-checkbox on-change="checkedCredentialsChanged_"
-                       data-id$="[[item.id]]"
-                       checked="[[credentialIsChecked_(item.id)]]"
-                       disabled="[[deleteInProgress_]]"></cr-checkbox>
+                        data-id$="[[item.id]]"
+                        checked="[[credentialIsChecked_(item.id)]]"
+                        disabled="[[deleteInProgress_]]"></cr-checkbox>
                   </div>
                 </template>
               </iron-list>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js
index 146f226..062c329 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js
@@ -98,7 +98,9 @@
     if (!this.$.pin.validate()) {
       return;
     }
+    this.confirmButtonDisabled_ = true;
     this.browserProxy_.providePIN(this.$.pin.value).then((retries) => {
+      this.confirmButtonDisabled_ = false;
       if (retries != null) {
         this.$.pin.showIncorrectPINError(retries);
         this.collectPin_();
@@ -258,9 +260,11 @@
     assert(this.credentials_ && this.credentials_.length > 0);
     assert(this.checkedCredentialIds_.size > 0);
 
+    this.confirmButtonDisabled_ = true;
     this.deleteInProgress_ = true;
     this.browserProxy_.deleteCredentials(Array.from(this.checkedCredentialIds_))
         .then((err) => {
+          this.confirmButtonDisabled_ = false;
           this.deleteInProgress_ = false;
           this.onError_(err);
         });
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html
index bd62a4001..f185cba 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html
@@ -3,6 +3,7 @@
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
 <link rel="import" href="../i18n_setup.html">
 <link rel="import" href="../settings_shared_css.html">
 
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js
index abace08a..72159d83 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js
@@ -18,7 +18,10 @@
     label: String,
 
     /** The validation error label of the input field. */
-    error: String,
+    error: {
+      type: String,
+      observer: 'errorChanged_',
+    },
 
     /** The value of the input field. */
     value: String,
@@ -32,6 +35,10 @@
 
   /** @override */
   attached: function() {
+    Polymer.RenderStatus.afterNextRender(this, function() {
+      Polymer.IronA11yAnnouncer.requestAvailability();
+    });
+
     this.inputVisible_ = false;
   },
 
@@ -158,4 +165,11 @@
 
     return '';
   },
+
+  /** @private */
+  errorChanged_: function() {
+    // Make screen readers announce changes to the PIN validation error
+    // label.
+    this.fire('iron-announce', {text: this.error});
+  },
 });
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index a966106..d6a6eae3 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -353,7 +353,7 @@
         r.SITE_SETTINGS_PAYMENT_HANDLER =
             r.SITE_SETTINGS.createChild('paymentHandler');
       }
-      if (loadTimeData.getBoolean('enableBluetoothScanningContentSetting')) {
+      if (loadTimeData.getBoolean('enableExperimentalWebPlatformFeatures')) {
         r.SITE_SETTINGS_BLUETOOTH_SCANNING =
             r.SITE_SETTINGS.createChild('bluetoothScanning');
       }
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html
index 1472652c..24e293d 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.html
+++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -207,7 +207,7 @@
           icon="settings:payment-handler" id="paymentHandler"
           label="$i18n{siteSettingsPaymentHandler}">
       </site-details-permission>
-      <template is="dom-if" if="[[enableBluetoothScanningContentSetting_]]">
+      <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]">
         <site-details-permission
             category="{{ContentSettingsTypes.BLUETOOTH_SCANNING}}"
             icon="settings:bluetooth-scanning" id="bluetoothScanning"
diff --git a/chrome/browser/resources/settings/site_settings/site_details.js b/chrome/browser/resources/settings/site_settings/site_details.js
index 875533a5..6e85996 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.js
+++ b/chrome/browser/resources/settings/site_settings/site_details.js
@@ -63,14 +63,6 @@
     },
 
     /** @private */
-    enableBluetoothScanningContentSetting_: {
-      type: Boolean,
-      value: function() {
-        return loadTimeData.getBoolean('enableBluetoothScanningContentSetting');
-      }
-    },
-
-    /** @private */
     enableNativeFileSystemWriteContentSetting_: {
       type: Boolean,
       value: function() {
@@ -185,7 +177,9 @@
           exceptionList.forEach((exception, i) => {
             // |exceptionList| should be in the same order as
             // |categoryList|.
-            permissionsMap[categoryList[i]].site = exception;
+            if (permissionsMap[categoryList[i]]) {
+              permissionsMap[categoryList[i]].site = exception;
+            }
           });
 
           // The displayName won't change, so just use the first
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
index af45a35..a87ec9a 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
@@ -196,15 +196,15 @@
         settings.ContentSettingsTypes.SERIAL_PORTS,
         'enableExperimentalWebPlatformFeatures');
     addOrRemoveSettingWithFlag(
+        settings.ContentSettingsTypes.BLUETOOTH_SCANNING,
+        'enableExperimentalWebPlatformFeatures');
+    addOrRemoveSettingWithFlag(
         settings.ContentSettingsTypes.ADS,
         'enableSafeBrowsingSubresourceFilter');
     addOrRemoveSettingWithFlag(
         settings.ContentSettingsTypes.PAYMENT_HANDLER,
         'enablePaymentHandlerContentSetting');
     addOrRemoveSettingWithFlag(
-        settings.ContentSettingsTypes.BLUETOOTH_SCANNING,
-        'enableBluetoothScanningContentSetting');
-    addOrRemoveSettingWithFlag(
         settings.ContentSettingsTypes.NATIVE_FILE_SYSTEM_WRITE,
         'enableNativeFileSystemWriteContentSetting');
     return this.contentTypes_.slice(0);
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
index a2adc7f..b65889b 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -247,7 +247,7 @@
               '$i18nPolymer{siteSettingsPaymentHandlerBlock}')]]"></cr-link-row>
     </template>
 
-    <template is="dom-if" if="[[enableBluetoothScanningContentSetting_]]">
+    <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]">
       <cr-link-row class="hr two-line"
           data-route="SITE_SETTINGS_BLUETOOTH_SCANNING"
           id="bluetooth-scanning" label="$i18n{siteSettingsBluetoothScanning}"
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
index 25bee399..b04a5ac7 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
@@ -60,14 +60,6 @@
     },
 
     /** @private */
-    enableBluetoothScanningContentSetting_: {
-      type: Boolean,
-      value: function() {
-        return loadTimeData.getBoolean('enableBluetoothScanningContentSetting');
-      }
-    },
-
-    /** @private */
     enableNativeFileSystemWriteContentSetting_: {
       type: Boolean,
       value: function() {
@@ -130,7 +122,7 @@
       pairs.push([R.SITE_SETTINGS_SERIAL_PORTS, 'serial-ports']);
     }
 
-    if (this.enableBluetoothScanningContentSetting_) {
+    if (this.enableExperimentalWebPlatformFeatures_) {
       pairs.push([R.SITE_SETTINGS_BLUETOOTH_SCANNING, 'bluetooth-scanning']);
     }
 
diff --git a/chrome/browser/ui/android/page_info/page_info_controller_android.cc b/chrome/browser/ui/android/page_info/page_info_controller_android.cc
index 5e169791..d7b61dc 100644
--- a/chrome/browser/ui/android/page_info/page_info_controller_android.cc
+++ b/chrome/browser/ui/android/page_info/page_info_controller_android.cc
@@ -125,7 +125,7 @@
   permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_AUTOPLAY);
   permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_SOUND);
   base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
-  if (cmd->HasSwitch(switches::kEnableWebBluetoothScanning))
+  if (cmd->HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
     permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING);
 
   std::map<ContentSettingsType, ContentSetting>
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 4856b2b..a6d3e1e 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -39,7 +39,6 @@
 #include "components/autofill/content/browser/autofill_log_router_factory.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
-#include "components/autofill/core/browser/autofill_internals_service.h"
 #include "components/autofill/core/browser/form_data_importer.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/ui/payments/card_unmask_prompt_view.h"
diff --git a/chrome/browser/ui/startup/bad_flags_prompt.cc b/chrome/browser/ui/startup/bad_flags_prompt.cc
index 49d76be9..29d6a76 100644
--- a/chrome/browser/ui/startup/bad_flags_prompt.cc
+++ b/chrome/browser/ui/startup/bad_flags_prompt.cc
@@ -126,11 +126,6 @@
     // updating components won't be performed until shutdown.
     switches::kDisableBestEffortTasks,
 
-    // The UI for Web Bluetooth scanning is not yet implemented. Without the
-    // UI websites can scan for bluetooth without user intervention. Show a
-    // warning until the UI is complete.
-    switches::kEnableWebBluetoothScanning,
-
     // Enables save data feature which can cause user traffic to be proxied via
     // Google's data reduction proxy servers.
     data_reduction_proxy::switches::kEnableDataReductionProxy,
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
index ee76040..827c232e 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -317,8 +317,8 @@
 /************** AutofillPopupItemView **************/
 
 void AutofillPopupItemView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
-  AutofillPopupController* controller = popup_view_->controller();
-  auto suggestion = controller->GetSuggestionAt(line_number_);
+  AutofillPopupController* controller = popup_view()->controller();
+  auto suggestion = controller->GetSuggestionAt(line_number());
   std::vector<base::string16> text;
   text.push_back(suggestion.value);
 
@@ -337,17 +337,17 @@
   // Options are selectable.
   node_data->role = ax::mojom::Role::kMenuItem;
   node_data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
-                              is_selected_);
+                              is_selected());
 
   // Compute set size and position in set, by checking the frontend_id of each
   // row, summing the number of non-separator rows, and subtracting the number
   // of separators found before this row from its |pos_in_set|.
   int set_size = 0;
-  int pos_in_set = line_number_ + 1;
+  int pos_in_set = line_number() + 1;
   for (int i = 0; i < controller->GetLineCount(); ++i) {
     if (controller->GetSuggestionAt(i).frontend_id ==
         autofill::POPUP_ITEM_ID_SEPARATOR) {
-      if (i < line_number_)
+      if (i < line_number())
         --pos_in_set;
     } else {
       ++set_size;
@@ -358,27 +358,27 @@
 }
 
 void AutofillPopupItemView::OnMouseEntered(const ui::MouseEvent& event) {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
   if (controller)
-    controller->SetSelectedLine(line_number_);
+    controller->SetSelectedLine(line_number());
 }
 
 void AutofillPopupItemView::OnMouseExited(const ui::MouseEvent& event) {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
   if (controller)
     controller->SelectionCleared();
 }
 
 void AutofillPopupItemView::OnMouseReleased(const ui::MouseEvent& event) {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
   if (controller && event.IsOnlyLeftMouseButton() &&
       HitTestPoint(event.location())) {
-    controller->AcceptSuggestion(line_number_);
+    controller->AcceptSuggestion(line_number());
   }
 }
 
 void AutofillPopupItemView::CreateContent() {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
 
   auto* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kHorizontal,
@@ -388,7 +388,7 @@
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
   const gfx::ImageSkia icon =
-      controller->layout_model().GetIconImage(line_number_);
+      controller->layout_model().GetIconImage(line_number());
 
   if (!icon.isNull()) {
     AddIcon(icon);
@@ -434,15 +434,15 @@
 std::unique_ptr<views::View> AutofillPopupItemView::CreateValueLabel() {
   // TODO(crbug.com/831603): Remove elision responsibilities from controller.
   base::string16 text =
-      popup_view_->controller()->GetElidedValueAt(line_number_);
-  if (popup_view_->controller()
-          ->GetSuggestionAt(line_number_)
+      popup_view()->controller()->GetElidedValueAt(line_number());
+  if (popup_view()->controller()
+          ->GetSuggestionAt(line_number())
           .is_value_secondary) {
     return CreateSecondaryLabel(text);
   }
 
   auto text_label = CreateLabelWithStyleAndContext(
-      popup_view_->controller()->GetElidedValueAt(line_number_),
+      popup_view()->controller()->GetElidedValueAt(line_number()),
       ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, GetPrimaryTextStyle());
 
   const gfx::Font::Weight font_weight = GetPrimaryTextWeight();
@@ -512,8 +512,8 @@
 
 std::unique_ptr<views::Background>
 AutofillPopupSuggestionView::CreateBackground() {
-  return is_selected_ ? views::CreateSolidBackground(
-                            popup_view_->GetSelectedBackgroundColor())
+  return is_selected() ? views::CreateSolidBackground(
+                            popup_view()->GetSelectedBackgroundColor())
                       : nullptr;
 }
 
@@ -535,7 +535,7 @@
 
 std::unique_ptr<views::View> AutofillPopupSuggestionView::CreateSubtextLabel() {
   base::string16 label_text =
-      popup_view_->controller()->GetSuggestionAt(line_number_).label;
+      popup_view()->controller()->GetSuggestionAt(line_number()).label;
   if (label_text.empty())
     return nullptr;
 
@@ -590,9 +590,9 @@
     int line_number,
     int frontend_id)
     : AutofillPopupSuggestionView(popup_view, line_number, frontend_id) {
-  origin_ = popup_view_->controller()->GetElidedLabelAt(line_number_);
+  origin_ = popup_view->controller()->GetElidedLabelAt(line_number);
   masked_password_ =
-      popup_view_->controller()->GetSuggestionAt(line_number_).additional_label;
+      popup_view->controller()->GetSuggestionAt(line_number).additional_label;
 }
 
 /************** AutofillPopupFooterView **************/
@@ -614,9 +614,9 @@
       /*left=*/0,
       /*bottom=*/0,
       /*right=*/0,
-      /*color=*/popup_view_->GetSeparatorColor()));
+      /*color=*/popup_view()->GetSeparatorColor()));
 
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
 
   views::BoxLayout* layout_manager =
       SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -627,7 +627,7 @@
       views::BoxLayout::CrossAxisAlignment::kStretch);
 
   const gfx::ImageSkia icon =
-      controller->layout_model().GetIconImage(line_number_);
+      controller->layout_model().GetIconImage(line_number());
 
   // A FooterView shows an icon, if any, on the trailing (right in LTR) side,
   // but the Show Account Cards context is an anomaly. Its icon is on the
@@ -660,8 +660,8 @@
 }
 
 std::unique_ptr<views::Background> AutofillPopupFooterView::CreateBackground() {
-  return is_selected_ ? views::CreateSolidBackground(
-                            popup_view_->GetSelectedBackgroundColor())
+  return is_selected() ? views::CreateSolidBackground(
+                            popup_view()->GetSelectedBackgroundColor())
                       : nullptr;
 }
 
@@ -703,7 +703,7 @@
   SetLayoutManager(std::make_unique<views::FillLayout>());
 
   views::Separator* separator = new views::Separator();
-  separator->SetColor(popup_view_->GetSeparatorColor());
+  separator->SetColor(popup_view()->GetSeparatorColor());
   // Add some spacing between the the previous item and the separator.
   separator->SetPreferredHeight(
       views::MenuConfig::instance().separator_thickness);
@@ -745,16 +745,16 @@
 
 void AutofillPopupWarningView::GetAccessibleNodeData(
     ui::AXNodeData* node_data) {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
   if (!controller)
     return;
 
-  node_data->SetName(controller->GetSuggestionAt(line_number_).value);
+  node_data->SetName(controller->GetSuggestionAt(line_number()).value);
   node_data->role = ax::mojom::Role::kStaticText;
 }
 
 void AutofillPopupWarningView::CreateContent() {
-  AutofillPopupController* controller = popup_view_->controller();
+  AutofillPopupController* controller = popup_view()->controller();
 
   int horizontal_margin = GetHorizontalMargin();
   int vertical_margin = AutofillPopupBaseView::GetCornerRadius();
@@ -764,9 +764,9 @@
       gfx::Insets(vertical_margin, horizontal_margin)));
 
   auto text_label = CreateLabelWithColorReadabilityDisabled(
-      controller->GetElidedValueAt(line_number_),
+      controller->GetElidedValueAt(line_number()),
       ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, ChromeTextStyle::STYLE_RED);
-  text_label->SetEnabledColor(popup_view_->GetWarningColor());
+  text_label->SetEnabledColor(popup_view()->GetWarningColor());
   text_label->SetMultiLine(true);
   int max_width =
       std::min(kAutofillPopupMaxWidth,
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
index 5a4c38c0..8663b08d 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.h
@@ -51,13 +51,20 @@
   // method which calls Init before returning.
   void Init();
 
+  AutofillPopupViewNativeViews* popup_view() { return popup_view_; }
+  int line_number() const { return line_number_; }
+  bool is_selected() const { return is_selected_; }
+
   virtual void CreateContent() = 0;
   virtual void RefreshStyle() = 0;
   virtual std::unique_ptr<views::Background> CreateBackground() = 0;
 
+ private:
   AutofillPopupViewNativeViews* popup_view_;
   const int line_number_;
   bool is_selected_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillPopupRowView);
 };
 
 // Views implementation for the autofill and password suggestion.
diff --git a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
index 70c2173f..30bb7c5 100644
--- a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
+++ b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
@@ -26,13 +26,16 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/hit_test_region_observer.h"
 #include "content/public/test/test_frame_navigation_observer.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
 #include "net/base/escape.h"
 #include "net/dns/mock_host_resolver.h"
@@ -88,16 +91,26 @@
   // into the specified |location| inside |web_contents|.
   // |location| is relative to |web_contents|.
   // Returns true upon success.
-  bool SimulateDragEnter(gfx::Point location, const std::string& text) {
+  bool SimulateDragEnter(const gfx::Point& location, const std::string& text) {
     os_exchange_data_ = std::make_unique<ui::OSExchangeData>();
     os_exchange_data_->SetString(base::UTF8ToUTF16(text));
     return SimulateDragEnter(location, *os_exchange_data_);
   }
 
+  // Simulates notification that |url| was dragged from outside of the browser,
+  // into the specified |location| inside |web_contents|.
+  // |location| is relative to |web_contents|.
+  // Returns true upon success.
+  bool SimulateDragEnter(const gfx::Point& location, const GURL& url) {
+    os_exchange_data_ = std::make_unique<ui::OSExchangeData>();
+    os_exchange_data_->SetURL(url, base::UTF8ToUTF16(url.spec()));
+    return SimulateDragEnter(location, *os_exchange_data_);
+  }
+
   // Simulates dropping of the drag-and-dropped item.
   // SimulateDragEnter needs to be called first.
   // Returns true upon success.
-  bool SimulateDrop(gfx::Point location) {
+  bool SimulateDrop(const gfx::Point& location) {
     if (!active_drag_event_) {
       ADD_FAILURE() << "Cannot drop a drag that hasn't started yet.";
       return false;
@@ -119,7 +132,8 @@
   }
 
  private:
-  bool SimulateDragEnter(gfx::Point location, const ui::OSExchangeData& data) {
+  bool SimulateDragEnter(const gfx::Point& location,
+                         const ui::OSExchangeData& data) {
     if (active_drag_event_) {
       ADD_FAILURE() << "Cannot start a new drag when old one hasn't ended yet.";
       return false;
@@ -148,7 +162,7 @@
     return delegate;
   }
 
-  void CalculateEventLocations(gfx::Point web_contents_relative_location,
+  void CalculateEventLocations(const gfx::Point& web_contents_relative_location,
                                gfx::PointF* out_event_location,
                                gfx::PointF* out_event_root_location) {
     gfx::NativeView view = web_contents_->GetNativeView();
@@ -664,6 +678,11 @@
     return drag_simulator_->SimulateDragEnter(kMiddleOfRightFrame, text);
   }
 
+  bool SimulateDragEnterToRightFrame(const GURL& url) {
+    AssertTestPageIsLoaded();
+    return drag_simulator_->SimulateDragEnter(kMiddleOfRightFrame, url);
+  }
+
   bool SimulateDropInRightFrame() {
     AssertTestPageIsLoaded();
     return drag_simulator_->SimulateDrop(kMiddleOfRightFrame);
@@ -789,6 +808,83 @@
   }
 }
 
+#if defined(OS_WIN)
+// Flaky: https://crbug.com/988938
+#define MAYBE_DropValidUrlFromOutside DISABLED_DropValidUrlFromOutside
+#else
+#define MAYBE_DropValidUrlFromOutside DropValidUrlFromOutside
+#endif
+// Scenario: drag URL from outside the browser and drop to the right frame.
+// Mostly focuses on covering the navigation path (the dragover and/or drop DOM
+// events are already covered via the DropTextFromOutside test above).
+IN_PROC_BROWSER_TEST_P(DragAndDropBrowserTest, MAYBE_DropValidUrlFromOutside) {
+  std::string frame_site = use_cross_site_subframe() ? "b.com" : "a.com";
+  ASSERT_TRUE(NavigateToTestPage("a.com"));
+  ASSERT_TRUE(NavigateRightFrame(frame_site, "title1.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::NavigationController& controller = web_contents->GetController();
+  int initial_history_count = controller.GetEntryCount();
+
+  // Drag a normal URL from outside the browser into/over the right frame.
+  GURL dragged_url = embedded_test_server()->GetURL("d.com", "/title2.html");
+  ASSERT_TRUE(SimulateDragEnterToRightFrame(dragged_url));
+
+  // Drop into the right frame - this should initiate navigating the main frame
+  // to |dragged_url|.
+  content::TestNavigationObserver nav_observer(web_contents, 1);
+  ASSERT_TRUE(SimulateDropInRightFrame());
+
+  // Verify that the main frame got navigated to |dragged_url|.
+  nav_observer.Wait();
+  EXPECT_EQ(dragged_url, web_contents->GetMainFrame()->GetLastCommittedURL());
+  EXPECT_EQ(initial_history_count + 1, controller.GetEntryCount());
+}
+
+#if defined(OS_WIN)
+// Flaky: https://crbug.com/988938
+#define MAYBE_DropForbiddenUrlFromOutside DISABLED_DropForbiddenUrlFromOutside
+#else
+#define MAYBE_DropForbiddenUrlFromOutside DropForbiddenUrlFromOutside
+#endif
+// Scenario: drag URL from outside the browser and drop to the right frame.
+// Mostly focuses on covering the navigation path (the dragover and/or drop DOM
+// events are already covered via the DropTextFromOutside test above).
+IN_PROC_BROWSER_TEST_P(DragAndDropBrowserTest,
+                       MAYBE_DropForbiddenUrlFromOutside) {
+  std::string frame_site = use_cross_site_subframe() ? "b.com" : "a.com";
+  ASSERT_TRUE(NavigateToTestPage("a.com"));
+  ASSERT_TRUE(NavigateRightFrame(frame_site, "title1.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::NavigationController& controller = web_contents->GetController();
+  int initial_history_count = controller.GetEntryCount();
+
+  // Drag URL from outside the browser into/over the right frame.  The test uses
+  // a URL that:
+  // 1. Passes RenderWidgetHostImpl::FilterDropData checks.
+  // 2. Fails CanDisplay checks in Blink (e.g. in RemoteFrame::Navigate).
+  //    - This condition trigger the crash from https://crbug.com/1003169
+  // 3. Passes BeginNavigation checks
+  //    - This rules out "chrome-error://blah".
+  GURL dragged_url("blob:null/some-guid");
+  ASSERT_TRUE(SimulateDragEnterToRightFrame(dragged_url));
+
+  // Drop into the right frame - this should *not* initiate navigating the main
+  // frame to |dragged_url| (because this would be a forbidden, web->file
+  // navigation).
+  ASSERT_TRUE(SimulateDropInRightFrame());
+
+  // Verify that the right frame is still responsive (this is a regression test
+  // for https://crbug.com/1003169.
+  ASSERT_TRUE(right_frame()->GetProcess()->IsInitializedAndNotDead());
+  EXPECT_EQ(123, content::EvalJs(right_frame(), "123"));
+
+  // Verify that the history remains unchanged.
+  EXPECT_NE(dragged_url, web_contents->GetMainFrame()->GetLastCommittedURL());
+  EXPECT_EQ(initial_history_count, controller.GetEntryCount());
+}
+
 #if !defined(NDEBUG) || defined(OS_WIN)
 // Flaky: https://crbug.com/988938
 #define MAYBE_DragStartInFrame DISABLED_DragStartInFrame
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
index df3774a..7f6f79c 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -239,7 +239,9 @@
   const SkColor kIconColor =
       ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
           ui::NativeTheme::kColorId_DefaultIconColor);
-  const SkColor kBorderColor = SkColorSetA(kIconColor, /*alpha=*/100);
+  const SkColor kBorderColor =
+      ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
+          ui::NativeTheme::kColorId_MenuSeparatorColor);
   constexpr int kBorderThickness = 1;
   constexpr int kButtonRadius = kIconSize / 2 + kIconPadding;
 
diff --git a/chrome/browser/ui/webui/devtools_ui_data_source.cc b/chrome/browser/ui/webui/devtools_ui_data_source.cc
index 95e73c5..c29ccd0 100644
--- a/chrome/browser/ui/webui/devtools_ui_data_source.cc
+++ b/chrome/browser/ui/webui/devtools_ui_data_source.cc
@@ -57,6 +57,9 @@
   } else if (base::EndsWith(filename, ".js",
                             base::CompareCase::INSENSITIVE_ASCII)) {
     return "application/javascript";
+  } else if (base::EndsWith(filename, ".mjs",
+                            base::CompareCase::INSENSITIVE_ASCII)) {
+    return "application/javascript";
   } else if (base::EndsWith(filename, ".png",
                             base::CompareCase::INSENSITIVE_ASCII)) {
     return "image/png";
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 7a3d590..430ec1a 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -3058,10 +3058,6 @@
       cmd.HasSwitch(::switches::kEnableExperimentalWebPlatformFeatures));
 
   html_source->AddBoolean(
-      "enableBluetoothScanningContentSetting",
-      cmd.HasSwitch(::switches::kEnableWebBluetoothScanning));
-
-  html_source->AddBoolean(
       "enableNativeFileSystemWriteContentSetting",
       base::FeatureList::IsEnabled(::blink::features::kNativeFileSystemAPI));
 
diff --git a/chrome/browser/util/android/BUILD.gn b/chrome/browser/util/android/BUILD.gn
index c664532..efb79a4 100644
--- a/chrome/browser/util/android/BUILD.gn
+++ b/chrome/browser/util/android/BUILD.gn
@@ -5,7 +5,10 @@
 import("//build/config/android/rules.gni")
 
 android_library("java") {
-  java_files = [ "java/src/org/chromium/chrome/browser/util/HashUtil.java" ]
+  java_files = [
+    "java/src/org/chromium/chrome/browser/util/HashUtil.java",
+    "java/src/org/chromium/chrome/browser/util/IntentUtils.java",
+  ]
   deps = [
     "//base:base_java",
     "//content/public/android:content_java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/IntentUtils.java b/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/IntentUtils.java
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/util/IntentUtils.java
rename to chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/IntentUtils.java
diff --git a/chrome/browser/vr/service/vr_service_impl.cc b/chrome/browser/vr/service/vr_service_impl.cc
index 3fbb23d9..31f1a16b0 100644
--- a/chrome/browser/vr/service/vr_service_impl.cc
+++ b/chrome/browser/vr/service/vr_service_impl.cc
@@ -366,7 +366,7 @@
 void VRServiceImpl::ShowConsentPrompt(
     device::mojom::XRSessionOptionsPtr options,
     device::mojom::VRService::RequestSessionCallback callback,
-    const BrowserXRRuntime* runtime,
+    BrowserXRRuntime* runtime,
     std::set<device::mojom::XRSessionFeature> requested_features) {
   DCHECK(options);
   DCHECK(runtime);
@@ -378,7 +378,7 @@
   // WebVR did not require permissions.
   // TODO(crbug.com/968221): Address privacy requirements for inline sessions
   if (options->is_legacy_webvr) {
-    DoRequestSession(std::move(options), std::move(callback),
+    DoRequestSession(std::move(options), std::move(callback), runtime,
                      std::move(requested_features));
     return;
   }
@@ -391,7 +391,7 @@
   if (consent_level == XrConsentPromptLevel::kNone ||
       IsConsentGrantedForDevice(runtime->GetId(), consent_level) ||
       IsXrDeviceConsentPromptDisabledForTesting()) {
-    DoRequestSession(std::move(options), std::move(callback),
+    DoRequestSession(std::move(options), std::move(callback), runtime,
                      std::move(requested_features));
     return;
   }
@@ -405,8 +405,8 @@
         render_frame_host_->GetRoutingID(),
         base::BindOnce(&VRServiceImpl::OnConsentResult,
                        weak_ptr_factory_.GetWeakPtr(), std::move(options),
-                       std::move(callback), std::move(requested_features),
-                       consent_level));
+                       std::move(callback), runtime->GetId(),
+                       std::move(requested_features), consent_level));
     return;
 #else
     std::move(callback).Run(nullptr);
@@ -419,7 +419,8 @@
         render_frame_host_->GetRoutingID(), consent_level,
         base::BindOnce(&VRServiceImpl::OnConsentResult,
                        weak_ptr_factory_.GetWeakPtr(), std::move(options),
-                       std::move(callback), std::move(requested_features)));
+                       std::move(callback), runtime->GetId(),
+                       std::move(requested_features)));
     return;
   }
 #elif defined(OS_WIN)
@@ -427,7 +428,8 @@
       GetWebContents(), consent_level,
       base::BindOnce(&VRServiceImpl::OnConsentResult,
                      weak_ptr_factory_.GetWeakPtr(), std::move(options),
-                     std::move(callback), std::move(requested_features)));
+                     std::move(callback), runtime->GetId(),
+                     std::move(requested_features)));
   return;
 #endif
 
@@ -437,6 +439,7 @@
 void VRServiceImpl::OnConsentResult(
     device::mojom::XRSessionOptionsPtr options,
     device::mojom::VRService::RequestSessionCallback callback,
+    device::mojom::XRDeviceId expected_runtime_id,
     std::set<device::mojom::XRSessionFeature> enabled_features,
     XrConsentPromptLevel consent_level,
     bool is_consent_granted) {
@@ -447,11 +450,15 @@
     return;
   }
 
+  // Get the runtime again, since we're running in an async context
+  // and the pointer returned from `GetRuntimeForOptions` is non-owning.
   auto* runtime = runtime_manager_->GetRuntimeForOptions(options.get());
-  if (!runtime) {
+
+  // Ensure that it's the same runtime as the one we expect.
+  if (!runtime || runtime->GetId() != expected_runtime_id) {
     std::move(callback).Run(
         device::mojom::RequestSessionResult::NewFailureReason(
-            device::mojom::RequestSessionError::NO_RUNTIME_FOUND));
+            device::mojom::RequestSessionError::UNKNOWN_RUNTIME_ERROR));
     return;
   }
   AddConsentGrantedDevice(runtime->GetId(), consent_level);
@@ -465,23 +472,17 @@
     return;
   }
 
-  DoRequestSession(std::move(options), std::move(callback),
+  DoRequestSession(std::move(options), std::move(callback), runtime,
                    std::move(enabled_features));
 }
 
 void VRServiceImpl::DoRequestSession(
     device::mojom::XRSessionOptionsPtr options,
     device::mojom::VRService::RequestSessionCallback callback,
+    BrowserXRRuntime* runtime,
     std::set<device::mojom::XRSessionFeature> enabled_features) {
   // Get the runtime we'll be creating a session with.
-  BrowserXRRuntime* runtime =
-      runtime_manager_->GetRuntimeForOptions(options.get());
-  if (!runtime) {
-    std::move(callback).Run(
-        device::mojom::RequestSessionResult::NewFailureReason(
-            device::mojom::RequestSessionError::NO_RUNTIME_FOUND));
-    return;
-  }
+  DCHECK(runtime);
 
   device::mojom::XRDeviceId session_runtime_id = runtime->GetId();
   TRACE_EVENT_INSTANT1("xr", "GetRuntimeForOptions", TRACE_EVENT_SCOPE_THREAD,
diff --git a/chrome/browser/vr/service/vr_service_impl.h b/chrome/browser/vr/service/vr_service_impl.h
index aa435b8..42e01d0 100644
--- a/chrome/browser/vr/service/vr_service_impl.h
+++ b/chrome/browser/vr/service/vr_service_impl.h
@@ -131,15 +131,17 @@
   void DoRequestSession(
       device::mojom::XRSessionOptionsPtr options,
       device::mojom::VRService::RequestSessionCallback callback,
+      BrowserXRRuntime* runtime,
       std::set<device::mojom::XRSessionFeature> enabled_features);
   void ShowConsentPrompt(
       device::mojom::XRSessionOptionsPtr options,
       device::mojom::VRService::RequestSessionCallback callback,
-      const BrowserXRRuntime* runtime,
+      BrowserXRRuntime* runtime,
       std::set<device::mojom::XRSessionFeature> requested_features);
   void OnConsentResult(
       device::mojom::XRSessionOptionsPtr options,
       device::mojom::VRService::RequestSessionCallback callback,
+      device::mojom::XRDeviceId expected_runtime_id,
       std::set<device::mojom::XRSessionFeature> enabled_features,
       XrConsentPromptLevel consent_level,
       bool is_consent_granted);
diff --git a/chrome/browser/vr/webxr_vr_input_browser_test.cc b/chrome/browser/vr/webxr_vr_input_browser_test.cc
index b33ea5d..c6cb021d 100644
--- a/chrome/browser/vr/webxr_vr_input_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_input_browser_test.cc
@@ -557,10 +557,12 @@
     // only supports that type of controller and fills in default values if
     // those inputs don't exist.
     VerifyInputSourceProfilesArray(
-        t, {"windows-mixed-reality", "grip-touchpad-thumbstick-controller"});
+        t,
+        {"windows-mixed-reality", "generic-trigger-grip-touchpad-thumbstick"});
   } else if (t->GetRuntimeType() ==
              XrBrowserTestBase::RuntimeType::RUNTIME_OPENVR) {
-    VerifyInputSourceProfilesArray(t, {"test-value-test-value", "controller"});
+    VerifyInputSourceProfilesArray(
+        t, {"test-value-test-value", "generic-trigger"});
   }
 
   t->RunJavaScriptOrFail("done()");
@@ -631,10 +633,12 @@
     // only supports that type of controller and fills in default values if
     // those inputs don't exist.
     VerifyInputSourceProfilesArray(
-        t, {"windows-mixed-reality", "grip-touchpad-thumbstick-controller"});
+        t,
+        {"windows-mixed-reality", "generic-trigger-grip-touchpad-thumbstick"});
   } else if (t->GetRuntimeType() ==
              XrBrowserTestBase::RuntimeType::RUNTIME_OPENVR) {
-    VerifyInputSourceProfilesArray(t, {"test-value-test-value", "controller"});
+    VerifyInputSourceProfilesArray(
+        t, {"test-value-test-value", "generic-trigger"});
   }
 
   t->RunJavaScriptOrFail("done()");
@@ -734,11 +738,13 @@
     // only supports that type of controller and fills in default values if
     // those inputs don't exist.
     VerifyInputSourceProfilesArray(
-        t, {"windows-mixed-reality", "grip-touchpad-thumbstick-controller"});
+        t,
+        {"windows-mixed-reality", "generic-trigger-grip-touchpad-thumbstick"});
   } else if (t->GetRuntimeType() ==
              XrBrowserTestBase::RuntimeType::RUNTIME_OPENVR) {
     VerifyInputSourceProfilesArray(
-        t, {"test-value-test-value", "grip-touchpad-thumbstick-controller"});
+        t,
+        {"test-value-test-value", "generic-trigger-grip-touchpad-thumbstick"});
   }
 
   t->RunJavaScriptOrFail("done()");
@@ -854,7 +860,7 @@
                               kPollTimeoutShort);
 
   VerifyInputSourceProfilesArray(
-      this, {"test-value-test-value", "touchpad-controller"});
+      this, {"test-value-test-value", "generic-trigger-touchpad"});
 
   RunJavaScriptOrFail("done()");
   EndTest();
@@ -897,7 +903,7 @@
   PollJavaScriptBooleanOrFail("isButtonCountEqualTo(3)", kPollTimeoutShort);
 
   VerifyInputSourceProfilesArray(
-      this, {"test-value-test-value", "grip-touchpad-controller"});
+      this, {"test-value-test-value", "generic-trigger-grip-touchpad"});
 
   RunJavaScriptOrFail("done()");
   EndTest();
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
index 7f7ffa6..b2cdab76 100644
--- a/chrome/test/android/BUILD.gn
+++ b/chrome/test/android/BUILD.gn
@@ -160,6 +160,7 @@
     "//base:base_java_test_support",
     "//chrome/android:chrome_java",
     "//chrome/android/third_party/compositor_animator:compositor_animator_java",
+    "//chrome/browser/util/android:java",
     "//components/bookmarks/common/android:bookmarks_java",
     "//components/embedder_support/android:web_contents_delegate_java",
     "//components/invalidation/impl:java",
diff --git a/chrome/test/base/browser_tests_main_chromeos.cc b/chrome/test/base/browser_tests_main_chromeos.cc
index 55106b29..5426703 100644
--- a/chrome/test/base/browser_tests_main_chromeos.cc
+++ b/chrome/test/base/browser_tests_main_chromeos.cc
@@ -30,8 +30,10 @@
  public:
   int RunTestSuite(int argc, char** argv) override {
     BrowserTestSuiteChromeOS test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 };
diff --git a/chrome/test/base/chrome_test_launcher.cc b/chrome/test/base/chrome_test_launcher.cc
index ad45e43b..76fdb406 100644
--- a/chrome/test/base/chrome_test_launcher.cc
+++ b/chrome/test/base/chrome_test_launcher.cc
@@ -76,8 +76,10 @@
 
 int ChromeTestSuiteRunner::RunTestSuite(int argc, char** argv) {
   ChromeTestSuite test_suite(argc, argv);
-  // Browser tests are expected not to tear-down various globals.
+  // Browser tests are expected not to tear-down various globals and may
+  // complete with the thread priority being above NORMAL.
   test_suite.DisableCheckForLeakedGlobals();
+  test_suite.DisableCheckForThreadPriorityAtTestEnd();
 #if defined(OS_ANDROID)
   // Android browser tests run child processes as threads instead.
   content::ContentTestSuiteBase::RegisterInProcessThreads();
diff --git a/chrome/test/base/interactive_ui_tests_main.cc b/chrome/test/base/interactive_ui_tests_main.cc
index 051d4b3..abc8ab2 100644
--- a/chrome/test/base/interactive_ui_tests_main.cc
+++ b/chrome/test/base/interactive_ui_tests_main.cc
@@ -41,8 +41,10 @@
  protected:
   // ChromeTestSuite overrides:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
 
     ChromeTestSuite::Initialize();
 
diff --git a/chrome/test/data/webui/settings/site_details_tests.js b/chrome/test/data/webui/settings/site_details_tests.js
index d5dc15f..e886e50e4 100644
--- a/chrome/test/data/webui/settings/site_details_tests.js
+++ b/chrome/test/data/webui/settings/site_details_tests.js
@@ -87,6 +87,12 @@
           settings.ContentSettingsTypes.PAYMENT_HANDLER,
           [test_util.createRawSiteException('https://foo.com:443')]),
       test_util.createContentSettingTypeToValuePair(
+          settings.ContentSettingsTypes.SERIAL_PORTS,
+          [test_util.createRawSiteException('https://foo.com:443')]),
+      test_util.createContentSettingTypeToValuePair(
+          settings.ContentSettingsTypes.BLUETOOTH_SCANNING,
+          [test_util.createRawSiteException('https://foo.com:443')]),
+      test_util.createContentSettingTypeToValuePair(
           settings.ContentSettingsTypes.NATIVE_FILE_SYSTEM_WRITE,
           [test_util.createRawSiteException('https://foo.com:443', {
             setting: settings.ContentSetting.BLOCK,
@@ -126,6 +132,10 @@
       nonSiteDetailsContentSettingsTypes.push(
           settings.ContentSettingsTypes.PROTECTED_CONTENT);
     }
+    const experimentalSiteDetailsContentSettingsTypes = [
+      settings.ContentSettingsTypes.SERIAL_PORTS,
+      settings.ContentSettingsTypes.BLUETOOTH_SCANNING,
+    ];
 
     // A list of optionally shown content settings mapped to their loadTimeData
     // flag string.
@@ -137,15 +147,11 @@
     optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
                                                 .PAYMENT_HANDLER] =
         'enablePaymentHandlerContentSetting';
-    optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
-                                                .SERIAL_PORTS] =
-        'enableExperimentalWebPlatformFeatures';
-    optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
-                                                .BLUETOOTH_SCANNING] =
-        'enableBluetoothScanningContentSetting';
+
     optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
                                                 .NATIVE_FILE_SYSTEM_WRITE] =
         'enableNativeFileSystemWriteContentSetting';
+
     browserProxy.setPrefs(prefs);
 
     // First, explicitly set all the optional settings to false.
@@ -162,6 +168,7 @@
       const numContentSettings =
           Object.keys(settings.ContentSettingsTypes).length -
           nonSiteDetailsContentSettingsTypes.length -
+          experimentalSiteDetailsContentSettingsTypes.length -
           Object.keys(optionalSiteDetailsContentSettingsTypes).length;
 
       const loadTimeDataOverride = {};
@@ -180,6 +187,27 @@
       testElement = createSiteDetails('https://foo.com:443');
       assertEquals(numContentSettings, testElement.getCategoryList().length);
     }
+
+    const numContentSettings =
+        Object.keys(settings.ContentSettingsTypes).length -
+        nonSiteDetailsContentSettingsTypes.length -
+        Object.keys(optionalSiteDetailsContentSettingsTypes).length;
+
+    // Explicitly set all the optional settings to true.
+    const loadTimeDataOverride = {};
+    loadTimeDataOverride['enableExperimentalWebPlatformFeatures'] = true;
+    loadTimeData.overrideValues(loadTimeDataOverride);
+    testElement = createSiteDetails('https://foo.com:443');
+    assertEquals(numContentSettings, testElement.getCategoryList().length);
+
+    // Check for setting = off at the end to ensure that the setting does
+    // not carry over for the next iteration.
+    loadTimeDataOverride['enableExperimentalWebPlatformFeatures'] = false;
+    loadTimeData.overrideValues(loadTimeDataOverride);
+    testElement = createSiteDetails('https://foo.com:443');
+    assertEquals(
+        numContentSettings - experimentalSiteDetailsContentSettingsTypes.length,
+        testElement.getCategoryList().length);
   });
 
   test('usage heading shows properly', function() {
diff --git a/chromecast/app/cast_test_launcher.cc b/chromecast/app/cast_test_launcher.cc
index 34693e3..e9719c0 100644
--- a/chromecast/app/cast_test_launcher.cc
+++ b/chromecast/app/cast_test_launcher.cc
@@ -23,8 +23,10 @@
 
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/chromecast/base/cast_features.cc b/chromecast/base/cast_features.cc
index f101ca6..f6ec5fc9 100644
--- a/chromecast/base/cast_features.cc
+++ b/chromecast/base/cast_features.cc
@@ -155,6 +155,9 @@
 const base::Feature kUseQueryableDataBackend{"use_queryable_data_backend",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kEnableSideGesturePassThrough{
+    "enable_side_gesture_pass_through", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // End Chromecast Feature definitions.
 const base::Feature* kFeatures[] = {
     &kAllowUserMediaAccess,
@@ -164,6 +167,7 @@
     &kDisableIdleSocketsCloseOnMemoryPressure,
     &kEnableGeneralAudienceBrowsing,
     &kUseQueryableDataBackend,
+    &kEnableSideGesturePassThrough,
 };
 
 // An iterator for a base::DictionaryValue. Use an alias for brevity in loops.
diff --git a/chromecast/base/cast_features.h b/chromecast/base/cast_features.h
index 8d1f0b5..6de0d6b 100644
--- a/chromecast/base/cast_features.h
+++ b/chromecast/base/cast_features.h
@@ -30,6 +30,7 @@
 extern const base::Feature kDisableIdleSocketsCloseOnMemoryPressure;
 extern const base::Feature kEnableGeneralAudienceBrowsing;
 extern const base::Feature kUseQueryableDataBackend;
+extern const base::Feature kEnableSideGesturePassThrough;
 
 // Get an iterable list of all of the cast features for checking all features as
 // a collection.
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.cc b/chromecast/browser/accessibility/touch_exploration_controller.cc
index c8ef3f0..751e323 100644
--- a/chromecast/browser/accessibility/touch_exploration_controller.cc
+++ b/chromecast/browser/accessibility/touch_exploration_controller.cc
@@ -14,6 +14,8 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
+#include "chromecast/base/cast_features.h"
+#include "chromecast/base/chromecast_switches.h"
 #include "ui/aura/client/cursor_client.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
@@ -29,9 +31,21 @@
   VlogEvent(event, __func__)
 
 namespace chromecast {
-namespace shell {
 
 namespace {
+// TODO(rmrossi): Unify with identical values in SideSwipeDetector.
+
+// The number of pixels from the very left or right of the screen to consider as
+// a valid origin for the left or right swipe gesture.
+constexpr int kDefaultSideGestureStartWidth = 35;
+
+// The number of pixels from the very top or bottom of the screen to consider as
+// a valid origin for the top or bottom swipe gesture.
+constexpr int kDefaultSideGestureStartHeight = 35;
+
+}  // namespace
+
+namespace shell {
 
 void SetTouchAccessibilityFlag(ui::Event* event) {
   // This flag is used to identify mouse move events that were generated from
@@ -39,8 +53,6 @@
   event->set_flags(event->flags() | ui::EF_TOUCH_ACCESSIBILITY);
 }
 
-}  // namespace
-
 TouchExplorationController::TouchExplorationController(
     aura::Window* root_window,
     TouchExplorationControllerDelegate* delegate,
@@ -52,7 +64,14 @@
       anchor_point_state_(ANCHOR_POINT_NONE),
       gesture_provider_(new ui::GestureProviderAura(this, this)),
       prev_state_(NO_FINGERS_DOWN),
-      DVLOG_on_(true) {}
+      DVLOG_on_(true),
+      gesture_start_width_(GetSwitchValueInt(switches::kSystemGestureStartWidth,
+                                             kDefaultSideGestureStartWidth)),
+      gesture_start_height_(
+          GetSwitchValueInt(switches::kSystemGestureStartHeight,
+                            kDefaultSideGestureStartHeight)),
+      side_gesture_pass_through_(
+          chromecast::IsFeatureEnabled(kEnableSideGesturePassThrough)) {}
 
 TouchExplorationController::~TouchExplorationController() {}
 
@@ -172,10 +191,21 @@
   }
   DVLOG_EVENT(touch_event);
 
+  // Enter pass through mode when side gestures are set to pass-through.
+  if (side_gesture_pass_through_ && type == ui::ET_TOUCH_PRESSED &&
+      FindEdgesWithinInset(location, gesture_start_width_,
+                           gesture_start_height_) != NO_EDGE) {
+    SET_STATE(ONE_FINGER_PASSTHROUGH);
+    initial_press_ = std::make_unique<ui::TouchEvent>(touch_event);
+    last_unused_finger_event_.reset(new ui::TouchEvent(touch_event));
+    return SendEvent(continuation, &event);
+  }
+
   // In order to avoid accidentally double tapping when moving off the edge
   // of the screen, the state will be rewritten to NoFingersDown.
   if ((type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) &&
-      FindEdgesWithinInset(location, kLeavingScreenEdge) != NO_EDGE) {
+      FindEdgesWithinInset(location, kLeavingScreenEdge, kLeavingScreenEdge) !=
+          NO_EDGE) {
     if (DVLOG_on_)
       DVLOG(1) << "Leaving screen";
 
@@ -851,9 +881,10 @@
 }
 
 int TouchExplorationController::FindEdgesWithinInset(gfx::Point point_dip,
-                                                     float inset) {
+                                                     float horiz_inset,
+                                                     float vert_inset) {
   gfx::RectF inner_bounds_dip(root_window_->bounds());
-  inner_bounds_dip.Inset(inset, inset);
+  inner_bounds_dip.Inset(horiz_inset, vert_inset);
 
   // Bitwise manipulation in order to determine where on the screen the point
   // lies. If more than one bit is turned on, then it is a corner where the two
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.h b/chromecast/browser/accessibility/touch_exploration_controller.h
index 2ef33f6..080f375 100644
--- a/chromecast/browser/accessibility/touch_exploration_controller.h
+++ b/chromecast/browser/accessibility/touch_exploration_controller.h
@@ -282,7 +282,6 @@
 
   // Within this many dips of the screen edge, the release event generated will
   // reset the state to NoFingersDown.
-  // TODO(kpschoedel): Unify with identical value in SideSwipeDetector.
   const float kLeavingScreenEdge = 35;
 
   // Touch within this distance from a corner can invoke corner passthrough.
@@ -394,7 +393,9 @@
   // edge. If it is within the given inset of two edges, returns an int with
   // both bits that represent the respective edges turned on. Otherwise returns
   // SCREEN_CENTER.
-  int FindEdgesWithinInset(gfx::Point point, float inset);
+  int FindEdgesWithinInset(gfx::Point point,
+                           float horiz_inset,
+                           float vert_inset);
 
   // Set the state and modifies any variables related to the state change.
   // (e.g. resetting the gesture provider).
@@ -497,6 +498,14 @@
   // The maximum touch points seen in the current gesture.
   size_t max_gesture_touch_points_ = 0;
 
+  // The horizontal and vertical insets for side gesture detection.
+  const int gesture_start_width_;
+  const int gesture_start_height_;
+
+  // Whether or not to trigger pass through mode when touch events come
+  // in from the edges.
+  bool side_gesture_pass_through_;
+
   DISALLOW_COPY_AND_ASSIGN(TouchExplorationController);
 };
 
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc
index a97d389..600b99df 100644
--- a/chromecast/browser/cast_web_contents_impl.cc
+++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -366,9 +366,10 @@
         render_frame_host->GetRemoteAssociatedInterfaces());
   }
 
-  chromecast::shell::mojom::FeatureManagerPtr feature_manager_ptr;
-  render_frame_host->GetRemoteInterfaces()->GetInterface(&feature_manager_ptr);
-  feature_manager_ptr->ConfigureFeatures(GetRendererFeatures());
+  mojo::Remote<chromecast::shell::mojom::FeatureManager> feature_manager_remote;
+  render_frame_host->GetRemoteInterfaces()->GetInterface(
+      feature_manager_remote.BindNewPipeAndPassReceiver());
+  feature_manager_remote->ConfigureFeatures(GetRendererFeatures());
 
   chromecast::shell::mojom::MediaPlaybackOptionsAssociatedPtr
       media_playback_options;
diff --git a/chromecast/graphics/cast_window_manager_aura.cc b/chromecast/graphics/cast_window_manager_aura.cc
index 1329615..3ab7e3fd 100644
--- a/chromecast/graphics/cast_window_manager_aura.cc
+++ b/chromecast/graphics/cast_window_manager_aura.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
+#include "chromecast/base/cast_features.h"
 #include "chromecast/graphics/cast_focus_client_aura.h"
 #include "chromecast/graphics/cast_touch_activity_observer.h"
 #include "chromecast/graphics/cast_touch_event_gate.h"
@@ -280,8 +281,11 @@
   system_gesture_event_handler_ =
       std::make_unique<CastSystemGestureEventHandler>(
           system_gesture_dispatcher_.get(), root_window);
-  side_swipe_detector_ = std::make_unique<SideSwipeDetector>(
-      system_gesture_dispatcher_.get(), root_window);
+  // No need for the edge swipe detector when side gestures are pass-through.
+  if (!chromecast::IsFeatureEnabled(kEnableSideGesturePassThrough)) {
+    side_swipe_detector_ = std::make_unique<SideSwipeDetector>(
+        system_gesture_dispatcher_.get(), root_window);
+  }
 }
 
 void CastWindowManagerAura::OnWindowOrderChanged(
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index 013d73f..7883c182 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -557,6 +557,9 @@
 }
 
 bool ShouldShowScrollableShelf() {
+  // If we're showing the new shelf design, also enable scrollable shelf.
+  if (ShouldShowShelfHotseat())
+    return true;
   return base::CommandLine::ForCurrentProcess()->HasSwitch(kShelfScrollable);
 }
 
diff --git a/chromeos/dbus/debug_daemon_client.h b/chromeos/dbus/debug_daemon_client.h
index eca1ff2..b67dc797 100644
--- a/chromeos/dbus/debug_daemon_client.h
+++ b/chromeos/dbus/debug_daemon_client.h
@@ -224,7 +224,9 @@
   // A callback to handle the result of StartConcierge/StopConcierge.
   using ConciergeCallback = base::OnceCallback<void(bool success)>;
   // Calls debugd::kStartVmConcierge, which starts the Concierge service.
-  // |callback| is called when the method finishes.
+  // |callback| is called when the method finishes. If the |callback| is called
+  // with true, it is guaranteed that the service is ready to accept requests.
+  // It is not necessary for ConciergeClient to use WaitForServiceToBeAvailable.
   virtual void StartConcierge(ConciergeCallback callback) = 0;
   // Calls debugd::kStopVmConcierge, which stops the Concierge service.
   // |callback| is called when the method finishes.
diff --git a/components/arc/arc_util.cc b/components/arc/arc_util.cc
index 1076141..e439b13 100644
--- a/components/arc/arc_util.cc
+++ b/components/arc/arc_util.cc
@@ -15,6 +15,7 @@
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/concierge_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/debug_daemon_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "components/arc/arc_features.h"
 #include "components/exo/shell_surface_util.h"
@@ -61,10 +62,15 @@
     LOG(ERROR) << "SetVmCpuRestriction for ARCVM failed";
 }
 
-void SetArcVmCpuRestriction(bool do_restrict) {
+void DoSetArcVmCpuRestriction(bool do_restrict, bool concierge_started) {
+  if (!concierge_started) {
+    LOG(ERROR) << "Concierge D-Bus service is not available";
+    return;
+  }
+
   auto* client = chromeos::DBusThreadManager::Get()->GetConciergeClient();
   if (!client) {
-    LOG(WARNING) << "ConciergeClient is not available";
+    LOG(ERROR) << "ConciergeClient is not available";
     return;
   }
 
@@ -78,6 +84,17 @@
                               base::BindOnce(&OnSetArcVmCpuRestriction));
 }
 
+void SetArcVmCpuRestriction(bool do_restrict) {
+  auto* client = chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
+  if (!client) {
+    LOG(WARNING) << "DebugDaemonClient is not available";
+    return;
+  }
+  // TODO(wvk): Call StartConcierge() only when the service is not running.
+  client->StartConcierge(
+      base::BindOnce(&DoSetArcVmCpuRestriction, do_restrict));
+}
+
 void SetArcContainerCpuRestriction(bool do_restrict) {
   if (!chromeos::SessionManagerClient::Get()) {
     LOG(WARNING) << "SessionManagerClient is not available";
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 44b0525..902f8a2 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -56,8 +56,6 @@
     "autofill_handler_proxy.h",
     "autofill_ie_toolbar_import_win.cc",
     "autofill_ie_toolbar_import_win.h",
-    "autofill_internals_service.cc",
-    "autofill_internals_service.h",
     "autofill_manager.cc",
     "autofill_manager.h",
     "autofill_manager_test_delegate.h",
@@ -145,12 +143,11 @@
     "geo/state_names.h",
     "geo/subkey_requester.cc",
     "geo/subkey_requester.h",
-    "logging/log_buffer.cc",
-    "logging/log_buffer.h",
     "logging/log_buffer_submitter.cc",
     "logging/log_buffer_submitter.h",
     "logging/log_manager.cc",
     "logging/log_manager.h",
+    "logging/log_protobufs.h",
     "logging/log_receiver.h",
     "logging/log_router.cc",
     "logging/log_router.h",
@@ -532,7 +529,6 @@
     "autofill_experiments_unittest.cc",
     "autofill_external_delegate_unittest.cc",
     "autofill_ie_toolbar_import_win_unittest.cc",
-    "autofill_internals_service_unittest.cc",
     "autofill_manager_unittest.cc",
     "autofill_merge_unittest.cc",
     "autofill_metrics_unittest.cc",
@@ -565,7 +561,6 @@
     "geo/phone_number_i18n_unittest.cc",
     "geo/subkey_requester_unittest.cc",
     "logging/log_buffer_submitter_unittest.cc",
-    "logging/log_buffer_unittest.cc",
     "logging/log_manager_unittest.cc",
     "logging/log_router_unittest.cc",
     "payments/credit_card_access_manager_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
index 8dcdccf..de7620a1 100644
--- a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
+++ b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
@@ -66,6 +66,10 @@
   background-color: #FFECB3;
 }
 
+.log-entry[scope='AbortParsing'] {
+  background-color: #FFCDD2;
+}
+
 .log-entry[scope='Filling'] {
   background-color: #D1C4E9;
 }
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc
index aa462f22..8d0cba20 100644
--- a/components/autofill/core/browser/autofill_download_manager.cc
+++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -25,11 +25,10 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/autofill/core/browser/autofill_driver.h"
-#include "components/autofill/core/browser/autofill_internals_service.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/logging/log_buffer.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
+#include "components/autofill/core/browser/logging/log_protobufs.h"
 #include "components/autofill/core/browser/proto/legacy_proto_bridge.h"
 #include "components/autofill/core/browser/proto/server.pb.h"
 #include "components/autofill/core/common/autofill_clock.h"
@@ -38,6 +37,7 @@
 #include "components/autofill/core/common/autofill_internals/logging_scope.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/autofill_switches.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 #include "components/autofill/core/common/mojom/autofill_types.mojom.h"
 #include "components/google/core/common/google_util.h"
 #include "components/history/core/browser/history_service.h"
diff --git a/components/autofill/core/browser/autofill_experiments.cc b/components/autofill/core/browser/autofill_experiments.cc
index 4ad323a4..dd2bd38 100644
--- a/components/autofill/core/browser/autofill_experiments.cc
+++ b/components/autofill/core/browser/autofill_experiments.cc
@@ -12,7 +12,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/autofill_internals_service.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
diff --git a/components/autofill/core/browser/autofill_handler.cc b/components/autofill/core/browser/autofill_handler.cc
index c4c4ae45..dd791fb 100644
--- a/components/autofill/core/browser/autofill_handler.cc
+++ b/components/autofill/core/browser/autofill_handler.cc
@@ -8,6 +8,8 @@
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/common/autofill_data_validation.h"
+#include "components/autofill/core/common/autofill_internals/log_message.h"
+#include "components/autofill/core/common/autofill_internals/logging_scope.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/signatures_util.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -267,12 +269,17 @@
                                 const FormStructure* cached_form,
                                 FormStructure** parsed_form_structure) {
   DCHECK(parsed_form_structure);
-  if (form_structures_.size() >= kAutofillHandlerMaxFormCacheSize)
+  if (form_structures_.size() >= kAutofillHandlerMaxFormCacheSize) {
+    if (log_manager_) {
+      log_manager_->Log() << LoggingScope::kAbortParsing
+                          << LogMessage::kAbortParsingTooManyForms << form;
+    }
     return false;
+  }
 
   auto form_structure = std::make_unique<FormStructure>(form);
   form_structure->ParseFieldTypesFromAutocompleteAttributes();
-  if (!form_structure->ShouldBeParsed())
+  if (!form_structure->ShouldBeParsed(log_manager_))
     return false;
 
   if (cached_form) {
@@ -284,9 +291,8 @@
     if (observer_for_testing_)
       observer_for_testing_->OnFormParsed();
 
-    if (form_structure.get()->value_from_dynamic_change_form()) {
+    if (form_structure.get()->value_from_dynamic_change_form())
       value_from_dynamic_change_form_ = true;
-    }
   }
 
   form_structure->DetermineHeuristicTypes(log_manager_);
diff --git a/components/autofill/core/browser/autofill_internals_service.cc b/components/autofill/core/browser/autofill_internals_service.cc
deleted file mode 100644
index 3f21b7d..0000000
--- a/components/autofill/core/browser/autofill_internals_service.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/autofill_internals_service.h"
-
-namespace autofill {
-
-LogBuffer& operator<<(LogBuffer& buf, LoggingScope scope) {
-  if (!buf.active())
-    return buf;
-  return buf << Tag{"div"} << Attrib{"scope", LoggingScopeToString(scope)}
-             << Attrib{"class", "log-entry"};
-}
-
-LogBuffer& operator<<(LogBuffer& buf, LogMessage message) {
-  if (!buf.active())
-    return buf;
-  return buf << Tag{"div"} << Attrib{"message", LogMessageToString(message)}
-             << Attrib{"class", "log-message"} << LogMessageValue(message);
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_internals_service.h b/components/autofill/core/browser/autofill_internals_service.h
deleted file mode 100644
index b5c8113..0000000
--- a/components/autofill/core/browser/autofill_internals_service.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_INTERNALS_SERVICE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_INTERNALS_SERVICE_H_
-
-#include "base/macros.h"
-#include "components/autofill/core/browser/logging/log_buffer.h"
-#include "components/autofill/core/browser/logging/log_router.h"
-#include "components/autofill/core/common/autofill_internals/log_message.h"
-#include "components/autofill/core/common/autofill_internals/logging_scope.h"
-
-namespace autofill {
-
-// TODO(crbug.com/928595) This is a temporary home for these operations.
-// Find a properly named file.
-LogBuffer& operator<<(LogBuffer& buf, LoggingScope scope);
-
-LogBuffer& operator<<(LogBuffer& buf, LogMessage message);
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_INTERNALS_SERVICE_H_
diff --git a/components/autofill/core/browser/autofill_internals_service_unittest.cc b/components/autofill/core/browser/autofill_internals_service_unittest.cc
deleted file mode 100644
index 2baaee0..0000000
--- a/components/autofill/core/browser/autofill_internals_service_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/autofill_internals_service.h"
-
-#include "base/json/json_writer.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest-death-test.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace autofill {
-
-TEST(AutofillInternalsService, Scope) {
-  LogBuffer buffer;
-  buffer << LoggingScope::kContext;
-  std::string json;
-  EXPECT_TRUE(base::JSONWriter::Write(buffer.RetrieveResult(), &json));
-  EXPECT_EQ(R"({"attributes":{"class":"log-entry","scope":"Context"},)"
-            R"("type":"element","value":"div"})",
-            json);
-}
-
-TEST(AutofillInternalsService, Message) {
-  LogBuffer buffer;
-  buffer << LogMessage::kParsedForms;
-  std::string json;
-  EXPECT_TRUE(base::JSONWriter::Write(buffer.RetrieveResult(), &json));
-  EXPECT_EQ(R"({"attributes":{"class":"log-message","message":"ParsedForms"},)"
-            R"("children":[{"type":"text","value":"Parsed forms:"}],)"
-            R"("type":"element","value":"div"})",
-            json);
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 98281bb..6a92e82 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -42,7 +42,6 @@
 #include "components/autofill/core/browser/autofill_data_util.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/autofill_internals_service.h"
 #include "components/autofill/core/browser/autofill_manager_test_delegate.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/autofill_type.h"
@@ -68,6 +67,8 @@
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_data_validation.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/autofill_internals/log_message.h"
+#include "components/autofill/core/common/autofill_internals/logging_scope.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/autofill_switches.h"
diff --git a/components/autofill/core/browser/data_model/contact_info.cc b/components/autofill/core/browser/data_model/contact_info.cc
index 895e1ed0..131e4085a 100644
--- a/components/autofill/core/browser/data_model/contact_info.cc
+++ b/components/autofill/core/browser/data_model/contact_info.cc
@@ -250,15 +250,26 @@
 }
 
 bool CompanyInfo::IsValidOrVerified(const base::string16& value) const {
-  if (!base::FeatureList::IsEnabled(
-          autofill::features::kAutofillRejectCompanyBirthyear))
+  if (profile_ && profile_->IsVerified()) {
     return true;
-
-  if (profile_ && profile_->IsVerified())
-    return true;
-
-  // Companies that are of the format of a four digit birth year are not valid.
-  return !MatchesPattern(value, base::UTF8ToUTF16("^(19|20)\\d{2}$"));
+  }
+  // |value| is a birthyear:
+  if (base::FeatureList::IsEnabled(
+          autofill::features::kAutofillRejectCompanyBirthyear) &&
+      MatchesPattern(value, base::UTF8ToUTF16("^(19|20)\\d{2}$"))) {
+    return false;
+  }
+  // |value| is a social title:
+  if (base::FeatureList::IsEnabled(
+          autofill::features::kAutofillRejectCompanySocialTitle) &&
+      MatchesPattern(value, base::UTF8ToUTF16(
+                                "^(Ms\\.?|Mrs\\.?|Mr\\.?|Miss|Mistress|Mister|"
+                                "Frau|Herr|"
+                                "Mlle|Mme|M\\.|"
+                                "Dr\\.?|Prof\\.?)$"))) {
+    return false;
+  }
+  return true;
 }
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/contact_info_unittest.cc b/components/autofill/core/browser/data_model/contact_info_unittest.cc
index a5e64b41..39982dd 100644
--- a/components/autofill/core/browser/data_model/contact_info_unittest.cc
+++ b/components/autofill/core/browser/data_model/contact_info_unittest.cc
@@ -432,6 +432,33 @@
   company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
   EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
 
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
+  EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
+  EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
+  EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
+  EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
+  EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
+  EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
+
   profile.set_origin("Not empty");
   ASSERT_TRUE(profile.IsVerified());
 
@@ -449,6 +476,142 @@
 
   company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
   EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
+  EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
+  EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
+  EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
+  EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
+  EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
+  EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
+}
+
+TEST(CompanyTest, CompanyNameSocialTitle) {
+  base::test::ScopedFeatureList scoped_features;
+  scoped_features.InitWithFeatures(
+      /*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
+      /*disabled_features=*/{});
+
+  AutofillProfile profile;
+  CompanyInfo company(&profile);
+  ASSERT_FALSE(profile.IsVerified());
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
+  EXPECT_EQ(UTF8ToUTF16("Google"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987"));
+  EXPECT_EQ(UTF8ToUTF16("1987"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("It was 1987."));
+  EXPECT_EQ(UTF8ToUTF16("It was 1987."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987 was the year."));
+  EXPECT_EQ(UTF8ToUTF16("1987 was the year."),
+            company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Yes, 1987 was the year."));
+  EXPECT_EQ(UTF8ToUTF16("Yes, 1987 was the year."),
+            company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2019"));
+  EXPECT_EQ(UTF8ToUTF16("2019"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1818"));
+  EXPECT_EQ(UTF8ToUTF16("1818"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
+  EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
+  EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
+  EXPECT_EQ(UTF8ToUTF16(""), company.GetRawInfo(COMPANY_NAME));
+
+  profile.set_origin("Not empty");
+  ASSERT_TRUE(profile.IsVerified());
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
+  EXPECT_EQ(UTF8ToUTF16("Google"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1987"));
+  EXPECT_EQ(UTF8ToUTF16("1987"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2019"));
+  EXPECT_EQ(UTF8ToUTF16("2019"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("1818"));
+  EXPECT_EQ(UTF8ToUTF16("1818"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("2345"));
+  EXPECT_EQ(UTF8ToUTF16("2345"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr"));
+  EXPECT_EQ(UTF8ToUTF16("Mr"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr."));
+  EXPECT_EQ(UTF8ToUTF16("Mr."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs"));
+  EXPECT_EQ(UTF8ToUTF16("Mrs"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs."));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs."), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Mr. & Mrs. Smith"));
+  EXPECT_EQ(UTF8ToUTF16("Mr. & Mrs. Smith"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau"));
+  EXPECT_EQ(UTF8ToUTF16("Frau"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Frau Doktor"));
+  EXPECT_EQ(UTF8ToUTF16("Frau Doktor"), company.GetRawInfo(COMPANY_NAME));
+
+  company.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Herr"));
+  EXPECT_EQ(UTF8ToUTF16("Herr"), company.GetRawInfo(COMPANY_NAME));
 }
 
 TEST(CompanyTest, CompanyNameYearCopy) {
@@ -488,4 +651,41 @@
   EXPECT_EQ(company_old, company_young);
 }
 
+TEST(CompanyTest, CompanyNameSocialTitleCopy) {
+  base::test::ScopedFeatureList scoped_features;
+  scoped_features.InitWithFeatures(
+      /*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
+      /*disabled_features=*/{});
+
+  AutofillProfile profile;
+  ASSERT_FALSE(profile.IsVerified());
+
+  CompanyInfo company_google(&profile);
+  CompanyInfo company_year(&profile);
+
+  company_google.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Google"));
+  company_year.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Prof."));
+
+  company_google = company_year;
+  EXPECT_EQ(UTF8ToUTF16(""), company_google.GetRawInfo(COMPANY_NAME));
+}
+
+TEST(CompanyTest, CompanyNameSocialTitleIsEqual) {
+  base::test::ScopedFeatureList scoped_features;
+  scoped_features.InitWithFeatures(
+      /*enabled_features=*/{features::kAutofillRejectCompanySocialTitle},
+      /*disabled_features=*/{});
+
+  AutofillProfile profile;
+  ASSERT_FALSE(profile.IsVerified());
+
+  CompanyInfo company_old(&profile);
+  CompanyInfo company_young(&profile);
+
+  company_old.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Dr"));
+  company_young.SetRawInfo(COMPANY_NAME, UTF8ToUTF16("Prof"));
+
+  EXPECT_EQ(company_old, company_young);
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc
index 266bd68..d801580 100644
--- a/components/autofill/core/browser/form_parsing/form_field.cc
+++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_field.h"
-#include "components/autofill/core/browser/autofill_internals_service.h"
 #include "components/autofill/core/browser/form_parsing/address_field.h"
 #include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
 #include "components/autofill/core/browser/form_parsing/credit_card_field.h"
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 951a1568..5eb8e5a 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -35,13 +35,15 @@
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_parsing/field_candidates.h"
 #include "components/autofill/core/browser/form_parsing/form_field.h"
-#include "components/autofill/core/browser/logging/log_buffer.h"
+#include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/proto/legacy_proto_bridge.h"
 #include "components/autofill/core/browser/randomized_encoder.h"
 #include "components/autofill/core/browser/rationalization_util.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/autofill_internals/log_message.h"
+#include "components/autofill/core/common/autofill_internals/logging_scope.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/autofill_regex_constants.h"
 #include "components/autofill/core/common/autofill_regexes.h"
@@ -50,6 +52,7 @@
 #include "components/autofill/core/common/form_data_predictions.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/autofill/core/common/form_field_data_predictions.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 #include "components/autofill/core/common/signatures_util.h"
 #include "components/security_state/core/security_state.h"
 #include "url/origin.h"
@@ -951,10 +954,15 @@
   }
 }
 
-bool FormStructure::ShouldBeParsed() const {
+bool FormStructure::ShouldBeParsed(LogManager* log_manager) const {
   // Exclude URLs not on the web via HTTP(S).
-  if (!HasAllowedScheme(source_url_))
+  if (!HasAllowedScheme(source_url_)) {
+    if (log_manager) {
+      log_manager->Log() << LoggingScope::kAbortParsing
+                         << LogMessage::kAbortParsingNotAllowedScheme << *this;
+    }
     return false;
+  }
 
   size_t min_required_fields =
       std::min({MinRequiredFieldsForHeuristics(), MinRequiredFieldsForQuery(),
@@ -963,6 +971,11 @@
       (!all_fields_are_passwords() ||
        active_field_count() < kRequiredFieldsForFormsWithOnlyPasswordFields) &&
       !has_author_specified_types_) {
+    if (log_manager) {
+      log_manager->Log() << LoggingScope::kAbortParsing
+                         << LogMessage::kAbortParsingNotEnoughFields
+                         << active_field_count() << *this;
+    }
     return false;
   }
 
@@ -971,6 +984,11 @@
       base::UTF8ToUTF16(kUrlSearchActionRe);
   if (MatchesPattern(base::UTF8ToUTF16(target_url_.path_piece()),
                      kUrlSearchActionPattern)) {
+    if (log_manager) {
+      log_manager->Log() << LoggingScope::kAbortParsing
+                         << LogMessage::kAbortParsingUrlMatchesSearchRegex
+                         << *this;
+    }
     return false;
   }
 
@@ -979,6 +997,11 @@
     has_text_field |= it->form_control_type != "select-one";
   }
 
+  if (!has_text_field && log_manager) {
+    log_manager->Log() << LoggingScope::kAbortParsing
+                       << LogMessage::kAbortParsingFormHasNoTextfield << *this;
+  }
+
   return has_text_field;
 }
 
@@ -2192,6 +2215,7 @@
                           base::NumberToString(
                               HashFormSignature(form.form_signature()))});
   buffer << Tr{} << "Form name:" << form.form_name();
+  buffer << Tr{} << "Unique renderer Id:" << form.unique_renderer_id();
   buffer << Tr{} << "Target URL:" << form.target_url();
   for (size_t i = 0; i < form.field_count(); ++i) {
     buffer << Tag{"tr"};
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index 7a90138..915cf3f 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -130,7 +130,7 @@
   void UpdateAutofillCount();
 
   // Returns true if this form matches the structural requirements for Autofill.
-  bool ShouldBeParsed() const;
+  bool ShouldBeParsed(LogManager* log_manager = nullptr) const;
 
   // Returns true if heuristic autofill type detection should be attempted for
   // this form.
diff --git a/components/autofill/core/browser/logging/log_buffer_submitter.h b/components/autofill/core/browser/logging/log_buffer_submitter.h
index 5925e84..ef6c411 100644
--- a/components/autofill/core/browser/logging/log_buffer_submitter.h
+++ b/components/autofill/core/browser/logging/log_buffer_submitter.h
@@ -6,7 +6,7 @@
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_BUFFER_SUBMITTER_H_
 
 #include "base/macros.h"
-#include "components/autofill/core/browser/logging/log_buffer.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/logging/log_protobufs.h b/components/autofill/core/browser/logging/log_protobufs.h
new file mode 100644
index 0000000..a2008a3a
--- /dev/null
+++ b/components/autofill/core/browser/logging/log_protobufs.h
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_PROTOBUFS_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_PROTOBUFS_H_
+
+#include "components/autofill/core/common/logging/log_buffer.h"
+#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
+
+namespace autofill {
+
+// Serialize a repeated field in a protobuf. This function is not part of
+// log_buffer.h because that would create a dependency of the renderer process
+// to protobufs.
+template <typename T>
+LogBuffer& operator<<(LogBuffer& buf,
+                      const ::google::protobuf::RepeatedField<T>& values) {
+  buf << "[";
+  for (int i = 0; i < values.size(); ++i) {
+    if (i)
+      buf << ", ";
+    buf << values.Get(i);
+  }
+  buf << "]";
+  return buf;
+}
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_PROTOBUFS_H_
diff --git a/components/autofill/core/browser/logging/log_router.cc b/components/autofill/core/browser/logging/log_router.cc
index 3ab3a1b..f31dd7cb 100644
--- a/components/autofill/core/browser/logging/log_router.cc
+++ b/components/autofill/core/browser/logging/log_router.cc
@@ -6,9 +6,9 @@
 
 #include "base/stl_util.h"
 #include "base/strings/string_split.h"
-#include "components/autofill/core/browser/logging/log_buffer.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/logging/log_receiver.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 #include "net/base/escape.h"
 
 namespace autofill {
diff --git a/components/autofill/core/common/BUILD.gn b/components/autofill/core/common/BUILD.gn
index 0bb58c9..88abc76 100644
--- a/components/autofill/core/common/BUILD.gn
+++ b/components/autofill/core/common/BUILD.gn
@@ -39,6 +39,8 @@
     "form_field_data.h",
     "form_field_data_predictions.cc",
     "form_field_data_predictions.h",
+    "logging/log_buffer.cc",
+    "logging/log_buffer.h",
     "password_form.cc",
     "password_form.h",
     "password_form_field_prediction_map.h",
@@ -75,12 +77,15 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "autofill_internals/log_message_unittest.cc",
+    "autofill_internals/logging_scope_unittest.cc",
     "autofill_l10n_util_unittest.cc",
     "autofill_prefs_unittest.cc",
     "autofill_regexes_unittest.cc",
     "autofill_util_unittest.cc",
     "form_data_unittest.cc",
     "form_field_data_unittest.cc",
+    "logging/log_buffer_unittest.cc",
     "password_form_fill_data_unittest.cc",
     "save_password_progress_logger_unittest.cc",
   ]
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index d7a0b6e..6399d99 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -112,6 +112,11 @@
 const base::Feature kAutofillRejectCompanyBirthyear{
     "AutofillRejectCompanyBirthyear", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Controls whether autofill rejects using non-verified company names that are
+// social titles (e.g., "Mrs.") in some languages.
+const base::Feature kAutofillRejectCompanySocialTitle{
+    "AutofillRejectCompanySocialTitle", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls whether or not a group of fields not enclosed in a form can be
 // considered a form. If this is enabled, unowned fields will only constitute
 // a form if there are signals to suggest that this might a checkout page.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 8e6937f..197da42 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -42,6 +42,7 @@
 extern const base::Feature kAutofillProfileClientValidation;
 extern const base::Feature kAutofillProfileServerValidation;
 extern const base::Feature kAutofillRejectCompanyBirthyear;
+extern const base::Feature kAutofillRejectCompanySocialTitle;
 extern const base::Feature kAutofillRestrictUnownedFieldsToFormlessCheckout;
 extern const base::Feature kAutofillRichMetadataQueries;
 extern const base::Feature kAutofillSaveOnProbablySubmitted;
diff --git a/components/autofill/core/common/autofill_internals/log_message.cc b/components/autofill/core/common/autofill_internals/log_message.cc
index 450258c6..60da13d 100644
--- a/components/autofill/core/common/autofill_internals/log_message.cc
+++ b/components/autofill/core/common/autofill_internals/log_message.cc
@@ -5,6 +5,7 @@
 #include "components/autofill/core/common/autofill_internals/log_message.h"
 
 #include "base/logging.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 namespace autofill {
 
@@ -50,4 +51,11 @@
   return "";
 }
 
+LogBuffer& operator<<(LogBuffer& buf, LogMessage message) {
+  if (!buf.active())
+    return buf;
+  return buf << Tag{"div"} << Attrib{"message", LogMessageToString(message)}
+             << Attrib{"class", "log-message"} << LogMessageValue(message);
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_internals/log_message.h b/components/autofill/core/common/autofill_internals/log_message.h
index 4862e5e..a7232ce6 100644
--- a/components/autofill/core/common/autofill_internals/log_message.h
+++ b/components/autofill/core/common/autofill_internals/log_message.h
@@ -7,15 +7,28 @@
 
 namespace autofill {
 
+class LogBuffer;
+
 /////////////// Log Messages /////////////
 
 // Generator for log message. If you need to find the call site for a log
 // message, take the first parameter (e.g. ParsedForms) and search for
 // that name prefixed with a k (e.g. kParsedForms) in code search.
-#define AUTOFILL_LOG_MESSAGE_TEMPLATES(T)                   \
-  T(ParsedForms, "Parsed forms:")                           \
-  T(SendAutofillUpload, "Sending Autofill Upload Request:") \
-  T(LocalHeuristicRegExMatched, "RegEx of local heuristic matched:")
+#define AUTOFILL_LOG_MESSAGE_TEMPLATES(T)                                      \
+  T(ParsedForms, "Parsed forms:")                                              \
+  T(SendAutofillUpload, "Sending Autofill Upload Request:")                    \
+  T(LocalHeuristicRegExMatched, "RegEx of local heuristic matched:")           \
+  T(AbortParsingTooManyForms, "Abort parsing form: Too many forms in cache: ") \
+  T(AbortParsingNotAllowedScheme,                                              \
+    "Abort parsing form: Ignoring form because the source url has no allowed " \
+    "scheme")                                                                  \
+  T(AbortParsingNotEnoughFields,                                               \
+    "Abort parsing form: Not enough fields in form: ")                         \
+  T(AbortParsingUrlMatchesSearchRegex,                                         \
+    "Abort parsing form: Action URL matches kUrlSearchActionRe, indicating "   \
+    "that the form may lead to a search.")                                     \
+  T(AbortParsingFormHasNoTextfield,                                            \
+    "Abort parsing form: Form has no text field.")
 
 // Log messages for chrome://autofill-internals.
 #define AUTOFILL_TEMPLATE(NAME, MESSAGE) k##NAME,
@@ -29,6 +42,8 @@
 // Returns the actual string to be presented to the user for |message|.
 const char* LogMessageValue(LogMessage message);
 
+LogBuffer& operator<<(LogBuffer& buf, LogMessage message);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_COMMON_AUTOFILL_INTERNALS_LOG_MESSAGE_H_
diff --git a/components/autofill/core/common/autofill_internals/log_message_unittest.cc b/components/autofill/core/common/autofill_internals/log_message_unittest.cc
new file mode 100644
index 0000000..2d4f225
--- /dev/null
+++ b/components/autofill/core/common/autofill_internals/log_message_unittest.cc
@@ -0,0 +1,24 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/common/autofill_internals/log_message.h"
+
+#include "base/json/json_writer.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace autofill {
+
+TEST(LogMessage, Serialization) {
+  LogBuffer buffer;
+  buffer << LogMessage::kParsedForms;
+  std::string json;
+  EXPECT_TRUE(base::JSONWriter::Write(buffer.RetrieveResult(), &json));
+  EXPECT_EQ(R"({"attributes":{"class":"log-message","message":"ParsedForms"},)"
+            R"("children":[{"type":"text","value":"Parsed forms:"}],)"
+            R"("type":"element","value":"div"})",
+            json);
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/common/autofill_internals/logging_scope.cc b/components/autofill/core/common/autofill_internals/logging_scope.cc
index ab962d5..2e1597b0 100644
--- a/components/autofill/core/common/autofill_internals/logging_scope.cc
+++ b/components/autofill/core/common/autofill_internals/logging_scope.cc
@@ -5,6 +5,7 @@
 #include "components/autofill/core/common/autofill_internals/logging_scope.h"
 
 #include "base/logging.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 namespace autofill {
 
@@ -29,4 +30,11 @@
   return "";
 }
 
+LogBuffer& operator<<(LogBuffer& buf, LoggingScope scope) {
+  if (!buf.active())
+    return buf;
+  return buf << Tag{"div"} << Attrib{"scope", LoggingScopeToString(scope)}
+             << Attrib{"class", "log-entry"};
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_internals/logging_scope.h b/components/autofill/core/common/autofill_internals/logging_scope.h
index ac719ca..5684511 100644
--- a/components/autofill/core/common/autofill_internals/logging_scope.h
+++ b/components/autofill/core/common/autofill_internals/logging_scope.h
@@ -7,6 +7,8 @@
 
 namespace autofill {
 
+class LogBuffer;
+
 /////////////// Logging Scopes /////////////
 
 // Generator for source code related to logging scopes. Pass a template T which
@@ -16,6 +18,8 @@
   T(Context)                                                           \
   /* Log messages related to the discovery and parsing of forms. */    \
   T(Parsing)                                                           \
+  /* Log messages related to reasons to stop parsing a form. */        \
+  T(AbortParsing)                                                      \
   /* Log messages related to filling of forms. */                      \
   T(Filling)                                                           \
   /* Log messages related to the submission of forms. */               \
@@ -33,6 +37,8 @@
 // Returns the enum value of |scope| as a string (without the leading k).
 const char* LoggingScopeToString(LoggingScope scope);
 
+LogBuffer& operator<<(LogBuffer& buf, LoggingScope scope);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_COMMON_AUTOFILL_INTERNALS_LOGGING_SCOPE_H_
diff --git a/components/autofill/core/common/autofill_internals/logging_scope_unittest.cc b/components/autofill/core/common/autofill_internals/logging_scope_unittest.cc
new file mode 100644
index 0000000..16ffe96f
--- /dev/null
+++ b/components/autofill/core/common/autofill_internals/logging_scope_unittest.cc
@@ -0,0 +1,23 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/common/autofill_internals/logging_scope.h"
+
+#include "base/json/json_writer.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace autofill {
+
+TEST(LoggingScope, Serialization) {
+  LogBuffer buffer;
+  buffer << LoggingScope::kContext;
+  std::string json;
+  EXPECT_TRUE(base::JSONWriter::Write(buffer.RetrieveResult(), &json));
+  EXPECT_EQ(R"({"attributes":{"class":"log-entry","scope":"Context"},)"
+            R"("type":"element","value":"div"})",
+            json);
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/common/form_data.cc b/components/autofill/core/common/form_data.cc
index 5f2f9c9..a07d8f5 100644
--- a/components/autofill/core/common/form_data.cc
+++ b/components/autofill/core/common/form_data.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/common/form_field_data.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 namespace autofill {
 
@@ -250,4 +251,25 @@
   return DeserializeFormData(&iter, form_data);
 }
 
+LogBuffer& operator<<(LogBuffer& buffer, const FormData& form) {
+  buffer << Tag{"div"} << Attrib{"class", "form"};
+  buffer << Tag{"table"};
+  buffer << Tr{} << "Form name:" << form.name;
+  buffer << Tr{} << "Unique renderer Id:" << form.unique_renderer_id;
+  buffer << Tr{} << "URL:" << form.url;
+  buffer << Tr{} << "Action:" << form.action;
+  buffer << Tr{} << "Is <form> tag:" << form.is_form_tag;
+  for (size_t i = 0; i < form.fields.size(); ++i) {
+    buffer << Tag{"tr"};
+    buffer << Tag{"td"} << "Field " << i << ": " << CTag{};
+    buffer << Tag{"td"};
+    buffer << Tag{"table"} << form.fields.at(i) << CTag{"table"};
+    buffer << CTag{"td"};
+    buffer << CTag{"tr"};
+  }
+  buffer << CTag{"table"};
+  buffer << CTag{"div"};
+  return buffer;
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/common/form_data.h b/components/autofill/core/common/form_data.h
index 639135a..97d9113ccd 100644
--- a/components/autofill/core/common/form_data.h
+++ b/components/autofill/core/common/form_data.h
@@ -18,6 +18,8 @@
 
 namespace autofill {
 
+class LogBuffer;
+
 // Pair of a button title (e.g. "Register") and its type (e.g.
 // INPUT_ELEMENT_SUBMIT_TYPE).
 using ButtonTitleInfo = std::pair<base::string16, mojom::ButtonTitleType>;
@@ -120,6 +122,8 @@
 bool DeserializeFormDataFromBase64String(const base::StringPiece& input,
                                          FormData* form_data);
 
+LogBuffer& operator<<(LogBuffer& buffer, const FormData& form);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_COMMON_FORM_DATA_H_
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc
index b8c0f13c..6aec9bf 100644
--- a/components/autofill/core/common/form_field_data.cc
+++ b/components/autofill/core/common/form_field_data.cc
@@ -8,6 +8,7 @@
 #include "base/strings/string_util.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_util.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 // TODO(crbug/897756): Clean up the (de)serialization code.
 
@@ -468,4 +469,26 @@
             << "label_source=" << field.label_source;
 }
 
+LogBuffer& operator<<(LogBuffer& buffer, const FormFieldData& field) {
+  buffer << Tag{"table"};
+  buffer << Tr{} << "Name:" << field.name;
+  buffer << Tr{} << "Unique renderer Id:" << field.unique_renderer_id;
+  buffer << Tr{} << "Name attribute:" << field.name_attribute;
+  buffer << Tr{} << "Id attribute:" << field.id_attribute;
+  constexpr size_t kMaxLabelSize = 100;
+  const base::string16 truncated_label =
+      field.label.substr(0, std::min(field.label.length(), kMaxLabelSize));
+  buffer << Tr{} << "Label:" << truncated_label;
+  buffer << Tr{} << "Form control type:" << field.form_control_type;
+  buffer << Tr{} << "Autocomplete attribute:" << field.autocomplete_attribute;
+  buffer << Tr{} << "Aria label:" << field.aria_label;
+  buffer << Tr{} << "Aria description:" << field.aria_description;
+  buffer << Tr{} << "Section:" << field.section;
+  buffer << Tr{} << "Is focusable:" << field.is_focusable;
+  buffer << Tr{} << "Is enabled:" << field.is_enabled;
+  buffer << Tr{} << "Is readonly:" << field.is_readonly;
+  buffer << CTag{"table"};
+  return buffer;
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h
index b9d4f9d..301b200 100644
--- a/components/autofill/core/common/form_field_data.h
+++ b/components/autofill/core/common/form_field_data.h
@@ -22,6 +22,8 @@
 
 namespace autofill {
 
+class LogBuffer;
+
 // The flags describing form field properties.
 enum FieldPropertiesFlags {
   NO_FLAGS = 0u,
@@ -202,6 +204,9 @@
     EXPECT_EQ(expected.name_attribute, actual.name_attribute);                 \
   } while (0)
 
+// Produces a <table> element with information about the form.
+LogBuffer& operator<<(LogBuffer& buffer, const FormFieldData& form);
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_COMMON_FORM_FIELD_DATA_H_
diff --git a/components/autofill/core/browser/logging/log_buffer.cc b/components/autofill/core/common/logging/log_buffer.cc
similarity index 98%
rename from components/autofill/core/browser/logging/log_buffer.cc
rename to components/autofill/core/common/logging/log_buffer.cc
index 21ec495f..5abd4daa 100644
--- a/components/autofill/core/browser/logging/log_buffer.cc
+++ b/components/autofill/core/common/logging/log_buffer.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/logging/log_buffer.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 #include <string>
 
diff --git a/components/autofill/core/browser/logging/log_buffer.h b/components/autofill/core/common/logging/log_buffer.h
similarity index 92%
rename from components/autofill/core/browser/logging/log_buffer.h
rename to components/autofill/core/common/logging/log_buffer.h
index 2dd9c4c..fc782f4 100644
--- a/components/autofill/core/browser/logging/log_buffer.h
+++ b/components/autofill/core/common/logging/log_buffer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_BUFFER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_BUFFER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_COMMON_LOGGING_LOG_BUFFER_H_
+#define COMPONENTS_AUTOFILL_CORE_COMMON_LOGGING_LOG_BUFFER_H_
 
 #include <string>
 #include <type_traits>
@@ -14,7 +14,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/values.h"
-#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
 #include "url/gurl.h"
 
 // The desired pattern to generate log messages is to pass a scope, a log
@@ -154,19 +153,6 @@
 LogBuffer& operator<<(LogBuffer& buf, const GURL& url);
 
 template <typename T>
-LogBuffer& operator<<(LogBuffer& buf,
-                      const ::google::protobuf::RepeatedField<T>& values) {
-  buf << "[";
-  for (int i = 0; i < values.size(); ++i) {
-    if (i)
-      buf << ", ";
-    buf << values.Get(i);
-  }
-  buf << "]";
-  return buf;
-}
-
-template <typename T>
 LogBuffer& operator<<(LogBuffer& buf, const std::vector<T>& values) {
   buf << "[";
   for (size_t i = 0; i < values.size(); ++i) {
@@ -219,4 +205,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LOGGING_LOG_BUFFER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_COMMON_LOGGING_LOG_BUFFER_H_
diff --git a/components/autofill/core/browser/logging/log_buffer_unittest.cc b/components/autofill/core/common/logging/log_buffer_unittest.cc
similarity index 98%
rename from components/autofill/core/browser/logging/log_buffer_unittest.cc
rename to components/autofill/core/common/logging/log_buffer_unittest.cc
index 3b4b6c94..de9126e 100644
--- a/components/autofill/core/browser/logging/log_buffer_unittest.cc
+++ b/components/autofill/core/common/logging/log_buffer_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/logging/log_buffer.h"
+#include "components/autofill/core/common/logging/log_buffer.h"
 
 #include "base/json/json_writer.h"
 #include "base/strings/string_piece.h"
diff --git a/components/autofill/ios/browser/js_autofill_manager.mm b/components/autofill/ios/browser/js_autofill_manager.mm
index c81f80ff9..2b134fc 100644
--- a/components/autofill/ios/browser/js_autofill_manager.mm
+++ b/components/autofill/ios/browser/js_autofill_manager.mm
@@ -28,7 +28,7 @@
 
 @implementation JsAutofillManager {
   // The injection receiver used to evaluate JavaScript.
-  CRWJSInjectionReceiver* _receiver;
+  __weak CRWJSInjectionReceiver* _receiver;
 }
 
 - (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver {
diff --git a/components/autofill/ios/browser/js_suggestion_manager.mm b/components/autofill/ios/browser/js_suggestion_manager.mm
index 07a81ca2..d7fd9a12 100644
--- a/components/autofill/ios/browser/js_suggestion_manager.mm
+++ b/components/autofill/ios/browser/js_suggestion_manager.mm
@@ -24,7 +24,7 @@
 
 @implementation JsSuggestionManager {
   // The injection receiver used to evaluate JavaScript.
-  CRWJSInjectionReceiver* _receiver;
+  __weak CRWJSInjectionReceiver* _receiver;
   web::WebFramesManager* _webFramesManager;
 }
 
diff --git a/components/browser_sync/browser_sync_switches.cc b/components/browser_sync/browser_sync_switches.cc
index c1aa1b8..fbb9645 100644
--- a/components/browser_sync/browser_sync_switches.cc
+++ b/components/browser_sync/browser_sync_switches.cc
@@ -23,7 +23,7 @@
 
 #if defined(OS_ANDROID)
 const base::Feature kSyncManualStartAndroid{"SyncManualStartAndroid",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 }  // namespace switches
diff --git a/components/cronet/ios/test/cronet_prefs_test.mm b/components/cronet/ios/test/cronet_prefs_test.mm
index a4120e6..4c47613 100644
--- a/components/cronet/ios/test/cronet_prefs_test.mm
+++ b/components/cronet/ios/test/cronet_prefs_test.mm
@@ -79,7 +79,7 @@
   NSURLSession* session_;
 };
 
-TEST_F(PrefsTest, HttpSeverProperties) {
+TEST_F(PrefsTest, DISABLED_HttpSeverProperties) {
   base::FilePath storage_path;
   bool result = base::PathService::Get(base::DIR_CACHE, &storage_path);
   ASSERT_TRUE(result);
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 76582e4..38ce34b 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -226,7 +226,7 @@
 
 const std::map<base::string16, const PasswordForm*>&
 PasswordFormManager::GetBestMatches() const {
-  return best_matches_;
+  return form_fetcher_->GetBestMatches();
 }
 
 std::vector<const autofill::PasswordForm*>
@@ -280,7 +280,8 @@
     SanitizePossibleUsernames(&pending_credentials_);
     pending_credentials_.date_created = base::Time::Now();
     votes_uploader_.SendVotesOnSave(observed_form_, *parsed_submitted_form_,
-                                    best_matches_, &pending_credentials_);
+                                    form_fetcher_->GetBestMatches(),
+                                    &pending_credentials_);
     SavePendingToStore(false /*update*/);
   } else {
     ProcessUpdate();
@@ -594,8 +595,6 @@
 
 void PasswordFormManager::OnFetchCompleted() {
   received_stored_credentials_time_ = TimeTicks::Now();
-  best_matches_ = form_fetcher_->GetBestMatches();
-  preferred_match_ = form_fetcher_->GetPreferredMatch();
 
   // Copy out blacklisted matches.
   new_blacklisted_.reset();
@@ -750,10 +749,10 @@
     return;
 #endif
 
-  SendFillInformationToRenderer(client_, driver_.get(),
-                                *observed_password_form.get(), best_matches_,
-                                form_fetcher_->GetFederatedMatches(),
-                                preferred_match_, metrics_recorder_.get());
+  SendFillInformationToRenderer(
+      client_, driver_.get(), *observed_password_form.get(),
+      form_fetcher_->GetBestMatches(), form_fetcher_->GetFederatedMatches(),
+      form_fetcher_->GetPreferredMatch(), metrics_recorder_.get());
 }
 
 void PasswordFormManager::FillForm(const FormData& observed_form) {
@@ -858,7 +857,7 @@
 
   // Calculate the user's action based on existing matches and the submitted
   // form.
-  metrics_recorder_->CalculateUserAction(best_matches_,
+  metrics_recorder_->CalculateUserAction(form_fetcher_->GetBestMatches(),
                                          *parsed_submitted_form_);
 
   // This function might be called multiple times so set variables that are
@@ -870,7 +869,7 @@
   // Look for the actually submitted credentials in the list of previously saved
   // credentials that were available to autofilling.
   const PasswordForm* saved_form = password_manager_util::GetMatchForUpdating(
-      *parsed_submitted_form_, best_matches_);
+      *parsed_submitted_form_, form_fetcher_->GetBestMatches());
   if (saved_form) {
     // A similar credential exists in the store already.
     pending_credentials_ = *saved_form;
@@ -978,7 +977,8 @@
 
 void PasswordFormManager::ProcessUpdate() {
   DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState());
-  DCHECK(preferred_match_ || pending_credentials_.IsFederatedCredential());
+  DCHECK(form_fetcher_->GetPreferredMatch() ||
+         pending_credentials_.IsFederatedCredential());
   // If we're doing an Update, we either autofilled correctly and need to
   // update the stats, or the user typed in a new password for autofilled
   // username, or the user selected one of the non-preferred matches,
@@ -1008,16 +1008,17 @@
   }
 
   if (pending_credentials_.times_used == 1) {
-    votes_uploader_.UploadFirstLoginVotes(best_matches_, pending_credentials_,
+    votes_uploader_.UploadFirstLoginVotes(form_fetcher_->GetBestMatches(),
+                                          pending_credentials_,
                                           *parsed_submitted_form_);
   }
 }
 
 void PasswordFormManager::FillHttpAuth() {
   DCHECK(IsHttpAuth());
-  if (!preferred_match_)
+  if (!form_fetcher_->GetPreferredMatch())
     return;
-  client_->AutofillHttpAuth(*preferred_match_, this);
+  client_->AutofillHttpAuth(*form_fetcher_->GetPreferredMatch(), this);
 }
 
 std::unique_ptr<PasswordForm> PasswordFormManager::ParseFormAndMakeLogging(
@@ -1102,7 +1103,7 @@
 
 void PasswordFormManager::SavePendingToStore(bool update) {
   const PasswordForm* saved_form = password_manager_util::GetMatchForUpdating(
-      *parsed_submitted_form_, best_matches_);
+      *parsed_submitted_form_, form_fetcher_->GetBestMatches());
   if ((update || password_overridden_) &&
       !pending_credentials_.IsFederatedCredential()) {
     DCHECK(saved_form);
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h
index ee296dd..683f890 100644
--- a/components/password_manager/core/browser/password_form_manager.h
+++ b/components/password_manager/core/browser/password_form_manager.h
@@ -294,11 +294,6 @@
   // API.
   base::Optional<PasswordStore::FormDigest> observed_not_web_form_digest_;
 
-  // Set of nonblacklisted PasswordForms from the DB that best match the form
-  // being managed by |this|, indexed by username. The PasswordForms are owned
-  // by |form_fetcher_|.
-  std::map<base::string16, const autofill::PasswordForm*> best_matches_;
-
   // Set of blacklisted forms from the PasswordStore that best match the current
   // form. They are owned by |form_fetcher_|.
   std::vector<const autofill::PasswordForm*> blacklisted_matches_;
@@ -312,12 +307,6 @@
   // which are owned by |form_fetcher_|).
   std::unique_ptr<autofill::PasswordForm> new_blacklisted_;
 
-  // Convenience pointer to entry in best_matches_ that is marked
-  // as preferred. This is only allowed to be null if there are no best matches
-  // at all, since there will always be one preferred login when there are
-  // multiple matches (when first saved, a login is marked preferred).
-  const autofill::PasswordForm* preferred_match_ = nullptr;
-
   // Takes care of recording metrics and events for |*this|.
   scoped_refptr<PasswordFormMetricsRecorder> metrics_recorder_;
 
diff --git a/components/password_manager/core/browser/password_form_metrics_recorder.cc b/components/password_manager/core/browser/password_form_metrics_recorder.cc
index 6346433..c55f3ff08 100644
--- a/components/password_manager/core/browser/password_form_metrics_recorder.cc
+++ b/components/password_manager/core/browser/password_form_metrics_recorder.cc
@@ -643,9 +643,9 @@
             username_updated_in_bubble_
                 ? SavingOnUsernameFirstFlow::kSavedWithEditedUsername
                 : SavingOnUsernameFirstFlow::kSaved;
-        UMA_HISTOGRAM_ENUMERATION("PasswordManager.SavingOnUsernameFirstFlow",
-                                  saving_on_username_first_flow);
       }
+      UMA_HISTOGRAM_ENUMERATION("PasswordManager.SavingOnUsernameFirstFlow",
+                                saving_on_username_first_flow);
     }
   }
 
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index 77b2051..ba3308e 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -3097,7 +3097,7 @@
   EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_))
       .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save)));
 
-  // The form disappeared, so the submission is condered to be successful.
+  // The form disappeared, so the submission is considered to be successful.
   manager()->OnPasswordFormsRendered(&driver_, {}, true);
   ASSERT_TRUE(form_manager_to_save);
   EXPECT_THAT(form_manager_to_save->GetPendingCredentials(),
diff --git a/components/password_manager/ios/js_password_manager.mm b/components/password_manager/ios/js_password_manager.mm
index 56eee97..43859dede 100644
--- a/components/password_manager/ios/js_password_manager.mm
+++ b/components/password_manager/ios/js_password_manager.mm
@@ -75,7 +75,7 @@
 
 @implementation JsPasswordManager {
   // The injection receiver used to evaluate JavaScript.
-  CRWJSInjectionReceiver* _receiver;
+  __weak CRWJSInjectionReceiver* _receiver;
 }
 
 - (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver {
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
index 108a755..8caff10 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
 #include "build/build_config.h"
@@ -248,14 +249,6 @@
     remote_command_request_.mutable_remote_command_request()
         ->set_send_secure_commands(true);
 
-    em::RemoteCommand* command =
-        remote_command_response_.mutable_remote_command_response()
-            ->add_commands();
-    command->set_age_of_command(kAgeOfCommand);
-    command->set_payload(kPayload);
-    command->set_command_id(kLastCommandId + 1);
-    command->set_type(em::RemoteCommand_Type_COMMAND_ECHO_TEST);
-
     attribute_update_permission_request_.
         mutable_device_attribute_update_permission_request();
     attribute_update_permission_response_.
@@ -317,7 +310,7 @@
     client_->RemoveObserver(&observer_);
   }
 
-  void Register() {
+  void RegisterClient() {
     EXPECT_CALL(observer_, OnRegistrationStateChanged(_));
     EXPECT_CALL(device_dmtoken_callback_observer_, OnDeviceDMTokenRequested(_))
         .WillOnce(Return(kDeviceDMToken));
@@ -475,14 +468,15 @@
                             net::OK, DeviceManagementService::kSuccess, "{}")));
   }
 
-  void ExpectFetchRemoteCommands() {
+  void ExpectFetchRemoteCommands(
+      const em::DeviceManagementResponse& remote_command_response) {
     EXPECT_CALL(service_, StartJob(_))
         .WillOnce(DoAll(
             service_.CaptureJobType(&job_type_),
             service_.CaptureQueryParams(&query_params_),
             service_.CaptureRequest(&job_request_),
             service_.StartJobAsync(net::OK, DeviceManagementService::kSuccess,
-                                   remote_command_response_)));
+                                   remote_command_response)));
   }
 
   void ExpectAttributeUpdatePermission(const std::string& oauth_token) {
@@ -580,7 +574,6 @@
   em::DeviceManagementResponse upload_certificate_response_;
   em::DeviceManagementResponse upload_status_response_;
   em::DeviceManagementResponse chrome_desktop_report_response_;
-  em::DeviceManagementResponse remote_command_response_;
   em::DeviceManagementResponse attribute_update_permission_response_;
   em::DeviceManagementResponse attribute_update_response_;
   em::DeviceManagementResponse gcm_id_update_response_;
@@ -912,7 +905,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyUpdate) {
-  Register();
+  RegisterClient();
 
   ExpectPolicyFetch(kDMToken);
   EXPECT_CALL(observer_, OnPolicyFetched(_));
@@ -940,7 +933,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyFetchWithMetaData) {
-  Register();
+  RegisterClient();
 
   const base::Time timestamp(
       base::Time::UnixEpoch() + base::TimeDelta::FromDays(20));
@@ -963,7 +956,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyFetchWithInvalidation) {
-  Register();
+  RegisterClient();
 
   int64_t previous_version = client_->fetched_invalidation_version();
   client_->SetInvalidationInfo(12345, "12345");
@@ -986,7 +979,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyFetchWithInvalidationNoPayload) {
-  Register();
+  RegisterClient();
 
   int64_t previous_version = client_->fetched_invalidation_version();
   client_->SetInvalidationInfo(-12345, std::string());
@@ -1007,7 +1000,7 @@
 // Tests that previous OAuth token is no longer sent in policy fetch after its
 // value was cleared.
 TEST_F(CloudPolicyClientTest, PolicyFetchClearOAuthToken) {
-  Register();
+  RegisterClient();
 
   ExpectPolicyFetchWithAdditionalAuth(kDMToken, kOAuthToken);
   EXPECT_CALL(observer_, OnPolicyFetched(_));
@@ -1033,7 +1026,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, BadPolicyResponse) {
-  Register();
+  RegisterClient();
 
   policy_response_.clear_policy_response();
   ExpectPolicyFetch(kDMToken);
@@ -1064,7 +1057,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyRequestFailure) {
-  Register();
+  RegisterClient();
 
   DeviceManagementService::JobConfiguration::JobType job_type;
   EXPECT_CALL(service_, StartJob(_))
@@ -1082,7 +1075,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, Unregister) {
-  Register();
+  RegisterClient();
 
   ExpectUnregistration(kDMToken);
   EXPECT_CALL(observer_, OnRegistrationStateChanged(_));
@@ -1097,7 +1090,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UnregisterEmpty) {
-  Register();
+  RegisterClient();
 
   DeviceManagementService::JobConfiguration::JobType job_type;
   unregistration_response_.clear_unregister_response();
@@ -1114,7 +1107,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UnregisterFailure) {
-  Register();
+  RegisterClient();
 
   DeviceManagementService::JobConfiguration::JobType job_type;
   EXPECT_CALL(service_, StartJob(_))
@@ -1132,7 +1125,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyFetchWithExtensionPolicy) {
-  Register();
+  RegisterClient();
 
   // Set up the |expected_responses| and |policy_response_|.
   static const char* kExtensions[] = {
@@ -1204,7 +1197,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadEnterpriseMachineCertificate) {
-  Register();
+  RegisterClient();
 
   ExpectUploadCertificate(upload_machine_certificate_request_);
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1221,7 +1214,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadEnterpriseEnrollmentCertificate) {
-  Register();
+  RegisterClient();
 
   ExpectUploadCertificate(upload_enrollment_certificate_request_);
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1239,7 +1232,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadEnterpriseMachineCertificateEmpty) {
-  Register();
+  RegisterClient();
 
   upload_certificate_response_.clear_cert_upload_response();
   ExpectUploadCertificate(upload_machine_certificate_request_);
@@ -1257,7 +1250,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadEnterpriseEnrollmentCertificateEmpty) {
-  Register();
+  RegisterClient();
 
   upload_certificate_response_.clear_cert_upload_response();
   ExpectUploadCertificate(upload_enrollment_certificate_request_);
@@ -1276,7 +1269,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadCertificateFailure) {
-  Register();
+  RegisterClient();
 
   const enterprise_management::DeviceManagementResponse dummy_response;
   DeviceManagementService::JobConfiguration::JobType job_type;
@@ -1299,7 +1292,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadEnterpriseEnrollmentId) {
-  Register();
+  RegisterClient();
 
   ExpectUploadCertificate(upload_enrollment_id_request_);
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1316,7 +1309,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadStatus) {
-  Register();
+  RegisterClient();
 
   ExpectUploadStatus();
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1337,7 +1330,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadStatusWithOAuthToken) {
-  Register();
+  RegisterClient();
 
   // Test that OAuth token is sent in status upload.
   client_->SetOAuthTokenAsAdditionalAuth(kOAuthToken);
@@ -1376,7 +1369,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadStatusWhilePolicyFetchActive) {
-  Register();
+  RegisterClient();
   DeviceManagementService::JobConfiguration::JobType job_type;
   EXPECT_CALL(service_, StartJob(_))
       .WillOnce(DoAll(
@@ -1413,7 +1406,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadPolicyValidationReport) {
-  Register();
+  RegisterClient();
 
   ExpectUploadPolicyValidationReport();
   std::vector<ValueValidationIssue> issues;
@@ -1433,7 +1426,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadChromeDesktopReport) {
-  Register();
+  RegisterClient();
 
   ExpectChromeDesktopReport();
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1456,7 +1449,7 @@
 #if defined(OS_WIN) || defined(OS_MACOSX) || \
     defined(OS_LINUX) && !defined(OS_CHROMEOS)
 TEST_F(CloudPolicyClientTest, UploadRealtimeReport) {
-  Register();
+  RegisterClient();
 
   ExpectRealtimeReport();
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1589,7 +1582,7 @@
 #endif
 
 TEST_F(CloudPolicyClientTest, MultipleActiveRequests) {
-  Register();
+  RegisterClient();
 
   // Set up pending upload status job.
   DeviceManagementService::JobConfiguration::JobType upload_type;
@@ -1636,7 +1629,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadStatusFailure) {
-  Register();
+  RegisterClient();
 
   const enterprise_management::DeviceManagementResponse dummy_response;
   DeviceManagementService::JobConfiguration::JobType job_type;
@@ -1664,7 +1657,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, RequestCancelOnUnregister) {
-  Register();
+  RegisterClient();
 
   // Set up pending upload status job.
   DeviceManagementService::JobConfiguration::JobType upload_type;
@@ -1698,15 +1691,24 @@
 TEST_F(CloudPolicyClientTest, FetchRemoteCommands) {
   StrictMock<MockRemoteCommandsObserver> remote_commands_observer;
 
-  Register();
+  RegisterClient();
 
-  ExpectFetchRemoteCommands();
+  em::DeviceManagementResponse remote_command_response;
+  em::RemoteCommand* command =
+      remote_command_response.mutable_remote_command_response()->add_commands();
+  command->set_age_of_command(kAgeOfCommand);
+  command->set_payload(kPayload);
+  command->set_command_id(kLastCommandId + 1);
+  command->set_type(em::RemoteCommand_Type_COMMAND_ECHO_TEST);
+
+  ExpectFetchRemoteCommands(remote_command_response);
+
   EXPECT_CALL(
       remote_commands_observer,
       OnRemoteCommandsFetched(
           DM_STATUS_SUCCESS,
           ElementsAre(MatchProto(
-              remote_command_response_.remote_command_response().commands(0))),
+              remote_command_response.remote_command_response().commands(0))),
           _))
       .Times(1);
   CloudPolicyClient::RemoteCommandCallback callback =
@@ -1726,8 +1728,55 @@
   EXPECT_EQ(DM_STATUS_SUCCESS, client_->status());
 }
 
+TEST_F(CloudPolicyClientTest, FetchSecureRemoteCommands) {
+  StrictMock<MockRemoteCommandsObserver> remote_commands_observer;
+
+  RegisterClient();
+
+  em::DeviceManagementResponse remote_command_response;
+  em::SignedData* signed_command =
+      remote_command_response.mutable_remote_command_response()
+          ->add_secure_commands();
+  signed_command->set_data("signed-data");
+  signed_command->set_signature("signed-signature");
+
+  ExpectFetchRemoteCommands(remote_command_response);
+
+  EXPECT_CALL(
+      remote_commands_observer,
+      OnRemoteCommandsFetched(
+          DM_STATUS_SUCCESS, _,
+          ElementsAre(MatchProto(
+              remote_command_response.remote_command_response().secure_commands(
+                  0)))))
+      .Times(1);
+
+  base::RunLoop run_loop;
+  CloudPolicyClient::RemoteCommandCallback callback =
+      base::BindLambdaForTesting(
+          [&](DeviceManagementStatus status,
+              const std::vector<enterprise_management::RemoteCommand>& commands,
+              const std::vector<enterprise_management::SignedData>&
+                  signed_commands) {
+            remote_commands_observer.OnRemoteCommandsFetched(status, commands,
+                                                             signed_commands);
+            run_loop.Quit();
+          });
+  const std::vector<em::RemoteCommandResult> command_results(
+      1, remote_command_request_.remote_command_request().command_results(0));
+  client_->FetchRemoteCommands(
+      std::make_unique<RemoteCommandJob::UniqueIDType>(kLastCommandId),
+      command_results, std::move(callback));
+  run_loop.Run();
+  EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REMOTE_COMMANDS,
+            job_type_);
+  EXPECT_EQ(job_request_.SerializePartialAsString(),
+            remote_command_request_.SerializePartialAsString());
+  EXPECT_EQ(DM_STATUS_SUCCESS, client_->status());
+}
+
 TEST_F(CloudPolicyClientTest, RequestDeviceAttributeUpdatePermission) {
-  Register();
+  RegisterClient();
   ExpectAttributeUpdatePermission(kOAuthToken);
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
 
@@ -1746,7 +1795,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, RequestDeviceAttributeUpdate) {
-  Register();
+  RegisterClient();
   ExpectAttributeUpdate(kOAuthToken);
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
 
@@ -1764,7 +1813,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, RequestGcmIdUpdate) {
-  Register();
+  RegisterClient();
   ExpectGcmIdUpdate();
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
 
@@ -1822,7 +1871,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadAppInstallReport) {
-  Register();
+  RegisterClient();
   em::DeviceManagementRequest request;
   request.mutable_app_install_report_request();
   ExpectUploadAppInstallReport(request);
@@ -1842,7 +1891,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, CancelUploadAppInstallReport) {
-  Register();
+  RegisterClient();
   em::DeviceManagementRequest request;
   request.mutable_app_install_report_request();
   ExpectUploadAppInstallReport(request);
@@ -1868,7 +1917,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, UploadAppInstallReportSupersedesPending) {
-  Register();
+  RegisterClient();
   em::DeviceManagementRequest request;
   request.mutable_app_install_report_request();
   ExpectUploadAppInstallReport(request);
@@ -1904,7 +1953,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyReregistration) {
-  Register();
+  RegisterClient();
 
   // Handle 410 (unknown deviceID) on policy fetch.
   EXPECT_TRUE(client_->is_registered());
@@ -1946,7 +1995,7 @@
 }
 
 TEST_F(CloudPolicyClientTest, PolicyReregistrationFailsWithNonMatchingDMToken) {
-  Register();
+  RegisterClient();
 
   // Handle 410 (unknown deviceID) on policy fetch.
   EXPECT_TRUE(client_->is_registered());
diff --git a/components/policy/core/common/remote_commands/remote_commands_service.cc b/components/policy/core/common/remote_commands/remote_commands_service.cc
index 58e044f..3602e8d 100644
--- a/components/policy/core/common/remote_commands/remote_commands_service.cc
+++ b/components/policy/core/common/remote_commands/remote_commands_service.cc
@@ -98,11 +98,20 @@
       signed_command.signature(),
       CloudPolicyValidatorBase::SignatureType::SHA1);
 
+  auto ignore_result = base::BindOnce(
+      [](std::vector<em::RemoteCommandResult>* unsent_results,
+         const char* error_msg) {
+        SYSLOG(ERROR) << error_msg;
+        em::RemoteCommandResult result;
+        result.set_result(em::RemoteCommandResult_ResultType_RESULT_IGNORED);
+        result.set_command_id(-1);
+        unsent_results->push_back(result);
+      },
+      &unsent_results_);
+
   if (!valid_signature) {
-    SYSLOG(ERROR) << "Secure remote command signature verification failed";
-    em::RemoteCommandResult result;
-    result.set_result(em::RemoteCommandResult_ResultType_RESULT_IGNORED);
-    unsent_results_.push_back(result);
+    std::move(ignore_result)
+        .Run("Secure remote command signature verification failed");
     return;
   }
 
@@ -111,24 +120,25 @@
       !policy_data.has_policy_type() ||
       policy_data.policy_type() !=
           dm_protocol::kChromeRemoteCommandPolicyType) {
-    SYSLOG(ERROR) << "Secure remote command with wrong PolicyData type";
-    em::RemoteCommandResult result;
-    result.set_result(em::RemoteCommandResult_ResultType_RESULT_IGNORED);
-    unsent_results_.push_back(result);
+    std::move(ignore_result)
+        .Run("Secure remote command with wrong PolicyData type");
     return;
   }
 
   em::RemoteCommand command;
   if (!policy_data.has_policy_value() ||
       !command.ParseFromString(policy_data.policy_value())) {
-    SYSLOG(ERROR) << "Secure remote command invalid RemoteCommand data";
-    em::RemoteCommandResult result;
-    result.set_result(em::RemoteCommandResult_ResultType_RESULT_IGNORED);
-    unsent_results_.push_back(result);
+    std::move(ignore_result)
+        .Run("Secure remote command invalid RemoteCommand data");
     return;
   }
 
-  // TODO(isandrk): Also make sure that target_device_id matches and add tests!
+  const em::PolicyData* const policy = store_->policy();
+  if (!policy || policy->device_id() != command.target_device_id()) {
+    std::move(ignore_result)
+        .Run("Secure remote command wrong target device id");
+    return;
+  }
 
   // Signature verification passed.
   EnqueueCommand(command, &signed_command);
diff --git a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
index cbb018e1..d93afe5 100644
--- a/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
+++ b/components/policy/core/common/remote_commands/remote_commands_service_unittest.cc
@@ -20,6 +20,8 @@
 #include "base/time/tick_clock.h"
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
+#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
+#include "components/policy/core/common/cloud/policy_builder.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
 #include "components/policy/core/common/remote_commands/remote_commands_factory.h"
 #include "components/policy/core/common/remote_commands/remote_commands_queue.h"
@@ -50,6 +52,11 @@
   EXPECT_EQ(expected_payload, command_result.payload());
 }
 
+void ExpectIgnoredJob(const em::RemoteCommandResult& command_result) {
+  EXPECT_EQ(em::RemoteCommandResult_ResultType_RESULT_IGNORED,
+            command_result.result());
+}
+
 }  // namespace
 
 // Mocked RemoteCommand factory to allow us to build test commands.
@@ -79,6 +86,33 @@
   DISALLOW_COPY_AND_ASSIGN(MockTestRemoteCommandFactory);
 };
 
+// Expectations for a single FetchRemoteCommands() call.
+struct FetchCallExpectation {
+  FetchCallExpectation() = default;
+
+  FetchCallExpectation SetCommandResults(size_t n) {
+    expected_command_results = n;
+    return *this;
+  }
+  FetchCallExpectation SetFetchedCommands(size_t n) {
+    expected_fetched_commands = n;
+    return *this;
+  }
+  FetchCallExpectation SetSignedCommands(size_t n) {
+    expected_signed_commands = n;
+    return *this;
+  }
+  FetchCallExpectation SetFetchedCallback(base::Closure callback) {
+    commands_fetched_callback = callback;
+    return *this;
+  }
+
+  size_t expected_command_results = 0;
+  size_t expected_fetched_commands = 0;
+  size_t expected_signed_commands = 0;
+  base::Closure commands_fetched_callback = base::DoNothing();
+};
+
 // A mocked CloudPolicyClient to interact with a TestingRemoteCommandsServer.
 class TestingCloudPolicyClientForRemoteCommands : public CloudPolicyClient {
  public:
@@ -102,33 +136,12 @@
     EXPECT_TRUE(expected_fetch_commands_calls_.empty());
   }
 
-  // Expect a FetchRemoteCommands() call with |expected_command_results|
-  // commands results sent and |expected_fetched_commands| commands fetched.
-  // |commands_fetched_callback| will be executed after the fetch is processed.
-  void ExpectFetchCommands(size_t expected_command_results,
-                           size_t expected_fetched_commands,
-                           const base::Closure& commands_fetched_callback) {
-    expected_fetch_commands_calls_.push(FetchCallExpectation(
-        expected_command_results, expected_fetched_commands,
-        commands_fetched_callback));
+  // Expect a FetchRemoteCommands() call with |fetch_call_expectation|.
+  void ExpectFetchCommands(FetchCallExpectation fetch_call_expectation) {
+    expected_fetch_commands_calls_.push(fetch_call_expectation);
   }
 
  private:
-  // Expectations for a single FetchRemoteCommands() call.
-  struct FetchCallExpectation {
-    FetchCallExpectation(size_t expected_command_results,
-                         size_t expected_fetched_commands,
-                         const base::Closure& commands_fetched_callback)
-        : expected_command_results(expected_command_results),
-          expected_fetched_commands(expected_fetched_commands),
-          commands_fetched_callback(commands_fetched_callback) {}
-    virtual ~FetchCallExpectation() {}
-
-    const size_t expected_command_results;
-    const size_t expected_fetched_commands;
-    const base::Closure commands_fetched_callback;
-  };
-
   void FetchRemoteCommands(
       std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id,
       const std::vector<em::RemoteCommandResult>& command_results,
@@ -155,13 +168,21 @@
       const std::vector<em::RemoteCommandResult>& command_results,
       RemoteCommandCallback callback,
       const FetchCallExpectation& fetch_call_expectation) {
-    const std::vector<em::RemoteCommand> fetched_commands =
-        server_->FetchCommands(std::move(last_command_id), command_results);
+    std::vector<em::RemoteCommand> fetched_commands;
+    std::vector<em::SignedData> signed_commands;
+    server_->FetchCommands(std::move(last_command_id), command_results,
+                           &fetched_commands, &signed_commands);
+
+    // The server will send us either old-style unsigned or new signed commands,
+    // never both at the same time.
+    EXPECT_TRUE(fetched_commands.size() == 0 || signed_commands.size() == 0);
 
     EXPECT_EQ(fetch_call_expectation.expected_command_results,
               command_results.size());
     EXPECT_EQ(fetch_call_expectation.expected_fetched_commands,
               fetched_commands.size());
+    EXPECT_EQ(fetch_call_expectation.expected_signed_commands,
+              signed_commands.size());
 
     if (!fetch_call_expectation.commands_fetched_callback.is_null())
       fetch_call_expectation.commands_fetched_callback.Run();
@@ -170,7 +191,7 @@
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
         base::BindOnce(std::move(callback), DM_STATUS_SUCCESS, fetched_commands,
-                       std::vector<em::SignedData>()),
+                       signed_commands),
         base::TimeDelta::FromSeconds(
             kTestClientServerCommunicationDelayInSeconds));
   }
@@ -184,24 +205,17 @@
 // Base class for unit tests regarding remote commands service.
 class RemoteCommandsServiceTest : public testing::Test {
  protected:
-  RemoteCommandsServiceTest() = default;
-
-  void SetUp() override {
-    server_.reset(new TestingRemoteCommandsServer());
+  RemoteCommandsServiceTest()
+      : server_(std::make_unique<TestingRemoteCommandsServer>()) {
     server_->SetClock(mock_task_runner_->GetMockTickClock());
-    cloud_policy_client_.reset(
-        new TestingCloudPolicyClientForRemoteCommands(server_.get()));
-  }
-
-  void TearDown() override {
-    remote_commands_service_.reset();
-    cloud_policy_client_.reset();
-    server_.reset();
+    cloud_policy_client_ =
+        std::make_unique<TestingCloudPolicyClientForRemoteCommands>(
+            server_.get());
   }
 
   void StartService(std::unique_ptr<RemoteCommandsFactory> factory) {
-    remote_commands_service_.reset(new RemoteCommandsService(
-        std::move(factory), cloud_policy_client_.get(), nullptr /* store */));
+    remote_commands_service_ = std::make_unique<RemoteCommandsService>(
+        std::move(factory), cloud_policy_client_.get(), &store_);
     remote_commands_service_->SetClocksForTesting(
         mock_task_runner_->GetMockClock(),
         mock_task_runner_->GetMockTickClock());
@@ -209,16 +223,17 @@
 
   void FlushAllTasks() { mock_task_runner_->FastForwardUntilNoTasksRemain(); }
 
-  std::unique_ptr<TestingRemoteCommandsServer> server_;
-  std::unique_ptr<TestingCloudPolicyClientForRemoteCommands>
-      cloud_policy_client_;
-  std::unique_ptr<RemoteCommandsService> remote_commands_service_;
-
- private:
   const scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_ =
       base::MakeRefCounted<base::TestMockTimeTaskRunner>(
           base::TestMockTimeTaskRunner::Type::kBoundToThread);
 
+  std::unique_ptr<TestingRemoteCommandsServer> server_;
+  std::unique_ptr<TestingCloudPolicyClientForRemoteCommands>
+      cloud_policy_client_;
+  MockCloudPolicyStore store_;
+  std::unique_ptr<RemoteCommandsService> remote_commands_service_;
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(RemoteCommandsServiceTest);
 };
 
@@ -231,7 +246,7 @@
   StartService(std::move(factory));
 
   // A fetch requst should get nothing from server.
-  cloud_policy_client_->ExpectFetchCommands(0u, 0u, base::Closure());
+  cloud_policy_client_->ExpectFetchCommands(FetchCallExpectation());
   EXPECT_TRUE(remote_commands_service_->FetchRemoteCommands());
 
   FlushAllTasks();
@@ -252,7 +267,9 @@
                           base::Bind(&ExpectSucceededJob, kTestPayload), false);
 
     // Start the service, run until the command is fetched.
-    cloud_policy_client_->ExpectFetchCommands(0u, 1u, run_loop.QuitClosure());
+    cloud_policy_client_->ExpectFetchCommands(
+        FetchCallExpectation().SetFetchedCommands(1).SetFetchedCallback(
+            run_loop.QuitClosure()));
     StartService(std::move(factory));
     EXPECT_TRUE(remote_commands_service_->FetchRemoteCommands());
 
@@ -260,7 +277,8 @@
   }
 
   // And run again so that the result can be reported.
-  cloud_policy_client_->ExpectFetchCommands(1u, 0u, base::Closure());
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetCommandResults(1));
 
   FlushAllTasks();
 
@@ -278,8 +296,10 @@
   // Set up expectations on fetch commands calls. The first request will fetch
   // one command, and the second will fetch none but provide result for the
   // previous command instead.
-  cloud_policy_client_->ExpectFetchCommands(0u, 1u, base::Closure());
-  cloud_policy_client_->ExpectFetchCommands(1u, 0u, base::Closure());
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetFetchedCommands(1));
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetCommandResults(1));
 
   // Issue a command and manually start a command fetch.
   server_->IssueCommand(em::RemoteCommand_Type_COMMAND_ECHO_TEST, kTestPayload,
@@ -308,7 +328,8 @@
                           kTestPayload,
                           base::Bind(&ExpectSucceededJob, kTestPayload), true);
 
-    cloud_policy_client_->ExpectFetchCommands(0u, 0u, run_loop.QuitClosure());
+    cloud_policy_client_->ExpectFetchCommands(
+        FetchCallExpectation().SetFetchedCallback(run_loop.QuitClosure()));
 
     // Attempts to fetch commands.
     EXPECT_TRUE(remote_commands_service_->FetchRemoteCommands());
@@ -330,8 +351,10 @@
   // issued before the first fetch request completes in previous run loop.
   EXPECT_EQ(1u, server_->NumberOfCommandsPendingResult());
 
-  cloud_policy_client_->ExpectFetchCommands(0u, 1u, base::Closure());
-  cloud_policy_client_->ExpectFetchCommands(1u, 0u, base::Closure());
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetFetchedCommands(1));
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetCommandResults(1));
 
   // No further fetch request is made, but the new issued command should be
   // fetched and executed.
@@ -359,8 +382,10 @@
   // Set up expectations on fetch commands calls. The first request will fetch
   // one command, and the second will fetch none but provide result for the
   // previous command instead.
-  cloud_policy_client_->ExpectFetchCommands(0u, 1u, base::Closure());
-  cloud_policy_client_->ExpectFetchCommands(1u, 0u, base::Closure());
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetFetchedCommands(1));
+  cloud_policy_client_->ExpectFetchCommands(
+      FetchCallExpectation().SetCommandResults(1));
 
   // Issue a command and manually start a command fetch.
   server_->IssueCommand(em::RemoteCommand_Type_COMMAND_ECHO_TEST, kTestPayload,
@@ -372,4 +397,111 @@
   EXPECT_TRUE(on_command_acked_callback_called);
 }
 
+class EnsureCalled {
+ public:
+  EnsureCalled() = default;
+  ~EnsureCalled() { CHECK(called_times_ == 1); }
+
+  void Bind(ResultReportedCallback callback) {
+    callback_ = std::move(callback);
+  }
+
+  void Call(const em::RemoteCommandResult& command_result) {
+    called_times_++;
+    std::move(callback_).Run(command_result);
+  }
+
+ private:
+  int called_times_ = 0;
+  ResultReportedCallback callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(EnsureCalled);
+};
+
+class SignedRemoteCommandsServiceTest : public RemoteCommandsServiceTest {
+ protected:
+  SignedRemoteCommandsServiceTest() {
+    StartService(std::make_unique<MockTestRemoteCommandFactory>());
+
+    // Set the public key and the device id.
+    std::vector<uint8_t> public_key = PolicyBuilder::GetPublicTestKey();
+    store_.policy_signature_public_key_.assign(public_key.begin(),
+                                               public_key.end());
+    store_.policy_ = std::make_unique<em::PolicyData>();
+    store_.policy_->set_device_id("acme-device");
+
+    // Set up expectations on fetch commands calls. The first request will fetch
+    // one secure command, and the second will fetch none but provide result for
+    // the previous command instead.
+    cloud_policy_client_->ExpectFetchCommands(
+        FetchCallExpectation().SetSignedCommands(1));
+    cloud_policy_client_->ExpectFetchCommands(
+        FetchCallExpectation().SetCommandResults(1));
+  }
+
+  ~SignedRemoteCommandsServiceTest() override {
+    EXPECT_TRUE(remote_commands_service_->FetchRemoteCommands());
+    FlushAllTasks();
+    EXPECT_EQ(0u, server_->NumberOfCommandsPendingResult());
+  }
+
+  EnsureCalled ensure_called_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SignedRemoteCommandsServiceTest);
+};
+
+// Tests that signed remote commands work.
+TEST_F(SignedRemoteCommandsServiceTest, Success) {
+  ensure_called_.Bind(base::BindOnce(&ExpectSucceededJob, std::string()));
+  server_->IssueSignedCommand(
+      base::BindOnce(&EnsureCalled::Call, base::Unretained(&ensure_called_)),
+      nullptr, nullptr, nullptr);
+}
+
+// Tests that we reject signed remote commands with invalid signature.
+TEST_F(SignedRemoteCommandsServiceTest, InvalidSignature) {
+  em::SignedData signed_data;
+  signed_data.set_data("some-random-data");
+  signed_data.set_signature("random-signature");
+
+  ensure_called_.Bind(base::BindOnce(&ExpectIgnoredJob));
+  server_->IssueSignedCommand(
+      base::BindOnce(&EnsureCalled::Call, base::Unretained(&ensure_called_)),
+      nullptr, nullptr, &signed_data);
+}
+
+// Tests that we reject signed remote commands with invalid PolicyData type.
+TEST_F(SignedRemoteCommandsServiceTest, InvalidPolicyDataType) {
+  em::PolicyData policy_data;
+  policy_data.set_policy_type("some-random-policy-type");
+
+  ensure_called_.Bind(base::BindOnce(&ExpectIgnoredJob));
+  server_->IssueSignedCommand(
+      base::BindOnce(&EnsureCalled::Call, base::Unretained(&ensure_called_)),
+      nullptr, &policy_data, nullptr);
+}
+
+// Tests that we reject signed remote commands with invalid RemoteCommand data.
+TEST_F(SignedRemoteCommandsServiceTest, InvalidRemoteCommand) {
+  em::PolicyData policy_data;
+  policy_data.set_policy_type("google/chromeos/remotecommand");
+
+  ensure_called_.Bind(base::BindOnce(&ExpectIgnoredJob));
+  server_->IssueSignedCommand(
+      base::BindOnce(&EnsureCalled::Call, base::Unretained(&ensure_called_)),
+      nullptr, &policy_data, nullptr);
+}
+
+// Tests that we reject signed remote commands with invalid target device id.
+TEST_F(SignedRemoteCommandsServiceTest, InvalidDeviceId) {
+  em::RemoteCommand remote_command;
+  remote_command.set_target_device_id("roadrunner-device");
+
+  ensure_called_.Bind(base::BindOnce(&ExpectIgnoredJob));
+  server_->IssueSignedCommand(
+      base::BindOnce(&EnsureCalled::Call, base::Unretained(&ensure_called_)),
+      &remote_command, nullptr, nullptr);
+}
+
 }  // namespace policy
diff --git a/components/policy/core/common/remote_commands/testing_remote_commands_server.cc b/components/policy/core/common/remote_commands/testing_remote_commands_server.cc
index 902ebdc..faa15e9 100644
--- a/components/policy/core/common/remote_commands/testing_remote_commands_server.cc
+++ b/components/policy/core/common/remote_commands/testing_remote_commands_server.cc
@@ -4,33 +4,61 @@
 
 #include "components/policy/core/common/remote_commands/testing_remote_commands_server.h"
 
+#include <iterator>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/hash/sha1.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/optional.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
+#include "components/policy/core/common/cloud/policy_builder.h"
+#include "crypto/signature_creator.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace em = enterprise_management;
 
 namespace policy {
 
+namespace {
+
+std::string SignDataWithTestKey(const std::string& data) {
+  std::unique_ptr<crypto::RSAPrivateKey> private_key =
+      PolicyBuilder::CreateTestSigningKey();
+  std::string sha1 = base::SHA1HashString(data);
+  std::vector<uint8_t> digest(sha1.begin(), sha1.end());
+  std::vector<uint8_t> result;
+  CHECK(crypto::SignatureCreator::Sign(private_key.get(),
+                                       crypto::SignatureCreator::SHA1,
+                                       digest.data(), digest.size(), &result));
+  return std::string(result.begin(), result.end());
+}
+
+}  // namespace
+
 struct TestingRemoteCommandsServer::RemoteCommandWithCallback {
-  RemoteCommandWithCallback(const em::RemoteCommand& command_proto,
+  RemoteCommandWithCallback(em::RemoteCommand command_proto,
+                            base::Optional<em::SignedData> signed_command_proto,
                             base::TimeTicks issued_time,
-                            const ResultReportedCallback& reported_callback)
+                            ResultReportedCallback reported_callback)
       : command_proto(command_proto),
+        signed_command_proto(signed_command_proto),
         issued_time(issued_time),
-        reported_callback(reported_callback) {}
+        reported_callback(std::move(reported_callback)) {}
+  RemoteCommandWithCallback(RemoteCommandWithCallback&& other) = default;
+  RemoteCommandWithCallback& operator=(RemoteCommandWithCallback&& other) =
+      default;
+
   ~RemoteCommandWithCallback() {}
 
   em::RemoteCommand command_proto;
+  base::Optional<em::SignedData> signed_command_proto;
   base::TimeTicks issued_time;
   ResultReportedCallback reported_callback;
 };
@@ -53,10 +81,9 @@
 void TestingRemoteCommandsServer::IssueCommand(
     em::RemoteCommand_Type type,
     const std::string& payload,
-    const ResultReportedCallback& reported_callback,
+    ResultReportedCallback reported_callback,
     bool skip_next_fetch) {
   DCHECK(thread_checker_.CalledOnValidThread());
-
   base::AutoLock auto_lock(lock_);
 
   em::RemoteCommand command;
@@ -65,18 +92,59 @@
   if (!payload.empty())
     command.set_payload(payload);
 
-  const RemoteCommandWithCallback command_with_callback(
-      command, clock_->NowTicks(), reported_callback);
+  RemoteCommandWithCallback command_with_callback(
+      command, base::nullopt, clock_->NowTicks(), std::move(reported_callback));
   if (skip_next_fetch)
-    commands_issued_after_next_fetch_.push_back(command_with_callback);
+    commands_issued_after_next_fetch_.push_back(
+        std::move(command_with_callback));
   else
-    commands_.push_back(command_with_callback);
+    commands_.push_back(std::move(command_with_callback));
 }
 
-TestingRemoteCommandsServer::RemoteCommands
-TestingRemoteCommandsServer::FetchCommands(
+void TestingRemoteCommandsServer::IssueSignedCommand(
+    ResultReportedCallback reported_callback,
+    em::RemoteCommand* command_in,
+    em::PolicyData* policy_data_in,
+    em::SignedData* signed_data_in) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  base::AutoLock auto_lock(lock_);
+
+  em::RemoteCommand command;
+  em::PolicyData policy_data;
+  em::SignedData signed_data;
+
+  if (command_in) {
+    command = *command_in;
+  } else {
+    command.set_target_device_id("acme-device");
+    command.set_type(em::RemoteCommand_Type_COMMAND_ECHO_TEST);
+    command.set_command_id(++last_generated_unique_id_);
+  }
+
+  if (policy_data_in) {
+    policy_data = *policy_data_in;
+  } else {
+    policy_data.set_policy_type("google/chromeos/remotecommand");
+    EXPECT_TRUE(command.SerializeToString(policy_data.mutable_policy_value()));
+  }
+
+  if (signed_data_in) {
+    signed_data = *signed_data_in;
+  } else {
+    EXPECT_TRUE(policy_data.SerializeToString(signed_data.mutable_data()));
+    signed_data.set_signature(SignDataWithTestKey(signed_data.data()));
+  }
+
+  RemoteCommandWithCallback command_with_callback(
+      command, signed_data, clock_->NowTicks(), std::move(reported_callback));
+  commands_.push_back(std::move(command_with_callback));
+}
+
+void TestingRemoteCommandsServer::FetchCommands(
     std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id,
-    const RemoteCommandResults& previous_job_results) {
+    const RemoteCommandResults& previous_job_results,
+    std::vector<em::RemoteCommand>* fetched_commands,
+    std::vector<em::SignedData>* signed_commands) {
   base::AutoLock auto_lock(lock_);
 
   for (const auto& job_result : previous_job_results) {
@@ -86,6 +154,15 @@
     bool found_command = false;
     ResultReportedCallback reported_callback;
 
+    if (job_result.command_id() == -1) {
+      // The result can have command_id equal to -1 in case a signed command was
+      // rejected at the validation stage before it could be unpacked.
+      CHECK(commands_.size() == 1);
+      found_command = true;
+      reported_callback = std::move(commands_[0].reported_callback);
+      commands_.clear();
+    }
+
     if (last_command_id) {
       // This relies on us generating commands with increasing IDs.
       EXPECT_GE(*last_command_id, job_result.command_id());
@@ -93,7 +170,7 @@
 
     for (auto it = commands_.begin(); it != commands_.end(); ++it) {
       if (it->command_proto.command_id() == job_result.command_id()) {
-        reported_callback = it->reported_callback;
+        reported_callback = std::move(it->reported_callback);
         commands_.erase(it);
         found_command = true;
         break;
@@ -103,35 +180,40 @@
     // Verify that the command result is for an existing command actually
     // expecting a result.
     EXPECT_TRUE(found_command);
-    EXPECT_FALSE(reported_callback.is_null());
 
-    if (reported_callback.is_null()) {
+    if (!reported_callback.is_null()) {
       // Post task to the original thread which will report the result.
       task_runner_->PostTask(
           FROM_HERE,
           base::BindOnce(&TestingRemoteCommandsServer::ReportJobResult,
-                         weak_ptr_to_this_, reported_callback, job_result));
+                         weak_ptr_to_this_, std::move(reported_callback),
+                         job_result));
     }
   }
 
-  RemoteCommands fetched_commands;
   for (const auto& command_with_callback : commands_) {
-    if (!last_command_id ||
-        command_with_callback.command_proto.command_id() > *last_command_id) {
-      fetched_commands.push_back(command_with_callback.command_proto);
+    if (command_with_callback.signed_command_proto) {
+      // Signed commands.
+      signed_commands->push_back(
+          command_with_callback.signed_command_proto.value());
+    } else if (!last_command_id ||
+               command_with_callback.command_proto.command_id() >
+                   *last_command_id) {
+      // Old style, unsigned commands.
+      fetched_commands->push_back(command_with_callback.command_proto);
       // Simulate the age of commands calculation on the server side.
-      fetched_commands.back().set_age_of_command(
+      fetched_commands->back().set_age_of_command(
           (clock_->NowTicks() - command_with_callback.issued_time)
               .InMilliseconds());
     }
   }
 
   // Push delayed commands into the main queue.
-  commands_.insert(commands_.end(), commands_issued_after_next_fetch_.begin(),
-                   commands_issued_after_next_fetch_.end());
+  commands_.insert(
+      commands_.end(),
+      std::make_move_iterator(commands_issued_after_next_fetch_.begin()),
+      std::make_move_iterator(commands_issued_after_next_fetch_.end()));
   commands_issued_after_next_fetch_.clear();
-
-  return fetched_commands;
 }
 
 void TestingRemoteCommandsServer::SetClock(const base::TickClock* clock) {
@@ -145,10 +227,10 @@
 }
 
 void TestingRemoteCommandsServer::ReportJobResult(
-    const ResultReportedCallback& reported_callback,
+    ResultReportedCallback reported_callback,
     const em::RemoteCommandResult& job_result) const {
   DCHECK(thread_checker_.CalledOnValidThread());
-  reported_callback.Run(job_result);
+  std::move(reported_callback).Run(job_result);
 }
 
 }  // namespace policy
diff --git a/components/policy/core/common/remote_commands/testing_remote_commands_server.h b/components/policy/core/common/remote_commands/testing_remote_commands_server.h
index 4950242..ce0bbe3d 100644
--- a/components/policy/core/common/remote_commands/testing_remote_commands_server.h
+++ b/components/policy/core/common/remote_commands/testing_remote_commands_server.h
@@ -27,6 +27,10 @@
 
 namespace policy {
 
+// Callback called when a command's result is reported back to the server.
+using ResultReportedCallback =
+    base::OnceCallback<void(const enterprise_management::RemoteCommandResult&)>;
+
 // This class implements server-side logic for remote commands service tests. It
 // acts just like a queue, and there are mainly two exposed methods for this
 // purpose. Test authors are expected to call IssueCommand() to add commands to
@@ -45,14 +49,9 @@
   TestingRemoteCommandsServer();
   virtual ~TestingRemoteCommandsServer();
 
-  using RemoteCommands = std::vector<enterprise_management::RemoteCommand>;
   using RemoteCommandResults =
       std::vector<enterprise_management::RemoteCommandResult>;
 
-  // Callback called when a command's result is reported back to the server.
-  using ResultReportedCallback =
-      base::Callback<void(const enterprise_management::RemoteCommandResult&)>;
-
   // Create and add a command with |type| as command type and |payload| as
   // command payload if it's not empty. |clock_| will be used to get the
   // command issue time. |reported_callback| will be called from the same
@@ -63,8 +62,12 @@
   // the server and |reported_callback| itself will be called at that time.
   void IssueCommand(enterprise_management::RemoteCommand_Type type,
                     const std::string& payload,
-                    const ResultReportedCallback& reported_callback,
+                    ResultReportedCallback reported_callback,
                     bool skip_next_fetch);
+  void IssueSignedCommand(ResultReportedCallback reported_callback,
+                          enterprise_management::RemoteCommand* command_in,
+                          enterprise_management::PolicyData* policy_data_in,
+                          enterprise_management::SignedData* signed_data_in);
 
   // Fetch commands, acknowledging all commands up to and including
   // |last_command_id|, and provide |previous_job_results| as results for
@@ -74,9 +77,11 @@
   // and client for remote command fetching.
   // Unlike every other methods in the class, this method can be called from
   // any thread.
-  RemoteCommands FetchCommands(
+  void FetchCommands(
       std::unique_ptr<RemoteCommandJob::UniqueIDType> last_command_id,
-      const RemoteCommandResults& previous_job_results);
+      const RemoteCommandResults& previous_job_results,
+      std::vector<enterprise_management::RemoteCommand>* fetched_commands,
+      std::vector<enterprise_management::SignedData>* signed_commands);
 
   // Set alternative clock for obtaining the command issue time. The default
   // clock uses the system clock.
@@ -90,7 +95,7 @@
   struct RemoteCommandWithCallback;
 
   void ReportJobResult(
-      const ResultReportedCallback& reported_callback,
+      ResultReportedCallback reported_callback,
       const enterprise_management::RemoteCommandResult& job_result) const;
 
   // The main command queue.
diff --git a/components/safe_browsing/browser/safe_browsing_network_context.cc b/components/safe_browsing/browser/safe_browsing_network_context.cc
index bafff4a2..d5de6107 100644
--- a/components/safe_browsing/browser/safe_browsing_network_context.cc
+++ b/components/safe_browsing/browser/safe_browsing_network_context.cc
@@ -97,6 +97,7 @@
           network::mojom::URLLoaderFactoryParams::New();
       params->process_id = network::mojom::kBrowserProcessId;
       params->is_corb_enabled = false;
+      params->is_trusted = true;
       GetNetworkContext()->CreateURLLoaderFactory(
           MakeRequest(&url_loader_factory_), std::move(params));
     }
diff --git a/components/storage_monitor/mtp_manager_client_chromeos.cc b/components/storage_monitor/mtp_manager_client_chromeos.cc
index 21ae6e8..844dfe1b 100644
--- a/components/storage_monitor/mtp_manager_client_chromeos.cc
+++ b/components/storage_monitor/mtp_manager_client_chromeos.cc
@@ -16,11 +16,9 @@
 MtpManagerClientChromeOS::MtpManagerClientChromeOS(
     StorageMonitor::Receiver* receiver,
     device::mojom::MtpManager* mtp_manager)
-    : mtp_manager_(mtp_manager), binding_(this), notifications_(receiver) {
-  device::mojom::MtpManagerClientAssociatedPtrInfo client;
-  binding_.Bind(mojo::MakeRequest(&client));
+    : mtp_manager_(mtp_manager), notifications_(receiver) {
   mtp_manager_->EnumerateStoragesAndSetClient(
-      std::move(client),
+      receiver_.BindNewEndpointAndPassRemote(),
       base::BindOnce(&MtpManagerClientChromeOS::OnReceivedStorages,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/components/storage_monitor/mtp_manager_client_chromeos.h b/components/storage_monitor/mtp_manager_client_chromeos.h
index e88ac51..7a1815f 100644
--- a/components/storage_monitor/mtp_manager_client_chromeos.h
+++ b/components/storage_monitor/mtp_manager_client_chromeos.h
@@ -11,7 +11,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "components/storage_monitor/storage_monitor.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 
 namespace base {
@@ -62,7 +62,7 @@
   // manager outlives this object.
   device::mojom::MtpManager* const mtp_manager_;
 
-  mojo::AssociatedBinding<device::mojom::MtpManagerClient> binding_;
+  mojo::AssociatedReceiver<device::mojom::MtpManagerClient> receiver_{this};
 
   // The notifications object to use to signal newly attached devices.
   // Guaranteed to outlive this class.
diff --git a/components/storage_monitor/storage_monitor_chromeos.cc b/components/storage_monitor/storage_monitor_chromeos.cc
index 9ef9b99..729be61 100644
--- a/components/storage_monitor/storage_monitor_chromeos.cc
+++ b/components/storage_monitor/storage_monitor_chromeos.cc
@@ -121,8 +121,8 @@
   if (!mtp_device_manager_) {
     // Set up the connection with mojofied MtpManager.
     DCHECK(GetConnector());
-    GetConnector()->BindInterface(device::mojom::kServiceName,
-                                  mojo::MakeRequest(&mtp_device_manager_));
+    GetConnector()->Connect(device::mojom::kServiceName,
+                            mtp_device_manager_.BindNewPipeAndPassReceiver());
   }
   // |mtp_manager_client_| needs to be initialized for both tests and
   // production code, so keep it out of the if condition.
@@ -237,9 +237,9 @@
 }
 
 void StorageMonitorCros::SetMediaTransferProtocolManagerForTest(
-    device::mojom::MtpManagerPtr test_manager) {
+    mojo::PendingRemote<device::mojom::MtpManager> test_manager) {
   DCHECK(!mtp_device_manager_);
-  mtp_device_manager_ = std::move(test_manager);
+  mtp_device_manager_.Bind(std::move(test_manager));
 }
 
 bool StorageMonitorCros::GetStorageInfoForPath(
diff --git a/components/storage_monitor/storage_monitor_chromeos.h b/components/storage_monitor/storage_monitor_chromeos.h
index 5bdcd970..5cf12ea 100644
--- a/components/storage_monitor/storage_monitor_chromeos.h
+++ b/components/storage_monitor/storage_monitor_chromeos.h
@@ -23,6 +23,8 @@
 #include "build/build_config.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/storage_monitor/storage_monitor.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 
 namespace storage_monitor {
@@ -43,7 +45,7 @@
 
  protected:
   void SetMediaTransferProtocolManagerForTest(
-      device::mojom::MtpManagerPtr test_manager);
+      mojo::PendingRemote<device::mojom::MtpManager> test_manager);
 
   // chromeos::disks::DiskMountManager::Observer implementation.
   void OnBootDeviceDiskEvent(chromeos::disks::DiskMountManager::DiskEvent event,
@@ -86,7 +88,7 @@
   // Mapping of relevant mount points and their corresponding mount devices.
   MountMap mount_map_;
 
-  device::mojom::MtpManagerPtr mtp_device_manager_;
+  mojo::Remote<device::mojom::MtpManager> mtp_device_manager_;
 
   std::unique_ptr<MtpManagerClientChromeOS> mtp_manager_client_;
 
diff --git a/components/storage_monitor/storage_monitor_chromeos_unittest.cc b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
index 40bdd34..a1c784f 100644
--- a/components/storage_monitor/storage_monitor_chromeos_unittest.cc
+++ b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
@@ -26,6 +26,7 @@
 #include "components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h"
 #include "components/storage_monitor/test_storage_monitor.h"
 #include "content/public/test/browser_task_environment.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace storage_monitor {
@@ -71,11 +72,12 @@
   ~TestStorageMonitorCros() override {}
 
   void Init() override {
-    device::mojom::MtpManagerPtr fake_mtp_manager_ptr;
+    mojo::PendingRemote<device::mojom::MtpManager> pending_fake_mtp_manager;
     auto* fake_mtp_manager =
         TestMediaTransferProtocolManagerChromeOS::GetFakeMtpManager();
-    fake_mtp_manager->AddBinding(mojo::MakeRequest(&fake_mtp_manager_ptr));
-    SetMediaTransferProtocolManagerForTest(std::move(fake_mtp_manager_ptr));
+    fake_mtp_manager->AddReceiver(
+        pending_fake_mtp_manager.InitWithNewPipeAndPassReceiver());
+    SetMediaTransferProtocolManagerForTest(std::move(pending_fake_mtp_manager));
 
     StorageMonitorCros::Init();
   }
diff --git a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
index f669570..633ad5f9 100644
--- a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
+++ b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.cc
@@ -28,13 +28,13 @@
 TestMediaTransferProtocolManagerChromeOS::
     ~TestMediaTransferProtocolManagerChromeOS() {}
 
-void TestMediaTransferProtocolManagerChromeOS::AddBinding(
-    device::mojom::MtpManagerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+void TestMediaTransferProtocolManagerChromeOS::AddReceiver(
+    mojo::PendingReceiver<device::mojom::MtpManager> receiver) {
+  receivers_.Add(this, std::move(receiver));
 }
 
 void TestMediaTransferProtocolManagerChromeOS::EnumerateStoragesAndSetClient(
-    device::mojom::MtpManagerClientAssociatedPtrInfo client,
+    mojo::PendingAssociatedRemote<device::mojom::MtpManagerClient> client,
     EnumerateStoragesAndSetClientCallback callback) {
   std::move(callback).Run(std::vector<device::mojom::MtpStorageInfoPtr>());
 }
diff --git a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
index cb72dbf..31d96ea5 100644
--- a/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
+++ b/components/storage_monitor/test_media_transfer_protocol_manager_chromeos.h
@@ -11,7 +11,9 @@
 #include <string>
 
 #include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 
 namespace storage_monitor {
@@ -24,12 +26,12 @@
   TestMediaTransferProtocolManagerChromeOS();
   ~TestMediaTransferProtocolManagerChromeOS() override;
 
-  void AddBinding(device::mojom::MtpManagerRequest request);
+  void AddReceiver(mojo::PendingReceiver<device::mojom::MtpManager> receiver);
 
  private:
   // device::mojom::MtpManager implementation.
   void EnumerateStoragesAndSetClient(
-      device::mojom::MtpManagerClientAssociatedPtrInfo client,
+      mojo::PendingAssociatedRemote<device::mojom::MtpManagerClient> client,
       EnumerateStoragesAndSetClientCallback callback) override;
   void GetStorageInfo(const std::string& storage_name,
                       GetStorageInfoCallback callback) override;
@@ -69,7 +71,7 @@
                     uint32_t object_id,
                     DeleteObjectCallback callback) override;
 
-  mojo::BindingSet<device::mojom::MtpManager> bindings_;
+  mojo::ReceiverSet<device::mojom::MtpManager> receivers_;
 
   DISALLOW_COPY_AND_ASSIGN(TestMediaTransferProtocolManagerChromeOS);
 };
diff --git a/components/storage_monitor/test_storage_monitor.cc b/components/storage_monitor/test_storage_monitor.cc
index 501aeec..d249e30 100644
--- a/components/storage_monitor/test_storage_monitor.cc
+++ b/components/storage_monitor/test_storage_monitor.cc
@@ -22,8 +22,8 @@
 #if defined(OS_CHROMEOS)
   auto* fake_mtp_manager =
       TestMediaTransferProtocolManagerChromeOS::GetFakeMtpManager();
-  fake_mtp_manager->AddBinding(
-      mojo::MakeRequest(&media_transfer_protocol_manager_));
+  fake_mtp_manager->AddReceiver(
+      media_transfer_protocol_manager_.BindNewPipeAndPassReceiver());
 #endif
 }
 
diff --git a/components/storage_monitor/test_storage_monitor.h b/components/storage_monitor/test_storage_monitor.h
index d851e14..c529a11 100644
--- a/components/storage_monitor/test_storage_monitor.h
+++ b/components/storage_monitor/test_storage_monitor.h
@@ -13,6 +13,7 @@
 #include "components/storage_monitor/storage_monitor.h"
 
 #if defined(OS_CHROMEOS)
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 #endif
 
@@ -78,7 +79,7 @@
   std::vector<base::FilePath> removable_paths_;
 
 #if defined(OS_CHROMEOS)
-  device::mojom::MtpManagerPtr media_transfer_protocol_manager_;
+  mojo::Remote<device::mojom::MtpManager> media_transfer_protocol_manager_;
 #endif
 };
 
diff --git a/components/sync/engine/sync_engine_switches.cc b/components/sync/engine/sync_engine_switches.cc
index d5a3c05..c029dc7e 100644
--- a/components/sync/engine/sync_engine_switches.cc
+++ b/components/sync/engine/sync_engine_switches.cc
@@ -25,4 +25,7 @@
 const base::Feature kSyncUseScryptForNewCustomPassphrases{
     "SyncUseScryptForNewCustomPassphrases", base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kSyncSupportTrustedVaultPassphrase{
+    "SyncSupportTrustedVaultPassphrase", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace switches
diff --git a/components/sync/engine/sync_engine_switches.h b/components/sync/engine/sync_engine_switches.h
index 6861251..40dba17 100644
--- a/components/sync/engine/sync_engine_switches.h
+++ b/components/sync/engine/sync_engine_switches.h
@@ -13,6 +13,7 @@
 
 extern const base::Feature kSyncResetPollIntervalOnStart;
 extern const base::Feature kSyncUseScryptForNewCustomPassphrases;
+extern const base::Feature kSyncSupportTrustedVaultPassphrase;
 
 }  // namespace switches
 
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc
index 8fd2f48a..b55794bc 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -263,8 +263,8 @@
       }
       break;
     case NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE:
-      NOTIMPLEMENTED();
-      return false;
+      return base::FeatureList::IsEnabled(
+          switches::kSyncSupportTrustedVaultPassphrase);
   }
   return true;
 }
@@ -290,7 +290,8 @@
       NOTREACHED();
       return false;
     case NigoriSpecifics::KEYSTORE_PASSPHRASE:
-      return new_passphrase_type == NigoriSpecifics::CUSTOM_PASSPHRASE;
+      return new_passphrase_type == NigoriSpecifics::CUSTOM_PASSPHRASE ||
+             new_passphrase_type == NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE;
     case NigoriSpecifics::FROZEN_IMPLICIT_PASSPHRASE:
       // There is no client side code which can cause such transition, but
       // technically it's a valid one and can be implemented in the future.
@@ -509,7 +510,11 @@
   // verifications, taking into account sensitivity of this data.
   base::Optional<sync_pb::NigoriLocalData> deserialized_data =
       storage_->RestoreData();
-  if (!deserialized_data) {
+  if (!deserialized_data ||
+      (deserialized_data->nigori_model().passphrase_type() ==
+           NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE &&
+       !base::FeatureList::IsEnabled(
+           switches::kSyncSupportTrustedVaultPassphrase))) {
     // We either have no Nigori node stored locally or it was corrupted.
     processor_->ModelReadyToSync(this, NigoriMetadataBatch());
     return;
@@ -1054,6 +1059,15 @@
   return cryptographer_;
 }
 
+sync_pb::NigoriSpecifics::PassphraseType
+NigoriSyncBridgeImpl::GetPassphraseTypeForTesting() const {
+  return passphrase_type_;
+}
+
+ModelTypeSet NigoriSyncBridgeImpl::GetEncryptedTypesForTesting() const {
+  return GetEncryptedTypes(encrypt_everything_);
+}
+
 std::string NigoriSyncBridgeImpl::PackExplicitPassphraseKeyForTesting(
     const Encryptor& encryptor,
     const Cryptographer& cryptographer) {
@@ -1108,6 +1122,9 @@
       NOTIMPLEMENTED();
       return;
     case NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE:
+      // This may be problematic for the MIGRATION_DONE case because the local
+      // keybag will be cleared and it won't be automatically recovered from
+      // prefs.
       NOTIMPLEMENTED();
       return;
     case NigoriSpecifics::FROZEN_IMPLICIT_PASSPHRASE:
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.h b/components/sync/nigori/nigori_sync_bridge_impl.h
index 818f8315..a1a986d 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl.h
+++ b/components/sync/nigori/nigori_sync_bridge_impl.h
@@ -82,6 +82,9 @@
   // tests and decide whether this method should be a part of
   // SyncEncryptionHandler interface.
   const Cryptographer& GetCryptographerForTesting() const;
+  sync_pb::NigoriSpecifics::PassphraseType GetPassphraseTypeForTesting() const;
+  ModelTypeSet GetEncryptedTypesForTesting() const;
+
   static std::string PackExplicitPassphraseKeyForTesting(
       const Encryptor& encryptor,
       const Cryptographer& cryptographer);
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
index 5ba95430..1355f403 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -8,8 +8,10 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/sync/base/fake_encryptor.h"
 #include "components/sync/base/time.h"
+#include "components/sync/engine/sync_engine_switches.h"
 #include "components/sync/model/entity_data.h"
 #include "components/sync/nigori/nigori_storage.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -32,8 +34,8 @@
     const std::string& progress_marker_token,
     int64_t entity_metadata_sequence_number);
 
-MATCHER(NotNullTime, "") {
-  return !arg.is_null();
+MATCHER(NullTime, "") {
+  return arg.is_null();
 }
 
 MATCHER_P(HasDefaultKeyDerivedFrom, key_params, "") {
@@ -182,6 +184,20 @@
   return specifics;
 }
 
+sync_pb::NigoriSpecifics BuildTrustedVaultNigoriSpecifics(
+    const std::vector<KeyParams>& trusted_vault_key_params) {
+  syncer::Cryptographer cryptographer;
+  for (const KeyParams& key_params : trusted_vault_key_params) {
+    cryptographer.AddKey(key_params);
+  }
+
+  sync_pb::NigoriSpecifics specifics;
+  EXPECT_TRUE(cryptographer.GetKeys(specifics.mutable_encryption_keybag()));
+  specifics.set_passphrase_type(
+      sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE);
+  return specifics;
+}
+
 // Builds NigoriSpecifics with following fields:
 // 1. encryption_keybag contains keys derived from |passphrase_key_params|
 // and |*old_key_params| (if |old_key_params| isn't nullopt). Encrypted with
@@ -279,6 +295,9 @@
 class NigoriSyncBridgeImplTest : public testing::Test {
  protected:
   NigoriSyncBridgeImplTest() {
+    override_features_.InitAndEnableFeature(
+        switches::kSyncSupportTrustedVaultPassphrase);
+
     auto processor =
         std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
     processor_ = processor.get();
@@ -299,6 +318,7 @@
   MockNigoriStorage* storage() { return storage_; }
 
  private:
+  base::test::ScopedFeatureList override_features_;
   const FakeEncryptor encryptor_;
   std::unique_ptr<NigoriSyncBridgeImpl> bridge_;
   // Ownership transferred to |bridge_|.
@@ -481,7 +501,7 @@
   EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
   EXPECT_CALL(*observer(),
               OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
-                                      NotNullTime()));
+                                      Not(NullTime())));
   EXPECT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
               Eq(base::nullopt));
   EXPECT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
@@ -513,7 +533,7 @@
   EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
   EXPECT_CALL(*observer(),
               OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
-                                      NotNullTime()));
+                                      Not(NullTime())));
   EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
               Eq(base::nullopt));
   EXPECT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
@@ -618,7 +638,7 @@
   EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
   EXPECT_CALL(*observer(),
               OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
-                                      /*passphrase_time=*/NotNullTime()));
+                                      /*passphrase_time=*/Not(NullTime())));
   EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(Ne(std::string()),
                                                    PASSPHRASE_BOOTSTRAP_TOKEN));
   EXPECT_CALL(*processor(), Put(HasCustomPassphraseNigori()));
@@ -742,6 +762,166 @@
   EXPECT_THAT(cryptographer, HasDefaultKeyDerivedFrom(kKeystoreKeyParams));
 }
 
+// Tests the initial sync with a trusted vault Nigori. Observers should be
+// notified about encryption state changes and cryptographer shouldn't be ready
+// (by having pending keys) until the passphrase is received by means other than
+// the sync protocol.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldRequireUserActionIfInitiallyUsingTrustedVault) {
+  const std::string kTrustedVaultPassphrase = "trusted_vault_passphrase";
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {Pbkdf2KeyParams(kTrustedVaultPassphrase)});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({"keystore_key"}));
+
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(),
+              OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase,
+                                      NullTime()));
+  EXPECT_CALL(*observer(), OnPassphraseRequired(/*reason=*/REASON_DECRYPTION,
+                                                /*key_derivation_params=*/_,
+                                                /*pending_keys=*/_));
+  EXPECT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  EXPECT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  EXPECT_THAT(bridge()->GetEncryptedTypesForTesting(),
+              Eq(SyncEncryptionHandler::SensitiveTypes()));
+  EXPECT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
+
+  EXPECT_CALL(*observer(), OnPassphraseAccepted());
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(_, _)).Times(0);
+  bridge()->SetDecryptionPassphrase(kTrustedVaultPassphrase);
+  EXPECT_FALSE(bridge()->GetCryptographerForTesting().has_pending_keys());
+}
+
+// Tests the processing of a remote incremental update that transitions from
+// keystore to trusted vault passphrase, which requires receiving the new
+// passphrase by means other than the sync protocol.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldProcessRemoteTransitionFromKeystoreToTrustedVault) {
+  const std::string kTrustedVaultPassphrase = "trusted_vault_passphrase";
+
+  EntityData default_entity_data;
+  *default_entity_data.specifics.mutable_nigori() =
+      sync_pb::NigoriSpecifics::default_instance();
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({"keystore_key"}));
+  // Note: passing default Nigori to MergeSyncData() leads to instantiation of
+  // keystore Nigori.
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(default_entity_data)),
+              Eq(base::nullopt));
+
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() =
+      BuildTrustedVaultNigoriSpecifics(
+          {Pbkdf2KeyParams(kTrustedVaultPassphrase)});
+
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(),
+              OnPassphraseTypeChanged(PassphraseType::kTrustedVaultPassphrase,
+                                      NullTime()));
+  EXPECT_CALL(*observer(), OnPassphraseRequired(/*reason=*/REASON_DECRYPTION,
+                                                /*key_derivation_params=*/_,
+                                                /*pending_keys=*/_));
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+  EXPECT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  EXPECT_THAT(bridge()->GetEncryptedTypesForTesting(),
+              Eq(SyncEncryptionHandler::SensitiveTypes()));
+  EXPECT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
+
+  EXPECT_CALL(*observer(), OnPassphraseAccepted());
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(_, _)).Times(0);
+  bridge()->SetDecryptionPassphrase(kTrustedVaultPassphrase);
+  EXPECT_FALSE(bridge()->GetCryptographerForTesting().has_pending_keys());
+}
+
+// Tests the processing of a remote incremental update that rotates the trusted
+// vault passphrase.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldProcessRemoteKeyRotationForTrustedVault) {
+  const std::string kTrustedVaultPassphrase = "trusted_vault_passphrase";
+  const std::string kRotatedTrustedVaultPassphrase = "rotated_vault_passphrase";
+
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {Pbkdf2KeyParams(kTrustedVaultPassphrase)});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({"keystore_key"}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
+  bridge()->SetDecryptionPassphrase(kTrustedVaultPassphrase);
+  ASSERT_FALSE(bridge()->GetCryptographerForTesting().has_pending_keys());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  // Mimic remote key rotation.
+  EntityData new_entity_data;
+  *new_entity_data.specifics.mutable_nigori() =
+      BuildTrustedVaultNigoriSpecifics(
+          {Pbkdf2KeyParams(kTrustedVaultPassphrase),
+           Pbkdf2KeyParams(kRotatedTrustedVaultPassphrase)});
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnPassphraseTypeChanged(_, _)).Times(0);
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(), OnPassphraseRequired(/*reason=*/REASON_DECRYPTION,
+                                                /*key_derivation_params=*/_,
+                                                /*pending_keys=*/_));
+
+  EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)),
+              Eq(base::nullopt));
+  EXPECT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
+
+  EXPECT_CALL(*observer(), OnPassphraseAccepted());
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  bridge()->SetDecryptionPassphrase(kRotatedTrustedVaultPassphrase);
+  EXPECT_FALSE(bridge()->GetCryptographerForTesting().has_pending_keys());
+}
+
+// Tests transitioning locally from trusted vault passphrase to custom
+// passphrase.
+TEST_F(NigoriSyncBridgeImplTest,
+       ShouldTransitionLocallyFromTrustedVaultToCustomPassphrase) {
+  const std::string kTrustedVaultPassphrase = "trusted_vault_passphrase";
+  const std::string kCustomPassphrase = "custom_passphrase";
+
+  EntityData entity_data;
+  *entity_data.specifics.mutable_nigori() = BuildTrustedVaultNigoriSpecifics(
+      {Pbkdf2KeyParams(kTrustedVaultPassphrase)});
+
+  ASSERT_TRUE(bridge()->SetKeystoreKeys({"keystore_key"}));
+  ASSERT_THAT(bridge()->MergeSyncData(std::move(entity_data)),
+              Eq(base::nullopt));
+  ASSERT_TRUE(bridge()->GetCryptographerForTesting().has_pending_keys());
+  bridge()->SetDecryptionPassphrase(kTrustedVaultPassphrase);
+  ASSERT_FALSE(bridge()->GetCryptographerForTesting().has_pending_keys());
+  ASSERT_THAT(bridge()->GetPassphraseTypeForTesting(),
+              Eq(sync_pb::NigoriSpecifics::TRUSTED_VAULT_PASSPHRASE));
+  ASSERT_THAT(bridge()->GetData(), Not(HasCustomPassphraseNigori()));
+
+  EXPECT_CALL(*observer(), OnPassphraseAccepted());
+  EXPECT_CALL(*observer(), OnEncryptedTypesChanged(
+                               /*encrypted_types=*/EncryptableUserTypes(),
+                               /*encrypt_everything=*/true));
+  EXPECT_CALL(*observer(), OnCryptographerStateChanged(NotNull()));
+  EXPECT_CALL(*observer(),
+              OnPassphraseTypeChanged(PassphraseType::kCustomPassphrase,
+                                      /*passphrase_time=*/Not(NullTime())));
+  EXPECT_CALL(*observer(), OnBootstrapTokenUpdated(Ne(std::string()),
+                                                   PASSPHRASE_BOOTSTRAP_TOKEN));
+  EXPECT_CALL(*processor(), Put(HasCustomPassphraseNigori()));
+  bridge()->SetEncryptionPassphrase(kCustomPassphrase);
+  EXPECT_THAT(bridge()->GetData(), HasCustomPassphraseNigori());
+}
+
 }  // namespace
 
 }  // namespace syncer
diff --git a/components/sync/protocol/device_info_specifics.proto b/components/sync/protocol/device_info_specifics.proto
index 7875ce8a..b77163df3 100644
--- a/components/sync/protocol/device_info_specifics.proto
+++ b/components/sync/protocol/device_info_specifics.proto
@@ -56,6 +56,9 @@
   // can not be derived from the other fields in the proto and are not general
   // enough to be used by another feature.
   optional FeatureSpecificFields feature_fields = 9;
+
+  // Device specific information for Sharing feature.
+  optional SharingSpecificFields sharing_fields = 10;
 }
 
 // Feature specific information about the device that is running a sync-enabled
@@ -68,3 +71,26 @@
   // feature
   optional bool send_tab_to_self_receiving_enabled = 1;
 }
+
+// Device specific information for Sharing feature. Used to send end-to-end
+// encrypted message through FCM to other devices.
+message SharingSpecificFields {
+  // FCM registration token of device for sending SharingMessage.
+  optional string fcm_token = 1;
+
+  // Subscription public key required for message encryption [RFC8291].
+  optional bytes p256dh = 2;
+
+  // Auth secret key required for message encryption [RFC8291].
+  optional bytes auth_secret = 3;
+
+  // Enum defining available Sharing features.
+  enum EnabledFeatures {
+    UNKNOWN = 0;
+    CLICK_TO_CALL = 1;
+    SHARED_CLIPBOARD = 2;
+  }
+
+  // A list of enabled Sharing features.
+  repeated EnabledFeatures enabled_features = 4;
+}
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index c195c6d..1dfb64f 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -340,12 +340,20 @@
   VISIT(signin_scoped_device_id);
   VISIT(last_updated_timestamp);
   VISIT(feature_fields);
+  VISIT(sharing_fields);
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::FeatureSpecificFields& proto) {
   VISIT(send_tab_to_self_receiving_enabled);
 }
 
+VISIT_PROTO_FIELDS(const sync_pb::SharingSpecificFields& proto) {
+  VISIT(fcm_token);
+  VISIT_BYTES(p256dh);
+  VISIT_BYTES(auth_secret);
+  VISIT_REP(enabled_features);
+}
+
 VISIT_PROTO_FIELDS(const sync_pb::DictionarySpecifics& proto) {
   VISIT(word);
 }
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index bbf0eb2..5f77bc1 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1667,9 +1667,7 @@
   RunHtmlTest(FILE_PATH_LITERAL("label.html"));
 }
 
-// TODO(http://crubg/1000965): flaky.
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
-                       DISABLED_AccessibilityLabelUpdates) {
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityLabelUpdates) {
   RunHtmlTest(FILE_PATH_LITERAL("label-updates.html"));
 }
 
diff --git a/content/browser/frame_host/back_forward_cache.cc b/content/browser/frame_host/back_forward_cache.cc
index b83baae..3d67b7cc 100644
--- a/content/browser/frame_host/back_forward_cache.cc
+++ b/content/browser/frame_host/back_forward_cache.cc
@@ -177,12 +177,14 @@
   size_t size_limit = cache_size_limit_for_testing_
                           ? cache_size_limit_for_testing_
                           : kBackForwardCacheLimit;
-
-  // Remove the last recently used document if the BackForwardCache list is
+  // Evict the least recently used documents if the BackForwardCache list is
   // full.
-  if (render_frame_hosts_.size() > size_limit) {
-    // TODO(arthursonzogni): Handle RenderFrame deletion appropriately.
-    render_frame_hosts_.pop_back();
+  size_t available_count = 0;
+  for (auto& frame_host : render_frame_hosts_) {
+    if (frame_host->is_evicted_from_back_forward_cache())
+      continue;
+    if (++available_count > size_limit)
+      frame_host->EvictFromBackForwardCache();
   }
 }
 
@@ -228,9 +230,9 @@
   render_frame_hosts_.clear();
 }
 
-void BackForwardCache::PostTaskToFlushEvictedFrames() {
+void BackForwardCache::PostTaskToDestroyEvictedFrames() {
   base::PostTask(FROM_HERE, {BrowserThread::UI},
-                 base::BindOnce(&BackForwardCache::FlushEvictedFrames,
+                 base::BindOnce(&BackForwardCache::DestroyEvictedFrames,
                                 weak_factory_.GetWeakPtr()));
 }
 
@@ -260,7 +262,7 @@
   return (*matching_rfh).get();
 }
 
-void BackForwardCache::FlushEvictedFrames() {
+void BackForwardCache::DestroyEvictedFrames() {
   if (render_frame_hosts_.empty())
     return;
   render_frame_hosts_.erase(
diff --git a/content/browser/frame_host/back_forward_cache.h b/content/browser/frame_host/back_forward_cache.h
index d7f9f718..a23765df 100644
--- a/content/browser/frame_host/back_forward_cache.h
+++ b/content/browser/frame_host/back_forward_cache.h
@@ -63,7 +63,7 @@
 
   // Posts a task to destroy all frames in the BackForwardCache that have been
   // marked as evicted.
-  void PostTaskToFlushEvictedFrames();
+  void PostTaskToDestroyEvictedFrames();
 
   // List of reasons the BackForwardCache was disabled for a specific test. If a
   // test needs to be disabled for a reason not covered below, please add to
@@ -126,7 +126,7 @@
 
  private:
   // Destroys all evicted frames in the BackForwardCache.
-  void FlushEvictedFrames();
+  void DestroyEvictedFrames();
 
   // Contains the set of stored RenderFrameHost.
   // Invariant:
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 8a4eb96..bc1c1d9 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1272,6 +1272,11 @@
   response_head_ = response_head;
   ssl_info_ = response_head->head.ssl_info;
   auth_challenge_info_ = response_head->head.auth_challenge_info;
+
+  // Reset the page state as it can no longer be used at commit time since the
+  // navigation was redirected.
+  commit_params_->page_state = PageState();
+
 #if defined(OS_ANDROID)
   base::WeakPtr<NavigationRequest> this_ptr(weak_factory_.GetWeakPtr());
 
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 4ed6e4135..5c6f6ae 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -3486,7 +3486,7 @@
   // immediately, but destruction is delayed, so that callers don't have to
   // worry about use-after-free of |this|.
   top_document->is_evicted_from_back_forward_cache_ = true;
-  controller->back_forward_cache().PostTaskToFlushEvictedFrames();
+  controller->back_forward_cache().PostTaskToDestroyEvictedFrames();
 
   if (!is_navigation_to_evicted_frame_in_flight)
     return;
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 64a16f4..d18cfd28 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2975,7 +2975,6 @@
     switches::kEnableUseZoomForDSF,
     switches::kEnableViewport,
     switches::kEnableVtune,
-    switches::kEnableWebBluetoothScanning,
     switches::kEnableWebGL2ComputeContext,
     switches::kEnableWebGLDraftExtensions,
     switches::kEnableWebGLImageChromium,
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 982a177..d7faf3a 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -125,9 +125,6 @@
     WebRuntimeFeatures::EnableAutomationControlled(true);
   }
 
-  if (command_line.HasSwitch(switches::kEnableWebBluetoothScanning))
-    WebRuntimeFeatures::EnableWebBluetoothScanning(true);
-
 #if defined(OS_MACOSX)
   const bool enable_canvas_2d_image_chromium =
       command_line.HasSwitch(
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentApiHelperForM.java b/content/public/android/java/src/org/chromium/content/browser/ContentApiHelperForM.java
index 4ecbdc9..14e1cc5 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentApiHelperForM.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentApiHelperForM.java
@@ -9,7 +9,7 @@
 import android.view.ActionMode;
 import android.view.View;
 
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnM;
 import org.chromium.content.browser.selection.FloatingActionModeCallback;
 import org.chromium.content.browser.selection.SelectionPopupControllerImpl;
 
@@ -19,7 +19,7 @@
  * encountering the new APIs.
  */
 
-@DoNotInline
+@VerifiesOnM
 @TargetApi(Build.VERSION_CODES.M)
 public final class ContentApiHelperForM {
     private ContentApiHelperForM() {}
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/AdditionalMenuItemProviderImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/AdditionalMenuItemProviderImpl.java
index 0540f071..a0d2dc58 100644
--- a/content/public/android/java/src/org/chromium/content/browser/selection/AdditionalMenuItemProviderImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/selection/AdditionalMenuItemProviderImpl.java
@@ -4,10 +4,11 @@
 
 package org.chromium.content.browser.selection;
 
-import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.app.RemoteAction;
 import android.content.Context;
+import android.os.Build;
 import android.text.TextUtils;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -16,7 +17,7 @@
 import android.view.textclassifier.TextClassification;
 
 import org.chromium.base.Log;
-import org.chromium.base.annotations.DoNotInline;
+import org.chromium.base.annotations.VerifiesOnP;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -27,8 +28,8 @@
  * We prevent inlinings since this uses a number of new Android APIs which would create verification
  * errors (on older Android versions) which would require a slow re-verification at runtime.
  */
-@DoNotInline
-@SuppressLint("NewApi")
+@VerifiesOnP
+@TargetApi(Build.VERSION_CODES.P)
 public class AdditionalMenuItemProviderImpl implements AdditionalMenuItemProvider {
     private static final String TAG = "MenuItemProvider";
     // We want the secondary assist actions to come after the default actions but before the text
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 2eb185b..c38cb3c 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -243,6 +243,7 @@
   IPC_STRUCT_TRAITS_MEMBER(css_hex_alpha_color_enabled)
   IPC_STRUCT_TRAITS_MEMBER(scroll_top_left_interop_enabled)
   IPC_STRUCT_TRAITS_MEMBER(disable_features_depending_on_viz)
+  IPC_STRUCT_TRAITS_MEMBER(disable_accelerated_small_canvases)
 #endif  // defined(OS_ANDROID)
   IPC_STRUCT_TRAITS_MEMBER(force_dark_mode_enabled)
   IPC_STRUCT_TRAITS_MEMBER(default_minimum_page_scale_factor)
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 3dddb75..8ceaba3 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -109,11 +109,6 @@
 // features.
 const char kDisableBlinkFeatures[]          = "disable-blink-features";
 
-// Enable Web Bluetooth Scanning
-// This switch enables Web Bluetooth Scanning without any
-// permission prompt for testing.
-const char kEnableWebBluetoothScanning[] = "enable-web-bluetooth-scanning";
-
 // Disables HTML5 DB support.
 const char kDisableDatabases[]              = "disable-databases";
 
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 29afab2..c8d5c24 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -142,7 +142,6 @@
 CONTENT_EXPORT extern const char kEnableViewport[];
 CONTENT_EXPORT extern const char kEnableVtune[];
 CONTENT_EXPORT extern const char kEnableWebAuthTestingAPI[];
-CONTENT_EXPORT extern const char kEnableWebBluetoothScanning[];
 CONTENT_EXPORT extern const char kEnableWebGL2ComputeContext[];
 CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
 CONTENT_EXPORT extern const char kEnableWebGLImageChromium[];
diff --git a/content/public/common/web_preferences.cc b/content/public/common/web_preferences.cc
index 114b0f7..8c04e3b 100644
--- a/content/public/common/web_preferences.cc
+++ b/content/public/common/web_preferences.cc
@@ -208,6 +208,7 @@
       css_hex_alpha_color_enabled(true),
       scroll_top_left_interop_enabled(true),
       disable_features_depending_on_viz(false),
+      disable_accelerated_small_canvases(false),
 #endif  // defined(OS_ANDROID)
 #if defined(OS_ANDROID)
       default_minimum_page_scale_factor(0.25f),
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h
index e47b250..7079cc86 100644
--- a/content/public/common/web_preferences.h
+++ b/content/public/common/web_preferences.h
@@ -282,6 +282,8 @@
   // architecture of surface embedding. Android WebView does not support this
   // architecture yet.
   bool disable_features_depending_on_viz;
+  // Don't accelerate small canvases to avoid crashes TODO(crbug.com/1004304)
+  bool disable_accelerated_small_canvases;
 #endif  // defined(OS_ANDROID)
 
   // Enable forcibly modifying content rendering to result in a light on dark
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 4f428a5..3fc14fbf 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -452,6 +452,7 @@
     "//third_party/webrtc/api:callfactory_api",
     "//third_party/webrtc/api:libjingle_logging_api",
     "//third_party/webrtc/api:libjingle_peerconnection_api",
+    "//third_party/webrtc/api:media_stream_interface",
     "//third_party/webrtc/api:packet_socket_factory",
     "//third_party/webrtc/api:rtc_error",
     "//third_party/webrtc/api:rtc_stats_api",
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index f14d1f7..6e9a34c 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -867,6 +867,8 @@
       prefs.scroll_top_left_interop_enabled);
   WebRuntimeFeatures::EnableSurfaceEmbeddingFeatures(
       !prefs.disable_features_depending_on_viz);
+  WebRuntimeFeatures::EnableAcceleratedSmallCanvases(
+      !prefs.disable_accelerated_small_canvases);
 #endif  // defined(OS_ANDROID)
 
   settings->SetForceDarkModeEnabled(prefs.force_dark_mode_enabled);
diff --git a/content/test/content_test_launcher.cc b/content/test/content_test_launcher.cc
index 37aec6f6..7fd5bcb2 100644
--- a/content/test/content_test_launcher.cc
+++ b/content/test/content_test_launcher.cc
@@ -39,9 +39,10 @@
 
  protected:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals. (Must run
-    // before the base class is initialized.)
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
 
     ContentTestSuiteBase::Initialize();
 
diff --git a/content/test/data/accessibility/html/label-updates-expected-blink.txt b/content/test/data/accessibility/html/label-updates-expected-blink.txt
index 036e26eb..7f9ea7c 100644
--- a/content/test/data/accessibility/html/label-updates-expected-blink.txt
+++ b/content/test/data/accessibility/html/label-updates-expected-blink.txt
@@ -6,7 +6,15 @@
 ++++++genericContainer ignored invisible
 ++++++++genericContainer ignored invisible
 ++++++++++staticText ignored invisible name='oranges'
+++++textField name='oranges'
+++++++genericContainer
+++++labelText ignored invisible
+++++++genericContainer ignored invisible
+++++++++genericContainer ignored invisible
+++++++++++staticText ignored invisible name='oranges'
 ++++textField name='bananas'
 ++++++genericContainer
 ++++labelText ignored invisible
 ++++++staticText ignored invisible name='bananas'
+++++textField name='finished'
+++++++genericContainer
diff --git a/content/test/data/accessibility/html/label-updates.html b/content/test/data/accessibility/html/label-updates.html
index 4cce4ff..75b25c2 100644
--- a/content/test/data/accessibility/html/label-updates.html
+++ b/content/test/data/accessibility/html/label-updates.html
@@ -1,5 +1,5 @@
 <!--
-@WAIT-FOR:bananas
+@WAIT-FOR:finished
 @BLINK-DENY:nameFrom*
 -->
 <!DOCTYPE html>
@@ -9,18 +9,29 @@
   <label id="label1" aria-hidden="true" for="input1"><span><span>apples</span></span></label>
 
   <input id="input2">
-  <label id="label2" aria-hidden="true" for="input2">grapes</label>
+  <label id="label2" aria-hidden="true" for="input2"><span><span>apples</span></span></label>
+
+  <input id="input3">
+  <label id="label3" aria-hidden="true" for="input3">grapes</label>
+
+  <input id="input4">
 </div>
 
 <script>
   setTimeout(() => {
     const label1 = document.getElementById('label1');
     label1.firstElementChild.firstElementChild.innerText = 'oranges';
-
     const label2 = document.getElementById('label2');
-    const text2 = label2.firstChild;
-    text2.deleteData(0,5);  // Delete 'grape'
-    text2.insertData(0,'banana');  // Text should now be 'bananas'
+    label2.firstElementChild.firstElementChild.innerText = 'oranges';
+
+    const label3 = document.getElementById('label3');
+    const text3 = label3.firstChild;
+    text3.deleteData(0,5);  // Delete 'grape'
+    text3.insertData(0,'banana');  // Text should now be 'bananas'
+    setTimeout(() => {
+      const input4 = document.getElementById('input4');
+      input4.setAttribute('aria-label', 'finished');
+    }, 0);
   }, 100);
 </script>
 </body>
diff --git a/device/vr/oculus/oculus_render_loop.cc b/device/vr/oculus/oculus_render_loop.cc
index 1244924..444b8dd 100644
--- a/device/vr/oculus/oculus_render_loop.cc
+++ b/device/vr/oculus/oculus_render_loop.cc
@@ -368,7 +368,7 @@
   // The absence of "touchpad" in this string indicates that the slots in the
   // button and axes arrays are placeholders required by the xr-standard mapping
   // but not actually updated with any input.
-  desc->profiles.push_back("grip-thumbstick-controller");
+  desc->profiles.push_back("generic-trigger-grip-thumbstick");
 
   state->description = std::move(desc);
 
diff --git a/device/vr/openvr/openvr_gamepad_helper.cc b/device/vr/openvr/openvr_gamepad_helper.cc
index 7f7c66828..1415998 100644
--- a/device/vr/openvr/openvr_gamepad_helper.cc
+++ b/device/vr/openvr/openvr_gamepad_helper.cc
@@ -351,18 +351,18 @@
     profiles_.push_back(name);
 
     // Also record information about what this controller actually does in a
-    // more general sense.
-    std::string capabilities = "";
+    // more general sense. The controller is guaranteed to at least have a
+    // trigger if we get here.
+    std::string capabilities = "generic-trigger";
     if (HasSecondaryButton()) {
-      capabilities += "grip-";
+      capabilities += "-grip";
     }
     if (HasTouchpad()) {
-      capabilities += "touchpad-";
+      capabilities += "-touchpad";
     }
     if (HasThumbstick()) {
-      capabilities += "thumbstick-";
+      capabilities += "-thumbstick";
     }
-    capabilities += "controller";
     profiles_.push_back(capabilities);
   }
 
diff --git a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
index 688c02cd..efcbffa 100644
--- a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
+++ b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
@@ -575,7 +575,7 @@
     // This makes it clear that the controller actually has a grip button and
     // touchpad and thumbstick input. Otherwise, it's ambiguous whether slots
     // like the touchpad buttons + axes are hooked up vs just placeholders.
-    description->profiles.push_back("grip-touchpad-thumbstick-controller");
+    description->profiles.push_back("generic-trigger-grip-touchpad-thumbstick");
 
     source_state->gamepad = GetWebXRGamepad(input_state);
   } else {
diff --git a/extensions/common/permissions/api_permission.cc b/extensions/common/permissions/api_permission.cc
index 47d791a..09fd8bd 100644
--- a/extensions/common/permissions/api_permission.cc
+++ b/extensions/common/permissions/api_permission.cc
@@ -104,11 +104,10 @@
 //
 
 APIPermissionInfo::APIPermissionInfo(const APIPermissionInfo::InitInfo& info)
-    : id_(info.id),
-      name_(info.name),
+    : name_(info.name),
+      id_(info.id),
       flags_(info.flags),
-      api_permission_constructor_(info.constructor) {
-}
+      api_permission_constructor_(info.constructor) {}
 
 APIPermissionInfo::~APIPermissionInfo() { }
 
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h
index f3ddb903..6b87c87 100644
--- a/extensions/common/permissions/api_permission.h
+++ b/extensions/common/permissions/api_permission.h
@@ -446,8 +446,8 @@
 
   explicit APIPermissionInfo(const InitInfo& info);
 
-  const APIPermission::ID id_;
   const char* const name_;
+  const APIPermission::ID id_;
   const int flags_;
   const APIPermissionConstructor api_permission_constructor_;
 };
diff --git a/extensions/shell/test/shell_test_launcher_delegate.cc b/extensions/shell/test/shell_test_launcher_delegate.cc
index 2f680e4a..d0a9430e 100644
--- a/extensions/shell/test/shell_test_launcher_delegate.cc
+++ b/extensions/shell/test/shell_test_launcher_delegate.cc
@@ -13,8 +13,10 @@
 
 int AppShellTestLauncherDelegate::RunTestSuite(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
-  // Browser tests are expected not to tear-down various globals.
+  // Browser tests are expected not to tear-down various globals and may
+  // complete with the thread priority being above NORMAL.
   test_suite.DisableCheckForLeakedGlobals();
+  test_suite.DisableCheckForThreadPriorityAtTestEnd();
   return test_suite.Run();
 }
 
diff --git a/fuchsia/engine/test/web_engine_test_launcher.cc b/fuchsia/engine/test/web_engine_test_launcher.cc
index d989d0a..9789ec4 100644
--- a/fuchsia/engine/test/web_engine_test_launcher.cc
+++ b/fuchsia/engine/test/web_engine_test_launcher.cc
@@ -25,8 +25,10 @@
   // content::TestLauncherDelegate implementation:
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/gpu/command_buffer/service/shared_image_video.cc b/gpu/command_buffer/service/shared_image_video.cc
index 83b9739..18d3848 100644
--- a/gpu/command_buffer/service/shared_image_video.cc
+++ b/gpu/command_buffer/service/shared_image_video.cc
@@ -500,8 +500,9 @@
   auto gl_representation =
       std::make_unique<SharedImageRepresentationGLTextureVideo>(
           manager, this, tracker, texture);
-  return SharedImageRepresentationSkiaGL::Create(
-      std::move(gl_representation), nullptr, manager, this, tracker);
+  return SharedImageRepresentationSkiaGL::Create(std::move(gl_representation),
+                                                 std::move(context_state),
+                                                 manager, this, tracker);
 }
 
 void SharedImageVideo::BeginGLReadAccess() {
diff --git a/headless/test/headless_test_launcher.cc b/headless/test/headless_test_launcher.cc
index 6d8ee1c..d0b1430 100644
--- a/headless/test/headless_test_launcher.cc
+++ b/headless/test/headless_test_launcher.cc
@@ -41,8 +41,10 @@
   // content::TestLauncherDelegate implementation:
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index 8ad05ab..422ab62 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -810,9 +810,9 @@
 builder_mixins {
   name: "xcode-caches"
   caches: {
-    # Cache for Xcode 11 (build version 11a419c) needed for iOS builds.
-    name: "xcode_ios_11a419c"
-    path: "xcode_ios_11a419c.app"
+    # Cache for Xcode 11 (build version 11a420a) needed for iOS builds.
+    name: "xcode_ios_11a420a"
+    path: "xcode_ios_11a420a.app"
   }
 }
 
diff --git a/ios/build/bots/chromium.clang/ToTiOS.json b/ios/build/bots/chromium.clang/ToTiOS.json
index 59457819..c26b2f37 100644
--- a/ios/build/bots/chromium.clang/ToTiOS.json
+++ b/ios/build/bots/chromium.clang/ToTiOS.json
@@ -2,7 +2,7 @@
   "comments": [
     "Clang tip-of-tree builder for iOS."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "ios_enable_code_signing=false",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.clang/ToTiOSDevice.json b/ios/build/bots/chromium.clang/ToTiOSDevice.json
index 2b73f84..3e4a1030 100644
--- a/ios/build/bots/chromium.clang/ToTiOSDevice.json
+++ b/ios/build/bots/chromium.clang/ToTiOSDevice.json
@@ -2,7 +2,7 @@
   "comments": [
     "Clang tip-of-tree builder for iOS device."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "is_debug=false",
     "llvm_force_head_revision=true",
diff --git a/ios/build/bots/chromium.fyi/ios-device-goma-canary-clobber.json b/ios/build/bots/chromium.fyi/ios-device-goma-canary-clobber.json
index f924ec4f..bd9af1f 100644
--- a/ios/build/bots/chromium.fyi/ios-device-goma-canary-clobber.json
+++ b/ios/build/bots/chromium.fyi/ios-device-goma-canary-clobber.json
@@ -3,7 +3,7 @@
     "Goma canary builder for iOS.",
     "It is chromium.mac/ios-device.json + use_goma_canary, clobber."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.fyi/ios-device-goma-latest-clobber.json b/ios/build/bots/chromium.fyi/ios-device-goma-latest-clobber.json
index ea69174..16207a1 100644
--- a/ios/build/bots/chromium.fyi/ios-device-goma-latest-clobber.json
+++ b/ios/build/bots/chromium.fyi/ios-device-goma-latest-clobber.json
@@ -3,7 +3,7 @@
     "Goma latest builder for iOS.",
     "It is chromium.mac/ios-device.json + use_goma_canary, clobber."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.fyi/ios-device-goma-rbe-canary-clobber.json b/ios/build/bots/chromium.fyi/ios-device-goma-rbe-canary-clobber.json
index d29cbcd2..1b1f8b49 100644
--- a/ios/build/bots/chromium.fyi/ios-device-goma-rbe-canary-clobber.json
+++ b/ios/build/bots/chromium.fyi/ios-device-goma-rbe-canary-clobber.json
@@ -3,7 +3,7 @@
     "Goma RBE canary builder for iOS.",
     "It is chromium.mac/ios-device.json + use_goma_canary, clobber."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.fyi/ios-device-goma-rbe-latest-clobber.json b/ios/build/bots/chromium.fyi/ios-device-goma-rbe-latest-clobber.json
index a983ec6..dda29157 100644
--- a/ios/build/bots/chromium.fyi/ios-device-goma-rbe-latest-clobber.json
+++ b/ios/build/bots/chromium.fyi/ios-device-goma-rbe-latest-clobber.json
@@ -3,7 +3,7 @@
     "Goma RBE latest builder for iOS.",
     "It is chromium.mac/ios-device.json + use_goma_canary, clobber."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
index 4c0fa28e..cdca8e66 100644
--- a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
+++ b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
@@ -3,7 +3,7 @@
     "Cronet tests 64-bit iOS 12 and 13 simulators.",
     "Tests run on iPhone X."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "additional_target_cpus=[\"x86\"]",
     "disable_brotli_filter=false",
diff --git a/ios/build/bots/chromium.fyi/ios-simulator.json b/ios/build/bots/chromium.fyi/ios-simulator.json
index 953bc3a..21be940f 100644
--- a/ios/build/bots/chromium.fyi/ios-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios-simulator.json
@@ -2,7 +2,7 @@
   "comments": [
     "Runs tests on FYI on the latest simulators."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
index 11c021e1..2a2be9a0 100644
--- a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
@@ -3,7 +3,7 @@
     "Run tests on iOS12beta track on 64-bit iOS 12 simulators.",
     "Note: Xcode 11 requires OSX 10.14.3 hence 'host os'"
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
index 97b53419..a1a73c94 100644
--- a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
@@ -3,7 +3,7 @@
     "Run tests on iOS13beta track on 64-bit iOS 13 simulators.",
     "Note: Xcode 11 requires OSX 10.14.4 and up"
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
@@ -22,7 +22,7 @@
       "include": "eg2_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -36,7 +36,7 @@
       "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -50,7 +50,7 @@
       "include": "eg2_tests.json",
       "device type": "iPhone X",
       "os": "12.2",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -64,7 +64,7 @@
       "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "12.2",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -77,7 +77,7 @@
       "include": "common_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -90,7 +90,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -103,7 +103,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPad Pro (12.9-inch)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -116,7 +116,7 @@
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -129,7 +129,7 @@
       "include": "eg_tests.json",
       "device type": "iPad Air (3rd generation)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -142,7 +142,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -155,7 +155,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -168,7 +168,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
diff --git a/ios/build/bots/chromium.fyi/ios13-sdk-device.json b/ios/build/bots/chromium.fyi/ios13-sdk-device.json
index 2f2ac7d4..b588dbf2 100644
--- a/ios/build/bots/chromium.fyi/ios13-sdk-device.json
+++ b/ios/build/bots/chromium.fyi/ios13-sdk-device.json
@@ -3,7 +3,7 @@
     "Builder for Xcode 11 iOS 13 SDK",
     "Build is performed with gn+ninja."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
index 574b3ac..69bdf19e 100644
--- a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
@@ -2,7 +2,7 @@
   "comments": [
     "Runs tests on 64-bit iOS 11.4 and 12.2 and 13.0 tests"
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.mac/ios-device-xcode-clang.json b/ios/build/bots/chromium.mac/ios-device-xcode-clang.json
index d81b830..321c28df 100644
--- a/ios/build/bots/chromium.mac/ios-device-xcode-clang.json
+++ b/ios/build/bots/chromium.mac/ios-device-xcode-clang.json
@@ -3,7 +3,7 @@
     "Builder for 32-bit devices.",
     "Build is performed with gn+ninja."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.mac/ios-device.json b/ios/build/bots/chromium.mac/ios-device.json
index d1f0c6f..8d4a2086 100644
--- a/ios/build/bots/chromium.mac/ios-device.json
+++ b/ios/build/bots/chromium.mac/ios-device.json
@@ -4,7 +4,7 @@
     "Build is performed with gn+ninja.",
     "If modified, please change chromium.fyi/ios-device-goma-canary-clobber.json too."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.mac/ios-simulator-cronet.json b/ios/build/bots/chromium.mac/ios-simulator-cronet.json
index b0123b3..a5938f92d 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-cronet.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-cronet.json
@@ -2,7 +2,7 @@
   "comments": [
     "Cronet tests 64-bit iOS 12 and 13 simulators."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "additional_target_cpus=[\"x86\"]",
     "disable_brotli_filter=false",
diff --git a/ios/build/bots/chromium.mac/ios-simulator-full-configs.json b/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
index 6d41796..04a7977c 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
@@ -3,7 +3,7 @@
     "Runs tests on 64-bit iOS 11 and 12 tests on iPad, iPhone,",
     "@3x, and @2x on main waterfall ios-simulator-full-configs."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.mac/ios-simulator-xcode-clang.json b/ios/build/bots/chromium.mac/ios-simulator-xcode-clang.json
index d8a84b0a..208ee735 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-xcode-clang.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-xcode-clang.json
@@ -4,7 +4,7 @@
     "This 'xcode build version' must exist in GOMA",
     "Build is performed with gn+ninja."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "use xcode build version": true,
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
diff --git a/ios/build/bots/chromium.mac/ios-simulator.json b/ios/build/bots/chromium.mac/ios-simulator.json
index 188d0bf9..556e4f7 100644
--- a/ios/build/bots/chromium.mac/ios-simulator.json
+++ b/ios/build/bots/chromium.mac/ios-simulator.json
@@ -4,7 +4,7 @@
     "main and CQ ios-simulator.",
     "Note: Xcode 10 requires Mac OS 10.13.4 or higher, hence 'host os'."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.mac/ios-slimnav.json b/ios/build/bots/chromium.mac/ios-slimnav.json
index 2e4333c..66ef88e 100644
--- a/ios/build/bots/chromium.mac/ios-slimnav.json
+++ b/ios/build/bots/chromium.mac/ios-slimnav.json
@@ -2,7 +2,7 @@
   "comments": [
     "Test the SlimNavigationManager feature."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.mac/ios13-beta-simulator.json b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
index 45a79d7..55b4dc0 100644
--- a/ios/build/bots/chromium.mac/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
@@ -5,7 +5,7 @@
     "Note: This file exists only to support the trybot.",
     "It should be kept in sync with the CI configuration in ../chromium.fyi/."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
@@ -24,7 +24,7 @@
       "include": "eg2_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -38,7 +38,7 @@
       "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -52,7 +52,7 @@
       "include": "eg2_tests.json",
       "device type": "iPhone X",
       "os": "12.2",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -66,7 +66,7 @@
       "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "12.2",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "pool":"Chrome",
       "host os": "Mac-10.14.4",
       "optional_dimensions": {
@@ -79,7 +79,7 @@
       "include": "common_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -92,7 +92,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -105,7 +105,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPad Pro (12.9-inch)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -118,7 +118,7 @@
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -131,7 +131,7 @@
       "include": "eg_tests.json",
       "device type": "iPad Air (3rd generation)",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -144,7 +144,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -157,7 +157,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
@@ -170,7 +170,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "xcode build version": "11a419c",
+      "xcode build version": "11a420a",
       "host os": "Mac-10.14.4",
       "pool":"Chrome",
       "optional_dimensions": {
diff --git a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
index 9ab9ef3..11508be 100644
--- a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
+++ b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
@@ -5,7 +5,7 @@
     "Note: This file exists only to support the trybot.",
     "It should be kept in sync with the CI configuration in ../chromium.fyi/."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "is_component_build=false",
diff --git a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
index 79e6d21..33ea4312 100644
--- a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
+++ b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-device.json
@@ -3,7 +3,7 @@
     "Builder for 64-bit devices.",
     "Build is performed with gn+ninja."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
index 7a3cb59..131d2a0 100644
--- a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
+++ b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
@@ -2,7 +2,7 @@
   "comments": [
     "Runs tests on @3x, @2x, 64-bit phone, tablet, iOS 11."
   ],
-  "xcode build version": "11a419c",
+  "xcode build version": "11a420a",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
     "ios_enable_code_signing=false",
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index f225f43..4d9ea1f 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -311,7 +311,7 @@
       <message name="IDS_IOS_AUTOFILL_ZIP" desc="Title of the field of a profile address representing the postal code of the address. [Length: 15em] [iOS only]">
         Zip Code
       </message>
-      <message name="IDS_IOS_BADGE_INCOGNITO_HINT" desc="Button displayed when the user is in Incognito mode [Length: 15 em] [iOS only]">
+      <message name="IDS_IOS_BADGE_INCOGNITO_HINT" desc="Button displayed when the user is in Incognito mode. [iOS only]">
         Current Webpage is on Incognito
       </message>
       <message name="IDS_IOS_BANDWIDTH_MANAGEMENT_LEARN_URL" translateable="false">
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index 2c02eff..f7da05b 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -162,13 +162,6 @@
 
 @implementation ContextMenuTestCase
 
-// TODO(crbug.com/989550) Disable broken context menu tests on Xcode 11 beta 5.
-+ (NSArray*)testInvocations {
-  if (@available(iOS 13, *))
-    return @[];
-  return [super testInvocations];
-}
-
 + (void)setUp {
   [super setUp];
   [ChromeEarlGrey setContentSettings:CONTENT_SETTING_ALLOW];
@@ -263,9 +256,10 @@
       CGRectGetMidX([chrome_test_util::GetActiveViewController() view].bounds),
       topInset + 20.0);
 
+  // Duration should match |kContextMenuLongPressDuration| as defined in
+  // web_view_actions.mm.
   [[EarlGrey selectElementWithMatcher:WebViewMatcher()]
-      performAction:grey_longPressAtPointWithDuration(
-                        point, kGREYLongPressDefaultDuration)];
+      performAction:grey_longPressAtPointWithDuration(point, 1.0)];
 
   TapOnContextMenuButton(OpenImageInNewTabButton());
   [ChromeEarlGrey waitForMainTabCount:2];
diff --git a/ios/chrome/browser/infobars/infobar_container_ios.h b/ios/chrome/browser/infobars/infobar_container_ios.h
index 22ac6903..07f647b1 100644
--- a/ios/chrome/browser/infobars/infobar_container_ios.h
+++ b/ios/chrome/browser/infobars/infobar_container_ios.h
@@ -37,6 +37,7 @@
  private:
   id<InfobarContainerConsumer> consumer_;
   id<InfobarContainerConsumer> legacyConsumer_;
+  infobars::InfoBarManager* info_bar_manager_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(InfoBarContainerIOS);
 };
diff --git a/ios/chrome/browser/infobars/infobar_container_ios.mm b/ios/chrome/browser/infobars/infobar_container_ios.mm
index d9f7f04..3d64c5a 100644
--- a/ios/chrome/browser/infobars/infobar_container_ios.mm
+++ b/ios/chrome/browser/infobars/infobar_container_ios.mm
@@ -4,6 +4,7 @@
 
 #include "ios/chrome/browser/infobars/infobar_container_ios.h"
 
+#include "base/metrics/histogram_macros.h"
 #include "ios/chrome/browser/infobars/infobar.h"
 #import "ios/chrome/browser/ui/infobars/infobar_container_consumer.h"
 #import "ios/chrome/browser/ui/infobars/infobar_feature.h"
@@ -28,6 +29,7 @@
     infobars::InfoBarManager* infobar_manager) {
   [consumer_ infobarManagerWillChange];
   InfoBarContainer::ChangeInfoBarManager(infobar_manager);
+  info_bar_manager_ = infobar_manager;
 }
 
 void InfoBarContainerIOS::PlatformSpecificAddInfoBar(infobars::InfoBar* infobar,
@@ -35,6 +37,14 @@
   InfoBarIOS* infobar_ios = static_cast<InfoBarIOS*>(infobar);
   id<InfobarUIDelegate> delegate = infobar_ios->InfobarUIDelegate();
 
+  // Record the number of multiple Infobars being presented at the same time.
+  // This doesn't differentiate between "Messages" or legacy Infobars.
+  if (info_bar_manager_ && info_bar_manager_->infobar_count() > 0) {
+    int kMaxValue = 10;
+    UMA_HISTOGRAM_EXACT_LINEAR("Mobile.Messages.ConcurrentPresented",
+                               info_bar_manager_->infobar_count(), kMaxValue);
+  }
+
   if ([delegate isPresented]) {
     // Only InfobarUIReboot Infobars should be presented using the non legacy
     // consumer.
diff --git a/ios/chrome/browser/metrics/user_interface_style_recorder.mm b/ios/chrome/browser/metrics/user_interface_style_recorder.mm
index 6ffebd8..a00fcc0 100644
--- a/ios/chrome/browser/metrics/user_interface_style_recorder.mm
+++ b/ios/chrome/browser/metrics/user_interface_style_recorder.mm
@@ -44,15 +44,6 @@
                                 userInterfaceStyleForReporting);
 }
 
-// Reports the interface style changed while Chrome is active.
-void ReportUserInterfaceStyleChangedWhileActive(
-    UIUserInterfaceStyle userInterfaceStyle) {
-  InterfaceStyleForReporting userInterfaceStyleForReporting =
-      InterfaceStyleForReportingForUIUserInterfaceStyle(userInterfaceStyle);
-  base::UmaHistogramEnumeration("UserInterfaceStyle.ChangedWhileActive",
-                                userInterfaceStyleForReporting);
-}
-
 }  // namespace
 
 @interface UserInterfaceStyleRecorder ()
@@ -92,12 +83,13 @@
 
 - (void)userInterfaceStyleDidChange:
     (UIUserInterfaceStyle)newUserInterfaceStyle {
-  // Record the new user interface style.
-  ReportUserInterfaceStyleUsed(newUserInterfaceStyle);
-
-  // Record if changed while in foreground.
+  // When an app goes to the background iOS toggles the user interface 2 times.
+  // This is probably to take screenshots of the screen for multitask. After
+  // this if the interface style changes, the app is not notified until it comes
+  // to the foreground. We only care if changed was registered while in
+  // foreground.
   if (!self.applicationInBackground) {
-    ReportUserInterfaceStyleChangedWhileActive(newUserInterfaceStyle);
+    ReportUserInterfaceStyleUsed(newUserInterfaceStyle);
   }
 }
 
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
index 36b6622f..eb2b51e 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
@@ -392,8 +393,7 @@
                                             action:^(const GURL& URL) {
                                               [weakSelf openSettings];
                                             }];
-    [self.settingsLinkController
-        setLinkColor:[[MDCPalette cr_bluePalette] tint500]];
+    [self.settingsLinkController setLinkColor:[UIColor colorNamed:kBlueColor]];
     [self.settingsLinkController
         addLinkWithRange:range
                      url:URL
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.mm
index 8375d49..0701f16a 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_coordinator.mm
@@ -185,6 +185,11 @@
   }
 }
 
+- (void)mediatorDidDetectMovingToBackground:
+    (FormInputAccessoryMediator*)mediator {
+  [self.formInputAccessoryViewController reset];
+}
+
 #pragma mark - ManualFillAccessoryViewControllerDelegate
 
 - (void)keyboardButtonPressed {
@@ -225,22 +230,26 @@
 #pragma mark - PasswordCoordinatorDelegate
 
 - (void)openPasswordSettings {
+  [self.formInputAccessoryViewController reset];
   [self.navigator openPasswordSettings];
 }
 
 - (void)openAllPasswordsPicker {
+  [self.formInputAccessoryViewController reset];
   [self.navigator openAllPasswordsPicker];
 }
 
 #pragma mark - CardCoordinatorDelegate
 
 - (void)openCardSettings {
+  [self.formInputAccessoryViewController reset];
   [self.navigator openCreditCardSettings];
 }
 
 #pragma mark - AddressCoordinatorDelegate
 
 - (void)openAddressSettings {
+  [self.formInputAccessoryViewController reset];
   [self.navigator openAddressSettings];
 }
 
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h
index c769e96..828e49c8 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h
@@ -35,6 +35,11 @@
 // present on the screen.
 - (void)mediatorDidDetectKeyboardHide:(FormInputAccessoryMediator*)mediator;
 
+// The mediator detected that the keyboard was hidden and it is no longer
+// present on the screen.
+- (void)mediatorDidDetectMovingToBackground:
+    (FormInputAccessoryMediator*)mediator;
+
 @end
 
 // This class contains all the logic to get and provide keyboard input accessory
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
index 36d162e..bd4822fc 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
@@ -169,37 +169,42 @@
                       selector:@selector(handleTextInputDidEndEditing:)
                           name:UITextFieldTextDidEndEditingNotification
                         object:nil];
+    [defaultCenter addObserver:self
+                      selector:@selector(applicationDidEnterBackground:)
+                          name:UIApplicationDidEnterBackgroundNotification
+                        object:nil];
+
     _keyboardObserver = [[KeyboardObserverHelper alloc] init];
     _keyboardObserver.consumer = self;
-  }
-  // In BVC unit tests the password store doesn't exist. Skip creating the
-  // fetcher.
-  // TODO:(crbug.com/878388) Remove this workaround.
-  if (passwordStore) {
-    _passwordFetcher =
-        [[PasswordFetcher alloc] initWithPasswordStore:passwordStore
-                                              delegate:self
-                                                   URL:GURL::EmptyGURL()];
-  }
-  if (personalDataManager) {
-    _personalDataManager = personalDataManager;
-    _personalDataManagerObserver.reset(
-        new autofill::PersonalDataManagerObserverBridge(self));
-    personalDataManager->AddObserver(_personalDataManagerObserver.get());
 
-    // TODO:(crbug.com/845472) Add earl grey test to verify the credit card
-    // button is hidden when local cards are saved and then
-    // kAutofillCreditCardEnabled is changed to disabled.
-    consumer.creditCardButtonHidden =
-        personalDataManager->GetCreditCards().empty();
+    // In BVC unit tests the password store doesn't exist. Skip creating the
+    // fetcher.
+    // TODO:(crbug.com/878388) Remove this workaround.
+    if (passwordStore) {
+      _passwordFetcher =
+          [[PasswordFetcher alloc] initWithPasswordStore:passwordStore
+                                                delegate:self
+                                                     URL:GURL::EmptyGURL()];
+    }
+    if (personalDataManager) {
+      _personalDataManager = personalDataManager;
+      _personalDataManagerObserver.reset(
+          new autofill::PersonalDataManagerObserverBridge(self));
+      personalDataManager->AddObserver(_personalDataManagerObserver.get());
 
-    consumer.addressButtonHidden =
-        personalDataManager->GetProfilesToSuggest().empty();
-  } else {
-    consumer.creditCardButtonHidden = YES;
-    consumer.addressButtonHidden = YES;
+      // TODO:(crbug.com/845472) Add earl grey test to verify the credit card
+      // button is hidden when local cards are saved and then
+      // kAutofillCreditCardEnabled is changed to disabled.
+      consumer.creditCardButtonHidden =
+          personalDataManager->GetCreditCards().empty();
+
+      consumer.addressButtonHidden =
+          personalDataManager->GetProfilesToSuggest().empty();
+    } else {
+      consumer.creditCardButtonHidden = YES;
+      consumer.addressButtonHidden = YES;
+    }
   }
-
   return self;
 }
 
@@ -507,6 +512,11 @@
   }
 }
 
+// Inform the delegate that the app went to the background.
+- (void)applicationDidEnterBackground:(NSNotification*)notification {
+  [self.delegate mediatorDidDetectMovingToBackground:self];
+}
+
 #pragma mark - Keyboard Notifications
 
 // When any text field or text view (e.g. omnibox, settings search bar)
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.h b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.h
index 650866f2..a8e2388 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.h
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.h
@@ -23,6 +23,7 @@
 
 // If set to YES, the controller will add negative content insets inverse to the
 // ones added by UITableViewController to accommodate for the keyboard.
+// Not needed and ignored on iOS >= 13.
 @property(nonatomic, assign) BOOL contentInsetsAlwaysEqualToSafeArea;
 
 // Data source for images.
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
index 58ed525..74668f51 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
@@ -141,6 +141,15 @@
   [self presentQueuedActionItems];
 }
 
+#pragma mark - Getters
+
+- (BOOL)contentInsetsAlwaysEqualToSafeArea {
+  if (@available(iOS 13, *)) {
+    return NO;
+  }
+  return _contentInsetsAlwaysEqualToSafeArea;
+}
+
 #pragma mark - Private
 
 // Presents the data items currently in queue.
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index e097631..8ba80242 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -160,6 +160,7 @@
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/chrome/browser/webui",
     "//ios/chrome/common",
+    "//ios/chrome/common/colors",
     "//ios/chrome/common/ui_util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/ui",
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 2216f51..9efe2f2e 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -175,6 +175,7 @@
 #import "ios/chrome/browser/webui/net_export_tab_helper.h"
 #import "ios/chrome/browser/webui/net_export_tab_helper_delegate.h"
 #import "ios/chrome/browser/webui/show_mail_composer_context.h"
+#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -1503,7 +1504,7 @@
                         action:@selector(shieldWasTapped:)
               forControlEvents:UIControlEventTouchUpInside];
   self.view.autoresizingMask = initialViewAutoresizing;
-  self.view.backgroundColor = [UIColor colorWithWhite:0.75 alpha:1.0];
+  self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor];
 
   [self addChildViewController:self.browserContainerViewController];
   [self.view addSubview:self.contentArea];
diff --git a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
index 20afd5c..7ac9f2f6 100644
--- a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
+++ b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
@@ -575,11 +575,6 @@
 
 // Tests that an alert is presented after a new tab animation is finished.
 - (void)testShowJavaScriptAfterNewTabAnimation {
-  // TODO(crbug.com/989550) Disable broken context menu tests on Xc11b5.
-  if (@available(iOS 13, *)) {
-    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS13.");
-  }
-
   // Load the test page with a link to kOnLoadAlertURL and long tap on the link.
   [self loadPageWithLink];
 
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h
index 868a4853..f5eab0bc 100644
--- a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h
@@ -14,6 +14,10 @@
 // Text that will be shown above the UIActivityIndicatorView.
 @property(nonatomic, copy) NSString* messageText;
 
+// YES if the Coordinator is started. Meaning that the UIActivityIndicatorView
+// is currently being displayed.
+@property(nonatomic, assign) BOOL started;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm
index ce4aae0..13acaff 100644
--- a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm
@@ -20,7 +20,7 @@
 @implementation ChromeActivityOverlayCoordinator
 
 - (void)start {
-  if (self.chromeActivityOverlayViewController)
+  if (self.chromeActivityOverlayViewController || self.started)
     return;
 
   self.chromeActivityOverlayViewController =
@@ -40,15 +40,17 @@
       addSubview:self.chromeActivityOverlayViewController.view];
   [self.chromeActivityOverlayViewController
       didMoveToParentViewController:self.baseViewController];
+  self.started = YES;
 }
 
 - (void)stop {
-  if (!self.chromeActivityOverlayViewController)
+  if (!self.chromeActivityOverlayViewController || !self.started)
     return;
   [self.chromeActivityOverlayViewController willMoveToParentViewController:nil];
   [self.chromeActivityOverlayViewController.view removeFromSuperview];
   [self.chromeActivityOverlayViewController removeFromParentViewController];
   self.chromeActivityOverlayViewController = nil;
+  self.started = NO;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
index b4d58dd..ca161e2 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
@@ -381,7 +381,9 @@
     // label. Thus, there should be at least one object alreading in
     // |accessibleElements|.
     DCHECK([self.accessibleElements count] > 0);
-    [self.accessibleElements insertObject:self.badgeView atIndex:1];
+    if ([self.accessibleElements indexOfObject:self.badgeView] == NSNotFound) {
+      [self.accessibleElements insertObject:self.badgeView atIndex:1];
+    }
   } else {
     [self.accessibleElements removeObject:self.badgeView];
   }
@@ -449,7 +451,10 @@
   }
 
   if (self.trailingButton.enabled) {
-    [self.accessibleElements addObject:self.trailingButton];
+    if ([self.accessibleElements indexOfObject:self.trailingButton] ==
+        NSNotFound) {
+      [self.accessibleElements addObject:self.trailingButton];
+    }
   } else {
     [self.accessibleElements removeObject:self.trailingButton];
   }
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
index d4b91dd..bfbbdc7 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
@@ -121,8 +121,10 @@
   self.tableView.accessibilityIdentifier = kAutofillCreditCardTableViewId;
 
   base::RecordAction(base::UserMetricsAction("AutofillCreditCardsViewed"));
-  [self setToolbarItems:@[ [self flexibleSpace], self.addPaymentMethodButton ]
-               animated:YES];
+  if (base::FeatureList::IsEnabled(kSettingsAddPaymentMethod)) {
+    [self setToolbarItems:@[ [self flexibleSpace], self.addPaymentMethodButton ]
+                 animated:YES];
+  }
   [self updateUIForEditState];
   [self loadModel];
 }
@@ -493,15 +495,24 @@
 
 // Adds delete button to the bottom toolbar.
 - (void)showDeleteButton {
-  NSArray* customToolbarItems =
-      @[ self.deleteButton, [self flexibleSpace], self.addPaymentMethodButton ];
+  NSArray* customToolbarItems;
+  if (base::FeatureList::IsEnabled(kSettingsAddPaymentMethod)) {
+    customToolbarItems = @[
+      self.deleteButton, [self flexibleSpace], self.addPaymentMethodButton
+    ];
+  } else {
+    customToolbarItems =
+        @[ [self flexibleSpace], self.deleteButton, [self flexibleSpace] ];
+  }
   [self setToolbarItems:customToolbarItems animated:YES];
 }
 
 // Removes delete button from the bottom toolbar.
 - (void)hideDeleteButton {
-  NSArray* customToolbarItems =
-      @[ [self flexibleSpace], self.addPaymentMethodButton ];
+  NSArray* customToolbarItems;
+  if (base::FeatureList::IsEnabled(kSettingsAddPaymentMethod)) {
+    customToolbarItems = @[ [self flexibleSpace], self.addPaymentMethodButton ];
+  }
   [self setToolbarItems:customToolbarItems animated:YES];
 }
 
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
index 52b5b26..b765c1a 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -132,6 +132,7 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/browsing_data:feature_flags",
+    "//ios/chrome/browser/ui/settings/cells",
     "//ios/chrome/test/earl_grey:test_support",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_egtest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_egtest.mm
index aa30cae..610053d 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_egtest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_egtest.mm
@@ -5,9 +5,11 @@
 #import <EarlGrey/EarlGrey.h>
 #import <XCTest/XCTest.h>
 
+#include "base/ios/ios_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
+#include "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -47,4 +49,30 @@
       performAction:grey_tap()];
 }
 
+// Verifies that the CBD screen can be swiped down to dismiss.
+- (void)testClearBrowsingDataSwipeDown {
+  if (!base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test disabled on iOS 12 and lower.");
+  }
+  [self openClearBrowsingDataDialog];
+
+  // Check that CBD is presented.
+  [[EarlGrey
+      selectElementWithMatcher:
+          grey_accessibilityID(kClearBrowsingDataViewAccessibilityIdentifier)]
+      assertWithMatcher:grey_notNil()];
+
+  // Swipe TableView down.
+  [[EarlGrey
+      selectElementWithMatcher:
+          grey_accessibilityID(kClearBrowsingDataViewAccessibilityIdentifier)]
+      performAction:grey_swipeFastInDirection(kGREYDirectionDown)];
+
+  // Check that Settings has been dismissed.
+  [[EarlGrey
+      selectElementWithMatcher:
+          grey_accessibilityID(kClearBrowsingDataViewAccessibilityIdentifier)]
+      assertWithMatcher:grey_nil()];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 3a80248..b04fccb 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -334,6 +334,12 @@
   }
 }
 
+#pragma mark - SettingsRootTableViewController
+
+- (BOOL)shouldDismissViewControllerBySwipeDown {
+  return !self.chromeActivityOverlayCoordinator.started;
+}
+
 #pragma mark - TableViewTextLinkCellDelegate
 
 - (void)tableViewTextLinkCell:(TableViewTextLinkCell*)cell
@@ -434,6 +440,11 @@
   [self dismiss];
 }
 
+- (BOOL)presentationControllerShouldDismiss:
+    (UIPresentationController*)presentationController {
+  return !self.chromeActivityOverlayCoordinator.started;
+}
+
 #pragma mark - Private Helpers
 
 - (void)showClearBrowsingDataAlertController:(id)sender {
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
index eb8bc58..e57034e0 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
@@ -293,4 +293,8 @@
   return self.detailTextLabel.text;
 }
 
+- (NSArray<NSString*>*)accessibilityUserInputLabels {
+  return @[ self.textLabel.text ];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.h b/ios/chrome/browser/ui/tabs/tab_strip_controller.h
index 9184fc4..4dca05e 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller.h
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.h
@@ -48,6 +48,11 @@
 // Hides or shows the tab strip.
 - (void)hideTabStrip:(BOOL)hidden;
 
+// Preprare the receiver for destruction, disconnecting from all services.
+// It is an error for the receiver to dealloc without this having been called
+// first.
+- (void)disconnect;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TABS_TAB_STRIP_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
index c7e0bf4..75150b7f 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -257,6 +257,9 @@
 @property(nonatomic, readonly, retain) TabStripView* tabStripView;
 @property(nonatomic, readonly, retain) UIButton* buttonNewTab;
 
+// YES if the controller has been disconnected.
+@property(nonatomic) BOOL disconnected;
+
 // Initializes the tab array based on the the entries in the TabModel.  Creates
 // one TabView per Tab and adds it to the tabstrip.  A later call to
 // |-layoutTabs| is needed to properly place the tabs in the correct positions.
@@ -510,10 +513,16 @@
 }
 
 - (void)dealloc {
+  DCHECK(_disconnected);
+}
+
+- (void)disconnect {
   [_tabStripView setDelegate:nil];
   [_tabStripView setLayoutDelegate:nil];
   _allWebStateObservationForwarder.reset();
+  _webStateListFaviconObserver.reset();
   _tabModel.webStateList->RemoveObserver(_webStateListObserver.get());
+  self.disconnected = YES;
 }
 
 - (void)hideTabStrip:(BOOL)hidden {
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller_unittest.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller_unittest.mm
index bb8c6eb..9ada126 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller_unittest.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller_unittest.mm
@@ -126,6 +126,7 @@
       return;
 
     [tab_model_ browserStateDestroyed];
+    [controller_ disconnect];
   }
 
   web::WebTaskEnvironment task_environment_;
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.mm b/ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.mm
index a0eb9f0..4c50e1d 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.mm
@@ -88,6 +88,7 @@
 
 - (void)stop {
   self.started = NO;
+  [self.tabStripController disconnect];
   self.tabStripController = nil;
   self.dispatcher = nil;
   self.tabModel = nil;
diff --git a/media/webrtc/BUILD.gn b/media/webrtc/BUILD.gn
index d053c88a..59e7cd7c 100644
--- a/media/webrtc/BUILD.gn
+++ b/media/webrtc/BUILD.gn
@@ -43,6 +43,7 @@
     deps += [
       "//media",
       "//third_party/webrtc/api:libjingle_peerconnection_api",
+      "//third_party/webrtc/api:media_stream_interface",
       "//third_party/webrtc/api/audio:aec3_factory",
       "//third_party/webrtc/modules/audio_processing/aec_dump:aec_dump",
       "//third_party/webrtc/rtc_base:rtc_task_queue",
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 85b84438..c15d299 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -1428,7 +1428,7 @@
   // created a new ActiveEntry (new_entry_) to write to (and doomed the old
   // one). Now that the new entry has been created, start writing the response.
 
-  CHECK_EQ(result, OK);
+  DCHECK_EQ(result, OK);
   DCHECK_EQ(mode_, WRITE);
   DCHECK(new_entry_);
   DCHECK(response_.headers);
diff --git a/ppapi/c/private/ppb_pdf.h b/ppapi/c/private/ppb_pdf.h
index e98003a..9afca9dd 100644
--- a/ppapi/c/private/ppb_pdf.h
+++ b/ppapi/c/private/ppb_pdf.h
@@ -184,13 +184,13 @@
   // support.
   void (*SetAccessibilityViewportInfo)(
       PP_Instance instance,
-      struct PP_PrivateAccessibilityViewportInfo* viewport_info);
+      const struct PP_PrivateAccessibilityViewportInfo* viewport_info);
 
   // Sends information about the PDF document to the renderer for accessibility
   // support.
   void (*SetAccessibilityDocInfo)(
       PP_Instance instance,
-      struct PP_PrivateAccessibilityDocInfo* doc_info);
+      const struct PP_PrivateAccessibilityDocInfo* doc_info);
 
   // Sends information about one page in a PDF document to the renderer for
   // accessibility support.
diff --git a/ppapi/cpp/private/pdf.cc b/ppapi/cpp/private/pdf.cc
index 5910c2f..70d965b8b 100644
--- a/ppapi/cpp/private/pdf.cc
+++ b/ppapi/cpp/private/pdf.cc
@@ -203,7 +203,7 @@
 // static
 void PDF::SetAccessibilityViewportInfo(
     const InstanceHandle& instance,
-    PP_PrivateAccessibilityViewportInfo* viewport_info) {
+    const PP_PrivateAccessibilityViewportInfo* viewport_info) {
   if (has_interface<PPB_PDF>()) {
     get_interface<PPB_PDF>()->SetAccessibilityViewportInfo(
         instance.pp_instance(), viewport_info);
@@ -211,8 +211,9 @@
 }
 
 // static
-void PDF::SetAccessibilityDocInfo(const InstanceHandle& instance,
-                                  PP_PrivateAccessibilityDocInfo* doc_info) {
+void PDF::SetAccessibilityDocInfo(
+    const InstanceHandle& instance,
+    const PP_PrivateAccessibilityDocInfo* doc_info) {
   if (has_interface<PPB_PDF>()) {
     get_interface<PPB_PDF>()->SetAccessibilityDocInfo(instance.pp_instance(),
                                                       doc_info);
diff --git a/ppapi/cpp/private/pdf.h b/ppapi/cpp/private/pdf.h
index cec922b2..417016c 100644
--- a/ppapi/cpp/private/pdf.h
+++ b/ppapi/cpp/private/pdf.h
@@ -86,10 +86,10 @@
                                         int* snapshot_size_out);
   static void SetAccessibilityViewportInfo(
       const InstanceHandle& instance,
-      PP_PrivateAccessibilityViewportInfo* viewport_info);
+      const PP_PrivateAccessibilityViewportInfo* viewport_info);
   static void SetAccessibilityDocInfo(
       const InstanceHandle& instance,
-      PP_PrivateAccessibilityDocInfo* doc_info);
+      const PP_PrivateAccessibilityDocInfo* doc_info);
   static void SetAccessibilityPageInfo(
       const InstanceHandle& instance,
       const PP_PrivateAccessibilityPageInfo* page_info,
diff --git a/ppapi/proxy/pdf_resource.cc b/ppapi/proxy/pdf_resource.cc
index 642276c..0dcaeaf 100644
--- a/ppapi/proxy/pdf_resource.cc
+++ b/ppapi/proxy/pdf_resource.cc
@@ -9,6 +9,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <limits>
+#include <utility>
+#include <vector>
+
 #include "base/command_line.h"
 #include "base/debug/crash_logging.h"
 #include "base/metrics/histogram.h"
@@ -201,12 +205,12 @@
 }
 
 void PDFResource::SetAccessibilityDocInfo(
-    PP_PrivateAccessibilityDocInfo* doc_info) {
+    const PP_PrivateAccessibilityDocInfo* doc_info) {
   Post(RENDERER, PpapiHostMsg_PDF_SetAccessibilityDocInfo(*doc_info));
 }
 
 void PDFResource::SetAccessibilityViewportInfo(
-    PP_PrivateAccessibilityViewportInfo* viewport_info) {
+    const PP_PrivateAccessibilityViewportInfo* viewport_info) {
   Post(RENDERER, PpapiHostMsg_PDF_SetAccessibilityViewportInfo(*viewport_info));
 }
 
diff --git a/ppapi/proxy/pdf_resource.h b/ppapi/proxy/pdf_resource.h
index b371b3cd..8ae2bdb8 100644
--- a/ppapi/proxy/pdf_resource.h
+++ b/ppapi/proxy/pdf_resource.h
@@ -5,6 +5,8 @@
 #ifndef PPAPI_PROXY_PDF_RESOURCE_H_
 #define PPAPI_PROXY_PDF_RESOURCE_H_
 
+#include <string>
+
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "ppapi/c/pp_instance.h"
@@ -57,9 +59,9 @@
                                  const char** snapshot_data_out,
                                  int* snapshot_size_out) override;
   void SetAccessibilityViewportInfo(
-      PP_PrivateAccessibilityViewportInfo* viewport_info) override;
+      const PP_PrivateAccessibilityViewportInfo* viewport_info) override;
   void SetAccessibilityDocInfo(
-      PP_PrivateAccessibilityDocInfo* doc_info) override;
+      const PP_PrivateAccessibilityDocInfo* doc_info) override;
   void SetAccessibilityPageInfo(
       const PP_PrivateAccessibilityPageInfo* page_info,
       const PP_PrivateAccessibilityTextRunInfo text_runs[],
diff --git a/ppapi/thunk/ppb_pdf_api.h b/ppapi/thunk/ppb_pdf_api.h
index b56ba890..dea3355 100644
--- a/ppapi/thunk/ppb_pdf_api.h
+++ b/ppapi/thunk/ppb_pdf_api.h
@@ -37,9 +37,9 @@
                                          const char** snapshot_data_out,
                                          int* snapshot_size_out) = 0;
   virtual void SetAccessibilityViewportInfo(
-      PP_PrivateAccessibilityViewportInfo* viewport_info) = 0;
+      const PP_PrivateAccessibilityViewportInfo* viewport_info) = 0;
   virtual void SetAccessibilityDocInfo(
-      PP_PrivateAccessibilityDocInfo* doc_info) = 0;
+      const PP_PrivateAccessibilityDocInfo* doc_info) = 0;
   virtual void SetAccessibilityPageInfo(
       const PP_PrivateAccessibilityPageInfo* page_info,
       const PP_PrivateAccessibilityTextRunInfo text_runs[],
diff --git a/ppapi/thunk/ppb_pdf_thunk.cc b/ppapi/thunk/ppb_pdf_thunk.cc
index 19204b0..a66c774 100644
--- a/ppapi/thunk/ppb_pdf_thunk.cc
+++ b/ppapi/thunk/ppb_pdf_thunk.cc
@@ -155,7 +155,7 @@
 
 void SetAccessibilityViewportInfo(
     PP_Instance instance,
-    PP_PrivateAccessibilityViewportInfo* viewport_info) {
+    const PP_PrivateAccessibilityViewportInfo* viewport_info) {
   EnterInstanceAPI<PPB_PDF_API> enter(instance);
   if (enter.failed())
     return;
@@ -163,7 +163,7 @@
 }
 
 void SetAccessibilityDocInfo(PP_Instance instance,
-                             PP_PrivateAccessibilityDocInfo* doc_info) {
+                             const PP_PrivateAccessibilityDocInfo* doc_info) {
   EnterInstanceAPI<PPB_PDF_API> enter(instance);
   if (enter.failed())
     return;
diff --git a/services/device/device_service.cc b/services/device/device_service.cc
index 0bbbf66..ec05ad41 100644
--- a/services/device/device_service.cc
+++ b/services/device/device_service.cc
@@ -213,12 +213,12 @@
       base::BindRepeating(&DeviceService::BindBluetoothSystemFactoryReceiver,
                           base::Unretained(this)));
   registry_.AddInterface<mojom::MtpManager>(base::BindRepeating(
-      &DeviceService::BindMtpManagerRequest, base::Unretained(this)));
+      &DeviceService::BindMtpManagerReceiver, base::Unretained(this)));
 #endif
 
 #if defined(OS_LINUX) && defined(USE_UDEV)
   registry_.AddInterface<mojom::InputDeviceManager>(base::Bind(
-      &DeviceService::BindInputDeviceManagerRequest, base::Unretained(this)));
+      &DeviceService::BindInputDeviceManagerReceiver, base::Unretained(this)));
 #endif
 }
 
@@ -260,19 +260,20 @@
   BluetoothSystemFactory::CreateFactory(std::move(receiver));
 }
 
-void DeviceService::BindMtpManagerRequest(mojom::MtpManagerRequest request) {
+void DeviceService::BindMtpManagerReceiver(
+    mojo::PendingReceiver<mojom::MtpManager> receiver) {
   if (!mtp_device_manager_)
     mtp_device_manager_ = MtpDeviceManager::Initialize();
-  mtp_device_manager_->AddBinding(std::move(request));
+  mtp_device_manager_->AddReceiver(std::move(receiver));
 }
 #endif
 
 #if defined(OS_LINUX) && defined(USE_UDEV)
-void DeviceService::BindInputDeviceManagerRequest(
-    mojom::InputDeviceManagerRequest request) {
+void DeviceService::BindInputDeviceManagerReceiver(
+    mojo::PendingReceiver<mojom::InputDeviceManager> receiver) {
   file_task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&InputServiceLinux::BindRequest, std::move(request)));
+      base::BindOnce(&InputServiceLinux::BindReceiver, std::move(receiver)));
 }
 #endif
 
diff --git a/services/device/device_service.h b/services/device/device_service.h
index 2969c91a..1cff86e4 100644
--- a/services/device/device_service.h
+++ b/services/device/device_service.h
@@ -147,7 +147,8 @@
       mojo::PendingReceiver<mojom::GeolocationControl> receiver);
 
 #if defined(OS_LINUX) && defined(USE_UDEV)
-  void BindInputDeviceManagerRequest(mojom::InputDeviceManagerRequest request);
+  void BindInputDeviceManagerReceiver(
+      mojo::PendingReceiver<mojom::InputDeviceManager> receiver);
 #endif
 
 #if !defined(OS_ANDROID)
@@ -163,7 +164,8 @@
 #if defined(OS_CHROMEOS)
   void BindBluetoothSystemFactoryReceiver(
       mojo::PendingReceiver<mojom::BluetoothSystemFactory> receiver);
-  void BindMtpManagerRequest(mojom::MtpManagerRequest request);
+  void BindMtpManagerReceiver(
+      mojo::PendingReceiver<mojom::MtpManager> receiver);
 #endif
 
   void BindPowerMonitorRequest(mojom::PowerMonitorRequest request);
diff --git a/services/device/hid/input_service_linux.cc b/services/device/hid/input_service_linux.cc
index 3069aa5..3704e822 100644
--- a/services/device/hid/input_service_linux.cc
+++ b/services/device/hid/input_service_linux.cc
@@ -174,8 +174,9 @@
 }
 
 // static
-void InputServiceLinux::BindRequest(mojom::InputDeviceManagerRequest request) {
-  GetInstance()->AddBinding(std::move(request));
+void InputServiceLinux::BindReceiver(
+    mojo::PendingReceiver<mojom::InputDeviceManager> receiver) {
+  GetInstance()->AddReceiver(std::move(receiver));
 }
 
 // static
@@ -199,8 +200,9 @@
   g_input_service_linux = service.release();
 }
 
-void InputServiceLinux::AddBinding(mojom::InputDeviceManagerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+void InputServiceLinux::AddReceiver(
+    mojo::PendingReceiver<mojom::InputDeviceManager> receiver) {
+  receivers_.Add(this, std::move(receiver));
 }
 
 void InputServiceLinux::GetDevicesAndSetClient(
diff --git a/services/device/hid/input_service_linux.h b/services/device/hid/input_service_linux.h
index d1b526b..cfffc29d 100644
--- a/services/device/hid/input_service_linux.h
+++ b/services/device/hid/input_service_linux.h
@@ -13,8 +13,9 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "services/device/public/mojom/input_service.mojom.h"
 
 namespace device {
@@ -29,8 +30,9 @@
   InputServiceLinux();
   ~InputServiceLinux() override;
 
-  // Binds the |request| to an InputServiceLinux instance.
-  static void BindRequest(mojom::InputDeviceManagerRequest request);
+  // Binds the |receiver| to an InputServiceLinux instance.
+  static void BindReceiver(
+      mojo::PendingReceiver<mojom::InputDeviceManager> receiver);
 
   // Returns the InputServiceLinux instance for the current process. Creates one
   // if none has been set.
@@ -46,7 +48,7 @@
   // current process. |service| will never be deleted.
   static void SetForTesting(std::unique_ptr<InputServiceLinux> service);
 
-  void AddBinding(mojom::InputDeviceManagerRequest request);
+  void AddReceiver(mojo::PendingReceiver<mojom::InputDeviceManager> receiver);
 
   // mojom::InputDeviceManager implementation:
   void GetDevicesAndSetClient(
@@ -64,7 +66,7 @@
 
  private:
   base::ThreadChecker thread_checker_;
-  mojo::BindingSet<mojom::InputDeviceManager> bindings_;
+  mojo::ReceiverSet<mojom::InputDeviceManager> receivers_;
   mojo::AssociatedInterfacePtrSet<mojom::InputDeviceManagerClient> clients_;
 
   DISALLOW_COPY_AND_ASSIGN(InputServiceLinux);
diff --git a/services/device/media_transfer_protocol/mtp_device_manager.cc b/services/device/media_transfer_protocol/mtp_device_manager.cc
index c832187..68e9a30e 100644
--- a/services/device/media_transfer_protocol/mtp_device_manager.cc
+++ b/services/device/media_transfer_protocol/mtp_device_manager.cc
@@ -50,12 +50,13 @@
   VLOG(1) << "MtpDeviceManager Shutdown completed";
 }
 
-void MtpDeviceManager::AddBinding(mojom::MtpManagerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+void MtpDeviceManager::AddReceiver(
+    mojo::PendingReceiver<mojom::MtpManager> receiver) {
+  receivers_.Add(this, std::move(receiver));
 }
 
 void MtpDeviceManager::EnumerateStoragesAndSetClient(
-    mojom::MtpManagerClientAssociatedPtrInfo client,
+    mojo::PendingAssociatedRemote<mojom::MtpManagerClient> client,
     EnumerateStoragesAndSetClientCallback callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
diff --git a/services/device/media_transfer_protocol/mtp_device_manager.h b/services/device/media_transfer_protocol/mtp_device_manager.h
index 5d0525a..67991e5 100644
--- a/services/device/media_transfer_protocol/mtp_device_manager.h
+++ b/services/device/media_transfer_protocol/mtp_device_manager.h
@@ -17,8 +17,10 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "services/device/media_transfer_protocol/media_transfer_protocol_daemon_client.h"
 #include "services/device/public/mojom/mtp_manager.mojom.h"
 
@@ -39,11 +41,11 @@
   MtpDeviceManager();
   ~MtpDeviceManager() override;
 
-  void AddBinding(mojom::MtpManagerRequest request);
+  void AddReceiver(mojo::PendingReceiver<mojom::MtpManager> receiver);
 
   // Implements mojom::MtpManager.
   void EnumerateStoragesAndSetClient(
-      mojom::MtpManagerClientAssociatedPtrInfo client,
+      mojo::PendingAssociatedRemote<mojom::MtpManagerClient> client,
       EnumerateStoragesAndSetClientCallback callback) override;
   void GetStorageInfo(const std::string& storage_name,
                       GetStorageInfoCallback callback) override;
@@ -167,11 +169,11 @@
   // DBusThreadManager to provide a bus in unit tests.
   scoped_refptr<dbus::Bus> const bus_;
 
-  mojo::BindingSet<mojom::MtpManager> bindings_;
+  mojo::ReceiverSet<mojom::MtpManager> receivers_;
   // MtpManager client who keeps tuned on attachment / detachment events.
   // Currently, storage_monitor::StorageMonitorCros is supposed to be the
   // only client.
-  mojom::MtpManagerClientAssociatedPtr client_;
+  mojo::AssociatedRemote<mojom::MtpManagerClient> client_;
 
   // Map to keep track of attached storages by name.
   base::flat_map<std::string, mojom::MtpStorageInfo> storage_info_map_;
diff --git a/services/device/public/mojom/mtp_manager.mojom b/services/device/public/mojom/mtp_manager.mojom
index f3937fd..6bbcd0f 100644
--- a/services/device/public/mojom/mtp_manager.mojom
+++ b/services/device/public/mojom/mtp_manager.mojom
@@ -20,8 +20,9 @@
   // client for incoming storage change events. It is designed to reduce
   // async calls and eliminate a potential race condition between
   // the client being set and storage updates being made.
-  EnumerateStoragesAndSetClient(associated MtpManagerClient client) =>
-    (array<MtpStorageInfo> storages);
+  EnumerateStoragesAndSetClient(
+      pending_associated_remote<MtpManagerClient> client) =>
+          (array<MtpStorageInfo> storages);
 
   // Gets storage metadata for |storage_name|.
   GetStorageInfo(string storage_name) =>
diff --git a/services/tracing/perfetto/perfetto_service.cc b/services/tracing/perfetto/perfetto_service.cc
index 995c0342..a6c0988 100644
--- a/services/tracing/perfetto/perfetto_service.cc
+++ b/services/tracing/perfetto/perfetto_service.cc
@@ -78,7 +78,7 @@
 }
 
 void PerfettoService::ConnectToProducerHost(
-    mojom::ProducerClientPtr producer_client,
+    mojo::PendingRemote<mojom::ProducerClient> producer_client,
     mojom::ProducerHostRequest producer_host_request) {
   auto new_producer = std::make_unique<ProducerHost>();
   uint32_t producer_pid = receivers_.current_context();
diff --git a/services/tracing/perfetto/perfetto_service.h b/services/tracing/perfetto/perfetto_service.h
index cd997d07..bed03ad 100644
--- a/services/tracing/perfetto/perfetto_service.h
+++ b/services/tracing/perfetto/perfetto_service.h
@@ -40,8 +40,9 @@
                     uint32_t pid);
 
   // mojom::PerfettoService implementation.
-  void ConnectToProducerHost(mojom::ProducerClientPtr producer_client,
-                             mojom::ProducerHostRequest producer_host) override;
+  void ConnectToProducerHost(
+      mojo::PendingRemote<mojom::ProducerClient> producer_client,
+      mojom::ProducerHostRequest producer_host) override;
 
   perfetto::TracingService* GetService() const;
 
diff --git a/services/tracing/perfetto/producer_host.cc b/services/tracing/perfetto/producer_host.cc
index 3f8bafe..268042a 100644
--- a/services/tracing/perfetto/producer_host.cc
+++ b/services/tracing/perfetto/producer_host.cc
@@ -36,13 +36,14 @@
   producer_endpoint_.reset();
 }
 
-void ProducerHost::Initialize(mojom::ProducerClientPtr producer_client,
-                              perfetto::TracingService* service,
-                              const std::string& name) {
+void ProducerHost::Initialize(
+    mojo::PendingRemote<mojom::ProducerClient> producer_client,
+    perfetto::TracingService* service,
+    const std::string& name) {
   DCHECK(service);
   DCHECK(!producer_endpoint_);
 
-  producer_client_ = std::move(producer_client);
+  producer_client_.Bind(std::move(producer_client));
 
   // Attempt to parse the PID out of the producer name.
   // If the Producer is in-process, we:
diff --git a/services/tracing/perfetto/producer_host.h b/services/tracing/perfetto/producer_host.h
index 9d531482..f1fcaaa 100644
--- a/services/tracing/perfetto/producer_host.h
+++ b/services/tracing/perfetto/producer_host.h
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/tracing/perfetto/producer_host.h"
 #include "services/tracing/public/mojom/perfetto_service.mojom.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/producer.h"
@@ -40,7 +41,7 @@
   // Called by the ProducerService to register the
   // Producer with Perfetto and connect to the
   // corresponding remote ProducerClient.
-  void Initialize(mojom::ProducerClientPtr producer_client,
+  void Initialize(mojo::PendingRemote<mojom::ProducerClient> producer_client,
                   perfetto::TracingService* service,
                   const std::string& name);
 
@@ -88,7 +89,7 @@
       on_commit_callback_for_testing_;
 
  private:
-  mojom::ProducerClientPtr producer_client_;
+  mojo::Remote<mojom::ProducerClient> producer_client_;
   bool is_in_process_ = false;
 
  protected:
diff --git a/services/tracing/perfetto/test_utils.cc b/services/tracing/perfetto/test_utils.cc
index 604022c..8ad1e60 100644
--- a/services/tracing/perfetto/test_utils.cc
+++ b/services/tracing/perfetto/test_utils.cc
@@ -316,12 +316,12 @@
     : producer_name_(producer_name),
       datasource_registered_callback_(
           std::move(datasource_registered_callback)) {
-  mojom::ProducerClientPtr client;
+  mojo::PendingRemote<mojom::ProducerClient> client;
   mojo::PendingRemote<mojom::ProducerHost> host_remote;
-  auto client_request = mojo::MakeRequest(&client);
+  auto client_receiver = client.InitWithNewPipeAndPassReceiver();
   Initialize(std::move(client), service, producer_name_);
   receiver_.Bind(host_remote.InitWithNewPipeAndPassReceiver());
-  producer_client->BindClientAndHostPipesForTesting(std::move(client_request),
+  producer_client->BindClientAndHostPipesForTesting(std::move(client_receiver),
                                                     std::move(host_remote));
   producer_client->SetupDataSource(data_source_name);
 }
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc
index 91beb4d..fdb2858d 100644
--- a/services/tracing/public/cpp/perfetto/producer_client.cc
+++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -32,15 +32,15 @@
 
 void ProducerClient::Connect(
     mojo::PendingRemote<mojom::PerfettoService> perfetto_service) {
-  mojom::ProducerClientPtr client;
-  auto client_request = mojo::MakeRequest(&client);
+  mojo::PendingRemote<mojom::ProducerClient> client;
+  auto client_receiver = client.InitWithNewPipeAndPassReceiver();
   mojom::ProducerHostPtrInfo host_info;
   mojo::Remote<mojom::PerfettoService>(std::move(perfetto_service))
       ->ConnectToProducerHost(std::move(client), mojo::MakeRequest(&host_info));
   task_runner()->GetOrCreateTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&ProducerClient::BindClientAndHostPipesOnSequence,
-                     base::Unretained(this), std::move(client_request),
+                     base::Unretained(this), std::move(client_receiver),
                      std::move(host_info)));
 }
 
diff --git a/services/tracing/public/mojom/perfetto_service.mojom b/services/tracing/public/mojom/perfetto_service.mojom
index ab1da59..c987b7af 100644
--- a/services/tracing/public/mojom/perfetto_service.mojom
+++ b/services/tracing/public/mojom/perfetto_service.mojom
@@ -139,7 +139,7 @@
 // tracing system. A client that wishes to provide tracing data when requested,
 // should implement ProducerClient for callbacks and pass along.
 interface PerfettoService {
-  ConnectToProducerHost(ProducerClient producer_client,
+  ConnectToProducerHost(pending_remote<ProducerClient> producer_client,
                         ProducerHost& producer_host);
 };
 
diff --git a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
index 2d8f82a..23cc1c6 100644
--- a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
@@ -1 +1,8 @@
 # These tests currently fail when run with --enable-features=BackForwardCache
+
+# Not a real problem. The bfcache_chrome_public_test_apk bot adds the
+# --enable-features=BackForwardCache switch, which increases the number of
+# features by one and make those tests to fail:
+-org.chromium.chrome.browser.FeaturesAnnotationsTest.testFeaturesAddToExistingFlags
+-org.chromium.chrome.browser.FeaturesAnnotationsTest.testFeaturesSetExistingFlags
+-org.chromium.chrome.browser.FeaturesAnnotationsTest.testFeaturesDoNotRemoveExistingFlags
diff --git a/testing/buildbot/filters/bfcache.content_browsertests.filter b/testing/buildbot/filters/bfcache.content_browsertests.filter
index aa96d3b3..9921976 100644
--- a/testing/buildbot/filters/bfcache.content_browsertests.filter
+++ b/testing/buildbot/filters/bfcache.content_browsertests.filter
@@ -72,3 +72,12 @@
 # https://crbug.com/1003744
 -NavigationBaseBrowserTest.BackForwardInOldDocumentCancelPendingNavigation/1
 -NavigationBaseBrowserTest.BackForwardInOldDocumentCancelPendingNavigation/0
+
+# The BackForwardCache evicts page asynchronously. The test expects the
+# RenderFrameHostImpl to be removed immediately.
+-SitePerProcessBrowserTest.RenderViewHostIsNotReusedAfterDelayedSwapOutACK
+
+# Android-only test. Timeout.
+# https://crbug.com/1004786
+-SitePerProcessBrowserTest.TestChildProcessImportance
+
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 1d9af21..f266b50 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -763,6 +763,24 @@
             ]
         }
     ],
+    "AutofillEnableToolbarStatusChip": [
+        {
+            "platforms": [
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillCreditCardUploadFeedback",
+                        "AutofillEnableToolbarStatusChip"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillFieldMetadata": [
         {
             "platforms": [
@@ -5250,6 +5268,27 @@
             ]
         }
     ],
+    "SameSiteCookieMessages": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledLaunch",
+                    "enable_features": [
+                        "CookieDeprecationMessages"
+                    ]
+                }
+            ]
+        }
+    ],
     "SchedulerConfiguration": [
         {
             "platforms": [
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 6ae48b6..b354871 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -551,6 +551,7 @@
     "//services/network/public/mojom",
     "//third_party/blink/renderer/platform/wtf:wtf",
     "//third_party/webrtc/api:libjingle_peerconnection_api",
+    "//third_party/webrtc/api:media_stream_interface",
     "//third_party/webrtc/api:rtc_error",
     "//third_party/webrtc/api:rtc_stats_api",
     "//third_party/webrtc/api:rtp_parameters",
diff --git a/third_party/blink/public/mojom/use_counter/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/css_property_id.mojom
index 04ffb17..2d75ffa 100644
--- a/third_party/blink/public/mojom/use_counter/css_property_id.mojom
+++ b/third_party/blink/public/mojom/use_counter/css_property_id.mojom
@@ -689,6 +689,7 @@
     kOverscrollBehaviorInline = 644,
     kOverscrollBehaviorBlock = 645,
     kContentSize = 646,
+    kFontOpticalSizing = 647
     // 1. Add new features above this line (don't change the assigned numbers of
     // the existing items).
     // 2. Run the update_use_counter_css.py script in
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index dbe2e555..c559be49 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -247,6 +247,7 @@
   BLINK_PLATFORM_EXPORT static void EnableBackForwardCache(bool);
 
   BLINK_PLATFORM_EXPORT static void EnableSurfaceEmbeddingFeatures(bool);
+  BLINK_PLATFORM_EXPORT static void EnableAcceleratedSmallCanvases(bool);
 
  private:
   WebRuntimeFeatures();
diff --git a/third_party/blink/renderer/core/css/binary_data_font_face_source.cc b/third_party/blink/renderer/core/css/binary_data_font_face_source.cc
index f73ca24..025157d 100644
--- a/third_party/blink/renderer/core/css/binary_data_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/binary_data_font_face_source.cc
@@ -31,8 +31,8 @@
           font_description.IsSyntheticBold(),
           font_description.IsSyntheticItalic(),
           font_description.GetFontSelectionRequest(),
-          font_selection_capabilities, font_description.Orientation(),
-          font_description.VariationSettings()),
+          font_selection_capabilities, font_description.FontOpticalSizing(),
+          font_description.Orientation(), font_description.VariationSettings()),
       CustomFontData::Create());
 }
 
diff --git a/third_party/blink/renderer/core/css/css_computed_style_declaration.cc b/third_party/blink/renderer/core/css/css_computed_style_declaration.cc
index 9a26f1e..b700d457 100644
--- a/third_party/blink/renderer/core/css/css_computed_style_declaration.cc
+++ b/third_party/blink/renderer/core/css/css_computed_style_declaration.cc
@@ -85,34 +85,35 @@
     CSSPropertyID::kDirection, CSSPropertyID::kDisplay,
     CSSPropertyID::kEmptyCells, CSSPropertyID::kFloat,
     CSSPropertyID::kFontFamily, CSSPropertyID::kFontKerning,
-    CSSPropertyID::kFontSize, CSSPropertyID::kFontSizeAdjust,
-    CSSPropertyID::kFontStretch, CSSPropertyID::kFontStyle,
-    CSSPropertyID::kFontVariant, CSSPropertyID::kFontVariantLigatures,
-    CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariantNumeric,
-    CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontWeight,
-    CSSPropertyID::kHeight, CSSPropertyID::kImageOrientation,
-    CSSPropertyID::kImageRendering, CSSPropertyID::kIsolation,
-    CSSPropertyID::kJustifyItems, CSSPropertyID::kJustifySelf,
-    CSSPropertyID::kLeft, CSSPropertyID::kLetterSpacing,
-    CSSPropertyID::kLineHeight, CSSPropertyID::kLineHeightStep,
-    CSSPropertyID::kListStyleImage, CSSPropertyID::kListStylePosition,
-    CSSPropertyID::kListStyleType, CSSPropertyID::kMarginBottom,
-    CSSPropertyID::kMarginLeft, CSSPropertyID::kMarginRight,
-    CSSPropertyID::kMarginTop, CSSPropertyID::kMaxHeight,
-    CSSPropertyID::kMaxWidth, CSSPropertyID::kMinHeight,
-    CSSPropertyID::kMinWidth, CSSPropertyID::kMixBlendMode,
-    CSSPropertyID::kObjectFit, CSSPropertyID::kObjectPosition,
-    CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffsetDistance,
-    CSSPropertyID::kOffsetPath, CSSPropertyID::kOffsetPosition,
-    CSSPropertyID::kOffsetRotate, CSSPropertyID::kOpacity,
-    CSSPropertyID::kOrphans, CSSPropertyID::kOutlineColor,
-    CSSPropertyID::kOutlineOffset, CSSPropertyID::kOutlineStyle,
-    CSSPropertyID::kOutlineWidth, CSSPropertyID::kOverflowAnchor,
-    CSSPropertyID::kOverflowWrap, CSSPropertyID::kOverflowX,
-    CSSPropertyID::kOverflowY, CSSPropertyID::kPaddingBottom,
-    CSSPropertyID::kPaddingLeft, CSSPropertyID::kPaddingRight,
-    CSSPropertyID::kPaddingTop, CSSPropertyID::kPointerEvents,
-    CSSPropertyID::kPosition, CSSPropertyID::kResize, CSSPropertyID::kRight,
+    CSSPropertyID::kFontOpticalSizing, CSSPropertyID::kFontSize,
+    CSSPropertyID::kFontSizeAdjust, CSSPropertyID::kFontStretch,
+    CSSPropertyID::kFontStyle, CSSPropertyID::kFontVariant,
+    CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariantCaps,
+    CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariantEastAsian,
+    CSSPropertyID::kFontWeight, CSSPropertyID::kHeight,
+    CSSPropertyID::kImageOrientation, CSSPropertyID::kImageRendering,
+    CSSPropertyID::kIsolation, CSSPropertyID::kJustifyItems,
+    CSSPropertyID::kJustifySelf, CSSPropertyID::kLeft,
+    CSSPropertyID::kLetterSpacing, CSSPropertyID::kLineHeight,
+    CSSPropertyID::kLineHeightStep, CSSPropertyID::kListStyleImage,
+    CSSPropertyID::kListStylePosition, CSSPropertyID::kListStyleType,
+    CSSPropertyID::kMarginBottom, CSSPropertyID::kMarginLeft,
+    CSSPropertyID::kMarginRight, CSSPropertyID::kMarginTop,
+    CSSPropertyID::kMaxHeight, CSSPropertyID::kMaxWidth,
+    CSSPropertyID::kMinHeight, CSSPropertyID::kMinWidth,
+    CSSPropertyID::kMixBlendMode, CSSPropertyID::kObjectFit,
+    CSSPropertyID::kObjectPosition, CSSPropertyID::kOffsetAnchor,
+    CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffsetPath,
+    CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffsetRotate,
+    CSSPropertyID::kOpacity, CSSPropertyID::kOrphans,
+    CSSPropertyID::kOutlineColor, CSSPropertyID::kOutlineOffset,
+    CSSPropertyID::kOutlineStyle, CSSPropertyID::kOutlineWidth,
+    CSSPropertyID::kOverflowAnchor, CSSPropertyID::kOverflowWrap,
+    CSSPropertyID::kOverflowX, CSSPropertyID::kOverflowY,
+    CSSPropertyID::kPaddingBottom, CSSPropertyID::kPaddingLeft,
+    CSSPropertyID::kPaddingRight, CSSPropertyID::kPaddingTop,
+    CSSPropertyID::kPointerEvents, CSSPropertyID::kPosition,
+    CSSPropertyID::kResize, CSSPropertyID::kRight,
     CSSPropertyID::kScrollBehavior, CSSPropertyID::kScrollCustomization,
     CSSPropertyID::kSpeak, CSSPropertyID::kTableLayout, CSSPropertyID::kTabSize,
     CSSPropertyID::kTextAlign, CSSPropertyID::kTextAlignLast,
diff --git a/third_party/blink/renderer/core/css/css_font_face_source_test.cc b/third_party/blink/renderer/core/css/css_font_face_source_test.cc
index 9ef1fca..029b8ff9 100644
--- a/third_party/blink/renderer/core/css/css_font_face_source_test.cc
+++ b/third_party/blink/renderer/core/css/css_font_face_source_test.cc
@@ -51,10 +51,10 @@
 TEST(CSSFontFaceSourceTest, HashCollision) {
   DummyFontFaceSource font_face_source;
   // Even if the hash value collide, fontface cache should return different
-  // value for different fonts.
-  EXPECT_EQ(SimulateHashCalculation(6009), SimulateHashCalculation(8634));
-  EXPECT_NE(font_face_source.GetFontDataForSize(6009),
-            font_face_source.GetFontDataForSize(8634));
+  // value for different fonts, values determined experimentally.
+  EXPECT_EQ(SimulateHashCalculation(10280), SimulateHashCalculation(9875));
+  EXPECT_NE(font_face_source.GetFontDataForSize(10280),
+            font_face_source.GetFontDataForSize(9875));
 }
 
 // Exercises the size font_data_table_ assertions in CSSFontFaceSource.
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
index 755063b..e49b90b 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
+++ b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
@@ -754,6 +754,37 @@
 }
 
 template <>
+inline CSSIdentifierValue::CSSIdentifierValue(OpticalSizing optical_sizing)
+    : CSSValue(kIdentifierClass) {
+  switch (optical_sizing) {
+    case kAutoOpticalSizing:
+      value_id_ = CSSValueID::kAuto;
+      return;
+    case kNoneOpticalSizing:
+      value_id_ = CSSValueID::kNone;
+      return;
+  }
+
+  NOTREACHED();
+  value_id_ = CSSValueID::kAuto;
+}
+
+template <>
+inline OpticalSizing CSSIdentifierValue::ConvertTo() const {
+  switch (value_id_) {
+    case CSSValueID::kAuto:
+      return kAutoOpticalSizing;
+    case CSSValueID::kNone:
+      return kNoneOpticalSizing;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return kAutoOpticalSizing;
+}
+
+template <>
 inline CSSIdentifierValue::CSSIdentifierValue(EFillSizeType fill_size)
     : CSSValue(kIdentifierClass) {
   switch (fill_size) {
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index 69af89c..5fbd869 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -636,6 +636,17 @@
       typedom_types: ["Keyword"],
     },
     {
+      name: "font-optical-sizing",
+      property_methods: ["CSSValueFromComputedStyleInternal"],
+      inherited: true,
+      font: true,
+      name_for_methods: "FontOpticalSizing",
+      type_name: "OpticalSizing",
+      priority: "High",
+      keywords: ["auto", "none"],
+      typedom_types: ["Keyword"]
+    },
+    {
       name: "font-size",
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"],
       interpolable: true,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index 5578a01c..eecdcb0 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -886,6 +886,8 @@
     case CSSPropertyID::kFontKerning:
       return value_id == CSSValueID::kAuto || value_id == CSSValueID::kNormal ||
              value_id == CSSValueID::kNone;
+    case CSSPropertyID::kFontOpticalSizing:
+      return value_id == CSSValueID::kAuto || value_id == CSSValueID::kNone;
     case CSSPropertyID::kWebkitFontSmoothing:
       return value_id == CSSValueID::kAuto || value_id == CSSValueID::kNone ||
              value_id == CSSValueID::kAntialiased ||
@@ -1061,6 +1063,7 @@
     case CSSPropertyID::kFlexDirection:
     case CSSPropertyID::kFlexWrap:
     case CSSPropertyID::kFontKerning:
+    case CSSPropertyID::kFontOpticalSizing:
     case CSSPropertyID::kWebkitFontSmoothing:
     case CSSPropertyID::kLineBreak:
     case CSSPropertyID::kWebkitLineBreak:
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
index 6dc426b..4f40920 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -2560,6 +2560,15 @@
   return CSSIdentifierValue::Create(style.GetFontDescription().GetKerning());
 }
 
+const CSSValue* FontOpticalSizing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(
+      style.GetFontDescription().FontOpticalSizing());
+}
+
 const CSSValue* FontSizeAdjust::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
diff --git a/third_party/blink/renderer/core/css/remote_font_face_source.cc b/third_party/blink/renderer/core/css/remote_font_face_source.cc
index 681af8a..34bc02d 100644
--- a/third_party/blink/renderer/core/css/remote_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/remote_font_face_source.cc
@@ -252,8 +252,8 @@
           font_description.IsSyntheticBold(),
           font_description.IsSyntheticItalic(),
           font_description.GetFontSelectionRequest(),
-          font_selection_capabilities, font_description.Orientation(),
-          font_description.VariationSettings()),
+          font_selection_capabilities, font_description.FontOpticalSizing(),
+          font_description.Orientation(), font_description.VariationSettings()),
       CustomFontData::Create());
 }
 
diff --git a/third_party/blink/renderer/core/css/resolver/css_property_priority.h b/third_party/blink/renderer/core/css/resolver/css_property_priority.h
index 9664c0f77..a77173ac 100644
--- a/third_party/blink/renderer/core/css/resolver/css_property_priority.h
+++ b/third_party/blink/renderer/core/css/resolver/css_property_priority.h
@@ -87,7 +87,7 @@
 template <>
 inline CSSPropertyID CSSPropertyPriorityData<kHighPropertyPriority>::Last() {
   static_assert(static_cast<int>(CSSPropertyID::kZoom) ==
-                    static_cast<int>(CSSPropertyID::kColor) + 26,
+                    static_cast<int>(CSSPropertyID::kColor) + 27,
                 "CSSPropertyID::kZoom should be the end of the high priority "
                 "property range");
   static_assert(static_cast<int>(CSSPropertyID::kWritingMode) ==
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.cc b/third_party/blink/renderer/core/css/resolver/font_builder.cc
index 4e22eb67..f71b93b 100644
--- a/third_party/blink/renderer/core/css/resolver/font_builder.cc
+++ b/third_party/blink/renderer/core/css/resolver/font_builder.cc
@@ -182,6 +182,12 @@
   font_description_.SetKerning(kerning);
 }
 
+void FontBuilder::SetFontOpticalSizing(OpticalSizing font_optical_sizing) {
+  Set(PropertySetFlag::kFontOpticalSizing);
+
+  font_description_.SetFontOpticalSizing(font_optical_sizing);
+}
+
 void FontBuilder::SetFontSmoothing(FontSmoothingMode foont_smoothing_mode) {
   Set(PropertySetFlag::kFontSmoothing);
 
@@ -380,6 +386,8 @@
     description.SetTextRendering(font_description_.TextRendering());
   if (IsSet(PropertySetFlag::kKerning))
     description.SetKerning(font_description_.GetKerning());
+  if (IsSet(PropertySetFlag::kFontOpticalSizing))
+    description.SetFontOpticalSizing(font_description_.FontOpticalSizing());
   if (IsSet(PropertySetFlag::kFontSmoothing))
     description.SetFontSmoothing(font_description_.FontSmoothing());
   if (IsSet(PropertySetFlag::kTextOrientation) ||
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.h b/third_party/blink/renderer/core/css/resolver/font_builder.h
index ddb0bb87..2021eb1 100644
--- a/third_party/blink/renderer/core/css/resolver/font_builder.h
+++ b/third_party/blink/renderer/core/css/resolver/font_builder.h
@@ -72,6 +72,7 @@
   void SetVariantNumeric(const FontVariantNumeric&);
   void SetTextRendering(TextRenderingMode);
   void SetKerning(FontDescription::Kerning);
+  void SetFontOpticalSizing(OpticalSizing);
   void SetFontSmoothing(FontSmoothingMode);
   void SetVariationSettings(scoped_refptr<FontVariationSettings>);
 
@@ -114,6 +115,7 @@
   static FontDescription::Kerning InitialKerning() {
     return FontDescription::kAutoKerning;
   }
+  static OpticalSizing InitialFontOpticalSizing() { return kAutoOpticalSizing; }
   static FontSmoothingMode InitialFontSmoothing() { return kAutoSmoothing; }
 
   static FontSelectionValue InitialStretch() { return NormalWidthValue(); }
@@ -156,6 +158,7 @@
     kVariationSettings,
     kTextRendering,
     kKerning,
+    kFontOpticalSizing,
     kFontSmoothing,
 
     kEffectiveZoom,
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder_test.cc b/third_party/blink/renderer/core/css/resolver/font_builder_test.cc
index a5fc0b5..076628b 100644
--- a/third_party/blink/renderer/core/css/resolver/font_builder_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/font_builder_test.cc
@@ -167,6 +167,13 @@
   b.SetKerning(FontDescription::kNoneKerning);
 }
 
+static void FontOpticalSizingBase(FontDescription& d) {
+  d.SetFontOpticalSizing(kAutoOpticalSizing);
+}
+static void FontOpticalSizingValue(FontBuilder& b) {
+  b.SetFontOpticalSizing(kNoneOpticalSizing);
+}
+
 static void FontFontSmoothingBase(FontDescription& d) {
   d.SetFontSmoothing(kAntialiased);
 }
@@ -207,6 +214,7 @@
         FunctionPair(FontKerningBase, FontKerningValue),
         FunctionPair(FontFontSmoothingBase, FontFontSmoothingValue),
         FunctionPair(FontSizeBase, FontSizeValue),
-        FunctionPair(FontScriptBase, FontScriptValue)));
+        FunctionPair(FontScriptBase, FontScriptValue),
+        FunctionPair(FontOpticalSizingBase, FontOpticalSizingValue)));
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index dead088..d98f2b106 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1402,6 +1402,7 @@
     case CSSPropertyID::kFontFamily:
     case CSSPropertyID::kFontFeatureSettings:
     case CSSPropertyID::kFontKerning:
+    case CSSPropertyID::kFontOpticalSizing:
     case CSSPropertyID::kFontSize:
     case CSSPropertyID::kFontSizeAdjust:
     case CSSPropertyID::kFontStretch:
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 1dc588e0..c40a780 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -497,55 +497,57 @@
 }
 
 void LocalFrame::DidFreeze() {
-  if (GetDocument()) {
-    if (GetDocument()->GetResourceCoordinator() &&
-        !RuntimeEnabledFeatures::BackForwardCacheEnabled()) {
-      // TODO(yuzus): Skip this block if DidFreeze is triggered by bfcache.
+  DCHECK(IsAttached());
+  auto* document_resource_coordinator = GetDocument()->GetResourceCoordinator();
+  if (document_resource_coordinator &&
+      !RuntimeEnabledFeatures::BackForwardCacheEnabled()) {
+    // TODO(yuzus): Skip this block if DidFreeze is triggered by bfcache.
 
-      // Determine if there is a beforeunload handler by dispatching a
-      // beforeunload that will *not* launch a user dialog. If
-      // |proceed| is false then there is a non-empty beforeunload
-      // handler indicating potentially unsaved user state.
-      bool unused_did_allow_navigation = false;
-      bool proceed = GetDocument()->DispatchBeforeUnloadEvent(
-          nullptr, false /* is_reload */, unused_did_allow_navigation);
-      // Running the beforeunload event may invalidate the
-      // DocumentResourceCoordinator. Because of that, it can't be stored in a
-      // local variable that is reused throughout the method.
-      // https://crbug.com/991380.
-      auto* document_resource_coordinator =
-          GetDocument()->GetResourceCoordinator();
-      if (document_resource_coordinator)
-        document_resource_coordinator->SetHasNonEmptyBeforeUnload(!proceed);
-    }
+    // Determine if there is a beforeunload handler by dispatching a
+    // beforeunload that will *not* launch a user dialog. If
+    // |proceed| is false then there is a non-empty beforeunload
+    // handler indicating potentially unsaved user state.
+    bool unused_did_allow_navigation = false;
+    bool proceed = GetDocument()->DispatchBeforeUnloadEvent(
+        nullptr, false /* is_reload */, unused_did_allow_navigation);
 
-    GetDocument()->DispatchFreezeEvent();
-    // TODO(fmeawad): Move the following logic to the page once we have a
-    // PageResourceCoordinator in Blink. http://crbug.com/838415
-    if (auto* document_resource_coordinator =
-            GetDocument()->GetResourceCoordinator()) {
-      document_resource_coordinator->SetLifecycleState(
-          resource_coordinator::mojom::LifecycleState::kFrozen);
-    }
+    // DispatchBeforeUnloadEvent dispatches JS events, which may detatch |this|.
+    if (!IsAttached())
+      return;
+    document_resource_coordinator->SetHasNonEmptyBeforeUnload(!proceed);
+  }
+
+  GetDocument()->DispatchFreezeEvent();
+  // DispatchFreezeEvent dispatches JS events, which may detatch |this|.
+  if (!IsAttached())
+    return;
+  // TODO(fmeawad): Move the following logic to the page once we have a
+  // PageResourceCoordinator in Blink. http://crbug.com/838415
+  if (document_resource_coordinator) {
+    document_resource_coordinator->SetLifecycleState(
+        resource_coordinator::mojom::LifecycleState::kFrozen);
   }
 }
 
 void LocalFrame::DidResume() {
-  if (GetDocument()) {
-    const base::TimeTicks resume_event_start = base::TimeTicks::Now();
-    GetDocument()->DispatchEvent(*Event::Create(event_type_names::kResume));
-    const base::TimeTicks resume_event_end = base::TimeTicks::Now();
-    DEFINE_STATIC_LOCAL(
-        CustomCountHistogram, resume_histogram,
-        ("DocumentEventTiming.ResumeDuration", 0, 10000000, 50));
-    resume_histogram.CountMicroseconds(resume_event_end - resume_event_start);
-    // TODO(fmeawad): Move the following logic to the page once we have a
-    // PageResourceCoordinator in Blink
-    if (auto* document_resource_coordinator =
-            GetDocument()->GetResourceCoordinator()) {
-      document_resource_coordinator->SetLifecycleState(
-          resource_coordinator::mojom::LifecycleState::kRunning);
-    }
+  DCHECK(IsAttached());
+  const base::TimeTicks resume_event_start = base::TimeTicks::Now();
+  GetDocument()->DispatchEvent(*Event::Create(event_type_names::kResume));
+  const base::TimeTicks resume_event_end = base::TimeTicks::Now();
+  DEFINE_STATIC_LOCAL(CustomCountHistogram, resume_histogram,
+                      ("DocumentEventTiming.ResumeDuration", 0, 10000000, 50));
+  resume_histogram.CountMicroseconds(resume_event_end - resume_event_start);
+
+  // DispatchEvent dispatchs JS events, which may detatch |this|.
+  if (!IsAttached())
+    return;
+
+  // TODO(fmeawad): Move the following logic to the page once we have a
+  // PageResourceCoordinator in Blink
+  if (auto* document_resource_coordinator =
+          GetDocument()->GetResourceCoordinator()) {
+    document_resource_coordinator->SetLifecycleState(
+        resource_coordinator::mojom::LifecycleState::kRunning);
   }
 }
 
@@ -1700,19 +1702,15 @@
 }
 
 void LocalFrame::PauseContext() {
-  if (Document* document = GetDocument()) {
-    document->Fetcher()->SetDefersLoading(true);
-    document->SetLifecycleState(lifecycle_state_);
-  }
+  GetDocument()->Fetcher()->SetDefersLoading(true);
+  GetDocument()->SetLifecycleState(lifecycle_state_);
   Loader().SetDefersLoading(true);
   GetFrameScheduler()->SetPaused(true);
 }
 
 void LocalFrame::UnpauseContext() {
-  if (Document* document = GetDocument()) {
-    document->Fetcher()->SetDefersLoading(false);
-    document->SetLifecycleState(mojom::FrameLifecycleState::kRunning);
-  }
+  GetDocument()->Fetcher()->SetDefersLoading(false);
+  GetDocument()->SetLifecycleState(mojom::FrameLifecycleState::kRunning);
   Loader().SetDefersLoading(false);
   GetFrameScheduler()->SetPaused(false);
 }
@@ -1750,7 +1748,7 @@
   if (freeze) {
     if (lifecycle_state_ != mojom::FrameLifecycleState::kPaused) {
       DidFreeze();
-      // DidFreeze can dispatch JS events, causing |this| to be detached.
+      // DidFreeze can dispatch JS events, which may detatch |this|.
       if (!IsAttached())
         return;
     }
@@ -1759,13 +1757,12 @@
     UnpauseContext();
     if (old_state != mojom::FrameLifecycleState::kPaused) {
       DidResume();
-      // DidResume can dispatch JS events, causing |this| to be detached.
+      // DidResume can dispatch JS events, which may detatch |this|.
       if (!IsAttached())
         return;
     }
   }
-  if (Client())
-    Client()->LifecycleStateChanged(state);
+  Client()->LifecycleStateChanged(state);
 }
 
 void LocalFrame::MaybeLogAdClickNavigation() {
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 690a1687..39e1716 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -72,10 +72,12 @@
 
   const KURL& url = frame_request.GetResourceRequest().Url();
   if (!frame_request.CanDisplay(url)) {
-    frame_request.OriginDocument()->AddConsoleMessage(ConsoleMessage::Create(
-        mojom::ConsoleMessageSource::kSecurity,
-        mojom::ConsoleMessageLevel::kError,
-        "Not allowed to load local resource: " + url.ElidedString()));
+    if (frame_request.OriginDocument()) {
+      frame_request.OriginDocument()->AddConsoleMessage(ConsoleMessage::Create(
+          mojom::ConsoleMessageSource::kSecurity,
+          mojom::ConsoleMessageLevel::kError,
+          "Not allowed to load local resource: " + url.ElidedString()));
+    }
     return;
   }
 
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 58a60cf..531238ce 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -104,6 +104,7 @@
 // It is in an invalid range (outside 0.0 - 1.0) so that it will not be
 // misinterpreted as a user-input value
 constexpr int kUndefinedQualityValue = -1.0;
+constexpr int kMinimumAccelerated2dCanvasSize = 128 * 129;
 
 }  // namespace
 
@@ -1021,6 +1022,18 @@
     return false;
   }
 
+  // Webview crashes with accelerated small canvases TODO(crbug.com/1004304)
+  if (!RuntimeEnabledFeatures::AcceleratedSmallCanvasesEnabled()) {
+    base::CheckedNumeric<int> checked_canvas_pixel_count =
+        Size().Width() * Size().Height();
+    if (!checked_canvas_pixel_count.IsValid())
+      return false;
+    int canvas_pixel_count = checked_canvas_pixel_count.ValueOrDie();
+
+    if (canvas_pixel_count < kMinimumAccelerated2dCanvasSize)
+      return false;
+  }
+
   // The following is necessary for handling the special case of canvases in
   // the dev tools overlay, which run in a process that supports accelerated
   // 2d canvas but in a special compositing context that does not.
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index afc7f2d..6717ede0 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -254,6 +254,16 @@
     initiator_origin_trial_features_.push_back(
         static_cast<OriginTrialFeature>(feature));
   }
+
+  // For back/forward navigations, the browser passed a history item to use at
+  // commit time in |params_|. Set it as the current history item of this
+  // DocumentLoader. For other navigations, |history_item_| will be created when
+  // the FrameLoader calls SetHistoryItemStateForCommit.
+  if (IsBackForwardLoadType(params_->frame_load_type)) {
+    HistoryItem* history_item = params_->history_item;
+    DCHECK(history_item);
+    history_item_ = history_item;
+  }
 }
 
 FrameLoader& DocumentLoader::GetFrameLoader() const {
@@ -708,14 +718,6 @@
   DCHECK(!GetTiming().FetchStart().is_null());
   redirect_chain_.push_back(url_);
   GetTiming().AddRedirect(current_request_url, url_);
-
-  // If a redirection happens during a back/forward navigation, don't restore
-  // any state from the old HistoryItem. There is a provisional history item for
-  // back/forward navigation only. In the other case, clearing it is a no-op.
-  history_item_.Clear();
-
-  // TODO(creis): Determine if we need to clear any history state
-  // in embedder to fix https://crbug.com/671276.
 }
 
 bool DocumentLoader::ShouldReportTimingInfoToParent() {
@@ -829,22 +831,6 @@
     frame_->Owner()->RenderFallbackContent(frame_);
 }
 
-void DocumentLoader::PrepareForNavigationCommit() {
-  if (state_ != kProvisional)
-    return;
-
-  // Set history state before commitProvisionalLoad() so that we still have
-  // access to the previous committed DocumentLoader's HistoryItem, in case we
-  // need to copy state from it.
-  if (!GetFrameLoader().StateMachine()->CreatingInitialEmptyDocument()) {
-    SetHistoryItemStateForCommit(
-        GetFrameLoader().GetDocumentLoader()->GetHistoryItem(), load_type_,
-        HistoryNavigationType::kDifferentDocument);
-  }
-
-  DCHECK_EQ(state_, kProvisional);
-}
-
 void DocumentLoader::FinishNavigationCommit(const AtomicString& mime_type,
                                             const KURL& overriding_url) {
   const AtomicString& encoding = GetResponse().TextEncodingName();
@@ -1152,7 +1138,6 @@
 
   if (loading_url_as_empty_document_) {
     InitializeEmptyResponse();
-    PrepareForNavigationCommit();
     return;
   }
 
@@ -1262,7 +1247,6 @@
       // TODO(clamy): Simplify this code path.
       FinalizeMHTMLArchiveLoad();
     }
-    PrepareForNavigationCommit();
     return;
   }
 
@@ -1270,8 +1254,6 @@
 
   if (defers_loading_)
     body_loader_->SetDefersLoading(true);
-
-  PrepareForNavigationCommit();
 }
 
 void DocumentLoader::StartLoadingResponse() {
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
index 684fc13ea1..a6b84c16 100644
--- a/third_party/blink/renderer/core/loader/document_loader.h
+++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -183,7 +183,6 @@
     navigation_type_ = navigation_type;
   }
 
-  void SetItemForHistoryNavigation(HistoryItem* item) { history_item_ = item; }
   HistoryItem* GetHistoryItem() const { return history_item_; }
 
   void StartLoading();
@@ -303,6 +302,16 @@
   // day though.
   void UpdateUrlForDocumentOpen(const KURL& url) { url_ = url; }
 
+  enum class HistoryNavigationType {
+    kDifferentDocument,
+    kFragment,
+    kHistoryApi
+  };
+
+  void SetHistoryItemStateForCommit(HistoryItem* old_item,
+                                    WebFrameLoadType,
+                                    HistoryNavigationType);
+
  protected:
   Vector<KURL> redirect_chain_;
 
@@ -331,7 +340,6 @@
   void WillCommitNavigation();
   void DidCommitNavigation(GlobalObjectReusePolicy);
 
-  void PrepareForNavigationCommit();
   void FinishNavigationCommit(const AtomicString& mime_type,
                               const KURL& overriding_url = KURL());
 
@@ -358,15 +366,6 @@
   void FinishedLoading(base::TimeTicks finish_time);
   void CancelLoadAfterCSPDenied(const ResourceResponse&);
 
-  enum class HistoryNavigationType {
-    kDifferentDocument,
-    kFragment,
-    kHistoryApi
-  };
-  void SetHistoryItemStateForCommit(HistoryItem* old_item,
-                                    WebFrameLoadType,
-                                    HistoryNavigationType);
-
   void FinalizeMHTMLArchiveLoad();
   void HandleRedirect(const KURL& current_request_url);
   void HandleResponse();
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 9b44389..c4893182 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -906,11 +906,12 @@
       navigation_params->frame_load_type,
       !navigation_params->http_body.IsNull(), false /* have_event */);
 
-  HistoryItem* history_item = nullptr;
-  if (IsBackForwardLoadType(navigation_params->frame_load_type)) {
-    history_item = navigation_params->history_item;
-    DCHECK(history_item);
-  }
+  // Keep track of the current Document HistoryItem as the new DocumentLoader
+  // might need to copy state from it. Note that the current DocumentLoader
+  // should always exist, as the initial empty document is committed through
+  // FrameLoader::Init.
+  DCHECK(!StateMachine()->CreatingInitialEmptyDocument());
+  HistoryItem* previous_history_item = GetDocumentLoader()->GetHistoryItem();
 
   base::Optional<Document::UnloadEventTiming> unload_timing;
   scoped_refptr<SecurityOrigin> security_origin =
@@ -924,8 +925,6 @@
 
   {
     base::AutoReset<bool> scoped_committing(&committing_navigation_, true);
-    if (history_item)
-      provisional_document_loader->SetItemForHistoryNavigation(history_item);
     if (is_javascript_url)
       provisional_document_loader->SetLoadingJavaScriptUrl();
 
@@ -948,6 +947,14 @@
 
   std::move(call_before_attaching_new_document).Run();
 
+  // Following the call to StartLoading, the provisional DocumentLoader state
+  // has taken into account all redirects that happened during navigation. Its
+  // HistoryItem can be properly updated for the commit, using the HistoryItem
+  // of the previous Document.
+  provisional_document_loader_->SetHistoryItemStateForCommit(
+      previous_history_item, provisional_document_loader_->LoadType(),
+      DocumentLoader::HistoryNavigationType::kDifferentDocument);
+
   CommitDocumentLoader(provisional_document_loader_.Release(), unload_timing);
 
   // Load the document if needed.
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc
index ac8e3581..9cd4d60 100644
--- a/third_party/blink/renderer/core/page/drag_controller.cc
+++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -284,8 +284,6 @@
     return;
   }
 
-  document_under_mouse_ = nullptr;
-
   if (OperationForLoad(drag_data, local_root) != kDragOperationNone) {
     if (page_->GetSettings().GetNavigateOnDragDrop()) {
       ResourceRequest resource_request(drag_data->AsURL());
@@ -315,6 +313,8 @@
     // be sending these events. crbug.com/748243.
     local_root.GetEventHandler().ClearDragState();
   }
+
+  document_under_mouse_ = nullptr;
 }
 
 void DragController::MouseMovedIntoDocument(Document* new_document) {
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
index 9c134b0..ee0926e3 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
@@ -1319,6 +1319,102 @@
       << LayoutViewport()->GetScrollOffset().ToString();
 }
 
+// Test that we don't match partial words at the beginning or end of the text.
+TEST_F(TextFragmentAnchorTest, CheckForWordBoundary) {
+  SimRequest request(
+      "https://example.com/"
+      "test.html#targetText=This%20is%20a%20te&tagetText=st%20page",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#targetText=This%20is%20a%20te&tagetText=st%20page");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body {
+        height: 1200px;
+      }
+      p {
+        position: absolute;
+        top: 1000px;
+      }
+    </style>
+    <p id="text">This is a test page</p>
+  )HTML");
+  Compositor().BeginFrame();
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(ScrollOffset(), LayoutViewport()->GetScrollOffset());
+  EXPECT_TRUE(GetDocument().Markers().Markers().IsEmpty());
+}
+
+// Test that we don't match partial words with context
+TEST_F(TextFragmentAnchorTest, CheckForWordBoundaryWithContext) {
+  SimRequest request("https://example.com/test.html#targetText=est-,page",
+                     "text/html");
+  LoadURL("https://example.com/test.html#targetText=est-,page");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body {
+        height: 1200px;
+      }
+      p {
+        position: absolute;
+        top: 1000px;
+      }
+    </style>
+    <p id="text">This is a test page</p>
+  )HTML");
+  Compositor().BeginFrame();
+  RunAsyncMatchingTasks();
+
+  EXPECT_EQ(ScrollOffset(), LayoutViewport()->GetScrollOffset());
+  EXPECT_TRUE(GetDocument().Markers().Markers().IsEmpty());
+}
+
+// Test that we correctly match a whole word when it appears as a partial word
+// earlier in the page.
+TEST_F(TextFragmentAnchorTest, CheckForWordBoundaryWithPartialWord) {
+  SimRequest request("https://example.com/test.html#targetText=tes,age",
+                     "text/html");
+  LoadURL("https://example.com/test.html#targetText=tes,age");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      body {
+        height: 1200px;
+      }
+      #first {
+        position: absolute;
+        top: 1000px;
+      }
+      #second {
+        position: absolute;
+        top: 2000px;
+      }
+    </style>
+    <p id="first">This is a test page</p>
+    <p id="second">This is a tes age</p>
+  )HTML");
+  Compositor().BeginFrame();
+  RunAsyncMatchingTasks();
+
+  Element& p = *GetDocument().getElementById("second");
+
+  EXPECT_TRUE(ViewportRect().Contains(BoundingRectInFrame(p)))
+      << "Should have scrolled <p> into view but didn't, scroll offset: "
+      << LayoutViewport()->GetScrollOffset().ToString();
+
+  // Expect marker on only "tes age"
+  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
+  DocumentMarkerVector markers = GetDocument().Markers().MarkersFor(
+      *To<Text>(p.firstChild()), DocumentMarker::MarkerTypes::TextMatch());
+  ASSERT_EQ(1u, markers.size());
+  EXPECT_EQ(10u, markers.at(0)->StartOffset());
+  EXPECT_EQ(17u, markers.at(0)->EndOffset());
+}
+
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
index edca62e..9e632ab8 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_finder.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/core/editing/iterators/character_iterator.h"
 #include "third_party/blink/renderer/core/editing/position.h"
 #include "third_party/blink/renderer/core/page/scrolling/text_fragment_selector.h"
+#include "third_party/blink/renderer/platform/text/text_boundaries.h"
 
 namespace blink {
 
@@ -22,12 +23,54 @@
 
 const char kNoContext[] = "";
 
+// Determines whether the start and end positions of |range| are on word
+// boundaries.
+// TODO(crbug/924965): Determine how this should check node boundaries. This
+// treats node boundaries as word boundaries, for example "o" is a whole word
+// match in "f<i>o</i>o".
+bool IsWholeWordMatch(EphemeralRangeInFlatTree range) {
+  wtf_size_t start_position = range.StartPosition().OffsetInContainerNode();
+
+  if (start_position != 0) {
+    String start_text = range.StartPosition().AnchorNode()->textContent();
+    start_text.Ensure16Bit();
+    wtf_size_t word_start = FindWordStartBoundary(
+        start_text.Characters16(), start_text.length(), start_position);
+    if (word_start != start_position)
+      return false;
+  }
+
+  wtf_size_t end_position = range.EndPosition().OffsetInContainerNode();
+  String end_text = range.EndPosition().AnchorNode()->textContent();
+
+  if (end_position != end_text.length()) {
+    end_text.Ensure16Bit();
+    // We expect end_position to be a word boundary, and FindWordEndBoundary
+    // finds the next word boundary, so start from end_position - 1.
+    wtf_size_t word_end = FindWordEndBoundary(
+        end_text.Characters16(), end_text.length(), end_position - 1);
+    if (word_end != end_position)
+      return false;
+  }
+
+  return true;
+}
+
 EphemeralRangeInFlatTree FindMatchInRange(String search_text,
                                           PositionInFlatTree search_start,
                                           PositionInFlatTree search_end) {
-  const EphemeralRangeInFlatTree search_range(search_start, search_end);
-  return FindBuffer::FindMatchInRange(search_range, search_text,
-                                      kCaseInsensitive);
+  while (search_start < search_end) {
+    const EphemeralRangeInFlatTree search_range(search_start, search_end);
+    EphemeralRangeInFlatTree potential_match = FindBuffer::FindMatchInRange(
+        search_range, search_text, kCaseInsensitive);
+
+    if (potential_match.IsNull() || IsWholeWordMatch(potential_match))
+      return potential_match;
+
+    search_start = potential_match.EndPosition();
+  }
+
+  return EphemeralRangeInFlatTree();
 }
 
 PositionInFlatTree NextTextPosition(PositionInFlatTree position,
@@ -58,12 +101,18 @@
 
   FindBuffer buffer(EphemeralRangeInFlatTree(search_start, search_end));
 
+  // TODO(nburris): FindBuffer will search the rest of the document for a match,
+  // but we only need to check for an immediate match, so we should stop
+  // searching if there's no immediate match.
   std::unique_ptr<FindBuffer::Results> match_results =
       buffer.FindMatches(search_text, kCaseInsensitive);
 
   if (!match_results->IsEmpty() && match_results->front().start == 0u) {
-    FindBuffer::BufferMatchResult match = match_results->front();
-    return buffer.RangeFromBufferIndex(match.start, match.start + match.length);
+    FindBuffer::BufferMatchResult buffer_match = match_results->front();
+    EphemeralRangeInFlatTree match = buffer.RangeFromBufferIndex(
+        buffer_match.start, buffer_match.start + buffer_match.length);
+    if (IsWholeWordMatch(match))
+      return match;
   }
 
   return EphemeralRangeInFlatTree();
diff --git a/third_party/blink/renderer/devtools/.eslintrc.js b/third_party/blink/renderer/devtools/.eslintrc.js
index 10cc7cb..401bb011 100644
--- a/third_party/blink/renderer/devtools/.eslintrc.js
+++ b/third_party/blink/renderer/devtools/.eslintrc.js
@@ -7,7 +7,8 @@
     },
 
     "parserOptions": {
-        "ecmaVersion": 9
+        "ecmaVersion": 9,
+        "sourceType": "module"
     },
 
     /**
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 917c44c..3b9d6d3 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -786,7 +786,6 @@
   "front_end/toolbox.js",
   "front_end/toolbox.json",
   "front_end/ui/ActionRegistry.js",
-  "front_end/ui/ARIAUtils.js",
   "front_end/ui/checkboxTextLabel.css",
   "front_end/ui/closeButton.css",
   "front_end/ui/confirmDialog.css",
@@ -958,6 +957,12 @@
 
 all_devtools_files += lighthouse_locale_files
 
+all_devtools_modules = [
+  "front_end/root.js",
+  "front_end/ui/ARIAUtils.js",
+  "front_end/ui/UI.js",
+]
+
 devtools_test_files = [
   "//third_party/axe-core/axe.js",
   "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
@@ -1149,6 +1154,12 @@
   "front_end/worker_app.html",
 ]
 
+copied_devtools_modules = [
+  "$resources_out_dir/root.js",
+  "$resources_out_dir/ui/ARIAUtils.js",
+  "$resources_out_dir/ui/UI.js",
+]
+
 generated_applications = [
   "$resources_out_dir/audits_worker.js",
   "$resources_out_dir/devtools_app.html",
@@ -1267,7 +1278,7 @@
 visibility = [ "//third_party/blink/*" ]
 
 group("devtools_all_files") {
-  data = all_devtools_files
+  data = all_devtools_files + all_devtools_modules
   deps = [
     ":devtools_frontend_resources_data",
   ]
@@ -1284,6 +1295,7 @@
   ":devtools_extension_api",
   ":frontend_protocol_sources",
   ":supported_css_properties",
+  ":copy_devtools_modules",
 ]
 
 if (debug_devtools) {
@@ -1348,8 +1360,8 @@
   ]
 
   grd_files =
-      generated_applications + generated_non_autostart_non_remote_modules +
-      devtools_embedder_scripts +
+      all_devtools_modules + generated_applications +
+      generated_non_autostart_non_remote_modules + devtools_embedder_scripts +
       [ "$resources_out_dir/devtools_extension_api.js" ]
 
   # Bundle remote modules in ChromeOS.
@@ -1468,6 +1480,24 @@
          ]
 }
 
+action("copy_devtools_modules") {
+  script = "scripts/build/copy_devtools_modules.py"
+
+  deps = [
+    ":build_release_devtools",
+  ]
+
+  inputs = all_devtools_modules
+  outputs = copied_devtools_modules
+
+  args = all_devtools_modules + [
+           "--input_path",
+           rebase_path(".", root_build_dir),
+           "--output_path",
+           rebase_path(resources_out_dir, root_build_dir),
+         ]
+}
+
 if (debug_devtools) {
   resources_out_debug_dir = "$root_out_dir/resources/inspector/debug"
 
diff --git a/third_party/blink/renderer/devtools/PRESUBMIT.py b/third_party/blink/renderer/devtools/PRESUBMIT.py
index 1166bdb..4768b66 100644
--- a/third_party/blink/renderer/devtools/PRESUBMIT.py
+++ b/third_party/blink/renderer/devtools/PRESUBMIT.py
@@ -78,8 +78,8 @@
     # Use eslint to autofix the braces.
     # Also fix semicolon to avoid confusing clang-format.
     eslint_process = popen([
-        local_node.node_path(), local_node.eslint_path(),
-        '--no-eslintrc', '--fix', '--env=es6', '--parser-options=ecmaVersion:9',
+        local_node.node_path(),
+        local_node.eslint_path(), '--no-eslintrc', '--fix', '--env=es6', '--parser-options=ecmaVersion:9,sourceType:module',
         '--rule={"curly": [2, "multi-or-nest", "consistent"], "semi": 2}'
     ] + affected_files)
     eslint_process.communicate()
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js b/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
index a8a61db6..3bfb476 100644
--- a/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
+++ b/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
@@ -76,7 +76,7 @@
   _populateListItem() {
     this.listItemElement.removeChildren();
     this.appendNameElement(this._attribute.name);
-    this.listItemElement.createChild('span', 'separator').textContent = ':\u00A0';
+    this.listItemElement.createChild('span', 'separator').textContent = ':\xA0';
     this.appendAttributeValueElement(this._attribute.value);
   }
 
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/AXBreadcrumbsPane.js b/third_party/blink/renderer/devtools/front_end/accessibility/AXBreadcrumbsPane.js
index 9075c5e..fc4f696 100644
--- a/third_party/blink/renderer/devtools/front_end/accessibility/AXBreadcrumbsPane.js
+++ b/third_party/blink/renderer/devtools/front_end/accessibility/AXBreadcrumbsPane.js
@@ -327,7 +327,7 @@
     } else {
       this._appendRoleElement(this._axNode.role());
       if (this._axNode.name() && this._axNode.name().value) {
-        this._nodeWrapper.createChild('span', 'separator').textContent = '\u00A0';
+        this._nodeWrapper.createChild('span', 'separator').textContent = '\xA0';
         this._appendNameElement(/** @type {string} */ (this._axNode.name().value));
       }
     }
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js
index 28996aa..56d37a4 100644
--- a/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js
+++ b/third_party/blink/renderer/devtools/front_end/accessibility/AccessibilityNodeView.js
@@ -289,7 +289,7 @@
 
     this.appendNameElement(this._property.name);
 
-    this.listItemElement.createChild('span', 'separator').textContent = ':\u00A0';
+    this.listItemElement.createChild('span', 'separator').textContent = ':\xA0';
 
     this.appendValueElement(this._property.value);
   }
@@ -428,14 +428,14 @@
 
     this.appendSourceNameElement(this._source);
 
-    this.listItemElement.createChild('span', 'separator').textContent = ':\u00a0';
+    this.listItemElement.createChild('span', 'separator').textContent = ':\xA0';
 
     if (this._source.attributeValue) {
       this.appendValueElement(this._source.attributeValue);
-      this.listItemElement.createTextChild('\u00a0');
+      this.listItemElement.createTextChild('\xA0');
     } else if (this._source.nativeSourceValue) {
       this.appendValueElement(this._source.nativeSourceValue);
-      this.listItemElement.createTextChild('\u00a0');
+      this.listItemElement.createTextChild('\xA0');
       if (this._source.value)
         this.appendValueElement(this._source.value);
     } else if (this._source.value) {
@@ -547,10 +547,10 @@
     let reasonElement = null;
     switch (reason) {
       case 'activeModalDialog':
-        reasonElement = UI.formatLocalized('Element is hidden by active modal dialog:\u00a0', []);
+        reasonElement = UI.formatLocalized('Element is hidden by active modal dialog:\xA0', []);
         break;
       case 'ancestorIsLeafNode':
-        reasonElement = UI.formatLocalized('Ancestor\'s children are all presentational:\u00a0', []);
+        reasonElement = UI.formatLocalized('Ancestor\'s children are all presentational:\xA0', []);
         break;
       case 'ariaHiddenElement': {
         const ariaHiddenSpan = createElement('span', 'source-code').textContent = 'aria-hidden';
@@ -560,7 +560,7 @@
       case 'ariaHiddenSubtree': {
         const ariaHiddenSpan = createElement('span', 'source-code').textContent = 'aria-hidden';
         const trueSpan = createElement('span', 'source-code').textContent = 'true';
-        reasonElement = UI.formatLocalized('%s is %s on ancestor:\u00a0', [ariaHiddenSpan, trueSpan]);
+        reasonElement = UI.formatLocalized('%s is %s on ancestor:\xA0', [ariaHiddenSpan, trueSpan]);
         break;
       }
       case 'emptyAlt':
@@ -573,16 +573,16 @@
         reasonElement = UI.formatLocalized('Element is inert.', []);
         break;
       case 'inertSubtree':
-        reasonElement = UI.formatLocalized('Element is in an inert subtree from\u00a0', []);
+        reasonElement = UI.formatLocalized('Element is in an inert subtree from\xA0', []);
         break;
       case 'inheritsPresentation':
-        reasonElement = UI.formatLocalized('Element inherits presentational role from\u00a0', []);
+        reasonElement = UI.formatLocalized('Element inherits presentational role from\xA0', []);
         break;
       case 'labelContainer':
-        reasonElement = UI.formatLocalized('Part of label element:\u00a0', []);
+        reasonElement = UI.formatLocalized('Part of label element:\xA0', []);
         break;
       case 'labelFor':
-        reasonElement = UI.formatLocalized('Label for\u00a0', []);
+        reasonElement = UI.formatLocalized('Label for\xA0', []);
         break;
       case 'notRendered':
         reasonElement = UI.formatLocalized('Element is not rendered.', []);
@@ -599,7 +599,7 @@
         reasonElement = UI.formatLocalized('Element is presentational.', []);
         break;
       case 'staticTextUsedAsNameFor':
-        reasonElement = UI.formatLocalized('Static text node is used as name for\u00a0', []);
+        reasonElement = UI.formatLocalized('Static text node is used as name for\xA0', []);
         break;
       case 'uninteresting':
         reasonElement = UI.formatLocalized('Element not interesting for accessibility.', []);
diff --git a/third_party/blink/renderer/devtools/front_end/devtools_app.html b/third_party/blink/renderer/devtools/front_end/devtools_app.html
index 81b6645..2460c329 100644
--- a/third_party/blink/renderer/devtools/front_end/devtools_app.html
+++ b/third_party/blink/renderer/devtools/front_end/devtools_app.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="devtools_app.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="devtools_app.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js b/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
index 7cce4f80..3c67b1b 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
+++ b/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
@@ -1455,9 +1455,9 @@
  * @type {!Object.<string, string>}
  */
 Elements.ElementsTreeOutline.MappedCharToEntity = {
-  '\u00a0': 'nbsp',
-  '\u0093': '#147',  // <control>
-  '\u00ad': 'shy',
+  '\xA0': 'nbsp',
+  '\x93': '#147',  // <control>
+  '\xAD': 'shy',
   '\u2002': 'ensp',
   '\u2003': 'emsp',
   '\u2009': 'thinsp',
diff --git a/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js b/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
index 8167ff6..aa58fcf 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
+++ b/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
@@ -1028,7 +1028,7 @@
       return;
 
     const hasBeenEditedIncrementally = this._hasBeenEditedIncrementally;
-    styleText = styleText.replace(/[\u00a0\t]/g, ' ').trim();  // Replace &nbsp; with whitespace.
+    styleText = styleText.replace(/[\xA0\t]/g, ' ').trim();  // Replace &nbsp; with whitespace.
     if (!styleText.length && majorChange && this._newProperty && !hasBeenEditedIncrementally) {
       // The user deleted everything and never applied a new property value via Up/Down scrolling/live editing, so remove the tree element and update.
       this.parent.removeChild(this);
diff --git a/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js b/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js
index 954060ee..e788ff7e 100644
--- a/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js
+++ b/third_party/blink/renderer/devtools/front_end/host/UserMetrics.js
@@ -157,6 +157,16 @@
   security: 16,
   js_profiler: 17,
   audits: 18,
+  'drawer-coverage': 19,
+  'drawer-protocol-monitor': 20,
+  'drawer-remote-devices': 21,
+  'drawer-web-audio': 22,
+  'drawer-changes.changes': 23,
+  'drawer-performance.monitor': 24,
+  'drawer-release-note': 25,
+  'drawer-live_heap_profile': 26,
+  'drawer-sources.quick': 27,
+  'drawer-network.blocked-urls': 28,
 };
 
 /** @type {!Host.UserMetrics} */
diff --git a/third_party/blink/renderer/devtools/front_end/inspector.html b/third_party/blink/renderer/devtools/front_end/inspector.html
index b5d6f04e..1ab4d319 100644
--- a/third_party/blink/renderer/devtools/front_end/inspector.html
+++ b/third_party/blink/renderer/devtools/front_end/inspector.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="inspector.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="inspector.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/integration_test_runner.html b/third_party/blink/renderer/devtools/front_end/integration_test_runner.html
index ca7cc521..073b301 100644
--- a/third_party/blink/renderer/devtools/front_end/integration_test_runner.html
+++ b/third_party/blink/renderer/devtools/front_end/integration_test_runner.html
@@ -8,8 +8,9 @@
 <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
-    <script src="Runtime.js"></script>
-    <script src="integration_test_runner.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="integration_test_runner.js"></script>
 </head>
 <body id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/js_app.html b/third_party/blink/renderer/devtools/front_end/js_app.html
index 7105918..8cc144c 100644
--- a/third_party/blink/renderer/devtools/front_end/js_app.html
+++ b/third_party/blink/renderer/devtools/front_end/js_app.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="js_app.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="js_app.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/ndb_app.html b/third_party/blink/renderer/devtools/front_end/ndb_app.html
index ac0dee1..d6f17486 100644
--- a/third_party/blink/renderer/devtools/front_end/ndb_app.html
+++ b/third_party/blink/renderer/devtools/front_end/ndb_app.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="ndb_app.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="ndb_app.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js b/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
index 7500f86..cf12a6d 100644
--- a/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
+++ b/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
@@ -224,7 +224,7 @@
     paramsTreeElement.listItemElement.createTextChild(title);
 
     const headerCount = createElementWithClass('span', 'header-count');
-    headerCount.textContent = Common.UIString('\u00A0(%d)', params.length);
+    headerCount.textContent = Common.UIString('\xA0(%d)', params.length);
     paramsTreeElement.listItemElement.appendChild(headerCount);
 
     /**
@@ -430,7 +430,7 @@
     headersTreeElement.listItemElement.removeChildren();
     headersTreeElement.listItemElement.createTextChild(title);
 
-    const headerCount = Common.UIString('\u00A0(%d)', headersLength);
+    const headerCount = Common.UIString('\xA0(%d)', headersLength);
     headersTreeElement.listItemElement.createChild('span', 'header-count').textContent = headerCount;
   }
 
diff --git a/third_party/blink/renderer/devtools/front_end/node_app.html b/third_party/blink/renderer/devtools/front_end/node_app.html
index 05aa910..5b475a11 100644
--- a/third_party/blink/renderer/devtools/front_end/node_app.html
+++ b/third_party/blink/renderer/devtools/front_end/node_app.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="node_app.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="node_app.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/object_ui/ObjectPropertiesSection.js b/third_party/blink/renderer/devtools/front_end/object_ui/ObjectPropertiesSection.js
index 6710b555..432ef65 100644
--- a/third_party/blink/renderer/devtools/front_end/object_ui/ObjectPropertiesSection.js
+++ b/third_party/blink/renderer/devtools/front_end/object_ui/ObjectPropertiesSection.js
@@ -581,7 +581,6 @@
       value,
       linkifier,
       emptyPlaceholder) {
-    properties.sort(ObjectUI.ObjectPropertiesSection.CompareProperties);
     internalProperties = internalProperties || [];
 
     const entriesProperty = internalProperties.find(property => property.name === '[[Entries]]');
diff --git a/third_party/blink/renderer/devtools/front_end/object_ui/RemoteObjectPreviewFormatter.js b/third_party/blink/renderer/devtools/front_end/object_ui/RemoteObjectPreviewFormatter.js
index eb928dc..6467c4b 100644
--- a/third_party/blink/renderer/devtools/front_end/object_ui/RemoteObjectPreviewFormatter.js
+++ b/third_party/blink/renderer/devtools/front_end/object_ui/RemoteObjectPreviewFormatter.js
@@ -58,7 +58,7 @@
         text = hideDescription ? '' : description;
       }
       if (text.length > 0)
-        parentElement.createChild('span', 'object-description').textContent = text + '\u00a0';
+        parentElement.createChild('span', 'object-description').textContent = text + '\xA0';
     }
 
     const propertiesElement = parentElement.createChild('span', 'object-properties-preview');
@@ -70,7 +70,7 @@
     else
       this._appendObjectPropertiesPreview(propertiesElement, preview);
     if (preview.overflow) {
-      const ellipsisText = propertiesElement.textContent.length > 1 ? ',\u00a0\u2026' : '\u2026';
+      const ellipsisText = propertiesElement.textContent.length > 1 ? ',\xA0\u2026' : '\u2026';
       propertiesElement.createChild('span').textContent = ellipsisText;
     }
     propertiesElement.createTextChild(isArrayOrTypedArray ? ']' : '}');
diff --git a/third_party/blink/renderer/devtools/front_end/platform/utilities.js b/third_party/blink/renderer/devtools/front_end/platform/utilities.js
index c94bb3d..31973aa 100644
--- a/third_party/blink/renderer/devtools/front_end/platform/utilities.js
+++ b/third_party/blink/renderer/devtools/front_end/platform/utilities.js
@@ -1021,7 +1021,7 @@
  * @return {string}
  */
 self.spacesPadding = function(spacesCount) {
-  return '\u00a0'.repeat(spacesCount);
+  return '\xA0'.repeat(spacesCount);
 };
 
 /**
diff --git a/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js b/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
index 94c15bc7..9d07955 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
@@ -220,7 +220,7 @@
       return;
     }
     this._quotaRow.textContent = Common.UIString(
-        '%s used out of %s storage quota.\u00a0', Number.bytesToString(response.usage),
+        '%s used out of %s storage quota.\xA0', Number.bytesToString(response.usage),
         Number.bytesToString(response.quota));
     if (response.quota < 125829120) {  // 120 MB
       this._quotaRow.title = ls`Storage quota is limited in Incognito mode`;
diff --git a/third_party/blink/renderer/devtools/front_end/root.js b/third_party/blink/renderer/devtools/front_end/root.js
new file mode 100644
index 0000000..90ae39a
--- /dev/null
+++ b/third_party/blink/renderer/devtools/front_end/root.js
@@ -0,0 +1,5 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './ui/UI.js';
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js b/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
index 7010818..358558c4 100644
--- a/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
+++ b/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
@@ -415,8 +415,13 @@
   _simplifyMimeType(content, mimeType) {
     if (!mimeType)
       return '';
+    // There are plenty of instances where TSX/JSX files are served with out the trailing x, i.e. JSX with a 'js' suffix
+    // which breaks the formatting. Therefore, if the mime type is TypeScript or JavaScript, we switch to the TSX/JSX
+    // superset so that we don't break formatting.
+    if (mimeType.indexOf('typescript') >= 0)
+      return 'text/typescript-jsx';
     if (mimeType.indexOf('javascript') >= 0 || mimeType.indexOf('jscript') >= 0 || mimeType.indexOf('ecmascript') >= 0)
-      return 'text/javascript';
+      return 'text/jsx';
     // A hack around the fact that files with "php" extension might be either standalone or html embedded php scripts.
     if (mimeType === 'text/x-php' && content.match(/\<\?.*\?\>/g))
       return 'application/x-httpd-php';
diff --git a/third_party/blink/renderer/devtools/front_end/source_frame/XMLView.js b/third_party/blink/renderer/devtools/front_end/source_frame/XMLView.js
index 75feb5c3..8af5c23 100644
--- a/third_party/blink/renderer/devtools/front_end/source_frame/XMLView.js
+++ b/third_party/blink/renderer/devtools/front_end/source_frame/XMLView.js
@@ -297,7 +297,7 @@
         for (let i = 0; i < attributes.length; ++i) {
           const attributeNode = attributes.item(i);
           titleItems.push(
-              '\u00a0', 'shadow-xml-view-tag', attributeNode.name, 'shadow-xml-view-attribute-name', '="',
+              '\xA0', 'shadow-xml-view-tag', attributeNode.name, 'shadow-xml-view-attribute-name', '="',
               'shadow-xml-view-tag', attributeNode.value, 'shadow-xml-view-attribute-value', '"',
               'shadow-xml-view-tag');
         }
diff --git a/third_party/blink/renderer/devtools/front_end/sources/GutterDiffPlugin.js b/third_party/blink/renderer/devtools/front_end/sources/GutterDiffPlugin.js
index 064be73671..4f8eddc 100644
--- a/third_party/blink/renderer/devtools/front_end/sources/GutterDiffPlugin.js
+++ b/third_party/blink/renderer/devtools/front_end/sources/GutterDiffPlugin.js
@@ -169,7 +169,7 @@
     if (!location)
       return;
     const element = createElementWithClass('div', 'diff-marker');
-    element.textContent = '\u00A0';
+    element.textContent = '\xA0';
     this._textEditor.setGutterDecoration(location.lineNumber, Sources.GutterDiffPlugin.DiffGutterType, element);
     this._textEditor.toggleLineClass(location.lineNumber, this._className, true);
   }
diff --git a/third_party/blink/renderer/devtools/front_end/sources_test_runner/module.json b/third_party/blink/renderer/devtools/front_end/sources_test_runner/module.json
index 52a978ab..a260418c 100644
--- a/third_party/blink/renderer/devtools/front_end/sources_test_runner/module.json
+++ b/third_party/blink/renderer/devtools/front_end/sources_test_runner/module.json
@@ -5,6 +5,7 @@
     "workspace",
     "source_frame",
     "text_utils",
+    "cm_modes",
     "browser_debugger"
   ],
   "scripts": [
diff --git a/third_party/blink/renderer/devtools/front_end/toolbox.html b/third_party/blink/renderer/devtools/front_end/toolbox.html
index c48ad36..ab892052 100644
--- a/third_party/blink/renderer/devtools/front_end/toolbox.html
+++ b/third_party/blink/renderer/devtools/front_end/toolbox.html
@@ -8,8 +8,9 @@
 <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' ">
-    <script src="Runtime.js"></script>
-    <script src="toolbox.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="toolbox.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
index fd1aad50..088e6ee2 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
@@ -2,327 +2,326 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-UI.ARIAUtils = {};
-UI.ARIAUtils._id = 0;
-
-/**
- * @param {!Element} label
- * @param {!Element} control
- */
-UI.ARIAUtils.bindLabelToControl = function(label, control) {
-  const controlId = UI.ARIAUtils.nextId('labelledControl');
-  control.id = controlId;
-  label.setAttribute('for', controlId);
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsAlert = function(element) {
-  element.setAttribute('role', 'alert');
-  element.setAttribute('aria-live', 'polite');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsButton = function(element) {
-  element.setAttribute('role', 'button');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsCheckbox = function(element) {
-  element.setAttribute('role', 'checkbox');
-};
-
-/**
- * @param {!Element} element
- * @param {boolean=} modal
- */
-UI.ARIAUtils.markAsDialog = function(element, modal) {
-  element.setAttribute('role', 'dialog');
-  if (modal)
-    element.setAttribute('aria-modal', 'true');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsGroup = function(element) {
-  element.setAttribute('role', 'group');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsLink = function(element) {
-  element.setAttribute('role', 'link');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsMenuButton = function(element) {
-  UI.ARIAUtils.markAsButton(element);
-  element.setAttribute('aria-haspopup', true);
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsProgressBar = function(element) {
-  element.setAttribute('role', 'progressbar');
-  element.setAttribute('aria-valuemin', 0);
-  element.setAttribute('aria-valuemax', 100);
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsTab = function(element) {
-  element.setAttribute('role', 'tab');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsTree = function(element) {
-  element.setAttribute('role', 'tree');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsTreeitem = function(element) {
-  element.setAttribute('role', 'treeitem');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsTextBox = function(element) {
-  element.setAttribute('role', 'textbox');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsMenu = function(element) {
-  element.setAttribute('role', 'menu');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsMenuItem = function(element) {
-  element.setAttribute('role', 'menuitem');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsMenuItemSubMenu = function(element) {
-  UI.ARIAUtils.markAsMenuItem(element);
-  element.setAttribute('aria-haspopup', true);
-};
-
-/**
- * Must contain children whose role is option.
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsListBox = function(element) {
-  element.setAttribute('role', 'listbox');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsMultiSelectable = function(element) {
-  element.setAttribute('aria-multiselectable', 'true');
-};
-
-/**
- * Must be contained in, or owned by, an element with the role listbox.
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsOption = function(element) {
-  element.setAttribute('role', 'option');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsRadioGroup = function(element) {
-  element.setAttribute('role', 'radiogroup');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsHidden = function(element) {
-  element.setAttribute('aria-hidden', 'true');
-};
-
-/**
- * @param {!Element} element
- * @param {number} level
- */
-UI.ARIAUtils.markAsHeading = function(element, level) {
-  element.setAttribute('role', 'heading');
-  element.setAttribute('aria-level', level);
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsPoliteLiveRegion = function(element) {
-  element.setAttribute('aria-live', 'polite');
-};
-
-/**
- * @param {!Element} element
- * @param {?string} placeholder
- */
-UI.ARIAUtils.setPlaceholder = function(element, placeholder) {
-  if (placeholder)
-    element.setAttribute('aria-placeholder', placeholder);
-  else
-    element.removeAttribute('aria-placeholder');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsPresentation = function(element) {
-  element.setAttribute('role', 'presentation');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.markAsStatus = function(element) {
-  element.setAttribute('role', 'status');
-};
-
-/**
- * @param {!Element} element
- */
-UI.ARIAUtils.ensureId = function(element) {
-  if (!element.id)
-    element.id = UI.ARIAUtils.nextId('ariaElement');
-};
+let _id = 0;
 
 /**
  * @param {string} prefix
  * @return {string}
  */
-UI.ARIAUtils.nextId = function(prefix) {
-  return (prefix || '') + ++UI.ARIAUtils._id;
-};
+export function nextId(prefix) {
+  return (prefix || '') + ++_id;
+}
+
+/**
+ * @param {!Element} label
+ * @param {!Element} control
+ */
+export function bindLabelToControl(label, control) {
+  const controlId = nextId('labelledControl');
+  control.id = controlId;
+  label.setAttribute('for', controlId);
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsAlert(element) {
+  element.setAttribute('role', 'alert');
+  element.setAttribute('aria-live', 'polite');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsButton(element) {
+  element.setAttribute('role', 'button');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsCheckbox(element) {
+  element.setAttribute('role', 'checkbox');
+}
+
+/**
+ * @param {!Element} element
+ * @param {boolean=} modal
+ */
+export function markAsDialog(element, modal) {
+  element.setAttribute('role', 'dialog');
+  if (modal)
+    element.setAttribute('aria-modal', 'true');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsGroup(element) {
+  element.setAttribute('role', 'group');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsLink(element) {
+  element.setAttribute('role', 'link');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsMenuButton(element) {
+  markAsButton(element);
+  element.setAttribute('aria-haspopup', true);
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsProgressBar(element) {
+  element.setAttribute('role', 'progressbar');
+  element.setAttribute('aria-valuemin', 0);
+  element.setAttribute('aria-valuemax', 100);
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsTab(element) {
+  element.setAttribute('role', 'tab');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsTree(element) {
+  element.setAttribute('role', 'tree');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsTreeitem(element) {
+  element.setAttribute('role', 'treeitem');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsTextBox(element) {
+  element.setAttribute('role', 'textbox');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsMenu(element) {
+  element.setAttribute('role', 'menu');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsMenuItem(element) {
+  element.setAttribute('role', 'menuitem');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsMenuItemSubMenu(element) {
+  markAsMenuItem(element);
+  element.setAttribute('aria-haspopup', true);
+}
+
+/**
+ * Must contain children whose role is option.
+ * @param {!Element} element
+ */
+export function markAsListBox(element) {
+  element.setAttribute('role', 'listbox');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsMultiSelectable(element) {
+  element.setAttribute('aria-multiselectable', 'true');
+}
+
+/**
+ * Must be contained in, or owned by, an element with the role listbox.
+ * @param {!Element} element
+ */
+export function markAsOption(element) {
+  element.setAttribute('role', 'option');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsRadioGroup(element) {
+  element.setAttribute('role', 'radiogroup');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsHidden(element) {
+  element.setAttribute('aria-hidden', 'true');
+}
+
+/**
+ * @param {!Element} element
+ * @param {number} level
+ */
+export function markAsHeading(element, level) {
+  element.setAttribute('role', 'heading');
+  element.setAttribute('aria-level', level);
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsPoliteLiveRegion(element) {
+  element.setAttribute('aria-live', 'polite');
+}
+
+/**
+ * @param {!Element} element
+ * @param {?string} placeholder
+ */
+export function setPlaceholder(element, placeholder) {
+  if (placeholder)
+    element.setAttribute('aria-placeholder', placeholder);
+  else
+    element.removeAttribute('aria-placeholder');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsPresentation(element) {
+  element.setAttribute('role', 'presentation');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function markAsStatus(element) {
+  element.setAttribute('role', 'status');
+}
+
+/**
+ * @param {!Element} element
+ */
+export function ensureId(element) {
+  if (!element.id)
+    element.id = nextId('ariaElement');
+}
 
 /**
  * @param {!Element} element
  * @param {?Element} controlledElement
  */
-UI.ARIAUtils.setControls = function(element, controlledElement) {
+export function setControls(element, controlledElement) {
   if (!controlledElement) {
     element.removeAttribute('aria-controls');
     return;
   }
 
-  UI.ARIAUtils.ensureId(controlledElement);
+  ensureId(controlledElement);
   element.setAttribute('aria-controls', controlledElement.id);
-};
+}
 
 /**
  * @param {!Element} element
  * @param {boolean} value
  */
-UI.ARIAUtils.setChecked = function(element, value) {
+export function setChecked(element, value) {
   element.setAttribute('aria-checked', !!value);
-};
+}
 
 /**
  * @param {!Element} element
  */
-UI.ARIAUtils.setCheckboxAsIndeterminate = function(element) {
+export function setCheckboxAsIndeterminate(element) {
   element.setAttribute('aria-checked', 'mixed');
-};
+}
 
 /**
  * @param {!Element} element
  * @param {boolean} value
  */
-UI.ARIAUtils.setExpanded = function(element, value) {
+export function setExpanded(element, value) {
   element.setAttribute('aria-expanded', !!value);
-};
+}
 
 /**
  * @param {!Element} element
  */
-UI.ARIAUtils.unsetExpandable = function(element) {
+export function unsetExpandable(element) {
   element.removeAttribute('aria-expanded');
-};
+}
 
 /**
  * @param {!Element} element
  * @param {boolean} value
  */
-UI.ARIAUtils.setSelected = function(element, value) {
+export function setSelected(element, value) {
   // aria-selected behaves differently for false and undefined.
   // Often times undefined values are unintentionally typed as booleans.
   // Use !! to make sure this is true or false.
   element.setAttribute('aria-selected', !!value);
-};
+}
 
 /**
  * @param {!Element} element
  * @param {boolean} value
  */
-UI.ARIAUtils.setInvalid = function(element, value) {
+export function setInvalid(element, value) {
   if (value)
     element.setAttribute('aria-invalid', value);
   else
     element.removeAttribute('aria-invalid');
-};
+}
 
 /**
  * @param {!Element} element
  * @param {boolean} value
  */
-UI.ARIAUtils.setPressed = function(element, value) {
+export function setPressed(element, value) {
   // aria-pressed behaves differently for false and undefined.
   // Often times undefined values are unintentionally typed as booleans.
   // Use !! to make sure this is true or false.
   element.setAttribute('aria-pressed', !!value);
-};
+}
 
 /**
  * @param {!Element} element
  * @param {number} value
  */
-UI.ARIAUtils.setProgressBarCurrentPercentage = function(element, value) {
+export function setProgressBarCurrentPercentage(element, value) {
   element.setAttribute('aria-valuenow', value);
-};
+}
 
 /**
  * @param {!Element} element
  * @param {string} name
  */
-UI.ARIAUtils.setAccessibleName = function(element, name) {
+export function setAccessibleName(element, name) {
   element.setAttribute('aria-label', name);
-};
+}
 
 /** @type {!WeakMap<!Element, !Element>} */
-UI.ARIAUtils._descriptionMap = new WeakMap();
+const _descriptionMap = new WeakMap();
 
 /**
  * @param {!Element} element
  * @param {string} description
  */
-UI.ARIAUtils.setDescription = function(element, description) {
+export function setDescription(element, description) {
   // Nodes in the accesesibility tree are made up of a core
   // triplet of "name", "value", "description"
   // The "description" field is taken from either
@@ -348,12 +347,12 @@
   // The rest of DevTools shouldn't have to worry about this,
   // so there is some unfortunate code below.
 
-  if (UI.ARIAUtils._descriptionMap.has(element))
-    UI.ARIAUtils._descriptionMap.get(element).remove();
+  if (_descriptionMap.has(element))
+    _descriptionMap.get(element).remove();
   element.removeAttribute('data-aria-utils-animation-hack');
 
   if (!description) {
-    UI.ARIAUtils._descriptionMap.delete(element);
+    _descriptionMap.delete(element);
     element.removeAttribute('aria-describedby');
     return;
   }
@@ -363,9 +362,9 @@
   const descriptionElement = createElement('span');
   descriptionElement.textContent = description;
   descriptionElement.style.display = 'none';
-  UI.ARIAUtils.ensureId(descriptionElement);
+  ensureId(descriptionElement);
   element.setAttribute('aria-describedby', descriptionElement.id);
-  UI.ARIAUtils._descriptionMap.set(element, descriptionElement);
+  _descriptionMap.set(element, descriptionElement);
 
   // Now we have to actually put this description element
   // somewhere in the DOM so that we can point to it.
@@ -398,20 +397,20 @@
   element.setAttribute('data-aria-utils-animation-hack', 'sorry');
   element.addEventListener('animationend', () => {
     // Someone might have made a new description in the meantime.
-    if (UI.ARIAUtils._descriptionMap.get(element) !== descriptionElement)
+    if (_descriptionMap.get(element) !== descriptionElement)
       return;
     element.removeAttribute('data-aria-utils-animation-hack');
 
     // Try it again. This time we are in the DOM, so it *should* work.
     element.insertAdjacentElement('afterend', descriptionElement);
   }, {once: true});
-};
+}
 
 /**
  * @param {!Element} element
  * @param {?Element} activedescendant
  */
-UI.ARIAUtils.setActiveDescendant = function(element, activedescendant) {
+export function setActiveDescendant(element, activedescendant) {
   if (!activedescendant) {
     element.removeAttribute('aria-activedescendant');
     return;
@@ -419,17 +418,19 @@
 
   console.assert(element.hasSameShadowRoot(activedescendant), 'elements are not in the same shadow dom');
 
-  UI.ARIAUtils.ensureId(activedescendant);
+  ensureId(activedescendant);
   element.setAttribute('aria-activedescendant', activedescendant.id);
-};
+}
+
+const AlertElementSymbol = Symbol('AlertElementSybmol');
 
 /**
  * @param {string} message
  * @param {!Element} element
  */
-UI.ARIAUtils.alert = function(message, element) {
+export function alert(message, element) {
   const document = element.ownerDocument;
-  if (!document[UI.ARIAUtils.AlertElementSymbol]) {
+  if (!document[AlertElementSymbol]) {
     const alertElement = document.body.createChild('div');
     alertElement.style.position = 'absolute';
     alertElement.style.left = '-999em';
@@ -437,9 +438,54 @@
     alertElement.style.overflow = 'hidden';
     alertElement.setAttribute('role', 'alert');
     alertElement.setAttribute('aria-atomic', 'true');
-    document[UI.ARIAUtils.AlertElementSymbol] = alertElement;
+    document[AlertElementSymbol] = alertElement;
   }
-  document[UI.ARIAUtils.AlertElementSymbol].textContent = message.trimEndWithMaxLength(10000);
-};
 
-UI.ARIAUtils.AlertElementSymbol = Symbol('AlertElementSybmol');
+  document[AlertElementSymbol].textContent = message.trimEndWithMaxLength(10000);
+}
+
+/** Legacy exported object @suppress {const} */
+self.UI = self.UI || {};
+self.UI.ARIAUtils = {
+  nextId,
+  bindLabelToControl,
+  markAsAlert,
+  markAsButton,
+  markAsCheckbox,
+  markAsDialog,
+  markAsGroup,
+  markAsLink,
+  markAsMenuButton,
+  markAsProgressBar,
+  markAsTab,
+  markAsTree,
+  markAsTreeitem,
+  markAsTextBox,
+  markAsMenu,
+  markAsMenuItem,
+  markAsMenuItemSubMenu,
+  markAsListBox,
+  markAsMultiSelectable,
+  markAsOption,
+  markAsRadioGroup,
+  markAsHidden,
+  markAsHeading,
+  markAsPoliteLiveRegion,
+  setPlaceholder,
+  markAsPresentation,
+  markAsStatus,
+  ensureId,
+  setControls,
+  setChecked,
+  setCheckboxAsIndeterminate,
+  setExpanded,
+  unsetExpandable,
+  setSelected,
+  setInvalid,
+  setPressed,
+  setProgressBarCurrentPercentage,
+  setAccessibleName,
+  setDescription,
+  setActiveDescendant,
+  alert,
+};
diff --git a/third_party/blink/renderer/devtools/front_end/ui/UI.js b/third_party/blink/renderer/devtools/front_end/ui/UI.js
new file mode 100644
index 0000000..262177a9
--- /dev/null
+++ b/third_party/blink/renderer/devtools/front_end/ui/UI.js
@@ -0,0 +1,5 @@
+import * as ARIAUtils from './ARIAUtils.js';
+
+export {
+  ARIAUtils,
+};
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/ui/module.json b/third_party/blink/renderer/devtools/front_end/ui/module.json
index bd5f5a1e..2dcde6f 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/module.json
+++ b/third_party/blink/renderer/devtools/front_end/ui/module.json
@@ -54,13 +54,16 @@
         "SuggestBox.js",
         "TabbedPane.js",
         "UIUtils.js",
-        "ARIAUtils.js",
         "ZoomManager.js",
         "ShortcutsScreen.js",
         "Geometry.js",
         "XLink.js",
         "XWidget.js"
     ],
+    "modules": [
+        "ARIAUtils.js",
+        "UI.js"
+    ],
     "resources": [
         "checkboxTextLabel.css",
         "closeButton.css",
diff --git a/third_party/blink/renderer/devtools/front_end/worker_app.html b/third_party/blink/renderer/devtools/front_end/worker_app.html
index e5827b5e..c041d37 100644
--- a/third_party/blink/renderer/devtools/front_end/worker_app.html
+++ b/third_party/blink/renderer/devtools/front_end/worker_app.html
@@ -9,8 +9,9 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="object-src 'none'; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://chrome-devtools-frontend.appspot.com">
     <meta name="referrer" content="no-referrer">
-    <script src="Runtime.js"></script>
-    <script src="worker_app.js"></script>
+    <script type="module" src="root.js"></script>
+    <script defer src="Runtime.js"></script>
+    <script defer src="worker_app.js"></script>
 </head>
 <body class="undocked" id="-blink-dev-tools"></body>
 </html>
diff --git a/third_party/blink/renderer/devtools/package.json b/third_party/blink/renderer/devtools/package.json
index feea3f1a..42d8d90 100644
--- a/third_party/blink/renderer/devtools/package.json
+++ b/third_party/blink/renderer/devtools/package.json
@@ -35,6 +35,10 @@
   "bugs": {
     "url": "https://bugs.chromium.org/p/chromium/issues/list?can=2&q=component:Platform%3EDevTools%20&sort=-opened&colspec=ID%20Stars%20Owner%20Summary%20Modified%20Opened"
   },
+  "type": "module",
+  "files": [
+    "front_end/**/*.mjs"
+  ],
   "homepage": "https://devtools.chrome.com",
   "devDependencies": {
     "ajv": "^5.1.5"
diff --git a/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py b/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
index 74e1c10..db32b006 100755
--- a/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
+++ b/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
@@ -133,13 +133,13 @@
         output = StringIO()
         with open(join(self.application_dir, html_name), 'r') as app_input_html:
             for line in app_input_html:
-                if '<script ' in line or '<link ' in line:
+                if ('<script ' in line and 'type="module"' not in line) or '<link ' in line:
                     continue
                 if '</head>' in line:
                     self._write_include_tags(self.descriptors, output)
                     js_file = join(self.application_dir, self.app_file('js'))
                     if path.exists(js_file):
-                        output.write('    <script>%s</script>\n' % minify_js(read_file(js_file)))
+                        output.write('    <script type="module">%s</script>\n' % minify_js(read_file(js_file)))
                 output.write(line)
 
         write_file(join(self.output_dir, html_name), output.getvalue())
@@ -154,7 +154,7 @@
 
     def _generate_include_tag(self, resource_path):
         if resource_path.endswith('.js'):
-            return '    <script type="text/javascript" src="%s"></script>\n' % resource_path
+            return '    <script defer src="%s"></script>\n' % resource_path
         else:
             assert resource_path
 
diff --git a/third_party/blink/renderer/devtools/scripts/build/copy_devtools_modules.py b/third_party/blink/renderer/devtools/scripts/build/copy_devtools_modules.py
new file mode 100755
index 0000000..10d9ee235
--- /dev/null
+++ b/third_party/blink/renderer/devtools/scripts/build/copy_devtools_modules.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+#
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+Copies the modules into the resources folder
+"""
+
+from os.path import join, relpath
+import shutil
+import sys
+
+
+def main(argv):
+    try:
+        input_path_flag_index = argv.index('--input_path')
+        input_path = argv[input_path_flag_index + 1]
+        output_path_flag_index = argv.index('--output_path')
+        output_path = argv[output_path_flag_index + 1]
+        devtools_modules = argv[1:input_path_flag_index]
+    except:
+        print 'Usage: %s module_1 module_2 ... module_N --input_path <input_path> --output_path <output_path>' % argv[0]
+        raise
+
+    for file_name in devtools_modules:
+        shutil.copy(join(input_path, file_name), join(output_path, relpath(file_name, 'front_end')))
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/third_party/blink/renderer/devtools/scripts/build/modular_build.py b/third_party/blink/renderer/devtools/scripts/build/modular_build.py
index 90d6697..c818ad95 100755
--- a/third_party/blink/renderer/devtools/scripts/build/modular_build.py
+++ b/third_party/blink/renderer/devtools/scripts/build/modular_build.py
@@ -76,7 +76,7 @@
         for name in self.sorted_modules():
             module = self.modules[name]
             skipped_files = set(module.get('skip_compilation', []))
-            for script in module.get('scripts', []):
+            for script in module.get('scripts', []) + module.get('modules', []):
                 if script not in skipped_files:
                     files[path.normpath(path.join(self.application_dir, name, script))] = True
         return files.keys()
diff --git a/third_party/blink/renderer/devtools/scripts/check_localizability.js b/third_party/blink/renderer/devtools/scripts/check_localizability.js
index 000a294..91e7158 100644
--- a/third_party/blink/renderer/devtools/scripts/check_localizability.js
+++ b/third_party/blink/renderer/devtools/scripts/check_localizability.js
@@ -284,7 +284,7 @@
   if (path.extname(filePath) === '.grdp')
     return auditGrdpFile(filePath, fileContent, errors);
 
-  const ast = esprima.parse(fileContent, {loc: true});
+  const ast = esprima.parseModule(fileContent, {loc: true});
 
   const relativeFilePath = localizationUtils.getRelativeFilePathFromSrc(filePath);
   for (const node of ast.body)
diff --git a/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js b/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js
index 50a2859..acf7e72 100644
--- a/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js
+++ b/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js
@@ -32,6 +32,7 @@
     else
       await getErrors();
   } catch (e) {
+    console.log(e.stack);
     console.log(`Error: ${e.message}`);
     process.exit(1);
   }
diff --git a/third_party/blink/renderer/devtools/scripts/compile_frontend.py b/third_party/blink/renderer/devtools/scripts/compile_frontend.py
index 53ad724f..78a553da 100755
--- a/third_party/blink/renderer/devtools/scripts/compile_frontend.py
+++ b/third_party/blink/renderer/devtools/scripts/compile_frontend.py
@@ -77,6 +77,7 @@
 GLOBAL_EXTERNS_FILE = to_platform_path(path.join(DEVTOOLS_FRONTEND_PATH, 'externs.js'))
 DEFAULT_PROTOCOL_EXTERNS_FILE = path.join(DEVTOOLS_FRONTEND_PATH, 'protocol_externs.js')
 RUNTIME_FILE = to_platform_path(path.join(DEVTOOLS_FRONTEND_PATH, 'Runtime.js'))
+ROOT_MODULE_FILE = to_platform_path(path.join(DEVTOOLS_FRONTEND_PATH, 'root.js'))
 
 CLOSURE_COMPILER_JAR = to_platform_path(path.join(SCRIPTS_PATH, 'closure', 'compiler.jar'))
 CLOSURE_RUNNER_JAR = to_platform_path(path.join(SCRIPTS_PATH, 'closure', 'closure_runner', 'closure_runner.jar'))
@@ -279,6 +280,8 @@
         namespace_externs_path,
         '--js',
         RUNTIME_FILE,
+        '--js',
+        ROOT_MODULE_FILE,
     ]
 
     all_files = descriptors.all_compiled_files()
diff --git a/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js b/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js
index d2ac8e67..4281b65c 100644
--- a/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js
+++ b/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js
@@ -93,7 +93,7 @@
   if (path.basename(filePath) === 'module.json')
     return parseLocalizableStringFromModuleJson(fileContent, filePath);
 
-  const ast = esprima.parse(fileContent, {loc: true});
+  const ast = esprima.parseModule(fileContent, {loc: true});
   for (const node of ast.body)
     parseLocalizableStringFromNode(node, filePath);
 }
diff --git a/third_party/blink/renderer/devtools/tsconfig.json b/third_party/blink/renderer/devtools/tsconfig.json
deleted file mode 100644
index 1dbc1cc..0000000
--- a/third_party/blink/renderer/devtools/tsconfig.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "compilerOptions": {
-    "typeRoots": ["../../../devtools-node-modules/third_party/node_modules/@types"]
-  }
-}
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
index 66787e6..f9a138e 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -1905,6 +1905,9 @@
 }
 
 void MediaControlsImpl::ElementSizeChangedTimerFired(TimerBase*) {
+  if (!MediaElement().isConnected())
+    return;
+
   ComputeWhichControlsFit();
 
   // Rerender timeline bar segments when size changed.
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 7378cf2..70b2115 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -607,6 +607,8 @@
     "fonts/font_global_context.h",
     "fonts/font_metrics.cc",
     "fonts/font_metrics.h",
+    "fonts/font_optical_sizing.cc",
+    "fonts/font_optical_sizing.h",
     "fonts/font_orientation.cc",
     "fonts/font_orientation.h",
     "fonts/font_platform_data.cc",
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index fdfc98d..5d4d046f 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -714,4 +714,8 @@
   RuntimeEnabledFeatures::SetSurfaceEmbeddingFeaturesEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableAcceleratedSmallCanvases(bool enable) {
+  RuntimeEnabledFeatures::SetAcceleratedSmallCanvasesEnabled(enable);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_custom_platform_data.cc b/third_party/blink/renderer/platform/fonts/font_custom_platform_data.cc
index 790da16..ecc8454 100644
--- a/third_party/blink/renderer/platform/fonts/font_custom_platform_data.cc
+++ b/third_party/blink/renderer/platform/fonts/font_custom_platform_data.cc
@@ -67,6 +67,7 @@
     bool italic,
     const FontSelectionRequest& selection_request,
     const FontSelectionCapabilities& selection_capabilities,
+    const OpticalSizing& optical_sizing,
     FontOrientation orientation,
     const FontVariationSettings* variation_settings) {
   DCHECK(base_typeface_);
@@ -105,15 +106,24 @@
     axes.push_back(width_axis);
     axes.push_back(slant_axis);
 
+    bool explicit_opsz_configured = false;
     if (variation_settings && variation_settings->size() < UINT16_MAX) {
       axes.ReserveCapacity(variation_settings->size() + axes.size());
       for (const auto& setting : *variation_settings) {
+        if (setting.Tag() == AtomicString("opsz"))
+          explicit_opsz_configured = true;
         SkFontArguments::Axis axis = {AtomicStringToFourByteTag(setting.Tag()),
                                       SkFloatToScalar(setting.Value())};
         axes.push_back(axis);
       }
     }
 
+    if (optical_sizing == kAutoOpticalSizing && !explicit_opsz_configured) {
+      SkFontArguments::Axis opsz_axis = {SkSetFourByteTag('o', 'p', 's', 'z'),
+                                         SkFloatToScalar(size)};
+      axes.push_back(opsz_axis);
+    }
+
     int index;
     std::unique_ptr<SkStreamAsset> stream(base_typeface_->openStream(&index));
     sk_sp<SkTypeface> sk_variation_font(FontManagerForSubType(font_sub_type)
diff --git a/third_party/blink/renderer/platform/fonts/font_custom_platform_data.h b/third_party/blink/renderer/platform/fonts/font_custom_platform_data.h
index bf02f74..7b129c1a 100644
--- a/third_party/blink/renderer/platform/fonts/font_custom_platform_data.h
+++ b/third_party/blink/renderer/platform/fonts/font_custom_platform_data.h
@@ -33,6 +33,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_CUSTOM_PLATFORM_DATA_H_
 
 #include "base/macros.h"
+#include "third_party/blink/renderer/platform/fonts/font_optical_sizing.h"
 #include "third_party/blink/renderer/platform/fonts/font_orientation.h"
 #include "third_party/blink/renderer/platform/fonts/font_selection_types.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
@@ -64,6 +65,7 @@
       bool italic,
       const FontSelectionRequest&,
       const FontSelectionCapabilities&,
+      const OpticalSizing& optical_sizing,
       FontOrientation = FontOrientation::kHorizontal,
       const FontVariationSettings* = nullptr);
 
diff --git a/third_party/blink/renderer/platform/fonts/font_description.cc b/third_party/blink/renderer/platform/fonts/font_description.cc
index 24e8e83..6745aa4f 100644
--- a/third_party/blink/renderer/platform/fonts/font_description.cc
+++ b/third_party/blink/renderer/platform/fonts/font_description.cc
@@ -93,6 +93,7 @@
   fields_.typesetting_features_ = default_typesetting_features_;
   fields_.variant_numeric_ = FontVariantNumeric().fields_as_unsigned_;
   fields_.subpixel_ascent_descent_ = false;
+  fields_.font_optical_sizing_ = OpticalSizing::kAutoOpticalSizing;
 }
 
 FontDescription::FontDescription(const FontDescription&) = default;
@@ -217,11 +218,12 @@
     bool is_unique_match,
     const FontSelectionRequest& font_selection_request) const {
   unsigned options =
-      static_cast<unsigned>(fields_.synthetic_italic_) << 6 |  // bit 7
-      static_cast<unsigned>(fields_.synthetic_bold_) << 5 |    // bit 6
-      static_cast<unsigned>(fields_.text_rendering_) << 3 |    // bits 4-5
-      static_cast<unsigned>(fields_.orientation_) << 1 |       // bit 2-3
-      static_cast<unsigned>(fields_.subpixel_text_position_);  // bit 1
+      static_cast<unsigned>(fields_.font_optical_sizing_) << 7 |  // bit 8
+      static_cast<unsigned>(fields_.synthetic_italic_) << 6 |     // bit 7
+      static_cast<unsigned>(fields_.synthetic_bold_) << 5 |       // bit 6
+      static_cast<unsigned>(fields_.text_rendering_) << 3 |       // bits 4-5
+      static_cast<unsigned>(fields_.orientation_) << 1 |          // bit 2-3
+      static_cast<unsigned>(fields_.subpixel_text_position_);     // bit 1
 
 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
   float device_scale_factor_for_key = FontCache::DeviceScaleFactor();
@@ -229,7 +231,7 @@
   float device_scale_factor_for_key = 1.0f;
 #endif
   FontCacheKey cache_key(creation_params, EffectiveFontSize(),
-                         options | font_selection_request_.GetHash() << 8,
+                         options | font_selection_request_.GetHash() << 9,
                          device_scale_factor_for_key, variation_settings_,
                          is_unique_match);
   return cache_key;
@@ -496,7 +498,7 @@
       "keyword_size=%u, font_smoothing=%s, text_rendering=%s, "
       "synthetic_bold=%s, synthetic_italic=%s, subpixel_positioning=%s, "
       "subpixel_ascent_descent=%s, variant_numeric=[%s], "
-      "variant_east_asian=[%s]",
+      "variant_east_asian=[%s], font_optical_sizing=%s",
       family_list_.ToString().Ascii().c_str(),
       (feature_settings_ ? feature_settings_->ToString().Ascii().c_str() : ""),
       (variation_settings_ ? variation_settings_->ToString().Ascii().c_str()
@@ -524,7 +526,8 @@
       ToBooleanString(UseSubpixelPositioning()),
       ToBooleanString(SubpixelAscentDescent()),
       VariantNumeric().ToString().Ascii().c_str(),
-      VariantEastAsian().ToString().Ascii().c_str());
+      VariantEastAsian().ToString().Ascii().c_str(),
+      blink::ToString(FontOpticalSizing()).Ascii().c_str());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_description.h b/third_party/blink/renderer/platform/fonts/font_description.h
index 5306455..35bc593 100644
--- a/third_party/blink/renderer/platform/fonts/font_description.h
+++ b/third_party/blink/renderer/platform/fonts/font_description.h
@@ -32,6 +32,7 @@
 #include "third_party/blink/renderer/platform/font_family_names.h"
 #include "third_party/blink/renderer/platform/fonts/font_cache_key.h"
 #include "third_party/blink/renderer/platform/fonts/font_family.h"
+#include "third_party/blink/renderer/platform/fonts/font_optical_sizing.h"
 #include "third_party/blink/renderer/platform/fonts/font_orientation.h"
 #include "third_party/blink/renderer/platform/fonts/font_selection_types.h"
 #include "third_party/blink/renderer/platform/fonts/font_smoothing_mode.h"
@@ -206,6 +207,9 @@
   FontSmoothingMode FontSmoothing() const {
     return static_cast<FontSmoothingMode>(fields_.font_smoothing_);
   }
+  OpticalSizing FontOpticalSizing() const {
+    return static_cast<OpticalSizing>(fields_.font_optical_sizing_);
+  }
   TextRenderingMode TextRendering() const {
     return static_cast<TextRenderingMode>(fields_.text_rendering_);
   }
@@ -282,6 +286,9 @@
   void SetFontSmoothing(FontSmoothingMode smoothing) {
     fields_.font_smoothing_ = smoothing;
   }
+  void SetFontOpticalSizing(OpticalSizing font_optical_sizing) {
+    fields_.font_optical_sizing_ = font_optical_sizing;
+  }
   void SetTextRendering(TextRenderingMode rendering) {
     fields_.text_rendering_ = rendering;
     UpdateTypesettingFeatures();
@@ -413,6 +420,7 @@
     unsigned variant_numeric_ : 8;
     unsigned variant_east_asian_ : 6;
     mutable unsigned subpixel_ascent_descent_ : 1;
+    unsigned font_optical_sizing_ : 1;
   };
 
   static_assert(sizeof(BitFields) == sizeof(FieldsAsUnsignedType),
diff --git a/third_party/blink/renderer/platform/fonts/font_description_test.cc b/third_party/blink/renderer/platform/fonts/font_description_test.cc
index c5935c6b..737580ef 100644
--- a/third_party/blink/renderer/platform/fonts/font_description_test.cc
+++ b/third_party/blink/renderer/platform/fonts/font_description_test.cc
@@ -116,7 +116,7 @@
       "variant_numeric=[numeric_figure=NormalFigure, "
       "numeric_spacing=NormalSpacing, numeric_fraction=Normal, ordinal=Off, "
       "slashed_zero=Off], variant_east_asian=[form=Normal, width=Normal, "
-      "ruby=false]",
+      "ruby=false], font_optical_sizing=Auto",
       description.ToString());
 }
 
diff --git a/third_party/blink/renderer/platform/fonts/font_optical_sizing.cc b/third_party/blink/renderer/platform/fonts/font_optical_sizing.cc
new file mode 100644
index 0000000..b912bfa
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/font_optical_sizing.cc
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/fonts/font_optical_sizing.h"
+
+namespace blink {
+
+String ToString(OpticalSizing font_optical_sizing) {
+  switch (font_optical_sizing) {
+    case OpticalSizing::kAutoOpticalSizing:
+      return "Auto";
+    case OpticalSizing::kNoneOpticalSizing:
+      return "None";
+  }
+  return "Unknown";
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_optical_sizing.h b/third_party/blink/renderer/platform/fonts/font_optical_sizing.h
new file mode 100644
index 0000000..bd18e89
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/font_optical_sizing.h
@@ -0,0 +1,17 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_OPTICAL_SIZING_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_OPTICAL_SIZING_H_
+
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink {
+enum OpticalSizing { kAutoOpticalSizing, kNoneOpticalSizing };
+
+PLATFORM_EXPORT String ToString(OpticalSizing);
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_OPTICAL_SIZING_H_
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index e07a097..3894793 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -95,6 +95,10 @@
       status: "stable",
     },
     {
+      name: "AcceleratedSmallCanvases",
+      status: "stable",
+    },
+    {
       name: "AccessibilityObjectModel",
       status: "experimental",
     },
@@ -1736,7 +1740,7 @@
     },
     {
       name: "WebBluetoothScanning",
-      status: "test",
+      status: "experimental",
     },
     {
       name: "WebGL2ComputeContext",
diff --git a/third_party/blink/renderer/platform/testing/font_test_helpers.cc b/third_party/blink/renderer/platform/testing/font_test_helpers.cc
index ef7d0b5..1e40f8a 100644
--- a/third_party/blink/renderer/platform/testing/font_test_helpers.cc
+++ b/third_party/blink/renderer/platform/testing/font_test_helpers.cc
@@ -43,7 +43,7 @@
         font_description.IsSyntheticBold(),
         font_description.IsSyntheticItalic(),
         font_description.GetFontSelectionRequest(), normal_capabilities,
-        font_description.Orientation());
+        font_description.FontOpticalSizing(), font_description.Orientation());
     return SimpleFontData::Create(platform_data, CustomFontData::Create());
   }
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index e9e1fc49..c1db465 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3319,7 +3319,7 @@
 crbug.com/626703 [ Mac10.11 ] external/wpt/shape-detection/detection-HTMLVideoElement-invalid-state.html [ Timeout ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html [ Timeout ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-mode.html [ Timeout ]
-crbug.com/626703 [ Mac10.12 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
+crbug.com/1004760 [ Mac ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-negative-timestamp-events.html [ Timeout ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Failure ]
 crbug.com/626703 [ Retina ] external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-tokenization-top-left.html [ Timeout ]
@@ -6204,3 +6204,12 @@
 
 # Sheriff 2019-09-12
 crbug.com/1003268 [ Win10 ] fast/harness/internals-observe-gc.html [ Failure ]
+crbug.com/731018 [ Mac10.13 Debug ] external/wpt/accelerometer/Accelerometer.https.html [ Pass Failure ]
+crbug.com/731018 [ Mac10.13 Debug ] external/wpt/gyroscope/Gyroscope.https.html [ Pass Failure ]
+crbug.com/731018 [ Mac10.13 Debug ] external/wpt/orientation-sensor/AbsoluteOrientationSensor.https.html [ Pass Failure ]
+crbug.com/731018 [ Mac10.13 Debug ] external/wpt/orientation-sensor/RelativeOrientationSensor.https.html [ Pass Failure ]
+
+# TODO (csmartdalton): Remove after Skia roll and rebaseline
+crbug.com/630695 css3/filters/effect-blur-hw.html [ Pass Failure ]
+crbug.com/630695 css3/filters/effect-drop-shadow-hw.html [ Pass Failure ]
+crbug.com/630695 virtual/scalefactor200/css3/filters/effect-drop-shadow-hw.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/accelerometer/LinearAccelerationSensor-shake-threshold-manual.https-expected.txt b/third_party/blink/web_tests/external/wpt/accelerometer/LinearAccelerationSensor-shake-threshold-manual.https-expected.txt
deleted file mode 100644
index 6cc9b56e..0000000
--- a/third_party/blink/web_tests/external/wpt/accelerometer/LinearAccelerationSensor-shake-threshold-manual.https-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test that when shaking gesture along x axis of the device, the shake threshold can be greater than 25 assert_unreached: NotAllowedError:Permissions to access sensor are not granted Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/resources/variabletest_box.ttf b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/resources/variabletest_box.ttf
index 53b5b242..0d5bf3e2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/resources/variabletest_box.ttf
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/resources/variabletest_box.ttf
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz-ref.html
new file mode 100644
index 0000000..24080345
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<style>
+    @font-face {
+    font-family: variabletest_box;
+    src: url(resources/variabletest_box.ttf);
+    }
+
+    body {
+    font-family: variabletest_box, sans-serif;
+    font-optical-sizing: none;
+    }
+</style>
+<div style="font-size:   6px; font-variation-settings: 'opsz'    6;">B</div>
+<div style="font-size:  12px; font-variation-settings: 'opsz'   12;">B</div>
+<div style="font-size:  24px; font-variation-settings: 'opsz'   24;">B</div>
+<div style="font-size:  48px; font-variation-settings: 'opsz'   48;">B</div>
+<div style="font-size:  64px; font-variation-settings: 'opsz'   64;">B</div>
+<div style="font-size: 128px; font-variation-settings: 'opsz'  128;">B</div>
+<div style="font-size:  24px; font-variation-settings: 'opsz'  128;">B</div>
+<div style="font-size:  48px; font-variation-settings: 'opsz'   12;">B</div>
+<script>
+    document.fonts.ready.then(
+        () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz.html
new file mode 100644
index 0000000..d274a47
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/variations/variable-opsz.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="author" title="Dominik Röttsches" href="drott@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-optical-sizing-def"/>
+<meta name="assert" content="Ensures that optical size is automatically applied."/>
+<link rel="match" href="variable-opsz-ref.html">
+<meta charset="utf-8">
+<style>
+    @font-face {
+    font-family: variabletest_box;
+    src: url(resources/variabletest_box.ttf);
+    }
+
+    body {
+    font-family: variabletest_box, sans-serif;
+    }
+</style>
+<!-- The variabletest_box font file contains a glyph for letter B which moves a
+  horizontal bar up from the middle for opsz > 12 and moves it down for opsz >
+  12 where the opsz axis ranges from 12 to 128. -->
+<div style="font-size:   6px;">B</div>
+<div style="font-size:  12px;">B</div>
+<div style="font-size:  24px;">B</div>
+<div style="font-size:  48px;">B</div>
+<div style="font-size:  64px;">B</div>
+<div style="font-size: 128px;">B</div>
+<!-- Explicit value overrides auto. -->
+<div style="font-size:  24px; font-variation-settings: 'opsz' 128;">B</div>
+<div style="font-size:  48px; font-optical-sizing: none;">B</div>
+<script>
+    document.fonts.ready.then(
+        () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-count-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-count-interpolation.html
index def34ad..66a7513 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-count-interpolation.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-count-interpolation.html
@@ -65,4 +65,16 @@
   {at: 1, expect: '1'},
   {at: 1.5, expect: '1'}
 ]);
+
+test_no_interpolation({
+  property: 'column-count',
+  from: 'initial',
+  to: '5',
+});
+
+test_no_interpolation({
+  property: 'column-count',
+  from: 'unset',
+  to: '5',
+});
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-color-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-color-interpolation.html
index 060c841..3aba944 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-color-interpolation.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-color-interpolation.html
@@ -74,4 +74,32 @@
   {at: 1, expect: 'rgb(170, 70, 70)'},
   {at: 1.5, expect: 'rgb(220, 20, 70)'},
 ]);
+
+test_interpolation({
+  property: 'column-rule-color',
+  from: 'unset',
+  to: 'rgb(0, 255, 0)',
+}, [
+  {at: -5, expect: 'rgb(255, 0, 255)'},
+  {at: -0.4, expect: 'rgb(98, 136, 98)'},
+  {at: 0, expect: 'rgb(70, 170, 70)'},
+  {at: 0.2, expect: 'rgb(56, 187, 56)'},
+  {at: 0.6, expect: 'rgb(28, 221, 28)'},
+  {at: 1, expect: 'rgb(0, 255, 0)'},
+  {at: 1.5, expect: 'rgb(0, 255, 0)'},
+]);
+
+test_interpolation({
+  property: 'column-rule-color',
+  from: 'orange',
+  to: 'blue'
+}, [
+  {at: -5, expect: '#ffff00'},
+  {at: -0.4, expect: '#ffe700'},
+  {at: 0, expect: 'orange'},
+  {at: 0.2, expect: '#cc8433'},
+  {at: 0.6, expect: '#664299'},
+  {at: 1, expect: 'blue'},
+  {at: 1.5, expect: 'blue'}
+]);
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-width.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-width-interpolation.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-width.html
rename to third_party/blink/web_tests/external/wpt/css/css-multicol/animation/column-rule-width-interpolation.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt
deleted file mode 100644
index f0f962fa..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-optical-sizing-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-This is a testharness.js-based test.
-FAIL Can set 'font-optical-sizing' to CSS-wide keywords Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-optical-sizing
-FAIL Can set 'font-optical-sizing' to var() references Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-optical-sizing
-FAIL Can set 'font-optical-sizing' to the 'auto' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-optical-sizing
-FAIL Can set 'font-optical-sizing' to the 'none' keyword Failed to execute 'set' on 'StylePropertyMap': Invalid propertyName: font-optical-sizing
-PASS Setting 'font-optical-sizing' to a length throws TypeError
-PASS Setting 'font-optical-sizing' to a percent throws TypeError
-PASS Setting 'font-optical-sizing' to a time throws TypeError
-PASS Setting 'font-optical-sizing' to an angle throws TypeError
-PASS Setting 'font-optical-sizing' to a flexible length throws TypeError
-PASS Setting 'font-optical-sizing' to a number throws TypeError
-PASS Setting 'font-optical-sizing' to a position throws TypeError
-PASS Setting 'font-optical-sizing' to a URL throws TypeError
-PASS Setting 'font-optical-sizing' to a transform throws TypeError
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/lifecycle/resources/child.html b/third_party/blink/web_tests/external/wpt/lifecycle/resources/child.html
new file mode 100644
index 0000000..708bbfe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/lifecycle/resources/child.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<html>
+<head><title>Frozen Child iframe</title></head>
+<body>
+<script>
+
+// This child removes itself from the parent on dispatch of the freeze event.
+// Regression test of https://crbug.com/994442
+window.document.addEventListener("freeze", () => {
+  window.frameElement.remove();
+});
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/lifecycle/resources/window.html b/third_party/blink/web_tests/external/wpt/lifecycle/resources/window.html
index a7659af4..58181f32 100644
--- a/third_party/blink/web_tests/external/wpt/lifecycle/resources/window.html
+++ b/third_party/blink/web_tests/external/wpt/lifecycle/resources/window.html
@@ -6,6 +6,7 @@
 <script src="/common/utils.js"></script>
 <body>
 <h1>This window will be frozen</h1>
+<iframe id="child_frame" src="child.html"></iframe>
 <script>
 
 const freezingStepName = 'testOnFreeze';
diff --git a/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/scroll-to-text-fragment.html b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/scroll-to-text-fragment.html
index 3e3cfcb..85f07f38 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/scroll-to-text-fragment.html
+++ b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/scroll-to-text-fragment.html
@@ -16,6 +16,7 @@
   { fragment: '##targetText=this,test,-page', expect_position: 'text' },
   { fragment: '##targetText=this%20is%20a%20test%20page', expect_position: 'text' },
   { fragment: '##targetText=this&targetText=test,page', expect_position: 'text' },
+  { fragment: '##targetText=tes&targetText=age', expect_position: 'top' },
   { fragment: '#pagestate##targetText=test', expect_position: 'text' },
   { fragment: '#pagestate##targetText=nomatch', expect_position: 'top' },
   { fragment: '#element##targetText=nomatch', expect_position: 'element' },
diff --git a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-empty-font-family-expected.txt b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-empty-font-family-expected.txt
index 3a9e287..7bb393518 100644
--- a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-empty-font-family-expected.txt
+++ b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-empty-font-family-expected.txt
@@ -2,6 +2,7 @@
 
 font-family: "";
 font-kerning: auto;
+font-optical-sizing: auto;
 font-size: 16px;
 font-size-adjust: none;
 font-stretch: 100%;
diff --git a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-font-family-expected.txt b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-font-family-expected.txt
index b037e3b..1772273 100644
--- a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-font-family-expected.txt
+++ b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-font-family-expected.txt
@@ -2,6 +2,7 @@
 
 font-family: monospace, "Lucida Grande", sans-serif;
 font-kerning: auto;
+font-optical-sizing: auto;
 font-size: 16px;
 font-size-adjust: none;
 font-stretch: 100%;
diff --git a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-listing-expected.txt b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-listing-expected.txt
index 8fb0590..8bb66c72 100644
--- a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-listing-expected.txt
+++ b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-listing-expected.txt
@@ -148,6 +148,7 @@
 flood-color: rgb(0, 0, 0)
 flood-opacity: 1
 font-kerning: auto
+font-optical-sizing: auto
 font-size: 16px
 font-size-adjust: none
 font-stretch: 100%
diff --git a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
index 7e2b26b..b2567b8 100644
--- a/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
+++ b/third_party/blink/web_tests/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
@@ -148,6 +148,7 @@
 flood-color: rgb(0, 0, 0)
 flood-opacity: 1
 font-kerning: auto
+font-optical-sizing: auto
 font-size: 16px
 font-size-adjust: none
 font-stretch: 100%
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
deleted file mode 100644
index 01646946..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html
index 546446f..bf83b3e1 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
deleted file mode 100644
index 01646946..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click.html
index 78a992aa..04189d5 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html
index 92fb7e9..ccc29ab 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html
index 6c20c83..c807e84d 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html
index 40e1071..fd5f5437 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html
index 85855617..a2f52f2 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
deleted file mode 100644
index 01646946..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag.html
index 68580ee..3e53ba8 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html
index f21e463..a1663fb 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
deleted file mode 100644
index 01646946..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation.html
index 9707bdf..4aaefa7 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html
index 145d2673..70d228d6 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html
index 7192bff..7c68578 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html
index cdfa23e..c713d79 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html
index 052fff42..46d9637 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html
index e652438..1ba280e 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html
index 124bc4d5..6e7b71a 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html
index 5a90859..9928c90 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html
index b61a9b9d..407cf7b 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html
index 6268ffd..7ba4614 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html
index fd9193a..2b9a2ea6 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html
index 61292a5..3c5c37ee 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
deleted file mode 100644
index 6a88d971..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html
index 30eaabf..6c7ef14 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
deleted file mode 100644
index 28ed0b3..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format.html
index 8e52fef..fe73b56 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
deleted file mode 100644
index 28ed0b3..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format.html
index 2ea7e7e..41aa3798 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
deleted file mode 100644
index d5370777..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html
index b8905bb..cdff53a 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
deleted file mode 100644
index d5370777..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click.html
index b24aad3e..cc6bbc1 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
deleted file mode 100644
index d5370777..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag.html
index 2bc9ad4..00a7180 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
deleted file mode 100644
index d5370777..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation.html
index 29fb4863..e7c3e99 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html
index a15d319f0..26db7cc 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
deleted file mode 100644
index dae8a211..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html
index a0d8e771..d911e02 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
deleted file mode 100644
index b846542..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match.html
index 2653fcf..eb46ed13 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
deleted file mode 100644
index b846542..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change.html
index 8b40fdd2..ffea59c 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
deleted file mode 100644
index 28ed0b3..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value.html
index ed9c32a0..c14a9f36 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-set-value.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
deleted file mode 100644
index 28ed0b3..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute.html
index eba6318..34be5d5a 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125.html
index 20808cb..1f065ba9 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
deleted file mode 100644
index 1009037..0000000
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200.html
index 8958196..ca885b5 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200.html
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200.html
@@ -2,7 +2,6 @@
 <html>
 <head>
 <script>
-testRunner.setUseMockTheme(false);
 testRunner.waitUntilDone();
 </script>
 <script src='../../../forms/resources/picker-common.js'></script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test-expected.txt
new file mode 100644
index 0000000..eebd1e4
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test-expected.txt
@@ -0,0 +1,4 @@
+Tests accessibility in Performance landing page using the axe-core linter.
+aXe violations: []
+
+
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test.js
new file mode 100644
index 0000000..982b291
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test.js
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function() {
+  TestRunner.addResult('Tests accessibility in Performance landing page using the axe-core linter.');
+
+  await TestRunner.loadModule('axe_core_test_runner');
+  const view = 'timeline';
+  await UI.viewManager.showView(view);
+  const widget = await UI.viewManager.view(view).widget();
+  await AxeCoreTestRunner.runValidation(widget.element);
+
+  TestRunner.completeTest();
+})();
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-call-getter-on-proto-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-call-getter-on-proto-expected.txt
index 7047e39a..f075c857 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-call-getter-on-proto-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-call-getter-on-proto-expected.txt
@@ -4,7 +4,7 @@
     foo: 239
     value: 239
     __proto__: A
-        constructor: ƒ ()
         foo: 239
+        constructor: ƒ ()
         __proto__: Object
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-dir-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-dir-expected.txt
index 22b6e3d..3bc64a10 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-dir-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-dir-expected.txt
@@ -6,32 +6,32 @@
     length: 2
     __proto__: Array(0)
 console-dir.js:13 NodeList(1)
-    0: html
     length: 1
+    0: html
     __proto__: NodeList
 console-dir.js:14 XPathResult
-    booleanValue: (...)
-    invalidIteratorState: false
-    numberValue: (...)
     resultType: 4
-    singleNodeValue: (...)
-    snapshotLength: (...)
+    numberValue: (...)
     stringValue: (...)
+    booleanValue: (...)
+    singleNodeValue: (...)
+    invalidIteratorState: false
+    snapshotLength: (...)
     __proto__: XPathResult
 console-dir.js:24 Object
+    $foo5_: 0
+    " a b ": " a b "
+    c d: "c d"
     "": ""
     "  ": "  "
-    " a b ": " a b "
-    $foo5_: 0
     "a↵↵b↵c": "a↵↵b↵c"
-    c d: "c d"
     negZero: -0
     __proto__: Object
 console-dir.js:27 ƒ anonymous()
-    arguments: null
-    caller: null
     length: 0
     name: ""
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-dir.js:27
@@ -58,19 +58,19 @@
     [300000000 … 399999999]
     __proto__: TypedArray
 console-dir.js:47 Event
-    bubbles: false
-    cancelBubble: false
-    cancelable: false
-    composed: false
-    currentTarget: null
-    defaultPrevented: false
-    eventPhase: 0
     isTrusted: false
-    path: []
-    returnValue: true
-    srcElement: null
-    target: null
     type: ""
+    target: null
+    currentTarget: null
+    eventPhase: 0
+    bubbles: false
+    cancelable: false
+    defaultPrevented: false
+    composed: false
+    srcElement: null
+    returnValue: true
+    cancelBubble: false
+    path: []
     timeStamp: 0
     __proto__: Event
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-format-es6-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-format-es6-expected.txt
index b7c5528f..6df270c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-format-es6-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-format-es6-expected.txt
@@ -119,8 +119,8 @@
 globals[4]
 Symbol(a)
 console-format-es6.js:15 {a: Symbol(), Symbol(a): 2}
-    a: Symbol()
     getter: (...)
+    a: Symbol()
     Symbol(a): 2
     get getter: ƒ getter()
     __proto__: Object
@@ -130,8 +130,8 @@
     __proto__: Array(0)
 globals[5]
 {a: Symbol(), Symbol(a): 2}
-    a: Symbol()
     getter: (...)
+    a: Symbol()
     Symbol(a): 2
     get getter: ƒ getter()
     __proto__: Object
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-format-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-format-expected.txt
index b9017637..54ab1e7 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-format-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-format-expected.txt
@@ -465,12 +465,12 @@
 globals[25]
     <svg id="svg-node"></svg>
 console-format.js:21 {enumerableProp: 4, __underscoreEnumerableProp__: 5, __underscoreNonEnumerableProp: 2, abc: 3, getFoo: ƒ, …}
+    bar: (...)
     enumerableProp: 4
     __underscoreEnumerableProp__: 5
-    abc: 3
-    bar: (...)
-    getFoo: ƒ ()
     __underscoreNonEnumerableProp: 2
+    abc: 3
+    getFoo: ƒ ()
     get bar: ƒ ()
     set bar: ƒ (x)
     __proto__: Object
@@ -480,12 +480,12 @@
     __proto__: Array(0)
 globals[26]
 {enumerableProp: 4, __underscoreEnumerableProp__: 5, __underscoreNonEnumerableProp: 2, abc: 3, getFoo: ƒ, …}
+    bar: (...)
     enumerableProp: 4
     __underscoreEnumerableProp__: 5
-    abc: 3
-    bar: (...)
-    getFoo: ƒ ()
     __underscoreNonEnumerableProp: 2
+    abc: 3
+    getFoo: ƒ ()
     get bar: ƒ ()
     set bar: ƒ (x)
     __proto__: Object
@@ -514,16 +514,16 @@
 ƒ Object() { [native code] }
 console-format.js:21 {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
     constructor: ƒ Object()
-    hasOwnProperty: ƒ hasOwnProperty()
-    isPrototypeOf: ƒ isPrototypeOf()
-    propertyIsEnumerable: ƒ propertyIsEnumerable()
-    toLocaleString: ƒ toLocaleString()
-    toString: ƒ toString()
-    valueOf: ƒ valueOf()
     __defineGetter__: ƒ __defineGetter__()
     __defineSetter__: ƒ __defineSetter__()
+    hasOwnProperty: ƒ hasOwnProperty()
     __lookupGetter__: ƒ __lookupGetter__()
     __lookupSetter__: ƒ __lookupSetter__()
+    isPrototypeOf: ƒ isPrototypeOf()
+    propertyIsEnumerable: ƒ propertyIsEnumerable()
+    toString: ƒ toString()
+    valueOf: ƒ valueOf()
+    toLocaleString: ƒ toLocaleString()
     get __proto__: ƒ __proto__()
     set __proto__: ƒ __proto__()
 console-format.js:22 [{…}]
@@ -533,16 +533,16 @@
 globals[30]
 {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
     constructor: ƒ Object()
-    hasOwnProperty: ƒ hasOwnProperty()
-    isPrototypeOf: ƒ isPrototypeOf()
-    propertyIsEnumerable: ƒ propertyIsEnumerable()
-    toLocaleString: ƒ toLocaleString()
-    toString: ƒ toString()
-    valueOf: ƒ valueOf()
     __defineGetter__: ƒ __defineGetter__()
     __defineSetter__: ƒ __defineSetter__()
+    hasOwnProperty: ƒ hasOwnProperty()
     __lookupGetter__: ƒ __lookupGetter__()
     __lookupSetter__: ƒ __lookupSetter__()
+    isPrototypeOf: ƒ isPrototypeOf()
+    propertyIsEnumerable: ƒ propertyIsEnumerable()
+    toString: ƒ toString()
+    valueOf: ƒ valueOf()
+    toLocaleString: ƒ toLocaleString()
     get __proto__: ƒ __proto__()
     set __proto__: ƒ __proto__()
 console-format.js:21 ƒ ( /**/ foo/**/, /*/**/bar,
@@ -585,13 +585,13 @@
     __proto__: String
     [[PrimitiveValue]]: "abc"
 console-format.js:21 Uint16Array(3) [1, 2, 3]
-    0: 1
-    1: 2
-    2: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 1
+    1: 2
+    2: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format.js:22 [Uint16Array(3)]
@@ -600,13 +600,13 @@
     __proto__: Array(0)
 globals[34]
 Uint16Array(3) [1, 2, 3]
-    0: 1
-    1: 2
-    2: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 1
+    1: 2
+    2: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format.js:21 #text
@@ -624,11 +624,11 @@
 globals[36]
 DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
 console-format.js:21 Uint8Array [3]
-    0: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format.js:22 [Uint8Array(1)]
@@ -637,11 +637,11 @@
     __proto__: Array(0)
 globals[37]
 Uint8Array [3]
-    0: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format.js:21 Uint8Array(400) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …]
@@ -734,10 +734,10 @@
     [[PrimitiveValue]]: 42
 console-format.js:21 String {"abc", 3: "foo", 01: "foo", a: "bar"}
     0: "a"
-    01: "foo"
     1: "b"
     2: "c"
     3: "foo"
+    01: "foo"
     a: "bar"
     length: 3
     __proto__: String
@@ -749,10 +749,10 @@
 globals[44]
 String {"abc", 3: "foo", 01: "foo", a: "bar"}
     0: "a"
-    01: "foo"
     1: "b"
     2: "c"
     3: "foo"
+    01: "foo"
     a: "bar"
     length: 3
     __proto__: String
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-functions-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-functions-expected.txt
index 1a32b572..11ada2c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-functions-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-functions-expected.txt
@@ -2,10 +2,10 @@
 
 console-functions.js:27 ƒ simple() {}
 console-functions.js:28 ƒ simple()
-    arguments: null
-    caller: null
     length: 0
     name: "simple"
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:13
@@ -32,50 +32,50 @@
     [[Scopes]]: Scopes[1]
 console-functions.js:27 ƒ (){}
 console-functions.js:28 ƒ anonymous()
-    arguments: null
-    caller: null
     length: 0
     name: ""
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:16
     [[Scopes]]: Scopes[1]
 console-functions.js:27 ƒ (x, y){}
 console-functions.js:28 ƒ anonymous(x, y)
-    arguments: null
-    caller: null
     length: 2
     name: ""
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:17
     [[Scopes]]: Scopes[1]
 console-functions.js:27 ƒ namedArgs(x) {}
 console-functions.js:28 ƒ namedArgs(x)
-    arguments: null
-    caller: null
     length: 1
     name: "namedArgs"
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:18
     [[Scopes]]: Scopes[1]
 console-functions.js:27 ƒ namedArgs2(x, y) {}
 console-functions.js:28 ƒ namedArgs2(x, y)
-    arguments: null
-    caller: null
     length: 2
     name: "namedArgs2"
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:19
     [[Scopes]]: Scopes[1]
 console-functions.js:27 ƒ ({}) {}
 console-functions.js:28 ƒ anonymous({})
-    arguments: null
-    caller: null
     length: 1
     name: ""
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: console-functions.js:20
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-log-object-with-getter-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-log-object-with-getter-expected.txt
index ed8b0ca..686c13c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-log-object-with-getter-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-log-object-with-getter-expected.txt
@@ -5,5 +5,5 @@
 console-log-object-with-getter.js:32 {}
 console-log-object-with-getter.js:30 {}foo: Objectget foo: ƒ ()set bar: ƒ (x)__proto__: Object
 console-log-object-with-getter.js:31 (2) [(...), empty]0: 1length: 2get 0: ƒ ()set 1: ƒ (x)__proto__: Array(0)
-console-log-object-with-getter.js:32 {}error: [Exception: custom stack]function: [Exception: ƒ ()]number: [Exception: 123]string: [Exception: "myString"]get error: ƒ error()get function: ƒ ()get number: ƒ number()get string: ƒ string()__proto__: Object
+console-log-object-with-getter.js:32 {}error: [Exception: custom stack]string: [Exception: "myString"]number: [Exception: 123]function: [Exception: ƒ ()]get error: ƒ error()get string: ƒ string()get number: ƒ number()get function: ƒ ()__proto__: Object
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-log-short-hand-method-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-log-short-hand-method-expected.txt
index 5fdcaf3..2a495519 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-log-short-hand-method-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-log-short-hand-method-expected.txt
@@ -2,8 +2,8 @@
 
 console-log-short-hand-method.js:24 {foo: ƒ, boo: ƒ, gen: ƒ}
     baz: (...)
-    boo: ƒ (c,d)
     foo: ƒ foo(a,b)
+    boo: ƒ (c,d)
     gen: ƒ* gen()
     get baz: ƒ baz()
     set baz: ƒ baz(x)
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-object-preview-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-object-preview-expected.txt
index 06fb11b4..7179575 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-object-preview-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-object-preview-expected.txt
@@ -56,13 +56,13 @@
 console-object-preview.js:62 Dense array with indexes and propeties
 console-object-preview.js:68 (150) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, …][0 … 99][100 … 149]property_0: 0property_1: 1property_2: 2property_3: 3property_4: 4property_5: 5property_6: 6property_7: 7property_8: 8property_9: 9property_10: 10property_11: 11property_12: 12property_13: 13property_14: 14property_15: 15property_16: 16property_17: 17property_18: 18property_19: 19property_20: 20property_21: 21property_22: 22property_23: 23property_24: 24property_25: 25property_26: 26property_27: 27property_28: 28property_29: 29property_30: 30property_31: 31property_32: 32property_33: 33property_34: 34property_35: 35property_36: 36property_37: 37property_38: 38property_39:
 console-object-preview.js:70 Object with properties containing whitespaces
-console-object-preview.js:77 {" a b ": " a b ", c d: "c d", "": "", "  ": "  ", "a↵↵b↵c": "a↵↵b↵c"}"": """  ": "  "" a b ": " a b ""a↵↵b↵c": "a↵↵b↵c"c d: "c d"__proto__: Object
+console-object-preview.js:77 {" a b ": " a b ", c d: "c d", "": "", "  ": "  ", "a↵↵b↵c": "a↵↵b↵c"}" a b ": " a b "c d: "c d""": """  ": "  ""a↵↵b↵c": "a↵↵b↵c"__proto__: Object
 console-object-preview.js:79 Object with a document.all property
 console-object-preview.js:80 {all: HTMLAllCollection(4)}all: HTMLAllCollection(4) [html, head, base, body]__proto__: Object
 console-object-preview.js:82 Object with special numbers
-console-object-preview.js:84 {nan: NaN, posInf: Infinity, negInf: -Infinity, negZero: -0}nan: NaNnegInf: -InfinitynegZero: -0posInf: Infinity__proto__: Object
+console-object-preview.js:84 {nan: NaN, posInf: Infinity, negInf: -Infinity, negZero: -0}nan: NaNposInf: InfinitynegInf: -InfinitynegZero: -0__proto__: Object
 console-object-preview.js:86 Object with exactly 5 properties: expected to be lossless
 console-object-preview.js:87 {a: 1, b: 2, c: 3, d: 4, e: 5}a: 1b: 2c: 3d: 4e: 5__proto__: Object
-console-object-preview.js:89 {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false}bool: falsenull: nullregexp: /^[regexp]$/gundef: undefined__proto__: Object
+console-object-preview.js:89 {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false}null: nullundef: undefinedregexp: /^[regexp]$/gbool: false__proto__: Object
 console-object-preview.js:96 IHavePrivateProperties {regularProperty: 3, #privateProperty1: 1, #privateProperty2: 2}regularProperty: 3#privateProperty1: 1#privateProperty2: 2__proto__: Object
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-custom-framework-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-custom-framework-expected.txt
index 07639ca8..63e3c7c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-custom-framework-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-custom-framework-expected.txt
@@ -5,9 +5,6 @@
 ======== click ========
 == Framework
 [expanded] button#inspectedNodeRemoveevent-listener-sidebar-custom-framework.js:30
-    useCapture: false
-    passive: false
-    once: false
     handler: function internalHandler(e)
           {
               console.log("I'm internal event handler");
@@ -16,36 +13,36 @@
               if (e.type === "customSecond")
                   customSecondEventListener(e);
           }
+    once: false
+    passive: false
+    useCapture: false
 
 ======== customFirst ========
 == FrameworkUser
 [expanded] button#inspectedNodeevent-listener-sidebar-custom-framework.js:20
-    useCapture: true
-    passive: false
-    once: false
     handler: function customFirstEventListener(e)
           {
               console.log("I'm first custom event listener");
           }
+    once: false
+    passive: false
+    useCapture: true
 
 ======== customSecond ========
 == FrameworkUser
 [expanded] button#inspectedNodeevent-listener-sidebar-custom-framework.js:25
-    useCapture: false
-    passive: false
-    once: false
     handler: function customSecondEventListener(e)
           {
               console.log("I'm second custom event listener");
           }
+    once: false
+    passive: false
+    useCapture: false
 == Exception in fetchers' getter
 
 ======== click ========
 == Raw
 [expanded] button#inspectedNodeRemoveevent-listener-sidebar-custom-framework.js:30
-    useCapture: false
-    passive: false
-    once: false
     handler: function internalHandler(e)
           {
               console.log("I'm internal event handler");
@@ -54,6 +51,9 @@
               if (e.type === "customSecond")
                   customSecondEventListener(e);
           }
+    once: false
+    passive: false
+    useCapture: false
 Framework Event Listeners API Errors:
 	fetcher call produced error: Error in fetcher
 	fetcher call produced error: TypeError: Cannot read property 'eventListeners' of null
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-expected.txt
index b4000f9..30586d0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-expected.txt
@@ -4,69 +4,69 @@
 ======== click ========
 == Raw
 [expanded] documentRemoveevent-listener-sidebar.js:15
-    useCapture: false
-    passive: false
-    once: false
     handler: function documentClickHandler(event) { console.log("click - document - attribute"); }
+    once: false
+    passive: false
+    useCapture: false
 == Raw
 [expanded] documentRemoveevent-listener-sidebar.js:40
-    useCapture: true
-    passive: false
-    once: false
     handler: function() { console.log("click - document - handleEvent"); }
+    once: false
+    passive: false
+    useCapture: true
 == Raw
 [expanded] documentRemoveevent-listener-sidebar.js:28
-    useCapture: true
-    passive: false
-    once: false
     handler: function(event) { console.log("click - document - capturing"); }
+    once: false
+    passive: false
+    useCapture: true
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar.js:26
-    useCapture: false
-    passive: false
-    once: false
     handler: function(event) { console.log("click - button - bubbling (registered after attribute)"); }
+    once: false
+    passive: false
+    useCapture: false
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar.js:25
-    useCapture: false
-    passive: false
-    once: false
     handler: function(event) { console.log("click - button - attribute"); }
+    once: false
+    passive: false
+    useCapture: false
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar.js:21
-    useCapture: false
-    passive: false
-    once: false
     handler: function clickHandler(event) { console.log("click - button - bubbling (registered before attribute)"); }
+    once: false
+    passive: false
+    useCapture: false
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar.js:24
-    useCapture: true
-    passive: false
-    once: false
     handler: function(event) { console.log("click - button - capturing"); }
+    once: false
+    passive: false
+    useCapture: true
 
 ======== custom event ========
 == Raw
 [expanded] bodyRemoveevent-listener-sidebar.js:19
-    useCapture: true
-    passive: false
-    once: true
     handler: function f() {}
+    once: true
+    passive: false
+    useCapture: true
 
 ======== hover ========
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar.js:23
-    useCapture: false
-    passive: false
-    once: false
     handler: function hoverHandler(event) { console.log("hover - button - bubbling"); }
+    once: false
+    passive: false
+    useCapture: false
 
 ======== wheel ========
 == Raw
 [expanded] bodyRemoveToggle Passiveevent-listener-sidebar.js:19
-    useCapture: false
-    passive: true
-    once: false
     handler: function f() {}
+    once: false
+    passive: true
+    useCapture: false
 Listeners for selected node only(should be no listeners):
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery1-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery1-expected.txt
index 503c1777..1ecae1959 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery1-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery1-expected.txt
@@ -4,26 +4,26 @@
 ======== click ========
 == FrameworkUser
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery1.js:18
-    useCapture: true
-    passive: false
-    once: false
     handler: function(){ console.log("second jquery"); }
+    once: false
+    passive: false
+    useCapture: true
 == FrameworkUser
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery1.js:17
-    useCapture: true
-    passive: false
-    once: false
     handler: function(){ console.log("first jquery"); }
+    once: false
+    passive: false
+    useCapture: true
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery1.js:19
-    useCapture: false
-    passive: false
-    once: false
     handler: function() { console.log("addEventListener"); }
+    once: false
+    passive: false
+    useCapture: false
 == Framework
 [expanded] button#nodeRemovejquery-1.11.3.min.js:4
-    useCapture: false
-    passive: false
-    once: false
     handler: function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)}
+    once: false
+    passive: false
+    useCapture: false
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery2-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery2-expected.txt
index c03a22066f8..57d5cc1c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-jquery2-expected.txt
@@ -4,33 +4,33 @@
 ======== click ========
 == FrameworkUser
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery2.js:18
-    useCapture: true
-    passive: false
-    once: false
     handler: function(){ console.log("second jquery"); }
+    once: false
+    passive: false
+    useCapture: true
 == FrameworkUser
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery2.js:17
-    useCapture: true
-    passive: false
-    once: false
     handler: function(){ console.log("first jquery"); }
+    once: false
+    passive: false
+    useCapture: true
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery2.js:20
-    useCapture: false
-    passive: false
-    once: false
     handler: function() { console.log("onclick"); }
+    once: false
+    passive: false
+    useCapture: false
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-jquery2.js:19
-    useCapture: false
-    passive: false
-    once: false
     handler: function() { console.log("addEventListener"); }
+    once: false
+    passive: false
+    useCapture: false
 == Framework
 [expanded] button#nodeRemovejquery-2.1.4.min.js:3
-    useCapture: false
-    passive: false
-    once: false
     handler: function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}
+    once: false
+    passive: false
+    useCapture: false
 Remove listeners..
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-remove-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-remove-expected.txt
index 381809dc..06e793c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-remove-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listener-sidebar-remove-expected.txt
@@ -4,42 +4,42 @@
 ======== click ========
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-remove.js:16
-    useCapture: false
-    passive: false
-    once: false
     handler: function f() {}
+    once: false
+    passive: false
+    useCapture: false
 
 ======== mouseover ========
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-remove.js:16
-    useCapture: false
-    passive: false
-    once: false
     handler: function f() {}
+    once: false
+    passive: false
+    useCapture: false
 Listeners after removal:
 
 ======== mouseover ========
 == Raw
 [expanded] button#nodeRemoveevent-listener-sidebar-remove.js:16
-    useCapture: false
-    passive: false
-    once: false
     handler: function f() {}
+    once: false
+    passive: false
+    useCapture: false
 Listeners for sibling node:
 
 ======== click ========
 == Raw
 [expanded] button#node-siblingRemoveevent-listener-sidebar-remove.js:17
-    useCapture: false
-    passive: false
-    once: false
     handler: function g() {}
+    once: false
+    passive: false
+    useCapture: false
 
 ======== mouseover ========
 == Raw
 [expanded] button#node-siblingRemoveevent-listener-sidebar-remove.js:17
-    useCapture: false
-    passive: false
-    once: false
     handler: function g() {}
+    once: false
+    passive: false
+    useCapture: false
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-about-blank-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-about-blank-expected.txt
index 1ea4a89..9d7cc62b 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-about-blank-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-about-blank-expected.txt
@@ -4,24 +4,24 @@
 ======== click ========
 == Raw
 [expanded] bodyRemoveevent-listeners-about-blank.js:16
-    useCapture: true
-    passive: false
-    once: false
     handler: function f() {}
+    once: false
+    passive: false
+    useCapture: true
 
 ======== hover ========
 == Raw
 [expanded] div#div-in-iframeRemoveevent-listeners-about-blank.js:16
-    useCapture: true
-    passive: false
-    once: true
     handler: function f() {}
+    once: true
+    passive: false
+    useCapture: true
 
 ======== wheel ========
 == Raw
 [expanded] bodyRemoveToggle Passiveevent-listeners-about-blank.js:16
-    useCapture: false
-    passive: true
-    once: false
     handler: function f() {}
+    once: false
+    passive: true
+    useCapture: false
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker-expected.txt
index cbd6eb14..da397e4 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker-expected.txt
@@ -10,10 +10,10 @@
 ======== load ========
 == Raw
 [expanded] WindowRemoveinspected-page.html:1
-    useCapture: false
-    passive: false
-    once: false
     handler: function onload(event) {
 testFunction()
 }
+    once: false
+    passive: false
+    useCapture: false
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/persistence/persistence-mimetype-on-rename-expected.txt b/third_party/blink/web_tests/http/tests/devtools/persistence/persistence-mimetype-on-rename-expected.txt
index ec1c6a7..c6df194 100644
--- a/third_party/blink/web_tests/http/tests/devtools/persistence/persistence-mimetype-on-rename-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/persistence/persistence-mimetype-on-rename-expected.txt
@@ -2,7 +2,7 @@
 
 
 Running: Open foo.js editor
-Text editor mimeType: text/javascript
+Text editor mimeType: text/jsx
 
 Running: Rename foo.js => foo.css
 Text editor mimeType: text/css
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-pause/set-return-value-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-pause/set-return-value-expected.txt
index 95f05fd..d55d76b6 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-pause/set-return-value-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-pause/set-return-value-expected.txt
@@ -5,40 +5,40 @@
 Expanded property: Return value
 Scope variables sidebar pane:
 Local
-    Return value: 42
-    this: undefined
     x: 42
+    this: undefined
+    Return value: 42
 WindowGlobal
     <section collapsed>
 Set return value to {a:1}
 Expanded property: Return value
 Scope variables sidebar pane:
 Local
+    x: 42
+    this: undefined
     Return value: Object
         a: 1
         __proto__: Object
-    this: undefined
-    x: 42
 WindowGlobal
     <section collapsed>
 Try to remove return value
 Expanded property: Return value
 Scope variables sidebar pane:
 Local
+    x: 42
+    this: undefined
     Return value: Object
         a: 1
         __proto__: Object
-    this: undefined
-    x: 42
 WindowGlobal
     <section collapsed>
 Set return value to 239
 Expanded property: Return value
 Scope variables sidebar pane:
 Local
-    Return value: 239
-    this: undefined
     x: 42
+    this: undefined
+    Return value: 239
 WindowGlobal
     <section collapsed>
 Script execution resumed.
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/debugger-expand-scope-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/debugger-expand-scope-expected.txt
index 5c0cc59..44744a84 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/debugger-expand-scope-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/debugger-expand-scope-expected.txt
@@ -9,14 +9,14 @@
     at innerFunction (...)
     at testFunction (...)
 Local
+    x: 2010
     innerFunctionLocalVar: 2012
     negInf: -Infinity
     negZero: -0
     this: Window
-    x: 2010
 Closure (makeClosure)
-    makeClosureLocalVar: "local.TextParam"
     n: "TextParam"
+    makeClosureLocalVar: "local.TextParam"
 WindowGlobal
     <section collapsed>
 Script execution resumed.
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/watch-expressions-preserve-expansion-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/watch-expressions-preserve-expansion-expected.txt
index 8fe7ba7..d606d90 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/watch-expressions-preserve-expansion-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/watch-expressions-preserve-expansion-expected.txt
@@ -122,10 +122,10 @@
     length: 300
     __proto__: Array(0)
 func: function() {return a + b;}
-    arguments: null
-    caller: null
     length: 0
     name: 
+    arguments: null
+    caller: null
     prototype: Object
     __proto__: function () { [native code] }
     [[FunctionLocation]]: Object
@@ -249,10 +249,10 @@
     length: 300
     __proto__: Array(0)
 func: function() {return a + b;}
-    arguments: null
-    caller: null
     length: 0
     name: 
+    arguments: null
+    caller: null
     prototype: Object
     __proto__: function () { [native code] }
     [[FunctionLocation]]: Object
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes-expected.txt
index fa559246..b8b18e4 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes-expected.txt
@@ -15,22 +15,22 @@
     block1: "block {...}"
     const1: 1
 Local
+    x: 2014
     innerFunctionBlockVar: 2116
     innerFunctionLocalVar: 2016
     negInf: -Infinity
     negZero: -0
     this: undefined
-    x: 2014
 Block
     makeClosureDeeperBlockVar: "block.deep.TextParam"
 Closure (window.makeClosure)
-    makeClosureBlockVar: "block.TextParam"
-    makeClosureDeeperLocalVar: "local.deep.TextParam"
-    makeClosureLocalVar: "local.TextParam"
     n: "TextParam"
+    makeClosureBlockVar: "block.TextParam"
+    makeClosureLocalVar: "local.TextParam"
+    makeClosureDeeperLocalVar: "local.deep.TextParam"
 Script
-    globalScriptConst: 42
     globalScriptLet: 41
+    globalScriptConst: 42
 WindowGlobal
     <section collapsed>
 Script execution resumed.
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-scope-minified-variables-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-scope-minified-variables-expected.txt
index 6778500..9a20758 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-scope-minified-variables-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/debugger-scope-minified-variables-expected.txt
@@ -7,10 +7,10 @@
 Catch
     error: "boom!"
 Local
-    longMap: Map(1) {100 => "hello"}
-    longObject: {}
     parameter1: 100
     parameter2: "hello"
+    longObject: {}
+    longMap: Map(1) {100 => "hello"}
     this: Window
 WindowGlobal
     <section collapsed>
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/properties-special-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/properties-special-expected.txt
index 8aaa146..ebff8982 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger/properties-special-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger/properties-special-expected.txt
@@ -3,10 +3,10 @@
     __proto__: Boolean
     [[PrimitiveValue]]: true
 properties-special.js:12 ƒ anonymous(a,b)
-    arguments: null
-    caller: null
     length: 2
     name: ""
+    arguments: null
+    caller: null
     prototype: {constructor: ƒ}
     __proto__: ƒ ()
     [[FunctionLocation]]: properties-special.js:12
diff --git a/third_party/blink/web_tests/http/tests/devtools/startup/console/console-format-startup-expected.txt b/third_party/blink/web_tests/http/tests/devtools/startup/console/console-format-startup-expected.txt
index f5369586..a49f5a94 100644
--- a/third_party/blink/web_tests/http/tests/devtools/startup/console/console-format-startup-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/startup/console/console-format-startup-expected.txt
@@ -374,8 +374,8 @@
     __proto__: Array(0)
 console-format-startup.html:164 Object table
 console-format-startup.html:165 Object
-    bar: {a: 3, b: 4}
     foo: {a: 1, b: 2}
+    bar: {a: 3, b: 4}
     __proto__: Object
 console-format-startup.html:167 Null as columns
 console-format-startup.html:168 Array(2)
@@ -452,21 +452,22 @@
     length: 3
     __proto__: Array(0)
 console-format-startup.html:206 HTMLCollection(1)
-    0: select#sel
     length: 1
+    0: select#sel
     sel: select#sel
     __proto__: HTMLCollection
 console-format-startup.html:210 HTMLCollection(1)
-    0: script
     length: 1
+    0: script
     __proto__: HTMLCollection
 console-format-startup.html:214 HTMLOptionsCollection(2)
-    0: option
-    1: option
     length: 2
     selectedIndex: 0
+    0: option
+    1: option
     __proto__: HTMLOptionsCollection
 console-format-startup.html:218 HTMLAllCollection(14)
+    length: 14
     0: html
     1: head
     2: script
@@ -481,26 +482,25 @@
     11: option
     12: input
     13: input
-    length: 14
-    f: form#f
-    p: p#p
-    sel: select#sel
-    svg-node: svg#svg-node
     x: HTMLCollection(3) [div#x, input, input, x: div#x]
+    p: p#p
+    svg-node: svg#svg-node
+    f: form#f
+    sel: select#sel
     __proto__: HTMLAllCollection
 console-format-startup.html:222 HTMLFormControlsCollection(3)
+    length: 3
     0: select#sel
     1: input
     2: input
-    length: 3
     sel: select#sel
     x: RadioNodeList(2) [input, input, value: ""]
     __proto__: HTMLFormControlsCollection
 console-format-startup.html:226 RadioNodeList(2)
+    value: ""
+    length: 2
     0: input
     1: input
-    length: 2
-    value: ""
     __proto__: RadioNodeList
 console-format-startup.html:232 Array(2)
     0: 1
@@ -508,14 +508,14 @@
     length: 2
     __proto__: Array(0)
 console-format-startup.html:235 NonArrayWithLength
-    keys: []
     length: (...)
+    keys: []
     __proto__: Object
 console-format-startup.html:242 Arguments(2)
     0: 1
     1: "2"
-    callee: ƒ generateArguments(foo, bar)
     length: 2
+    callee: ƒ generateArguments(foo, bar)
     Symbol(Symbol.iterator): ƒ values()
     __proto__: Object
 console-format-startup.html:246 DOMTokenList(0)
@@ -775,12 +775,12 @@
 globals[25]
     <svg id="svg-node"></svg>
 console-format-startup.html:7 {enumerableProp: 4, __underscoreEnumerableProp__: 5, __underscoreNonEnumerableProp: 2, abc: 3, getFoo: ƒ, …}
+    bar: (...)
     enumerableProp: 4
     __underscoreEnumerableProp__: 5
-    abc: 3
-    bar: (...)
-    getFoo: ƒ ()
     __underscoreNonEnumerableProp: 2
+    abc: 3
+    getFoo: ƒ ()
     get bar: ƒ ()
     set bar: ƒ (x)
     __proto__: Object
@@ -790,12 +790,12 @@
     __proto__: Array(0)
 globals[26]
 {enumerableProp: 4, __underscoreEnumerableProp__: 5, __underscoreNonEnumerableProp: 2, abc: 3, getFoo: ƒ, …}
+    bar: (...)
     enumerableProp: 4
     __underscoreEnumerableProp__: 5
-    abc: 3
-    bar: (...)
-    getFoo: ƒ ()
     __underscoreNonEnumerableProp: 2
+    abc: 3
+    getFoo: ƒ ()
     get bar: ƒ ()
     set bar: ƒ (x)
     __proto__: Object
@@ -824,16 +824,16 @@
 ƒ Object() { [native code] }
 console-format-startup.html:7 {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
     constructor: ƒ Object()
-    hasOwnProperty: ƒ hasOwnProperty()
-    isPrototypeOf: ƒ isPrototypeOf()
-    propertyIsEnumerable: ƒ propertyIsEnumerable()
-    toLocaleString: ƒ toLocaleString()
-    toString: ƒ toString()
-    valueOf: ƒ valueOf()
     __defineGetter__: ƒ __defineGetter__()
     __defineSetter__: ƒ __defineSetter__()
+    hasOwnProperty: ƒ hasOwnProperty()
     __lookupGetter__: ƒ __lookupGetter__()
     __lookupSetter__: ƒ __lookupSetter__()
+    isPrototypeOf: ƒ isPrototypeOf()
+    propertyIsEnumerable: ƒ propertyIsEnumerable()
+    toString: ƒ toString()
+    valueOf: ƒ valueOf()
+    toLocaleString: ƒ toLocaleString()
     get __proto__: ƒ __proto__()
     set __proto__: ƒ __proto__()
 console-format-startup.html:8 [{…}]
@@ -843,16 +843,16 @@
 globals[30]
 {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
     constructor: ƒ Object()
-    hasOwnProperty: ƒ hasOwnProperty()
-    isPrototypeOf: ƒ isPrototypeOf()
-    propertyIsEnumerable: ƒ propertyIsEnumerable()
-    toLocaleString: ƒ toLocaleString()
-    toString: ƒ toString()
-    valueOf: ƒ valueOf()
     __defineGetter__: ƒ __defineGetter__()
     __defineSetter__: ƒ __defineSetter__()
+    hasOwnProperty: ƒ hasOwnProperty()
     __lookupGetter__: ƒ __lookupGetter__()
     __lookupSetter__: ƒ __lookupSetter__()
+    isPrototypeOf: ƒ isPrototypeOf()
+    propertyIsEnumerable: ƒ propertyIsEnumerable()
+    toString: ƒ toString()
+    valueOf: ƒ valueOf()
+    toLocaleString: ƒ toLocaleString()
     get __proto__: ƒ __proto__()
     set __proto__: ƒ __proto__()
 console-format-startup.html:7 ƒ ( /**/ foo/**/, /*/**/bar,
@@ -895,13 +895,13 @@
     __proto__: String
     [[PrimitiveValue]]: "abc"
 console-format-startup.html:7 Uint16Array(3) [1, 2, 3]
-    0: 1
-    1: 2
-    2: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 1
+    1: 2
+    2: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format-startup.html:8 [Uint16Array(3)]
@@ -910,13 +910,13 @@
     __proto__: Array(0)
 globals[34]
 Uint16Array(3) [1, 2, 3]
-    0: 1
-    1: 2
-    2: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 1
+    1: 2
+    2: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format-startup.html:7 #text
@@ -934,11 +934,11 @@
 globals[36]
 DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
 console-format-startup.html:7 Uint8Array [3]
-    0: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format-startup.html:8 [Uint8Array(1)]
@@ -947,11 +947,11 @@
     __proto__: Array(0)
 globals[37]
 Uint8Array [3]
-    0: 3
     buffer: (...)
     byteLength: (...)
     byteOffset: (...)
     length: (...)
+    0: 3
     Symbol(Symbol.toStringTag): (...)
     __proto__: TypedArray
 console-format-startup.html:7 Uint8Array(400) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …]
@@ -1044,10 +1044,10 @@
     [[PrimitiveValue]]: 42
 console-format-startup.html:7 String {"abc", 3: "foo", 01: "foo", a: "bar"}
     0: "a"
-    01: "foo"
     1: "b"
     2: "c"
     3: "foo"
+    01: "foo"
     a: "bar"
     length: 3
     __proto__: String
@@ -1059,10 +1059,10 @@
 globals[44]
 String {"abc", 3: "foo", 01: "foo", a: "bar"}
     0: "a"
-    01: "foo"
     1: "b"
     2: "c"
     3: "foo"
+    01: "foo"
     a: "bar"
     length: 3
     __proto__: String
@@ -1121,8 +1121,8 @@
 globals[49]
 Symbol(a)
 console-format-startup.html:7 {a: Symbol(), Symbol(a): 2}
-    a: Symbol()
     getter: (...)
+    a: Symbol()
     Symbol(a): 2
     get getter: ƒ getter()
     __proto__: Object
@@ -1132,8 +1132,8 @@
     __proto__: Array(0)
 globals[50]
 {a: Symbol(), Symbol(a): 2}
-    a: Symbol()
     getter: (...)
+    a: Symbol()
     Symbol(a): 2
     get getter: ƒ getter()
     __proto__: Object
diff --git a/third_party/blink/web_tests/http/tests/devtools/user-metrics-expected.txt b/third_party/blink/web_tests/http/tests/devtools/user-metrics-expected.txt
index 35549c80..da46d33 100644
--- a/third_party/blink/web_tests/http/tests/devtools/user-metrics-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/user-metrics-expected.txt
@@ -44,11 +44,21 @@
     audits : 18
     console : 8
     drawer-animations : 11
+    drawer-changes.changes : 23
     drawer-console-view : 10
+    drawer-coverage : 19
+    drawer-live_heap_profile : 26
+    drawer-network.blocked-urls : 28
     drawer-network.config : 12
+    drawer-performance.monitor : 24
+    drawer-protocol-monitor : 20
+    drawer-release-note : 25
+    drawer-remote-devices : 21
     drawer-rendering : 13
     drawer-sensors : 14
+    drawer-sources.quick : 27
     drawer-sources.search : 15
+    drawer-web-audio : 22
     elements : 1
     heap_profiler : 6
     js_profiler : 17
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
new file mode 100644
index 0000000..6163606
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS getAnimations returns one Animation per transitioning property
+PASS getAnimations returns CSSTransition objects for CSS Transitions
+PASS getAnimations does not return finished CSS Transitions
+PASS getAnimations does not return a transition for a non-animatable property
+PASS getAnimations does not return a transition for an unsupposed property
+FAIL getAnimations sorts simultaneous transitions by name assert_equals: expected "border-left-width" but got "opacity"
+PASS getAnimations sorts transitions by when they were generated
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index c938f29..c6b59fe 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 2b2826d..a4ef31d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index d50a7b09..5742b0e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index f005826c..fedcbd20 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 1923d0d..cd24705 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index d80c396..25ef58a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 2b2826d..a4ef31d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index b3b0fd9..67380867f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 1db6f6e..276afe4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 85d19e0..95ae484 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index dedb0be..45b2a08 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index c1d2dd9..3730259 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index f5aa62627..798974d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 9f32693..3a6cef1 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 9bd0edd..cd7ba6e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index e724374..361d2cb 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index d2fcb59..bb51135 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index fc9f9fa6..1b052c91 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index aafde509..4d121e5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 8437e06..763efc57c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 017873c2..2b019cd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 7435d31..229f74e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index dd3c40a..31887aa 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 73d01f9d..093f98f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index cf1d256..dc32968 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index cf1d256..dc32968 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 697e016e..692693d6 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 592c73b..54721ba 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index e4d355f..d65554ab 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index b51a3b8..da43984c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index dab82e64..d56acb4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index ba22656..34d2d6f1 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index 3506c0f..70bd340d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 05aff4d2..5c9fe6d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index fe86ee1..61982c5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index 97cc793..2ee51bb0 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 78c70a4..192dbab 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 2692915..fbd3929 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index a3ff8f5..4b7e29a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index ac670b6f..28c34524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index 9276a92c..0bbacb3 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 6e25cb5f..02bc4794 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 626a7034..91fdf05 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index ca7f3e2..35f0f06a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index dfb6339..c6f30312 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 2b4e560..57d0904 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index d48e9e33..92926bd 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 6fd67c19..908aa9b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index 0fe70ff..fd89212f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 7e9d150..f6dd830 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 4215ebe10..8695007 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 4577b736..6542d662 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 975ca10e..a3871e4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 00e252c..e37b407 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 8fa44349..32d1cc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 15a7452..75eb9be 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 8df6bfcf..09d57f2 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 77f6cc38..4a6f110 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 67197f9..dc5d0112df 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 1ea425c6..ad79d4e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index ad4ae26..2dbabcc 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index fb1a328d..6d2afae 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index 5794e24..e5490f4d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index d293115..3ea29944 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 139ef26..9d79c67 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 0a2f0e8..f5a00bf5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index 97cc793..2ee51bb0 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 78c70a4..192dbab 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 2692915..fbd3929 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index a3ff8f5..4b7e29a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index ac670b6f..28c34524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index 9276a92c..0bbacb3 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 6e25cb5f..02bc4794 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 626a7034..91fdf05 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index ca7f3e2..35f0f06a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index dfb6339..c6f30312 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 2b4e560..57d0904 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index d48e9e33..92926bd 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 6fd67c19..908aa9b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index 0fe70ff..fd89212f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 7e9d150..f6dd830 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 4215ebe10..8695007 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 4577b736..6542d662 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 975ca10e..a3871e4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 00e252c..e37b407 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 8fa44349..32d1cc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 15a7452..75eb9be 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 8df6bfcf..09d57f2 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 77f6cc38..4a6f110 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 67197f9..dc5d0112df 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 1ea425c6..ad79d4e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index ad4ae26..2dbabcc 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index fb1a328d..6d2afae 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index 5794e24..e5490f4d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index d293115..3ea29944 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 139ef26..9d79c67 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 0a2f0e8..f5a00bf5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index 97cc793..2ee51bb0 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 78c70a4..192dbab 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 2692915..fbd3929 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index a3ff8f5..4b7e29a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index ac670b6f..28c34524 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 74f49e2..5b62bc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index 9276a92c..0bbacb3 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 6e25cb5f..02bc4794 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 626a7034..91fdf05 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index ca7f3e2..35f0f06a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index dfb6339..c6f30312 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 2b4e560..57d0904 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index d48e9e33..92926bd 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 6fd67c19..908aa9b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index 0fe70ff..fd89212f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 7e9d150..f6dd830 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 4215ebe10..8695007 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 4577b736..6542d662 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 975ca10e..a3871e4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 00e252c..e37b407 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 8fa44349..32d1cc4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 15a7452..75eb9be 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 8df6bfcf..09d57f2 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index d3a5532..2c2b460 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 77f6cc38..4a6f110 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 67197f9..dc5d0112df 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 1ea425c6..ad79d4e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index ad4ae26..2dbabcc 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index fb1a328d..6d2afae 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index 5794e24..e5490f4d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index d293115..3ea29944 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 139ef26..9d79c67 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 0a2f0e8..f5a00bf5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index 129adc8..6aca9f5 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 6bf11e8..c6524e68 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index e4b5de44..c365b2c 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index fff5e4d..c750320 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 4491f97..65bed6c8 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index f71675a9..92ed97b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 6bf11e8..c6524e68 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index 065cff1..65365302 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 4cab342..9664f4b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index ed7d334..61ad50d 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 35a44799..93ea8f5 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index 1602af4..fdc6751 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 2bfb45b..505ef7b3 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 37cff23..a12d326 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 71f19c42..9e36a42b 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index a2fdb5e..2412dda 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 358b6e2..caa089d 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 5fa35de..f9e4f27 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 934e209..0e3dcf1 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index ce435da8..612575a 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 5892c80..24c05f8 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 8095a29..3403ed9c 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 0ec76978..421bc39d 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 4bf7436..ec89bbe9 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index 1f4606f6..b085790 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index 1f4606f6..b085790 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index c95f913..0443df5 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index ae76a47d..038990af 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index cdec9d0..f5cce07 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index 280d225..04e968cc 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index 8422596..1bca672 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index ddb6e3bd..26eea760 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index 7cf98ba..007215a 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 5cf7d9d..09421ce 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 7a073267..6198bc27 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
new file mode 100644
index 0000000..6163606
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS getAnimations returns one Animation per transitioning property
+PASS getAnimations returns CSSTransition objects for CSS Transitions
+PASS getAnimations does not return finished CSS Transitions
+PASS getAnimations does not return a transition for a non-animatable property
+PASS getAnimations does not return a transition for an unsupposed property
+FAIL getAnimations sorts simultaneous transitions by name assert_equals: expected "border-left-width" but got "opacity"
+PASS getAnimations sorts transitions by when they were generated
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index 129adc8..6aca9f5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 6bf11e8..c6524e68 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index e4b5de44..c365b2c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index fff5e4d..c750320 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 4491f97..65bed6c8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index f71675a9..92ed97b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 6bf11e8..c6524e68 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index 065cff1..65365302 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 4cab342..9664f4b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index ed7d334..61ad50d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 35a44799..93ea8f5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index 1602af4..fdc6751 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 2bfb45b..505ef7b3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 37cff23..a12d326 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 71f19c42..9e36a42b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index a2fdb5e..2412dda 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 358b6e2..caa089d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 5fa35de..f9e4f27 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 934e209..0e3dcf1 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index ce435da8..612575a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 5892c80..24c05f8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index 8095a29..3403ed9c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 0ec76978..421bc39d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 4bf7436..ec89bbe9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index 1f4606f6..b085790 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index 1f4606f6..b085790 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index c95f913..0443df5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index ae76a47d..038990af 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index cdec9d0..f5cce07 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index 280d225..04e968cc 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index 8422596..1bca672 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index ddb6e3bd..26eea760 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index 7cf98ba..007215a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 5cf7d9d..09421ce 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 7a073267..6198bc27 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
new file mode 100644
index 0000000..6163606
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-transitions/Element-getAnimations.tentative-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS getAnimations returns one Animation per transitioning property
+PASS getAnimations returns CSSTransition objects for CSS Transitions
+PASS getAnimations does not return finished CSS Transitions
+PASS getAnimations does not return a transition for a non-animatable property
+PASS getAnimations does not return a transition for an unsupposed property
+FAIL getAnimations sorts simultaneous transitions by name assert_equals: expected "border-left-width" but got "opacity"
+PASS getAnimations sorts transitions by when they were generated
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index b846542..6a3b490 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index b846542..6a3b490 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
similarity index 74%
rename from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
rename to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index b846542..6a3b490 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
new file mode 100644
index 0000000..af330a81
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index b846542..6a3b490 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 816abce..2d8ca591 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
similarity index 74%
rename from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
rename to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index b846542..52b6c085 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index b846542..52b6c085 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
similarity index 74%
rename from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
rename to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index dae8a211..67a02d35 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index dae8a211..67a02d35 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index dae8a211..67a02d35 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index dae8a211..67a02d35 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 816abce..127267b 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 816abce..127267b 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
new file mode 100644
index 0000000..af330a81
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
new file mode 100644
index 0000000..af330a81
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index b846542..52b6c085 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
similarity index 74%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index b846542..52b6c085 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
new file mode 100644
index 0000000..33356cc7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
similarity index 72%
copy from third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
copy to third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 816abce..21a94b3 100644
--- a/third_party/blink/web_tests/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index c0223054..2c26fa78 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 70e91ab..871f3166 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 4dc8ba17..0e05cf9 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 4e5798e..5881f3e 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 22889e7..7e0a0a78 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index e0d6a601..7e8062e 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 70e91ab..871f3166 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index fe5e2e2..c049d8f 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 4aa6076..652e5fb90 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index aa26fe4..be2d1e6ab 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index ef266bfd..d45e116 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 874650b..1c88c84a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 3b3b662..d64194e 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index ff3a1ad..bb5a9c77 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 87effa5a..f726235 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 20631627..aab8e56 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index da59433..f157fe8d 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index b9c1433..77e1119 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 4c37386bc..5fd83282 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index f904e675..1a2830e07 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index f93a8348..f001b69 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index ff354762..b8ed8f2 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index 687c6c55..e3c346b 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index fc90aae..0fbc2b4 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index 010531f..d987b1de 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index 1bb63e6..e61ad0d2 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 81ed505..0f7de89 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 0b0b9212..06a2fb93 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/css/getComputedStyle-listing-expected.txt b/third_party/blink/web_tests/svg/css/getComputedStyle-listing-expected.txt
index 570664b1..eef906b 100644
--- a/third_party/blink/web_tests/svg/css/getComputedStyle-listing-expected.txt
+++ b/third_party/blink/web_tests/svg/css/getComputedStyle-listing-expected.txt
@@ -148,6 +148,7 @@
 flood-color: rgb(0, 0, 0)
 flood-opacity: 1
 font-kerning: auto
+font-optical-sizing: auto
 font-size: 16px
 font-size-adjust: none
 font-stretch: 100%
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
index c0223054..2c26fa78 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
index 70e91ab..871f3166 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 4dc8ba17..0e05cf9 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index 4e5798e..5881f3e 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 22889e7..7e0a0a78 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index e0d6a601..7e8062e 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
index 70e91ab..871f3166 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
index fe5e2e2..c049d8f 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-after-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 4aa6076..652e5fb90 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 6cc8559..32d807a3 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
index aa26fe4..be2d1e6ab 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index 3ed9a01..33310c5 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index ef266bfd..d45e116 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index 8073d34..ca1e855 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
index 874650b..1c88c84a 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index d34c671..d9e45fad 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 3b3b662..d64194e 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
index ff3a1ad..bb5a9c77 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
index 87effa5a..f726235 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 20631627..aab8e56 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index da59433..f157fe8d 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
index b9c1433..77e1119 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
index 4c37386bc..5fd83282 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 38bfd58..d5f3137 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
index dd641d9..3b2a8c6 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
index dd641d9..3b2a8c6 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index f904e675..1a2830e07 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index f93a8348..f001b69 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index ff354762..b8ed8f2 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
index 687c6c55..e3c346b 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
index fc90aae..0fbc2b4 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
index 010531f..d987b1de 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
index 1bb63e6..e61ad0d2 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
index 81ed505..0f7de89 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
index 0b0b9212..06a2fb93 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
index 0835ba5..4793d224 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
@@ -142,6 +142,7 @@
 fontFamily
 fontFeatureSettings
 fontKerning
+fontOpticalSizing
 fontSize
 fontStretch
 fontStyle
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
index 6add93f..6a61111 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/css-property-listing-expected.txt
@@ -176,6 +176,7 @@
     font-family
     font-feature-settings
     font-kerning
+    font-optical-sizing
     font-size
     font-stretch
     font-style
diff --git a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
index 9073aad3..b9bc397 100644
--- a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
+++ b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
@@ -151,6 +151,7 @@
 fontFamily
 fontFeatureSettings
 fontKerning
+fontOpticalSizing
 fontSize
 fontSizeAdjust
 fontStretch
diff --git a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
index 6c79bc1..d8aae8b6 100644
--- a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
@@ -177,6 +177,7 @@
     font-family
     font-feature-settings
     font-kerning
+    font-optical-sizing
     font-size
     font-size-adjust
     font-stretch
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index b170041b..110c766 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-10-1-47-gcc17f852d
-Revision: cc17f852d575a8a66f9be51461af550d0f413891
+Version: VER-2-10-1-48-g99f23d6ff
+Revision: 99f23d6ff2203966d210bccd49eacc62a20328f9
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
 License File: src/docs/FTL.TXT
diff --git a/tools/android/elf_compression/compress_section.py b/tools/android/elf_compression/compress_section.py
index 0f7d312..2efe7ef 100755
--- a/tools/android/elf_compression/compress_section.py
+++ b/tools/android/elf_compression/compress_section.py
@@ -120,7 +120,8 @@
   segments is required here.
   """
   elf = elf_headers.ElfHeader(data)
-  for phdr in elf.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_LOAD):
+  for phdr in elf.GetProgramHeadersByType(
+      elf_headers.ProgramHeader.Type.PT_LOAD):
     # Current version of the prototype only supports ranges which are fully
     # contained inside one LOAD segment. It should cover most of the common
     # cases.
@@ -191,14 +192,15 @@
   old_phoff = elf_hdr.e_phoff
   new_phoff = elf_hdr.e_phoff = len(data)
 
-  unaligned_new_vaddr = _FindNewVaddr(elf_hdr.GetPhdrs())
+  unaligned_new_vaddr = _FindNewVaddr(elf_hdr.GetProgramHeaders())
   new_vaddr = MatchVaddrAlignment(unaligned_new_vaddr, new_phoff)
   # Since we moved the PHDR section to the end of the file, we need to create a
   # new LOAD segment to load it in.
   current_filesize = elf_hdr.e_phnum * elf_hdr.e_phentsize
   # We are using current_filesize while adding new program header due to
-  # AddPhdr handling the increase of size due to addition of new header.
-  elf_hdr.AddPhdr(
+  # AddProgramHeader handling the increase of size due to addition of new
+  # header.
+  elf_hdr.AddProgramHeader(
       elf_headers.ProgramHeader.Create(
           elf_hdr.byte_order,
           p_type=elf_headers.ProgramHeader.Type.PT_LOAD,
@@ -212,7 +214,8 @@
       ))
 
   # PHDR segment if it exists should point to the new location.
-  for phdr in elf_hdr.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_PHDR):
+  for phdr in elf_hdr.GetProgramHeadersByType(
+      elf_headers.ProgramHeader.Type.PT_PHDR):
     phdr.p_offset = new_phoff
     phdr.p_vaddr = new_vaddr
     phdr.p_paddr = new_vaddr
@@ -227,17 +230,53 @@
   elf_hdr.PatchData(data)
 
 
-def _SplitLoadSegment(data, l, r):
+def _CreateLoadForCompressedSection(data):
+  """Creates a LOAD segment to previously created COMPRESSED_SECTION_NAME."""
+  elf_hdr = elf_headers.ElfHeader(data)
+
+  section_offset = None
+  section_size = None
+  for shdr in elf_hdr.GetSectionHeaders():
+    if shdr.GetStrName() == COMPRESSED_SECTION_NAME:
+      section_offset = shdr.sh_offset
+      section_size = shdr.sh_size
+      break
+  if section_offset is None:
+    raise RuntimeError(
+        'Failed to locate {} section in file'.format(COMPRESSED_SECTION_NAME))
+
+  unaligned_new_vaddr = _FindNewVaddr(elf_hdr.GetProgramHeaders())
+  new_vaddr = MatchVaddrAlignment(unaligned_new_vaddr, section_offset)
+  elf_hdr.AddProgramHeader(
+      elf_headers.ProgramHeader.Create(
+          elf_hdr.byte_order,
+          p_type=elf_headers.ProgramHeader.Type.PT_LOAD,
+          p_flags=elf_headers.ProgramHeader.Flags.PF_R,
+          p_offset=section_offset,
+          p_vaddr=new_vaddr,
+          p_paddr=new_vaddr,
+          p_filesz=section_size,
+          p_memsz=section_size,
+          p_align=ADDRESS_ALIGN,
+      ))
+  elf_hdr.PatchData(data)
+
+
+def _SplitLoadSegmentAndNullifyRange(data, l, r):
   """Find LOAD segment covering [l, r) and splits it into three segments.
 
   Split is done so one of the LOAD segments contains only [l, r) and nothing
   else. If the range is located at the start or at the end of the segment less
   than three segments may be created.
+
+  The resulting LOAD segment containing [l, r) is edited so it sets the
+  corresponding virtual address range to zeroes, ignoring file content.
   """
   elf_hdr = elf_headers.ElfHeader(data)
 
   range_phdr = None
-  for phdr in elf_hdr.GetPhdrsByType(elf_headers.ProgramHeader.Type.PT_LOAD):
+  for phdr in elf_hdr.GetProgramHeadersByType(
+      elf_headers.ProgramHeader.Type.PT_LOAD):
     if phdr.p_offset <= l and phdr.FilePositionEnd() >= r:
       range_phdr = phdr
       break
@@ -249,7 +288,7 @@
   left_segment_size = l - range_phdr.p_offset
   if left_segment_size > 0:
     # Creating LOAD segment containing the [phdr.p_offset, l) part.
-    elf_hdr.AddPhdr(
+    elf_hdr.AddProgramHeader(
         elf_headers.ProgramHeader.Create(
             elf_hdr.byte_order,
             p_type=range_phdr.p_type,
@@ -267,7 +306,7 @@
     right_segment_address = range_phdr.p_vaddr + right_segment_delta
     right_segment_filesize = max(range_phdr.p_filesz - right_segment_delta, 0)
     right_segment_memsize = range_phdr.p_memsz - right_segment_delta
-    elf_hdr.AddPhdr(
+    elf_hdr.AddProgramHeader(
         elf_headers.ProgramHeader.Create(
             elf_hdr.byte_order,
             p_type=range_phdr.p_type,
@@ -284,7 +323,7 @@
   range_phdr.p_offset = l
   range_phdr.p_vaddr = central_segment_address
   range_phdr.p_paddr = central_segment_address
-  range_phdr.p_filesz = r - l
+  range_phdr.p_filesz = 0
   range_phdr.p_memsz = r - l
 
   elf_hdr.PatchData(data)
@@ -314,7 +353,9 @@
 
   _CopyRangeIntoCompressedSection(data, left_range, right_range)
   _MovePhdrToTheEnd(data)
-  _SplitLoadSegment(data, left_range, right_range)
+
+  _CreateLoadForCompressedSection(data)
+  _SplitLoadSegmentAndNullifyRange(data, left_range, right_range)
 
   with open(args.output, 'wb') as f:
     f.write(data)
diff --git a/tools/android/elf_compression/elf_headers.py b/tools/android/elf_compression/elf_headers.py
index 59b240c..f929191b 100644
--- a/tools/android/elf_compression/elf_headers.py
+++ b/tools/android/elf_compression/elf_headers.py
@@ -103,6 +103,86 @@
     return obj
 
 
+class SectionHeader(ElfEntry):
+  """This class represents SectionEntry from ELF standard."""
+
+  class Type(enum.IntEnum):
+    SHT_NULL = 0
+    SHT_PROGBITS = 1
+    SHT_SYMTAB = 2
+    SHT_STRTAB = 3
+    SHT_RELA = 4
+    SHT_HASH = 5
+    SHT_DYNAMIC = 6
+    SHT_NOTE = 7
+    SHT_NOBITS = 8
+    SHT_REL = 9
+    SHT_SHLIB = 10
+    SHT_DYNSYM = 11
+
+  def __init__(self, byte_order):
+    self.sh_name = None
+    self.sh_type = None
+    self.sh_flags = None
+    self.sh_addr = None
+    self.sh_offset = None
+    self.sh_size = None
+    self.sh_link = None
+    self.sh_info = None
+    self.sh_addralign = None
+    self.sh_entsize = None
+    fields = [
+        ('sh_name', 4),
+        ('sh_type', 4),
+        ('sh_flags', 8),
+        ('sh_addr', 8),
+        ('sh_offset', 8),
+        ('sh_size', 8),
+        ('sh_link', 4),
+        ('sh_info', 4),
+        ('sh_addralign', 8),
+        ('sh_entsize', 8),
+    ]
+    super(SectionHeader, self).__init__(byte_order, fields)
+    # This is readonly version of section name in string form. We can't set it
+    # in constructor since to actually get it we need to instantiate
+    # StringTableHeader so it is set by SetStrName method later on.
+    self._str_name = ''
+
+  def SetStrName(self, name):
+    """Sets the resolved sh_name to provided str.
+
+    Changes made by this method WILL NOT propagate into data after PatchData
+    call.
+
+    Args:
+      name: str. Name to set.
+    """
+    self._str_name = name
+
+  def GetStrName(self):
+    """Returns the sh_name as resolved string."""
+    return self._str_name
+
+
+class StringTableHeader(SectionHeader):
+  """This class represents a StringTableHeader header entry."""
+
+  def GetName(self, data, string_index):
+    """Returns the name located on string_index table's offset.
+
+    Args:
+      data: bytearray. The file's data.
+      string_index: int. Offset from the beginning of the string table to the
+        required name.
+    """
+    begin = self.sh_offset + string_index
+    end = data.find(0, begin)
+    if end == -1:
+      raise RuntimeError('Failed to find null terminator for StringTable entry')
+    return data[begin:end].decode('ascii')
+
+
 class ProgramHeader(ElfEntry):
   """This class represent PhdrEntry from ELF standard."""
 
@@ -198,13 +278,30 @@
       return 'big'
     raise RuntimeError('Failed to parse ei_data')
 
-  def _ParsePhdrs(self, data):
+  def _ParseProgramHeaders(self, data):
     current_offset = self.e_phoff
     for _ in range(0, self.e_phnum):
       self.phdrs.append(
           ProgramHeader.FromBytes(self.byte_order, data, current_offset))
       current_offset += self.e_phentsize
 
+  def _ParseSectionHeaders(self, data):
+    current_offset = self.e_shoff
+    string_table = None
+    for _ in range(0, self.e_shnum):
+      shdr = SectionHeader.FromBytes(self.byte_order, data, current_offset)
+      self.shdrs.append(shdr)
+      current_offset += self.e_shentsize
+
+    if self.e_shstrndx != 0:
+      string_table_offset = self.e_shoff + self.e_shstrndx * self.e_shentsize
+      string_table = StringTableHeader.FromBytes(self.byte_order, data,
+                                                 string_table_offset)
+
+      for shdr in self.shdrs:
+        shdr.SetStrName(string_table.GetName(data, shdr.sh_name))
+
+
   def __init__(self, data):
     """ElfHeader constructor.
 
@@ -264,17 +361,24 @@
       raise RuntimeError('Only shared libraries are supported')
 
     self.phdrs = []
-    self._ParsePhdrs(data)
+    self._ParseProgramHeaders(data)
 
-  def GetPhdrs(self):
+    self.shdrs = []
+    self._ParseSectionHeaders(data)
+
+  def GetProgramHeaders(self):
     """Returns the list of file's program headers."""
     return self.phdrs
 
-  def GetPhdrsByType(self, phdr_type):
+  def GetProgramHeadersByType(self, phdr_type):
     """Yields program headers of the given type."""
     return (phdr for phdr in self.phdrs if phdr.p_type == phdr_type)
 
-  def AddPhdr(self, phdr):
+  def GetSectionHeaders(self):
+    """Returns the list of file's section headers."""
+    return self.shdrs
+
+  def AddProgramHeader(self, phdr):
     """Adds a new ProgramHeader entry correcting the e_phnum variable.
 
     This method will increase the size of LOAD segment containing the program
@@ -291,7 +395,7 @@
     # We need to locate the LOAD segment containing program headers and
     # increase its size.
     phdr_found = False
-    for phdr in self.GetPhdrsByType(ProgramHeader.Type.PT_LOAD):
+    for phdr in self.GetProgramHeadersByType(ProgramHeader.Type.PT_LOAD):
       if phdr.p_offset > self.e_phoff:
         continue
       if phdr.FilePositionEnd() < self.e_phoff + phdrs_size:
@@ -304,12 +408,12 @@
       raise RuntimeError('Failed to increase program headers LOAD segment')
 
     # If PHDR segment exists it needs to be corrected as well.
-    for phdr in self.GetPhdrsByType(ProgramHeader.Type.PT_PHDR):
+    for phdr in self.GetProgramHeadersByType(ProgramHeader.Type.PT_PHDR):
       phdr.p_filesz += self.e_phentsize
       phdr.p_memsz += self.e_phentsize
     self.e_phnum += 1
 
-  def _OrderPhdrs(self):
+  def _OrderProgramHeaders(self):
     """Orders program LOAD headers by p_vaddr to comply with standard."""
 
     def HeaderToKey(phdr):
@@ -321,6 +425,15 @@
 
     self.phdrs.sort(key=HeaderToKey)
 
+  def _PatchProgramHeaders(self, data):
+    """Patch all program headers."""
+    current_offset = self.e_phoff
+    self._OrderProgramHeaders()
+    for phdr in self.GetProgramHeaders():
+      phdr_bytes = phdr.ToBytes()
+      data[current_offset:current_offset + len(phdr_bytes)] = phdr_bytes
+      current_offset += self.e_phentsize
+
   def PatchData(self, data):
     """Patches the given data array to reflect all changes made to the header.
 
@@ -339,9 +452,4 @@
     """
     elf_bytes = self.ToBytes()
     data[:len(elf_bytes)] = elf_bytes
-    current_offset = self.e_phoff
-    self._OrderPhdrs()
-    for phdr in self.GetPhdrs():
-      phdr_bytes = phdr.ToBytes()
-      data[current_offset:current_offset + len(phdr_bytes)] = phdr_bytes
-      current_offset += self.e_phentsize
+    self._PatchProgramHeaders(data)
diff --git a/tools/android/elf_compression/test/compression_script_test.py b/tools/android/elf_compression/test/compression_script_test.py
index dee43eb0e..38438ce2 100755
--- a/tools/android/elf_compression/test/compression_script_test.py
+++ b/tools/android/elf_compression/test/compression_script_test.py
@@ -117,7 +117,7 @@
 
     patched_library_path = self._RunScript(library_path)
     opener_output = self._RunOpener(opener_path, patched_library_path)
-    self.assertEqual(opener_output, '1046506\n')
+    self.assertEqual(opener_output, '4096\n')
 
   def testAlignUp(self):
     """Tests for AlignUp method of the script."""
diff --git a/tools/android/elf_compression/test/elf_headers_test.py b/tools/android/elf_compression/test/elf_headers_test.py
index ced8154..8df18ec 100755
--- a/tools/android/elf_compression/test/elf_headers_test.py
+++ b/tools/android/elf_compression/test/elf_headers_test.py
@@ -36,8 +36,8 @@
     self.assertEqual(elf.e_shentsize, 64)
     self.assertEqual(elf.e_shnum, 26)
     self.assertEqual(elf.e_shstrndx, 25)
-    # Validating types and amounts of all segments excluding GNU specific ones.
-    phdrs = elf.GetPhdrs()
+    # Validating types and amount of all segments excluding GNU specific ones.
+    phdrs = elf.GetProgramHeaders()
     self.assertEqual(len(phdrs), 8)
 
     phdr_types = [
@@ -46,9 +46,9 @@
         elf_headers.ProgramHeader.Type.PT_LOAD,
         elf_headers.ProgramHeader.Type.PT_LOAD,
         elf_headers.ProgramHeader.Type.PT_DYNAMIC,
-        None,
-        None,
-        None,
+        None,  # Non-standard segment: GNU_EH_FRAME
+        None,  # Non-standard segment: GNU_STACK
+        None,  # Non-standard segment: GNU_RELRO
     ]
     for i in range(0, len(phdrs)):
       if phdr_types[i] is not None:
@@ -69,6 +69,102 @@
     self.assertEqual(load_phdr.p_vaddr, 0x1000)
     self.assertEqual(load_phdr.p_paddr, 0x1000)
 
+    # Validating types and amount of sections excluding GNU ones.
+    shdrs = elf.GetSectionHeaders()
+    self.assertEqual(len(shdrs), 26)
+
+    shdr_types = [
+        elf_headers.SectionHeader.Type.SHT_NULL,
+        elf_headers.SectionHeader.Type.SHT_HASH,
+        None,  # Non-standard section: GNU_HASH
+        elf_headers.SectionHeader.Type.SHT_DYNSYM,
+        elf_headers.SectionHeader.Type.SHT_STRTAB,
+        None,  # Non-standard section: VERSYM
+        None,  # Non-standard section: VERNEED
+        elf_headers.SectionHeader.Type.SHT_RELA,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        None,  # Non-standard section: INIT_ARRAY
+        None,  # Non-standard section: FINI_ARRAY
+        elf_headers.SectionHeader.Type.SHT_DYNAMIC,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_NOBITS,
+        elf_headers.SectionHeader.Type.SHT_PROGBITS,
+        elf_headers.SectionHeader.Type.SHT_SYMTAB,
+        elf_headers.SectionHeader.Type.SHT_STRTAB,
+        elf_headers.SectionHeader.Type.SHT_STRTAB,
+    ]
+    for i in range(0, len(shdrs)):
+      if shdr_types[i] is not None:
+        self.assertEqual(shdrs[i].sh_type, shdr_types[i])
+
+    # Validate all fields of the first and second section, since the first one
+    # is NULL section.
+    shdr = shdrs[0]
+    self.assertEqual(shdr.sh_flags, 0)
+    self.assertEqual(shdr.sh_addr, 0x0)
+    self.assertEqual(shdr.sh_offset, 0x0)
+    self.assertEqual(shdr.sh_size, 0x0)
+    self.assertEqual(shdr.sh_link, 0)
+    self.assertEqual(shdr.sh_info, 0)
+    self.assertEqual(shdr.sh_addralign, 0)
+    self.assertEqual(shdr.sh_entsize, 0)
+
+    shdr = shdrs[1]
+    self.assertEqual(shdr.sh_flags, 2)
+    self.assertEqual(shdr.sh_addr, 0x200)
+    self.assertEqual(shdr.sh_offset, 0x200)
+    self.assertEqual(shdr.sh_size, 0x30)
+    self.assertEqual(shdr.sh_link, 3)
+    self.assertEqual(shdr.sh_info, 0)
+    self.assertEqual(shdr.sh_addralign, 8)
+    self.assertEqual(shdr.sh_entsize, 4)
+
+  def testElfHeaderSectionNames(self):
+    """Test that the section names are correctly resolved"""
+    with open(self.library_path, 'rb') as f:
+      data = f.read()
+    elf = elf_headers.ElfHeader(data)
+
+    section_names = [
+        '',
+        '.hash',
+        '.gnu.hash',
+        '.dynsym',
+        '.dynstr',
+        '.gnu.version',
+        '.gnu.version_r',
+        '.rela.dyn',
+        '.init',
+        '.plt',
+        '.plt.got',
+        '.text',
+        '.fini',
+        '.eh_frame_hdr',
+        '.eh_frame',
+        '.init_array',
+        '.fini_array',
+        '.dynamic',
+        '.got',
+        '.got.plt',
+        '.data',
+        '.bss',
+        '.comment',
+        '.symtab',
+        '.strtab',
+        '.shstrtab',
+    ]
+    shdrs = elf.GetSectionHeaders()
+    for i in range(0, len(shdrs)):
+      self.assertEqual(shdrs[i].GetStrName(), section_names[i])
+
   def testElfHeaderNoopPatching(self):
     """Patching the ELF without any changes."""
     with open(self.library_path, 'rb') as f:
@@ -85,8 +181,8 @@
     elf = elf_headers.ElfHeader(data)
     # Changing some values.
     elf.e_ehsize = 42
-    elf.GetPhdrs()[0].p_align = 1
-    elf.GetPhdrs()[0].p_filesz = 10
+    elf.GetProgramHeaders()[0].p_align = 1
+    elf.GetProgramHeaders()[0].p_filesz = 10
     elf.PatchData(data)
 
     updated_elf = elf_headers.ElfHeader(data)
@@ -104,8 +200,8 @@
     self.assertEqual(updated_elf.e_shstrndx, elf.e_shstrndx)
 
     # Validating all of the fields of the first segment.
-    load_phdr = elf.GetPhdrs()[0]
-    updated_load_phdr = updated_elf.GetPhdrs()[0]
+    load_phdr = elf.GetProgramHeaders()[0]
+    updated_load_phdr = updated_elf.GetProgramHeaders()[0]
 
     self.assertEqual(updated_load_phdr.p_offset, load_phdr.p_offset)
     self.assertEqual(updated_load_phdr.p_vaddr, load_phdr.p_vaddr)
diff --git a/tools/android/elf_compression/test/library_opener.cc b/tools/android/elf_compression/test/library_opener.cc
index bfc78f84..f4075f43 100644
--- a/tools/android/elf_compression/test/library_opener.cc
+++ b/tools/android/elf_compression/test/library_opener.cc
@@ -24,13 +24,13 @@
     return 1;
   }
 
-  TestFunction get_sum =
-      reinterpret_cast<TestFunction>(dlsym(handle, "GetSum"));
-  if (get_sum == nullptr) {
+  TestFunction get_zeroes =
+      reinterpret_cast<TestFunction>(dlsym(handle, "GetZeroes"));
+  if (get_zeroes == nullptr) {
     std::cerr << "GetSum method not found" << std::endl;
     return 1;
   }
 
-  std::cout << get_sum() << std::endl;
+  std::cout << get_zeroes() << std::endl;
   return 0;
 }
diff --git a/tools/android/elf_compression/test/libtest.cc b/tools/android/elf_compression/test/libtest.cc
index c28198c..aa1832bb 100644
--- a/tools/android/elf_compression/test/libtest.cc
+++ b/tools/android/elf_compression/test/libtest.cc
@@ -8,20 +8,20 @@
 // for the script. We expect library to not crash and return the 55 as a
 // result.
 
-#include <numeric>
+#include <algorithm>
 #include <vector>
 
 #include "libtest_array.h"  // NOLINT(build/include)
 
 extern "C" {
-int GetSum();
+int GetZeroes();
 }
 
-int GetSum() {
+int GetZeroes() {
   // We are using some c++ features here to better simulate a c++ library and
   // cause more code reach to catch potential memory errors.
   std::vector<int> sum_array(std::begin(array), std::end(array));
-  int sum = std::accumulate(sum_array.begin(), sum_array.end(), 0);
-  // sum should be equal to 1046506.
-  return sum;
+  int count = std::count(sum_array.begin(), sum_array.end(), 0);
+  // count should be equal to 4096.
+  return count;
 }
diff --git a/tools/android/elf_compression/test/libtest_array.h b/tools/android/elf_compression/test/libtest_array.h
index 721f6c31..34ee7eb 100644
--- a/tools/android/elf_compression/test/libtest_array.h
+++ b/tools/android/elf_compression/test/libtest_array.h
@@ -5,8 +5,8 @@
 // This header file contains an array for testing compression script.
 //
 // Script shrinks the given data range so it is page aligned which requires the
-// size of array to at least 2 * 4096 to guarantee that the range won't be
-// empty after the shrinking.
+// size of array to be at least 2 * 4096 - 1 to guarantee that the range won't
+// be empty after the shrinking.
 // Another requirement is for array to not be lazily initialized by zeroes
 // since that would result in it occupying no actual size in the file and
 // being placed in .bss section. As a result all of the array elements have
@@ -25,7 +25,7 @@
 // Disabling clang-format on the array since it tries to put each number at the
 // separate line which is not needed in this case.
 // clang-format off
-unsigned char array[8192] = {
+unsigned char array[8191] = {
     kMagicPrefix[0], kMagicPrefix[1], kMagicPrefix[2], kMagicPrefix[3],
     88,  2,   71,  243, 203, 204, 83,  235, 153, 204, 231, 242, 135, 143, 154,
     147, 156, 221, 159, 188, 255, 135, 149, 96,  18,  240, 23,  60,  34,  97,
@@ -37,7 +37,7 @@
     231, 76,  121, 87,  192, 63,  97,  219, 69,  13,  110, 231, 28,  2,   238,
     34,  241, 162, 222, 236, 246, 163, 61,  7,   175, 209, 251, 97,  60,  206,
     179, 65,  97,  14,  29,  101, 230, 114, 73,  205, 163, 77,  27,  69,  77,
-    139, 191, 109, 187, 204, 61,  108, 0,   195, 223, 168, 60,  181, 236, 91,
+    139, 191, 109, 187, 204, 61,  108, 1,   195, 223, 168, 60,  181, 236, 91,
     164, 72,  200, 101, 253, 72,  131, 145, 161, 144, 125, 181, 198, 197, 246,
     122, 79,  236, 176, 84,  122, 224, 207, 143, 20,  179, 192, 83,  78,  157,
     40,  88,  184, 6,   65,  166, 74,  173, 103, 224, 5,   44,  113, 90,  128,
@@ -45,14 +45,14 @@
     47,  249, 120, 94,  33,  202, 201, 24,  67,  182, 150, 84,  208, 187, 88,
     74,  204, 133, 161, 2,   181, 116, 198, 135, 207, 12,  87,  36,  50,  76,
     44,  160, 143, 66,  55,  115, 27,  233, 11,  106, 31,  122, 119, 194, 125,
-    202, 12,  234, 83,  21,  124, 0,   247, 26,  206, 139, 233, 252, 222, 20,
+    202, 12,  234, 83,  21,  124, 1,   247, 26,  206, 139, 233, 252, 222, 20,
     69,  66,  141, 116, 186, 120, 24,  100, 178, 222, 3,   234, 104, 11,  107,
     197, 32,  220, 179, 82,  4,   92,  110, 161, 9,   43,  138, 131, 241, 239,
-    74,  164, 103, 245, 100, 82,  30,  134, 121, 47,  214, 0,   139, 18,  210,
+    74,  164, 103, 245, 100, 82,  30,  134, 121, 47,  214, 1,   139, 18,  210,
     115, 93,  208, 45,  97,  131, 254, 50,  182, 152, 246, 64,  242, 12,  1,
     10,  112, 67,  82,  92,  148, 105, 183, 168, 242, 87,  197, 94,  251, 156,
     31,  41,  188, 150, 92,  41,  124, 211, 144, 181, 69,  250, 178, 36,  30,
-    182, 0,   207, 132, 36,  0,   107, 126, 91,  210, 2,   7,   248, 224, 228,
+    182, 1,   207, 132, 36,  1,   107, 126, 91,  210, 2,   7,   248, 224, 228,
     3,   209, 223, 15,  95,  18,  159, 53,  114, 22,  225, 130, 233, 204, 138,
     171, 209, 123, 13,  215, 97,  113, 214, 220, 161, 251, 233, 190, 51,  96,
     155, 248, 25,  205, 185, 192, 126, 49,  195, 132, 224, 46,  51,  247, 47,
@@ -60,10 +60,10 @@
     222, 68,  247, 91,  205, 215, 106, 121, 29,  166, 200, 163, 239, 141, 172,
     101, 59,  152, 214, 27,  36,  1,   229, 193, 230, 164, 251, 148, 215, 188,
     211, 113, 243, 85,  81,  48,  244, 204, 172, 128, 92,  86,  202, 178, 227,
-    85,  0,   56,  204, 233, 203, 164, 100, 222, 109, 251, 6,   249, 63,  68,
+    85,  1,   56,  204, 233, 203, 164, 100, 222, 109, 251, 6,   249, 63,  68,
     7,   22,  140, 11,  251, 129, 245, 85,  61,  216, 112, 34,  87,  30,  244,
     35,  58,  127, 58,  179, 234, 96,  36,  83,  1,   19,  116, 201, 141, 95,
-    205, 130, 197, 105, 18,  0,   216, 41,  36,  206, 245, 165, 128, 116, 34,
+    205, 130, 197, 105, 18,  1,   216, 41,  36,  206, 245, 165, 128, 116, 34,
     154, 114, 159, 3,   46,  217, 150, 102, 39,  163, 82,  37,  187, 254, 106,
     175, 209, 52,  88,  93,  196, 252, 15,  169, 19,  187, 250, 1,   240, 218,
     230, 255, 130, 84,  246, 241, 134, 67,  22,  109, 59,  121, 208, 242, 149,
@@ -86,11 +86,11 @@
     165, 82,  156, 100, 119, 214, 214, 83,  83,  81,  189, 170, 115, 90,  120,
     182, 29,  97,  161, 84,  153, 84,  149, 188, 13,  254, 78,  26,  123, 125,
     6,   191, 26,  254, 19,  56,  41,  133, 209, 98,  222, 218, 183, 230, 63,
-    186, 3,   195, 211, 146, 2,   31,  53,  211, 0,   213, 245, 35,  255, 173,
+    186, 3,   195, 211, 146, 2,   31,  53,  211, 1,   213, 245, 35,  255, 173,
     205, 221, 61,  227, 47,  48,  237, 154, 177, 150, 152, 221, 189, 227, 129,
     16,  145, 186, 88,  82,  28,  211, 23,  109, 59,  245, 102, 31,  21,  207,
     235, 131, 24,  33,  63,  49,  187, 27,  203, 80,  66,  59,  113, 224, 255,
-    39,  248, 153, 171, 30,  231, 2,   184, 24,  87,  0,   153, 244, 57,  78,
+    39,  248, 153, 171, 30,  231, 2,   184, 24,  87,  1,   153, 244, 57,  78,
     223, 188, 196, 239, 117, 98,  142, 86,  16,  188, 2,   68,  180, 173, 252,
     128, 78,  99,  125, 226, 236, 158, 169, 109, 129, 225, 127, 164, 34,  243,
     93,  135, 64,  206, 188, 130, 11,  85,  235, 68,  30,  129, 71,  89,  150,
@@ -101,7 +101,7 @@
     135, 153, 12,  221, 71,  80,  67,  111, 103, 230, 206, 188, 13,  242, 109,
     59,  233, 173, 244, 18,  213, 42,  29,  42,  204, 135, 151, 63,  237, 168,
     224, 186, 127, 210, 153, 193, 218, 127, 6,   63,  230, 192, 105, 148, 83,
-    150, 209, 105, 216, 86,  116, 124, 207, 78,  92,  0,   3,   74,  168, 253,
+    150, 209, 105, 216, 86,  116, 124, 207, 78,  92,  1,   3,   74,  168, 253,
     185, 210, 42,  225, 54,  155, 71,  31,  224, 90,  70,  143, 25,  240, 216,
     207, 29,  9,   77,  37,  29,  109, 143, 234, 148, 195, 44,  142, 151, 20,
     234, 10,  240, 81,  15,  64,  82,  175, 132, 111, 76,  121, 240, 231, 78,
@@ -110,13 +110,13 @@
     221, 107, 246, 248, 20,  249, 105, 69,  242, 70,  88,  177, 45,  90,  64,
     149, 31,  125, 81,  37,  54,  3,   120, 138, 161, 29,  195, 197, 35,  226,
     75,  243, 44,  8,   222, 29,  181, 140, 29,  116, 18,  104, 250, 40,  115,
-    0,   57,  90,  239, 59,  230, 113, 105, 104, 176, 74,  74,  237, 105, 240,
-    197, 220, 97,  47,  114, 193, 241, 169, 19,  105, 17,  240, 0,   19,  151,
+    1,   57,  90,  239, 59,  230, 113, 105, 104, 176, 74,  74,  237, 105, 240,
+    197, 220, 97,  47,  114, 193, 241, 169, 19,  105, 17,  240, 1,   19,  151,
     149, 27,  46,  13,  174, 11,  74,  241, 201, 50,  225, 52,  11,  134, 89,
     22,  13,  87,  179, 97,  117, 182, 201, 27,  201, 188, 62,  73,  3,   165,
     196, 112, 229, 140, 230, 178, 137, 28,  105, 54,  126, 61,  119, 169, 181,
     144, 225, 119, 161, 108, 172, 205, 72,  150, 152, 196, 115, 121, 1,   44,
-    143, 8,   34,  108, 2,   107, 56,  171, 69,  182, 0,   188, 30,  47,  66,
+    143, 8,   34,  108, 2,   107, 56,  171, 69,  182, 1,   188, 30,  47,  66,
     237, 189, 194, 99,  173, 232, 140, 219, 193, 223, 162, 57,  130, 148, 242,
     199, 88,  188, 253, 146, 179, 1,   243, 109, 126, 144, 140, 21,  110, 201,
     11,  5,   150, 197, 50,  207, 85,  123, 242, 213, 117, 92,  118, 68,  38,
@@ -140,14 +140,14 @@
     135, 206, 164, 74,  85,  75,  6,   167, 213, 159, 254, 170, 150, 8,   216,
     3,   28,  138, 113, 184, 69,  155, 162, 16,  38,  228, 133, 126, 164, 209,
     243, 96,  215, 1,   187, 210, 130, 84,  228, 16,  91,  137, 195, 178, 126,
-    0,   106, 183, 92,  202, 51,  162, 207, 179, 104, 111, 105, 39,  137, 36,
+    1,   106, 183, 92,  202, 51,  162, 207, 179, 104, 111, 105, 39,  137, 36,
     182, 237, 179, 138, 54,  104, 237, 251, 68,  185, 113, 177, 201, 242, 202,
     34,  236, 243, 153, 165, 136, 176, 116, 249, 29,  16,  45,  120, 165, 51,
     103, 10,  150, 106, 223, 242, 200, 5,   48,  210, 201, 158, 102, 238, 187,
     251, 71,  244, 9,   187, 229, 125, 176, 84,  223, 100, 211, 240, 193, 155,
     110, 96,  182, 75,  229, 93,  137, 1,   63,  137, 235, 131, 100, 13,  174,
     66,  206, 25,  116, 94,  181, 107, 20,  9,   69,  108, 28,  56,  49,  182,
-    126, 38,  68,  239, 114, 92,  160, 0,   250, 59,  7,   12,  176, 12,  169,
+    126, 38,  68,  239, 114, 92,  160, 1,   250, 59,  7,   12,  176, 12,  169,
     76,  71,  94,  154, 151, 113, 46,  223, 78,  116, 116, 128, 57,  120, 153,
     120, 96,  205, 65,  45,  88,  133, 110, 21,  83,  205, 37,  175, 66,  159,
     82,  203, 203, 220, 152, 148, 19,  6,   1,   19,  159, 88,  73,  151, 77,
@@ -200,7 +200,7 @@
     220, 35,  225, 26,  226, 90,  33,  149, 175, 26,  147, 109, 114, 30,  44,
     189, 197, 137, 201, 223, 25,  102, 95,  76,  227, 54,  197, 128, 187, 137,
     241, 26,  32,  46,  207, 137, 90,  202, 55,  145, 71,  215, 50,  112, 211,
-    192, 239, 239, 50,  206, 190, 31,  230, 106, 187, 0,   154, 229, 211, 190,
+    192, 239, 239, 50,  206, 190, 31,  230, 106, 187, 1,   154, 229, 211, 190,
     169, 163, 199, 159, 169, 135, 228, 64,  19,  137, 103, 227, 85,  27,  42,
     101, 193, 224, 57,  171, 135, 184, 146, 226, 172, 72,  227, 115, 42,  28,
     102, 158, 166, 196, 178, 79,  255, 99,  128, 31,  218, 178, 68,  191, 20,
@@ -209,7 +209,7 @@
     139, 183, 56,  21,  52,  96,  201, 184, 142, 82,  230, 82,  189, 205, 248,
     142, 92,  244, 173, 219, 169, 145, 38,  104, 69,  97,  222, 166, 181, 125,
     255, 10,  150, 236, 100, 82,  162, 148, 73,  21,  193, 6,   167, 87,  100,
-    119, 254, 114, 121, 1,   159, 158, 243, 22,  91,  197, 231, 0,   164, 23,
+    119, 254, 114, 121, 1,   159, 158, 243, 22,  91,  197, 231, 1,   164, 23,
     222, 187, 113, 23,  161, 153, 191, 188, 255, 42,  104, 168, 205, 21,  16,
     196, 23,  75,  33,  138, 195, 32,  96,  218, 175, 92,  201, 68,  241, 150,
     210, 145, 240, 217, 243, 77,  38,  149, 163, 53,  202, 169, 178, 79,  18,
@@ -229,7 +229,7 @@
     234, 245, 174, 219, 2,   49,  123, 193, 246, 97,  164, 63,  255, 36,  132,
     189, 177, 187, 244, 90,  43,  238, 113, 153, 89,  91,  195, 112, 117, 209,
     183, 168, 192, 66,  157, 64,  106, 203, 45,  28,  17,  216, 143, 246, 192,
-    239, 225, 219, 5,   192, 0,   130, 190, 248, 2,   229, 99,  192, 25,  110,
+    239, 225, 219, 5,   192, 1,   130, 190, 248, 2,   229, 99,  192, 25,  110,
     200, 118, 245, 151, 199, 76,  239, 146, 213, 138, 249, 96,  56,  93,  52,
     181, 158, 51,  84,  92,  75,  172, 216, 190, 174, 126, 70,  244, 246, 194,
     84,  50,  192, 225, 145, 229, 183, 219, 132, 228, 115, 52,  110, 38,  254,
@@ -251,11 +251,11 @@
     68,  147, 71,  71,  30,  160, 76,  230, 47,  97,  238, 98,  140, 7,   157,
     136, 68,  192, 247, 153, 150, 73,  223, 240, 167, 226, 59,  237, 183, 185,
     45,  202, 70,  44,  65,  210, 207, 33,  67,  239, 249, 32,  208, 102, 138,
-    67,  155, 0,   163, 108, 119, 56,  95,  246, 94,  117, 161, 162, 119, 250,
+    67,  155, 1,   163, 108, 119, 56,  95,  246, 94,  117, 161, 162, 119, 250,
     109, 140, 121, 213, 66,  107, 199, 121, 198, 36,  186, 55,  112, 138, 3,
     115, 115, 205, 67,  90,  25,  202, 71,  212, 175, 96,  8,   108, 197, 89,
     222, 151, 75,  114, 202, 229, 229, 93,  177, 73,  139, 61,  145, 79,  69,
-    228, 235, 0,   48,  138, 70,  73,  180, 206, 4,   104, 159, 101, 217, 7,
+    228, 235, 1,   48,  138, 70,  73,  180, 206, 4,   104, 159, 101, 217, 7,
     2,   241, 19,  74,  195, 165, 168, 226, 8,   85,  225, 55,  118, 90,  203,
     117, 65,  158, 120, 252, 190, 138, 62,  250, 169, 78,  69,  139, 152, 23,
     111, 44,  118, 76,  75,  1,   52,  239, 10,  32,  98,  207, 126, 84,  110,
@@ -282,7 +282,7 @@
     105, 66,  247, 89,  128, 59,  14,  139, 20,  191, 9,   15,  170, 172, 154,
     26,  35,  75,  195, 177, 28,  45,  132, 195, 218, 157, 166, 237, 105, 40,
     123, 225, 249, 186, 140, 105, 93,  189, 254, 8,   174, 198, 151, 191, 150,
-    234, 76,  151, 24,  174, 35,  0,   63,  138, 27,  86,  102, 67,  61,  203,
+    234, 76,  151, 24,  174, 35,  1,   63,  138, 27,  86,  102, 67,  61,  203,
     7,   88,  167, 138, 55,  91,  193, 49,  74,  170, 164, 215, 125, 135, 46,
     212, 116, 13,  42,  146, 151, 248, 192, 194, 170, 188, 90,  174, 253, 63,
     229, 116, 193, 176, 93,  194, 128, 72,  91,  47,  228, 146, 132, 26,  35,
@@ -312,7 +312,7 @@
     94,  178, 227, 179, 180, 184, 164, 244, 189, 169, 80,  4,   222, 78,  171,
     216, 123, 126, 220, 32,  55,  212, 37,  86,  152, 188, 80,  50,  51,  75,
     100, 211, 236, 103, 39,  199, 17,  1,   195, 32,  68,  164, 57,  254, 133,
-    128, 0,   93,  148, 21,  169, 126, 45,  15,  151, 244, 145, 161, 251, 202,
+    128, 1,   93,  148, 21,  169, 126, 45,  15,  151, 244, 145, 161, 251, 202,
     187, 60,  216, 230, 222, 218, 242, 115, 238, 126, 77,  107, 223, 128, 167,
     180, 74,  149, 227, 143, 57,  138, 6,   155, 27,  103, 70,  97,  238, 144,
     26,  41,  108, 66,  95,  140, 50,  65,  153, 180, 190, 149, 144, 88,  100,
@@ -330,7 +330,7 @@
     128, 21,  113, 56,  164, 132, 164, 90,  122, 41,  213, 234, 28,  107, 145,
     208, 51,  27,  254, 168, 82,  212, 225, 38,  66,  56,  51,  172, 216, 82,
     54,  217, 144, 214, 87,  116, 79,  28,  7,   74,  213, 71,  189, 71,  191,
-    111, 236, 161, 71,  205, 234, 125, 214, 55,  168, 0,   203, 107, 176, 184,
+    111, 236, 161, 71,  205, 234, 125, 214, 55,  168, 1,   203, 107, 176, 184,
     205, 42,  217, 168, 127, 164, 143, 132, 192, 42,  142, 155, 171, 76,  155,
     129, 35,  148, 164, 40,  24,  29,  166, 21,  107, 156, 46,  243, 79,  84,
     165, 68,  57,  241, 132, 158, 137, 71,  53,  242, 65,  143, 123, 4,   79,
@@ -347,7 +347,7 @@
     37,  190, 109, 200, 4,   241, 199, 78,  207, 142, 73,  65,  95,  71,  26,
     38,  127, 214, 55,  80,  106, 86,  199, 112, 34,  130, 97,  85,  235, 245,
     19,  245, 34,  78,  188, 201, 213, 53,  102, 173, 212, 119, 156, 89,  161,
-    177, 95,  135, 181, 0,   63,  192, 245, 143, 214, 197, 89,  242, 28,  212,
+    177, 95,  135, 181, 1,   63,  192, 245, 143, 214, 197, 89,  242, 28,  212,
     210, 23,  151, 16,  133, 237, 58,  39,  33,  79,  5,   72,  210, 10,  3,
     29,  142, 170, 206, 88,  180, 167, 154, 115, 187, 34,  183, 53,  240, 44,
     43,  101, 62,  176, 69,  209, 207, 174, 246, 218, 57,  204, 155, 35,  239,
@@ -361,7 +361,7 @@
     104, 118, 20,  1,   141, 230, 77,  191, 169, 80,  228, 173, 201, 4,   188,
     153, 149, 186, 12,  106, 180, 163, 246, 28,  113, 29,  84,  123, 17,  48,
     129, 140, 130, 121, 189, 126, 149, 213, 255, 86,  31,  228, 198, 155, 41,
-    73,  183, 112, 189, 134, 218, 0,   172, 228, 199, 71,  174, 161, 193, 247,
+    73,  183, 112, 189, 134, 218, 1,   172, 228, 199, 71,  174, 161, 193, 247,
     112, 153, 96,  14,  81,  88,  109, 170, 54,  196, 104, 206, 213, 211, 167,
     226, 252, 132, 174, 162, 186, 135, 115, 234, 21,  197, 209, 69,  196, 124,
     39,  127, 85,  224, 57,  179, 114, 250, 33,  170, 30,  185, 226, 6,   149,
@@ -373,7 +373,7 @@
     199, 184, 110, 84,  31,  80,  178, 163, 208, 70,  94,  7,   141, 170, 233,
     13,  113, 35,  74,  123, 221, 98,  204, 229, 1,   162, 28,  71,  198, 98,
     160, 45,  29,  215, 194, 251, 193, 69,  136, 117, 218, 94,  9,   189, 218,
-    35,  82,  171, 247, 245, 118, 30,  29,  95,  209, 94,  214, 0,   221, 176,
+    35,  82,  171, 247, 245, 118, 30,  29,  95,  209, 94,  214, 1,   221, 176,
     23,  153, 176, 50,  102, 32,  86,  13,  237, 241, 37,  4,   193, 180, 254,
     104, 203, 118, 188, 14,  251, 224, 139, 195, 154, 136, 251, 65,  173, 230,
     77,  23,  249, 149, 171, 189, 176, 237, 109, 94,  233, 41,  50,  27,  140,
@@ -387,14 +387,14 @@
     140, 30,  71,  3,   119, 39,  47,  83,  127, 157, 137, 165, 210, 24,  213,
     212, 247, 189, 228, 45,  138, 56,  79,  126, 202, 252, 111, 149, 169, 126,
     96,  25,  124, 136, 57,  172, 186, 253, 216, 147, 168, 93,  57,  58,  23,
-    171, 43,  203, 54,  241, 202, 13,  66,  238, 24,  33,  114, 0,   109, 77,
+    171, 43,  203, 54,  241, 202, 13,  66,  238, 24,  33,  114, 1,   109, 77,
     63,  173, 175, 240, 70,  90,  109, 132, 244, 228, 95,  65,  208, 137, 199,
     192, 42,  41,  174, 97,  251, 161, 37,  136, 201, 94,  70,  134, 5,   207,
     105, 6,   224, 13,  8,   115, 130, 15,  236, 142, 191, 75,  148, 134, 35,
     5,   9,   241, 7,   101, 215, 60,  9,   45,  84,  77,  3,   154, 106, 228,
     31,  25,  78,  29,  157, 67,  168, 30,  254, 233, 136, 115, 187, 237, 224,
     222, 18,  91,  82,  238, 248, 201, 149, 134, 135, 76,  56,  217, 119, 86,
-    122, 199, 54,  53,  43,  52,  43,  122, 234, 180, 154, 0,   171, 145, 25,
+    122, 199, 54,  53,  43,  52,  43,  122, 234, 180, 154, 1,   171, 145, 25,
     230, 205, 178, 189, 200, 200, 224, 98,  206, 241, 129, 156, 202, 226, 254,
     132, 192, 162, 229, 140, 220, 241, 145, 233, 91,  209, 91,  240, 175, 103,
     46,  94,  252, 174, 69,  26,  246, 131, 63,  178, 227, 165, 105, 86,  87,
@@ -402,7 +402,7 @@
     168, 236, 162, 189, 246, 45,  142, 109, 192, 77,  198, 177, 110, 120, 232,
     220, 49,  232, 231, 86,  179, 104, 144, 164, 215, 224, 187, 67,  244, 45,
     69,  67,  116, 133, 82,  121, 121, 159, 126, 56,  147, 130, 144, 255, 64,
-    230, 229, 165, 232, 0,   154, 53,  57,  97,  121, 178, 248, 122, 11,  121,
+    230, 229, 165, 232, 1,   154, 53,  57,  97,  121, 178, 248, 122, 11,  121,
     16,  78,  198, 44,  143, 94,  253, 240, 98,  198, 105, 84,  104, 244, 168,
     232, 236, 247, 52,  242, 119, 56,  33,  22,  254, 63,  69,  138, 59,  4,
     249, 165, 111, 166, 105, 186, 106, 62,  164, 188, 109, 163, 150, 80,  102,
@@ -414,7 +414,7 @@
     209, 167, 233, 82,  220, 46,  115, 54,  103, 61,  69,  132, 64,  160, 79,
     44,  121, 27,  69,  122, 129, 216, 252, 129, 234, 17,  126, 111, 152, 97,
     169, 149, 44,  34,  78,  46,  34,  23,  154, 204, 72,  223, 222, 73,  189,
-    167, 194, 125, 121, 62,  249, 97,  227, 20,  57,  123, 0,   9,   198, 126,
+    167, 194, 125, 121, 62,  249, 97,  227, 20,  57,  123, 1,   9,   198, 126,
     137, 190, 151, 233, 220, 29,  223, 91,  247, 198, 74,  37,  23,  195, 222,
     166, 100, 71,  143, 205, 136, 204, 5,   117, 144, 182, 57,  31,  71,  116,
     58,  245, 21,  227, 197, 227, 172, 31,  139, 114, 86,  43,  84,  11,  197,
@@ -430,7 +430,7 @@
     15,  45,  103, 207, 185, 141, 123, 192, 158, 20,  143, 159, 94,  126, 201,
     85,  91,  227, 192, 36,  237, 21,  102, 17,  166, 138, 242, 7,   204, 83,
     16,  102, 167, 167, 176, 244, 139, 213, 183, 183, 145, 110, 97,  214, 36,
-    1,   120, 221, 117, 240, 144, 100, 184, 149, 12,  202, 172, 108, 0,   239,
+    1,   120, 221, 117, 240, 144, 100, 184, 149, 12,  202, 172, 108, 1,   239,
     72,  106, 38,  58,  10,  79,  169, 82,  208, 172, 128, 252, 169, 47,  7,
     45,  143, 135, 174, 139, 158, 12,  192, 197, 200, 238, 164, 244, 24,  121,
     88,  221, 138, 2,   61,  231, 97,  68,  194, 173, 86,  164, 104, 144, 63,
@@ -458,7 +458,7 @@
     97,  9,   39,  61,  241, 128, 55,  122, 139, 185, 131, 142, 228, 141, 87,
     43,  90,  159, 143, 246, 202, 229, 118, 149, 158, 220, 77,  125, 159, 166,
     165, 7,   157, 74,  39,  229, 83,  88,  10,  49,  183, 51,  86,  161, 129,
-    240, 21,  188, 197, 14,  31,  53,  119, 182, 114, 89,  35,  0,   4,   19,
+    240, 21,  188, 197, 14,  31,  53,  119, 182, 114, 89,  35,  1,   4,   19,
     201, 209, 61,  158, 167, 228, 83,  22,  255, 12,  116, 184, 249, 20,  184,
     74,  169, 147, 107, 11,  58,  228, 83,  143, 96,  192, 29,  240, 9,   81,
     1,   255, 176, 165, 219, 202, 149, 99,  246, 187, 229, 24,  12,  206, 238,
@@ -479,7 +479,7 @@
     228, 35,  69,  250, 244, 30,  195, 65,  90,  217, 151, 234, 64,  99,  183,
     106, 179, 159, 117, 214, 248, 125, 137, 10,  254, 59,  1,   181, 175, 100,
     216, 145, 84,  199, 93,  32,  21,  13,  149, 131, 129, 154, 130, 114, 230,
-    146, 46,  45,  79,  39,  41,  204, 66,  39,  116, 0,   220, 127, 59,  138,
+    146, 46,  45,  79,  39,  41,  204, 66,  39,  116, 1,   220, 127, 59,  138,
     193, 97,  63,  175, 141, 228, 118, 177, 75,  241, 81,  201, 144, 208, 5,
     205, 175, 142, 172, 124, 57,  125, 123, 229, 176, 11,  170, 205, 216, 85,
     187, 60,  239, 36,  232, 158, 43,  175, 181, 220, 213, 249, 150, 152, 150,
@@ -487,7 +487,7 @@
     166, 61,  74,  57,  182, 115, 58,  118, 5,   122, 220, 230, 206, 55,  82,
     102, 95,  81,  115, 230, 194, 86,  43,  118, 61,  16,  73,  52,  100, 57,
     131, 51,  125, 148, 36,  84,  20,  163, 92,  198, 166, 129, 241, 129, 114,
-    243, 70,  250, 140, 172, 0,   198, 237, 103, 166, 44,  226, 221, 83,  37,
+    243, 70,  250, 140, 172, 1,   198, 237, 103, 166, 44,  226, 221, 83,  37,
     167, 10,  156, 53,  235, 202, 183, 223, 192, 15,  172, 155, 253, 132, 171,
     102, 250, 26,  219, 110, 79,  92,  177, 125, 169, 255, 188, 67,  93,  141,
     157, 42,  161, 197, 154, 208, 140, 32,  191, 152, 135, 137, 23,  186, 117,
@@ -496,7 +496,7 @@
     235, 50,  8,   182, 2,   248, 41,  19,  44,  139, 198, 193, 69,  172, 139,
     89,  216, 231, 118, 116, 92,  76,  130, 140, 240, 164, 193, 103, 47,  12,
     144, 34,  172, 183, 203, 132, 242, 19,  202, 112, 135, 33,  9,   253, 96,
-    129, 0,   232, 24,  16,  188, 63,  178, 0,   174, 120, 158, 8,   171, 152,
+    129, 1,   232, 24,  16,  188, 63,  178, 1,   174, 120, 158, 8,   171, 152,
     59,  198, 243, 21,  46,  61,  216, 167, 83,  34,  210, 22,  51,  113, 137,
     231, 250, 50,  208, 196, 68,  191, 110, 29,  25,  158, 220, 200, 74,  66,
     144, 99,  167, 9,   104, 55,  95,  126, 5,   61,  232, 112, 166, 84,  88,
@@ -537,19 +537,19 @@
     244, 240, 57,  154, 203, 246, 190, 145, 111, 124, 60,  170, 42,  126, 191,
     176, 142, 116, 28,  152, 106, 154, 214, 45,  196, 86,  223, 10,  193, 239,
     187, 151, 121, 76,  79,  84,  224, 171, 227, 141, 56,  207, 201, 84,  39,
-    166, 68,  72,  0,   99,  85,  130, 67,  9,   16,  229, 241, 164, 144, 58,
+    166, 68,  72,  1,   99,  85,  130, 67,  9,   16,  229, 241, 164, 144, 58,
     81,  8,   247, 233, 118, 141, 68,  149, 210, 141, 27,  7,   101, 205, 244,
     223, 169, 9,   15,  35,  77,  120, 94,  109, 69,  47,  245, 180, 127, 194,
     157, 93,  103, 205, 12,  39,  117, 234, 67,  158, 185, 40,  210, 24,  207,
     247, 75,  150, 87,  214, 67,  67,  142, 219, 110, 82,  81,  83,  238, 149,
     210, 107, 249, 241, 151, 240, 23,  72,  128, 185, 164, 149, 29,  112, 135,
-    192, 176, 165, 209, 171, 147, 193, 54,  206, 213, 0,   178, 193, 193, 163,
+    192, 176, 165, 209, 171, 147, 193, 54,  206, 213, 1,   178, 193, 193, 163,
     226, 205, 253, 170, 251, 208, 29,  154, 18,  33,  62,  136, 241, 58,  208,
     245, 219, 70,  7,   133, 2,   234, 211, 175, 230, 142, 9,   135, 9,   35,
     45,  152, 145, 82,  171, 13,  2,   52,  190, 223, 177, 37,  89,  138, 55,
     155, 127, 47,  67,  210, 13,  189, 44,  245, 199, 32,  20,  92,  27,  61,
     252, 46,  206, 58,  119, 140, 208, 18,  191, 63,  226, 175, 135, 223, 63,
-    178, 195, 89,  72,  0,   47,  105, 251, 131, 240, 131, 104, 215, 29,  192,
+    178, 195, 89,  72,  1,   47,  105, 251, 131, 240, 131, 104, 215, 29,  192,
     164, 157, 66,  149, 39,  168, 193, 113, 233, 29,  166, 241, 95,  83,  169,
     31,  5,   104, 104, 139, 164, 203, 14,  153, 145, 85,  99,  60,  153, 205,
     192, 101, 158, 191, 38,  149, 153, 9,   147, 66,  12,  45,  251, 169, 174,
@@ -572,7 +572,7 @@
     169, 75,  181, 199, 71,  122, 35,  47,  242, 153, 151, 107, 174, 67,  183,
     18,  89,  156, 190, 252, 85,  172, 110, 95,  56,  31,  21,  92,  54,  104,
     177, 40,  96,  169, 51,  73,  203, 201, 26,  199, 59,  21,  197, 199, 128,
-    161, 25,  176, 92,  3,   70,  33,  167, 2,
+    161, 25,  176, 92,  3,   70,  33,  167,
     kMagicSuffix[0], kMagicSuffix[1], kMagicSuffix[2], kMagicSuffix[3]
 };
 // clang-format on
diff --git a/tools/binary_size/libsupersize/static/index.html b/tools/binary_size/libsupersize/static/index.html
index 1303889..0dd1a05 100644
--- a/tools/binary_size/libsupersize/static/index.html
+++ b/tools/binary_size/libsupersize/static/index.html
@@ -25,6 +25,10 @@
   </style>
   <link rel="icon" href="favicon.ico" sizes="16x16 32x32 256x256" type="image/x-icon">
   <script>
+
+
+const DO_NOT_DIFF = "Don't diff";
+
 /**
  * @param {string[]} options
  * @param {string} key
@@ -74,8 +78,13 @@
 
 // Milestones.
 (async () => {
-  const response = await fetch('milestones/milestones.json');
-  const {pushed} = await response.json();
+  // Milestones.
+  const milestoneResponse = await fetch('milestones/milestones.json');
+  const milestonesPushed = (await milestoneResponse.json())['pushed'];
+
+  // Official Builds
+  const officialBuildsResponse = await fetch('official_builds/reports.json');
+  const officialBuildsPushed = (await officialBuildsResponse.json())['pushed'];
 
   if (document.readyState === 'loading') {
     await new Promise(resolve => {
@@ -89,97 +98,129 @@
   }
 
   /** @type {HTMLFormElement} */
+  const submitButton = document.getElementById('submit-button');
   const form = document.getElementById('select-form');
-  const selMode = form.elements.namedItem('mode');
-  const selCpu = form.elements.namedItem('cpu');
   const selApk = form.elements.namedItem('apk');
   const selVersion1 = form.elements.namedItem('version1');
   const selVersion2 = form.elements.namedItem('version2');
   const btnOpen = form.querySelector('button[type="submit"]');
   const msgBadCompare = form.querySelector('.msg-bad-compare');
 
-  selCpu.appendChild(buildOptions(pushed.cpu));
-  selApk.appendChild(buildOptions(pushed.apk));
-  const versionOptions = buildOptions(pushed.version);
-  selVersion1.appendChild(versionOptions.cloneNode(true));
-  selVersion2.appendChild(versionOptions);
-
-  selectOption(selVersion1.querySelectorAll('option'), -2);
-  selectOption(selVersion2.querySelectorAll('option'), -1);
-
-  let viewMode = null;
-  function readViewMode() {
-    viewMode = document.querySelector('#sel-mode').value;
-    form.classList.toggle('mode-view', viewMode === 'view');
-  }
-  readViewMode();
-
-  function disableButtonIfNoDiffPair() {
-    const isDisabled = (viewMode === 'compare') &&
-        isGreaterOrEqual(selVersion1.value, selVersion2.value);
-    btnOpen.disabled = isDisabled;
-    msgBadCompare.classList.toggle('visible', isDisabled);
-  }
-  disableButtonIfNoDiffPair();
-
-  selMode.addEventListener('change', () => {
-    readViewMode();
-    disableButtonIfNoDiffPair();
-  });
-
-  function getDataUrl() {
-    let ret = `milestones/${cpu.value}/${apk.value}/`;
-    if (viewMode === 'view') {
-      ret += `report_${selVersion2.value}.ndjson`;
-    } else if (viewMode === 'compare') {
-      ret += `report_${selVersion1.value}_${selVersion2.value}.ndjson`;
-    }
-    return ret;
+  function channelIsMilestone() {
+    // Returns: Whether channel is set to stable/beta (i.e. is a milestone)
+    const channel = document.querySelector('input[name="mode"]:checked').value;
+    return channel == 'stable/beta';
   }
 
-  selVersion1.addEventListener('change', disableButtonIfNoDiffPair);
-  selVersion2.addEventListener('change', disableButtonIfNoDiffPair);
-  setSubmitListener(form, getDataUrl);
-})();
-
-// Official Builds.
-(async () => {
-  const response = await fetch('official_builds/reports.json');
-  const { pushed } = await response.json();
-
-  if (document.readyState === 'loading') {
-    await new Promise(resolve => {
-      document.onreadystatechange = () => {
-        if (document.readyState !== 'loading') {
-          resolve();
-          document.onreadystatechange = null;
+  function cpuApkPairs(cpus, apks) {
+    let out = [];
+    for (let cpu of cpus) {
+      for (let apk of apks) {
+        // Chrome.apk not available for arm_64
+        if(!(cpu == 'arm_64' && apk == 'Chrome.apk')) {
+          out.push(cpu + '/' + apk);
         }
       }
+    }
+    return out;
+  }
+
+  function updateApk() {
+    // Overwrites the apk selector with entries of format {cpu}/{apk}
+    let apks = [];
+    if (channelIsMilestone()) {
+      apks = cpuApkPairs(milestonesPushed.cpu, milestonesPushed.apk);
+    } else {
+      apks = [...new Set(officialBuildsPushed.map(a => {
+        let apk = a.apk;
+        // Can safely discard minimal apks - as of 16-Sep-2019 there was only
+        // one entry with an attached Monochrome.minimal apk, assumed bug
+        if (apk === 'Monochrome.minimal.apks') apk = 'Monochrome.apk';
+        return a.cpu + '/' + apk;
+      }
+      ))];
+    }
+    selApk.innerHTML = '';
+    selApk.appendChild(buildOptions(apks));
+  }
+
+  function updateSubmitButton() {
+    if (channelIsMilestone()) {
+      submitButton.textContent = 'Open Official Build Report';
+    } else {
+      submitButton.textContent = 'Open Milestone Report';
+    }
+  }
+
+/*
+ * @param {bool} swapping: True if this is driven by a canary <-> stable change
+ */
+  function updateVersions() {
+    let versions = [];
+    if (channelIsMilestone()) {
+      // For the selected APK
+      versions = milestonesPushed.version;
+    } else {
+      versions = officialBuildsPushed.map(a => a.version);
+    }
+    selVersion1.innerHTML = '';
+    selVersion1.appendChild(buildOptions(versions));
+    selectOption(selVersion1.querySelectorAll('option'), -1);
+  }
+
+  function updateDiffVersions() {
+    // Filter diff-against versions that are newer
+    // Preserve current options if possible
+    let diffVersions = [];
+    if (channelIsMilestone()) {
+      diffVersions = [...milestonesPushed.version];
+      diffVersions = diffVersions.filter(v2 => !isGreaterOrEqual(v2, selVersion1.value));
+    } else {
+      diffVersions = ['Diff with Previous Branch'];
+    }
+    diffVersions.push(DO_NOT_DIFF);
+    selVersion2.innerHTML = '';
+    selVersion2.appendChild(buildOptions(diffVersions));
+    selectOption(selVersion2.querySelectorAll('option'), -1);
+  }
+
+  updateApk();
+  updateVersions();
+  updateDiffVersions();
+
+  const selChannels = document.getElementsByName('mode');
+  for(let i=0; i < selChannels.length; i++) {
+    selChannels[i].addEventListener('click', () => {
+      updateSubmitButton();
+      updateApk();
+      updateVersions();
+      updateDiffVersions();
     });
   }
 
-  /** @type {HTMLFormElement} */
-  const form = document.getElementById('ob_form');
-  const selCpu = form.elements.namedItem('ob_cpu');
-  const selApk = form.elements.namedItem('ob_apk');
-  const selVersion = form.elements.namedItem('ob_version');
-  const viewMode = form.elements.namedItem('ob_viewmode');
-
-  selCpu.appendChild(buildOptions(pushed, 'cpu'));
-  selApk.appendChild(buildOptions(pushed, 'apk'));
-  selVersion.appendChild(buildOptions(pushed, 'version'));
-
-  selectOption(selVersion.querySelectorAll('option'), -1);
+  selVersion1.addEventListener('change', () => {
+    updateDiffVersions();
+  });
 
   function getDataUrl() {
-    let path = `official_builds/reports/${ob_cpu.value}/${ob_apk.value}/`;
-    if (viewMode.value === 'view') {
-      return path + `report_${selVersion.value}.ndjson`;
-    } else if (viewMode.value === 'diff') {
-      for (const item of pushed) {
-        if (item['version'] == selVersion.value) {
-          const refVersion = item['reference_version'];
-          return path + `report_${refVersion}_${selVersion.value}.ndjson`;
+    if (channelIsMilestone()) {
+      let ret = `milestones/${apk.value}/`;
+      if (selVersion2.value === DO_NOT_DIFF) {
+        ret += `report_${selVersion1.value}.ndjson`;
+      } else {
+        ret += `report_${selVersion2.value}_${selVersion1.value}.ndjson`;
+      }
+      return ret;
+    } else {
+      let path = `official_builds/reports/${selApk.value}/`;
+      if (selVersion2.value === DO_NOT_DIFF) {
+        return path + `report_${selVersion1.value}.ndjson`;
+      } else { // Diff with previous version
+        for (const item of officialBuildsPushed) {
+          if (item['version'] == selVersion1.value) {
+            const refVersion = item['reference_version'];
+            return path + `report_${refVersion}_${selVersion1.value}.ndjson`;
+          }
         }
       }
     }
@@ -201,77 +242,36 @@
     <tr>
       <td class="form">
         <form id="select-form">
-          <h2 class="subhead">Select milestones to
-            <select id="sel-mode" class="sel-small" name="mode">
-              <option value="view">view</option>
-              <option value="compare" selected="selected">compare</option>
-            </select>
+          <h2 class="subhead">Channel:
+            <label><input type="radio" name="mode" value="canary" checked> canary</label>
+            <label><input type="radio" name="mode" value="stable/beta"> stable/beta</label>
           </h2>
           <p class="select-wrapper">
-            <select id="cpu" class="sel-big" name="cpu"></select>
-            <label class="select-label" for="cpu">Architecture</label>
-          </p>
-          <p class="select-wrapper">
             <select id="apk" class="sel-big" name="apk"></select>
             <label class="select-label" for="apk">APK</label>
           </p>
-          <p class="select-wrapper hide-on-mode-view">
+          <p class="select-wrapper">
             <select id="version1" class="sel-big" name="version1"></select>
-            <label class="select-label" for="version1">Version 1</label>
+            <label class="select-label" for="version1">Version</label>
           </p>
           <p class="select-wrapper">
             <select id="version2" class="sel-big" name="version2"></select>
             <label class="select-label" for="version2">
-              Version <span class="hide-on-mode-view"> 2</span>
+              Diff Against
             </label>
           </p>
 
-          <button type="submit" class="text-button filled-button">
-            Open Milestone Report
-          </button>
+          <p class="select-wrapper">
+            <button type="submit" class="text-button filled-button" id="submit-button">
+              Open Milestone Report
+            </button>
+          </p>
           <div class="msg-bad-compare">Version 1 must be older than Version 2</div>
           <div style="margin:20pt 0 10pt">
             <b>Note:</b> AndroidWebview.apk size information exists only for M71 and above.<br>
-            <b>Note:</b> Starting wih M73, Monochrome.apk is actually Monochrome.minimal.apks<br>
-            <b>Note:</b> Chrome.apk not available for arm_64.
           </div>
         </form>
       </td>
-
-      <td class="form-divider">
-        <h2 class="subhead"><b>or</b></h2>
-      </td>
-
-      <td class="form">
-        <form id="ob_form">
-          <h2 class="subhead">Select Official Build to View</h2>
-          <p class="select-wrapper">
-            <select id="ob_cpu" class="sel-big" name="ob_cpu"></select>
-            <label class="select-label" for="ob_cpu">Architecture</label>
-          </p>
-          <p class="select-wrapper">
-            <select id="ob_apk" class="sel-big" name="ob_apk"></select>
-            <label class="select-label" for="ob_apk">APK</label>
-          </p>
-          <p class="select-wrapper">
-            <select id="ob_version" class="sel-big" name="ob_version"></select>
-            <label class="select-label" for="ob_version">Version</label>
-          </p>
-          <p class="select-wrapper">
-            <select id="ob_viewmode" class="sel-big" name="ob_viewmode">
-              <option value="view">Full Build Report</option>
-              <option value="diff" selected="selected">Diff with Previous Branch</option>
-            </select>
-            <label class="select-label" for="ob_viewmode">Type</label>
-          </p>
-
-          <button type="submit" class="text-button filled-button">
-            Open Official Build Report
-          </button>
-          <div class="msg-bad-compare">&nbsp;</div>
-          <div class="note"><b>Note:</b> Official build size information exists only for M72 and above.</div>
-        </form>
-      </td>
     </tr>
     <tr>
       <td class="center-text" colspan=3>
diff --git a/tools/binary_size/libsupersize/static/options.css b/tools/binary_size/libsupersize/static/options.css
index 184d57ff..789c30b7 100644
--- a/tools/binary_size/libsupersize/static/options.css
+++ b/tools/binary_size/libsupersize/static/options.css
@@ -238,11 +238,9 @@
 /** <input type='checkbox' or 'radio'> elements */
 input[type='checkbox'],
 input[type='radio'] {
-  position: absolute;
-  margin: 0;
+  margin: 4px 0;
   height: 18px;
   width: 18px;
-  opacity: 0;
 }
 .checkbox-wrapper,
 .radio-wrapper {
diff --git a/tools/cr/cr/actions/gn.py b/tools/cr/cr/actions/gn.py
index 34b045b..1614d47a 100644
--- a/tools/cr/cr/actions/gn.py
+++ b/tools/cr/cr/actions/gn.py
@@ -14,10 +14,6 @@
 class GnPrepareOut(cr.PrepareOut):
   """A prepare action that runs gn whenever you select an output directory."""
 
-  ACTIVE = cr.Config.From(
-      GN_ARG_is_component_build='true',
-  )
-
   @property
   def priority(self):
     return -1
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8b1dcc2..42a42420 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -13483,6 +13483,16 @@
   <int value="16" label="Security"/>
   <int value="17" label="JavaScript Profiler"/>
   <int value="18" label="Audits"/>
+  <int value="19" label="Drawer - Coverage"/>
+  <int value="20" label="Drawer - Protocol monitor"/>
+  <int value="21" label="Drawer - Remote devices"/>
+  <int value="22" label="Drawer - WebAudio"/>
+  <int value="23" label="Drawer - Changes"/>
+  <int value="24" label="Drawer - Performance monitor"/>
+  <int value="25" label="Drawer - What's New"/>
+  <int value="26" label="Drawer - Live Heap Profile"/>
+  <int value="27" label="Drawer - Quick source"/>
+  <int value="28" label="Drawer - Request blocking"/>
 </enum>
 
 <enum name="DevToolsSetting">
@@ -31950,6 +31960,29 @@
   <int value="4" label="Unknown Reason"/>
 </enum>
 
+<enum name="InstallAttributesUsageEvent">
+  <int value="0" label="Cache read sucess"/>
+  <int value="1" label="First install"/>
+  <int value="2" label="Cache parse failed"/>
+  <int value="3" label="TPM not owned"/>
+  <int value="4" label="TPM invalid state"/>
+  <int value="5" label="NVRAM Space Absent"/>
+  <int value="6" label="NVRAM Invalid"/>
+  <int value="7" label="TPM Unavailable"/>
+  <int value="8" label="TPM Error"/>
+</enum>
+
+<enum name="InstallAttributesValidationEvent">
+  <int value="0" label="Cache write succeeded"/>
+  <int value="1" label="NVRAM read failed"/>
+  <int value="2" label="NVRAM invalid size"/>
+  <int value="3" label="NVRAM decode failed"/>
+  <int value="4" label="Data read failed"/>
+  <int value="5" label="Data verification of size failed"/>
+  <int value="6" label="Data verification of hash failed"/>
+  <int value="7" label="Cache write failed"/>
+</enum>
+
 <enum name="InstallStatus">
   <int value="0" label="FIRST_INSTALL_SUCCESS"/>
   <int value="1" label="INSTALL_REPAIRED"/>
@@ -34854,6 +34887,7 @@
   <int value="-1863962664" label="LockScreenNotifications:enabled"/>
   <int value="-1861814223" label="MidiManagerDynamicInstantiation:enabled"/>
   <int value="-1860481724" label="ChromeHomeExpandButton:enabled"/>
+  <int value="-1859421131" label="BackForwardCache:disabled"/>
   <int value="-1859095876" label="Previews:disabled"/>
   <int value="-1856902397" label="LoadingWithMojo:enabled"/>
   <int value="-1855347512" label="FormControlsRefresh:disabled"/>
@@ -37795,6 +37829,7 @@
   <int value="2113804526" label="EnableAppShortcutSearch:enabled"/>
   <int value="2114843059" label="ContextualSuggestionsOptOut:enabled"/>
   <int value="2119964154" label="enable-download-resumption"/>
+  <int value="2120659210" label="BackForwardCache:enabled"/>
   <int value="2121056855" label="IncreaseInputAudioBufferSize:disabled"/>
   <int value="2121550859" label="PreferHtmlOverPlugins:enabled"/>
   <int value="2121776031" label="auto-virtual-keyboard"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index d059cb65..60d54dc 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -26604,6 +26604,26 @@
   </summary>
 </histogram>
 
+<histogram name="Cryptohome.InstallAttributesUsage"
+    enum="InstallAttributesValidationEvent" expires_after="M80">
+  <owner>vsavu@google.com</owner>
+  <owner>igorcov@chromium.com</owner>
+  <summary>
+    Records the result of using the install_attributes.pb cache. This is logged
+    at each device boot.
+  </summary>
+</histogram>
+
+<histogram name="Cryptohome.InstallAttributesValidation"
+    enum="InstallAttributesValidationEvent" expires_after="M80">
+  <owner>vsavu@google.com</owner>
+  <owner>igorcov@chromium.com</owner>
+  <summary>
+    Records the result of validating install_attributes.pb. This is logged at
+    each device boot.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Cryptohome.LECredential"
     enum="CryptohomeLECredError" expires_after="2020-02-23">
 <!-- Name completed by histogram_suffixes name="LECredentialOps" -->
@@ -68383,6 +68403,16 @@
   </summary>
 </histogram>
 
+<histogram name="Mobile.Messages.ConcurrentPresented" units="infobars"
+    expires_after="2020-06-01">
+  <owner>sczs@chromium.org</owner>
+  <owner>thegreenfrog@chromium.org</owner>
+  <summary>
+    Tracks the number of multiple Infobars being presented at the same time.
+    This will be recorded everytime an Infobar is presented.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Mobile.Messages.Modal.Event"
     enum="MobileMessagesModalEvent" expires_after="2020-02-01">
 <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
@@ -150560,13 +150590,18 @@
 
 <histogram name="UserInterfaceStyle.ChangedWhileActive"
     enum="IOSUserInterfaceStyle" expires_after="M81">
+  <obsolete>
+    Removed. Chrome can't listen to changes in the background, these are delayed
+    until the app becomes active again. Use UserInterfaceStyle.CurrentlyUsed
+    instead.
+  </obsolete>
   <owner>javierrobles@chromium.org</owner>
   <owner>rkgibson@google.com</owner>
   <owner>bling-team@google.com</owner>
   <summary>
     [iOS] Used on iOS 13+ to report the changes to Light and Dark mode. This is
     logged when the interface style changes and Chrome is active. Can be caused
-    by the system automatic switch or by the user manually schanging the style.
+    by the system automatic switch or by the user manually changing the style.
   </summary>
 </histogram>
 
@@ -150577,7 +150612,8 @@
   <owner>bling-team@google.com</owner>
   <summary>
     [iOS] Used on iOS 13+ to report the usage of Light and Dark mode. This is
-    logged at startup and on each user interface style change.
+    logged at startup and on each user interface style change. Can be caused by
+    the system automatic switch or by the user manually changing the style.
   </summary>
 </histogram>
 
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index af2b53e..807209e 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -2001,30 +2001,54 @@
     }
   }
 
-  std::string preferred_fallback_family;
+  // Keep a set of fonts already tried for shaping runs.
+  std::set<Font, CaseInsensitiveCompare> fallback_fonts_already_tried;
+  fallback_fonts_already_tried.insert(primary_font);
 
-  Font fallback_font(primary_font);
-  bool fallback_found;
-  {
-    SCOPED_UMA_HISTOGRAM_LONG_TIMER("RenderTextHarfBuzz.GetFallbackFontTime");
-    TRACE_EVENT1("ui", "RenderTextHarfBuzz::GetFallbackFont", "script",
-                 TRACE_STR_COPY(uscript_getShortName(font_params.script)));
-    const base::StringPiece16 run_text(&text[runs.front()->range.start()],
-                                       runs.front()->range.length());
-    fallback_found =
-        GetFallbackFont(primary_font, locale_, run_text, &fallback_font);
+  // Find fallback fonts for the remaining runs using a worklist algorithm. Try
+  // to shape the first run by using GetFallbackFont(...) and then try shaping
+  // other runs with the same font. If the first font can't be shaped, remove it
+  // and continue with the remaining runs until the worklist is empty. The
+  // fallback font returned by GetFallbackFont(...) depends on the text of the
+  // run and the results may differ between runs.
+  std::vector<internal::TextRunHarfBuzz*> remaining_unshaped_runs;
+  while (!runs.empty()) {
+    Font fallback_font(primary_font);
+    bool fallback_found;
+    internal::TextRunHarfBuzz* current_run = *runs.begin();
+    {
+      SCOPED_UMA_HISTOGRAM_LONG_TIMER("RenderTextHarfBuzz.GetFallbackFontTime");
+      TRACE_EVENT1("ui", "RenderTextHarfBuzz::GetFallbackFont", "script",
+                   TRACE_STR_COPY(uscript_getShortName(font_params.script)));
+      const base::StringPiece16 run_text(&text[current_run->range.start()],
+                                         current_run->range.length());
+      fallback_found =
+          GetFallbackFont(primary_font, locale_, run_text, &fallback_font);
+    }
+
+    if (fallback_found) {
+      const bool fallback_font_is_untried =
+          fallback_fonts_already_tried.insert(fallback_font).second;
+      if (fallback_font_is_untried) {
+        internal::TextRunHarfBuzz::FontParams test_font_params = font_params;
+        if (test_font_params.SetFontAndRenderParams(
+                fallback_font, fallback_font.GetFontRenderParams())) {
+          ShapeRunsWithFont(text, test_font_params, &runs);
+        }
+      }
+    }
+
+    // Remove the first run if not fully shaped with its associated fallback
+    // font.
+    if (!runs.empty() && runs[0] == current_run) {
+      remaining_unshaped_runs.push_back(current_run);
+      runs.erase(runs.begin());
+    }
   }
-  if (fallback_found) {
-    preferred_fallback_family = fallback_font.GetFontName();
-    internal::TextRunHarfBuzz::FontParams test_font_params = font_params;
-    if (test_font_params.SetFontAndRenderParams(
-            fallback_font, fallback_font.GetFontRenderParams())) {
-      ShapeRunsWithFont(text, test_font_params, &runs);
-    }
-    if (runs.empty()) {
-      RecordShapeRunsFallback(ShapeRunFallback::FALLBACK);
-      return;
-    }
+  runs.swap(remaining_unshaped_runs);
+  if (runs.empty()) {
+    RecordShapeRunsFallback(ShapeRunFallback::FALLBACK);
+    return;
   }
 
   std::vector<Font> fallback_font_list;
@@ -2035,10 +2059,10 @@
     fallback_font_list = GetFallbackFonts(primary_font);
 
 #if defined(OS_WIN)
-    // Append fonts in the fallback list of the preferred fallback font.
+    // Append fonts in the fallback list of the fallback fonts.
     // TODO(tapted): Investigate whether there's a case that benefits from this
     // on Mac.
-    if (!preferred_fallback_family.empty()) {
+    for (const auto& fallback_font : fallback_fonts_already_tried) {
       std::vector<Font> fallback_fonts = GetFallbackFonts(fallback_font);
       fallback_font_list.insert(fallback_font_list.end(),
                                 fallback_fonts.begin(), fallback_fonts.end());
@@ -2049,10 +2073,9 @@
     // http://crbug.com/467459. On some Windows configurations the default font
     // could be a raster font like System, which would not give us a reasonable
     // fallback font list.
-    if (!base::LowerCaseEqualsASCII(primary_font.GetFontName(), "segoe ui") &&
-        !base::LowerCaseEqualsASCII(preferred_fallback_family, "segoe ui")) {
-      std::vector<Font> default_fallback_families =
-          GetFallbackFonts(Font("Segoe UI", 13));
+    Font segoe("Segoe UI", 13);
+    if (!fallback_fonts_already_tried.count(segoe)) {
+      std::vector<Font> default_fallback_families = GetFallbackFonts(segoe);
       fallback_font_list.insert(fallback_font_list.end(),
                                 default_fallback_families.begin(),
                                 default_fallback_families.end());
@@ -2065,18 +2088,15 @@
       "RenderTextHarfBuzz.ShapeRunsWithFallbackFontsTime");
   TRACE_EVENT1("ui", "RenderTextHarfBuzz::ShapeRunsWithFallbackFonts",
                "fonts_count", fallback_font_list.size());
-  std::set<Font, CaseInsensitiveCompare> fallback_fonts;
 
   // Try shaping with the fallback fonts.
   for (const auto& font : fallback_font_list) {
     std::string font_name = font.GetFontName();
 
-    if (font_name == primary_font.GetFontName() ||
-        font_name == preferred_fallback_family || fallback_fonts.count(font)) {
+    const bool fallback_font_is_untried =
+        fallback_fonts_already_tried.insert(font).second;
+    if (!fallback_font_is_untried)
       continue;
-    }
-
-    fallback_fonts.insert(font);
 
     FontRenderParamsQuery query;
     query.families.push_back(font_name);
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index f651622..f5467aa 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -4749,6 +4749,39 @@
 #endif
 }
 
+TEST_F(RenderTextTest, HarfBuzz_ShapeRunsWithMultipleFonts) {
+  RenderTextHarfBuzz* render_text = GetRenderText();
+
+  // The following text will be split in 3 runs:
+  //   1) u+1F3F3 u+FE0F u+FE0F  (Segoe UI Emoji)
+  //   2) u+0020                 (Segoe UI)
+  //   3) u+1F308 u+20E0 u+20E0  (Segoe UI Symbol)
+  // The three runs are shape in the same group but are mapped with three
+  // different fonts.
+  render_text->SetText(
+      UTF8ToUTF16(u8"\U0001F3F3\U0000FE0F\U00000020\U0001F308\U000020E0"));
+  test_api()->EnsureLayout();
+  std::vector<base::string16> expected;
+  expected.push_back(WideToUTF16(L"\U0001F3F3\U0000FE0F"));
+  expected.push_back(WideToUTF16(L" "));
+  expected.push_back(WideToUTF16(L"\U0001F308\U000020E0"));
+  EXPECT_EQ(expected, GetRunListStrings());
+  EXPECT_EQ("[0->2][3][4->6]", GetRunListStructureString());
+
+#if defined(OS_WIN)
+  std::vector<std::string> expected_fonts;
+  if (base::win::GetVersion() < base::win::Version::WIN10)
+    expected_fonts = {"Segoe UI", "Segoe UI", "Segoe UI Symbol"};
+  else
+    expected_fonts = {"Segoe UI Emoji", "Segoe UI", "Segoe UI Symbol"};
+
+  std::vector<std::string> mapped_fonts;
+  for (const auto& font_span : render_text->GetFontSpansForTesting())
+    mapped_fonts.push_back(font_span.first.GetFontName());
+  EXPECT_EQ(expected_fonts, mapped_fonts);
+#endif
+}
+
 TEST_F(RenderTextTest, GlyphBounds) {
   const char* kTestStrings[] = {"asdf 1234 qwer", "\u0647\u0654",
                                 "\u0645\u0631\u062D\u0628\u0627"};
diff --git a/weblayer/browser/browser_controller_impl.cc b/weblayer/browser/browser_controller_impl.cc
index fdce547b..cf72f57 100644
--- a/weblayer/browser/browser_controller_impl.cc
+++ b/weblayer/browser/browser_controller_impl.cc
@@ -98,6 +98,12 @@
     observer.LoadingStateChanged(is_loading, to_different_document);
 }
 
+void BrowserControllerImpl::LoadProgressChanged(content::WebContents* source,
+                                                double progress) {
+  for (auto& observer : observers_)
+    observer.LoadProgressChanged(progress);
+}
+
 void BrowserControllerImpl::DidNavigateMainFramePostCommit(
     content::WebContents* web_contents) {
   for (auto& observer : observers_)
diff --git a/weblayer/browser/browser_controller_impl.h b/weblayer/browser/browser_controller_impl.h
index 1b8821d..d46923a 100644
--- a/weblayer/browser/browser_controller_impl.h
+++ b/weblayer/browser/browser_controller_impl.h
@@ -59,6 +59,8 @@
   // content::WebContentsDelegate implementation:
   void LoadingStateChanged(content::WebContents* source,
                            bool to_different_document) override;
+  void LoadProgressChanged(content::WebContents* source,
+                           double progress) override;
   void DidNavigateMainFramePostCommit(
       content::WebContents* web_contents) override;
   int GetTopControlsHeight() override;
diff --git a/weblayer/browser/browser_observer_proxy.cc b/weblayer/browser/browser_observer_proxy.cc
index ff551492..01d1803 100644
--- a/weblayer/browser/browser_observer_proxy.cc
+++ b/weblayer/browser/browser_observer_proxy.cc
@@ -37,9 +37,11 @@
 void BrowserObserverProxy::LoadingStateChanged(bool is_loading,
                                                bool to_different_document) {}
 
+void BrowserObserverProxy::LoadProgressChanged(double progress) {}
+
 void BrowserObserverProxy::FirstContentfulPaint() {}
 
-static jlong JNI_BrowserObserverProxy_CreateBrowserObsererProxy(
+static jlong JNI_BrowserObserverProxy_CreateBrowserObserverProxy(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& proxy,
     jlong browser_controller) {
diff --git a/weblayer/browser/browser_observer_proxy.h b/weblayer/browser/browser_observer_proxy.h
index 45b4273..81882881 100644
--- a/weblayer/browser/browser_observer_proxy.h
+++ b/weblayer/browser/browser_observer_proxy.h
@@ -28,6 +28,7 @@
   void DisplayedURLChanged(const GURL& url) override;
   void LoadingStateChanged(bool is_loading,
                            bool to_different_document) override;
+  void LoadProgressChanged(double progress) override;
   void FirstContentfulPaint() override;
 
  private:
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
index 931a749..6558a644 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
@@ -5,6 +5,8 @@
 package org.chromium.weblayer_private;
 
 import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.res.Resources;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -60,9 +62,16 @@
         public void onScrollChanged(int lPix, int tPix, int oldlPix, int oldtPix) {}
     }
 
-    public BrowserControllerImpl(Context context, ProfileImpl profile) {
+    public BrowserControllerImpl(Context clientContext, Context implContext, ProfileImpl profile) {
         mProfile = profile;
 
+        Context context = new ContextWrapper(clientContext) {
+            @Override
+            public Resources getResources() {
+                // Always use resources from the implementation APK.
+                return implContext.getResources();
+            }
+        };
         mWindowAndroid = new ActivityWindowAndroid(context);
         mContentViewRenderView = new ContentViewRenderView(context);
 
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserObserverProxy.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserObserverProxy.java
index 2f4e0f9..14e913a 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserObserverProxy.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserObserverProxy.java
@@ -23,7 +23,7 @@
 
     BrowserObserverProxy(long browserController, IBrowserControllerClient client) {
         mClient = client;
-        mNativeBrowserObserverProxy = nativeCreateBrowserObsererProxy(this, browserController);
+        mNativeBrowserObserverProxy = nativeCreateBrowserObserverProxy(this, browserController);
     }
 
     public void destroy() {
@@ -40,7 +40,7 @@
         }
     }
 
-    private static native long nativeCreateBrowserObsererProxy(
+    private static native long nativeCreateBrowserObserverProxy(
             BrowserObserverProxy proxy, long browserController);
     private static native void nativeDeleteBrowserObserverProxy(long proxy);
 }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java
index 85777708..00b6acf 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java
@@ -32,8 +32,10 @@
     }
 
     @Override
-    public IBrowserController createBrowserController(IObjectWrapper context) {
-        return new BrowserControllerImpl(ObjectWrapper.unwrap(context, Context.class), this);
+    public IBrowserController createBrowserController(
+            IObjectWrapper clientContext, IObjectWrapper implContext) {
+        return new BrowserControllerImpl(ObjectWrapper.unwrap(clientContext, Context.class),
+                ObjectWrapper.unwrap(implContext, Context.class), this);
     }
 
     long getNativeProfile() {
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/aidl/IProfile.aidl b/weblayer/browser/java/org/chromium/weblayer_private/aidl/IProfile.aidl
index d687893..3099c12 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/aidl/IProfile.aidl
+++ b/weblayer/browser/java/org/chromium/weblayer_private/aidl/IProfile.aidl
@@ -12,5 +12,11 @@
 
   void clearBrowsingData() = 1;
 
-  IBrowserController createBrowserController(in IObjectWrapper context) = 2;
+  /**
+   * Creates a new IBrowserController.
+   * @param clientContext Context from the client
+   * @param implContext Context that refers to the weblayer implementation
+   */
+  IBrowserController createBrowserController(in IObjectWrapper clientContext,
+                                             in IObjectWrapper implContext) = 2;
 }
diff --git a/weblayer/public/browser_observer.h b/weblayer/public/browser_observer.h
index fa43c3b8..3fe3244 100644
--- a/weblayer/public/browser_observer.h
+++ b/weblayer/public/browser_observer.h
@@ -23,6 +23,11 @@
   virtual void LoadingStateChanged(bool is_loading,
                                    bool to_different_document) {}
 
+  // Indicates that the load progress of the WebContents has changed. This
+  // corresponds to WebContentsDelegate::LoadProgressChanged, meaning |progress|
+  // ranges from 0.0 to 1.0.
+  virtual void LoadProgressChanged(double progress) {}
+
   // This is fired after each navigation has completed, to indicate that the
   // first paint after a non-empty layout has finished.
   virtual void FirstContentfulPaint() {}
diff --git a/weblayer/public/java/org/chromium/weblayer/Profile.java b/weblayer/public/java/org/chromium/weblayer/Profile.java
index 085273a..5702c4b 100644
--- a/weblayer/public/java/org/chromium/weblayer/Profile.java
+++ b/weblayer/public/java/org/chromium/weblayer/Profile.java
@@ -46,7 +46,8 @@
     public BrowserFragmentImpl createBrowserFragment(Context context) {
         try {
             return new BrowserFragmentImpl(
-                    mImpl.createBrowserController(ObjectWrapper.wrap(context)));
+                    mImpl.createBrowserController(ObjectWrapper.wrap(context),
+                            ObjectWrapper.wrap(WebLayer.getInstance().createRemoteContext())));
         } catch (RemoteException e) {
             throw new APICallException(e);
         }
diff --git a/weblayer/public/java/org/chromium/weblayer/WebLayer.java b/weblayer/public/java/org/chromium/weblayer/WebLayer.java
index 87ee4de..f7fbc98 100644
--- a/weblayer/public/java/org/chromium/weblayer/WebLayer.java
+++ b/weblayer/public/java/org/chromium/weblayer/WebLayer.java
@@ -8,8 +8,10 @@
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.util.AndroidRuntimeException;
 import android.webkit.WebViewDelegate;
 import android.webkit.WebViewFactory;
 
@@ -29,6 +31,8 @@
     private static WebLayer sInstance;
     private IWebLayer mImpl;
 
+    private Application mApplication;
+
     public static WebLayer getInstance() {
         if (sInstance == null) {
             sInstance = new WebLayer();
@@ -39,6 +43,7 @@
     WebLayer() {}
 
     public void init(Application application) {
+        mApplication = application;
         try {
             // TODO: Make asset loading work on L, where WebViewDelegate doesn't exist.
             // WebViewDelegate.addWebViewAssetPath() accesses the currently loaded package info from
@@ -56,8 +61,7 @@
             WebViewDelegate delegate = (WebViewDelegate) constructor.newInstance();
             delegate.addWebViewAssetPath(application);
 
-            Context remoteContext = application.createPackageContext(
-                    PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
+            Context remoteContext = createRemoteContext();
             mImpl = IWebLayer.Stub.asInterface(
                     (IBinder) remoteContext.getClassLoader()
                             .loadClass("org.chromium.weblayer_private.WebLayerImpl")
@@ -88,4 +92,16 @@
             throw new APICallException(e);
         }
     }
+
+    /**
+     * Creates a Context for the remote (weblayer implementation) side.
+     */
+    Context createRemoteContext() {
+        try {
+            return mApplication.createPackageContext(
+                    PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
+        } catch (NameNotFoundException e) {
+            throw new AndroidRuntimeException(e);
+        }
+    }
 }
diff --git a/weblayer/shell/BUILD.gn b/weblayer/shell/BUILD.gn
index db25698..44d80ae82 100644
--- a/weblayer/shell/BUILD.gn
+++ b/weblayer/shell/BUILD.gn
@@ -193,6 +193,9 @@
     sources +=
         [ "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak" ]
   }
+  if (is_android) {
+    deps += [ "//ui/android:ui_java_resources" ]
+  }
   output = "$root_out_dir/weblayer_support.pak"
 }
 
diff --git a/weblayer/shell/browser/shell.cc b/weblayer/shell/browser/shell.cc
index 8a4b6c0..33f95c0 100644
--- a/weblayer/shell/browser/shell.cc
+++ b/weblayer/shell/browser/shell.cc
@@ -105,6 +105,10 @@
   PlatformEnableUIControl(STOP_BUTTON, to_different_document && is_loading);
 }
 
+void Shell::LoadProgressChanged(double progress) {
+  PlatformSetLoadProgress(progress);
+}
+
 void Shell::DisplayedURLChanged(const GURL& url) {
   PlatformSetAddressBarURL(url);
 }
diff --git a/weblayer/shell/browser/shell.h b/weblayer/shell/browser/shell.h
index 0aebe03..c429bfb 100644
--- a/weblayer/shell/browser/shell.h
+++ b/weblayer/shell/browser/shell.h
@@ -76,6 +76,7 @@
   // BrowserObserver implementation:
   void LoadingStateChanged(bool is_loading,
                            bool to_different_document) override;
+  void LoadProgressChanged(double progress) override;
   void DisplayedURLChanged(const GURL& url) override;
 
   // Helper to create a new Shell.
@@ -113,8 +114,8 @@
   // Updates the url in the url bar.
   void PlatformSetAddressBarURL(const GURL& url);
 
-  // Sets whether the spinner is spinning.
-  void PlatformSetIsLoading(bool loading);
+  // Sets the load progress indicator in the UI.
+  void PlatformSetLoadProgress(double progress);
 
   // Set the title of shell window
   void PlatformSetTitle(const base::string16& title);
diff --git a/weblayer/shell/browser/shell_views.cc b/weblayer/shell/browser/shell_views.cc
index cd8c12e..5201a1d 100644
--- a/weblayer/shell/browser/shell_views.cc
+++ b/weblayer/shell/browser/shell_views.cc
@@ -82,6 +82,7 @@
   }
 
   void SetWindowTitle(const base::string16& title) { title_ = title; }
+
   void EnableUIControl(UIControl control, bool is_enabled) {
     if (control == BACK_BUTTON) {
       back_button_->SetState(is_enabled ? views::Button::STATE_NORMAL
@@ -92,9 +93,18 @@
     } else if (control == STOP_BUTTON) {
       stop_button_->SetState(is_enabled ? views::Button::STATE_NORMAL
                                         : views::Button::STATE_DISABLED);
+      if (!is_enabled)
+        UpdateLoadProgress();
     }
   }
 
+  void UpdateLoadProgress(double progress = 0.) {
+    std::string stop_text("Stop");
+    if (stop_button_->state() == views::Button::STATE_NORMAL)
+      stop_text = base::StringPrintf("Stop (%.0f%%)", progress * 100);
+    stop_button_->SetText(base::ASCIIToUTF16(stop_text));
+  }
+
  private:
   // Initialize the UI control contained in shell window
   void InitShellWindow() {
@@ -145,12 +155,11 @@
         refresh_button_size.width() / 2);
     // Stop button
     auto stop_button =
-        views::MdTextButton::Create(this, base::ASCIIToUTF16("Stop"));
-    gfx::Size stop_button_size = stop_button->GetPreferredSize();
+        views::MdTextButton::Create(this, base::ASCIIToUTF16("Stop (100%)"));
+    int stop_button_width = stop_button->GetPreferredSize().width();
     toolbar_column_set->AddColumn(
-        views::GridLayout::CENTER, views::GridLayout::CENTER, 0,
-        views::GridLayout::FIXED, stop_button_size.width(),
-        stop_button_size.width() / 2);
+        views::GridLayout::FILL, views::GridLayout::CENTER, 0,
+        views::GridLayout::FIXED, stop_button_width, stop_button_width / 2);
     toolbar_column_set->AddPaddingColumn(0, 2);
     // URL entry
     auto url_entry = std::make_unique<views::Textfield>();
@@ -184,6 +193,7 @@
 
     InitAccelerators();
   }
+
   void InitAccelerators() {
     static const ui::KeyboardCode keys[] = {ui::VKEY_F5, ui::VKEY_BROWSER_BACK,
                                             ui::VKEY_BROWSER_FORWARD};
@@ -193,9 +203,11 @@
           ui::AcceleratorManager::kNormalPriority, this);
     }
   }
+
   // Overridden from TextfieldController
   void ContentsChanged(views::Textfield* sender,
                        const base::string16& new_contents) override {}
+
   bool HandleKeyEvent(views::Textfield* sender,
                       const ui::KeyEvent& key_event) override {
     if (key_event.type() == ui::ET_KEY_PRESSED && sender == url_entry_ &&
@@ -278,7 +290,7 @@
   views::Button* back_button_ = nullptr;
   views::Button* forward_button_ = nullptr;
   views::Button* refresh_button_ = nullptr;
-  views::Button* stop_button_ = nullptr;
+  views::MdTextButton* stop_button_ = nullptr;
   views::Textfield* url_entry_ = nullptr;
 
   // Contents view contains the WebBrowser view
@@ -342,7 +354,11 @@
   delegate_view->SetAddressBarURL(url);
 }
 
-void Shell::PlatformSetIsLoading(bool loading) {}
+void Shell::PlatformSetLoadProgress(double progress) {
+  ShellWindowDelegateView* delegate_view =
+      static_cast<ShellWindowDelegateView*>(window_widget_->widget_delegate());
+  delegate_view->UpdateLoadProgress(progress);
+}
 
 void Shell::PlatformCreateWindow(int width, int height) {
   window_widget_ = new views::Widget;