diff --git a/DEPS b/DEPS
index 99cc4fe3..65b7014 100644
--- a/DEPS
+++ b/DEPS
@@ -175,11 +175,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': '1eccf285a2991277e7e05054231d45b57c3c4a26',
+  'skia_revision': '4ee635638fc1a797a1a11b5a9e0fbff5e11b4258',
   # 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': 'e7dd8e8dfc38217453b151faafe2088581b4542a',
+  'v8_revision': '2eca5b1e7f9577981ce4caef380e2395aacb1fe9',
   # 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.
@@ -187,7 +187,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': 'cbbfa2f28a0ee0ca652416d74b42c58238b24a3a',
+  'angle_revision': '1fdf6ca5141d8e349e875eab6e51d93d929a7f0e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -226,7 +226,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': '7e1b39f6cd1f8e14d45592c9b192ade643d8d9de',
+  'freetype_revision': '10d8de7541ab1f26f6f04b2118d13a92a7119102',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -246,7 +246,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'a1bd2ac157a5de2259f7b0ccb0801e819c7a407e',
+  'devtools_frontend_revision': 'f3b0f52a1eb10b9d02a8db72e38a55f646485247',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -864,7 +864,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '5abfe3af46e684491975f09d145e880b18dcb9e6',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '7af927e60755151092f28914b50e2d7f7a844d91',
       'condition': 'checkout_linux',
   },
 
@@ -1282,7 +1282,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7449dc8a7f22156ee7a2bc2157260480938850e1',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b0e11f6c807fcbbfbbe464fddd51d80d09f6e19a',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1379,7 +1379,7 @@
   },
 
   'src/third_party/re2/src':
-    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'bb8e777557ddbdeabdedea4f23613c5021ffd7b1',
+    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'f71aaa0be84a7b401bc6494488880f3b17b5bca9',
 
   'src/third_party/r8': {
       'packages': [
@@ -1483,7 +1483,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '53655df4cde60b121fc530842ba9a6d5dfec1ae1',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '1c34ca7676e882100e29ef47258bfb2e41c30cbf',
+    Var('webrtc_git') + '/src.git' + '@' + 'a43777dead46df4575a58c5ca2733c5f3ff0212b',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1553,7 +1553,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e658c3481ce2e8d0a0b40d0b3868493c81811ec4',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@79df1292b2aa53e51015d78e64ea96499e53b208',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 3b01b4c..d6c17487 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -494,13 +494,14 @@
 android_library("common_java") {
   sources = [
     "java/src/org/chromium/android_webview/common/AwResource.java",
+    "java/src/org/chromium/android_webview/common/DeveloperModeUtils.java",
     "java/src/org/chromium/android_webview/common/Flag.java",
-    "java/src/org/chromium/android_webview/common/FlagOverrideConstants.java",
     "java/src/org/chromium/android_webview/common/FlagOverrideHelper.java",
     "java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java",
     "java/src/org/chromium/android_webview/common/services/ServiceNames.java",
   ]
   deps = [
+    ":common_commandline_java",
     "//base:base_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
   ]
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
index 7cf005e..da6e00f 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
@@ -34,6 +34,9 @@
 import org.chromium.android_webview.VariationsSeedLoader;
 import org.chromium.android_webview.WebViewChromiumRunQueue;
 import org.chromium.android_webview.common.AwResource;
+import org.chromium.android_webview.common.DeveloperModeUtils;
+import org.chromium.android_webview.common.FlagOverrideHelper;
+import org.chromium.android_webview.common.ProductionSupportedFlagList;
 import org.chromium.android_webview.gfx.AwDrawFnImpl;
 import org.chromium.base.BuildConfig;
 import org.chromium.base.BuildInfo;
@@ -168,8 +171,11 @@
             // available when AwFeatureListCreator::SetUpFieldTrials() runs.
             finishVariationsInitLocked();
 
-            if (AwBrowserProcess.isDeveloperModeEnabled()) {
-                AwBrowserProcess.getAndApplyFlagOverridesSync();
+            String webViewPackageName = AwBrowserProcess.getWebViewPackageName();
+            if (DeveloperModeUtils.isDeveloperModeEnabled(webViewPackageName)) {
+                FlagOverrideHelper helper =
+                        new FlagOverrideHelper(ProductionSupportedFlagList.sFlagList);
+                helper.applyFlagOverrides(DeveloperModeUtils.getFlagOverrides(webViewPackageName));
             }
 
             AwBrowserProcess.start();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
index 7962ca1..2448771d 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -8,9 +8,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
 import android.os.Build;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
@@ -18,10 +15,7 @@
 import android.os.StrictMode;
 
 import org.chromium.android_webview.common.CommandLineUtil;
-import org.chromium.android_webview.common.FlagOverrideConstants;
-import org.chromium.android_webview.common.FlagOverrideHelper;
 import org.chromium.android_webview.common.PlatformServiceBridge;
-import org.chromium.android_webview.common.ProductionSupportedFlagList;
 import org.chromium.android_webview.common.services.ICrashReceiverService;
 import org.chromium.android_webview.common.services.ServiceNames;
 import org.chromium.android_webview.metrics.AwMetricsServiceClient;
@@ -52,7 +46,6 @@
 import java.io.RandomAccessFile;
 import java.nio.channels.FileLock;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -371,49 +364,6 @@
         });
     }
 
-    // TODO(ntfschr): move this to DeveloperModeUtils in common Java packaage.
-    // Quickly determine whether developer mode is enabled.
-    public static boolean isDeveloperModeEnabled() {
-        final Context context = ContextUtils.getApplicationContext();
-        ComponentName flagOverrideContentProvider = new ComponentName(
-                getWebViewPackageName(), ServiceNames.FLAG_OVERRIDE_CONTENT_PROVIDER);
-        int enabledState =
-                context.getPackageManager().getComponentEnabledSetting(flagOverrideContentProvider);
-        return enabledState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
-    }
-
-    public static void getAndApplyFlagOverridesSync() {
-        FlagOverrideHelper helper = new FlagOverrideHelper(ProductionSupportedFlagList.sFlagList);
-        helper.applyFlagOverrides(getFlagOverrides());
-    }
-
-    // TODO(ntfschr): move this to DeveloperModeUtils in common Java packaage.
-    private static Map<String, Boolean> getFlagOverrides() {
-        Map<String, Boolean> flagOverrides = new HashMap<>();
-
-        Uri uri = new Uri.Builder()
-                          .scheme("content")
-                          .authority(getWebViewPackageName()
-                                  + FlagOverrideConstants.URI_AUTHORITY_SUFFIX)
-                          .path(FlagOverrideConstants.URI_PATH)
-                          .build();
-        final Context appContext = ContextUtils.getApplicationContext();
-        try (Cursor cursor = appContext.getContentResolver().query(uri, /* projection */ null,
-                     /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) {
-            assert cursor != null : "ContentProvider doesn't support querying '" + uri + "'";
-            int flagNameColumnIndex =
-                    cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_NAME_COLUMN);
-            int flagStateColumnIndex =
-                    cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_STATE_COLUMN);
-            while (cursor.moveToNext()) {
-                String flagName = cursor.getString(flagNameColumnIndex);
-                boolean flagState = cursor.getInt(flagStateColumnIndex) != 0;
-                flagOverrides.put(flagName, flagState);
-            }
-        }
-        return flagOverrides;
-    }
-
     // Do not instantiate this class.
     private AwBrowserProcess() {}
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/common/DeveloperModeUtils.java b/android_webview/java/src/org/chromium/android_webview/common/DeveloperModeUtils.java
new file mode 100644
index 0000000..331d5c1
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/common/DeveloperModeUtils.java
@@ -0,0 +1,84 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.common;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.net.Uri;
+
+import org.chromium.android_webview.common.services.ServiceNames;
+import org.chromium.base.ContextUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Utilities for communication with the developer mode ContentProvider.
+ *
+ * <p>This should only be called in processes which have called {@link
+ * ContextUtils.initApplicationContext(Context)}.
+ */
+public final class DeveloperModeUtils {
+    // Do not instantiate this class.
+    private DeveloperModeUtils() {}
+
+    public static final String URI_AUTHORITY_SUFFIX = ".DeveloperModeContentProvider";
+    public static final String FLAG_OVERRIDE_URI_PATH = "/flag-overrides";
+    public static final String FLAG_OVERRIDE_NAME_COLUMN = "flagName";
+    public static final String FLAG_OVERRIDE_STATE_COLUMN = "flagState";
+
+    /**
+     * Quickly determine whether developer mode is enabled. Developer mode is off-by-default.
+     *
+     * <p>This makes no guarantees about which processes are alive, it only indicates whether the
+     * user has stepped in or out of "developer mode." Developer mode may be enabled and the
+     * ContentProvider process may be dead if the user has taken a WebView update since enabling
+     * developer mode.
+     *
+     * @param webViewPackageName the package name of the WebView implementation to fetch the flags
+     *     from (generally this is the current WebView provider).
+     */
+    public static boolean isDeveloperModeEnabled(String webViewPackageName) {
+        final Context context = ContextUtils.getApplicationContext();
+        ComponentName developerModeContentProvider =
+                new ComponentName(webViewPackageName, ServiceNames.DEVELOPER_MODE_CONTENT_PROVIDER);
+        int enabledState = context.getPackageManager().getComponentEnabledSetting(
+                developerModeContentProvider);
+        return enabledState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+    }
+
+    /**
+     * Fetch the flag overrides from the developer mode ContentProvider. This should only be called
+     * if {@link #isDeveloperModeEnabled(String}} returns {@code true}, otherwise this may incur
+     * unnecessary IPC or start up processes unnecessarily.
+     *
+     * @param webViewPackageName the package name of the WebView implementation to fetch the flags
+     *     from (generally this is the current WebView provider).
+     */
+    public static Map<String, Boolean> getFlagOverrides(String webViewPackageName) {
+        Map<String, Boolean> flagOverrides = new HashMap<>();
+
+        Uri uri = new Uri.Builder()
+                          .scheme("content")
+                          .authority(webViewPackageName + URI_AUTHORITY_SUFFIX)
+                          .path(FLAG_OVERRIDE_URI_PATH)
+                          .build();
+        final Context appContext = ContextUtils.getApplicationContext();
+        try (Cursor cursor = appContext.getContentResolver().query(uri, /* projection */ null,
+                     /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) {
+            assert cursor != null : "ContentProvider doesn't support querying '" + uri + "'";
+            int flagNameColumnIndex = cursor.getColumnIndexOrThrow(FLAG_OVERRIDE_NAME_COLUMN);
+            int flagStateColumnIndex = cursor.getColumnIndexOrThrow(FLAG_OVERRIDE_STATE_COLUMN);
+            while (cursor.moveToNext()) {
+                String flagName = cursor.getString(flagNameColumnIndex);
+                boolean flagState = cursor.getInt(flagStateColumnIndex) != 0;
+                flagOverrides.put(flagName, flagState);
+            }
+        }
+        return flagOverrides;
+    }
+}
diff --git a/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java b/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java
deleted file mode 100644
index fcb0a83..0000000
--- a/android_webview/java/src/org/chromium/android_webview/common/FlagOverrideConstants.java
+++ /dev/null
@@ -1,18 +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.
-
-package org.chromium.android_webview.common;
-
-/**
- * Constants to facilitate communication with {@code FlagOverrideContentProvider}.
- */
-public final class FlagOverrideConstants {
-    // Do not instantiate this class.
-    private FlagOverrideConstants() {}
-
-    public static final String URI_AUTHORITY_SUFFIX = ".FlagOverrideContentProvider";
-    public static final String URI_PATH = "/flag-overrides";
-    public static final String FLAG_NAME_COLUMN = "flagName";
-    public static final String FLAG_STATE_COLUMN = "flagState";
-}
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 07129633..53caa29 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -28,5 +28,19 @@
                             + "compositing."),
             Flag.commandLine("webview-log-js-console-messages",
                     "Mirrors JavaScript console messages to system logs."),
+            Flag.commandLine(CommandLineUtil.CRASH_UPLOADS_ENABLED_FOR_TESTING_SWITCH,
+                    "Used for turning on Breakpad crash reporting in a debug environment where "
+                            + "crash reporting is typically compiled but disabled."),
+            Flag.baseFeature("OutOfBlinkCors",
+                    "Moves CORS logic into the Network Service (rather than inside the blink "
+                            + "rendering engine)."),
+            Flag.baseFeature("VizForWebView", "Enables Viz for WebView."),
+            Flag.baseFeature("WebViewConnectionlessSafeBrowsing",
+                    "Uses GooglePlayService's 'connectionless' APIs for Safe Browsing "
+                            + "security checks."),
+            Flag.baseFeature(
+                    "WebViewBrotliSupport", "Enables brotli compression support in WebView."),
+            Flag.baseFeature("SafeBrowsingCommittedInterstitials",
+                    "Commits Safe Browsing warning pages like page navigations."),
     };
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java
index 48fc0ba..732ce91 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceNames.java
@@ -15,10 +15,10 @@
             "org.chromium.android_webview.services.AwMinidumpUploadJobService";
     public static final String CRASH_RECEIVER_SERVICE =
             "org.chromium.android_webview.services.CrashReceiverService";
+    public static final String DEVELOPER_MODE_CONTENT_PROVIDER =
+            "org.chromium.android_webview.services.DeveloperModeContentProvider";
     public static final String DEVELOPER_UI_SERVICE =
             "org.chromium.android_webview.services.DeveloperUiService";
-    public static final String FLAG_OVERRIDE_CONTENT_PROVIDER =
-            "org.chromium.android_webview.services.FlagOverrideContentProvider";
     public static final String VARIATIONS_SEED_SERVER =
             "org.chromium.android_webview.services.VariationsSeedServer";
 
diff --git a/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java
index e1ec9b3..a82211d2 100644
--- a/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java
+++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java
@@ -14,8 +14,8 @@
 import org.chromium.android_webview.common.services.ServiceNames;
 import org.chromium.android_webview.services.AwMinidumpUploadJobService;
 import org.chromium.android_webview.services.CrashReceiverService;
+import org.chromium.android_webview.services.DeveloperModeContentProvider;
 import org.chromium.android_webview.services.DeveloperUiService;
-import org.chromium.android_webview.services.FlagOverrideContentProvider;
 import org.chromium.android_webview.services.VariationsSeedServer;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
@@ -31,11 +31,11 @@
                 ServiceNames.AW_MINIDUMP_UPLOAD_JOB_SERVICE);
         Assert.assertEquals("Incorrect class name constant", CrashReceiverService.class.getName(),
                 ServiceNames.CRASH_RECEIVER_SERVICE);
+        Assert.assertEquals("Incorrect class name constant",
+                DeveloperModeContentProvider.class.getName(),
+                ServiceNames.DEVELOPER_MODE_CONTENT_PROVIDER);
         Assert.assertEquals("Incorrect class name constant", DeveloperUiService.class.getName(),
                 ServiceNames.DEVELOPER_UI_SERVICE);
-        Assert.assertEquals("Incorrect class name constant",
-                FlagOverrideContentProvider.class.getName(),
-                ServiceNames.FLAG_OVERRIDE_CONTENT_PROVIDER);
         Assert.assertEquals("Incorrect class name constant", VariationsSeedServer.class.getName(),
                 ServiceNames.VARIATIONS_SEED_SERVER);
     }
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index 80baf3e..e9e59f6 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -72,8 +72,8 @@
     "java/src/org/chromium/android_webview/services/AwMinidumpUploaderDelegate.java",
     "java/src/org/chromium/android_webview/services/AwVariationsSeedFetcher.java",
     "java/src/org/chromium/android_webview/services/CrashReceiverService.java",
+    "java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java",
     "java/src/org/chromium/android_webview/services/DeveloperUiService.java",
-    "java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java",
     "java/src/org/chromium/android_webview/services/VariationsSeedHolder.java",
     "java/src/org/chromium/android_webview/services/VariationsSeedServer.java",
   ]
diff --git a/android_webview/nonembedded/java/AndroidManifest.xml b/android_webview/nonembedded/java/AndroidManifest.xml
index b4cd519d..e85efee 100644
--- a/android_webview/nonembedded/java/AndroidManifest.xml
+++ b/android_webview/nonembedded/java/AndroidManifest.xml
@@ -73,10 +73,10 @@
                       android:authorities="{{ manifest_package }}.LicenseContentProvider"
                       android:process=":webview_apk" />  {# Explicit process required for monochrome compatibility. #}
             <!-- Disabled by default, enabled at runtime by Developer UI. -->
-            <provider android:name="org.chromium.android_webview.services.FlagOverrideContentProvider"
+            <provider android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
                       android:exported="true"
                       android:enabled="false"
-                      android:authorities="{{ manifest_package }}.FlagOverrideContentProvider"
+                      android:authorities="{{ manifest_package }}.DeveloperModeContentProvider"
                       android:process=":webview_service" />  {# Explicit process required for monochrome compatibility. #}
             {% if donor_package is not defined %}
                 <!-- If you change the variations services, also see
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java
index a353156..82cc6ca7 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsActivity.java
@@ -10,9 +10,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -27,13 +24,12 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
+import org.chromium.android_webview.common.DeveloperModeUtils;
 import org.chromium.android_webview.common.Flag;
-import org.chromium.android_webview.common.FlagOverrideConstants;
 import org.chromium.android_webview.common.ProductionSupportedFlagList;
 import org.chromium.android_webview.common.services.IDeveloperUiService;
 import org.chromium.android_webview.common.services.ServiceNames;
 import org.chromium.android_webview.devui.util.NavigationMenuHelper;
-import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 
 import java.util.HashMap;
@@ -73,8 +69,8 @@
 
         // Restore flag overrides from the service process to repopulate the UI, if developer mode
         // is enabled.
-        if (isDeveloperModeEnabled(getPackageName())) {
-            mOverriddenFlags = getFlagOverrides(getPackageName());
+        if (DeveloperModeUtils.isDeveloperModeEnabled(getPackageName())) {
+            mOverriddenFlags = DeveloperModeUtils.getFlagOverrides(getPackageName());
         }
 
         mListAdapter = new FlagsListAdapter();
@@ -237,62 +233,4 @@
         mListAdapter.notifyDataSetChanged();
         sendFlagsToService();
     }
-
-    /**
-     * Quickly determine whether developer mode is enabled. Developer mode is off-by-default.
-     *
-     * <p>This makes no guarantees about which processes are alive, it only indicates whether the
-     * user has stepped in or out of "developer mode." Developer mode may be enabled and the
-     * ContentProvider process may be dead if the user has taken a WebView update since enabling
-     * developer mode.
-     *
-     * <p>TODO(ntfschr): move this to DeveloperModeUtils in common Java packaage.
-     *
-     * @param webViewPackageName the package name of the WebView implementation to fetch the flags
-     *     from (generally this is the current WebView provider).
-     */
-    public static boolean isDeveloperModeEnabled(String webViewPackageName) {
-        final Context context = ContextUtils.getApplicationContext();
-        ComponentName flagOverrideContentProvider =
-                new ComponentName(webViewPackageName, ServiceNames.FLAG_OVERRIDE_CONTENT_PROVIDER);
-        int enabledState =
-                context.getPackageManager().getComponentEnabledSetting(flagOverrideContentProvider);
-        return enabledState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
-    }
-
-    /**
-     * Fetch the flag overrides from the developer mode ContentProvider. This should only be called
-     * if {@link #isDeveloperModeEnabled(String}} returns {@code true}, otherwise this may incur
-     * unnecessary IPC or start up processes unnecessarily.
-     *
-     * <p>TODO(ntfschr): move this to DeveloperModeUtils in common Java packaage.
-     *
-     * @param webViewPackageName the package name of the WebView implementation to fetch the flags
-     *     from (generally this is the current WebView provider).
-     */
-    public static Map<String, Boolean> getFlagOverrides(String webViewPackageName) {
-        Map<String, Boolean> flagOverrides = new HashMap<>();
-
-        Uri uri =
-                new Uri.Builder()
-                        .scheme("content")
-                        .authority(webViewPackageName + FlagOverrideConstants.URI_AUTHORITY_SUFFIX)
-                        .path(FlagOverrideConstants.URI_PATH)
-                        .build();
-        final Context appContext = ContextUtils.getApplicationContext();
-        try (Cursor cursor = appContext.getContentResolver().query(uri, /* projection */ null,
-                     /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) {
-            assert cursor != null : "ContentProvider doesn't support querying '" + uri + "'";
-            int flagNameColumnIndex =
-                    cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_NAME_COLUMN);
-            int flagStateColumnIndex =
-                    cursor.getColumnIndexOrThrow(FlagOverrideConstants.FLAG_STATE_COLUMN);
-            while (cursor.moveToNext()) {
-                String flagName = cursor.getString(flagNameColumnIndex);
-                boolean flagState = cursor.getInt(flagStateColumnIndex) != 0;
-                flagOverrides.put(flagName, flagState);
-            }
-        }
-        return flagOverrides;
-    }
 }
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java
similarity index 79%
rename from android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java
rename to android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java
index e39f8e64..bfc0b09 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/FlagOverrideContentProvider.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java
@@ -12,16 +12,16 @@
 import android.database.MatrixCursor;
 import android.net.Uri;
 
-import org.chromium.android_webview.common.FlagOverrideConstants;
+import org.chromium.android_webview.common.DeveloperModeUtils;
 
 import java.util.Map;
 
 /**
- * A {@link ContentProvider} to fetch the flag overrides, via the {@code query()} method. No special
+ * A {@link ContentProvider} to fetch debugging data via the {@code query()} method. No special
  * permissions are required to access this ContentProvider, and it can be accessed by any context
  * (including the embedded WebView implementation).
  */
-public final class FlagOverrideContentProvider extends ContentProvider {
+public final class DeveloperModeContentProvider extends ContentProvider {
     @Override
     public boolean onCreate() {
         return true;
@@ -45,10 +45,10 @@
     @Override
     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
             String sortOrder) {
-        if (FlagOverrideConstants.URI_PATH.equals(uri.getPath())) {
+        if (DeveloperModeUtils.FLAG_OVERRIDE_URI_PATH.equals(uri.getPath())) {
             Map<String, Boolean> flagOverrides = DeveloperUiService.getFlagOverrides();
-            final String[] columns = {FlagOverrideConstants.FLAG_NAME_COLUMN,
-                    FlagOverrideConstants.FLAG_STATE_COLUMN};
+            final String[] columns = {DeveloperModeUtils.FLAG_OVERRIDE_NAME_COLUMN,
+                    DeveloperModeUtils.FLAG_OVERRIDE_STATE_COLUMN};
             MatrixCursor cursor = new MatrixCursor(columns, flagOverrides.size());
             for (Map.Entry<String, Boolean> entry : flagOverrides.entrySet()) {
                 String flagName = entry.getKey();
@@ -64,9 +64,9 @@
     }
 
     private void disableDeveloperMode() {
-        ComponentName flagOverrideContentProvider =
-                new ComponentName(getContext(), FlagOverrideContentProvider.class.getName());
-        getContext().getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider,
+        ComponentName developerModeContentProvider =
+                new ComponentName(getContext(), DeveloperModeContentProvider.class.getName());
+        getContext().getPackageManager().setComponentEnabledSetting(developerModeContentProvider,
                 PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
 
         // Stop the service explicitly, in case it's running. NOOP if the service is not running.
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java
index 415f132..850d7c7 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/DeveloperUiService.java
@@ -130,9 +130,9 @@
             startService(new Intent(this, DeveloperUiService.class));
             markAsForegroundService();
 
-            ComponentName flagOverrideContentProvider =
-                    new ComponentName(this, FlagOverrideContentProvider.class.getName());
-            getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider,
+            ComponentName developerModeContentProvider =
+                    new ComponentName(this, DeveloperModeContentProvider.class.getName());
+            getPackageManager().setComponentEnabledSetting(developerModeContentProvider,
                     PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
 
             mDeveloperModeEnabled = true;
@@ -144,9 +144,9 @@
             if (!mDeveloperModeEnabled) return;
             mDeveloperModeEnabled = false;
 
-            ComponentName flagOverrideContentProvider =
-                    new ComponentName(this, FlagOverrideContentProvider.class.getName());
-            getPackageManager().setComponentEnabledSetting(flagOverrideContentProvider,
+            ComponentName developerModeContentProvider =
+                    new ComponentName(this, DeveloperModeContentProvider.class.getName());
+            getPackageManager().setComponentEnabledSetting(developerModeContentProvider,
                     PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
 
             // Finally, stop the service explicitly. Do this last to make sure we do the other
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 8046e82b..61bdebf 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -4942,67 +4942,112 @@
 // Test that when swiping up on the shelf, we may or may not drag up the MRU
 // window.
 TEST_F(ShelfLayoutManagerWindowDraggingTest, DraggedMRUWindow) {
-  const gfx::Rect shelf_widget_bounds =
-      GetShelfWidget()->GetWindowBoundsInScreen();
+  const int shelf_widget_height =
+      GetShelfWidget()->GetWindowBoundsInScreen().height();
   const int shelf_size = ShelfConfig::Get()->shelf_size();
   const int hotseat_size = ShelfConfig::Get()->hotseat_size();
   const int hotseat_padding_size = ShelfConfig::Get()->hotseat_bottom_padding();
 
-  // Starts the drag from the center of the shelf's bottom.
-  gfx::Point start = shelf_widget_bounds.bottom_center();
-  StartScroll(start);
-  UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
-  // We need at least one window to work with.
-  EXPECT_FALSE(GetShelfLayoutManager()->window_drag_controller_for_testing());
-  EndScroll(/*is_fling=*/false, 0.f);
+  const struct TestCase {
+    // The shelf widget whose bounds are used as the base for gesture start and
+    // end locations.
+    const views::Widget* widget;
+    // Whether the widget bounds are completely in the left part of the split
+    // view.
+    const bool left_in_split_view;
+    // Whether the widget bounds are completely in the right part of the split
+    // view.
+    const bool right_in_split_view;
+    const std::string description;
+  } test_cases[] = {
+      {GetShelfWidget(), false /*left_in_split_view*/,
+       false /*right_in_split_view*/, "Shelf widget"},
+      {GetShelfWidget()->navigation_widget(), true /*left_in_split_view*/,
+       false /*right_in_split_view*/, "Navigation widget"},
+      {GetShelfWidget()->status_area_widget(), false /*left_in_split_view*/,
+       true /*right_in_split_view*/, "Status area widget"}};
 
-  std::unique_ptr<aura::Window> window =
-      AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
-  wm::ActivateWindow(window.get());
+  for (const auto& test_case : test_cases) {
+    SCOPED_TRACE(test_case.description);
+    ASSERT_TRUE(!test_case.left_in_split_view ||
+                !test_case.right_in_split_view);
 
-  StartScroll(start);
-  UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
-  DragWindowFromShelfController* window_drag_controller =
-      GetShelfLayoutManager()->window_drag_controller_for_testing();
-  EXPECT_TRUE(IsWindowDragInProgress());
-  EXPECT_EQ(window_drag_controller->dragged_window(), window.get());
-  UpdateScroll(-shelf_widget_bounds.height() - hotseat_size);
-  EndScroll(/*is_fling=*/false, 0.f);
-  EXPECT_FALSE(IsWindowDragInProgress());
+    // Starts the drag from the center of the shelf's bottom.
+    const gfx::Rect widget_bounds = test_case.widget->GetWindowBoundsInScreen();
+    gfx::Point start = widget_bounds.bottom_center();
+    StartScroll(start);
+    UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
+    // We need at least one window to work with.
+    EXPECT_FALSE(IsWindowDragInProgress());
+    EndScroll(/*is_fling=*/false, 0.f);
 
-  // The window needs to be visible to drag up.
-  window->Hide();
-  StartScroll(start);
-  UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
-  EXPECT_FALSE(IsWindowDragInProgress());
-  EndScroll(/*is_fling=*/false, 0.f);
+    std::unique_ptr<aura::Window> window =
+        AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
+    wm::ActivateWindow(window.get());
 
-  // In splitview, depends on the drag position, the active dragged window might
-  // be different.
-  window->Show();
-  auto window2 = AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
-  SplitViewController* split_view_controller =
-      SplitViewController::Get(Shell::GetPrimaryRootWindow());
-  split_view_controller->SnapWindow(window.get(), SplitViewController::LEFT);
-  split_view_controller->SnapWindow(window2.get(), SplitViewController::RIGHT);
-  StartScroll(shelf_widget_bounds.bottom_left());
-  UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
-  window_drag_controller =
-      GetShelfLayoutManager()->window_drag_controller_for_testing();
-  EXPECT_TRUE(IsWindowDragInProgress());
-  EXPECT_EQ(window_drag_controller->dragged_window(), window.get());
-  EndScroll(/*is_fling=*/false, 0.f);
-  EXPECT_FALSE(IsWindowDragInProgress());
+    StartScroll(start);
+    UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
+    DragWindowFromShelfController* window_drag_controller =
+        GetShelfLayoutManager()->window_drag_controller_for_testing();
+    EXPECT_TRUE(IsWindowDragInProgress());
+    EXPECT_EQ(window_drag_controller->dragged_window(), window.get());
+    UpdateScroll(-shelf_widget_height - hotseat_size);
+    EXPECT_FALSE(window->transform().IsIdentityOrTranslation());
+    EXPECT_TRUE(window->transform().IsScaleOrTranslation());
+    EndScroll(/*is_fling=*/false, 0.f);
+    EXPECT_FALSE(IsWindowDragInProgress());
+    EXPECT_TRUE(window->transform().IsIdentity());
 
-  StartScroll(shelf_widget_bounds.bottom_right());
-  UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
-  window_drag_controller =
-      GetShelfLayoutManager()->window_drag_controller_for_testing();
-  EXPECT_TRUE(IsWindowDragInProgress());
-  EXPECT_EQ(window_drag_controller->dragged_window(), window2.get());
-  EndScroll(/*is_fling=*/false, 0.f);
-  split_view_controller->EndSplitView();
-  EXPECT_FALSE(IsWindowDragInProgress());
+    // The window needs to be visible to drag up.
+    window->Hide();
+    StartScroll(start);
+    UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
+    EXPECT_FALSE(IsWindowDragInProgress());
+    EXPECT_TRUE(window->transform().IsIdentity());
+    EndScroll(/*is_fling=*/false, 0.f);
+
+    // In splitview, depends on the drag position, the active dragged window
+    // might be different.
+    window->Show();
+    auto window2 = AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
+    SplitViewController* split_view_controller =
+        SplitViewController::Get(Shell::GetPrimaryRootWindow());
+    split_view_controller->SnapWindow(window.get(), SplitViewController::LEFT);
+    split_view_controller->SnapWindow(window2.get(),
+                                      SplitViewController::RIGHT);
+    StartScroll(widget_bounds.bottom_left());
+    UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
+    window_drag_controller =
+        GetShelfLayoutManager()->window_drag_controller_for_testing();
+    EXPECT_TRUE(IsWindowDragInProgress());
+    aura::Window* drag_window =
+        test_case.right_in_split_view ? window2.get() : window.get();
+    EXPECT_EQ(window_drag_controller->dragged_window(), drag_window);
+    // No window transform at the point where the window drag starts.
+    EXPECT_TRUE(drag_window->transform().IsIdentity());
+    // The window is expected to be scaled down as the drag progresses.
+    UpdateScroll(-10);
+    EXPECT_FALSE(drag_window->transform().IsIdentityOrTranslation());
+    EXPECT_TRUE(drag_window->transform().IsScaleOrTranslation());
+    EndScroll(/*is_fling=*/false, 0.f);
+    EXPECT_FALSE(IsWindowDragInProgress());
+    EXPECT_TRUE(drag_window->transform().IsIdentity());
+
+    StartScroll(widget_bounds.bottom_right());
+    UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
+    window_drag_controller =
+        GetShelfLayoutManager()->window_drag_controller_for_testing();
+    EXPECT_TRUE(IsWindowDragInProgress());
+    drag_window = test_case.left_in_split_view ? window.get() : window2.get();
+    EXPECT_EQ(window_drag_controller->dragged_window(), drag_window);
+    EXPECT_FALSE(drag_window->transform().IsIdentityOrTranslation());
+    EXPECT_TRUE(drag_window->transform().IsScaleOrTranslation());
+    EndScroll(/*is_fling=*/false, 0.f);
+    split_view_controller->EndSplitView();
+    EXPECT_FALSE(IsWindowDragInProgress());
+    EXPECT_TRUE(window->transform().IsIdentity());
+    EXPECT_TRUE(window2->transform().IsIdentity());
+  }
 }
 
 // Test that drag from shelf when overview is active is a no-op.
@@ -5205,6 +5250,7 @@
   StartScroll(shelf_widget_bounds.bottom_center());
   UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
   EXPECT_TRUE(IsWindowDragInProgress());
+  EXPECT_FALSE(window->transform().IsIdentityOrTranslation());
   EndScroll(/*is_fling=*/false, 0.f);
 
   shelf->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
@@ -5219,6 +5265,7 @@
   StartScroll(display_bounds.bottom_center());
   UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   EndScroll(/*is_fling=*/false, 0.f);
 
   // The window can be dragged on an auto-hidden shown shelf.
@@ -5227,6 +5274,8 @@
   StartScroll(display_bounds.bottom_center());
   UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
   EXPECT_TRUE(IsWindowDragInProgress());
+  EXPECT_FALSE(window->transform().IsIdentityOrTranslation());
+  EXPECT_TRUE(window->transform().IsScaleOrTranslation());
   EndScroll(/*is_fling=*/false, 0.f);
 
   // The window can't be dragged on a hidden shelf.
@@ -5235,6 +5284,7 @@
   StartScroll(display_bounds.bottom_center());
   UpdateScroll(-shelf_size - hotseat_size - hotseat_padding_size);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   EndScroll(/*is_fling=*/false, 0.f);
 }
 
@@ -5311,6 +5361,7 @@
       GetShelfWidget()->hotseat_widget()->GetWindowBoundsInScreen();
   StartScroll(hotseat_bounds.CenterPoint());
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   EndScroll(/*is_fling=*/false, 0.f);
 }
 
@@ -5331,13 +5382,22 @@
   gfx::Point start = shelf_widget_bounds.bottom_center();
   StartScroll(start);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   // Continues the drag until the hotseat should have been fully dragged up.
   UpdateScroll(-shelf_size);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   UpdateScroll(-hotseat_padding_size);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   UpdateScroll(-hotseat_size);
   EXPECT_TRUE(IsWindowDragInProgress());
+  // The window should not be transformed at the point where the drag starts.
+  EXPECT_TRUE(window->transform().IsIdentity());
+  // The window is expected to be scaled down as the drag progresses.
+  UpdateScroll(-10);
+  EXPECT_FALSE(window->transform().IsIdentityOrTranslation());
+  EXPECT_TRUE(window->transform().IsScaleOrTranslation());
   EndScroll(/*is_fling=*/false, 0.f);
 }
 
@@ -5358,8 +5418,10 @@
       GetShelfWidget()->hotseat_widget()->GetWindowBoundsInScreen();
   StartScroll(hotseat_bounds.CenterPoint());
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   UpdateScroll(hotseat_bounds.height() + hotseat_padding_size);
   EXPECT_FALSE(IsWindowDragInProgress());
+  EXPECT_TRUE(window->transform().IsIdentity());
   EndScroll(/*is_fling=*/false, 0.f);
 }
 
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc
index cf858ff..cc83a13 100644
--- a/ash/shelf/shelf_navigation_widget.cc
+++ b/ash/shelf/shelf_navigation_widget.cc
@@ -21,6 +21,7 @@
 #include "ui/views/animation/bounds_animator.h"
 #include "ui/views/background.h"
 #include "ui/views/view.h"
+#include "ui/wm/core/coordinate_conversion.h"
 
 namespace ash {
 namespace {
@@ -267,7 +268,15 @@
 }
 
 void ShelfNavigationWidget::OnGestureEvent(ui::GestureEvent* event) {
-  if (shelf_->ProcessGestureEvent(*event)) {
+  // Shelf::ProcessGestureEvent expects an event whose location is in screen
+  // coordinates - create a copy of the event with the location in screen
+  // coordinate system.
+  ui::GestureEvent copy_event(*event);
+  gfx::Point location_in_screen(copy_event.location());
+  wm::ConvertPointToScreen(GetNativeWindow(), &location_in_screen);
+  copy_event.set_location(location_in_screen);
+
+  if (shelf_->ProcessGestureEvent(copy_event)) {
     event->StopPropagation();
     return;
   }
diff --git a/ash/system/accessibility/accessibility_feature_disable_dialog.cc b/ash/system/accessibility/accessibility_feature_disable_dialog.cc
index 0b937c1..38e0e298 100644
--- a/ash/system/accessibility/accessibility_feature_disable_dialog.cc
+++ b/ash/system/accessibility/accessibility_feature_disable_dialog.cc
@@ -54,7 +54,7 @@
 
   views::Widget* widget = CreateDialogWidget(
       this, nullptr,
-      Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), container_id));
+      Shell::GetContainer(Shell::GetPrimaryRootWindow(), container_id));
   widget->Show();
 }
 
diff --git a/ash/system/accessibility/accessibility_feature_pod_controller.cc b/ash/system/accessibility/accessibility_feature_pod_controller.cc
index 6dc56c5..2d71eb00 100644
--- a/ash/system/accessibility/accessibility_feature_pod_controller.cc
+++ b/ash/system/accessibility/accessibility_feature_pod_controller.cc
@@ -25,7 +25,7 @@
 
 FeaturePodButton* AccessibilityFeaturePodController::CreateButton() {
   auto* button = new FeaturePodButton(this, /*is_togglable=*/false);
-  button->SetID(ash::VIEW_ID_ACCESSIBILITY_TRAY_ITEM);
+  button->SetID(VIEW_ID_ACCESSIBILITY_TRAY_ITEM);
   button->SetLabel(
       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBILITY));
   button->SetVectorIcon(kUnifiedMenuAccessibilityIcon);
diff --git a/ash/system/accessibility/select_to_speak_tray.cc b/ash/system/accessibility/select_to_speak_tray.cc
index f5aa841..5f11b82 100644
--- a/ash/system/accessibility/select_to_speak_tray.cc
+++ b/ash/system/accessibility/select_to_speak_tray.cc
@@ -94,19 +94,19 @@
     return;
   }
 
-  ash::SelectToSpeakState state =
+  SelectToSpeakState state =
       Shell::Get()->accessibility_controller()->GetSelectToSpeakState();
   switch (state) {
-    case ash::SelectToSpeakState::kSelectToSpeakStateInactive:
+    case SelectToSpeakState::kSelectToSpeakStateInactive:
       icon_->SetImage(inactive_image_);
       SetIsActive(false);
       break;
-    case ash::SelectToSpeakState::kSelectToSpeakStateSelecting:
+    case SelectToSpeakState::kSelectToSpeakStateSelecting:
       // Activate the start selection button during selection.
       icon_->SetImage(selecting_image_);
       SetIsActive(true);
       break;
-    case ash::SelectToSpeakState::kSelectToSpeakStateSpeaking:
+    case SelectToSpeakState::kSelectToSpeakStateSpeaking:
       icon_->SetImage(speaking_image_);
       SetIsActive(true);
       break;
diff --git a/ash/system/bluetooth/bluetooth_notification_controller.cc b/ash/system/bluetooth/bluetooth_notification_controller.cc
index a37c4ba..0eb6794 100644
--- a/ash/system/bluetooth/bluetooth_notification_controller.cc
+++ b/ash/system/bluetooth/bluetooth_notification_controller.cc
@@ -298,7 +298,7 @@
 void BluetoothNotificationController::NotifyAdapterDiscoverable() {
   message_center::RichNotificationData optional;
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE,
       kBluetoothDeviceDiscoverableNotificationId, base::string16() /* title */,
       l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERABLE,
@@ -324,7 +324,7 @@
         l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_REJECT)));
   }
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE,
       kBluetoothDevicePairingNotificationId, base::string16() /* title */,
       message, base::string16() /* display source */, GURL(),
@@ -350,7 +350,7 @@
                                         false /* by_user */);
   }
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, GetPairedNotificationId(device),
       base::string16() /* title */,
       l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_PAIRED,
diff --git a/ash/system/message_center/arc/arc_notification_manager.cc b/ash/system/message_center/arc/arc_notification_manager.cc
index c45cb7ed..0937d6a 100644
--- a/ash/system/message_center/arc/arc_notification_manager.cc
+++ b/ash/system/message_center/arc/arc_notification_manager.cc
@@ -575,7 +575,7 @@
 
   NotificationConfigurationPtr configuration = NotificationConfiguration::New();
   configuration->expansion_animation =
-      ash::features::IsNotificationExpansionAnimationEnabled();
+      features::IsNotificationExpansionAnimationEnabled();
 
   notifications_instance->SetNotificationConfiguration(
       std::move(configuration));
diff --git a/ash/system/network/auto_connect_notifier.cc b/ash/system/network/auto_connect_notifier.cc
index 76fe8521..7cebbbb 100644
--- a/ash/system/network/auto_connect_notifier.cc
+++ b/ash/system/network/auto_connect_notifier.cc
@@ -147,7 +147,7 @@
 void AutoConnectNotifier::DisplayNotification(
     const chromeos::NetworkState* network) {
   NET_LOG(EVENT) << "Show AutoConnect Notification for: " << network->name();
-  auto notification = ash::CreateSystemNotification(
+  auto notification = CreateSystemNotification(
       message_center::NotificationType::NOTIFICATION_TYPE_SIMPLE,
       kAutoConnectNotificationId,
       l10n_util::GetStringUTF16(IDS_ASH_NETWORK_AUTOCONNECT_NOTIFICATION_TITLE),
diff --git a/ash/system/network/network_icon.cc b/ash/system/network/network_icon.cc
index df52e62..ca72e270 100644
--- a/ash/system/network/network_icon.cc
+++ b/ash/system/network/network_icon.cc
@@ -448,7 +448,7 @@
 // Public interface
 
 SkColor GetDefaultColorForIconType(IconType icon_type) {
-  const bool light_icon = icon_type == network_icon::ICON_TYPE_TRAY_OOBE;
+  const bool light_icon = icon_type == ICON_TYPE_TRAY_OOBE;
   return AshColorProvider::Get()->GetContentLayerColor(
       AshColorProvider::ContentLayerType::kIconPrimary,
       light_icon ? AshColorProvider::AshColorMode::kLight
diff --git a/ash/system/network/tray_network_state_model.cc b/ash/system/network/tray_network_state_model.cc
index dfeafd7..5eaf2a6c 100644
--- a/ash/system/network/tray_network_state_model.cc
+++ b/ash/system/network/tray_network_state_model.cc
@@ -54,7 +54,7 @@
     : public chromeos::network_config::mojom::CrosNetworkConfigObserver {
  public:
   explicit Impl(TrayNetworkStateModel* model) : model_(model) {
-    ash::GetNetworkConfigService(
+    GetNetworkConfigService(
         remote_cros_network_config_.BindNewPipeAndPassReceiver());
     remote_cros_network_config_->AddObserver(
         cros_network_config_observer_receiver_.BindNewPipeAndPassRemote());
diff --git a/ash/system/night_light/night_light_controller_impl.cc b/ash/system/night_light/night_light_controller_impl.cc
index b0c806cc..06a84fe 100644
--- a/ash/system/night_light/night_light_controller_impl.cc
+++ b/ash/system/night_light/night_light_controller_impl.cc
@@ -569,7 +569,7 @@
 
 bool NightLightControllerImpl::GetAmbientColorEnabled() const {
   const bool ambient_eq_supported =
-      ash::features::IsAllowAmbientEQEnabled() &&
+      features::IsAllowAmbientEQEnabled() &&
       chromeos::PowerManagerClient::Get()->SupportsAmbientColor();
   return ambient_eq_supported && active_user_pref_service_ &&
          active_user_pref_service_->GetBoolean(prefs::kAmbientColorEnabled);
@@ -777,7 +777,7 @@
       l10n_util::GetStringUTF16(IDS_ASH_AUTO_NIGHT_LIGHT_NOTIFY_BUTTON_TEXT)));
 
   std::unique_ptr<message_center::Notification> notification =
-      ash::CreateSystemNotification(
+      CreateSystemNotification(
           message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
           l10n_util::GetStringUTF16(IDS_ASH_AUTO_NIGHT_LIGHT_NOTIFY_TITLE),
           l10n_util::GetStringUTF16(IDS_ASH_AUTO_NIGHT_LIGHT_NOTIFY_BODY),
diff --git a/ash/system/palette/common_palette_tool.h b/ash/system/palette/common_palette_tool.h
index 1cbbb196..83d3627 100644
--- a/ash/system/palette/common_palette_tool.h
+++ b/ash/system/palette/common_palette_tool.h
@@ -19,7 +19,7 @@
 class HoverHighlightView;
 
 // A PaletteTool implementation with a standard view support.
-class CommonPaletteTool : public PaletteTool, public ash::ViewClickListener {
+class CommonPaletteTool : public PaletteTool, public ViewClickListener {
  protected:
   explicit CommonPaletteTool(Delegate* delegate);
   ~CommonPaletteTool() override;
diff --git a/ash/system/palette/palette_tool_manager.h b/ash/system/palette/palette_tool_manager.h
index c60b006..939685f5 100644
--- a/ash/system/palette/palette_tool_manager.h
+++ b/ash/system/palette/palette_tool_manager.h
@@ -107,7 +107,7 @@
   void HidePalette() override;
   void HidePaletteImmediately() override;
   aura::Window* GetWindow() override;
-  void RecordPaletteOptionsUsage(ash::PaletteTrayOptions option,
+  void RecordPaletteOptionsUsage(PaletteTrayOptions option,
                                  PaletteInvocationMethod method) override;
   void RecordPaletteModeCancellation(PaletteModeCancelType type) override;
 
diff --git a/ash/system/power/backlights_forced_off_setter_unittest.cc b/ash/system/power/backlights_forced_off_setter_unittest.cc
index 9bcc7d0..a0028ef 100644
--- a/ash/system/power/backlights_forced_off_setter_unittest.cc
+++ b/ash/system/power/backlights_forced_off_setter_unittest.cc
@@ -236,7 +236,7 @@
 
   // Initialize the transforms and the DeviceDataManager.
   display::test::TouchTransformControllerTestApi(
-      ash::Shell::Get()->touch_transformer_controller())
+      Shell::Get()->touch_transformer_controller())
       .touch_transform_setter()
       ->ConfigureTouchDevices(transforms);
 
@@ -275,7 +275,7 @@
 
   // Initialize the transforms and the DeviceDataManager.
   display::test::TouchTransformControllerTestApi(
-      ash::Shell::Get()->touch_transformer_controller())
+      Shell::Get()->touch_transformer_controller())
       .touch_transform_setter()
       ->ConfigureTouchDevices(transforms);
 
diff --git a/ash/system/power/dual_role_notification.cc b/ash/system/power/dual_role_notification.cc
index 9e2e9cfc..57be7d40d 100644
--- a/ash/system/power/dual_role_notification.cc
+++ b/ash/system/power/dual_role_notification.cc
@@ -131,7 +131,7 @@
             Shell::Get()->system_tray_model()->client()->ShowPowerSettings();
           }));
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kDualRoleNotificationId, title,
       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DUAL_ROLE_MESSAGE),
       base::string16(), GURL(),
diff --git a/ash/system/power/power_notification_controller.cc b/ash/system/power/power_notification_controller.cc
index 0146875..34382ebc 100644
--- a/ash/system/power/power_notification_controller.cc
+++ b/ash/system/power/power_notification_controller.cc
@@ -96,7 +96,7 @@
 
   // Factory testing may place the battery into unusual states.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          ash::switches::kAshHideNotificationsForFactory)) {
+          switches::kAshHideNotificationsForFactory)) {
     return;
   }
 
@@ -131,7 +131,7 @@
 
   // Check if the notification needs to be created.
   if (show && !usb_charger_was_connected_ && !usb_notification_dismissed_) {
-    std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+    std::unique_ptr<Notification> notification = CreateSystemNotification(
         message_center::NOTIFICATION_TYPE_SIMPLE, kUsbNotificationId,
         l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_LOW_POWER_CHARGER_TITLE),
         ui::SubstituteChromeOSDeviceType(
diff --git a/ash/system/screen_layout_observer.cc b/ash/system/screen_layout_observer.cc
index 2183674..bd0e4cb 100644
--- a/ash/system/screen_layout_observer.cc
+++ b/ash/system/screen_layout_observer.cc
@@ -386,7 +386,7 @@
     return;
   }
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, message,
       additional_message,
       base::string16(),  // display_source
@@ -411,7 +411,7 @@
   UpdateDisplayInfo(&old_info);
 
   const bool current_has_unassociated_display =
-      ash::Shell::Get()->display_manager()->HasUnassociatedDisplay();
+      Shell::Get()->display_manager()->HasUnassociatedDisplay();
 
   // Take |has_unassociated_display_| into consideration in order to avoid
   // showing the notification too frequently. For example, user connects three
diff --git a/ash/system/screen_security/screen_security_notification_controller.cc b/ash/system/screen_security/screen_security_notification_controller.cc
index 51e590e..f29be4a 100644
--- a/ash/system/screen_security/screen_security_notification_controller.cc
+++ b/ash/system/screen_security/screen_security_notification_controller.cc
@@ -80,7 +80,7 @@
               },
               weak_ptr_factory_.GetWeakPtr(), is_capture));
 
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE,
       is_capture ? kScreenCaptureNotificationId : kScreenShareNotificationId,
       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SCREEN_SHARE_TITLE),
diff --git a/ash/system/session/session_limit_notification_controller.cc b/ash/system/session/session_limit_notification_controller.cc
index 5c3b833e..d55088f 100644
--- a/ash/system/session/session_limit_notification_controller.cc
+++ b/ash/system/session/session_limit_notification_controller.cc
@@ -87,7 +87,7 @@
   data.should_make_spoken_feedback_for_popup_updates =
       (model_->limit_state() != last_limit_state_);
   std::unique_ptr<message_center::Notification> notification =
-      ash::CreateSystemNotification(
+      CreateSystemNotification(
           message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
           ComposeNotificationTitle(),
           l10n_util::GetStringUTF16(
diff --git a/ash/system/supervised/supervised_notification_controller.cc b/ash/system/supervised/supervised_notification_controller.cc
index 3854185f..d10d546 100644
--- a/ash/system/supervised/supervised_notification_controller.cc
+++ b/ash/system/supervised/supervised_notification_controller.cc
@@ -76,7 +76,7 @@
     return;
 
   // Regular supervised user.
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SUPERVISED_LABEL),
       GetSupervisedUserMessage(), base::string16() /* display_source */, GURL(),
diff --git a/ash/system/time/time_tray_item_view.cc b/ash/system/time/time_tray_item_view.cc
index 24800637..0872b832 100644
--- a/ash/system/time/time_tray_item_view.cc
+++ b/ash/system/time/time_tray_item_view.cc
@@ -16,22 +16,20 @@
 
 TimeTrayItemView::TimeTrayItemView(Shelf* shelf)
     : TrayItemView(shelf), session_observer_(this) {
-  tray::TimeView::ClockLayout clock_layout =
-      shelf->IsHorizontalAlignment()
-          ? tray::TimeView::ClockLayout::HORIZONTAL_CLOCK
-          : tray::TimeView::ClockLayout::VERTICAL_CLOCK;
-  time_view_ = new tray::TimeView(clock_layout,
-                                  Shell::Get()->system_tray_model()->clock());
+  TimeView::ClockLayout clock_layout =
+      shelf->IsHorizontalAlignment() ? TimeView::ClockLayout::HORIZONTAL_CLOCK
+                                     : TimeView::ClockLayout::VERTICAL_CLOCK;
+  time_view_ =
+      new TimeView(clock_layout, Shell::Get()->system_tray_model()->clock());
   AddChildView(time_view_);
 }
 
 TimeTrayItemView::~TimeTrayItemView() = default;
 
 void TimeTrayItemView::UpdateAlignmentForShelf(Shelf* shelf) {
-  tray::TimeView::ClockLayout clock_layout =
-      shelf->IsHorizontalAlignment()
-          ? tray::TimeView::ClockLayout::HORIZONTAL_CLOCK
-          : tray::TimeView::ClockLayout::VERTICAL_CLOCK;
+  TimeView::ClockLayout clock_layout =
+      shelf->IsHorizontalAlignment() ? TimeView::ClockLayout::HORIZONTAL_CLOCK
+                                     : TimeView::ClockLayout::VERTICAL_CLOCK;
   time_view_->UpdateClockLayout(clock_layout);
 }
 
diff --git a/ash/system/time/time_tray_item_view.h b/ash/system/time/time_tray_item_view.h
index 53a1b9e..e9f9aac 100644
--- a/ash/system/time/time_tray_item_view.h
+++ b/ash/system/time/time_tray_item_view.h
@@ -23,7 +23,7 @@
   ~TimeTrayItemView() override;
 
   void UpdateAlignmentForShelf(Shelf* shelf);
-  tray::TimeView* time_view() { return time_view_; }
+  TimeView* time_view() { return time_view_; }
 
   // SessionObserver:
   void OnSessionStateChanged(session_manager::SessionState state) override;
diff --git a/ash/system/tracing_notification_controller.cc b/ash/system/tracing_notification_controller.cc
index c66b342..c67e2e76 100644
--- a/ash/system/tracing_notification_controller.cc
+++ b/ash/system/tracing_notification_controller.cc
@@ -59,7 +59,7 @@
 }
 
 void TracingNotificationController::CreateNotification() {
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
       l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_TRACING_NOTIFICATION_TITLE),
       l10n_util::GetStringUTF16(
diff --git a/ash/system/unified/top_shortcuts_view.cc b/ash/system/unified/top_shortcuts_view.cc
index 87e7eb1..e49c89c 100644
--- a/ash/system/unified/top_shortcuts_view.cc
+++ b/ash/system/unified/top_shortcuts_view.cc
@@ -162,7 +162,7 @@
   container_ = new TopShortcutButtonContainer();
   AddChildView(container_);
 
-  ash::Shell* shell = Shell::Get();
+  Shell* shell = Shell::Get();
 
   bool is_on_login_screen =
       shell->session_controller()->login_status() == LoginStatus::NOT_LOGGED_IN;
diff --git a/ash/system/unified/unified_system_tray_bubble.h b/ash/system/unified/unified_system_tray_bubble.h
index 582b25c..eed509e 100644
--- a/ash/system/unified/unified_system_tray_bubble.h
+++ b/ash/system/unified/unified_system_tray_bubble.h
@@ -35,7 +35,7 @@
 // case, this class calls UnifiedSystemTray::CloseBubble() to delete itself.
 class ASH_EXPORT UnifiedSystemTrayBubble
     : public TrayBubbleBase,
-      public ash::ScreenLayoutObserver,
+      public ScreenLayoutObserver,
       public views::WidgetObserver,
       public ShelfObserver,
       public ::wm::ActivationChangeObserver,
diff --git a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc
index 753bd4c9..a943651 100644
--- a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc
+++ b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc
@@ -37,7 +37,7 @@
   // AshTestBase
   void SetUp() override {
     AshTestBase::SetUp();
-    tray_test_api_ = ash::SystemTrayTestApi::Create();
+    tray_test_api_ = SystemTrayTestApi::Create();
     tray_test_api_->DisableAnimations();
   }
 
diff --git a/ash/system/update/update_notification_controller.cc b/ash/system/update/update_notification_controller.cc
index 8e0a21ab..a540ed3 100644
--- a/ash/system/update/update_notification_controller.cc
+++ b/ash/system/update/update_notification_controller.cc
@@ -53,7 +53,7 @@
        model_->notification_style() == NotificationStyle::kAdminRequired)
           ? message_center::SystemNotificationWarningLevel::WARNING
           : message_center::SystemNotificationWarningLevel::NORMAL;
-  std::unique_ptr<Notification> notification = ash::CreateSystemNotification(
+  std::unique_ptr<Notification> notification = CreateSystemNotification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId,
       GetNotificationTitle(), GetNotificationMessage(),
       base::string16() /* display_source */, GURL(),
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index b42f9c1a..f97ffda9 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -1452,7 +1452,7 @@
 int OverviewGrid::CalculateWidthAndMaybeSetUnclippedBounds(OverviewItem* item,
                                                            int height) {
   const gfx::Size item_size(0, height);
-  gfx::RectF target_bounds = item->GetTargetBoundsInScreen();
+  gfx::SizeF target_size = item->GetTargetBoundsInScreen().size();
   float scale = item->GetItemScale(item_size);
   ScopedOverviewTransformWindow::GridWindowFillMode grid_fill_mode =
       item->GetWindowDimensionsType();
@@ -1466,27 +1466,35 @@
         overview_session_->window_drag_controller()
             ? overview_session_->window_drag_controller()->item()
             : nullptr;
-    if (grid_dragged_item) {
+    if (grid_dragged_item)
       dragged_window = grid_dragged_item->GetWindow();
-      grid_fill_mode = grid_dragged_item->GetWindowDimensionsType();
-    } else if (dragged_window_) {
+    else if (dragged_window_)
       dragged_window = dragged_window_;
-      grid_fill_mode = ScopedOverviewTransformWindow::GetWindowDimensionsType(
-          dragged_window);
-    }
-
     if (dragged_window && dragged_window->parent()) {
-      target_bounds = ::ash::GetTargetBoundsInScreen(dragged_window);
+      const gfx::Size work_area_size =
+          screen_util::GetDisplayWorkAreaBoundsInScreenForActiveDeskContainer(
+              root_window_)
+              .size();
+      gfx::Size dragged_window_size = dragged_window->bounds().size();
+      // If the drag started from a different root window, |dragged_window| may
+      // not fit into the work area of |root_window_|. Then if |dragged_window|
+      // is dropped into this grid, |dragged_window| will shrink to fit into
+      // this work area. The drop target shall reflect that.
+      dragged_window_size.SetToMin(work_area_size);
+      grid_fill_mode = ScopedOverviewTransformWindow::GetWindowDimensionsType(
+          dragged_window_size);
+      target_size = ::ash::GetTargetBoundsInScreen(dragged_window).size();
+      target_size.SetToMin(gfx::SizeF(work_area_size));
       const gfx::SizeF inset_size(0, height - 2 * kWindowMargin);
       scale = ScopedOverviewTransformWindow::GetItemScale(
-          target_bounds.size(), inset_size,
+          target_size, inset_size,
           dragged_window->GetProperty(aura::client::kTopViewInset),
           kHeaderHeightDp);
     }
   }
 
   int width = std::max(
-      1, gfx::ToFlooredInt(target_bounds.width() * scale) + 2 * kWindowMargin);
+      1, gfx::ToFlooredInt(target_size.width() * scale) + 2 * kWindowMargin);
   switch (grid_fill_mode) {
     case ScopedOverviewTransformWindow::GridWindowFillMode::kLetterBoxed:
       width = kExtremeWindowRatioThreshold * height;
@@ -1510,8 +1518,8 @@
   // Perform horizontal clipping if the window's aspect ratio is wider than the
   // split view bounds aspect ratio, and vertical clipping otherwise.
   const float aspect_ratio =
-      target_bounds.width() /
-      (target_bounds.height() -
+      target_size.width() /
+      (target_size.height() -
        item->GetWindow()->GetProperty(aura::client::kTopViewInset));
   const float target_aspect_ratio =
       split_view_bounds->width() / split_view_bounds->height();
@@ -1537,7 +1545,7 @@
     // aspect ratio of |target_bounds|. Clipping takes the overview header into
     // account, so add that back in.
     const int unclipped_height =
-        width * target_bounds.height() / target_bounds.width();
+        width * target_size.height() / target_size.width();
     unclipped_size.set_width(width);
     unclipped_size.set_height(unclipped_height + kHeaderHeightDp);
 
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index c132436..954de5a 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -6167,6 +6167,65 @@
   EXPECT_EQ(display_with_root2.work_area(), grid_on_root2->bounds());
 }
 
+// Verify that the drop target in each overview grid has bounds representing
+// anticipation that if the dragged window is dropped into that grid, it will
+// shrink to fit into the corresponding work area.
+TEST_P(SplitViewOverviewSessionInClamshellTestMultiDisplayOnly,
+       DropTargetBoundsOnDisplayWhereDraggedWindowDoesNotFitIntoWorkArea) {
+  UpdateDisplay("600x600,1200x1200");
+  // Drags |item| from the right display to the left display and back, and
+  // returns the bounds of the drop target that appears on the left display.
+  const auto root1_drop_target_bounds = [this](OverviewItem* item) {
+    wm::CursorManager* cursor_manager = Shell::Get()->cursor_manager();
+    const gfx::PointF drag_starting_point = item->target_bounds().CenterPoint();
+    cursor_manager->SetDisplay(display_manager()->GetSecondaryDisplay());
+    overview_session()->InitiateDrag(item, drag_starting_point,
+                                     /*is_touch_dragging=*/false);
+    cursor_manager->SetDisplay(
+        display::Screen::GetScreen()->GetPrimaryDisplay());
+    overview_session()->Drag(item, gfx::PointF(300.f, 0.f));
+    cursor_manager->SetDisplay(display_manager()->GetSecondaryDisplay());
+    overview_session()->Drag(item, drag_starting_point);
+    DCHECK(GetDropTarget(0));
+    const gfx::RectF result = GetDropTarget(0)->target_bounds();
+    overview_session()->CompleteDrag(item, drag_starting_point);
+    return result;
+  };
+
+  // |window1| has the size that |window2| would become if moved to the left
+  // display.
+  std::unique_ptr<aura::Window> window1 =
+      CreateTestWindow(gfx::Rect(600, 0, 600, 400));
+  std::unique_ptr<aura::Window> window2 =
+      CreateTestWindow(gfx::Rect(600, 0, 1000, 400));
+  // |window3| has the size that |window4| would become if moved to the left
+  // display.
+  std::unique_ptr<aura::Window> window3 = CreateTestWindow(
+      gfx::Rect(600, 0, 400, 600 - ShelfConfig::Get()->shelf_size()));
+  std::unique_ptr<aura::Window> window4 =
+      CreateTestWindow(gfx::Rect(600, 0, 400, 1000));
+
+  ToggleOverview();
+  OverviewItem* item1 = GetOverviewItemForWindow(window1.get());
+  OverviewItem* item2 = GetOverviewItemForWindow(window2.get());
+  OverviewItem* item3 = GetOverviewItemForWindow(window3.get());
+  OverviewItem* item4 = GetOverviewItemForWindow(window4.get());
+
+  // For good test coverage in each case, the dragged window and the drop target
+  // have different |ScopedOverviewTransformWindow::GridWindowFillMode| values.
+  EXPECT_EQ(ScopedOverviewTransformWindow::GridWindowFillMode::kNormal,
+            item1->GetWindowDimensionsType());
+  EXPECT_EQ(ScopedOverviewTransformWindow::GridWindowFillMode::kLetterBoxed,
+            item2->GetWindowDimensionsType());
+  EXPECT_EQ(ScopedOverviewTransformWindow::GridWindowFillMode::kNormal,
+            item3->GetWindowDimensionsType());
+  EXPECT_EQ(ScopedOverviewTransformWindow::GridWindowFillMode::kPillarBoxed,
+            item4->GetWindowDimensionsType());
+
+  EXPECT_EQ(root1_drop_target_bounds(item1), root1_drop_target_bounds(item2));
+  EXPECT_EQ(root1_drop_target_bounds(item3), root1_drop_target_bounds(item4));
+}
+
 // Verify that |SplitViewController::CanSnapWindow| checks that the minimum size
 // of the window fits into the left or top, with the default divider position.
 // (If the work area length is odd, then the right or bottom will be one pixel
diff --git a/ash/wm/overview/scoped_overview_transform_window.cc b/ash/wm/overview/scoped_overview_transform_window.cc
index c5e316c..21cc64e 100644
--- a/ash/wm/overview/scoped_overview_transform_window.cc
+++ b/ash/wm/overview/scoped_overview_transform_window.cc
@@ -92,7 +92,7 @@
       original_opacity_(window->layer()->GetTargetOpacity()),
       original_mask_layer_(window_->layer()->layer_mask_layer()),
       original_clip_rect_(window_->layer()->clip_rect()) {
-  type_ = GetWindowDimensionsType(window);
+  type_ = GetWindowDimensionsType(window->bounds().size());
 
   std::vector<aura::Window*> transient_children_to_hide;
   for (auto* transient : GetTransientTreeIterator(window)) {
@@ -169,8 +169,7 @@
 
 // static
 ScopedOverviewTransformWindow::GridWindowFillMode
-ScopedOverviewTransformWindow::GetWindowDimensionsType(aura::Window* window) {
-  const gfx::Size size = window->bounds().size();
+ScopedOverviewTransformWindow::GetWindowDimensionsType(const gfx::Size& size) {
   if (size.width() > size.height() * kExtremeWindowRatioThreshold)
     return ScopedOverviewTransformWindow::GridWindowFillMode::kLetterBoxed;
 
@@ -394,7 +393,7 @@
 }
 
 void ScopedOverviewTransformWindow::UpdateWindowDimensionsType() {
-  type_ = GetWindowDimensionsType(window_);
+  type_ = GetWindowDimensionsType(window_->bounds().size());
 }
 
 void ScopedOverviewTransformWindow::UpdateRoundedCorners(bool show,
diff --git a/ash/wm/overview/scoped_overview_transform_window.h b/ash/wm/overview/scoped_overview_transform_window.h
index 80db559..9070e5755 100644
--- a/ash/wm/overview/scoped_overview_transform_window.h
+++ b/ash/wm/overview/scoped_overview_transform_window.h
@@ -61,7 +61,7 @@
                             int title_height);
 
   static ScopedOverviewTransformWindow::GridWindowFillMode
-  GetWindowDimensionsType(aura::Window* window);
+  GetWindowDimensionsType(const gfx::Size& size);
 
   ScopedOverviewTransformWindow(OverviewItem* overview_item,
                                 aura::Window* window);
diff --git a/ash/wm/splitview/split_view_highlight_view.cc b/ash/wm/splitview/split_view_highlight_view.cc
index cffdaa2..cdb9f39 100644
--- a/ash/wm/splitview/split_view_highlight_view.cc
+++ b/ash/wm/splitview/split_view_highlight_view.cc
@@ -252,10 +252,8 @@
     return;
   }
 
-  // The drag just started, and not in a snap area. If |previews_only|, there is
-  // nothing to do. Else fade in.
-  DCHECK_EQ(SplitViewDragIndicators::WindowDraggingState::kNoDrag,
-            previous_window_dragging_state);
+  // The drag just started or came in from another display, and is not currently
+  // in a snap area. If |previews_only|, there is nothing to do. Else fade in.
   DCHECK_EQ(0.f, layer()->GetTargetOpacity());
   if (!previews_only) {
     DoSplitviewOpacityAnimation(layer(), SPLITVIEW_ANIMATION_HIGHLIGHT_FADE_IN);
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index b5a783ab..1cb75351 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -227,14 +227,17 @@
       os.remove(result_path)
 
     env = os.environ.copy()
-    stderr_filter = None
+    stderr_filter = build_utils.FilterReflectiveAccessJavaWarnings
     if cache_dir:
       env['_JAVA_OPTIONS'] = '-Duser.home=%s' % _RebasePath(cache_dir)
       # When _JAVA_OPTIONS is set, java prints to stderr:
       # Picked up _JAVA_OPTIONS: ...
       #
       # We drop all lines that contain _JAVA_OPTIONS from the output
-      stderr_filter = lambda l: re.sub(r'.*_JAVA_OPTIONS.*\n?', '', l)
+      stderr_filter = lambda l: re.sub(
+          r'.*_JAVA_OPTIONS.*\n?',
+          '',
+          build_utils.FilterReflectiveAccessJavaWarnings(l))
 
     def fail_func(returncode, stderr):
       if returncode != 0:
@@ -245,6 +248,8 @@
       return False
 
     try:
+      env['JAVA_HOME'] = os.path.relpath(build_utils.JAVA_HOME,
+                                         build_utils.DIR_SOURCE_ROOT)
       build_utils.CheckOutput(cmd, cwd=build_utils.DIR_SOURCE_ROOT,
                               env=env or None, stderr_filter=stderr_filter,
                               fail_func=fail_func)
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
index fe81446..74500658 100644
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -32,10 +32,10 @@
         os.path.join(
             os.path.dirname(__file__), os.pardir, os.pardir, os.pardir,
             os.pardir)))
-JAVA_PATH = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'jdk', 'current',
-                         'bin', 'java')
-JAVAC_PATH = JAVA_PATH + 'c'
-JAVAP_PATH = JAVA_PATH + 'p'
+JAVA_HOME = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'jdk', 'current')
+JAVA_PATH = os.path.join(JAVA_HOME, 'bin', 'java')
+JAVAC_PATH = os.path.join(JAVA_HOME, 'bin', 'javac')
+JAVAP_PATH = os.path.join(JAVA_HOME, 'bin', 'javap')
 RT_JAR_PATH = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'jdk', 'extras',
                            'java_8', 'jre', 'lib', 'rt.jar')
 
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 1e30826..75e7144 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -3515,6 +3515,7 @@
         generate_interface_jar(target_name) {
           forward_variables_from(invoker,
                                  [
+                                   "assert_no_deps",
                                    "data",
                                    "data_deps",
                                    "deps",
@@ -3577,6 +3578,7 @@
       group(target_name) {
         forward_variables_from(invoker,
                                [
+                                 "assert_no_deps",
                                  "data",
                                  "deps",
                                  "data_deps",
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 72a325d..ae31efa 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1456,6 +1456,7 @@
     }
 
     group(target_name) {
+      forward_variables_from(invoker, [ "assert_no_deps" ])
       public_deps = [
         ":$_build_config_target_name",
         ":$_java_binary_target_name",
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 3488b15..6ae4be3f 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8892458420925474704
\ No newline at end of file
+8892367722555030832
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index bf0e387..430727f8 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8892526010997090496
\ No newline at end of file
+8892393748914910080
\ No newline at end of file
diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h
index da4d1fdf..b1a0476 100644
--- a/cc/input/input_handler.h
+++ b/cc/input/input_handler.h
@@ -176,12 +176,12 @@
   // a subsequent call to ScrollAnimated can begin on the impl thread.
   virtual ScrollStatus ScrollAnimatedBegin(ScrollState* scroll_state) = 0;
 
-  // Returns SCROLL_ON_IMPL_THREAD if an animation is initiated on the impl
-  // thread. delayed_by is the delay that is taken into account when determining
-  // the duration of the animation.
-  virtual ScrollStatus ScrollAnimated(const gfx::Point& viewport_point,
-                                      const gfx::Vector2dF& scroll_delta,
-                                      base::TimeDelta delayed_by) = 0;
+  // |delayed_by| is the delay that is taken into account when determining
+  // the duration of the animation. TODO(bokan): Should eventually be merged
+  // into ScrollBy. https://crbug.com/1016229.
+  virtual void ScrollAnimated(const gfx::Point& viewport_point,
+                              const gfx::Vector2dF& scroll_delta,
+                              base::TimeDelta delayed_by) = 0;
 
   // Scroll the layer selected by |ScrollBegin| by given |scroll_state| delta.
   // Internally, the delta is transformed to local layer's coordinate space for
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index d011f3b..b49d448 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -4092,26 +4092,20 @@
 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin(
     ScrollState* scroll_state) {
   TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollAnimatedBegin");
+
+  // It's possible we haven't yet cleared the CurrentlyScrollingNode if we
+  // received a GSE but we're still animating the last scroll. If that's the
+  // case, we'll simply un-defer the GSE and continue latching to the same
+  // node.
+  DCHECK(!CurrentlyScrollingNode() || deferred_scroll_end_);
+
   InputHandler::ScrollStatus scroll_status;
   scroll_status.main_thread_scrolling_reasons =
       MainThreadScrollingReason::kNotScrollingOnMain;
   deferred_scroll_end_ = false;
-  ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
-  ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
-  if (scroll_node) {
-    gfx::Vector2dF delta;
 
-    if (ScrollAnimationUpdateTarget(scroll_node, delta, base::TimeDelta())) {
-      scroll_status.thread = SCROLL_ON_IMPL_THREAD;
-    } else {
-      TRACE_EVENT_INSTANT0("cc", "Failed to create animation",
-                           TRACE_EVENT_SCOPE_THREAD);
-      scroll_status.thread = SCROLL_IGNORED;
-      scroll_status.main_thread_scrolling_reasons =
-          MainThreadScrollingReason::kNotScrollable;
-    }
+  if (CurrentlyScrollingNode())
     return scroll_status;
-  }
 
   // ScrollAnimated is used for animated wheel scrolls. We find the first layer
   // that can scroll and set up an animation of its scroll offset. Note that
@@ -4212,21 +4206,21 @@
                         OverscrollBehavior::kOverscrollBehaviorTypeAuto);
 }
 
-InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
-    const gfx::Point& viewport_point,
-    const gfx::Vector2dF& scroll_delta,
-    base::TimeDelta delayed_by) {
+void LayerTreeHostImpl::ScrollAnimated(const gfx::Point& viewport_point,
+                                       const gfx::Vector2dF& scroll_delta,
+                                       base::TimeDelta delayed_by) {
   TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollAnimated");
   InputHandler::ScrollStatus scroll_status;
   scroll_status.main_thread_scrolling_reasons =
       MainThreadScrollingReason::kNotScrollingOnMain;
-  ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
-  ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
+  ScrollNode* scroll_node = CurrentlyScrollingNode();
+
+  DCHECK(scroll_node);
 
   scroll_accumulated_this_frame_ += gfx::ScrollOffset(scroll_delta);
 
-  if (scroll_node && mutator_host_->IsImplOnlyScrollAnimating()) {
-    // Flash the overlay scrollbar even if the scroll dalta is 0.
+  if (mutator_host_->IsImplOnlyScrollAnimating()) {
+    // Flash the overlay scrollbar even if the scroll delta is 0.
     if (settings_.scrollbar_flash_after_any_scroll_update) {
       FlashAllScrollbars(false);
     } else {
@@ -4259,123 +4253,57 @@
       // is fixed.
       NOTREACHED();
     }
-    return scroll_status;
+    return;
   }
 
-  // TODO(bokan): This method currently does both targeting/latching as well
-  // as updating. As such, it's a combination of a gesture Begin and Update.
-  // We'll soon transform it so that this method can assume a scroller is
-  // already latched.  The only decision it needs to make is whether to create
-  // a new animation or update an existing one, however, the scroll_node should
-  // already be latched. However, to avoid changing too much at once, for now
-  // this re-targeting remains here but if we're already latched we'll force
-  // targeting the same node so we don't change the latch mid-stream.
-  // https://crbug.com/1016229.
-  ScrollStateData scroll_state_data;
-  scroll_state_data.position_x = viewport_point.x();
-  scroll_state_data.position_y = viewport_point.y();
-  scroll_state_data.is_beginning = true;
-  scroll_state_data.delta_x_hint = scroll_delta.x();
-  scroll_state_data.delta_y_hint = scroll_delta.y();
-  if (scroll_node) {
-    scroll_state_data.set_current_native_scrolling_element(
-        scroll_node->element_id);
-  }
+  gfx::Vector2dF pending_delta = scroll_delta;
+  bool animation_created = false;
 
-  ScrollState scroll_state(scroll_state_data);
-
-  // ScrollAnimated is used for animated wheel scrolls. We find the first layer
-  // that can scroll and set up an animation of its scroll offset. Note that
-  // this does not currently go through the scroll customization machinery
-  // that ScrollBy uses for non-animated wheel scrolls.
-  scroll_status = ScrollBegin(&scroll_state, WHEEL);
-  scroll_node = scroll_tree.CurrentlyScrollingNode();
-  if (scroll_status.thread == SCROLL_ON_IMPL_THREAD && scroll_node) {
-    gfx::Vector2dF pending_delta = scroll_delta;
-    for (; scroll_tree.parent(scroll_node);
-         scroll_node = scroll_tree.parent(scroll_node)) {
-      if (!scroll_node->scrollable)
-        continue;
-
-      // For the rest of the current scroll sequence, latch to the first node
-      // that scrolled while it still exists.
-      if (scroll_tree.FindNodeFromElementId(
-              scroll_animating_latched_element_id_) &&
-          scroll_node->element_id != scroll_animating_latched_element_id_) {
-        continue;
-      }
-
-      if (viewport().ShouldScroll(*scroll_node)) {
-        // Flash the overlay scrollbar even if the scroll dalta is 0.
-        if (settings_.scrollbar_flash_after_any_scroll_update) {
-          FlashAllScrollbars(false);
-        } else {
-          ScrollbarAnimationController* animation_controller =
-              ScrollbarAnimationControllerForElementId(scroll_node->element_id);
-          if (animation_controller)
-            animation_controller->WillUpdateScroll();
-        }
-      }
-
-      if (scroll_node->scrolls_outer_viewport) {
-        gfx::Vector2dF scrolled =
-            viewport().ScrollAnimated(pending_delta, delayed_by);
-        // Viewport::ScrollAnimated returns pending_delta as long as it starts
-        // an animation.
-        did_scroll_x_for_scroll_gesture_ |= scrolled.x() != 0;
-        did_scroll_y_for_scroll_gesture_ |= scrolled.y() != 0;
-        if (scrolled == pending_delta) {
-          scroll_animating_latched_element_id_ = scroll_node->element_id;
-          TRACE_EVENT_INSTANT0("cc", "Viewport scroll animated",
-                               TRACE_EVENT_SCOPE_THREAD);
-          return scroll_status;
-        }
-        break;
-      }
-
-      gfx::Vector2dF delta = ComputeScrollDelta(*scroll_node, pending_delta);
-      if (ScrollAnimationCreate(scroll_node, delta, delayed_by)) {
-        did_scroll_x_for_scroll_gesture_ |= delta.x() != 0;
-        did_scroll_y_for_scroll_gesture_ |= delta.y() != 0;
-        scroll_animating_latched_element_id_ = scroll_node->element_id;
-        TRACE_EVENT_INSTANT0("cc", "created scroll animation",
-                             TRACE_EVENT_SCOPE_THREAD);
-        // Flash the overlay scrollbar even if the scroll dalta is 0.
-        if (settings_.scrollbar_flash_after_any_scroll_update) {
-          FlashAllScrollbars(false);
-        } else {
-          ScrollbarAnimationController* animation_controller =
-              ScrollbarAnimationControllerForElementId(scroll_node->element_id);
-          if (animation_controller)
-            animation_controller->WillUpdateScroll();
-        }
-        return scroll_status;
-      }
-
-      pending_delta -= delta;
-
-      if (!CanPropagate(scroll_node, pending_delta.x(), pending_delta.y())) {
-        scroll_state.set_is_scroll_chain_cut(true);
-        break;
-      }
+  if (scroll_node->scrolls_outer_viewport) {
+    gfx::Vector2dF scrolled =
+        viewport().ScrollAnimated(pending_delta, delayed_by);
+    // Viewport::ScrollAnimated returns pending_delta as long as it starts
+    // an animation.
+    did_scroll_x_for_scroll_gesture_ |= scrolled.x() != 0;
+    did_scroll_y_for_scroll_gesture_ |= scrolled.y() != 0;
+    if (scrolled == pending_delta) {
+      scroll_animating_latched_element_id_ = scroll_node->element_id;
+      TRACE_EVENT_INSTANT0("cc", "Viewport scroll animated",
+                           TRACE_EVENT_SCOPE_THREAD);
+      animation_created = true;
+    }
+  } else {
+    gfx::Vector2dF delta = ComputeScrollDelta(*scroll_node, pending_delta);
+    if (ScrollAnimationCreate(scroll_node, delta, delayed_by)) {
+      did_scroll_x_for_scroll_gesture_ |= delta.x() != 0;
+      did_scroll_y_for_scroll_gesture_ |= delta.y() != 0;
+      scroll_animating_latched_element_id_ = scroll_node->element_id;
+      TRACE_EVENT_INSTANT0("cc", "created scroll animation",
+                           TRACE_EVENT_SCOPE_THREAD);
+      animation_created = true;
     }
 
+    // TODO(bokan): We do this only for non-viewport nodes because
+    // viewport().ScrollAnimated() will always return the entire delta if it
+    // animates and ComputeScrollDelta doesn't yet work correctly for the
+    // viewport.
+    pending_delta -= delta;
+  }
+
+  if (animation_created) {
+    // Flash the overlay scrollbar even if the scroll delta is 0.
+    if (settings_.scrollbar_flash_after_any_scroll_update) {
+      FlashAllScrollbars(false);
+    } else {
+      ScrollbarAnimationController* animation_controller =
+          ScrollbarAnimationControllerForElementId(scroll_node->element_id);
+      if (animation_controller)
+        animation_controller->WillUpdateScroll();
+    }
+  } else {
     overscroll_delta_for_main_thread_ += pending_delta;
     client_->SetNeedsCommitOnImplThread();
   }
-
-  if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) {
-    // Update scroll_status.thread to SCROLL_IGNORED when there is no ongoing
-    // scroll animation, we can scroll on impl thread and yet, we couldn't
-    // create a new scroll animation. This happens when the scroller has hit its
-    // extent.
-    TRACE_EVENT_INSTANT0("cc", "Ignored - Scroller at extent",
-                         TRACE_EVENT_SCOPE_THREAD);
-    scroll_status.thread = SCROLL_IGNORED;
-    scroll_status.main_thread_scrolling_reasons =
-        MainThreadScrollingReason::kNotScrollable;
-  }
-  return scroll_status;
 }
 
 bool LayerTreeHostImpl::CalculateLocalScrollDeltaAndStartPoint(
@@ -4719,7 +4647,7 @@
   if (!CurrentlyScrollingNode())
     return InputHandlerScrollResult();
 
-  // Flash the overlay scrollbar even if the scroll dalta is 0.
+  // Flash the overlay scrollbar even if the scroll delta is 0.
   if (settings_.scrollbar_flash_after_any_scroll_update) {
     FlashAllScrollbars(false);
   } else {
@@ -4868,7 +4796,7 @@
     return false;
 
   if (viewport().ShouldScroll(*scroll_node)) {
-    // Flash the overlay scrollbar even if the scroll dalta is 0.
+    // Flash the overlay scrollbar even if the scroll delta is 0.
     if (settings_.scrollbar_flash_after_any_scroll_update) {
       FlashAllScrollbars(false);
     } else {
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 9f7f8ae6..c8ed6ab 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -267,10 +267,9 @@
       ScrollState* scroll_state,
       InputHandler::ScrollInputType type) override;
   ScrollStatus ScrollAnimatedBegin(ScrollState* scroll_state) override;
-  InputHandler::ScrollStatus ScrollAnimated(
-      const gfx::Point& viewport_point,
-      const gfx::Vector2dF& scroll_delta,
-      base::TimeDelta delayed_by = base::TimeDelta()) override;
+  void ScrollAnimated(const gfx::Point& viewport_point,
+                      const gfx::Vector2dF& scroll_delta,
+                      base::TimeDelta delayed_by = base::TimeDelta()) override;
   InputHandlerScrollResult ScrollBy(ScrollState* scroll_state) override;
   void RequestUpdateForSynchronousInputHandler() override;
   void SetSynchronousInputHandlerRootScrollOffset(
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 21ce721..c6edb09 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1658,8 +1658,11 @@
   gfx::Point pointer_position(10, 10);
   gfx::Vector2dF delta(20, 20);
 
-  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
-            host_impl_->ScrollAnimated(pointer_position, delta).thread);
+  EXPECT_EQ(
+      InputHandler::SCROLL_ON_IMPL_THREAD,
+      host_impl_->ScrollAnimatedBegin(BeginState(pointer_position, delta).get())
+          .thread);
+  host_impl_->ScrollAnimated(pointer_position, delta);
   host_impl_->ScrollEnd();
 
   EXPECT_EQ(overflow->scroll_tree_index(),
@@ -6609,9 +6612,12 @@
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, -100)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(0, -100)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, -100));
 
   begin_frame_args.frame_time = start_time;
   begin_frame_args.frame_id.sequence_number++;
@@ -6634,12 +6640,8 @@
   EXPECT_EQ(gfx::ScrollOffset(0, 50), child_layer->CurrentScrollOffset());
   host_impl_->DidFinishImplFrame();
 
-  // Second ScrollAnimated should still latch to the grand_child_layer. Since it
-  // is already at its extent and no scrolling happens, the scroll result must
-  // be ignored.
-  EXPECT_EQ(
-      InputHandler::SCROLL_IGNORED,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, -100)).thread);
+  // Second ScrollAnimated should remain latched to the grand_child_layer.
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, -100));
 
   begin_frame_args.frame_time =
       start_time + base::TimeDelta::FromMilliseconds(250);
@@ -10989,9 +10991,12 @@
         new SimpleSwapPromiseMonitor(nullptr, host_impl_.get(),
                                      &set_needs_commit_count,
                                      &set_needs_redraw_count));
-    EXPECT_EQ(
-        InputHandler::SCROLL_ON_IMPL_THREAD,
-        host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+    EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+              host_impl_
+                  ->ScrollAnimatedBegin(
+                      BeginState(gfx::Point(), gfx::Vector2d(0, 50)).get())
+                  .thread);
+    host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
 
     EXPECT_EQ(0, set_needs_commit_count);
     EXPECT_EQ(1, set_needs_redraw_count);
@@ -11030,9 +11035,7 @@
                                      &set_needs_commit_count,
                                      &set_needs_redraw_count));
     // Update target.
-    EXPECT_EQ(
-        InputHandler::SCROLL_ON_IMPL_THREAD,
-        host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+    host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
     host_impl_->ScrollEnd();
 
     EXPECT_EQ(0, set_needs_commit_count);
@@ -11067,6 +11070,101 @@
   host_impl_->DidFinishImplFrame();
 }
 
+// Tests latching behavior, in particular when a ScrollEnd is received but a
+// new ScrollBegin is received before the animation from the previous gesture
+// stream is finished.
+TEST_F(LayerTreeHostImplTest, ScrollAnimatedLatching) {
+  const gfx::Size content_size(1000, 1000);
+  const gfx::Size viewport_size(50, 100);
+  SetupViewportLayersOuterScrolls(viewport_size, content_size);
+
+  AddScrollableLayer(OuterViewportScrollLayer(), gfx::Size(10, 10),
+                     gfx::Size(20, 20));
+
+  LayerImpl* outer_scroll = OuterViewportScrollLayer();
+
+  DrawFrame();
+
+  viz::BeginFrameArgs begin_frame_args =
+      viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
+
+  // Start an animated scroll over the outer viewport.
+  {
+    gfx::Point position(40, 40);
+    auto begin_state = BeginState(position, gfx::Vector2d(0, 50));
+    host_impl_->ScrollAnimatedBegin(begin_state.get());
+    host_impl_->ScrollAnimated(position, gfx::Vector2d(0, 50));
+    EXPECT_EQ(outer_scroll->scroll_tree_index(),
+              host_impl_->CurrentlyScrollingNode()->id);
+
+    base::TimeTicks start_time =
+        base::TimeTicks() + base::TimeDelta::FromMilliseconds(100);
+    begin_frame_args.frame_time = start_time;
+    begin_frame_args.frame_id.sequence_number++;
+    host_impl_->WillBeginImplFrame(begin_frame_args);
+    host_impl_->Animate();
+    host_impl_->UpdateAnimationState(true);
+    host_impl_->DidFinishImplFrame();
+
+    EXPECT_NE(gfx::ScrollOffset(), outer_scroll->CurrentScrollOffset());
+    EXPECT_TRUE(GetImplAnimationHost()->IsImplOnlyScrollAnimating());
+  }
+
+  // End the scroll gesture. We should still be latched to the scroll layer
+  // since the animation is still in progress.
+  {
+    host_impl_->ScrollEnd();
+    EXPECT_TRUE(GetImplAnimationHost()->IsImplOnlyScrollAnimating());
+    EXPECT_EQ(outer_scroll->scroll_tree_index(),
+              host_impl_->CurrentlyScrollingNode()->id);
+
+    begin_frame_args.frame_time += base::TimeDelta::FromMilliseconds(5);
+    begin_frame_args.frame_id.sequence_number++;
+    host_impl_->WillBeginImplFrame(begin_frame_args);
+    host_impl_->Animate();
+    host_impl_->UpdateAnimationState(true);
+    host_impl_->DidFinishImplFrame();
+
+    EXPECT_TRUE(GetImplAnimationHost()->IsImplOnlyScrollAnimating());
+    EXPECT_EQ(outer_scroll->scroll_tree_index(),
+              host_impl_->CurrentlyScrollingNode()->id);
+  }
+
+  // Start a new animated scroll. We should remain latched to the outer
+  // viewport, despite the fact this scroll began over the child scroller,
+  // because we don't clear the latch until the animation is finished.
+  {
+    gfx::Point position(10, 10);
+    auto begin_state = BeginState(position, gfx::Vector2d(0, 50));
+    host_impl_->ScrollAnimatedBegin(begin_state.get());
+    EXPECT_EQ(outer_scroll->scroll_tree_index(),
+              host_impl_->CurrentlyScrollingNode()->id);
+  }
+
+  // Run the animation to the end. Because we received a ScrollBegin, the
+  // deferred ScrollEnd from the first gesture should have been cleared. That
+  // is, we shouldn't clear the latch when the animation ends because we're
+  // currently in an active scroll gesture.
+  {
+    begin_frame_args.frame_time += base::TimeDelta::FromMilliseconds(200);
+    begin_frame_args.frame_id.sequence_number++;
+    host_impl_->WillBeginImplFrame(begin_frame_args);
+    host_impl_->Animate();
+    host_impl_->UpdateAnimationState(true);
+    host_impl_->DidFinishImplFrame();
+
+    EXPECT_FALSE(GetImplAnimationHost()->IsImplOnlyScrollAnimating());
+    EXPECT_EQ(outer_scroll->scroll_tree_index(),
+              host_impl_->CurrentlyScrollingNode()->id);
+  }
+
+  // A ScrollEnd should now clear the latch.
+  {
+    host_impl_->ScrollEnd();
+    EXPECT_FALSE(host_impl_->CurrentlyScrollingNode());
+  }
+}
+
 // Test to ensure that animated scrolls correctly account for the page scale
 // factor. That is, if you zoom into the page, a wheel scroll should scroll the
 // content *less* than before so that it appears to move the same distance when
@@ -11094,12 +11192,12 @@
   {
     EXPECT_EQ(
         InputHandler::SCROLL_ON_IMPL_THREAD,
-        host_impl_->ScrollAnimated(gfx::Point(10, 10), gfx::Vector2d(0, 10))
+        host_impl_
+            ->ScrollAnimatedBegin(
+                BeginState(gfx::Point(10, 10), gfx::Vector2d(0, 10)).get())
             .thread);
-    EXPECT_EQ(
-        InputHandler::SCROLL_ON_IMPL_THREAD,
-        host_impl_->ScrollAnimated(gfx::Point(10, 10), gfx::Vector2d(0, 20))
-            .thread);
+    host_impl_->ScrollAnimated(gfx::Point(10, 10), gfx::Vector2d(0, 10));
+    host_impl_->ScrollAnimated(gfx::Point(10, 10), gfx::Vector2d(0, 20));
 
     // Scrolling the inner viewport happens through the Viewport class which
     // uses the outer viewport to represent "latched to the viewport".
@@ -11266,15 +11364,16 @@
   host_impl_->UpdateAnimationState(true);
   host_impl_->DidFinishImplFrame();
 
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(0, 50)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
   // This will call ScrollOffsetAnimationCurve::UpdateTarget while the animation
   // created above is in state ANIMATION::WAITING_FOR_TARGET_AVAILABILITY and
   // doesn't have a start time.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100));
 
   begin_frame_args.frame_time =
       start_time + base::TimeDelta::FromMilliseconds(250);
@@ -11316,9 +11415,11 @@
   // Create animation with a 100ms delay.
   EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
             host_impl_
-                ->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100),
-                                 base::TimeDelta::FromMilliseconds(100))
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(0, 100)).get())
                 .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100),
+                             base::TimeDelta::FromMilliseconds(100));
 
   LayerImpl* scrolling_layer = OuterViewportScrollLayer();
   EXPECT_EQ(scrolling_layer->scroll_tree_index(),
@@ -11345,11 +11446,8 @@
   host_impl_->DidFinishImplFrame();
 
   // Update target.
-  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
-            host_impl_
-                ->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100),
-                                 base::TimeDelta::FromMilliseconds(150))
-                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 100),
+                             base::TimeDelta::FromMilliseconds(150));
 
   // Third tick after 100ms, should be at the target position since update
   // target was called with a large value of jank.
@@ -11377,9 +11475,12 @@
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
   // Perform animated scroll.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(0, 50)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
 
   LayerImpl* scrolling_layer = OuterViewportScrollLayer();
   EXPECT_EQ(scrolling_layer->scroll_tree_index(),
@@ -11446,9 +11547,12 @@
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(0, 50)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
 
   LayerImpl* scrolling_layer = OuterViewportScrollLayer();
   EXPECT_EQ(scrolling_layer->scroll_tree_index(),
@@ -11474,9 +11578,7 @@
   EXPECT_TRUE(y > 1 && y < 49);
 
   // Update target.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(0, 50));
   host_impl_->ScrollEnd();
   host_impl_->DidFinishImplFrame();
 
@@ -11531,9 +11633,12 @@
       base::TimeTicks() + base::TimeDelta::FromMilliseconds(250);
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(10, 20)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(10, 20)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(10, 20));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   EXPECT_EQ(outer_scroll_layer->scroll_tree_index(),
@@ -11549,9 +11654,7 @@
 
   // Scroll by the inner viewport's max scroll extent, the remainder
   // should bubble up to the outer viewport.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(100, 100)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(100, 100));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   EXPECT_EQ(outer_scroll_layer->scroll_tree_index(),
@@ -11567,9 +11670,7 @@
 
   // Scroll by the outer viewport's max scroll extent, it should all go to the
   // outer viewport.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(190, 180)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(190, 180));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   EXPECT_EQ(outer_scroll_layer->scroll_tree_index(),
@@ -11585,9 +11686,7 @@
 
   // Scroll upwards by the max scroll extent. The inner viewport should animate
   // and the remainder should bubble to the outer viewport.
-  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
-            host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(-110, -120))
-                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(-110, -120));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   EXPECT_EQ(outer_scroll_layer->scroll_tree_index(),
@@ -11624,9 +11723,12 @@
       base::TimeTicks() + base::TimeDelta::FromMilliseconds(50);
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(90, 90)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(90, 90)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(90, 90));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   // When either the inner or outer node is being scrolled, the outer node is
@@ -11644,9 +11746,7 @@
                    outer_scroll_layer->CurrentScrollOffset());
 
   // Update target.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50));
   host_impl_->Animate();
   host_impl_->UpdateAnimationState(true);
   EXPECT_EQ(outer_scroll_layer->scroll_tree_index(),
@@ -11683,9 +11783,12 @@
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50)).thread);
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_
+                ->ScrollAnimatedBegin(
+                    BeginState(gfx::Point(), gfx::Vector2d(50, 50)).get())
+                .thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50));
 
   EXPECT_EQ(scrolling_layer->scroll_tree_index(),
             host_impl_->CurrentlyScrollingNode()->id);
@@ -11712,9 +11815,7 @@
   EXPECT_TRUE(y > 1 && y < 49);
 
   // Update target.
-  EXPECT_EQ(
-      InputHandler::SCROLL_ON_IMPL_THREAD,
-      host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50)).thread);
+  host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(50, 50));
   host_impl_->DidFinishImplFrame();
 
   begin_frame_args.frame_time =
@@ -11765,6 +11866,8 @@
   viz::BeginFrameArgs begin_frame_args =
       viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
+  host_impl_->ScrollAnimatedBegin(
+      BeginState(gfx::Point(), gfx::Vector2d(500, 500)).get());
   host_impl_->ScrollAnimated(gfx::Point(), gfx::Vector2d(500, 500));
 
   EXPECT_EQ(scrolling_layer->scroll_tree_index(),
diff --git a/chrome/VERSION b/chrome/VERSION
index 21ac043..c06cd55 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=81
 MINOR=0
-BUILD=4015
+BUILD=4016
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index a2ec6e13..5e069a3 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -642,6 +642,11 @@
   # From java_sources.gni.
   sources = chrome_junit_test_java_sources
 
+  assert_no_deps = [
+    "//content",
+    "//mojo/public/mojom/base",
+  ]
+
   deps = [
     ":app_hooks_java",
     ":chrome_app_java_resources",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index ed5936d..b4d2160 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -192,6 +192,7 @@
   "junit/src/org/chromium/chrome/browser/signin/ConfirmImportSyncDataDialogTest.java",
   "junit/src/org/chromium/chrome/browser/signin/ConfirmManagedSyncDataDialogTest.java",
   "junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineDelegateTest.java",
+  "junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninPromoUtilTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninUtilsStartActivityTest.java",
diff --git a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
index 60008aeb..b479225c 100644
--- a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
+++ b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
@@ -1306,6 +1306,12 @@
           android:readPermission="android.permission.GLOBAL_SEARCH"/>
     </provider>
     <provider
+        android:authorities="org.chromium.chrome.DeveloperModeContentProvider"
+        android:enabled="false"
+        android:exported="true"
+        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
+        android:process=":webview_service"/>
+    <provider
         android:authorities="org.chromium.chrome.DownloadFileProvider"
         android:exported="false"
         android:grantUriPermissions="true"
@@ -1324,12 +1330,6 @@
           android:resource="@xml/file_paths"/>
     </provider>
     <provider
-        android:authorities="org.chromium.chrome.FlagOverrideContentProvider"
-        android:enabled="false"
-        android:exported="true"
-        android:name="org.chromium.android_webview.services.FlagOverrideContentProvider"
-        android:process=":webview_service"/>
-    <provider
         android:authorities="org.chromium.chrome.LicenseContentProvider"
         android:exported="true"
         android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
index 360fd61..824123d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -25,7 +25,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleCell;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleWifi;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
@@ -34,6 +33,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.UrlConstants;
 import org.chromium.chrome.browser.util.UrlUtilitiesJni;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
index 95c1e74..21844ab9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
@@ -17,13 +17,13 @@
 import org.chromium.base.Callback;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.settings.NfcSystemLevelSetting;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.ContentSettingsResources;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.location.LocationUtils;
 import org.chromium.ui.base.AndroidPermissionDelegate;
 import org.chromium.ui.base.PermissionCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
index d218a40..c3b01531 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
@@ -13,11 +13,11 @@
 import androidx.annotation.StringRes;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.metrics.WebApkUma;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.webapps.WebApkActivity;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.ui.base.PermissionCallback;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettings.java
index c94caf4d..5ff9a108 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettings.java
@@ -12,7 +12,6 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
@@ -21,6 +20,7 @@
 import org.chromium.chrome.browser.settings.website.SingleCategorySettings;
 import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 /**
  * Settings fragment that allows the user to configure notifications. It contains general
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/search_engine/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/search_engine/SearchEngineAdapter.java
index 70f2feb..b8c6ebc2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/search_engine/SearchEngineAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/search_engine/SearchEngineAdapter.java
@@ -29,7 +29,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
@@ -37,6 +36,7 @@
 import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.browser.settings.website.SingleWebsiteSettings;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.location.LocationUtils;
 import org.chromium.components.search_engines.TemplateUrl;
 import org.chromium.components.search_engines.TemplateUrlService;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
index 2280524..6369b007 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.settings.website;
 
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.io.Serializable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
index abdf1e6..beab4d82 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
@@ -9,7 +9,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.io.Serializable;
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
index 86fc916..b3cdd4ab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
@@ -16,7 +16,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
index f267e5a..9b59b32 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
@@ -7,7 +7,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.io.Serializable;
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
index 64084983..acbae08e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
@@ -39,7 +39,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.preferences.Pref;
@@ -56,6 +55,7 @@
 import org.chromium.chrome.browser.settings.SettingsUtils;
 import org.chromium.chrome.browser.settings.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.util.UrlUtilities;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.ui.widget.Toast;
 
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
index 2b0774d..1b4665b9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
@@ -28,7 +28,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
@@ -36,6 +35,7 @@
 import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
index f8763d9..0b746d7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
@@ -26,7 +26,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.ui.text.SpanApplier;
 import org.chromium.ui.text.SpanApplier.SpanInfo;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
index 6df4c9bc..3c574d55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
@@ -10,8 +10,8 @@
 
 import org.chromium.base.MathUtils;
 import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.io.Serializable;
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
index a4f0aa64..c32650d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
-import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.content_public.common.ContentSwitches;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
index 96ad6e74..bd77be7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
@@ -9,8 +9,8 @@
 import org.chromium.base.Callback;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.components.content_settings.ContentSettingsType;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
index 49072ed0..593d8434 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
@@ -4,9 +4,7 @@
 
 package org.chromium.chrome.browser.signin;
 
-import android.content.Context;
 import android.os.Handler;
-import android.support.v4.app.FragmentManager;
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
@@ -66,8 +64,6 @@
     private final ConfirmImportSyncDataDialog.Listener mCallback;
     private final @Nullable String mOldAccountName;
     private final String mNewAccountName;
-    private final FragmentManager mFragmentManager;
-    private final Context mContext;
     private final ConfirmSyncDataStateMachineDelegate mDelegate;
     private final Handler mHandler = new Handler();
 
@@ -80,22 +76,21 @@
      * @param oldAccountName the name of the last signed in account or null
      * @param newAccountName the name of the account user is signing in with
      * @param callback the listener to receive the result of this state machine
+     * @param delegate the delegate responsible of showing dialogs
+     * TODO(https://crbug.com/1038502):
+     * Use a separate interface for the callback to avoid confusion.
      */
-    public ConfirmSyncDataStateMachine(Context context, FragmentManager fragmentManager,
+    public ConfirmSyncDataStateMachine(ConfirmSyncDataStateMachineDelegate delegate,
             @Nullable String oldAccountName, String newAccountName,
             ConfirmImportSyncDataDialog.Listener callback) {
         ThreadUtils.assertOnUiThread();
-        // Includes implicit not-null assertion.
-        assert !newAccountName.equals("") : "New account name must be provided.";
+        assert !TextUtils.isEmpty(newAccountName) : "New account name must be provided.";
 
+        mDelegate = delegate;
         mOldAccountName = oldAccountName;
         mNewAccountName = newAccountName;
-        mFragmentManager = fragmentManager;
-        mContext = context;
         mCallback = callback;
 
-        mDelegate = new ConfirmSyncDataStateMachineDelegate(mFragmentManager);
-
         // New account management status isn't needed right now, but fetching it
         // can take a few seconds, so we kick it off early.
         requestNewAccountManagementStatus();
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 53682fe9..7411037 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
@@ -436,8 +436,8 @@
     }
 
     private void runStateMachineAndSignin(boolean settingsClicked) {
-        mConfirmSyncDataStateMachine = new ConfirmSyncDataStateMachine(getContext(),
-                getChildFragmentManager(),
+        mConfirmSyncDataStateMachine = new ConfirmSyncDataStateMachine(
+                new ConfirmSyncDataStateMachineDelegate(getChildFragmentManager()),
                 PrefServiceBridge.getInstance().getString(Pref.SYNC_LAST_ACCOUNT_NAME),
                 mSelectedAccountName, new ConfirmImportSyncDataDialog.Listener() {
                     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java
index e8a4517..25a5652 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java
@@ -38,7 +38,10 @@
     public @Availability int checkAvailability(Context applicationContext) {
         // ARCore's checkAvailability reads shared preferences via ArCoreContentProvider, need to
         // turn off strict mode to allow that.
-        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
+        // TODO(https://crbug.com/1038757): Remove the disk write context when the disk write is
+        // fixed on ArCore's end.
+        try (StrictModeContext ignored = StrictModeContext.allowDiskReads();
+                StrictModeContext ignored2 = StrictModeContext.allowDiskWrites()) {
             ArCoreApk.Availability availability =
                     ArCoreApk.getInstance().checkAvailability(applicationContext);
             return mapArCoreApkAvailability(availability);
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 f149baf8..58206c4 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
@@ -39,6 +39,7 @@
 import org.chromium.payments.mojom.PaymentAddress;
 import org.chromium.ui.ContactsPickerListener;
 
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -593,8 +594,51 @@
         Assert.assertEquals(31, mLastPropertiesRequested);
     }
 
-    // TODO(crbug.com/1020564): Add a test (once icons have been implemented end-to-end) that
-    //                          validates that icons are not returned when the filter chip is off.
+    @Test
+    @LargeTest
+    public void testAddressesRemoved() throws Throwable {
+        setTestContacts(/*ownerEmail=*/null);
+        createDialog(/* multiselect = */ false);
+        Assert.assertTrue(mDialog.isShowing());
+
+        toggleFilter(PickerAdapter.FilterType.ADDRESSES);
+
+        int expectedSelectionCount = 1;
+        clickView(0, expectedSelectionCount, /* expectSelection = */ true);
+        clickDone();
+
+        Assert.assertEquals(ContactsPickerAction.CONTACTS_SELECTED, mLastActionRecorded);
+        Assert.assertEquals(1, mLastSelectedContacts.size());
+        Assert.assertEquals(
+                mTestContacts.get(0).getDisplayName(), mLastSelectedContacts.get(0).names.get(0));
+        Assert.assertEquals(
+                new ArrayList<ByteBuffer>(), mLastSelectedContacts.get(0).serializedAddresses);
+        Assert.assertEquals(16, mLastPercentageShared);
+        Assert.assertEquals(31, mLastPropertiesRequested);
+    }
+
+    @Test
+    @LargeTest
+    public void testIconsRemoved() throws Throwable {
+        setTestContacts(/*ownerEmail=*/null);
+        createDialog(/* multiselect = */ false);
+        Assert.assertTrue(mDialog.isShowing());
+
+        toggleFilter(PickerAdapter.FilterType.ICONS);
+
+        int expectedSelectionCount = 1;
+        clickView(0, expectedSelectionCount, /* expectSelection = */ true);
+        clickDone();
+
+        Assert.assertEquals(ContactsPickerAction.CONTACTS_SELECTED, mLastActionRecorded);
+        Assert.assertEquals(1, mLastSelectedContacts.size());
+        Assert.assertEquals(
+                mTestContacts.get(0).getDisplayName(), mLastSelectedContacts.get(0).names.get(0));
+        Assert.assertEquals(
+                new ArrayList<ByteBuffer>(), mLastSelectedContacts.get(0).serializedIcons);
+        Assert.assertEquals(16, mLastPercentageShared);
+        Assert.assertEquals(31, mLastPropertiesRequested);
+    }
 
     @Test
     @LargeTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java
index 2790f15..4cf3768 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java
@@ -21,7 +21,6 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
 import org.chromium.chrome.browser.settings.SettingsActivity;
@@ -33,6 +32,7 @@
 import org.chromium.chrome.browser.test.ScreenShooter;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
index f256d54b..ad9b6a3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTest.java
@@ -28,7 +28,6 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
@@ -42,6 +41,7 @@
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.common.ContentSwitches;
 import org.chromium.net.test.EmbeddedTestServer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
index b7a9426c..fac317d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
@@ -17,9 +17,9 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CallbackHelper;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
 import java.util.ArrayList;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/snackbar/SnackbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/snackbar/SnackbarTest.java
index 4d3b059..15bc554 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/snackbar/SnackbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/snackbar/SnackbarTest.java
@@ -8,21 +8,18 @@
 import android.support.test.filters.SmallTest;
 
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.Supplier;
 import org.chromium.base.task.PostTask;
-import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
+import org.chromium.ui.test.util.DummyUiActivityTestCase;
 
 import java.util.concurrent.TimeUnit;
 
@@ -30,11 +27,7 @@
  * Tests for {@link SnackbarManager}.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-public class SnackbarTest {
-    @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-
+public class SnackbarTest extends DummyUiActivityTestCase {
     private SnackbarManager mManager;
     private SnackbarController mDefaultController = new SnackbarController() {
         @Override
@@ -58,11 +51,14 @@
 
     private boolean mDismissed;
 
-    @Before
-    public void setUp() throws InterruptedException {
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
         SnackbarManager.setDurationForTesting(1000);
-        mActivityTestRule.startMainActivityOnBlankPage();
-        mManager = mActivityTestRule.getActivity().getSnackbarManager();
+        PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
+            mManager = new SnackbarManager(
+                    getActivity(), getActivity().findViewById(android.R.id.content), null);
+        });
     }
 
     @Test
@@ -75,14 +71,9 @@
                 Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_TEST_SNACKBAR);
         final Snackbar persistent = Snackbar.make("persistent", mDefaultController,
                 Snackbar.TYPE_PERSISTENT, Snackbar.UMA_TEST_SNACKBAR);
-        PostTask.runOrPostTask(
-                UiThreadTaskTraits.DEFAULT, () -> { mManager.showSnackbar(stackbar); });
-        CriteriaHelper.pollUiThread(new Criteria("First snackbar not shown") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == stackbar;
-            }
-        });
+        PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(stackbar));
+        pollSnackbarCondition("First snackbar not shown",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == stackbar);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
             mManager.showSnackbar(queuebar);
             Assert.assertTrue("Snackbar not showing", mManager.isShowing());
@@ -96,26 +87,15 @@
                     "Snackbars on stack should not be cancelled by persistent snackbars", stackbar,
                     mManager.getCurrentSnackbarForTesting());
         });
-        CriteriaHelper.pollUiThread(new Criteria("Snackbar on queue not shown") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == queuebar;
-            }
-        });
-        CriteriaHelper.pollUiThread(new Criteria("Snackbar on queue not timed out") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing()
-                        && mManager.getCurrentSnackbarForTesting() == persistent;
-            }
-        });
+        pollSnackbarCondition("Snackbar on queue not shown",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == queuebar);
+        pollSnackbarCondition("Snackbar on queue not timed out",
+                ()
+                        -> mManager.isShowing()
+                        && mManager.getCurrentSnackbarForTesting() == persistent);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.onClick(null));
-        CriteriaHelper.pollUiThread(new Criteria("Persistent snackbar did not get cleared") {
-            @Override
-            public boolean isSatisfied() {
-                return !mManager.isShowing();
-            }
-        });
+        pollSnackbarCondition(
+                "Persistent snackbar did not get cleared", () -> !mManager.isShowing());
     }
 
     @Test
@@ -129,44 +109,23 @@
         final Snackbar persistent = Snackbar.make("persistent", mDefaultController,
                 Snackbar.TYPE_PERSISTENT, Snackbar.UMA_TEST_SNACKBAR);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(persistent));
-        CriteriaHelper.pollUiThread(new Criteria("First snackbar not shown") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing()
-                        && mManager.getCurrentSnackbarForTesting() == persistent;
-            }
-        });
+        pollSnackbarCondition("First snackbar not shown",
+                ()
+                        -> mManager.isShowing()
+                        && mManager.getCurrentSnackbarForTesting() == persistent);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(queuebar));
-        CriteriaHelper.pollUiThread(new Criteria(
-                "Persistent snackbar was not cleared by queue snackbar") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == queuebar;
-            }
-        });
+        pollSnackbarCondition("Persistent snackbar was not cleared by queue snackbar",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == queuebar);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(stackbar));
-        CriteriaHelper.pollUiThread(
-                new Criteria("Snackbar on queue was not cleared by snackbar stack.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return mManager.isShowing()
-                                && mManager.getCurrentSnackbarForTesting() == stackbar;
-                    }
-                });
-        CriteriaHelper.pollUiThread(new Criteria("Snackbar did not time out") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing()
-                        && mManager.getCurrentSnackbarForTesting() == persistent;
-            }
-        });
+        pollSnackbarCondition("Snackbar on queue was not cleared by snackbar stack.",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == stackbar);
+        pollSnackbarCondition("Snackbar did not time out",
+                ()
+                        -> mManager.isShowing()
+                        && mManager.getCurrentSnackbarForTesting() == persistent);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.onClick(null));
-        CriteriaHelper.pollUiThread(new Criteria("Persistent snackbar did not get cleared") {
-            @Override
-            public boolean isSatisfied() {
-                return !mManager.isShowing();
-            }
-        });
+        pollSnackbarCondition(
+                "Persistent snackbar did not get cleared", () -> !mManager.isShowing());
     }
 
     @Test
@@ -176,22 +135,12 @@
                 Snackbar.TYPE_ACTION, Snackbar.UMA_TEST_SNACKBAR);
         mDismissed = false;
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(snackbar));
-        CriteriaHelper.pollUiThread(
-                new Criteria("Snackbar on queue was not cleared by snackbar stack.") {
-                    @Override
-                    public boolean isSatisfied() {
-                        return mManager.isShowing()
-                                && mManager.getCurrentSnackbarForTesting() == snackbar;
-                    }
-                });
+        pollSnackbarCondition("Snackbar on queue was not cleared by snackbar stack.",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == snackbar);
         PostTask.runOrPostTask(
                 UiThreadTaskTraits.DEFAULT, () -> mManager.dismissSnackbars(mDismissController));
-        CriteriaHelper.pollUiThread(new Criteria("Snackbar did not time out") {
-            @Override
-            public boolean isSatisfied() {
-                return !mManager.isShowing() && mDismissed;
-            }
-        });
+        pollSnackbarCondition(
+                "Snackbar did not time out", () -> !mManager.isShowing() && mDismissed);
     }
 
     @Test
@@ -203,24 +152,21 @@
                 Snackbar.TYPE_PERSISTENT, Snackbar.UMA_TEST_SNACKBAR);
         mDismissed = false;
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.showSnackbar(snackbar));
-        CriteriaHelper.pollUiThread(new Criteria("Persistent Snackbar not shown.") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == snackbar;
-            }
-        });
+        pollSnackbarCondition("Persistent Snackbar not shown.",
+                () -> mManager.isShowing() && mManager.getCurrentSnackbarForTesting() == snackbar);
         TimeUnit.MILLISECONDS.sleep(timeout);
-        CriteriaHelper.pollUiThread(new Criteria("Persistent snackbar timed out.") {
-            @Override
-            public boolean isSatisfied() {
-                return mManager.isShowing() && !mDismissed;
-            }
-        });
+        pollSnackbarCondition(
+                "Persistent snackbar timed out.", () -> mManager.isShowing() && !mDismissed);
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> mManager.onClick(null));
-        CriteriaHelper.pollUiThread(new Criteria("Persistent snackbar not removed on action.") {
+        pollSnackbarCondition(
+                "Persistent snackbar not removed on action.", () -> !mManager.isShowing());
+    }
+
+    void pollSnackbarCondition(String message, Supplier<Boolean> condition) {
+        CriteriaHelper.pollUiThread(new Criteria(message) {
             @Override
             public boolean isSatisfied() {
-                return !mManager.isShowing();
+                return condition.get();
             }
         });
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
index 98ac6802..93d926c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
@@ -34,12 +34,12 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridgeJni;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.ui.base.AndroidPermissionDelegate;
 import org.chromium.ui.base.PermissionCallback;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineTest.java
new file mode 100644
index 0000000..fd9af16
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachineTest.java
@@ -0,0 +1,177 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.signin;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+/** Tests for {@link ConfirmSyncDataStateMachine}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public class ConfirmSyncDataStateMachineTest {
+    @Rule
+    public final JniMocker mocker = new JniMocker();
+
+    @Mock
+    private SigninManager.Natives mSigninManagerNativeMock;
+
+    @Mock
+    private ConfirmSyncDataStateMachineDelegate mDelegateMock;
+
+    @Mock
+    private ConfirmImportSyncDataDialog.Listener mImportSyncDataListenerMock;
+
+    @Mock
+    private SigninManager mSigninManagerMock;
+
+    @Captor
+    private ArgumentCaptor<Callback<Boolean>> mCallbackArgument;
+
+    private final String mOldAccountName = "old.account.test@testdomain.com";
+
+    private final String mNewAccountName = "new.account.test@testdomain.com";
+
+    @Before
+    public void setUp() {
+        initMocks(this);
+        mocker.mock(SigninManagerJni.TEST_HOOKS, mSigninManagerNativeMock);
+        IdentityServicesProvider.setInstanceForTests(mock(IdentityServicesProvider.class));
+        when(IdentityServicesProvider.get().getSigninManager()).thenReturn(mSigninManagerMock);
+    }
+
+    @Test(expected = AssertionError.class)
+    public void testNewAccountNameCannotBeEmpty() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, mOldAccountName, null, mImportSyncDataListenerMock);
+    }
+
+    @Test
+    public void testImportSyncDataDialogShownWhenOldAndNewAccountNamesAreDifferent() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, mOldAccountName, mNewAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock)
+                .showConfirmImportSyncDataDialog(any(ConfirmImportSyncDataDialog.Listener.class),
+                        eq(mOldAccountName), eq(mNewAccountName));
+    }
+
+    @Test
+    public void testProgressDialogShownWhenOldAndNewAccountNamesAreEqual() {
+        String oldAndNewAccountName = "test.old.new@testdomain.com";
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(mDelegateMock,
+                oldAndNewAccountName, oldAndNewAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock, never())
+                .showConfirmImportSyncDataDialog(
+                        any(ConfirmImportSyncDataDialog.Listener.class), anyString(), anyString());
+        verify(mDelegateMock)
+                .showFetchManagementPolicyProgressDialog(
+                        any(ConfirmSyncDataStateMachineDelegate.ProgressDialogListener.class));
+    }
+
+    @Test
+    public void testProgressDialogShownWhenOldAccountNameIsEmpty() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, null, mNewAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock, never())
+                .showConfirmImportSyncDataDialog(
+                        any(ConfirmImportSyncDataDialog.Listener.class), anyString(), anyString());
+        verify(mDelegateMock)
+                .showFetchManagementPolicyProgressDialog(
+                        any(ConfirmSyncDataStateMachineDelegate.ProgressDialogListener.class));
+    }
+
+    @Test
+    public void testListenerConfirmedWhenNewAccountIsNotManaged() {
+        mockSigninManagerIsAccountManaged(false);
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, null, mNewAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock).dismissAllDialogs();
+        verify(mImportSyncDataListenerMock).onConfirm(false);
+    }
+
+    @Test
+    public void testManagedAccountDialogShownWhenNewAccountIsManaged() {
+        mockSigninManagerIsAccountManaged(true);
+        when(mSigninManagerNativeMock.extractDomainName(anyString())).thenReturn(mNewAccountName);
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, null, mNewAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock)
+                .showSignInToManagedAccountDialog(
+                        any(ConfirmManagedSyncDataDialog.Listener.class), eq(mNewAccountName));
+    }
+
+    @Test
+    public void testWhenManagedAccountStatusIsFetchedAfterNewAccountDialog() {
+        String newAccountName = "test.account@manageddomain.com";
+        String domain = "manageddomain.com";
+        when(mSigninManagerNativeMock.extractDomainName(newAccountName)).thenReturn(domain);
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, null, newAccountName, mImportSyncDataListenerMock);
+        verify(mDelegateMock, never())
+                .showSignInToManagedAccountDialog(
+                        any(ConfirmManagedSyncDataDialog.Listener.class), anyString());
+        verify(mSigninManagerMock)
+                .isAccountManaged(eq(newAccountName), mCallbackArgument.capture());
+        Callback<Boolean> callback = mCallbackArgument.getValue();
+        callback.onResult(true);
+        verify(mDelegateMock)
+                .showSignInToManagedAccountDialog(
+                        any(ConfirmManagedSyncDataDialog.Listener.class), eq(domain));
+    }
+
+    @Test
+    public void testCancelWhenIsNotBeingDestroyed() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, mOldAccountName, mNewAccountName, mImportSyncDataListenerMock);
+        stateMachine.onCancel();
+        verify(mImportSyncDataListenerMock).onCancel();
+        verify(mDelegateMock).dismissAllDialogs();
+    }
+
+    @Test
+    public void testCancelWhenIsBeingDestroyed() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, mOldAccountName, mNewAccountName, mImportSyncDataListenerMock);
+        stateMachine.cancel(true);
+        verify(mImportSyncDataListenerMock, never()).onCancel();
+        verify(mDelegateMock, never()).dismissAllDialogs();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testStateCannotChangeOnceDone() {
+        ConfirmSyncDataStateMachine stateMachine = new ConfirmSyncDataStateMachine(
+                mDelegateMock, mOldAccountName, mNewAccountName, mImportSyncDataListenerMock);
+        stateMachine.cancel(true);
+        stateMachine.onConfirm();
+    }
+
+    private void mockSigninManagerIsAccountManaged(boolean isAccountManaged) {
+        doAnswer(invocation -> {
+            Callback<Boolean> callback = invocation.getArgument(1);
+            callback.onResult(isAccountManaged);
+            return null;
+        })
+                .when(mSigninManagerMock)
+                .isAccountManaged(anyString(), Matchers.<Callback<Boolean>>any());
+    }
+}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 1c12092..56fdaea1 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4537,10 +4537,10 @@
         These extensions can see and change information on this site.
       </message>
       <message name="IDS_EXTENSIONS_MENU_WANTS_TO_ACCESS_SITE_DATA" desc="Header for section of extensions that want to access the current site's data">
-        To allow access on this site, click the extension.
+        To give an extension access to this site, click it.
       </message>
       <message name="IDS_EXTENSIONS_MENU_CANT_ACCESS_SITE_DATA" desc="Header for section of extensions that can't access the current site's data">
-        These extensions don't need access to this site.
+        These extensions don't need to see and change information on this site.
       </message>
 
       <!-- Settings API bubble -->
diff --git a/chrome/browser/apps/platform_apps/api/arc_apps_private/arc_apps_private_apitest.cc b/chrome/browser/apps/platform_apps/api/arc_apps_private/arc_apps_private_apitest.cc
index dc58ca9b..3585026 100644
--- a/chrome/browser/apps/platform_apps/api/arc_apps_private/arc_apps_private_apitest.cc
+++ b/chrome/browser/apps/platform_apps/api/arc_apps_private/arc_apps_private_apitest.cc
@@ -77,7 +77,9 @@
   DISALLOW_COPY_AND_ASSIGN(ArcAppsPrivateApiTest);
 };
 
-IN_PROC_BROWSER_TEST_F(ArcAppsPrivateApiTest, GetPackageNameAndLaunchApp) {
+// TODO(crbug.com/1038602): Fix this flaky test, and enable it again.
+IN_PROC_BROWSER_TEST_F(ArcAppsPrivateApiTest,
+                       DISABLED_GetPackageNameAndLaunchApp) {
   ArcAppListPrefs* prefs = ArcAppListPrefs::Get(browser()->profile());
   ASSERT_TRUE(prefs);
   CreateAppInstance(prefs);
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index f81f2d81..b05e7089 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -731,7 +731,8 @@
     // Only allow requests to be loaded that are necessary for the test. This
     // allows a histogram to test properties of some specific requests.
     std::vector<std::string> allowlist = {
-        "/internal/test_url_path", "https://clients1.google.com/tbproxy"};
+        "/internal/test_url_path", "https://clients1.google.com/tbproxy",
+        "https://content-autofill.googleapis.com/"};
     url_loader_interceptor_ =
         std::make_unique<URLLoaderInterceptor>(base::BindLambdaForTesting(
             [&](URLLoaderInterceptor::RequestParams* params) {
@@ -780,6 +781,8 @@
   // Assert that the network isolation key is populated for 2 requests:
   // - Navigation: /internal/test_url_path
   // - Autofill query: https://clients1.google.com/tbproxy/af/query?...
+  //   or "https://content-autofill.googleapis.com/..." (depending on the
+  //   finch configuration of the AutofillUseApi feature).
   histogram_tester().ExpectBucketCount("HttpCache.NetworkIsolationKeyPresent2",
                                        2 /*kPresent*/, 2 /*count*/);
 }
diff --git a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc
index 6dfd4e42..069b5ad 100644
--- a/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc
+++ b/chrome/browser/browsing_data/counters/site_settings_counter_unittest.cc
@@ -26,8 +26,6 @@
 
 #if !defined(OS_ANDROID)
 #include "content/public/browser/host_zoom_map.h"
-#else
-#include "base/android/build_info.h"
 #endif
 
 namespace {
@@ -51,6 +49,9 @@
                    browsing_data::ClearBrowsingDataTab::ADVANCED,
                    base::BindRepeating(&SiteSettingsCounterTest::Callback,
                                        base::Unretained(this)));
+#if defined(OS_ANDROID)
+    ClearNotificationsChannels();
+#endif
   }
 
   Profile* profile() { return profile_.get(); }
@@ -90,6 +91,25 @@
                   ->Value();
   }
 
+#if defined(OS_ANDROID)
+  void ClearNotificationsChannels() {
+    // Because notification channel settings aren't tied to the profile, they
+    // will persist across tests. We need to make sure they're reset here.
+    ContentSettingsForOneType settings;
+    map_->GetSettingsForOneType(ContentSettingsType ::NOTIFICATIONS,
+                                std::string(), &settings);
+    for (auto& setting : settings) {
+      if (!setting.primary_pattern.MatchesAllHosts() ||
+          !setting.secondary_pattern.MatchesAllHosts()) {
+        map_->SetContentSettingCustomScope(
+            setting.primary_pattern, setting.secondary_pattern,
+            ContentSettingsType ::NOTIFICATIONS, std::string(),
+            ContentSetting::CONTENT_SETTING_DEFAULT);
+      }
+    }
+  }
+#endif
+
  private:
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfile> profile_;
@@ -117,14 +137,6 @@
 
 // Test that the counter counts correctly when using a time period.
 TEST_F(SiteSettingsCounterTest, CountWithTimePeriod) {
-#if defined(OS_ANDROID)
-  // TODO(crbug.com/981972)
-  if (base::android::BuildInfo::GetInstance()->sdk_int() >=
-      base::android::SDK_VERSION_OREO) {
-    return;
-  }
-#endif
-
   base::SimpleTestClock test_clock;
   map()->SetClockForTesting(&test_clock);
 
@@ -142,9 +154,10 @@
 
   // Create a setting at Now()-31days.
   test_clock.SetNow(base::Time::Now() - base::TimeDelta::FromDays(31));
-  map()->SetContentSettingDefaultScope(
-      GURL("http://www.google.com"), GURL("http://www.google.com"),
-      ContentSettingsType::NOTIFICATIONS, std::string(), CONTENT_SETTING_ALLOW);
+  map()->SetContentSettingDefaultScope(GURL("http://www.google.com"),
+                                       GURL("http://www.google.com"),
+                                       ContentSettingsType::MEDIASTREAM_CAMERA,
+                                       std::string(), CONTENT_SETTING_ALLOW);
 
   test_clock.SetNow(base::Time::Now());
   // Only one of the settings was created in the last hour.
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
index be8fbb6..02c44fed 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.cc
@@ -73,7 +73,7 @@
   if (fields & storage::FileSystemOperation::GET_METADATA_FIELD_IS_DIRECTORY)
     file_info.is_directory = *metadata->is_directory;
   if (fields & storage::FileSystemOperation::GET_METADATA_FIELD_SIZE)
-    file_info.size = *metadata->size;
+    file_info.size = std::max(int64_t{0}, *metadata->size);
 
   if (fields & storage::FileSystemOperation::GET_METADATA_FIELD_LAST_MODIFIED) {
     file_info.last_modified = *metadata->modification_time;
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index ce79332..f285bef 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -44,6 +44,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
+#include "extensions/browser/content_verifier.h"
 #include "extensions/browser/extension_file_task_runner.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
@@ -475,6 +476,30 @@
   return base::nullopt;
 }
 
+void CrxInstaller::ShouldComputeHashesOnUI(
+    scoped_refptr<const Extension> extension,
+    base::OnceCallback<void(bool)> callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  extensions::ContentVerifier* content_verifier =
+      extensions::ExtensionSystem::Get(profile_)->content_verifier();
+  bool result = content_verifier &&
+                content_verifier->ShouldComputeHashesOnInstall(*extension);
+  installer_task_runner_->PostTask(FROM_HERE,
+                                   base::BindOnce(std::move(callback), result));
+}
+
+void CrxInstaller::ShouldComputeHashesForOffWebstoreExtension(
+    scoped_refptr<const Extension> extension,
+    base::OnceCallback<void(bool)> callback) {
+  DCHECK(installer_task_runner_->RunsTasksInCurrentSequence());
+  if (!base::PostTask(
+          FROM_HERE, {BrowserThread::UI},
+          base::BindOnce(&CrxInstaller::ShouldComputeHashesOnUI, this,
+                         std::move(extension), std::move(callback)))) {
+    NOTREACHED();
+  }
+}
+
 void CrxInstaller::OnUnpackFailure(const CrxInstallError& error) {
   DCHECK(installer_task_runner_->RunsTasksInCurrentSequence());
 
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h
index 6c55bfcf..bbe073d 100644
--- a/chrome/browser/extensions/crx_installer.h
+++ b/chrome/browser/extensions/crx_installer.h
@@ -261,7 +261,15 @@
   // should complete.
   base::Optional<CrxInstallError> AllowInstall(const Extension* extension);
 
+  // To check whether we need to compute hashes or not, we have to make a query
+  // to ContentVerifier, and that should be done on the UI thread.
+  void ShouldComputeHashesOnUI(scoped_refptr<const Extension> extension,
+                               base::OnceCallback<void(bool)> callback);
+
   // SandboxedUnpackerClient
+  void ShouldComputeHashesForOffWebstoreExtension(
+      scoped_refptr<const Extension> extension,
+      base::OnceCallback<void(bool)> callback) override;
   void OnUnpackFailure(const CrxInstallError& error) override;
   void OnUnpackSuccess(
       const base::FilePath& temp_dir,
diff --git a/chrome/browser/extensions/system_display/OWNERS b/chrome/browser/extensions/system_display/OWNERS
index aa215c7..d418f5f 100644
--- a/chrome/browser/extensions/system_display/OWNERS
+++ b/chrome/browser/extensions/system_display/OWNERS
@@ -1 +1,3 @@
 stevenjb@chromium.org
+
+# COMPONENT: OS>Systems>Display
diff --git a/chrome/browser/metrics/perf/OWNERS b/chrome/browser/metrics/perf/OWNERS
index 94b81e5..25ec118 100644
--- a/chrome/browser/metrics/perf/OWNERS
+++ b/chrome/browser/metrics/perf/OWNERS
@@ -1,4 +1,4 @@
 gmx@chromium.org
 # No Chromium committer status:
 # aalexand@google.com
-# lakshmana@chromium.org
+# dubin@google.com
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
index e429a45c..3164b199 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
@@ -529,8 +529,10 @@
 void OptimizationGuideHintsManager::OnPageNavigationHintsFetched(
     base::Optional<std::unique_ptr<optimization_guide::proto::GetHintsResponse>>
         get_hints_response) {
-  if (!get_hints_response.has_value() || !get_hints_response.value())
+  if (!get_hints_response.has_value() || !get_hints_response.value()) {
+    page_navigation_hosts_being_fetched_.clear();
     return;
+  }
 
   hint_cache_->UpdateFetchedHints(
       std::move(*get_hints_response), clock_->Now() + kUpdateFetchedHintsDelay,
@@ -551,8 +553,10 @@
 
 void OptimizationGuideHintsManager::OnFetchedPageNavigationHintsStored() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  for (const auto& host : navigation_hosts_last_fetched_real_time_)
+  for (const auto& host : page_navigation_hosts_being_fetched_)
     LoadHintForHost(host, base::DoNothing());
+
+  page_navigation_hosts_being_fetched_.clear();
 }
 
 base::Time OptimizationGuideHintsManager::GetLastHintsFetchAttemptTime() const {
@@ -649,9 +653,9 @@
   if (target_hosts.empty())
     return;
 
-  navigation_hosts_last_fetched_real_time_.clear();
+  page_navigation_hosts_being_fetched_.clear();
   for (const auto& host : target_hosts)
-    navigation_hosts_last_fetched_real_time_.push_back(host);
+    page_navigation_hosts_being_fetched_.push_back(host);
 
   if (!hints_fetcher_) {
     hints_fetcher_ = std::make_unique<optimization_guide::HintsFetcher>(
@@ -934,8 +938,8 @@
   if (IsAllowedToFetchNavigationHints(navigation_handle->GetURL()) &&
       !hint_cache_->HasHint(navigation_handle->GetURL().host())) {
     std::vector<std::string> hosts{navigation_handle->GetURL().host()};
-    navigation_hosts_last_fetched_real_time_.clear();
-    navigation_hosts_last_fetched_real_time_.push_back(
+    page_navigation_hosts_being_fetched_.clear();
+    page_navigation_hosts_being_fetched_.push_back(
         navigation_handle->GetURL().host());
 
     if (!hints_fetcher_) {
@@ -966,7 +970,7 @@
 
 bool OptimizationGuideHintsManager::IsHintBeingFetched(
     const std::string& host) const {
-  return std::find(navigation_hosts_last_fetched_real_time_.begin(),
-                   navigation_hosts_last_fetched_real_time_.end(),
-                   host) != navigation_hosts_last_fetched_real_time_.end();
+  return std::find(page_navigation_hosts_being_fetched_.begin(),
+                   page_navigation_hosts_being_fetched_.end(),
+                   host) != page_navigation_hosts_being_fetched_.end();
 }
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.h b/chrome/browser/optimization_guide/optimization_guide_hints_manager.h
index 363e71c..e53af6a 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager.h
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.h
@@ -344,8 +344,10 @@
   // Used in testing to subscribe to an update event in this class.
   base::OnceClosure next_update_closure_;
 
-  // Hosts for which hints were last fetched in the real-time.
-  std::vector<std::string> navigation_hosts_last_fetched_real_time_;
+  // Hosts for which hints are currently being fetched with the PAGE_NAVIGATION
+  // request context.
+  // This will be cleared at request completion.
+  std::vector<std::string> page_navigation_hosts_being_fetched_;
 
   // Used to get |weak_ptr_| to self on the UI thread.
   base::WeakPtrFactory<OptimizationGuideHintsManager> ui_weak_ptr_factory_{
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
index 2d501ad..a61f6d5 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
@@ -2267,3 +2267,65 @@
             optimization_guide::OptimizationTypeDecision::
                 kHintFetchStartedButNotAvailableInTime);
 }
+
+TEST_F(OptimizationGuideHintsManagerFetchingTest,
+       CanApplyOptimizationCalledPostFetchButNoHintsCameBack) {
+  hints_manager()->RegisterOptimizationTypes(
+      {optimization_guide::proto::DEFER_ALL_SCRIPT});
+  InitializeWithDefaultConfig("1.0.0.0");
+
+  hints_manager()->SetHintsFetcherForTesting(
+      BuildTestHintsFetcher(HintsFetcherEndState::kFetchSuccessWithNoHints));
+
+  // Set ECT estimate so fetch is activated.
+  hints_manager()->OnEffectiveConnectionTypeChanged(
+      net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
+  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
+      CreateMockNavigationHandleWithOptimizationGuideWebContentsObserver(
+          url_without_hints());
+  hints_manager()->OnNavigationStartOrRedirect(navigation_handle.get(),
+                                               base::DoNothing());
+  RunUntilIdle();
+
+  optimization_guide::OptimizationTargetDecision unused_target_decision;
+  optimization_guide::OptimizationTypeDecision optimization_type_decision;
+  hints_manager()->CanApplyOptimization(
+      navigation_handle.get(),
+      optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      optimization_guide::proto::DEFER_ALL_SCRIPT, &unused_target_decision,
+      &optimization_type_decision, /*optimization_metadata=*/nullptr);
+
+  EXPECT_EQ(optimization_type_decision,
+            optimization_guide::OptimizationTypeDecision::kNoHintAvailable);
+}
+
+TEST_F(OptimizationGuideHintsManagerFetchingTest,
+       CanApplyOptimizationCalledPostFetchButFetchFailed) {
+  hints_manager()->RegisterOptimizationTypes(
+      {optimization_guide::proto::DEFER_ALL_SCRIPT});
+  InitializeWithDefaultConfig("1.0.0.0");
+
+  hints_manager()->SetHintsFetcherForTesting(
+      BuildTestHintsFetcher(HintsFetcherEndState::kFetchFailed));
+
+  // Set ECT estimate so fetch is activated.
+  hints_manager()->OnEffectiveConnectionTypeChanged(
+      net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
+  std::unique_ptr<content::MockNavigationHandle> navigation_handle =
+      CreateMockNavigationHandleWithOptimizationGuideWebContentsObserver(
+          url_without_hints());
+  hints_manager()->OnNavigationStartOrRedirect(navigation_handle.get(),
+                                               base::DoNothing());
+  RunUntilIdle();
+
+  optimization_guide::OptimizationTargetDecision unused_target_decision;
+  optimization_guide::OptimizationTypeDecision optimization_type_decision;
+  hints_manager()->CanApplyOptimization(
+      navigation_handle.get(),
+      optimization_guide::proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      optimization_guide::proto::DEFER_ALL_SCRIPT, &unused_target_decision,
+      &optimization_type_decision, /*optimization_metadata=*/nullptr);
+
+  EXPECT_EQ(optimization_type_decision,
+            optimization_guide::OptimizationTypeDecision::kNoHintAvailable);
+}
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 40812d3..6dbbacc3 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -205,14 +205,6 @@
   DISALLOW_COPY_AND_ASSIGN(FaviconUpdateWatcher);
 };
 
-// Constant used in the test HTML files.
-const char* kPassTitle = "PASS";
-
-std::string CreateClientRedirect(const std::string& dest_url) {
-  const char* const kClientRedirectBase = "/client-redirect?";
-  return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false);
-}
-
 std::string CreateServerRedirect(const std::string& dest_url) {
   const char* const kServerRedirectBase = "/server-redirect?";
   return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false);
@@ -249,17 +241,6 @@
   }
 }
 
-// Convenience function to wait for a title. Handles the case when the
-// WebContents already has the expected title.
-void WaitForASCIITitle(WebContents* web_contents,
-                       const char* expected_title_ascii) {
-  base::string16 expected_title = base::ASCIIToUTF16(expected_title_ascii);
-  if (web_contents->GetTitle() == expected_title)
-    return;
-  content::TitleWatcher title_watcher(web_contents, expected_title);
-  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
-}
-
 // Waits for the destruction of a RenderProcessHost's IPC channel.
 // Used to make sure the PrerenderLinkManager's OnChannelClosed function has
 // been called, before checking its state.
@@ -447,12 +428,6 @@
   DISALLOW_COPY_AND_ASSIGN(NewTabNavigationOrSwapObserver);
 };
 
-base::FilePath GetTestPath(const std::string& file_name) {
-  return ui_test_utils::GetTestFilePath(
-      base::FilePath(FILE_PATH_LITERAL("prerender")),
-      base::FilePath().AppendASCII(file_name));
-}
-
 }  // namespace
 
 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest {
@@ -1097,25 +1072,6 @@
   EXPECT_TRUE(IsEmptyPrerenderLinkManager());
 }
 
-// Checks that client redirects don't add alias URLs until after they commit.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap2) {
-  // Navigate to a page that then navigates to a URL that never commits.
-  const GURL kNoCommitUrl("http://never-respond.example.com");
-  base::FilePath file(GetTestPath("prerender_page.html"));
-
-  base::RunLoop prerender_start_loop;
-  CreateHangingFirstRequestInterceptor(kNoCommitUrl, file,
-                                       prerender_start_loop.QuitClosure());
-  DisableJavascriptCalls();
-  PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()),
-                   FINAL_STATUS_APP_TERMINATING, 1);
-  // Wait for the hanging request to be scheduled.
-  prerender_start_loop.Run();
-
-  // Navigating to the second URL should not swap.
-  NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB,
-                               false);
-}
 
 // Checks that plugins are not loaded while a page is being preloaded, but
 // are loaded when the page is displayed.
@@ -1370,31 +1326,6 @@
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender));
 }
 
-// Checks that audio loads are deferred on prerendering.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) {
-  PrerenderTestURL("/prerender/prerender_html5_audio.html", FINAL_STATUS_USED,
-                   1);
-  NavigateToDestURL();
-  WaitForASCIITitle(GetActiveWebContents(), kPassTitle);
-}
-
-// Checks that audio loads are deferred on prerendering and played back when
-// the prerender is swapped in if autoplay is set.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioAutoplay) {
-  PrerenderTestURL("/prerender/prerender_html5_audio_autoplay.html",
-                   FINAL_STATUS_USED, 1);
-  NavigateToDestURL();
-  WaitForASCIITitle(GetActiveWebContents(), kPassTitle);
-}
-
-// Checks that video loads are deferred on prerendering.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) {
-  PrerenderTestURL("/prerender/prerender_html5_video.html", FINAL_STATUS_USED,
-                   1);
-  NavigateToDestURL();
-  WaitForASCIITitle(GetActiveWebContents(), kPassTitle);
-}
-
 // TODO(jam): http://crbug.com/350550
 #if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER))
 
@@ -1431,24 +1362,6 @@
   ASSERT_TRUE(IsEmptyPrerenderLinkManager());
 }
 
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
-                       PrerenderPageWithRedirectedFragment) {
-  PrerenderTestURL(
-      CreateClientRedirect("/prerender/prerender_page.html#fragment"),
-      FINAL_STATUS_USED, 2);
-
-  ChannelDestructionWatcher channel_close_watcher;
-  channel_close_watcher.WatchChannel(browser()
-                                         ->tab_strip_model()
-                                         ->GetActiveWebContents()
-                                         ->GetMainFrame()
-                                         ->GetProcess());
-  NavigateToDestURL();
-  channel_close_watcher.WaitForChannelClose();
-
-  ASSERT_TRUE(IsEmptyPrerenderLinkManager());
-}
-
 // Checks that we do not use a prerendered page when navigating from
 // the main page to a fragment.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNavigateFragment) {
@@ -1477,26 +1390,6 @@
                                WindowOpenDisposition::CURRENT_TAB, false);
 }
 
-// Checks that we do not use a prerendered page when the page uses a client
-// redirect to refresh from a fragment on the same page.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
-                       PrerenderClientRedirectFromFragment) {
-  PrerenderTestURL(
-      CreateClientRedirect("/prerender/no_prerender_page.html#fragment"),
-      FINAL_STATUS_APP_TERMINATING, 2);
-  NavigateToURLWithDisposition("/prerender/no_prerender_page.html",
-                               WindowOpenDisposition::CURRENT_TAB, false);
-}
-
-// Checks that we do not use a prerendered page when the page uses a client
-// redirect to refresh to a fragment on the same page.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
-                       PrerenderClientRedirectToFragment) {
-  PrerenderTestURL(CreateClientRedirect("/prerender/no_prerender_page.html"),
-                   FINAL_STATUS_APP_TERMINATING, 2);
-  NavigateToURLWithDisposition("/prerender/no_prerender_page.html#fragment",
-                               WindowOpenDisposition::CURRENT_TAB, false);
-}
 
 // Checks that xhr PUT cancels prerenders.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) {
@@ -1635,16 +1528,6 @@
                    FINAL_STATUS_SAFE_BROWSING, 0);
 }
 
-// Ensures that client redirects to a malware page will cancel prerenders.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
-                       PrerenderSafeBrowsingClientRedirect) {
-  GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
-  GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
-      url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
-  PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"),
-                   FINAL_STATUS_SAFE_BROWSING, 1);
-}
-
 // Ensures that we do not prerender pages which have a malware subresource.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) {
   GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/namespace.js b/chrome/browser/resources/chromeos/camera/src/js/namespace.js
index 24571d9..a9127785 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/namespace.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/namespace.js
@@ -18,6 +18,7 @@
   nav: {},
   perf: {},
   proxy: {},
+  sound: {},
   state: {},
   toast: {},
   tooltip: {},
diff --git a/chrome/browser/resources/chromeos/camera/src/js/sound.js b/chrome/browser/resources/chromeos/camera/src/js/sound.js
index 755b576..36c5255c 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/sound.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/sound.js
@@ -2,31 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-'use strict';
-
-/**
- * Namespace for the Camera app.
- */
-var cca = cca || {};
-
-/**
- * Namespace for sound.
- */
-cca.sound = cca.sound || {};
-
 /**
  * Plays a sound.
  * @param {string} selector Selector of the sound.
  * @return {!Promise} Promise for waiting finishing playing or canceling wait.
  */
-cca.sound.play = function(selector) {
+export function play(selector) {
   // Use a timeout to wait for sound finishing playing instead of end-event
   // as it might not be played at all (crbug.com/135780).
   // TODO(yuli): Don't play sounds if the speaker settings is muted.
-  var cancel;
-  var p = new Promise((resolve, reject) => {
-    var element = document.querySelector(selector);
-    var timeout = setTimeout(resolve, Number(element.dataset.timeout || 0));
+  let cancel;
+  const p = new Promise((resolve, reject) => {
+    const element = document.querySelector(selector);
+    const timeout = setTimeout(resolve, Number(element.dataset.timeout || 0));
     cancel = () => {
       clearTimeout(timeout);
       reject(new Error('cancel'));
@@ -36,4 +24,7 @@
   });
   p.cancel = cancel;
   return p;
-};
+}
+
+/** @const */
+cca.sound.play = play;
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html
index 302358f..10330ae 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/main.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -21,7 +21,7 @@
     <script type="module" src="../js/toast.js"></script>
     <script type="module" src="../js/tooltip.js"></script>
     <script type="module" src="../js/state.js"></script>
-    <script defer src="../js/sound.js"></script>
+    <script type="module" src="../js/sound.js"></script>
     <script type="module" src="../js/device/error.js"></script>
     <script type="module" src="../js/device/camera3_device_info.js"></script>
     <script type="module" src="../js/device/constraints_preferrer.js"></script>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 3386e70e..ae464d1b 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -864,14 +864,18 @@
     if (configData.realboxEnabled) {
       const realboxEl = $(IDS.REALBOX);
       realboxEl.placeholder = configData.translatedStrings.searchboxPlaceholder;
+      // Using .onclick instead of addEventListener('click') to support tests.
+      realboxEl.onclick = onRealboxClick;
       realboxEl.addEventListener('copy', onRealboxCutCopy);
       realboxEl.addEventListener('cut', onRealboxCutCopy);
+      realboxEl.addEventListener('focus', onRealboxFocus);
       realboxEl.addEventListener('input', onRealboxInput);
+      realboxEl.addEventListener('keyup', onRealboxKeyup);
       realboxEl.addEventListener('paste', onRealboxPaste);
 
       const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
-      realboxWrapper.addEventListener('focusin', onRealboxWrapperFocusIn);
-      setRealboxWrapperListenForFocusOut(true);
+      realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
+      realboxWrapper.addEventListener('keydown', onRealboxWrapperKeydown);
 
       searchboxApiHandle.autocompleteresultchanged = autocompleteResultChanged;
 
@@ -1245,6 +1249,18 @@
   reloadTiles();
 }
 
+/** @param {Event} e */
+function onRealboxClick(e) {
+  if (!e.isTrusted || e.button !== 0) {
+    // Only handle main (generally left) button presses generated by a user
+    // action.
+    return;
+  }
+  if (!$(IDS.REALBOX).value) {
+    queryAutocomplete('');
+  }
+}
+
 /** @param {!Event} e */
 function onRealboxCutCopy(e) {
   const realboxEl = $(IDS.REALBOX);
@@ -1270,6 +1286,10 @@
   }
 }
 
+function onRealboxFocus() {
+  lastRealboxFocusTime = Date.now();
+}
+
 function onRealboxInput() {
   const realboxValue = $(IDS.REALBOX).value;
 
@@ -1279,37 +1299,36 @@
     queryAutocomplete(realboxValue);
   } else {
     setRealboxMatchesVisible(false);
-    setRealboxWrapperListenForKeydown(false);
     clearAutocompleteMatches();
   }
 
   pastedInRealbox = false;
 }
 
+/** @param {!Event} e */
+function onRealboxKeyup(e) {
+  if (e.key === 'Tab' && !$(IDS.REALBOX).value) {
+    queryAutocomplete('');
+  }
+}
+
 function onRealboxPaste() {
   pastedInRealbox = true;
 }
 
-/** @param {Event} e */
-function onRealboxWrapperFocusIn(e) {
-  if (e.target.matches(`#${IDS.REALBOX}`)) {
-    if (!$(IDS.REALBOX).value) {
-      queryAutocomplete('');
-    }
-    lastRealboxFocusTime = Date.now();
-  } else if (e.target.matches(`#${IDS.REALBOX_MATCHES} *`)) {
-    const target = /** @type {Element} */ (e.target);
-    const link = findAncestor(target, el => el.nodeName === 'A');
-    if (!link) {
-      return;
-    }
-    const selectedIndex = selectMatchEl(link);
-    // It doesn't really make sense to use fillFromMatch() here as the focus
-    // change drops the selection (and is probably just noisy to
-    // screenreaders).
-    const newFill = autocompleteResult.matches[selectedIndex].fillIntoEdit;
-    updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill});
+/** @param {!Event} e */
+function onRealboxMatchesFocusIn(e) {
+  const target = /** @type {Element} */ (e.target);
+  const link = findAncestor(target, el => el.nodeName === 'A');
+  if (!link) {
+    return;
   }
+  const selectedIndex = selectMatchEl(link);
+  // It doesn't really make sense to use fillFromMatch() here as the focus
+  // change drops the selection (and is probably just noisy to
+  // screenreaders).
+  const newFill = autocompleteResult.matches[selectedIndex].fillIntoEdit;
+  updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill});
 }
 
 /** @param {Event} e */
@@ -1329,9 +1348,7 @@
     // listening for key presses. These stale results should never be shown, but
     // correspond to the potentially stale suggestion left in the realbox when
     // blurred. That stale result may be navigated to by focusing and pressing
-    // Enter, and that match may be privileged, so we need to keep the data
-    // around in order to ascertain this. If matches are reshown, fresh
-    // autocomplete data will be fetched.
+    // Enter.
     window.chrome.embeddedSearch.searchBox.stopAutocomplete(
         /*clearResult=*/ false);
   }
@@ -1367,6 +1384,21 @@
     return;
   }
 
+  if (!areRealboxMatchesVisible()) {
+    if (key === 'ArrowUp' || key === 'ArrowDown') {
+      const realboxValue = $(IDS.REALBOX).value;
+      if (realboxValue.trim() || !realboxValue) {
+        queryAutocomplete(realboxValue);
+      }
+      e.preventDefault();
+      return;
+    }
+  }
+
+  if (!autocompleteResult || autocompleteResult.matches.length === 0) {
+    return;
+  }
+
   const realboxMatchesEl = $(IDS.REALBOX_MATCHES);
   const matchEls = Array.from(realboxMatchesEl.children);
   assert(matchEls.length > 0);
@@ -1394,17 +1426,6 @@
     return;
   }
 
-  if (!areRealboxMatchesVisible()) {
-    if (key === 'ArrowUp' || key === 'ArrowDown') {
-      const realboxValue = $(IDS.REALBOX).value;
-      if (realboxValue.trim()) {
-        queryAutocomplete(realboxValue);
-      }
-      e.preventDefault();
-    }
-    return;
-  }
-
   if (key === 'Delete') {
     if (e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
       const selectedMatch = autocompleteResult.matches[selected];
@@ -1424,7 +1445,6 @@
   if (key === 'Escape' && selected === 0) {
     updateRealboxOutput({inline: '', text: ''});
     setRealboxMatchesVisible(false);
-    setRealboxWrapperListenForKeydown(false);
     clearAutocompleteMatches();
     e.preventDefault();
     return;
@@ -1680,18 +1700,19 @@
   // focused element is being deleted from the DOM. Stop listening to 'focusout'
   // event and retore it immediately after since we don't want to stop
   // autocomplete in those cases.
-  setRealboxWrapperListenForFocusOut(false);
+  const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
+  realboxWrapper.removeEventListener('focusout', onRealboxWrapperFocusOut);
 
   $(IDS.REALBOX_MATCHES).remove();
   realboxMatchesEl.id = IDS.REALBOX_MATCHES;
+  realboxMatchesEl.addEventListener('focusin', onRealboxMatchesFocusIn);
 
-  $(IDS.REALBOX_INPUT_WRAPPER).appendChild(realboxMatchesEl);
+  realboxWrapper.appendChild(realboxMatchesEl);
 
-  setRealboxWrapperListenForFocusOut(true);
+  realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
 
   const hasMatches = matches.length > 0;
   setRealboxMatchesVisible(hasMatches);
-  setRealboxWrapperListenForKeydown(hasMatches);
 }
 
 /**
@@ -2003,26 +2024,6 @@
   $(IDS.REALBOX_INPUT_WRAPPER).classList.toggle(CLASSES.SHOW_MATCHES, visible);
 }
 
-/** @param {boolean} listen */
-function setRealboxWrapperListenForFocusOut(listen) {
-  const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
-  if (listen) {
-    realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut);
-  } else {
-    realboxWrapper.removeEventListener('focusout', onRealboxWrapperFocusOut);
-  }
-}
-
-/** @param {boolean} listen */
-function setRealboxWrapperListenForKeydown(listen) {
-  const realboxWrapper = $(IDS.REALBOX_INPUT_WRAPPER);
-  if (listen) {
-    realboxWrapper.addEventListener('keydown', onRealboxWrapperKeydown);
-  } else {
-    realboxWrapper.removeEventListener('keydown', onRealboxWrapperKeydown);
-  }
-}
-
 /**
  * Shows the error pop-up notification and triggers a delay to hide it. The
  * message will be set to |msg|. If |linkName| and |linkOnClick| are present,
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index 69a1bc4c..a3e3da6 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -168,10 +168,8 @@
         </settings-subpage>
       </template>
 
-      <template is="dom-if" route-path="/security">
-        <settings-subpage
-            id="security"
-            page-title="$i18n{securityPageTitle}">
+      <template is="dom-if" route-path="/security" no-search>
+        <settings-subpage id="security" page-title="$i18n{securityPageTitle}">
           <settings-security-page prefs="{{prefs}}"
               sync-status="[[syncStatus]]">
           </settings-security-page>
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index 8c73cd65..ac3f851 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1060,9 +1060,9 @@
       IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_ENTERPRISE);
 }
 
-base::string16
-ChromePasswordProtectionService::GetWarningDetailTextForSavedPasswords(
-    std::vector<size_t>* placeholder_offsets) const {
+std::vector<base::string16>
+ChromePasswordProtectionService::GetPlaceholdersForSavedPasswordWarningText()
+    const {
   const std::vector<std::string>& matching_domains =
       saved_passwords_matching_domains();
   const std::list<std::string>& spoofed_domains = common_spoofed_domains();
@@ -1092,7 +1092,14 @@
     placeholders.push_back(base::UTF8ToUTF16(matching_domains[idx]));
     domains_idx++;
   }
+  return placeholders;
+}
 
+base::string16
+ChromePasswordProtectionService::GetWarningDetailTextForSavedPasswords(
+    std::vector<size_t>* placeholder_offsets) const {
+  std::vector<base::string16> placeholders =
+      GetPlaceholdersForSavedPasswordWarningText();
   // If showing the saved passwords domain experiment is not on or if there is
   // are no saved domains, default to original saved passwords reuse warning.
   if (!base::FeatureList::IsEnabled(
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index aa2d6fe..26df847 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -174,6 +174,11 @@
       ReusedPasswordAccountType password_type,
       std::vector<size_t>* placeholder_offsets) const;
 
+  // Get placeholders for the warning detail text for saved password reuse
+  // warnings.
+  std::vector<base::string16> GetPlaceholdersForSavedPasswordWarningText()
+      const;
+
   // If password protection trigger is configured via enterprise policy, gets
   // the name of the organization that owns the enterprise policy. Otherwise,
   // returns an empty string.
diff --git a/chrome/browser/sync/test/integration/status_change_checker.cc b/chrome/browser/sync/test/integration/status_change_checker.cc
index 095012d..9176d65 100644
--- a/chrome/browser/sync/test/integration/status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/status_change_checker.cc
@@ -7,20 +7,38 @@
 #include <sstream>
 
 #include "base/bind.h"
+#include "base/command_line.h"
 #include "base/logging.h"
-#include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
-constexpr base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(30);
+constexpr base::TimeDelta kDefaultTimeout = base::TimeDelta::FromSeconds(30);
+
+base::TimeDelta GetTimeoutFromCommandLineOrDefault() {
+  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          "sync-status-change-checker-timeout")) {
+    return kDefaultTimeout;
+  }
+  std::string timeout_string(
+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+          "sync-status-change-checker-timeout"));
+  int timeout_in_seconds = 0;
+  if (!base::StringToInt(timeout_string, &timeout_in_seconds)) {
+    LOG(FATAL) << "Timeout value \"" << timeout_string << "\" was parsed as "
+               << timeout_in_seconds;
+  }
+  return base::TimeDelta::FromSeconds(timeout_in_seconds);
+}
 
 }  // namespace
 
 StatusChangeChecker::StatusChangeChecker()
-    : run_loop_(base::RunLoop::Type::kNestableTasksAllowed),
+    : timeout_(GetTimeoutFromCommandLineOrDefault()),
+      run_loop_(base::RunLoop::Type::kNestableTasksAllowed),
       timed_out_(false) {}
 
 StatusChangeChecker::~StatusChangeChecker() {}
@@ -63,7 +81,7 @@
   DCHECK(!run_loop_.running());
 
   base::OneShotTimer timer;
-  timer.Start(FROM_HERE, kTimeout,
+  timer.Start(FROM_HERE, timeout_,
               base::BindRepeating(&StatusChangeChecker::OnTimeout,
                                   base::Unretained(this)));
 
diff --git a/chrome/browser/sync/test/integration/status_change_checker.h b/chrome/browser/sync/test/integration/status_change_checker.h
index 8187b5a5..85c2778e 100644
--- a/chrome/browser/sync/test/integration/status_change_checker.h
+++ b/chrome/browser/sync/test/integration/status_change_checker.h
@@ -57,6 +57,7 @@
   // Called when the blocking wait timeout is exceeded.
   void OnTimeout();
 
+  const base::TimeDelta timeout_;
   base::RunLoop run_loop_;
   bool timed_out_;
 };
diff --git a/chrome/browser/sync/test/integration/sync_disabled_checker.cc b/chrome/browser/sync/test/integration/sync_disabled_checker.cc
new file mode 100644
index 0000000..9f2fc05
--- /dev/null
+++ b/chrome/browser/sync/test/integration/sync_disabled_checker.cc
@@ -0,0 +1,15 @@
+#include "chrome/browser/sync/test/integration/sync_disabled_checker.h"
+
+SyncDisabledChecker::SyncDisabledChecker(syncer::ProfileSyncService* service)
+    : SingleClientStatusChangeChecker(service) {}
+
+SyncDisabledChecker::~SyncDisabledChecker() = default;
+
+bool SyncDisabledChecker::IsExitConditionSatisfied(std::ostream* os) {
+  *os << "Waiting until sync is disabled."
+      << " IsSetupInProgress:" << service()->IsSetupInProgress()
+      << " IsFirstSetupComplete:"
+      << service()->GetUserSettings()->IsFirstSetupComplete();
+  return !service()->IsSetupInProgress() &&
+         !service()->GetUserSettings()->IsFirstSetupComplete();
+}
diff --git a/chrome/browser/sync/test/integration/sync_disabled_checker.h b/chrome/browser/sync/test/integration/sync_disabled_checker.h
new file mode 100644
index 0000000..26887ca
--- /dev/null
+++ b/chrome/browser/sync/test/integration/sync_disabled_checker.h
@@ -0,0 +1,22 @@
+// 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_SYNC_TEST_INTEGRATION_SYNC_DISABLED_CHECKER_H_
+#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_DISABLED_CHECKER_H_
+
+#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
+
+class SyncDisabledChecker : public SingleClientStatusChangeChecker {
+ public:
+  explicit SyncDisabledChecker(syncer::ProfileSyncService* service);
+
+  ~SyncDisabledChecker() override;
+  // StatusChangeChecker implementation.
+  bool IsExitConditionSatisfied(std::ostream* os) override;
+
+ private:
+  base::OnceClosure condition_satisfied_callback_;
+};
+
+#endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_DISABLED_CHECKER_H_
diff --git a/chrome/browser/sync/test/integration/sync_errors_test.cc b/chrome/browser/sync/test/integration/sync_errors_test.cc
index ec43fe5..53eb8ebd 100644
--- a/chrome/browser/sync/test/integration/sync_errors_test.cc
+++ b/chrome/browser/sync/test/integration/sync_errors_test.cc
@@ -3,13 +3,12 @@
 // found in the LICENSE file.
 
 #include "base/macros.h"
-#include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/sync/test/integration/bookmarks_helper.h"
 #include "chrome/browser/sync/test/integration/passwords_helper.h"
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
-#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
+#include "chrome/browser/sync/test/integration/sync_disabled_checker.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "chrome/common/pref_names.h"
@@ -27,31 +26,6 @@
 
 namespace {
 
-class SyncDisabledChecker : public SingleClientStatusChangeChecker {
- public:
-  explicit SyncDisabledChecker(ProfileSyncService* service)
-      : SingleClientStatusChangeChecker(service) {}
-
-  SyncDisabledChecker(ProfileSyncService* service,
-                      base::OnceClosure condition_satisfied_callback)
-      : SingleClientStatusChangeChecker(service),
-        condition_satisfied_callback_(std::move(condition_satisfied_callback)) {
-  }
-
-  bool IsExitConditionSatisfied(std::ostream* os) override {
-    *os << "Waiting until sync is disabled";
-    bool satisfied = !service()->IsSetupInProgress() &&
-                     !service()->GetUserSettings()->IsFirstSetupComplete();
-    if (satisfied && condition_satisfied_callback_) {
-      std::move(condition_satisfied_callback_).Run();
-    }
-    return satisfied;
-  }
-
- private:
-  base::OnceClosure condition_satisfied_callback_;
-};
-
 class SyncEngineStoppedChecker : public SingleClientStatusChangeChecker {
  public:
   explicit SyncEngineStoppedChecker(ProfileSyncService* service)
@@ -207,20 +181,16 @@
   // Now make one more change so we will do another sync.
   const BookmarkNode* node2 = AddFolder(0, 0, "title2");
   SetTitle(0, node2, "new_title2");
+  EXPECT_TRUE(SyncDisabledChecker(GetSyncService(0)).Wait());
+  syncer::SyncStatus status;
+  GetSyncService(0)->QueryDetailedSyncStatusForDebugging(&status);
 
-  auto condition = base::BindLambdaForTesting([&]() {
-    syncer::SyncStatus status;
-    GetSyncService(0)->QueryDetailedSyncStatusForDebugging(&status);
-
-    // Note: If SyncStandaloneTransport is enabled, then on receiving the error,
-    // the SyncService will immediately start up again in transport mode, which
-    // resets the status. So query the status that the checker recorded at the
-    // time Sync was off.
-    EXPECT_EQ(status.sync_protocol_error.error_type, syncer::NOT_MY_BIRTHDAY);
-    EXPECT_EQ(status.sync_protocol_error.action,
-              syncer::DISABLE_SYNC_ON_CLIENT);
-  });
-  EXPECT_TRUE(SyncDisabledChecker(GetSyncService(0), condition).Wait());
+  // Note: If SyncStandaloneTransport is enabled, then on receiving the error,
+  // the SyncService will immediately start up again in transport mode, which
+  // resets the status. So query the status that the checker recorded at the
+  // time Sync was off.
+  EXPECT_EQ(status.sync_protocol_error.error_type, syncer::NOT_MY_BIRTHDAY);
+  EXPECT_EQ(status.sync_protocol_error.action, syncer::DISABLE_SYNC_ON_CLIENT);
 }
 
 // Tests that on receiving CLIENT_DATA_OBSOLETE sync engine gets restarted and
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index f91872e9..f8a96fb 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -32,6 +32,7 @@
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
 #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
+#include "chrome/browser/sync/test/integration/sync_disabled_checker.h"
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "chrome/browser/ui/browser.h"
@@ -941,7 +942,17 @@
     // clearing.
     SetupSyncNoWaitingForCompletion();
     GetClient(0)->ResetSyncForPrimaryAccount();
-    GetClient(0)->StopSyncServiceAndClearData();
+    // After reset account, the client should get a NOT_MY_BIRTHDAY error
+    // and disable sync. Adding a wait to make sure this is propagated.
+    ASSERT_TRUE(SyncDisabledChecker(GetSyncService(0)).Wait());
+    CloseBrowserSynchronously(browsers_[0]);
+    // After reset, this client will disable sync. It may log some messages
+    // that do not contribute to test failures. It includes:
+    //   PostClientToServerMessage with SERVER_RETURN_NOT_MY_BIRTHDAY
+    //   PostClientToServerMessage with NETWORK_CONNECTION_UNAVAILABLE
+    //   mcs_client fails with 401.
+    LOG(WARNING) << "Finished reset account. Warning logs before "
+                 << "this log may be safe to ignore.";
     ClearProfiles();
     use_new_user_data_dir_ = old_use_new_user_data_dir;
     num_clients_ = old_num_clients;
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc
index 74d8d15..12e252c 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_arc_tracker.cc
@@ -201,7 +201,8 @@
   state = static_cast<apps::InstanceState>(
       state | apps::InstanceState::kStarted | apps::InstanceState::kRunning);
   app_service_controller_->app_service_instance_helper()->OnInstances(
-      arc_app_id, window, std::string(), state);
+      task_id_to_arc_app_window_info_[task_id]->app_shelf_id().ToString(),
+      window, std::string(), state);
 }
 
 void AppServiceAppWindowArcTracker::OnTaskDescriptionUpdated(
@@ -384,6 +385,9 @@
 }
 
 ash::ShelfID AppServiceAppWindowArcTracker::GetShelfId(int task_id) const {
+  if (observed_profile_ != app_service_controller_->owner()->profile())
+    return ash::ShelfID();
+
   const auto it = task_id_to_arc_app_window_info_.find(task_id);
   if (it == task_id_to_arc_app_window_info_.end())
     return ash::ShelfID();
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_crostini_tracker.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_crostini_tracker.cc
index ba050ef..cbf38d98 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_crostini_tracker.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_crostini_tracker.cc
@@ -8,6 +8,8 @@
 #include "ash/public/cpp/shelf_model.h"
 #include "base/containers/flat_tree.h"
 #include "base/time/time.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/chromeos/crostini/crostini_force_close_watcher.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h"
@@ -221,6 +223,19 @@
         crostini::CrostiniAppIdFromAppName(browser->app_name());
     if (!app_id)
       return std::string();
+
+    // The browser window could be added to InstanceRegistry using Chrome
+    // application's app id, so if the window is for Crostini app, e.g.
+    // terminal, the Chrome instance should be deleted, otherwise, it could
+    // cause inconsistent error.
+    auto* proxy_ = apps::AppServiceProxyFactory::GetForProfile(
+        app_service_controller_->owner()->profile());
+    const ash::ShelfID shelf_id = proxy_->InstanceRegistry().GetShelfId(window);
+    if (shelf_id.app_id != app_id) {
+      app_service_controller_->app_service_instance_helper()->OnInstances(
+          shelf_id.app_id, window, std::string(),
+          apps::InstanceState::kDestroyed);
+    }
     return app_id.value();
   }
 
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
index 5446c97..84fef89 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "ash/public/cpp/app_list/internal_app_id_constants.h"
+#include "ash/public/cpp/app_types.h"
 #include "ash/public/cpp/multi_user_window_manager.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/window_properties.h"
@@ -27,10 +28,12 @@
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_helper.h"
 #include "chrome/services/app_service/public/cpp/instance.h"
+#include "chrome/services/app_service/public/mojom/types.mojom-shared.h"
 #include "chrome/services/app_service/public/mojom/types.mojom.h"
 #include "components/account_id/account_id.h"
 #include "components/arc/arc_util.h"
 #include "extensions/common/constants.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/views/widget/widget.h"
@@ -268,6 +271,13 @@
       (update.State() & apps::InstanceState::kDestroyed) ==
           apps::InstanceState::kUnknown) {
     std::string app_id = update.AppId();
+    if (proxy_->AppRegistryCache().GetAppType(app_id) ==
+            apps::mojom::AppType::kCrostini ||
+        base::StartsWith(app_id, crostini::kCrostiniAppIdPrefix,
+                         base::CompareCase::SENSITIVE)) {
+      window->SetProperty(aura::client::kAppType,
+                          static_cast<int>(ash::AppType::CROSTINI_APP));
+    }
     window->SetProperty(ash::kAppIDKey, update.AppId());
     window->SetProperty(ash::kShelfIDKey, shelf_id.Serialize());
     window->SetProperty<int>(ash::kShelfItemTypeKey, ash::TYPE_APP);
@@ -510,7 +520,15 @@
       return ash::ShelfID(shelf_app_id);
   }
 
+  if (plugin_vm::IsPluginVmWindow(window))
+    return ash::ShelfID(plugin_vm::kPluginVmAppId);
+
   ash::ShelfID shelf_id;
+  if (arc_tracker_)
+    shelf_id = arc_tracker_->GetShelfId(arc::GetWindowTaskId(window));
+
+  if (!shelf_id.IsNull())
+    return shelf_id;
 
   // If the window exists in InstanceRegistry, get the shelf id from
   // InstanceRegistry.
@@ -554,13 +572,6 @@
     }
   }
 
-  // For null shelf id, it could be VM window or ARC apps window.
-  if (plugin_vm::IsPluginVmWindow(window))
-    return ash::ShelfID(plugin_vm::kPluginVmAppId);
-
-  if (arc_tracker_)
-    return arc_tracker_->GetShelfId(arc::GetWindowTaskId(window));
-
   return shelf_id;
 }
 
diff --git a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
index f5c500b..da6d01c 100644
--- a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
@@ -375,9 +375,10 @@
   DISALLOW_COPY_AND_ASSIGN(ArcAppDeferredLauncherWithParamsBrowserTest);
 };
 
+// TODO(crbug.com/1038602): Fix this flaky test, and enable it again.
 // This tests simulates normal workflow for starting ARC app in deferred mode.
 IN_PROC_BROWSER_TEST_P(ArcAppDeferredLauncherWithParamsBrowserTest,
-                       StartAppDeferred) {
+                       DISABLED_StartAppDeferred) {
   // Install app to remember existing apps.
   StartInstance();
   InstallTestApps(kTestAppPackage, false);
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
index c104927..3f9f26b 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
@@ -323,18 +323,7 @@
          DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE});
     FillAndSubmitFormWithCard(card_number);
     WaitForObservedEvent();
-    if (base::FeatureList::IsEnabled(
-            features::kAutofillEnableToolbarStatusChip)) {
-      // Wait for animations to finish.
-      base::RunLoop loop;
-      static_cast<views::AnimatingLayoutManager*>(
-          BrowserView::GetBrowserViewForBrowser(browser())
-              ->toolbar()
-              ->toolbar_account_icon_container()
-              ->GetLayoutManager())
-          ->PostOrQueueAction(loop.QuitClosure());
-      loop.Run();
-    }
+    WaitForAnimationToComplete();
   }
 
   void ClickOnSaveButtonAndWaitForMigrationResults() {
@@ -511,6 +500,21 @@
 
   void WaitForCardDeletion() { WaitForPersonalDataChange(browser()); }
 
+  void WaitForAnimationToComplete() {
+    if (base::FeatureList::IsEnabled(
+            features::kAutofillEnableToolbarStatusChip)) {
+      // Wait for animations to finish.
+      base::RunLoop loop;
+      static_cast<views::AnimatingLayoutManager*>(
+          BrowserView::GetBrowserViewForBrowser(browser())
+              ->toolbar()
+              ->toolbar_account_icon_container()
+              ->GetLayoutManager())
+          ->PostOrQueueAction(loop.QuitClosure());
+      loop.Run();
+    }
+  }
+
   std::unique_ptr<
       base::CallbackList<void(content::BrowserContext*)>::Subscription>
       will_create_browser_context_services_subscription_;
@@ -1095,12 +1099,14 @@
   AddTabAtIndex(1, GURL("http://example.com/"), ui::PAGE_TRANSITION_TYPED);
   TabStripModel* tab_model = browser()->tab_strip_model();
   tab_model->ActivateTabAt(1, {TabStripModel::GestureType::kOther});
+  WaitForAnimationToComplete();
 
   // Ensures bubble and icon go away if user navigates to another tab.
   EXPECT_FALSE(GetLocalCardMigrationIconView()->GetVisible());
   EXPECT_FALSE(GetLocalCardMigrationOfferBubbleViews());
 
   tab_model->ActivateTabAt(0, {TabStripModel::GestureType::kOther});
+  WaitForAnimationToComplete();
 
   // If the user navigates back, shows only the icon not the bubble.
   EXPECT_TRUE(GetLocalCardMigrationIconView()->GetVisible());
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index 776e07a..26fb56f3 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -2458,12 +2458,14 @@
   AddTabAtIndex(1, GURL("http://example.com/"), ui::PAGE_TRANSITION_TYPED);
   TabStripModel* tab_model = browser()->tab_strip_model();
   tab_model->ActivateTabAt(1, {TabStripModel::GestureType::kOther});
+  WaitForAnimationToEnd();
 
   // Ensures bubble and icon go away if user navigates to another tab.
   EXPECT_FALSE(GetSaveCardIconView()->GetVisible());
   EXPECT_FALSE(GetSaveCardBubbleViews());
 
   tab_model->ActivateTabAt(0, {TabStripModel::GestureType::kOther});
+  WaitForAnimationToEnd();
 
   // If the user navigates back, shows only the icon not the bubble.
   EXPECT_TRUE(GetSaveCardIconView()->GetVisible());
diff --git a/chrome/browser/ui/views/frame/top_container_background.cc b/chrome/browser/ui/views/frame/top_container_background.cc
index 2a5fa78a..d0a236d5 100644
--- a/chrome/browser/ui/views/frame/top_container_background.cc
+++ b/chrome/browser/ui/views/frame/top_container_background.cc
@@ -30,7 +30,8 @@
 
     canvas->TileImageInt(*theme_provider->GetImageSkiaNamed(IDR_THEME_TOOLBAR),
                          pos.x(), pos.y(), bounds.x(), bounds.y(),
-                         bounds.width(), bounds.height());
+                         bounds.width(), bounds.height(), 1.0f,
+                         SkTileMode::kRepeat, SkTileMode::kMirror);
   } else {
     canvas->DrawColor(theme_provider->GetColor(ThemeProperties::COLOR_TOOLBAR));
   }
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
index 63790d2..48b7c642 100644
--- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
@@ -148,12 +148,15 @@
     service_->AddObserver(this);
 
   std::vector<size_t> placeholder_offsets;
+
   if (password_type.account_type() ==
       ReusedPasswordAccountType::SAVED_PASSWORD) {
     const base::string16 message_body =
         service_->GetWarningDetailText(password_type, &placeholder_offsets);
-    CreateSavedPasswordReuseModalWarningDialog(message_body,
-                                               placeholder_offsets);
+
+    CreateSavedPasswordReuseModalWarningDialog(
+        message_body, service_->GetPlaceholdersForSavedPasswordWarningText(),
+        placeholder_offsets);
   } else {
     views::Label* message_body_label = CreateMessageBodyLabel(
         service_
@@ -172,6 +175,7 @@
 void PasswordReuseModalWarningDialog::
     CreateSavedPasswordReuseModalWarningDialog(
         const base::string16 message_body,
+        std::vector<base::string16> placeholders,
         std::vector<size_t> placeholder_offsets) {
   SetLayoutManager(std::make_unique<BoxLayout>(
       views::BoxLayout::Orientation::kVertical, gfx::Insets(),
@@ -186,17 +190,10 @@
       new views::StyledLabel(message_body, nullptr);
   views::StyledLabel::RangeStyleInfo bold_style;
   bold_style.text_style = STYLE_EMPHASIZED;
-  const std::vector<std::string>& domains =
-      service_->saved_passwords_matching_domains();
-  std::vector<base::string16> converted_domains;
-  for (size_t idx = 0; idx < placeholder_offsets.size() && idx < 3; idx++) {
-    converted_domains.push_back(base::UTF8ToUTF16(domains[idx]));
-  }
   for (size_t idx = 0; idx < placeholder_offsets.size(); idx++) {
     styled_message_body_label->AddStyleRange(
-        gfx::Range(
-            placeholder_offsets[idx],
-            placeholder_offsets[idx] + converted_domains.at(idx).length()),
+        gfx::Range(placeholder_offsets[idx],
+                   placeholder_offsets[idx] + placeholders.at(idx).length()),
         bold_style);
   }
   styled_message_body_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.h b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.h
index 7c67ad4f..662bed2 100644
--- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.h
+++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.h
@@ -35,6 +35,7 @@
 
   void CreateSavedPasswordReuseModalWarningDialog(
       const base::string16 message_body,
+      std::vector<base::string16> placeholders,
       std::vector<size_t> placeholder_offsets);
   void CreateGaiaPasswordReuseModalWarningDialog(
       views::Label* message_body_label);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
index e149a5c6..f8ecf69 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
@@ -46,16 +46,17 @@
   params.page_action_icon_delegate = this;
   params.button_observer = this;
   params.view_observer = this;
-  avatar_->SetProperty(views::kFlexBehaviorKey,
-                       views::FlexSpecification::ForSizeRule(
-                           views::MinimumFlexSizeRule::kScaleToMinimum,
-                           views::MaximumFlexSizeRule::kPreferred));
   AddMainButton(avatar_);
 
   // Since the insertion point for icons before the avatar button, we don't
   // initialize until after the avatar button has been added.
   page_action_icon_controller_ = std::make_unique<PageActionIconController>();
   page_action_icon_controller_->Init(params, this);
+
+  avatar_->SetProperty(views::kFlexBehaviorKey,
+                       views::FlexSpecification::ForSizeRule(
+                           views::MinimumFlexSizeRule::kScaleToMinimum,
+                           views::MaximumFlexSizeRule::kPreferred));
 }
 
 ToolbarAccountIconContainerView::~ToolbarAccountIconContainerView() = default;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
index 6dedb1d..c39503cf2 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
@@ -27,6 +27,8 @@
   views::AnimatingLayoutManager* animating_layout =
       SetLayoutManager(std::make_unique<views::AnimatingLayoutManager>());
   animating_layout->SetShouldAnimateBounds(true);
+  animating_layout->SetDefaultFadeMode(
+      views::AnimatingLayoutManager::FadeInOutMode::kSlideFromTrailingEdge);
   auto* flex_layout = animating_layout->SetTargetLayoutManager(
       std::make_unique<views::FlexLayout>());
   flex_layout->SetCollapseMargins(true)
diff --git a/chrome/credential_provider/gaiacp/dllmain.cc b/chrome/credential_provider/gaiacp/dllmain.cc
index 8e78d39..e51c9c8 100644
--- a/chrome/credential_provider/gaiacp/dllmain.cc
+++ b/chrome/credential_provider/gaiacp/dllmain.cc
@@ -197,10 +197,6 @@
     return;
   }
 
-  hr = credential_provider::CGaiaCredentialBase::SaveAccountInfo(*properties);
-  if (FAILED(hr))
-    LOGFN(ERROR) << "SaveAccountInfoW hr=" << putHR(hr);
-
   // Make sure COM is initialized in this thread. This thread must be
   // initialized as an MTA or the call to enroll with MDM causes a crash in COM.
   base::win::ScopedCOMInitializer com_initializer(
@@ -209,6 +205,10 @@
     HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
     LOGFN(ERROR) << "ScopedCOMInitializer failed hr=" << putHR(hr);
   } else {
+    hr = credential_provider::CGaiaCredentialBase::SaveAccountInfo(*properties);
+    if (FAILED(hr))
+      LOGFN(ERROR) << "SaveAccountInfoW hr=" << putHR(hr);
+
     // Try to enroll the machine to MDM here. MDM requires a user to be signed
     // on to an interactive session to succeed and when we call this function
     // the user should have been successfully signed on at that point and able
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 28cf1f16..e38196f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2884,12 +2884,19 @@
 group("performance_test_suite") {
   testonly = true
   deps = [
+    "//chrome/test:angle_perftests",
     "//chrome/test:telemetry_perf_tests",
     "//components:components_perftests",
     "//components/tracing:tracing_perftests",
+    "//gpu:command_buffer_perftests",
+    "//gpu:command_buffer_perftests",
     "//gpu:gpu_perftests",
   ]
 
+  if (!is_android && !is_fuchsia) {
+    deps += [ "//chrome/test:load_library_perf_tests" ]
+  }
+
   data_deps = [
     "//testing:run_perf_test",
   ]
@@ -6087,6 +6094,8 @@
       "../browser/sync/test/integration/sync_app_helper.h",
       "../browser/sync/test/integration/sync_datatype_helper.cc",
       "../browser/sync/test/integration/sync_datatype_helper.h",
+      "../browser/sync/test/integration/sync_disabled_checker.cc",
+      "../browser/sync/test/integration/sync_disabled_checker.h",
       "../browser/sync/test/integration/sync_extension_helper.cc",
       "../browser/sync/test/integration/sync_extension_helper.h",
       "../browser/sync/test/integration/sync_extension_installer.cc",
diff --git a/chrome/test/chromedriver/js/get_element_location_test.html b/chrome/test/chromedriver/js/get_element_location_test.html
index c2cfc0a..97fa90d 100644
--- a/chrome/test/chromedriver/js/get_element_location_test.html
+++ b/chrome/test/chromedriver/js/get_element_location_test.html
@@ -7,7 +7,7 @@
   background: blue;
   width: 300px;
   height: 300px;
-  top: 300px;
+  top: 150px;
   left: 100px;
 }
 
@@ -30,7 +30,7 @@
   var parent = document.getElementById('parent');
   var location = getElementLocation(parent, true);
   var x = 100 + 0.5 * 300;
-  var y = 300 + 0.5 * 300;
+  var y = 150 + 0.5 * 300;
   assertEquals(Math.floor(x), Math.floor(location.x));
   assertEquals(Math.floor(y), Math.floor(location.y));
 }
@@ -39,7 +39,7 @@
   var child = document.getElementById('child');
   var location = getElementLocation(child, true);
   var x = 150 + 0.5 * 200;
-  var y = 360 + 0.5 * 100;
+  var y = 210 + 0.5 * 100;
   assertEquals(Math.floor(x), Math.floor(location.x));
   assertEquals(Math.floor(y), Math.floor(location.y));
 }
@@ -48,7 +48,7 @@
   var parent = document.getElementById('parent');
   var location = getElementLocation(parent, false);
   var x = 100;
-  var y = 300;
+  var y = 150;
   assertEquals(Math.floor(x), Math.floor(location.x));
   assertEquals(Math.floor(y), Math.floor(location.y));
 }
@@ -57,7 +57,7 @@
   var child = document.getElementById('child');
   var location = getElementLocation(child, false);
   var x = 150;
-  var y = 360;
+  var y = 210;
   assertEquals(Math.floor(x), Math.floor(location.x));
   assertEquals(Math.floor(y), Math.floor(location.y));
 }
@@ -66,7 +66,7 @@
 <body>
 <h2>position: absolute;</h2>
 <p>The Parent element has position: absolute.</p>
-<div id="parent">Parent: position: absolute, top: 300px, left: 100px.
+<div id="parent">Parent: position: absolute, top: 150px, left: 100px.
   <div id="child">Child: position: absolute, top: 60px, left: 50px.</div>
 </div>
 </body>
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 09bcdad..c8863f16 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -80,8 +80,6 @@
     'ChromeDriverPageLoadTimeoutTest.testRefreshWithPageLoadTimeout',
     # testFocus is failing
     'JavaScriptTests.testFocus',
-    # https://bugs.chromium.org/p/chromium/issues/detail?id=1038366
-    'JavaScriptTests.testAllJS',
 ]
 
 
@@ -237,6 +235,8 @@
         'ChromeDriverTest.testPushAndNotificationsPermissions',
         'ChromeDriverTest.testSensorPermissions',
         'ChromeDriverTest.testSettingPermissionDoesNotAffectOthers',
+        # Android does not allow changing window size
+        'JavaScriptTests.*',
     ]
 )
 _ANDROID_NEGATIVE_FILTER['chrome_stable'] = (
@@ -4212,6 +4212,7 @@
   def setUp(self):
     self._driver = self.CreateDriver()
     self.js_root = os.path.dirname(os.path.realpath(__file__)) + '/../js/'
+    self._driver.SetWindowRect(1000, 1000, 0, 0)
 
   def checkTestResult(self):
     def getStatus():
diff --git a/chrome/test/data/local_ntp/realbox_browsertest.js b/chrome/test/data/local_ntp/realbox_browsertest.js
index 4fcaa3bc..c56e4f4 100644
--- a/chrome/test/data/local_ntp/realbox_browsertest.js
+++ b/chrome/test/data/local_ntp/realbox_browsertest.js
@@ -172,12 +172,74 @@
   assertEquals(test.realbox.queries.length, 0);
 };
 
+test.realbox1.testFocusDoesntQueryAutocomplete = function() {
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
+  assertEquals(0, test.realbox.queries.length);
+};
+
+test.realbox1.testTabbingWhenNonEmptyDoesntQueryAutocomplete = function() {
+  test.realbox.realboxEl.value = '   ';
+
+  // Give the realbox focus programmatically.
+  test.realbox.realboxEl.focus();
+
+  test.realbox.realboxEl.dispatchEvent(new KeyboardEvent(
+      'keyup', {bubbles: true, cancelable: true, key: 'Tab'}));
+  assertEquals(0, test.realbox.queries.length);
+};
+
 test.realbox1.testSpacesDontQueryAutocomplete = function() {
   test.realbox.realboxEl.value = '   ';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
   assertEquals(test.realbox.queries.length, 0);
 };
 
+test.realbox1.testTabbingWhenEmptyQueriesAutocomplete = function() {
+  // Give the realbox focus programmatically.
+  test.realbox.realboxEl.focus();
+
+  test.realbox.realboxEl.dispatchEvent(new KeyboardEvent(
+      'keyup', {bubbles: true, cancelable: true, key: 'Tab'}));
+  assertEquals(1, test.realbox.queries.length);
+  assertEquals('', test.realbox.queries[0].input);
+};
+
+test.realbox1.testArrowUpDownQueryAutocomplete = function() {
+  test.realbox.realboxEl.dispatchEvent(new KeyboardEvent('keydown', {
+    bubbles: true,
+    cancelable: true,
+    key: 'ArrowUp',
+  }));
+  assertEquals(1, test.realbox.queries.length);
+  assertEquals('', test.realbox.queries[0].input);
+
+  test.realbox.realboxEl.value = 'hello';
+  test.realbox.realboxEl.dispatchEvent(new KeyboardEvent('keydown', {
+    bubbles: true,
+    cancelable: true,
+    key: 'ArrowDown',
+  }));
+  assertEquals(2, test.realbox.queries.length);
+  assertEquals(test.realbox.realboxEl.value, test.realbox.queries[1].input);
+};
+
+test.realbox1.testLeftClickWhenEmptyQueriesAutocomplete = function() {
+  test.realbox.realboxEl.onclick(test.realbox.trustedEventFacade(
+      'click', {button: 1, target: test.realbox.realboxEl}));
+  assertEquals(0, test.realbox.queries.length);
+
+  test.realbox.realboxEl.value = '   ';
+  test.realbox.realboxEl.onclick(test.realbox.trustedEventFacade(
+      'click', {button: 0, target: test.realbox.realboxEl}));
+  assertEquals(0, test.realbox.queries.length);
+
+  test.realbox.realboxEl.value = '';
+  test.realbox.realboxEl.onclick(test.realbox.trustedEventFacade(
+      'click', {button: 0, target: test.realbox.realboxEl}));
+  assertEquals(1, test.realbox.queries.length);
+  assertEquals('', test.realbox.queries[0].input);
+};
+
 test.realbox1.testInputSentAsQuery = function() {
   test.realbox.realboxEl.value = 'hello realbox';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
@@ -755,7 +817,7 @@
 };
 
 test.realbox2.testPressEnterOnSelectedMatch = function() {
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {bubbles: true}));
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
   test.realbox.realboxEl.value = 'hello world';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
 
@@ -787,7 +849,7 @@
 };
 
 test.realbox2.testPressEnterTooQuickly = function() {
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {bubbles: true}));
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
   test.realbox.realboxEl.value = 'hello';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
 
@@ -945,11 +1007,7 @@
     relatedTarget: document.body,
   }));
 
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {
-    bubbles: true,
-    cancelable: true,
-    target: test.realbox.realboxEl,
-  }));
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
 
   let clicked = false;
   matchEls[1].onclick = () => clicked = true;
@@ -1002,15 +1060,9 @@
 };
 
 test.realbox2.testInputAfterFocusoutZeroPrefixMatches = function() {
-  test.realbox.realboxEl.value = '';
-  test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
-
-  // Empty input doesn't query autocomplete.
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {
-    bubbles: true,
-    cancelable: true,
-    target: test.realbox.realboxEl,
-  }));
+  // Trigger zero suggest querying autocomplete.
+  test.realbox.realboxEl.onclick(test.realbox.trustedEventFacade(
+      'click', {button: 0, target: test.realbox.realboxEl}));
   assertEquals(1, test.realbox.queries.length);
 
   chrome.embeddedSearch.searchBox.autocompleteresultchanged({
@@ -1061,11 +1113,7 @@
 
   assertFalse(test.realbox.areMatchesShowing());
 
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {
-    bubbles: true,
-    cancelable: true,
-    target: test.realbox.realboxEl,
-  }));
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
 
   const arrowDown = new KeyboardEvent('keydown', {
     bubbles: true,
@@ -1088,7 +1136,7 @@
 
 // Test that trying to open e.g. chrome:// links goes through the mojo API.
 test.realbox2.testPrivilegedDestinationUrls = function() {
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {bubbles: true}));
+  test.realbox.realboxEl.dispatchEvent(new Event('focus'));
   test.realbox.realboxEl.value = 'about';
   test.realbox.realboxEl.dispatchEvent(new CustomEvent('input'));
 
@@ -1148,10 +1196,8 @@
   assertFalse(!!realboxIcon.style.backgroundImage);
 
   // Trigger zero suggest querying autocomplete.
-  test.realbox.realboxEl.dispatchEvent(new Event('focusin', {
-    bubbles: true,
-    target: test.realbox.realboxEl,
-  }));
+  test.realbox.realboxEl.onclick(test.realbox.trustedEventFacade(
+      'click', {button: 0, target: test.realbox.realboxEl}));
   assertEquals(1, test.realbox.queries.length);
 
   chrome.embeddedSearch.searchBox.autocompleteresultchanged({
diff --git a/chrome/test/data/prerender/bear.ogv b/chrome/test/data/prerender/bear.ogv
deleted file mode 100644
index b2e1134..0000000
--- a/chrome/test/data/prerender/bear.ogv
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/prerender/bear.wav b/chrome/test/data/prerender/bear.wav
deleted file mode 100644
index 1870eed..0000000
--- a/chrome/test/data/prerender/bear.wav
+++ /dev/null
Binary files differ
diff --git a/chrome/test/data/prerender/prerender_html5_audio.html b/chrome/test/data/prerender/prerender_html5_audio.html
deleted file mode 100644
index d9cce45e..0000000
--- a/chrome/test/data/prerender/prerender_html5_audio.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<html>
-  <!--
-  This test checks that <audio> tags are deferred during prerendering.
-  -->
-<head>
-<title>Prerender for HTML5 audio.</title>
-</head>
-
-<body>
-<audio id="mediaEl" src="bear.wav" controls>
-</audio>
-
-<script>
-  var willPlay = false;
-  var testNetworkEvents = false;
-</script>
-
-<script src="prerender_html5_common.js"></script>
-
-</body>
-</html>
diff --git a/chrome/test/data/prerender/prerender_html5_audio_autoplay.html b/chrome/test/data/prerender/prerender_html5_audio_autoplay.html
deleted file mode 100644
index 40c9bee..0000000
--- a/chrome/test/data/prerender/prerender_html5_audio_autoplay.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<html>
-  <!--
-  This test checks that:
-    - Audio tags are deferred during prerendering.
-    - The audio starts playing on page swap in when autoplay is set.
-  -->
-<head>
-<title>Prerender for HTML5 audio.</title>
-</head>
-
-<body>
-<audio id="mediaEl" src="bear.wav" controls autoplay>
-</audio>
-
-<script>
-  var willPlay = true;
-  var testNetworkEvents = false;
-</script>
-
-<script src="prerender_html5_common.js"></script>
-
-</body>
-</html>
diff --git a/chrome/test/data/prerender/prerender_html5_video.html b/chrome/test/data/prerender/prerender_html5_video.html
deleted file mode 100644
index ef55c98..0000000
--- a/chrome/test/data/prerender/prerender_html5_video.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<html>
-  <!--
-  This test checks that video tags are deferred during prerendering.
-  -->
-<head>
-<title>Prerender for HTML5 video.</title>
-</head>
-
-<body>
-<video id="mediaEl" src="bear.ogv" controls>
-</video>
-
-<script>
-  var willPlay = false;
-  var testNetworkEvents = false;
-</script>
-
-<script src="prerender_html5_common.js"></script>
-
-</body>
-</html>
diff --git a/chrome/test/data/prerender/prerender_html5_video_script.html b/chrome/test/data/prerender/prerender_html5_video_script.html
deleted file mode 100644
index f144837..0000000
--- a/chrome/test/data/prerender/prerender_html5_video_script.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<html>
-  <!--
-  This test checks that video tags created by javascript are are deferred
-  during prerendering and the autoplay is enabled during swap ins.
-  -->
-<head>
-<title>Prerender for HTML5 video.</title>
-</head>
-
-<body>
-<div id="vid">
-</div>
-
-<script>
-  var videoTag = document.createElement("video");
-  videoTag.src = "bear.ogv"
-  videoTag.id = "mediaEl";
-  var element = document.getElementById("vid");
-  element.appendChild(videoTag);
-
-  var willPlay = true;
-  var testNetworkEvents = false;
-</script>
-
-<script src="prerender_html5_common.js"></script>
-
-<script>
-  document.getElementById("mediaEl").play();
-</script>
-
-</body>
-</html>
diff --git a/chromecast/media/audio/capture_service/constants.h b/chromecast/media/audio/capture_service/constants.h
index 2e81556..ccfd6c9 100644
--- a/chromecast/media/audio/capture_service/constants.h
+++ b/chromecast/media/audio/capture_service/constants.h
@@ -5,6 +5,8 @@
 #ifndef CHROMECAST_MEDIA_AUDIO_CAPTURE_SERVICE_CONSTANTS_H_
 #define CHROMECAST_MEDIA_AUDIO_CAPTURE_SERVICE_CONSTANTS_H_
 
+#include <cstdint>
+
 namespace chromecast {
 namespace media {
 namespace capture_service {
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc
index fd012cd..a8d7a2b 100644
--- a/chromeos/network/network_state_handler.cc
+++ b/chromeos/network/network_state_handler.cc
@@ -1413,6 +1413,7 @@
   if (key == shill::kSignalStrengthProperty || key == shill::kWifiBSsid ||
       key == shill::kWifiFrequency ||
       key == shill::kWifiFrequencyListProperty ||
+      key == shill::kNetworkTechnologyProperty ||
       (key == shill::kDeviceProperty && value_str == "/")) {
     // Uninteresting update. This includes 'Device' property changes to "/"
     // (occurs before just a service is removed).
@@ -1421,9 +1422,12 @@
       return;
     // Otherwise do not trigger 'default network changed'.
     notify_default = false;
-    // Notify signal strength changes for active networks.
-    if (key == shill::kSignalStrengthProperty)
+    // Notify signal strength and network technology changes for active
+    // networks.
+    if (key == shill::kSignalStrengthProperty ||
+        key == shill::kNetworkTechnologyProperty) {
       notify_active = true;
+    }
   }
 
   LogPropertyUpdated(network, key, value);
diff --git a/chromeos/network/network_state_handler_unittest.cc b/chromeos/network/network_state_handler_unittest.cc
index 340ef9dd..53ca22e 100644
--- a/chromeos/network/network_state_handler_unittest.cc
+++ b/chromeos/network/network_state_handler_unittest.cc
@@ -1636,6 +1636,25 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1u, test_observer_->active_network_change_count());
 
+  // Activate cellular network so that it's part of active network list.
+  service_test_->SetServiceProperty(
+      kShillManagerClientStubCellular, shill::kActivationStateProperty,
+      base::Value(shill::kActivationStateActivating));
+  base::RunLoop().RunUntilIdle();
+  expected_active_network_paths = {kShillManagerClientStubCellular};
+  EXPECT_EQ(expected_active_network_paths,
+            test_observer_->active_network_paths());
+  // Test that network technology change signals the observer.
+  test_observer_->reset_change_counts();
+  service_test_->SetServiceProperty(kShillManagerClientStubCellular,
+                                    shill::kNetworkTechnologyProperty,
+                                    base::Value(shill::kNetworkTechnologyUmts));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(1u, test_observer_->active_network_change_count());
+  // Remove cellular service.
+  service_test_->RemoveService(kShillManagerClientStubCellular);
+  base::RunLoop().RunUntilIdle();
+
   // Add two Tether networks.
   test_observer_->reset_change_counts();
   network_state_handler_->SetTetherTechnologyState(
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index ac20ebf..66d84a8d0 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-81-3987.0-1577099071-benchmark-81.0.4009.0-r1.orderfile.xz
\ No newline at end of file
+chromeos-chrome-orderfile-field-81-3987.18-1577705382-benchmark-81.0.4011.0-r1.orderfile.xz
\ No newline at end of file
diff --git a/components/assist_ranker/binary_classifier_predictor_unittest.cc b/components/assist_ranker/binary_classifier_predictor_unittest.cc
index 03dfa53..22898dc 100644
--- a/components/assist_ranker/binary_classifier_predictor_unittest.cc
+++ b/components/assist_ranker/binary_classifier_predictor_unittest.cc
@@ -52,9 +52,9 @@
   std::unique_ptr<BinaryClassifierPredictor> predictor(
       new BinaryClassifierPredictor(config));
   auto fake_model_loader = std::make_unique<FakeRankerModelLoader>(
-      base::Bind(&BinaryClassifierPredictor::ValidateModel),
-      base::Bind(&BinaryClassifierPredictor::OnModelAvailable,
-                 base::Unretained(predictor.get())),
+      base::BindRepeating(&BinaryClassifierPredictor::ValidateModel),
+      base::BindRepeating(&BinaryClassifierPredictor::OnModelAvailable,
+                          base::Unretained(predictor.get())),
       std::move(ranker_model));
   predictor->LoadModel(std::move(fake_model_loader));
   return predictor;
diff --git a/components/assist_ranker/classifier_predictor_unittest.cc b/components/assist_ranker/classifier_predictor_unittest.cc
index 8dd8ce1..14831b2 100644
--- a/components/assist_ranker/classifier_predictor_unittest.cc
+++ b/components/assist_ranker/classifier_predictor_unittest.cc
@@ -56,9 +56,9 @@
   std::unique_ptr<ClassifierPredictor> predictor(
       new ClassifierPredictor(config));
   auto fake_model_loader = std::make_unique<FakeRankerModelLoader>(
-      base::Bind(&ClassifierPredictor::ValidateModel),
-      base::Bind(&ClassifierPredictor::OnModelAvailable,
-                 base::Unretained(predictor.get())),
+      base::BindRepeating(&ClassifierPredictor::ValidateModel),
+      base::BindRepeating(&ClassifierPredictor::OnModelAvailable,
+                          base::Unretained(predictor.get())),
       std::move(ranker_model));
   predictor->LoadModel(std::move(fake_model_loader));
   return predictor;
diff --git a/components/assist_ranker/ranker_model_loader_impl_unittest.cc b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
index 770277a..7fdc5df 100644
--- a/components/assist_ranker/ranker_model_loader_impl_unittest.cc
+++ b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
@@ -168,10 +168,10 @@
 bool RankerModelLoaderImplTest::DoLoaderTest(const base::FilePath& model_path,
                                              const GURL& model_url) {
   auto loader = std::make_unique<RankerModelLoaderImpl>(
-      base::Bind(&RankerModelLoaderImplTest::ValidateModel,
-                 base::Unretained(this)),
-      base::Bind(&RankerModelLoaderImplTest::OnModelAvailable,
-                 base::Unretained(this)),
+      base::BindRepeating(&RankerModelLoaderImplTest::ValidateModel,
+                          base::Unretained(this)),
+      base::BindRepeating(&RankerModelLoaderImplTest::OnModelAvailable,
+                          base::Unretained(this)),
       test_shared_loader_factory_, model_path, model_url,
       "RankerModelLoaderImplTest");
   loader->NotifyOfRankerActivity();
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
index 72fdb137..d0b0768 100644
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -13,7 +13,7 @@
 // When adding/removing values from this enum, be sure to update the
 // kHistogramValue array in content_settings.cc as well.
 // A Java counterpart will be generated for this enum.
-// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.content_settings
 enum class ContentSettingsType : int32_t {
   // "DEFAULT" is only used as an argument to the Content Settings Window
   // opener; there it means "whatever was last shown".
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc
index 8bf618f3..c100e088 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -362,16 +362,6 @@
   if (render_accessibility && tree_.size() > 1) {
     ui::AXNode* root = tree_.root();
     ui::AXNodeData root_data = root->data();
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollXMin, 0);
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollXMax,
-                              viewport_info.total_scrollable_size.width);
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollX,
-                              viewport_info.current_scroll_position.x);
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollYMin, 0);
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollYMax,
-                              viewport_info.total_scrollable_size.height);
-    root_data.AddIntAttribute(ax::mojom::IntAttribute::kScrollY,
-                              viewport_info.current_scroll_position.y);
     root_data.relative_bounds.transform =
         base::WrapUnique(MakeTransformFromViewInfo());
     root->SetData(root_data);
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.scroll_resizing.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.scroll_resizing.Pixel_XL-25.png.sha1
index 8a0f79f..876d41e 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.scroll_resizing.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.scroll_resizing.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-e0902dba15773fcb520336020900b947d726830d
\ No newline at end of file
+02023d175ff5e549ddc8bd7860ea3d8ac0af10f5
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_bottom.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_bottom.Pixel_XL-25.png.sha1
index 4c4c5b3b..4443a76b 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_bottom.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_bottom.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-7343b8e36bb67b3bc7ed1d7f6679ca31090c5434
\ No newline at end of file
+6d14c1d37f6f228b8604f03036ecf910ea865a21
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_left.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_left.Pixel_XL-25.png.sha1
index 9d3e02c6..7ff2ec54 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_left.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_left.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-4a5829f455d030660c028c09fd0a4dbac9963243
\ No newline at end of file
+2a071e084edd0338bc25f4f3e4b9b6915bfe67e0
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_right.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_right.Pixel_XL-25.png.sha1
index f2d9889..3da5005 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_right.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_right.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-5516966ce1c342017b91f5fd585ae8dd5a8d9e48
\ No newline at end of file
+c99b3661b6e1be8e9acbbf816046463f42bc18f6
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_top.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_top.Pixel_XL-25.png.sha1
index 4287ed3..ecd27439 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_top.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_clicking_top.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-2e0b074453f895bc46d8a891eea88caa53f2b198
\ No newline at end of file
+d364e2312345a5e0305d9587d15e2091175c2dc6
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_middle.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_middle.Pixel_XL-25.png.sha1
index 6959bf3..47bdcdb 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_middle.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_middle.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-ab529048917ce2a77420d6124f2c34f92d2b9085
\ No newline at end of file
+5b8f281835feb3ca5d8eac5fdaea07aa0ffd9487
\ No newline at end of file
diff --git a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_top.Pixel_XL-25.png.sha1 b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_top.Pixel_XL-25.png.sha1
index c386ae78..275727a 100644
--- a/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_top.Pixel_XL-25.png.sha1
+++ b/components/test/data/vr_browser_ui/render_tests/VrBrowserNativeUiTest.suggestion_hovering_top.Pixel_XL-25.png.sha1
@@ -1 +1 @@
-8af22b1d1445b25a71c98289a2eefb64ccf3cca9
\ No newline at end of file
+c188327803a99e05dbbecd556b9da81f86186d7d
\ No newline at end of file
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn
index 5579595..d5983cc4 100644
--- a/components/translate/core/browser/BUILD.gn
+++ b/components/translate/core/browser/BUILD.gn
@@ -26,8 +26,6 @@
     "translate_language_list.h",
     "translate_manager.cc",
     "translate_manager.h",
-    "translate_pref_names.cc",
-    "translate_pref_names.h",
     "translate_prefs.cc",
     "translate_prefs.h",
     "translate_ranker.h",
@@ -74,6 +72,10 @@
     "//url",
   ]
 
+  public_deps = [
+    ":translate_pref_names",
+  ]
+
   if (is_ios || is_android) {
     sources += [
       "translate_infobar_delegate.cc",
@@ -83,6 +85,13 @@
   }
 }
 
+source_set("translate_pref_names") {
+  sources = [
+    "translate_pref_names.cc",
+    "translate_pref_names.h",
+  ]
+}
+
 source_set("unit_tests") {
   testonly = true
   sources = [
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
index 1c17395..57bf523 100644
--- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
+++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -113,13 +113,10 @@
   std::vector<GrBackendSemaphore> begin_semaphores;
   SkSurfaceProps surface_props{0, kUnknown_SkPixelGeometry};
 
-  // Buffer queue is internal to GPU proc and handles texture initialization,
-  // so allow uncleared access.
   // TODO(vasilyt): Props and MSAA
   scoped_write_access_ = skia_representation_->BeginScopedWriteAccess(
       0 /* final_msaa_count */, surface_props, &begin_semaphores,
-      &end_semaphores_,
-      gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &end_semaphores_);
   DCHECK(scoped_write_access_);
   if (!begin_semaphores.empty()) {
     scoped_write_access_->surface()->wait(begin_semaphores.size(),
@@ -140,18 +137,13 @@
       SkSurface::BackendSurfaceAccess::kNoAccess, flush_info);
   scoped_write_access_.reset();
   end_semaphores_.clear();
-
-  // SkiaRenderer always draws the full frame.
-  skia_representation_->SetCleared();
 }
 
 void SkiaOutputDeviceBufferQueue::Image::BeginPresent() {
   DCHECK(!scoped_write_access_);
   DCHECK(!scoped_read_access_);
   scoped_read_access_ = gl_representation_->BeginScopedAccess(
-      GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM,
-      gpu::SharedImageRepresentation::AllowUnclearedAccess::kNo);
-  DCHECK(scoped_read_access_);
+      GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
 }
 
 void SkiaOutputDeviceBufferQueue::Image::EndPresent() {
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc
index adf4e82e..19ab3df 100644
--- a/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc
+++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc
@@ -251,13 +251,7 @@
     EXPECT_EQ(images.size(), (size_t)CountBuffers());
   }
 
-  Image* GetCurrentImage() {
-    // Call Begin/EndPaint to ensusre the image is initialized before use.
-    output_device_->BeginPaint();
-    GrBackendSemaphore semaphore;
-    output_device_->EndPaint(semaphore);
-    return output_device_->GetCurrentImage();
-  }
+  Image* GetCurrentImage() { return output_device_->GetCurrentImage(); }
 
   void SwapBuffers() {
     auto present_callback =
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc
index 255aab3..3a40675 100644
--- a/content/browser/portal/portal.cc
+++ b/content/browser/portal/portal.cc
@@ -37,20 +37,14 @@
 Portal::Portal(RenderFrameHostImpl* owner_render_frame_host,
                std::unique_ptr<WebContents> existing_web_contents)
     : Portal(owner_render_frame_host) {
-  SetPortalContents(std::move(existing_web_contents));
-  GetPortalContents()->NotifyInsidePortal(true);
+  portal_contents_.SetOwned(std::move(existing_web_contents));
+  portal_contents_->NotifyInsidePortal(true);
 }
 
 Portal::~Portal() {
   WebContentsImpl* outer_contents_impl = static_cast<WebContentsImpl*>(
       WebContents::FromRenderFrameHost(owner_render_frame_host_));
   devtools_instrumentation::PortalDetached(outer_contents_impl->GetMainFrame());
-
-  FrameTreeNode* outer_node = FrameTreeNode::GloballyFindByID(
-      portal_contents_impl_->GetOuterDelegateFrameTreeNodeId());
-  if (outer_node)
-    outer_node->RemoveObserver(this);
-  portal_contents_impl_->set_portal(nullptr);
   Observe(nullptr);
 }
 
@@ -103,7 +97,7 @@
   DCHECK(!client_.is_bound());
   receiver_.Bind(std::move(receiver));
   receiver_.set_disconnect_handler(
-      base::BindOnce(&Portal::DestroySelf, base::Unretained(this)));
+      base::BindOnce(&Portal::Close, base::Unretained(this)));
   client_.Bind(std::move(client));
 }
 
@@ -139,33 +133,53 @@
   if (!portal_contents_) {
     // Create the Portal WebContents.
     WebContents::CreateParams params(outer_contents_impl->GetBrowserContext());
-    SetPortalContents(WebContents::Create(params));
+    portal_contents_.SetOwned(base::WrapUnique(
+        static_cast<WebContentsImpl*>(WebContents::Create(params).release())));
     web_contents_created = true;
   }
 
-  DCHECK_EQ(portal_contents_.get(), portal_contents_impl_);
-  DCHECK_EQ(portal_contents_impl_->portal(), this);
-  DCHECK_EQ(portal_contents_impl_->GetDelegate(), this);
+  DCHECK(portal_contents_.OwnsContents());
+  DCHECK_EQ(portal_contents_->portal(), this);
+  DCHECK_EQ(portal_contents_->GetDelegate(), this);
 
-  outer_contents_impl->AttachInnerWebContents(std::move(portal_contents_),
-                                              outer_node->current_frame_host(),
-                                              false /* is_full_page */);
+  DCHECK(!is_closing_) << "Portal should not be shutting down when contents "
+                          "ownership is yielded";
+  outer_contents_impl->AttachInnerWebContents(
+      portal_contents_.ReleaseOwnership(), outer_node->current_frame_host(),
+      false /* is_full_page */);
 
   FrameTreeNode* frame_tree_node =
-      portal_contents_impl_->GetMainFrame()->frame_tree_node();
+      portal_contents_->GetMainFrame()->frame_tree_node();
   RenderFrameProxyHost* proxy_host =
       frame_tree_node->render_manager()->GetProxyToOuterDelegate();
   proxy_host->SetRenderFrameProxyCreated(true);
-  portal_contents_impl_->ReattachToOuterWebContentsFrame();
+  portal_contents_->ReattachToOuterWebContentsFrame();
 
   if (web_contents_created)
-    PortalWebContentsCreated(portal_contents_impl_);
+    PortalWebContentsCreated(portal_contents_.get());
 
   devtools_instrumentation::PortalAttached(outer_contents_impl->GetMainFrame());
 
   return proxy_host;
 }
 
+void Portal::Close() {
+  if (is_closing_)
+    return;
+  is_closing_ = true;
+  receiver_.reset();
+
+  // If the contents is unowned, it would need to be properly detached from the
+  // WebContentsTreeNode before it can be cleanly closed. Otherwise a race is
+  // possible.
+  if (!portal_contents_.OwnsContents()) {
+    DestroySelf();  // Deletes this.
+    return;
+  }
+
+  portal_contents_->ClosePage();
+}
+
 void Portal::Navigate(const GURL& url,
                       blink::mojom::ReferrerPtr referrer,
                       NavigateCallback callback) {
@@ -179,7 +193,7 @@
   owner_render_frame_host_->GetSiteInstance()->GetProcess()->FilterURL(
       false, &out_validated_url);
 
-  FrameTreeNode* portal_root = portal_contents_impl_->GetFrameTree()->root();
+  FrameTreeNode* portal_root = portal_contents_->GetFrameTree()->root();
   RenderFrameHostImpl* portal_frame = portal_root->current_frame_host();
 
   // TODO(lfg): Figure out download policies for portals.
@@ -309,15 +323,18 @@
   }
   outer_root_node->StopLoading();
 
-  WebContentsDelegate* delegate = outer_contents->GetDelegate();
-  bool is_loading = portal_contents_impl_->IsLoading();
-  std::unique_ptr<WebContents> portal_contents;
+  DCHECK(!is_closing_) << "Portal should not be shutting down when contents "
+                          "ownership is yielded";
 
-  if (portal_contents_impl_->GetOuterWebContents()) {
+  WebContentsDelegate* delegate = outer_contents->GetDelegate();
+  bool is_loading = portal_contents_->IsLoading();
+  std::unique_ptr<WebContents> successor_contents;
+
+  if (portal_contents_->GetOuterWebContents()) {
     FrameTreeNode* outer_frame_tree_node = FrameTreeNode::GloballyFindByID(
-        portal_contents_impl_->GetOuterDelegateFrameTreeNodeId());
+        portal_contents_->GetOuterDelegateFrameTreeNodeId());
     outer_frame_tree_node->RemoveObserver(this);
-    portal_contents = portal_contents_impl_->DetachFromOuterWebContents();
+    successor_contents = portal_contents_->DetachFromOuterWebContents();
     owner_render_frame_host_->RemoveChild(outer_frame_tree_node);
   } else {
     // Portals created for predecessor pages during activation may not be
@@ -325,19 +342,25 @@
     // node created (i.e. CreateProxyAndAttachPortal isn't called). In this
     // case, we can skip a few of the detachment steps above.
     if (RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
-            portal_contents_impl_->GetMainFrame()->GetView())) {
+            portal_contents_->GetMainFrame()->GetView())) {
       view->Destroy();
     }
-    portal_contents_impl_->CreateRenderWidgetHostViewForRenderManager(
-        portal_contents_impl_->GetRenderViewHost());
-    portal_contents = std::move(portal_contents_);
+    portal_contents_->CreateRenderWidgetHostViewForRenderManager(
+        portal_contents_->GetRenderViewHost());
+    successor_contents = portal_contents_.ReleaseOwnership();
   }
+  DCHECK(!portal_contents_.OwnsContents());
+
+  // This assumes that the delegate keeps the new contents alive long enough to
+  // notify it of activation, at least.
+  WebContentsImpl* successor_contents_raw =
+      static_cast<WebContentsImpl*>(successor_contents.get());
 
   auto* outer_contents_main_frame_view = static_cast<RenderWidgetHostViewBase*>(
       outer_contents->GetMainFrame()->GetView());
   auto* portal_contents_main_frame_view =
       static_cast<RenderWidgetHostViewBase*>(
-          portal_contents_impl_->GetMainFrame()->GetView());
+          successor_contents_raw->GetMainFrame()->GetView());
 
   std::vector<std::unique_ptr<ui::TouchEvent>> touch_events;
 
@@ -351,11 +374,10 @@
     FlushTouchEventQueues(outer_contents_main_frame_view->host());
   }
 
-  TakeHistoryForActivation(static_cast<WebContentsImpl*>(portal_contents.get()),
-                           outer_contents);
+  TakeHistoryForActivation(successor_contents_raw, outer_contents);
 
   std::unique_ptr<WebContents> predecessor_web_contents =
-      delegate->SwapWebContents(outer_contents, std::move(portal_contents),
+      delegate->SwapWebContents(outer_contents, std::move(successor_contents),
                                 true, is_loading);
   CHECK_EQ(predecessor_web_contents.get(), outer_contents);
 
@@ -369,12 +391,16 @@
     outer_contents_main_frame_view->Destroy();
   }
 
-  portal_contents_impl_->set_portal(nullptr);
+  // These pointers are cleared so that they don't dangle in the event this
+  // object isn't immediately deleted. It isn't done sooner because
+  // SwapWebContents misbehaves if the WebContents doesn't appear to be a portal
+  // at that time.
+  portal_contents_.Clear();
 
-  portal_contents_impl_->GetMainFrame()->OnPortalActivated(
+  successor_contents_raw->GetMainFrame()->OnPortalActivated(
       std::move(predecessor_web_contents), std::move(data),
       std::move(callback));
-  portal_contents_impl_->NotifyInsidePortal(false);
+  successor_contents_raw->NotifyInsidePortal(false);
 
   devtools_instrumentation::PortalActivated(outer_contents->GetMainFrame());
 }
@@ -382,7 +408,7 @@
 void Portal::PostMessageToGuest(
     blink::TransferableMessage message,
     const base::Optional<url::Origin>& target_origin) {
-  portal_contents_impl_->GetMainFrame()->ForwardMessageFromHost(
+  portal_contents_->GetMainFrame()->ForwardMessageFromHost(
       std::move(message), owner_render_frame_host_->GetLastCommittedOrigin(),
       target_origin);
 }
@@ -406,7 +432,8 @@
   // in the outer WebContents (not the FrameTreeNode of the document containing
   // it). If that outer FrameTreeNode goes away, this Portal should stop
   // accepting new messages and go away as well.
-  DestroySelf();  // Deletes |this|.
+
+  Close();  // May delete |this|.
 }
 
 void Portal::RenderFrameDeleted(RenderFrameHost* render_frame_host) {
@@ -423,7 +450,7 @@
 
 void Portal::LoadingStateChanged(WebContents* source,
                                  bool to_different_document) {
-  DCHECK_EQ(source, portal_contents_impl_);
+  DCHECK_EQ(source, portal_contents_.get());
   if (!source->IsLoading())
     client_->DispatchLoadEvent();
 }
@@ -435,19 +462,59 @@
   outer_contents->GetDelegate()->PortalWebContentsCreated(portal_web_contents);
 }
 
+void Portal::CloseContents(WebContents* web_contents) {
+  DCHECK_EQ(web_contents, portal_contents_.get());
+  DestroySelf();  // Deletes |this|.
+}
+
 base::UnguessableToken Portal::GetDevToolsFrameToken() const {
-  return portal_contents_impl_->GetMainFrame()->GetDevToolsFrameToken();
+  return portal_contents_->GetMainFrame()->GetDevToolsFrameToken();
 }
 
 WebContentsImpl* Portal::GetPortalContents() {
-  return portal_contents_impl_;
+  return portal_contents_.get();
 }
 
-void Portal::SetPortalContents(std::unique_ptr<WebContents> web_contents) {
-  portal_contents_ = std::move(web_contents);
-  portal_contents_impl_ = static_cast<WebContentsImpl*>(portal_contents_.get());
-  portal_contents_impl_->SetDelegate(this);
-  portal_contents_impl_->set_portal(this);
+Portal::WebContentsHolder::WebContentsHolder(Portal* portal)
+    : portal_(portal) {}
+
+Portal::WebContentsHolder::~WebContentsHolder() {
+  Clear();
+}
+
+bool Portal::WebContentsHolder::OwnsContents() const {
+  DCHECK(!owned_contents_ || contents_ == owned_contents_.get());
+  return owned_contents_ != nullptr;
+}
+
+void Portal::WebContentsHolder::SetUnowned(WebContentsImpl* web_contents) {
+  Clear();
+  contents_ = web_contents;
+  contents_->SetDelegate(portal_);
+  contents_->set_portal(portal_);
+}
+
+void Portal::WebContentsHolder::SetOwned(
+    std::unique_ptr<WebContents> web_contents) {
+  SetUnowned(static_cast<WebContentsImpl*>(web_contents.get()));
+  owned_contents_ = std::move(web_contents);
+}
+
+void Portal::WebContentsHolder::Clear() {
+  if (!contents_)
+    return;
+
+  FrameTreeNode* outer_node = FrameTreeNode::GloballyFindByID(
+      contents_->GetOuterDelegateFrameTreeNodeId());
+  if (outer_node)
+    outer_node->RemoveObserver(portal_);
+
+  if (contents_->GetDelegate() == portal_)
+    contents_->SetDelegate(nullptr);
+  contents_->set_portal(nullptr);
+
+  contents_ = nullptr;
+  owned_contents_ = nullptr;
 }
 
 }  // namespace content
diff --git a/content/browser/portal/portal.h b/content/browser/portal/portal.h
index f196726..0e60a01 100644
--- a/content/browser/portal/portal.h
+++ b/content/browser/portal/portal.h
@@ -68,6 +68,12 @@
   // the proxy.
   RenderFrameProxyHost* CreateProxyAndAttachPortal();
 
+  // Closes the contents associated with this object gracefully, and destroys
+  // itself thereafter. This will fire unload and related event handlers.
+  // Once closing begins, the Portal interface receiver is closed. The host
+  // document can no longer manage the lifetime.
+  void Close();
+
   // blink::mojom::Portal implementation.
   void Navigate(const GURL& url,
                 blink::mojom::ReferrerPtr referrer,
@@ -94,6 +100,7 @@
   void LoadingStateChanged(WebContents* source,
                            bool to_different_document) override;
   void PortalWebContentsCreated(WebContents* portal_web_contents) override;
+  void CloseContents(WebContents*) override;
 
   // Returns the token which uniquely identifies this Portal.
   const base::UnguessableToken& portal_token() const { return portal_token_; }
@@ -121,6 +128,57 @@
   blink::mojom::PortalClient& client() { return *(client_.get()); }
 
  private:
+  // Manages the relationship between the Portal and its guest WebContents.
+  //
+  // The WebContents may either be:
+  // * owned by this object (via unique_ptr) when it is not attached to the
+  //   FrameTreeNode/WebContents tree, e.g. during activation but before
+  //   adoption
+  // * unowned by this object, in which case it is owned elsewhere, generally
+  //   via by WebContentsTreeNode
+  //
+  // It can transition between these two states. In either state, the Portal
+  // must be configured as the portal and delegate of the WebContents.
+  //
+  // Finally, if the Portal drops its relationship with a WebContents, it must
+  // also stop observing the corresponding outer FrameTreeNode.
+  class WebContentsHolder {
+   public:
+    explicit WebContentsHolder(Portal* portal);
+    WebContentsHolder(const WebContentsHolder&) = delete;
+    ~WebContentsHolder();
+
+    WebContentsHolder& operator=(const WebContentsHolder&) = delete;
+
+    explicit operator bool() const { return contents_; }
+    WebContentsImpl& operator*() const { return *contents_; }
+    WebContentsImpl* operator->() const { return contents_; }
+    WebContentsImpl* get() const { return contents_; }
+    bool OwnsContents() const;
+
+    void SetUnowned(WebContentsImpl*);
+    void SetOwned(std::unique_ptr<WebContents>);
+    void Clear();
+
+    // Maintains a link to the same contents, but yields ownership to the
+    // caller.
+    std::unique_ptr<WebContents> ReleaseOwnership() {
+      DCHECK(OwnsContents());
+      return std::move(owned_contents_);
+    }
+
+   private:
+    // The outer Portal object.
+    Portal* portal_ = nullptr;
+
+    // Non-null, even when the contents is not owned.
+    WebContentsImpl* contents_ = nullptr;
+
+    // When the portal is not attached, the Portal owns its WebContents.
+    // If not null, |owned_contents_| is equal to |contents_|.
+    std::unique_ptr<WebContents> owned_contents_;
+  };
+
   void SetPortalContents(std::unique_ptr<WebContents> web_contents);
 
   RenderFrameHostImpl* owner_render_frame_host_;
@@ -141,9 +199,10 @@
   mojo::AssociatedRemote<blink::mojom::PortalClient> client_;
 
   // When the portal is not attached, the Portal owns its WebContents.
-  std::unique_ptr<WebContents> portal_contents_;
+  WebContentsHolder portal_contents_{this};
 
-  WebContentsImpl* portal_contents_impl_ = nullptr;
+  // Set when |Close| is called. Destruction will occur shortly thereafter.
+  bool is_closing_ = false;
 
   // Another implementation of blink::mojom::Portal to bind instead.
   // For use in testing only.
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index 5444632..bd18371 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -10,6 +10,8 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
+#include "components/viz/host/host_frame_sink_manager.h"
+#include "content/browser/compositor/surface_utils.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/browser/frame_host/render_frame_host_manager.h"
 #include "content/browser/frame_host/render_frame_proxy_host.h"
@@ -17,6 +19,7 @@
 #include "content/browser/renderer_host/input/synthetic_smooth_scroll_gesture.h"
 #include "content/browser/renderer_host/input/synthetic_tap_gesture.h"
 #include "content/browser/renderer_host/render_widget_host_input_event_router.h"
+#include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/frame.mojom-test-utils.h"
@@ -512,7 +515,33 @@
                        "portal.activate().then(() => { "
                        "  document.body.removeChild(portal); "
                        "});"));
-    activated_observer.WaitForActivateAndHitTestData();
+    activated_observer.WaitForActivate();
+
+    RenderWidgetHostViewBase* view =
+        portal_frame->GetRenderWidgetHost()->GetView();
+    viz::FrameSinkId root_frame_sink_id = view->GetRootFrameSinkId();
+    HitTestRegionObserver hit_test_observer(root_frame_sink_id);
+
+    // The hit test region for the portal frame should be at index 1 after
+    // activation, so we wait for the hit test data to update until it's in
+    // this state.
+    auto hit_test_index = [&]() -> base::Optional<size_t> {
+      const auto& display_hit_test_query_map =
+          GetHostFrameSinkManager()->display_hit_test_query();
+      auto it = display_hit_test_query_map.find(root_frame_sink_id);
+      // On Mac, we create a new root layer after activation, so the hit test
+      // data may not have anything for the new layer yet.
+      if (it == display_hit_test_query_map.end())
+        return base::nullopt;
+      CHECK_EQ(portal_frame->GetRenderWidgetHost()->GetView(), view);
+      size_t index;
+      if (!it->second->FindIndexOfFrameSink(view->GetFrameSinkId(), &index))
+        return base::nullopt;
+      return index;
+    };
+    hit_test_observer.WaitForHitTestData();
+    while (hit_test_index() != 1u)
+      hit_test_observer.WaitForHitTestDataChange();
   }
   EXPECT_EQ(shell()->web_contents(), portal_contents);
 
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/content/browser/renderer_host/browser_compositor_view_mac.mm
index 8ddd790..e291192f 100644
--- a/content/browser/renderer_host/browser_compositor_view_mac.mm
+++ b/content/browser/renderer_host/browser_compositor_view_mac.mm
@@ -152,10 +152,9 @@
   }
 
   if (recyclable_compositor_) {
-    recyclable_compositor_->compositor()->SetDisplayColorSpace(
-        dfh_display_.color_space());
     recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
-                                          dfh_display_.device_scale_factor());
+                                          dfh_display_.device_scale_factor(),
+                                          dfh_display_.color_space());
   }
 
   return true;
@@ -174,7 +173,8 @@
     root_layer_->SetBounds(gfx::Rect(dfh_size_dip_));
     if (recyclable_compositor_) {
       recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
-                                            dfh_display_.device_scale_factor());
+                                            dfh_display_.device_scale_factor(),
+                                            dfh_display_.color_space());
     }
     delegated_frame_host_->EmbedSurface(
         dfh_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation()
@@ -278,11 +278,10 @@
         ui::RecyclableCompositorMacFactory::Get()->CreateCompositor(
             content::GetContextFactory(), content::GetContextFactoryPrivate());
     recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
-                                          dfh_display_.device_scale_factor());
+                                          dfh_display_.device_scale_factor(),
+                                          dfh_display_.color_space());
     recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get());
     recyclable_compositor_->compositor()->SetBackgroundColor(background_color_);
-    recyclable_compositor_->compositor()->SetDisplayColorSpace(
-        dfh_display_.color_space());
     recyclable_compositor_->widget()->SetNSView(
         accelerated_widget_mac_ns_view_);
     recyclable_compositor_->Unsuspend();
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc
index 31211db6..44c32d2 100644
--- a/content/browser/renderer_host/input/input_router_impl.cc
+++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -464,9 +464,12 @@
 }
 
 void InputRouterImpl::SendMouseWheelEventImmediately(
-    const MouseWheelEventWithLatencyInfo& wheel_event) {
-  mojom::WidgetInputHandler::DispatchEventCallback callback = base::BindOnce(
-      &InputRouterImpl::MouseWheelEventHandled, weak_this_, wheel_event);
+    const MouseWheelEventWithLatencyInfo& wheel_event,
+    MouseWheelEventQueueClient::MouseWheelEventHandledCallback
+        callee_callback) {
+  mojom::WidgetInputHandler::DispatchEventCallback callback =
+      base::BindOnce(&InputRouterImpl::MouseWheelEventHandled, weak_this_,
+                     wheel_event, std::move(callee_callback));
   FilterAndSendWebInputEvent(wheel_event.event, wheel_event.latency,
                              std::move(callback));
 }
@@ -486,8 +489,9 @@
 }
 
 void InputRouterImpl::SendMouseWheelEventForPinchImmediately(
-    const MouseWheelEventWithLatencyInfo& event) {
-  SendMouseWheelEventImmediately(event);
+    const MouseWheelEventWithLatencyInfo& event,
+    TouchpadPinchEventQueueClient::MouseWheelEventHandledCallback callback) {
+  SendMouseWheelEventImmediately(event, std::move(callback));
 }
 
 void InputRouterImpl::OnGestureEventForPinchAck(
@@ -654,6 +658,7 @@
 
 void InputRouterImpl::MouseWheelEventHandled(
     const MouseWheelEventWithLatencyInfo& event,
+    MouseWheelEventQueueClient::MouseWheelEventHandledCallback callback,
     InputEventAckSource source,
     const ui::LatencyInfo& latency,
     InputEventAckState state,
@@ -669,8 +674,7 @@
   if (overscroll)
     DidOverscroll(overscroll.value());
 
-  wheel_event_queue_.ProcessMouseWheelAck(source, state, event);
-  touchpad_pinch_event_queue_.ProcessMouseWheelAck(source, state, event);
+  std::move(callback).Run(event, source, state);
 }
 
 void InputRouterImpl::OnHasTouchEventHandlers(bool has_handlers) {
diff --git a/content/browser/renderer_host/input/input_router_impl.h b/content/browser/renderer_host/input/input_router_impl.h
index 1ad7df6b..70447a2 100644
--- a/content/browser/renderer_host/input/input_router_impl.h
+++ b/content/browser/renderer_host/input/input_router_impl.h
@@ -160,7 +160,9 @@
 
   // MouseWheelEventQueueClient
   void SendMouseWheelEventImmediately(
-      const MouseWheelEventWithLatencyInfo& touch_event) override;
+      const MouseWheelEventWithLatencyInfo& touch_event,
+      MouseWheelEventQueueClient::MouseWheelEventHandledCallback callback)
+      override;
   void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
                             InputEventAckSource ack_source,
                             InputEventAckState ack_result) override;
@@ -172,7 +174,9 @@
 
   // TouchpadPinchEventQueueClient
   void SendMouseWheelEventForPinchImmediately(
-      const MouseWheelEventWithLatencyInfo& event) override;
+      const MouseWheelEventWithLatencyInfo& event,
+      TouchpadPinchEventQueueClient::MouseWheelEventHandledCallback callback)
+      override;
   void OnGestureEventForPinchAck(const GestureEventWithLatencyInfo& event,
                                  InputEventAckSource ack_source,
                                  InputEventAckState ack_result) override;
@@ -214,6 +218,7 @@
       const base::Optional<cc::TouchAction>& touch_action);
   void MouseWheelEventHandled(
       const MouseWheelEventWithLatencyInfo& event,
+      MouseWheelEventQueueClient::MouseWheelEventHandledCallback callback,
       InputEventAckSource source,
       const ui::LatencyInfo& latency,
       InputEventAckState state,
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue.cc b/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
index d70d87eb2..174a154 100644
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h"
 
+#include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
 #include "build/build_config.h"
 #include "content/common/input/input_event_dispatch_type.h"
@@ -99,22 +100,13 @@
 }
 
 void MouseWheelEventQueue::ProcessMouseWheelAck(
+    const MouseWheelEventWithLatencyInfo& ack_event,
     InputEventAckSource ack_source,
-    InputEventAckState ack_result,
-    const MouseWheelEventWithLatencyInfo& ack_event) {
+    InputEventAckState ack_result) {
   TRACE_EVENT0("input", "MouseWheelEventQueue::ProcessMouseWheelAck");
   if (!event_sent_for_gesture_ack_)
     return;
 
-  // |ack_event.event| should be the same as
-  // |event_sent_for_gesture_ack_->event|. If they aren't, then don't continue
-  // processing the ack. The two events can potentially be different because
-  // TouchpadPinchEventQueue also dispatches wheel events, and any wheel event
-  // ack that is received is sent to both *EventQueue::ProcessMouseWheelAck
-  // methods.
-  if (ack_event.event != event_sent_for_gesture_ack_->event)
-    return;
-
   event_sent_for_gesture_ack_->latency.AddNewLatencyFrom(ack_event.latency);
   client_->OnMouseWheelEventAck(*event_sent_for_gesture_ack_, ack_source,
                                 ack_result);
@@ -284,7 +276,10 @@
         WebInputEvent::kEventNonBlocking;
   }
 
-  client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_);
+  client_->SendMouseWheelEventImmediately(
+      *event_sent_for_gesture_ack_,
+      base::BindOnce(&MouseWheelEventQueue::ProcessMouseWheelAck,
+                     base::Unretained(this)));
 }
 
 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue.h b/content/browser/renderer_host/input/mouse_wheel_event_queue.h
index 9d47135..c2b1bc1 100644
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue.h
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/callback.h"
 #include "base/containers/circular_deque.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -39,16 +40,20 @@
 // and dispatch mouse wheel event responses.
 class CONTENT_EXPORT MouseWheelEventQueueClient {
  public:
+  using MouseWheelEventHandledCallback =
+      base::OnceCallback<void(const MouseWheelEventWithLatencyInfo& ack_event,
+                              InputEventAckSource ack_source,
+                              InputEventAckState ack_result)>;
   virtual ~MouseWheelEventQueueClient() {}
-
   virtual void SendMouseWheelEventImmediately(
-      const MouseWheelEventWithLatencyInfo& event) = 0;
-  virtual void ForwardGestureEventWithLatencyInfo(
-      const blink::WebGestureEvent& event,
-      const ui::LatencyInfo& latency_info) = 0;
+      const MouseWheelEventWithLatencyInfo& event,
+      MouseWheelEventHandledCallback callback) = 0;
   virtual void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
                                     InputEventAckSource ack_source,
                                     InputEventAckState ack_result) = 0;
+  virtual void ForwardGestureEventWithLatencyInfo(
+      const blink::WebGestureEvent& event,
+      const ui::LatencyInfo& latency_info) = 0;
   virtual bool IsWheelScrollInProgress() = 0;
   virtual bool IsAutoscrollInProgress() = 0;
 };
@@ -69,12 +74,6 @@
   // the renderer (e.g. when there are no other queued mouse-wheel event).
   void QueueEvent(const MouseWheelEventWithLatencyInfo& event);
 
-  // Notifies the queue that a mouse wheel event has been processed by the
-  // renderer.
-  void ProcessMouseWheelAck(InputEventAckSource ack_source,
-                            InputEventAckState ack_result,
-                            const MouseWheelEventWithLatencyInfo& ack_event);
-
   // When GestureScrollBegin is received, and it is a different source
   // than mouse wheels terminate the current GestureScroll if there is one.
   // When Gesture{ScrollEnd,FlingStart} is received, resume generating
@@ -90,11 +89,13 @@
     return event_sent_for_gesture_ack_ != nullptr;
   }
 
-  blink::WebMouseWheelEvent get_wheel_event_awaiting_ack_for_testing() {
-    return event_sent_for_gesture_ack_->event;
-  }
-
  private:
+  // Notifies the queue that a mouse wheel event has been processed by the
+  // renderer.
+  void ProcessMouseWheelAck(const MouseWheelEventWithLatencyInfo& ack_event,
+                            InputEventAckSource ack_source,
+                            InputEventAckState ack_result);
+
   void TryForwardNextEventToRenderer();
   void SendScrollEnd(blink::WebGestureEvent update_event, bool synthetic);
   void SendScrollBegin(const blink::WebGestureEvent& gesture_update,
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
index 79d2a79..9e9b89a 100644
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
@@ -156,11 +156,19 @@
 
   // MouseWheelEventQueueClient
   void SendMouseWheelEventImmediately(
-      const MouseWheelEventWithLatencyInfo& event) override {
+      const MouseWheelEventWithLatencyInfo& event,
+      MouseWheelEventHandledCallback callback) override {
     WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent();
     std::unique_ptr<WebInputEvent> cloned_event_holder(cloned_event);
     *cloned_event = event.event;
     sent_events_.push_back(std::move(cloned_event_holder));
+    callbacks_.emplace_back(base::BindOnce(
+        [](MouseWheelEventHandledCallback callback,
+           const MouseWheelEventWithLatencyInfo& event,
+           InputEventAckSource ack_source, InputEventAckState ack_result) {
+          std::move(callback).Run(event, ack_source, ack_result);
+        },
+        std::move(callback), event));
   }
 
   void ForwardGestureEventWithLatencyInfo(
@@ -192,6 +200,10 @@
   bool IsAutoscrollInProgress() override { return false; }
 
  protected:
+  using HandleEventCallback =
+      base::OnceCallback<void(InputEventAckSource ack_source,
+                              InputEventAckState ack_result)>;
+
   size_t queued_event_count() const { return queue_->queued_size(); }
 
   bool event_in_flight() const { return queue_->event_in_flight(); }
@@ -222,11 +234,11 @@
   }
 
   void SendMouseWheelEventAck(InputEventAckState ack_result) {
-    const MouseWheelEventWithLatencyInfo mouse_event_with_latency_info(
-        queue_->get_wheel_event_awaiting_ack_for_testing(), ui::LatencyInfo());
-    queue_->ProcessMouseWheelAck(InputEventAckSource::COMPOSITOR_THREAD,
-                                 ack_result, mouse_event_with_latency_info);
+    std::move(callbacks_.front())
+        .Run(InputEventAckSource::COMPOSITOR_THREAD, ack_result);
+    callbacks_.pop_front();
   }
+
   void SendMouseWheel(float x,
                       float y,
                       float global_x,
@@ -382,6 +394,7 @@
   base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<MouseWheelEventQueue> queue_;
   std::vector<std::unique_ptr<WebInputEvent>> sent_events_;
+  base::circular_deque<HandleEventCallback> callbacks_;
   size_t acked_event_count_;
   InputEventAckState last_acked_event_state_;
   WebMouseWheelEvent last_acked_event_;
diff --git a/content/browser/renderer_host/input/touchpad_pinch_event_queue.cc b/content/browser/renderer_host/input/touchpad_pinch_event_queue.cc
index 9890ab2..8521de32 100644
--- a/content/browser/renderer_host/input/touchpad_pinch_event_queue.cc
+++ b/content/browser/renderer_host/input/touchpad_pinch_event_queue.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/renderer_host/input/touchpad_pinch_event_queue.h"
 
+#include "base/bind.h"
 #include "base/trace_event/trace_event.h"
 #include "content/public/common/content_features.h"
 #include "third_party/blink/public/common/input/web_mouse_wheel_event.h"
@@ -124,21 +125,13 @@
 }
 
 void TouchpadPinchEventQueue::ProcessMouseWheelAck(
+    const MouseWheelEventWithLatencyInfo& ack_event,
     InputEventAckSource ack_source,
-    InputEventAckState ack_result,
-    const MouseWheelEventWithLatencyInfo& ack_event) {
+    InputEventAckState ack_result) {
   TRACE_EVENT0("input", "TouchpadPinchEventQueue::ProcessMouseWheelAck");
   if (!pinch_event_awaiting_ack_)
     return;
 
-  // |ack_event.event| should be the same as the wheel_event_awaiting_ack_. If
-  // they aren't, then don't continue processing the ack. The two events can
-  // potentially be different because MouseWheelEventQueue also dispatches wheel
-  // events, and any wheel event ack that is received is sent to both
-  // *EventQueue::ProcessMouseWheelAck methods.
-  if (wheel_event_awaiting_ack_ != ack_event.event)
-    return;
-
   if (pinch_event_awaiting_ack_->event.GetType() ==
           blink::WebInputEvent::kGesturePinchUpdate &&
       !first_event_prevented_.has_value())
@@ -149,7 +142,6 @@
                                      ack_result);
 
   pinch_event_awaiting_ack_.reset();
-  wheel_event_awaiting_ack_.reset();
   TryForwardNextEventToRenderer();
 }
 
@@ -201,12 +193,16 @@
     }
   }
 
-  wheel_event_awaiting_ack_ = CreateSyntheticWheelFromTouchpadPinchEvent(
-      pinch_event_awaiting_ack_->event, phase, cancelable);
+  blink::WebMouseWheelEvent wheel_event_awaiting_ack =
+      CreateSyntheticWheelFromTouchpadPinchEvent(
+          pinch_event_awaiting_ack_->event, phase, cancelable);
   const MouseWheelEventWithLatencyInfo synthetic_wheel(
-      wheel_event_awaiting_ack_.value(), pinch_event_awaiting_ack_->latency);
+      wheel_event_awaiting_ack, pinch_event_awaiting_ack_->latency);
 
-  client_->SendMouseWheelEventForPinchImmediately(synthetic_wheel);
+  client_->SendMouseWheelEventForPinchImmediately(
+      synthetic_wheel,
+      base::BindOnce(&TouchpadPinchEventQueue::ProcessMouseWheelAck,
+                     base::Unretained(this)));
 }
 
 bool TouchpadPinchEventQueue::has_pending() const {
diff --git a/content/browser/renderer_host/input/touchpad_pinch_event_queue.h b/content/browser/renderer_host/input/touchpad_pinch_event_queue.h
index 9900cd9b..cc3959fc 100644
--- a/content/browser/renderer_host/input/touchpad_pinch_event_queue.h
+++ b/content/browser/renderer_host/input/touchpad_pinch_event_queue.h
@@ -25,8 +25,14 @@
  public:
   virtual ~TouchpadPinchEventQueueClient() = default;
 
+  using MouseWheelEventHandledCallback =
+      base::OnceCallback<void(const MouseWheelEventWithLatencyInfo& event,
+                              InputEventAckSource ack_source,
+                              InputEventAckState ack_result)>;
+
   virtual void SendMouseWheelEventForPinchImmediately(
-      const MouseWheelEventWithLatencyInfo& event) = 0;
+      const MouseWheelEventWithLatencyInfo& event,
+      MouseWheelEventHandledCallback callback) = 0;
   virtual void OnGestureEventForPinchAck(
       const GestureEventWithLatencyInfo& event,
       InputEventAckSource ack_source,
@@ -49,19 +55,15 @@
   // coalesced with previously queued events.
   void QueueEvent(const GestureEventWithLatencyInfo& event);
 
-  // Notifies the queue that a synthetic mouse wheel event has been processed
-  // by the renderer.
-  void ProcessMouseWheelAck(InputEventAckSource ack_source,
-                            InputEventAckState ack_result,
-                            const MouseWheelEventWithLatencyInfo& ack_event);
-
   bool has_pending() const WARN_UNUSED_RESULT;
 
-  blink::WebMouseWheelEvent get_wheel_event_awaiting_ack_for_testing() {
-    return wheel_event_awaiting_ack_.value();
-  }
-
  private:
+  // Notifies the queue that a synthetic mouse wheel event has been processed
+  // by the renderer.
+  void ProcessMouseWheelAck(const MouseWheelEventWithLatencyInfo& ack_event,
+                            InputEventAckSource ack_source,
+                            InputEventAckState ack_result);
+
   void TryForwardNextEventToRenderer();
 
   const bool touchpad_async_pinch_events_;
@@ -69,7 +71,6 @@
 
   base::circular_deque<std::unique_ptr<QueuedTouchpadPinchEvent>> pinch_queue_;
   std::unique_ptr<QueuedTouchpadPinchEvent> pinch_event_awaiting_ack_;
-  base::Optional<blink::WebMouseWheelEvent> wheel_event_awaiting_ack_;
   base::Optional<bool> first_event_prevented_;
 
   DISALLOW_COPY_AND_ASSIGN(TouchpadPinchEventQueue);
diff --git a/content/browser/renderer_host/input/touchpad_pinch_event_queue_unittest.cc b/content/browser/renderer_host/input/touchpad_pinch_event_queue_unittest.cc
index b9b8d05..8748a01 100644
--- a/content/browser/renderer_host/input/touchpad_pinch_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/touchpad_pinch_event_queue_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "content/common/input/event_with_latency_info.h"
 #include "content/public/common/content_features.h"
@@ -18,10 +19,10 @@
 
 namespace content {
 
-class MockTouchpadPinchEventQueueClient : public TouchpadPinchEventQueueClient {
+class MockTouchpadPinchEventQueueClient {
  public:
   MockTouchpadPinchEventQueueClient() = default;
-  ~MockTouchpadPinchEventQueueClient() override = default;
+  ~MockTouchpadPinchEventQueueClient() = default;
 
   // TouchpadPinchEventQueueClient
   MOCK_METHOD1(SendMouseWheelEventForPinchImmediately,
@@ -32,7 +33,8 @@
                     InputEventAckState ack_result));
 };
 
-class TouchpadPinchEventQueueTest : public testing::TestWithParam<bool> {
+class TouchpadPinchEventQueueTest : public testing::TestWithParam<bool>,
+                                    public TouchpadPinchEventQueueClient {
  protected:
   TouchpadPinchEventQueueTest() : async_events_enabled_(GetParam()) {
     if (async_events_enabled_) {
@@ -42,7 +44,7 @@
       scoped_feature_list_.InitAndDisableFeature(
           features::kTouchpadAsyncPinchEvents);
     }
-    queue_ = std::make_unique<TouchpadPinchEventQueue>(&mock_client_);
+    queue_ = std::make_unique<TouchpadPinchEventQueue>(this);
   }
   ~TouchpadPinchEventQueueTest() = default;
 
@@ -101,17 +103,39 @@
     QueueEvent(event);
   }
 
+  using HandleEventCallback =
+      base::OnceCallback<void(InputEventAckSource ack_source,
+                              InputEventAckState ack_result)>;
+
   void SendWheelEventAck(InputEventAckSource ack_source,
                          InputEventAckState ack_result) {
-    const MouseWheelEventWithLatencyInfo mouse_event_with_latency_info(
-        queue_->get_wheel_event_awaiting_ack_for_testing(), ui::LatencyInfo());
-    queue_->ProcessMouseWheelAck(ack_source, ack_result,
-                                 mouse_event_with_latency_info);
+    std::move(callbacks_.front()).Run(ack_source, ack_result);
+    callbacks_.pop_front();
+  }
+
+  void SendMouseWheelEventForPinchImmediately(
+      const MouseWheelEventWithLatencyInfo& event,
+      MouseWheelEventHandledCallback callback) override {
+    mock_client_.SendMouseWheelEventForPinchImmediately(event);
+    callbacks_.emplace_back(base::BindOnce(
+        [](MouseWheelEventHandledCallback callback,
+           const MouseWheelEventWithLatencyInfo& event,
+           InputEventAckSource ack_source, InputEventAckState ack_result) {
+          std::move(callback).Run(event, ack_source, ack_result);
+        },
+        std::move(callback), event));
+  }
+
+  void OnGestureEventForPinchAck(const GestureEventWithLatencyInfo& event,
+                                 InputEventAckSource ack_source,
+                                 InputEventAckState ack_result) override {
+    mock_client_.OnGestureEventForPinchAck(event, ack_source, ack_result);
   }
 
   base::test::ScopedFeatureList scoped_feature_list_;
   testing::StrictMock<MockTouchpadPinchEventQueueClient> mock_client_;
   std::unique_ptr<TouchpadPinchEventQueue> queue_;
+  base::circular_deque<HandleEventCallback> callbacks_;
   const bool async_events_enabled_;
 };
 
@@ -644,19 +668,6 @@
   QueuePinchUpdate(1.23, false);
   QueuePinchEnd();
 
-  // Create a fake end event to give to ProcessMouseWheelAck to confirm that
-  // it correctly filters this event out and doesn't start processing the ack.
-  blink::WebMouseWheelEvent fake_end_event(
-      blink::WebInputEvent::kMouseWheel, blink::WebInputEvent::kControlKey,
-      blink::WebInputEvent::GetStaticTimeStampForTests());
-  fake_end_event.dispatch_type = blink::WebMouseWheelEvent::kBlocking;
-  fake_end_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
-  const MouseWheelEventWithLatencyInfo fake_end_event_with_latency_info(
-      fake_end_event, ui::LatencyInfo());
-  queue_->ProcessMouseWheelAck(InputEventAckSource::MAIN_THREAD,
-                               INPUT_EVENT_ACK_STATE_NOT_CONSUMED,
-                               fake_end_event_with_latency_info);
-
   SendWheelEventAck(InputEventAckSource::MAIN_THREAD,
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   SendWheelEventAck(InputEventAckSource::BROWSER,
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc
index d9d40a5..443516d9 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.cc
+++ b/content/browser/speech/speech_recognition_dispatcher_host.cc
@@ -11,7 +11,6 @@
 #include "base/lazy_instance.h"
 #include "base/task/post_task.h"
 #include "content/browser/browser_plugin/browser_plugin_guest.h"
-#include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_manager.h"
 #include "content/browser/speech/speech_recognition_manager_impl.h"
@@ -63,16 +62,6 @@
     blink::mojom::StartSpeechRecognitionRequestParamsPtr params) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
-  // Check that the origin specified by the renderer process is one
-  // that it is allowed to access.
-  if (!params->origin.opaque() &&
-      !ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
-          render_process_id_, params->origin.GetURL())) {
-    LOG(ERROR) << "SRDH::OnStartRequest, disallowed origin: "
-               << params->origin.Serialize();
-    return;
-  }
-
   base::PostTask(
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(&SpeechRecognitionDispatcherHost::StartRequestOnUI,
@@ -91,14 +80,14 @@
   int embedder_render_process_id = 0;
   int embedder_render_frame_id = MSG_ROUTING_NONE;
 
-  WebContentsImpl* web_contents =
-      static_cast<WebContentsImpl*>(WebContentsImpl::FromRenderFrameHostID(
-          render_process_id, render_frame_id));
-  if (!web_contents) {
-    // The render frame id is renderer-provided. If it's invalid, don't crash.
+  RenderFrameHostImpl* rfh =
+      RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
+  if (!rfh) {
     DLOG(ERROR) << "SRDH::OnStartRequest, invalid frame";
     return;
   }
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(WebContents::FromRenderFrameHost(rfh));
 
   // If the speech API request was from an inner WebContents or a guest, save
   // the context of the outer WebContents or the embedder since we will use it
@@ -143,7 +132,7 @@
           &SpeechRecognitionDispatcherHost::StartSessionOnIO,
           speech_recognition_dispatcher_host, std::move(params),
           embedder_render_process_id, embedder_render_frame_id,
-          filter_profanities,
+          rfh->GetLastCommittedOrigin(), filter_profanities,
           storage_partition->GetURLLoaderFactoryForBrowserProcessIOThread(),
           GetContentClient()->browser()->GetAcceptLangs(browser_context)));
 }
@@ -152,6 +141,7 @@
     blink::mojom::StartSpeechRecognitionRequestParamsPtr params,
     int embedder_render_process_id,
     int embedder_render_frame_id,
+    const url::Origin& origin,
     bool filter_profanities,
     std::unique_ptr<network::PendingSharedURLLoaderFactory>
         pending_shared_url_loader_factory,
@@ -159,7 +149,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   SpeechRecognitionSessionContext context;
-  context.security_origin = params->origin;
+  context.security_origin = origin;
   context.render_process_id = render_process_id_;
   context.render_frame_id = render_frame_id_;
   context.embedder_render_process_id = embedder_render_process_id;
@@ -172,7 +162,7 @@
   config.language = params->language;
   config.accept_language = accept_language;
   config.max_hypotheses = params->max_hypotheses;
-  config.origin = params->origin;
+  config.origin = origin;
   config.initial_context = context;
   config.shared_url_loader_factory = network::SharedURLLoaderFactory::Create(
       std::move(pending_shared_url_loader_factory));
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.h b/content/browser/speech/speech_recognition_dispatcher_host.h
index ec4e26d..14d090e 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.h
+++ b/content/browser/speech/speech_recognition_dispatcher_host.h
@@ -23,6 +23,10 @@
 class PendingSharedURLLoaderFactory;
 }
 
+namespace url {
+class Origin;
+}
+
 namespace content {
 
 class SpeechRecognitionSession;
@@ -57,6 +61,7 @@
       blink::mojom::StartSpeechRecognitionRequestParamsPtr params,
       int embedder_render_process_id,
       int embedder_render_frame_id,
+      const url::Origin& origin,
       bool filter_profanities,
       std::unique_ptr<network::PendingSharedURLLoaderFactory>
           pending_shared_url_loader_factory,
diff --git a/content/browser/web_package/web_bundle_browsertest.cc b/content/browser/web_package/web_bundle_browsertest.cc
index dc576185..eb7233c9 100644
--- a/content/browser/web_package/web_bundle_browsertest.cc
+++ b/content/browser/web_package/web_bundle_browsertest.cc
@@ -1066,7 +1066,9 @@
   DISALLOW_COPY_AND_ASSIGN(WebBundleNetworkBrowserTest);
 };
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, Simple) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_Simple) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   RegisterRequestHandler(
@@ -1083,7 +1085,9 @@
                               kNetworkTestPort)));
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, Download) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_Download) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   // Web Bundle file with attachment Content-Disposition must trigger download.
@@ -1106,7 +1110,9 @@
   EXPECT_EQ(url, download_observer->observed_url());
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, NoContentLength) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_NoContentLength) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   // No Content-Length header.
@@ -1121,7 +1127,9 @@
                               kNetworkTestPort)));
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, NonSecureUrl) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_NonSecureUrl) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   RegisterRequestHandler(
@@ -1137,7 +1145,10 @@
       "Web Bundle response must be served from HTTPS or localhost HTTP.");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, PrimaryURLNotFound) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
+                       DISABLED_PrimaryURLNotFound) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network_primary_url_not_found.wbn");
 
@@ -1154,7 +1165,9 @@
       "The primary URL resource is not found in the web bundle.");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, OriginMismatch) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_OriginMismatch) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   RegisterRequestHandler(
@@ -1171,7 +1184,9 @@
       "bundle.");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, InvalidFile) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_InvalidFile) {
   const std::string test_bundle = GetTestFile("invalid_web_bundle.wbn");
   RegisterRequestHandler(
       "/web_bundle/test.wbn",
@@ -1186,7 +1201,10 @@
       "Failed to read metadata of Web Bundle file: Wrong magic bytes.");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DataDecoderRestart) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
+                       DISABLED_DataDecoderRestart) {
   const GURL primary_url(base::StringPrintf(
       "http://localhost:%d/web_bundle/network/", kNetworkTestPort));
   const GURL script_url(base::StringPrintf(
@@ -1225,7 +1243,10 @@
   EXPECT_EQ(2, mock_factory.GetParserCreationCount());
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, ParseMetadataCrash) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
+                       DISABLED_ParseMetadataCrash) {
   const GURL primary_url(base::StringPrintf(
       "http://localhost:%d/web_bundle/network/", kNetworkTestPort));
   const std::string test_bundle = "<title>Ready</title>";
@@ -1248,7 +1269,10 @@
                         "connect to the remote parser service");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, ParseResponseCrash) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
+                       DISABLED_ParseResponseCrash) {
   const GURL primary_url(base::StringPrintf(
       "http://localhost:%d/web_bundle/network/", kNetworkTestPort));
   const std::string test_bundle = "<title>Ready</title>";
@@ -1271,7 +1295,9 @@
                         "Cannot connect to the remote parser service");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, PathMismatch) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_PathMismatch) {
   const std::string test_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
   RegisterRequestHandler(
@@ -1293,7 +1319,9 @@
           kNetworkTestPort, kNetworkTestPort));
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, Navigations) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, DISABLED_Navigations) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   RegisterRequestHandler(
       "/web_bundle/path_test/in_scope/path_test.wbn",
@@ -1331,7 +1359,10 @@
       "In scope page from server / in scope script from server");
 }
 
-IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, HistoryNavigations) {
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
+IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
+                       DISABLED_HistoryNavigations) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   RegisterRequestHandler(
       "/web_bundle/path_test/in_scope/path_test.wbn",
@@ -1385,8 +1416,10 @@
                 kNetworkTestPort)));
 }
 
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
 IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
-                       HistoryNavigationError_UnexpectedContentType) {
+                       DISABLED_HistoryNavigationError_UnexpectedContentType) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   RunHistoryNavigationErrorTest(
       base::StringPrintf("HTTP/1.1 200 OK\n"
@@ -1403,8 +1436,10 @@
       test_bundle, "Unexpected content type.");
 }
 
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
 IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
-                       HistoryNavigationError_UnexpectedRedirect) {
+                       DISABLED_HistoryNavigationError_UnexpectedRedirect) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   RunHistoryNavigationErrorTest(
       base::StringPrintf("HTTP/1.1 200 OK\n"
@@ -1418,8 +1453,10 @@
       "", "Unexpected redirect.");
 }
 
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
 IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
-                       HistoryNavigationError_ReadMetadataFailure) {
+                       DISABLED_HistoryNavigationError_ReadMetadataFailure) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   const std::string invalid_bundle = GetTestFile("invalid_web_bundle.wbn");
   RunHistoryNavigationErrorTest(
@@ -1438,8 +1475,10 @@
       "Failed to read metadata of Web Bundle file: Wrong magic bytes.");
 }
 
+// TODO(crbug.com/1038346): Starting the embedded test server on a fixed port
+// will fail if the bot is simultaneously running several of these tests.
 IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest,
-                       HistoryNavigationError_ExpectedUrlNotFound) {
+                       DISABLED_HistoryNavigationError_ExpectedUrlNotFound) {
   const std::string test_bundle = GetTestFile("path_test.wbn");
   const std::string other_bundle =
       GetTestFile("web_bundle_browsertest_network.wbn");
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 82de7a3..adfcfa3 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -521,9 +521,6 @@
   // They're moved here to distinguish them from actual base checks
   WebRuntimeFeatures::EnableOverlayScrollbars(ui::IsOverlayScrollbarEnabled());
 
-  WebRuntimeFeatures::EnableFormControlsRefresh(
-      features::IsFormControlsRefreshEnabled());
-
   if (base::FeatureList::GetInstance()->IsFeatureOverriddenFromCommandLine(
           blink::features::kNativeFileSystemAPI.name,
           base::FeatureList::OVERRIDE_ENABLE_FEATURE)) {
diff --git a/content/renderer/input/main_thread_event_queue_unittest.cc b/content/renderer/input/main_thread_event_queue_unittest.cc
index af1f29a..35a467c 100644
--- a/content/renderer/input/main_thread_event_queue_unittest.cc
+++ b/content/renderer/input/main_thread_event_queue_unittest.cc
@@ -27,18 +27,56 @@
 using blink::WebMouseWheelEvent;
 using blink::WebTouchEvent;
 
-namespace blink {
-bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) {
-  return memcmp(&lhs, &rhs, lhs.size()) == 0;
-}
-}  // namespace blink
-
 namespace content {
 namespace {
 
 // Simulate a 16ms frame signal.
 const base::TimeDelta kFrameInterval = base::TimeDelta::FromMilliseconds(16);
 
+bool Equal(const WebTouchEvent& lhs, const WebTouchEvent& rhs) {
+  auto tie = [](const WebTouchEvent& e) {
+    return std::make_tuple(
+        e.touches_length, e.dispatch_type, e.moved_beyond_slop_region,
+        e.hovering, e.touch_start_or_first_touch_move, e.unique_touch_event_id,
+        e.GetType(), e.TimeStamp(), e.FrameScale(), e.FrameTranslate(),
+        e.GetModifiers());
+  };
+  if (tie(lhs) != tie(rhs))
+    return false;
+
+  for (unsigned i = 0; i < lhs.touches_length; ++i) {
+    auto touch_tie = [](const blink::WebTouchPoint& e) {
+      return std::make_tuple(e.state, e.radius_x, e.radius_y, e.rotation_angle,
+                             e.id, e.tilt_x, e.tilt_y, e.tangential_pressure,
+                             e.twist, e.button, e.pointer_type, e.movement_x,
+                             e.movement_y, e.is_raw_movement_event,
+                             e.PositionInWidget(), e.PositionInScreen());
+    };
+
+    if (touch_tie(lhs.touches[i]) != touch_tie(rhs.touches[i]) ||
+        (!std::isnan(lhs.touches[i].force) &&
+         !std::isnan(rhs.touches[i].force) &&
+         lhs.touches[i].force != rhs.touches[i].force))
+      return false;
+  }
+
+  return true;
+}
+
+bool Equal(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) {
+  auto tie = [](const WebMouseWheelEvent& e) {
+    return std::make_tuple(
+        e.delta_x, e.delta_y, e.wheel_ticks_x, e.wheel_ticks_y,
+        e.acceleration_ratio_x, e.acceleration_ratio_y, e.phase,
+        e.momentum_phase, e.rails_mode, e.dispatch_type, e.event_action,
+        e.has_synthetic_phase, e.delta_units, e.click_count, e.menu_source_type,
+        e.id, e.button, e.movement_x, e.movement_y, e.is_raw_movement_event,
+        e.GetType(), e.TimeStamp(), e.FrameScale(), e.FrameTranslate(),
+        e.GetModifiers(), e.PositionInWidget(), e.PositionInScreen());
+  };
+  return tie(lhs) == tie(rhs);
+}
+
 }  // namespace
 
 class HandledTask {
@@ -329,7 +367,7 @@
     ui::Coalesce(kEvents[1], &coalesced_event);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *last_wheel_event);
+    EXPECT_TRUE(Equal(coalesced_event, *last_wheel_event));
   }
 
   {
@@ -340,14 +378,14 @@
         static_cast<const WebMouseWheelEvent*>(coalesced_events[0]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_wheel_event0);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_wheel_event0));
 
     coalesced_event = kEvents[1];
     const WebMouseWheelEvent* coalesced_wheel_event1 =
         static_cast<const WebMouseWheelEvent*>(coalesced_events[1]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_wheel_event1);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_wheel_event1));
   }
 
   {
@@ -358,7 +396,7 @@
     ui::Coalesce(kEvents[3], &coalesced_event);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *last_wheel_event);
+    EXPECT_TRUE(Equal(coalesced_event, *last_wheel_event));
   }
 
   {
@@ -369,14 +407,14 @@
         static_cast<const WebMouseWheelEvent*>(coalesced_events[0]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_wheel_event0);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_wheel_event0));
 
     coalesced_event = kEvents[3];
     const WebMouseWheelEvent* coalesced_wheel_event1 =
         static_cast<const WebMouseWheelEvent*>(coalesced_events[1]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_wheel_event1);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_wheel_event1));
   }
 }
 
@@ -416,14 +454,14 @@
       handled_tasks_.at(0)->taskAsEvent()->EventPointer());
   kEvents[0].dispatch_type =
       WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-  EXPECT_EQ(kEvents[0], *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents[0], *last_touch_event));
 
   {
     EXPECT_EQ(1u, handled_tasks_[0]->taskAsEvent()->CoalescedEventSize());
     const WebTouchEvent* coalesced_touch_event =
         static_cast<const WebTouchEvent*>(
             handled_tasks_[0]->taskAsEvent()->GetCoalescedEventsPointers()[0]);
-    EXPECT_EQ(kEvents[0], *coalesced_touch_event);
+    EXPECT_TRUE(Equal(kEvents[0], *coalesced_touch_event));
   }
 
   EXPECT_EQ(kEvents[1].size(),
@@ -434,14 +472,14 @@
       handled_tasks_.at(1)->taskAsEvent()->EventPointer());
   kEvents[1].dispatch_type =
       WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-  EXPECT_EQ(kEvents[1], *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents[1], *last_touch_event));
 
   {
     EXPECT_EQ(1u, handled_tasks_[1]->taskAsEvent()->CoalescedEventSize());
     const WebTouchEvent* coalesced_touch_event =
         static_cast<const WebTouchEvent*>(
             handled_tasks_[1]->taskAsEvent()->GetCoalescedEventsPointers()[0]);
-    EXPECT_EQ(kEvents[1], *coalesced_touch_event);
+    EXPECT_TRUE(Equal(kEvents[1], *coalesced_touch_event));
   }
 
   EXPECT_EQ(kEvents[2].size(),
@@ -454,7 +492,7 @@
   ui::Coalesce(kEvents[3], &coalesced_event);
   coalesced_event.dispatch_type =
       WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-  EXPECT_EQ(coalesced_event, *last_touch_event);
+  EXPECT_TRUE(Equal(coalesced_event, *last_touch_event));
 
   {
     EXPECT_EQ(2u, handled_tasks_[2]->taskAsEvent()->CoalescedEventSize());
@@ -465,14 +503,14 @@
         static_cast<const WebTouchEvent*>(coalesced_events[0]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_touch_event0);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_touch_event0));
 
     coalesced_event = kEvents[3];
     const WebTouchEvent* coalesced_touch_event1 =
         static_cast<const WebTouchEvent*>(coalesced_events[1]);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *coalesced_touch_event1);
+    EXPECT_TRUE(Equal(coalesced_event, *coalesced_touch_event1));
   }
 }
 
@@ -577,7 +615,7 @@
     ui::Coalesce(kWheelEvents[1], &coalesced_event);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *last_wheel_event);
+    EXPECT_TRUE(Equal(coalesced_event, *last_wheel_event));
   }
   {
     EXPECT_EQ(kTouchEvents[0].size(),
@@ -590,7 +628,7 @@
     ui::Coalesce(kTouchEvents[1], &coalesced_event);
     coalesced_event.dispatch_type =
         WebInputEvent::DispatchType::kListenersNonBlockingPassive;
-    EXPECT_EQ(coalesced_event, *last_touch_event);
+    EXPECT_TRUE(Equal(coalesced_event, *last_touch_event));
   }
 }
 
@@ -969,7 +1007,7 @@
   const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(0)->taskAsEvent()->EventPointer());
   kEvents.dispatch_type = WebInputEvent::kListenersForcedNonBlockingDueToFling;
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   kEvents.MovePoint(0, 30, 30);
   EXPECT_FALSE(main_task_runner_->HasPendingTask());
@@ -990,7 +1028,7 @@
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(1)->taskAsEvent()->EventPointer());
   kEvents.dispatch_type = WebInputEvent::kListenersForcedNonBlockingDueToFling;
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   kEvents.MovePoint(0, 50, 50);
   kEvents.touch_start_or_first_touch_move = false;
@@ -1009,7 +1047,7 @@
   EXPECT_EQ(kEvents.dispatch_type, WebInputEvent::kBlocking);
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(2)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   kEvents.ReleasePoint(0);
   HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING);
@@ -1027,7 +1065,7 @@
   EXPECT_EQ(kEvents.dispatch_type, WebInputEvent::kBlocking);
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(3)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 }
 
 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) {
@@ -1056,7 +1094,7 @@
   EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
   const WebTouchEvent* last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(0)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   set_enable_fling_passive_listener_flag(false);
   HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
@@ -1075,7 +1113,7 @@
   EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(1)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   set_enable_fling_passive_listener_flag(true);
   HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
@@ -1094,7 +1132,7 @@
   EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(2)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 
   kEvents.MovePoint(0, 30, 30);
   HandleEvent(kEvents, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
@@ -1113,7 +1151,7 @@
   EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
   last_touch_event = static_cast<const WebTouchEvent*>(
       handled_tasks_.at(3)->taskAsEvent()->EventPointer());
-  EXPECT_EQ(kEvents, *last_touch_event);
+  EXPECT_TRUE(Equal(kEvents, *last_touch_event));
 }
 
 class MainThreadEventQueueInitializationTest
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 6cb8f312..b0a4f31 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1090,6 +1090,7 @@
     "//components/services/storage/public/cpp",
     "//components/ukm:test_support",
     "//components/url_formatter:url_formatter",
+    "//components/viz/host",
     "//components/viz/test:test_support",
     "//content:resources",
     "//content/app:both_for_content_tests",
diff --git a/content/test/portal/portal_activated_observer.cc b/content/test/portal/portal_activated_observer.cc
index 251498b..a00cdd0 100644
--- a/content/test/portal/portal_activated_observer.cc
+++ b/content/test/portal/portal_activated_observer.cc
@@ -6,11 +6,7 @@
 
 #include "base/auto_reset.h"
 #include "base/run_loop.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "content/browser/compositor/surface_utils.h"
-#include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/test/hit_test_region_observer.h"
 
 namespace content {
 
@@ -49,38 +45,6 @@
   return *result_;
 }
 
-void PortalActivatedObserver::WaitForActivateAndHitTestData() {
-  RenderFrameHostImpl* portal_frame =
-      interceptor_->GetPortalContents()->GetMainFrame();
-  WaitForActivate();
-
-  RenderWidgetHostViewBase* view =
-      portal_frame->GetRenderWidgetHost()->GetView();
-  viz::FrameSinkId root_frame_sink_id = view->GetRootFrameSinkId();
-  HitTestRegionObserver observer(root_frame_sink_id);
-  observer.WaitForHitTestData();
-
-  while (true) {
-    const auto& display_hit_test_query_map =
-        GetHostFrameSinkManager()->display_hit_test_query();
-    auto it = display_hit_test_query_map.find(root_frame_sink_id);
-    // On Mac, we create a new root layer after activation, so the hit test data
-    // may not have anything for the new layer yet.
-    if (it != display_hit_test_query_map.end()) {
-      viz::HitTestQuery* query = it->second.get();
-      size_t index = 0;
-      if (query->FindIndexOfFrameSink(view->GetFrameSinkId(), &index)) {
-        // The hit test region for the portal frame should be at index 1 after
-        // activation, so we wait for the hit test data to update until it's in
-        // this state.
-        if (index == 1)
-          return;
-      }
-    }
-    observer.WaitForHitTestDataChange();
-  }
-}
-
 void PortalActivatedObserver::OnPortalActivate() {
   DCHECK(!has_activated_)
       << "PortalActivatedObserver can't handle overlapping activations.";
diff --git a/content/test/portal/portal_activated_observer.h b/content/test/portal/portal_activated_observer.h
index 294ee3a..f0ef3424 100644
--- a/content/test/portal/portal_activated_observer.h
+++ b/content/test/portal/portal_activated_observer.h
@@ -44,10 +44,6 @@
   // point.
   blink::mojom::PortalActivateResult WaitForActivateResult();
 
-  // Waits for the Activate method to be called by the predecessor renderer and
-  // for hit test data to be refreshed.
-  void WaitForActivateAndHitTestData();
-
  private:
   // PortalInterceptorForTesting::Observer:
   void OnPortalActivate() override;
diff --git a/content/test/web_gesture_curve_mock.cc b/content/test/web_gesture_curve_mock.cc
index bcb06d91..87dc81a 100644
--- a/content/test/web_gesture_curve_mock.cc
+++ b/content/test/web_gesture_curve_mock.cc
@@ -4,8 +4,6 @@
 
 #include "content/test/web_gesture_curve_mock.h"
 
-#include "third_party/blink/public/platform/web_float_size.h"
-
 WebGestureCurveMock::WebGestureCurveMock(
     const gfx::Vector2dF& velocity,
     const blink::WebSize& cumulative_scroll)
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
index 866b132..37f736ff 100644
--- a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
@@ -251,7 +251,7 @@
   bluez::BluezDBusManager::Get()
       ->GetBluetoothAgentManagerClient()
       ->UnregisterAgent(dbus::ObjectPath(kAgentPath), base::DoNothing(),
-                        base::Bind(&OnUnregisterAgentError));
+                        base::BindOnce(&OnUnregisterAgentError));
 
   agent_.reset();
 
@@ -775,12 +775,13 @@
   BLUETOOTH_LOG(DEBUG) << "Registering pairing agent";
   bluez::BluezDBusManager::Get()
       ->GetBluetoothAgentManagerClient()
-      ->RegisterAgent(dbus::ObjectPath(kAgentPath),
-                      bluetooth_agent_manager::kKeyboardDisplayCapability,
-                      base::Bind(&BluetoothAdapterBlueZ::OnRegisterAgent,
-                                 weak_ptr_factory_.GetWeakPtr()),
-                      base::Bind(&BluetoothAdapterBlueZ::OnRegisterAgentError,
-                                 weak_ptr_factory_.GetWeakPtr()));
+      ->RegisterAgent(
+          dbus::ObjectPath(kAgentPath),
+          bluetooth_agent_manager::kKeyboardDisplayCapability,
+          base::BindOnce(&BluetoothAdapterBlueZ::OnRegisterAgent,
+                         weak_ptr_factory_.GetWeakPtr()),
+          base::BindOnce(&BluetoothAdapterBlueZ::OnRegisterAgentError,
+                         weak_ptr_factory_.GetWeakPtr()));
 }
 
 void BluetoothAdapterBlueZ::AgentManagerRemoved(
@@ -936,10 +937,10 @@
       ->GetBluetoothAgentManagerClient()
       ->RequestDefaultAgent(
           dbus::ObjectPath(kAgentPath),
-          base::Bind(&BluetoothAdapterBlueZ::OnRequestDefaultAgent,
-                     weak_ptr_factory_.GetWeakPtr()),
-          base::Bind(&BluetoothAdapterBlueZ::OnRequestDefaultAgentError,
-                     weak_ptr_factory_.GetWeakPtr()));
+          base::BindOnce(&BluetoothAdapterBlueZ::OnRequestDefaultAgent,
+                         weak_ptr_factory_.GetWeakPtr()),
+          base::BindOnce(&BluetoothAdapterBlueZ::OnRequestDefaultAgentError,
+                         weak_ptr_factory_.GetWeakPtr()));
 }
 
 void BluetoothAdapterBlueZ::OnRegisterAgentError(
diff --git a/device/bluetooth/dbus/bluetooth_agent_manager_client.cc b/device/bluetooth/dbus/bluetooth_agent_manager_client.cc
index 0f2bbe6..edccb0e 100644
--- a/device/bluetooth/dbus/bluetooth_agent_manager_client.cc
+++ b/device/bluetooth/dbus/bluetooth_agent_manager_client.cc
@@ -44,8 +44,8 @@
   // BluetoothAgentManagerClient override.
   void RegisterAgent(const dbus::ObjectPath& agent_path,
                      const std::string& capability,
-                     const base::Closure& callback,
-                     const ErrorCallback& error_callback) override {
+                     base::OnceClosure callback,
+                     ErrorCallback error_callback) override {
     dbus::MethodCall method_call(
         bluetooth_agent_manager::kBluetoothAgentManagerInterface,
         bluetooth_agent_manager::kRegisterAgent);
@@ -57,15 +57,16 @@
     object_proxy_->CallMethodWithErrorCallback(
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnSuccess,
-                       weak_ptr_factory_.GetWeakPtr(), callback),
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnError,
-                       weak_ptr_factory_.GetWeakPtr(), error_callback));
+                       weak_ptr_factory_.GetWeakPtr(),
+                       std::move(error_callback)));
   }
 
   // BluetoothAgentManagerClient override.
   void UnregisterAgent(const dbus::ObjectPath& agent_path,
-                       const base::Closure& callback,
-                       const ErrorCallback& error_callback) override {
+                       base::OnceClosure callback,
+                       ErrorCallback error_callback) override {
     dbus::MethodCall method_call(
         bluetooth_agent_manager::kBluetoothAgentManagerInterface,
         bluetooth_agent_manager::kUnregisterAgent);
@@ -76,15 +77,16 @@
     object_proxy_->CallMethodWithErrorCallback(
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnSuccess,
-                       weak_ptr_factory_.GetWeakPtr(), callback),
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnError,
-                       weak_ptr_factory_.GetWeakPtr(), error_callback));
+                       weak_ptr_factory_.GetWeakPtr(),
+                       std::move(error_callback)));
   }
 
   // BluetoothAgentManagerClient override.
   void RequestDefaultAgent(const dbus::ObjectPath& agent_path,
-                           const base::Closure& callback,
-                           const ErrorCallback& error_callback) override {
+                           base::OnceClosure callback,
+                           ErrorCallback error_callback) override {
     dbus::MethodCall method_call(
         bluetooth_agent_manager::kBluetoothAgentManagerInterface,
         bluetooth_agent_manager::kRequestDefaultAgent);
@@ -95,9 +97,10 @@
     object_proxy_->CallMethodWithErrorCallback(
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnSuccess,
-                       weak_ptr_factory_.GetWeakPtr(), callback),
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
         base::BindOnce(&BluetoothAgentManagerClientImpl::OnError,
-                       weak_ptr_factory_.GetWeakPtr(), error_callback));
+                       weak_ptr_factory_.GetWeakPtr(),
+                       std::move(error_callback)));
   }
 
  protected:
@@ -144,14 +147,13 @@
   }
 
   // Called when a response for successful method call is received.
-  void OnSuccess(const base::Closure& callback, dbus::Response* response) {
+  void OnSuccess(base::OnceClosure callback, dbus::Response* response) {
     DCHECK(response);
-    callback.Run();
+    std::move(callback).Run();
   }
 
   // Called when a response for a failed method call is received.
-  void OnError(const ErrorCallback& error_callback,
-               dbus::ErrorResponse* response) {
+  void OnError(ErrorCallback error_callback, dbus::ErrorResponse* response) {
     // Error response has optional error message argument.
     std::string error_name;
     std::string error_message;
@@ -163,7 +165,7 @@
       error_name = kNoResponseError;
       error_message = "";
     }
-    error_callback.Run(error_name, error_message);
+    std::move(error_callback).Run(error_name, error_message);
   }
 
   dbus::ObjectProxy* object_proxy_;
diff --git a/device/bluetooth/dbus/bluetooth_agent_manager_client.h b/device/bluetooth/dbus/bluetooth_agent_manager_client.h
index 6a4e98a..1663293 100644
--- a/device/bluetooth/dbus/bluetooth_agent_manager_client.h
+++ b/device/bluetooth/dbus/bluetooth_agent_manager_client.h
@@ -46,8 +46,9 @@
   // The ErrorCallback is used by agent manager methods to indicate failure.
   // It receives two arguments: the name of the error in |error_name| and
   // an optional message in |error_message|.
-  typedef base::Callback<void(const std::string& error_name,
-                              const std::string& error_message)> ErrorCallback;
+  typedef base::OnceCallback<void(const std::string& error_name,
+                                  const std::string& error_message)>
+      ErrorCallback;
 
   // Registers an agent within the local process at the D-bus object path
   // |agent_path| with the remote agent manager. The agent is used for pairing
@@ -56,20 +57,20 @@
   // one of the constants declared in the bluetooth_agent_manager:: namespace.
   virtual void RegisterAgent(const dbus::ObjectPath& agent_path,
                              const std::string& capability,
-                             const base::Closure& callback,
-                             const ErrorCallback& error_callback) = 0;
+                             base::OnceClosure callback,
+                             ErrorCallback error_callback) = 0;
 
   // Unregisters the agent with the D-Bus object path |agent_path| from the
   // remote agent manager.
   virtual void UnregisterAgent(const dbus::ObjectPath& agent_path,
-                               const base::Closure& callback,
-                               const ErrorCallback& error_callback) = 0;
+                               base::OnceClosure callback,
+                               ErrorCallback error_callback) = 0;
 
   // Requests that the agent with the D-Bus object path |agent_path| be made
   // the default.
   virtual void RequestDefaultAgent(const dbus::ObjectPath& agent_path,
-                                   const base::Closure& callback,
-                                   const ErrorCallback& error_callback) = 0;
+                                   base::OnceClosure callback,
+                                   ErrorCallback error_callback) = 0;
 
   // Creates the instance.
   static BluetoothAgentManagerClient* Create();
diff --git a/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.cc b/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.cc
index 14a1888e..fad79f6 100644
--- a/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.cc
@@ -30,43 +30,47 @@
 void FakeBluetoothAgentManagerClient::RegisterAgent(
     const dbus::ObjectPath& agent_path,
     const std::string& capability,
-    const base::Closure& callback,
-    const ErrorCallback& error_callback) {
+    base::OnceClosure callback,
+    ErrorCallback error_callback) {
   VLOG(1) << "RegisterAgent: " << agent_path.value();
 
   if (service_provider_ == NULL) {
-    error_callback.Run(bluetooth_agent_manager::kErrorInvalidArguments,
-                       "No agent created");
+    std::move(error_callback)
+        .Run(bluetooth_agent_manager::kErrorInvalidArguments,
+             "No agent created");
   } else if (service_provider_->object_path_ != agent_path) {
-    error_callback.Run(bluetooth_agent_manager::kErrorAlreadyExists,
-                       "Agent already registered");
+    std::move(error_callback)
+        .Run(bluetooth_agent_manager::kErrorAlreadyExists,
+             "Agent already registered");
   } else {
-    callback.Run();
+    std::move(callback).Run();
   }
 }
 
 void FakeBluetoothAgentManagerClient::UnregisterAgent(
     const dbus::ObjectPath& agent_path,
-    const base::Closure& callback,
-    const ErrorCallback& error_callback) {
+    base::OnceClosure callback,
+    ErrorCallback error_callback) {
   VLOG(1) << "UnregisterAgent: " << agent_path.value();
   if (service_provider_ == NULL) {
-    error_callback.Run(bluetooth_agent_manager::kErrorDoesNotExist,
-                       "No agent registered");
+    std::move(error_callback)
+        .Run(bluetooth_agent_manager::kErrorDoesNotExist,
+             "No agent registered");
   } else if (service_provider_->object_path_ != agent_path) {
-    error_callback.Run(bluetooth_agent_manager::kErrorDoesNotExist,
-                       "Agent still registered");
+    std::move(error_callback)
+        .Run(bluetooth_agent_manager::kErrorDoesNotExist,
+             "Agent still registered");
   } else {
-    callback.Run();
+    std::move(callback).Run();
   }
 }
 
 void FakeBluetoothAgentManagerClient::RequestDefaultAgent(
     const dbus::ObjectPath& agent_path,
-    const base::Closure& callback,
-    const ErrorCallback& error_callback) {
+    base::OnceClosure callback,
+    ErrorCallback error_callback) {
   VLOG(1) << "RequestDefaultAgent: " << agent_path.value();
-  callback.Run();
+  std::move(callback).Run();
 }
 
 void FakeBluetoothAgentManagerClient::RegisterAgentServiceProvider(
diff --git a/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.h b/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.h
index 6651b5c6..1c03970 100644
--- a/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.h
+++ b/device/bluetooth/dbus/fake_bluetooth_agent_manager_client.h
@@ -32,14 +32,14 @@
   void RemoveObserver(Observer* observer) override;
   void RegisterAgent(const dbus::ObjectPath& agent_path,
                      const std::string& capability,
-                     const base::Closure& callback,
-                     const ErrorCallback& error_callback) override;
+                     base::OnceClosure callback,
+                     ErrorCallback error_callback) override;
   void UnregisterAgent(const dbus::ObjectPath& agent_path,
-                       const base::Closure& callback,
-                       const ErrorCallback& error_callback) override;
+                       base::OnceClosure callback,
+                       ErrorCallback error_callback) override;
   void RequestDefaultAgent(const dbus::ObjectPath& agent_path,
-                           const base::Closure& callback,
-                           const ErrorCallback& error_callback) override;
+                           base::OnceClosure callback,
+                           ErrorCallback error_callback) override;
 
   // Register, unregister and retrieve pointers to agent service providers.
   void RegisterAgentServiceProvider(
diff --git a/docs/windows_build_instructions.md b/docs/windows_build_instructions.md
index dda0acc..e496e715 100644
--- a/docs/windows_build_instructions.md
+++ b/docs/windows_build_instructions.md
@@ -23,8 +23,8 @@
 
 ### Visual Studio
 
-Chromium requires Visual Studio 2017 (>=15.7.2) or 2019 (>=16.0.0) to build.
-Visual Studio can also be used to debug Chromium and Visual Studio 2019 is
+Chromium requires Visual Studio 2017 (>=15.7.2) to build, but VS2019 (>=16.0.0)
+is preferred. Visual Studio can also be used to debug Chromium, and VS2019 is
 preferred for this as it handles Chromium's large debug information much better.
 The clang-cl compiler is used but Visual Studio's header files, libraries, and
 some tools are required. Visual Studio Community Edition should work if its
@@ -89,8 +89,8 @@
 Also, add a DEPOT_TOOLS_WIN_TOOLCHAIN system variable in the same way, and set
 it to 0. This tells depot_tools to use your locally installed version of Visual
 Studio (by default, depot_tools will try to use a google-internal version). If
-you want to build with Visual Studio 2019 instead of Visual Studio 2017 (the
-default) then set the GYP_MSVS_VERSION environment variable to 2019.
+you want to build with Visual Studio 2017 instead of Visual Studio 2019 (the
+default) then set the GYP_MSVS_VERSION environment variable to 2017.
 
 From a cmd.exe shell, run the command gclient (without arguments). On first
 run, gclient will install all the Windows-specific bits needed to work with
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc
index f674dac..68444957 100644
--- a/extensions/browser/content_verifier.cc
+++ b/extensions/browser/content_verifier.cc
@@ -503,6 +503,11 @@
                      std::move(callback)));
 }
 
+bool ContentVerifier::ShouldComputeHashesOnInstall(const Extension& extension) {
+  return delegate_->GetVerifierSourceType(extension) ==
+         ContentVerifierDelegate::VerifierSourceType::UNSIGNED_HASHES;
+}
+
 void ContentVerifier::VerifyFailed(const ExtensionId& extension_id,
                                    ContentVerifyJob::FailureReason reason) {
   if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
diff --git a/extensions/browser/content_verifier.h b/extensions/browser/content_verifier.h
index bec90db01..972c093 100644
--- a/extensions/browser/content_verifier.h
+++ b/extensions/browser/content_verifier.h
@@ -89,6 +89,13 @@
                       bool force_missing_computed_hashes_creation,
                       ContentHashCallback callback);
 
+  // Returns whether or not we should compute hashes during installation.
+  // Typically we don't need this when extension has verified (signed) resources
+  // hashes, as we can postpone hashes computing to the time we'll need them and
+  // check there. But without signed hashes we may not compute hashes at
+  // arbitrary time, we are only allowed to do it during installation.
+  bool ShouldComputeHashesOnInstall(const Extension& extension);
+
   GURL GetSignatureFetchUrlForTest(const ExtensionId& extension_id,
                                    const base::Version& extension_version);
 
diff --git a/extensions/browser/sandboxed_unpacker.cc b/extensions/browser/sandboxed_unpacker.cc
index ce4df30..c50a41f 100644
--- a/extensions/browser/sandboxed_unpacker.cc
+++ b/extensions/browser/sandboxed_unpacker.cc
@@ -30,6 +30,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/api/declarative_net_request/constants.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_source.h"
+#include "extensions/browser/computed_hashes.h"
 #include "extensions/browser/extension_file_task_runner.h"
 #include "extensions/browser/install/crx_install_error.h"
 #include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
@@ -209,6 +210,15 @@
   return message_catalog_paths;
 }
 
+// Callback for ComputedHashes::Create, compute hashes for all files except
+// _metadata directory (e.g. computed_hashes.json itself).
+bool ShouldComputeHashesForResource(
+    const base::FilePath& relative_resource_path) {
+  std::vector<base::FilePath::StringType> components;
+  relative_resource_path.GetComponents(&components);
+  return !components.empty() && components[0] != kMetadataFolder;
+}
+
 base::Optional<crx_file::VerifierFormat> g_verifier_format_override_for_test;
 
 }  // namespace
@@ -219,6 +229,12 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
+void SandboxedUnpackerClient::ShouldComputeHashesForOffWebstoreExtension(
+    scoped_refptr<const Extension> extension,
+    base::OnceCallback<void(bool)> callback) {
+  std::move(callback).Run(false);
+}
+
 SandboxedUnpacker::ScopedVerifierFormatOverrideForTest::
     ScopedVerifierFormatOverrideForTest(crx_file::VerifierFormat format) {
   DCHECK(!g_verifier_format_override_for_test.has_value());
@@ -684,7 +700,8 @@
 
   if (!declarative_net_request::DNRManifestData::HasRuleset(*extension_)) {
     // The extension did not provide a ruleset.
-    ReportSuccess(std::move(manifest), base::nullopt /*dnr_ruleset_checksum*/);
+    CheckComputeHashes(std::move(manifest),
+                       base::nullopt /*dnr_ruleset_checksum*/);
     return;
   }
 
@@ -707,7 +724,7 @@
     UMA_HISTOGRAM_TIMES(
         declarative_net_request::kIndexAndPersistRulesTimeHistogram,
         result.index_and_persist_time);
-    ReportSuccess(std::move(manifest), result.ruleset_checksum);
+    CheckComputeHashes(std::move(manifest), result.ruleset_checksum);
     return;
   }
 
@@ -716,6 +733,41 @@
                                            base::UTF8ToUTF16(result.error)));
 }
 
+void SandboxedUnpacker::CheckComputeHashes(
+    std::unique_ptr<base::DictionaryValue> manifest,
+    const base::Optional<int>& dnr_ruleset_checksum) {
+  DCHECK(unpacker_io_task_runner_->RunsTasksInCurrentSequence());
+  client_->ShouldComputeHashesForOffWebstoreExtension(
+      extension_, base::BindOnce(&SandboxedUnpacker::MaybeComputeHashes, this,
+                                 std::move(manifest), dnr_ruleset_checksum));
+}
+
+void SandboxedUnpacker::MaybeComputeHashes(
+    std::unique_ptr<base::DictionaryValue> original_manifest,
+    const base::Optional<int>& dnr_ruleset_checksum,
+    bool should_compute) {
+  DCHECK(unpacker_io_task_runner_->RunsTasksInCurrentSequence());
+  if (!should_compute) {
+    ReportSuccess(std::move(original_manifest), dnr_ruleset_checksum);
+    return;
+  }
+
+  base::Optional<ComputedHashes::Data> computed_hashes_data =
+      ComputedHashes::Compute(
+          extension_->path(),
+          extension_misc::kContentVerificationDefaultBlockSize,
+          IsCancelledCallback(),
+          base::BindRepeating(&ShouldComputeHashesForResource));
+  if (!computed_hashes_data ||
+      !ComputedHashes(std::move(*computed_hashes_data))
+           .WriteToFile(file_util::GetComputedHashesPath(extension_->path()))) {
+    LOG(ERROR) << "[extension " << extension_->id()
+               << "] Failed to create computed_hashes.json";
+  }
+
+  ReportSuccess(std::move(original_manifest), dnr_ruleset_checksum);
+}
+
 data_decoder::mojom::JsonParser* SandboxedUnpacker::GetJsonParserPtr() {
   DCHECK(unpacker_io_task_runner_->RunsTasksInCurrentSequence());
   if (!json_parser_) {
diff --git a/extensions/browser/sandboxed_unpacker.h b/extensions/browser/sandboxed_unpacker.h
index 62698e2..f3e1038 100644
--- a/extensions/browser/sandboxed_unpacker.h
+++ b/extensions/browser/sandboxed_unpacker.h
@@ -12,6 +12,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_delete_on_sequence.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/strings/string_piece.h"
@@ -51,6 +52,14 @@
   // the constructor call must also happen on the UI thread.
   SandboxedUnpackerClient();
 
+  // Determines whether |extension| requires computing and storing
+  // computed_hashes.json and returns the result through |callback|.
+  // Currently we do this only for force-installed extensions outside of Chrome
+  // Web Store, and that is reflected in method's name.
+  virtual void ShouldComputeHashesForOffWebstoreExtension(
+      scoped_refptr<const Extension> extension,
+      base::OnceCallback<void(bool)> callback);
+
   // temp_dir - A temporary directory containing the results of the extension
   // unpacking. The client is responsible for deleting this directory.
   //
@@ -224,6 +233,19 @@
       std::unique_ptr<base::DictionaryValue> manifest,
       declarative_net_request::IndexAndPersistJSONRulesetResult result);
 
+  // Computed hashes: if requested (via ShouldComputeHashes callback in
+  // SandbloxedUnpackerClient), calculate hashes of all extensions' resources
+  // and writes them in _metadata/computed_hashes.json. This is used by content
+  // verification system for extensions outside of Chrome Web Store.
+  void CheckComputeHashes(
+      std::unique_ptr<base::DictionaryValue> original_manifest,
+      const base::Optional<int>& dnr_ruleset_checksum);
+
+  void MaybeComputeHashes(
+      std::unique_ptr<base::DictionaryValue> original_manifest,
+      const base::Optional<int>& dnr_ruleset_checksum,
+      bool should_compute_hashes);
+
   // Returns a JsonParser that can be used on the |unpacker_io_task_runner|.
   data_decoder::mojom::JsonParser* GetJsonParserPtr();
 
diff --git a/extensions/browser/sandboxed_unpacker_unittest.cc b/extensions/browser/sandboxed_unpacker_unittest.cc
index c01afc7..ca1c84c 100644
--- a/extensions/browser/sandboxed_unpacker_unittest.cc
+++ b/extensions/browser/sandboxed_unpacker_unittest.cc
@@ -28,6 +28,7 @@
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_paths.h"
+#include "extensions/common/file_util.h"
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/switches.h"
 #include "extensions/common/value_builder.h"
@@ -106,12 +107,22 @@
     deleted_tracker_ = deleted_tracker;
   }
 
+  void set_should_compute_hashes(bool should_compute_hashes) {
+    should_compute_hashes_ = should_compute_hashes;
+  }
+
  private:
   ~MockSandboxedUnpackerClient() override {
     if (deleted_tracker_)
       *deleted_tracker_ = true;
   }
 
+  void ShouldComputeHashesForOffWebstoreExtension(
+      scoped_refptr<const Extension> extension,
+      base::OnceCallback<void(bool)> callback) override {
+    std::move(callback).Run(should_compute_hashes_);
+  }
+
   void OnUnpackSuccess(
       const base::FilePath& temp_dir,
       const base::FilePath& extension_root,
@@ -132,6 +143,7 @@
   base::OnceClosure quit_closure_;
   base::FilePath temp_dir_;
   bool* deleted_tracker_ = nullptr;
+  bool should_compute_hashes_ = false;
 };
 
 class SandboxedUnpackerTest : public ExtensionsTest {
@@ -527,6 +539,24 @@
       GetInstallErrorDetail());
 }
 
+TEST_F(SandboxedUnpackerTest, NoComputeHashes) {
+  client_->set_should_compute_hashes(false);
+  SetupUnpacker("good_package.crx", "");
+  EXPECT_TRUE(InstallSucceeded());
+  EXPECT_TRUE(GetInstallErrorMessage().empty());
+  EXPECT_FALSE(
+      base::PathExists(file_util::GetComputedHashesPath(GetInstallPath())));
+}
+
+TEST_F(SandboxedUnpackerTest, ComputeHashes) {
+  client_->set_should_compute_hashes(true);
+  SetupUnpacker("good_package.crx", "");
+  EXPECT_TRUE(InstallSucceeded());
+  EXPECT_TRUE(GetInstallErrorMessage().empty());
+  EXPECT_TRUE(
+      base::PathExists(file_util::GetComputedHashesPath(GetInstallPath())));
+}
+
 // SandboxedUnpacker is ref counted and is reference by callbacks and
 // InterfacePtrs. This tests that it gets deleted as expected (so that no extra
 // refs are left).
diff --git a/fuchsia/engine/browser/context_impl.cc b/fuchsia/engine/browser/context_impl.cc
index 785e05d..f6e339a9 100644
--- a/fuchsia/engine/browser/context_impl.cc
+++ b/fuchsia/engine/browser/context_impl.cc
@@ -47,7 +47,7 @@
 void ContextImpl::DestroyFrame(FrameImpl* frame) {
   auto iter = frames_.find(frame);
   DCHECK(iter != frames_.end());
-  frames_.erase(frames_.find(frame));
+  frames_.erase(iter);
 }
 
 bool ContextImpl::IsJavaScriptInjectionAllowed() {
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index acc467ab..04bf17c 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -295,7 +295,6 @@
     "command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc",
     "command_buffer/service/shared_image_factory_unittest.cc",
     "command_buffer/service/shared_image_manager_unittest.cc",
-    "command_buffer/service/shared_image_representation_unittest.cc",
     "command_buffer/service/shared_image_test_utils.cc",
     "command_buffer/service/shared_image_test_utils.h",
     "command_buffer/tests/compressed_texture_test.cc",
diff --git a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
index be4d292..f7f0427 100644
--- a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
+++ b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
@@ -93,7 +93,7 @@
     // the result.
     // TODO(cwallez@chromium.org): This is incorrect and allows reading
     // uninitialized data. When !IsCleared we should tell dawn_native to
-    // consider the texture lazy-cleared. crbug.com/1036080
+    // consider the texture lazy-cleared.
     SetCleared();
   }
 
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index 00965e3d..a876c06a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -391,10 +391,7 @@
 bool PassthroughResources::SharedImageData::BeginAccess(GLenum mode,
                                                         gl::GLApi* api) {
   DCHECK(!is_being_accessed());
-  // When importing a texture for use in passthrough cmd decoder, always allow
-  // uncleared access. We ensure the texture is cleared below.
-  scoped_access_ = representation_->BeginScopedAccess(
-      mode, SharedImageRepresentation::AllowUnclearedAccess::kYes);
+  scoped_access_ = representation_->BeginScopedAccess(mode);
   if (!scoped_access_) {
     return false;
   }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc
index f2fffe2c..9069424 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_unittest_textures.cc
@@ -166,10 +166,17 @@
     EXPECT_EQ(GL_NO_ERROR, GetGLError());
     cmds::EndSharedImageAccessDirectCHROMIUM readwrite_end_cmd;
     readwrite_end_cmd.Init(client_id);
+    // EXPECT_EQ(error::kNoError, ExecuteCmd(readwrite_end_cmd));
+    // EXPECT_EQ(GL_NO_ERROR, GetGLError());
+  }
+
+  for (int i = 20; i > 10; --i) {
+    cmds::EndSharedImageAccessDirectCHROMIUM readwrite_end_cmd;
+    readwrite_end_cmd.Init(kNewClientId + i);
     EXPECT_EQ(error::kNoError, ExecuteCmd(readwrite_end_cmd));
     EXPECT_EQ(GL_NO_ERROR, GetGLError());
-
-    DoDeleteTexture(client_id);
+    DoDeleteTexture(kNewClientId + i);
+    fprintf(stderr, "EEEE DoDeleteTexture() i=%d\n", i);
   }
 
   // Cleanup
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index c333429c..6ab2f00 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -1796,19 +1796,16 @@
 
   std::unique_ptr<SharedImageRepresentationGLTexturePassthrough::ScopedAccess>
       source_access = source_shared_image->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kNo);
+          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
   if (!source_access) {
     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
                        "unable to access source for read");
     return;
   }
 
-  // Allow uncleared access, as we manually handle clear tracking.
   std::unique_ptr<SharedImageRepresentationGLTexturePassthrough::ScopedAccess>
       dest_access = dest_shared_image->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kYes);
+          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
   if (!dest_access) {
     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
                        "unable to access destination for write");
@@ -1875,8 +1872,7 @@
 
   std::unique_ptr<SharedImageRepresentationGLTexture::ScopedAccess>
       source_access = source_shared_image->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kNo);
+          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
   if (!source_access) {
     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
                        "unable to access source for read");
@@ -1895,11 +1891,9 @@
     return;
   }
 
-  // Allow uncleared access, as we manually handle clear tracking.
   std::unique_ptr<SharedImageRepresentationGLTexture::ScopedAccess>
       dest_access = dest_shared_image->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kYes);
+          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
   if (!dest_access) {
     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
                        "unable to access destination for write");
@@ -2122,11 +2116,9 @@
   std::vector<GrBackendSemaphore> begin_semaphores;
   std::vector<GrBackendSemaphore> end_semaphores;
 
-  // Allow uncleared access, as we manually handle clear tracking.
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       dest_scoped_access = dest_shared_image->BeginScopedWriteAccess(
-          &begin_semaphores, &end_semaphores,
-          SharedImageRepresentation::AllowUnclearedAccess::kYes);
+          &begin_semaphores, &end_semaphores);
   if (!dest_scoped_access) {
     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTexture",
                        "Dest shared image is not writable");
@@ -2344,11 +2336,8 @@
   std::vector<GrBackendSemaphore> begin_semaphores;
   DCHECK(end_semaphores_.empty());
   DCHECK(!scoped_shared_image_write_);
-  // Allow uncleared access, as raster specifically handles uncleared images by
-  // clearing them before writing.
   scoped_shared_image_write_ = shared_image_->BeginScopedWriteAccess(
-      final_msaa_count, surface_props, &begin_semaphores, &end_semaphores_,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      final_msaa_count, surface_props, &begin_semaphores, &end_semaphores_);
   if (!scoped_shared_image_write_) {
     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginRasterCHROMIUM",
                        "failed to create surface");
diff --git a/gpu/command_buffer/service/raster_decoder_unittest.cc b/gpu/command_buffer/service/raster_decoder_unittest.cc
index 0ac91df5..b6fc328e 100644
--- a/gpu/command_buffer/service/raster_decoder_unittest.cc
+++ b/gpu/command_buffer/service/raster_decoder_unittest.cc
@@ -298,11 +298,6 @@
   init.extensions.push_back("GL_EXT_texture_rg");
   InitDecoder(init);
 
-  // Recreate |client_texture_mailbox_| as a cleared mailbox.
-  client_texture_mailbox_ = CreateFakeTexture(
-      kServiceTextureId, viz::ResourceFormat::RGBA_8888, /*width=*/2,
-      /*height=*/2, /*cleared=*/true);
-
   // Create dest texture.
   gpu::Mailbox dest_texture_mailbox =
       CreateFakeTexture(kNewServiceId, viz::ResourceFormat::RED_8,
diff --git a/gpu/command_buffer/service/shared_image_backing_egl_image.cc b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
index 6f93bfe..71803a0c 100644
--- a/gpu/command_buffer/service/shared_image_backing_egl_image.cc
+++ b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
@@ -59,6 +59,11 @@
       egl_backing()->EndRead(this, std::move(egl_fence));
     } else if (mode_ == RepresentationAccessMode::kWrite) {
       egl_backing()->EndWrite(std::move(egl_fence));
+
+      if (texture_) {
+        if (texture_->IsLevelCleared(texture_->target(), 0))
+          backing()->SetCleared();
+      }
     } else {
       NOTREACHED();
     }
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
index 68becc3..183dcdd 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -234,6 +234,11 @@
       ahb_backing()->EndRead(this, std::move(sync_fd));
     } else if (mode_ == RepresentationAccessMode::kWrite) {
       ahb_backing()->EndWrite(std::move(sync_fd));
+
+      if (texture_) {
+        if (texture_->IsLevelCleared(texture_->target(), 0))
+          backing()->SetCleared();
+      }
     }
 
     mode_ = RepresentationAccessMode::kNone;
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
index eec33c3c..4e4a2529 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -127,8 +127,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   EXPECT_TRUE(scoped_write_access);
   auto* surface = scoped_write_access->surface();
   EXPECT_TRUE(surface);
@@ -326,8 +325,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   EXPECT_TRUE(scoped_write_access);
   EXPECT_EQ(0u, begin_semaphores.size());
   EXPECT_EQ(0u, end_semaphores.size());
@@ -339,8 +337,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access2;
   scoped_write_access2 = skia_representation2->BeginScopedWriteAccess(
-      &begin_semaphores2, &end_semaphores2,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores2, &end_semaphores2);
   EXPECT_FALSE(scoped_write_access);
   EXPECT_EQ(0u, begin_semaphores2.size());
   EXPECT_EQ(0u, end_semaphores2.size());
@@ -422,8 +419,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation2->BeginScopedWriteAccess(
-      &begin_semaphores2, &end_semaphores2,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores2, &end_semaphores2);
   EXPECT_FALSE(scoped_write_access);
   EXPECT_EQ(0u, begin_semaphores2.size());
   EXPECT_EQ(0u, end_semaphores2.size());
@@ -450,8 +446,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   EXPECT_TRUE(scoped_write_access);
   EXPECT_EQ(0u, begin_semaphores.size());
   EXPECT_EQ(0u, end_semaphores.size());
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc b/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc
index 4b55763..9308011d 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc
@@ -460,7 +460,7 @@
     // the result.
     // TODO(cwallez@chromium.org): This is incorrect and allows reading
     // uninitialized data. When !IsCleared we should tell dawn_native to
-    // consider the texture lazy-cleared. crbug.com/1036080
+    // consider the texture lazy-cleared.
     SetCleared();
   } else {
     d3d_image_backing->EndAccessD3D12();
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc
index a8e4214..2165650 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_d3d_unittest.cc
@@ -514,8 +514,7 @@
 
   std::unique_ptr<SharedImageRepresentationGLTexturePassthrough::ScopedAccess>
       scoped_access = gl_representation->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kYes);
+          GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
   EXPECT_TRUE(scoped_access);
 
   // Create an FBO.
@@ -585,8 +584,7 @@
     ASSERT_TRUE(dawn_representation);
 
     auto scoped_access = dawn_representation->BeginScopedAccess(
-        WGPUTextureUsage_OutputAttachment,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
+        WGPUTextureUsage_OutputAttachment);
     ASSERT_TRUE(scoped_access);
 
     wgpu::Texture texture = wgpu::Texture::Acquire(scoped_access->texture());
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
index 751ee24..8e97860 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
@@ -270,8 +270,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   auto* surface = scoped_write_access->surface();
   EXPECT_TRUE(surface);
   EXPECT_EQ(size.width(), surface->width());
@@ -382,8 +381,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   auto* surface = scoped_write_access->surface();
   EXPECT_TRUE(surface);
   EXPECT_EQ(size.width(), surface->width());
@@ -886,8 +884,7 @@
   // Begin writing to the underlying texture of the backing via ScopedAccess.
   std::unique_ptr<SharedImageRepresentationGLTexture::ScopedAccess>
       writer_scoped_access = gl_representation->BeginScopedAccess(
-          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM,
-          SharedImageRepresentation::AllowUnclearedAccess::kNo);
+          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
 
   DCHECK(writer_scoped_access);
 
@@ -906,8 +903,6 @@
   // Set the clear color to green.
   api->glClearColorFn(0.0f, 1.0f, 0.0f, 1.0f);
   api->glClearFn(GL_COLOR_BUFFER_BIT);
-  gl_representation->GetTexture()->SetLevelCleared(
-      gl_representation->GetTexture()->target(), 0, true);
 
   // End writing.
   writer_scoped_access.reset();
@@ -996,8 +991,7 @@
   std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
       scoped_write_access;
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kNo);
+      &begin_semaphores, &end_semaphores);
   auto* surface = scoped_write_access->surface();
   EXPECT_TRUE(surface);
   EXPECT_EQ(size_.width(), surface->width());
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
index b460c93..31afb13 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface.mm
@@ -304,7 +304,7 @@
       // the result.
       // TODO(cwallez@chromium.org): This is incorrect and allows reading
       // uninitialized data. When !IsCleared we should tell dawn_native to
-      // consider the texture lazy-cleared. crbug.com/1036080
+      // consider the texture lazy-cleared.
       SetCleared();
     }
 
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
index 19e87966..245f841 100644
--- a/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
+++ b/gpu/command_buffer/service/shared_image_backing_factory_iosurface_unittest.cc
@@ -143,8 +143,7 @@
       scoped_write_access;
 
   scoped_write_access = skia_representation->BeginScopedWriteAccess(
-      &begin_semaphores, &end_semaphores,
-      SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      &begin_semaphores, &end_semaphores);
   auto* surface = scoped_write_access->surface();
   EXPECT_TRUE(surface);
   EXPECT_EQ(size.width(), surface->width());
@@ -190,36 +189,27 @@
                                      memory_type_tracker_.get());
 
   // Create a SharedImageRepresentationGLTexture.
-  {
-    auto gl_representation =
-        shared_image_representation_factory_->ProduceGLTexture(mailbox);
-    EXPECT_TRUE(gl_representation);
-    EXPECT_EQ(expected_target, gl_representation->GetTexture()->target());
+  auto gl_representation =
+      shared_image_representation_factory_->ProduceGLTexture(mailbox);
+  EXPECT_TRUE(gl_representation);
+  EXPECT_EQ(expected_target, gl_representation->GetTexture()->target());
 
-    // Access the SharedImageRepresentationGLTexutre
-    auto scoped_write_access = gl_representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
+  // Create an FBO.
+  GLuint fbo = 0;
+  gl::GLApi* api = gl::g_current_gl_context;
+  api->glGenFramebuffersEXTFn(1, &fbo);
+  api->glBindFramebufferEXTFn(GL_FRAMEBUFFER, fbo);
 
-    // Create an FBO.
-    GLuint fbo = 0;
-    gl::GLApi* api = gl::g_current_gl_context;
-    api->glGenFramebuffersEXTFn(1, &fbo);
-    api->glBindFramebufferEXTFn(GL_FRAMEBUFFER, fbo);
+  // Attach the texture to FBO.
+  api->glFramebufferTexture2DEXTFn(
+      GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+      gl_representation->GetTexture()->target(),
+      gl_representation->GetTexture()->service_id(), 0);
 
-    // Attach the texture to FBO.
-    api->glFramebufferTexture2DEXTFn(
-        GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-        gl_representation->GetTexture()->target(),
-        gl_representation->GetTexture()->service_id(), 0);
-
-    // Set the clear color to green.
-    api->glClearColorFn(0.0f, 1.0f, 0.0f, 1.0f);
-    api->glClearFn(GL_COLOR_BUFFER_BIT);
-
-    gl_representation->GetTexture()->SetLevelCleared(
-        gl_representation->GetTexture()->target(), 0, true);
-  }
+  // Set the clear color to green.
+  api->glClearColorFn(0.0f, 1.0f, 0.0f, 1.0f);
+  api->glClearFn(GL_COLOR_BUFFER_BIT);
+  gl_representation.reset();
 
   // Next create a SharedImageRepresentationSkia to read back the texture data.
   auto skia_representation = shared_image_representation_factory_->ProduceSkia(
@@ -363,8 +353,7 @@
   // Clear the shared image to green using Dawn.
   {
     auto scoped_access = dawn_representation->BeginScopedAccess(
-        WGPUTextureUsage_OutputAttachment,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
+        WGPUTextureUsage_OutputAttachment);
     ASSERT_TRUE(scoped_access);
     wgpu::Texture texture = wgpu::Texture::Acquire(scoped_access->texture());
 
diff --git a/gpu/command_buffer/service/shared_image_representation.cc b/gpu/command_buffer/service/shared_image_representation.cc
index 5a42baba..7234e590 100644
--- a/gpu/command_buffer/service/shared_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image_representation.cc
@@ -4,7 +4,6 @@
 
 #include "gpu/command_buffer/service/shared_image_representation.h"
 
-#include "gpu/command_buffer/service/texture_manager.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
 
 namespace gpu {
@@ -23,14 +22,7 @@
 }
 
 std::unique_ptr<SharedImageRepresentationGLTexture::ScopedAccess>
-SharedImageRepresentationGLTextureBase::BeginScopedAccess(
-    GLenum mode,
-    AllowUnclearedAccess allow_uncleared) {
-  if (allow_uncleared != AllowUnclearedAccess::kYes && !IsCleared()) {
-    LOG(ERROR) << "Attempt to access an uninitialized ShardImage";
-    return nullptr;
-  }
-
+SharedImageRepresentationGLTextureBase::BeginScopedAccess(GLenum mode) {
   if (!BeginAccess(mode))
     return nullptr;
 
@@ -52,15 +44,6 @@
   return false;
 }
 
-void SharedImageRepresentationGLTexture::UpdateClearedStateOnEndAccess() {
-  auto* texture = GetTexture();
-  // Operations on the gles2::Texture may have cleared or uncleared it. Make
-  // sure this state is reflected back in the SharedImage.
-  gfx::Rect cleared_rect = texture->GetLevelClearedRect(texture->target(), 0);
-  if (cleared_rect != ClearedRect())
-    SetClearedRect(cleared_rect);
-}
-
 SharedImageRepresentationSkia::ScopedWriteAccess::ScopedWriteAccess(
     util::PassKey<SharedImageRepresentationSkia> /* pass_key */,
     SharedImageRepresentationSkia* representation,
@@ -76,13 +59,7 @@
     int final_msaa_count,
     const SkSurfaceProps& surface_props,
     std::vector<GrBackendSemaphore>* begin_semaphores,
-    std::vector<GrBackendSemaphore>* end_semaphores,
-    AllowUnclearedAccess allow_uncleared) {
-  if (allow_uncleared != AllowUnclearedAccess::kYes && !IsCleared()) {
-    LOG(ERROR) << "Attempt to write to an uninitialized ShardImage";
-    return nullptr;
-  }
-
+    std::vector<GrBackendSemaphore>* end_semaphores) {
   sk_sp<SkSurface> surface = BeginWriteAccess(final_msaa_count, surface_props,
                                               begin_semaphores, end_semaphores);
   if (!surface)
@@ -95,12 +72,11 @@
 std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess>
 SharedImageRepresentationSkia::BeginScopedWriteAccess(
     std::vector<GrBackendSemaphore>* begin_semaphores,
-    std::vector<GrBackendSemaphore>* end_semaphores,
-    AllowUnclearedAccess allow_uncleared) {
+    std::vector<GrBackendSemaphore>* end_semaphores) {
   return BeginScopedWriteAccess(
       0 /* final_msaa_count */,
       SkSurfaceProps(0 /* flags */, kUnknown_SkPixelGeometry), begin_semaphores,
-      end_semaphores, allow_uncleared);
+      end_semaphores);
 }
 
 SharedImageRepresentationSkia::ScopedReadAccess::ScopedReadAccess(
@@ -118,11 +94,6 @@
 SharedImageRepresentationSkia::BeginScopedReadAccess(
     std::vector<GrBackendSemaphore>* begin_semaphores,
     std::vector<GrBackendSemaphore>* end_semaphores) {
-  if (!IsCleared()) {
-    LOG(ERROR) << "Attempt to read from an uninitialized ShardImage";
-    return nullptr;
-  }
-
   sk_sp<SkPromiseImageTexture> promise_image_texture =
       BeginReadAccess(begin_semaphores, end_semaphores);
   if (!promise_image_texture)
@@ -135,11 +106,6 @@
 
 std::unique_ptr<SharedImageRepresentationOverlay::ScopedReadAccess>
 SharedImageRepresentationOverlay::BeginScopedReadAccess(bool needs_gl_image) {
-  if (!IsCleared()) {
-    LOG(ERROR) << "Attempt to read from an uninitialized ShardImage";
-    return nullptr;
-  }
-
   BeginReadAccess();
   return std::make_unique<ScopedReadAccess>(
       util::PassKey<SharedImageRepresentationOverlay>(), this,
@@ -157,14 +123,7 @@
 }
 
 std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess>
-SharedImageRepresentationDawn::BeginScopedAccess(
-    WGPUTextureUsage usage,
-    AllowUnclearedAccess allow_uncleared) {
-  if (allow_uncleared != AllowUnclearedAccess::kYes && !IsCleared()) {
-    LOG(ERROR) << "Attempt to access an uninitialized ShardImage";
-    return nullptr;
-  }
-
+SharedImageRepresentationDawn::BeginScopedAccess(WGPUTextureUsage usage) {
   WGPUTexture texture = BeginAccess(usage);
   if (!texture)
     return nullptr;
diff --git a/gpu/command_buffer/service/shared_image_representation.h b/gpu/command_buffer/service/shared_image_representation.h
index da832e8..96699f1 100644
--- a/gpu/command_buffer/service/shared_image_representation.h
+++ b/gpu/command_buffer/service/shared_image_representation.h
@@ -44,9 +44,6 @@
 // api.
 class GPU_GLES2_EXPORT SharedImageRepresentation {
  public:
-  // Used by derived classes.
-  enum class AllowUnclearedAccess { kYes, kNo };
-
   SharedImageRepresentation(SharedImageManager* manager,
                             SharedImageBacking* backing,
                             MemoryTypeTracker* tracker);
@@ -109,10 +106,7 @@
     ScopedAccess(util::PassKey<SharedImageRepresentationGLTextureBase> pass_key,
                  SharedImageRepresentationGLTextureBase* representation)
         : representation_(representation) {}
-    ~ScopedAccess() {
-      representation_->UpdateClearedStateOnEndAccess();
-      representation_->EndAccess();
-    }
+    ~ScopedAccess() { representation_->EndAccess(); }
 
    private:
     SharedImageRepresentationGLTextureBase* representation_ = nullptr;
@@ -125,16 +119,11 @@
                                          MemoryTypeTracker* tracker)
       : SharedImageRepresentation(manager, backing, tracker) {}
 
-  std::unique_ptr<ScopedAccess> BeginScopedAccess(
-      GLenum mode,
-      AllowUnclearedAccess allow_uncleared);
+  std::unique_ptr<ScopedAccess> BeginScopedAccess(GLenum mode);
 
  protected:
   friend class SharedImageRepresentationSkiaGL;
 
-  // Can be overridden to handle clear state tracking when GL access ends.
-  virtual void UpdateClearedStateOnEndAccess() {}
-
   // TODO(ericrk): Make these pure virtual and ensure real implementations
   // exist.
   virtual bool BeginAccess(GLenum mode);
@@ -151,9 +140,6 @@
 
   // TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686
   virtual gles2::Texture* GetTexture() = 0;
-
- protected:
-  void UpdateClearedStateOnEndAccess() override;
 };
 
 class GPU_GLES2_EXPORT SharedImageRepresentationGLTexturePassthrough
@@ -217,13 +203,10 @@
       int final_msaa_count,
       const SkSurfaceProps& surface_props,
       std::vector<GrBackendSemaphore>* begin_semaphores,
-      std::vector<GrBackendSemaphore>* end_semaphores,
-      AllowUnclearedAccess allow_uncleared);
-
+      std::vector<GrBackendSemaphore>* end_semaphores);
   std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(
       std::vector<GrBackendSemaphore>* begin_semaphores,
-      std::vector<GrBackendSemaphore>* end_semaphores,
-      AllowUnclearedAccess allow_uncleared);
+      std::vector<GrBackendSemaphore>* end_semaphores);
 
   // Note: See BeginReadAccess below for a description of the semaphore
   // parameters.
@@ -288,9 +271,7 @@
   // Calls BeginAccess and returns a ScopedAccess object which will EndAccess
   // when it goes out of scope. The Representation must outlive the returned
   // ScopedAccess.
-  std::unique_ptr<ScopedAccess> BeginScopedAccess(
-      WGPUTextureUsage usage,
-      AllowUnclearedAccess allow_uncleared);
+  std::unique_ptr<ScopedAccess> BeginScopedAccess(WGPUTextureUsage usage);
 
  private:
   // This can return null in case of a Dawn validation error, for example if
diff --git a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc
index df4a9d4..1b7d95f 100644
--- a/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc
+++ b/gpu/command_buffer/service/shared_image_representation_dawn_ozone.cc
@@ -90,7 +90,7 @@
     // the result.
     // TODO(cwallez@chromium.org): This is incorrect and allows reading
     // uninitialized data. When !IsCleared we should tell dawn_native to
-    // consider the texture lazy-cleared. crbug.com/1036080
+    // consider the texture lazy-cleared.
     SetCleared();
   } else {
     close(fd);
diff --git a/gpu/command_buffer/service/shared_image_representation_unittest.cc b/gpu/command_buffer/service/shared_image_representation_unittest.cc
deleted file mode 100644
index 81c6055..0000000
--- a/gpu/command_buffer/service/shared_image_representation_unittest.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "gpu/command_buffer/service/shared_image_representation.h"
-
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "gpu/command_buffer/service/shared_context_state.h"
-#include "gpu/command_buffer/service/shared_image_backing.h"
-#include "gpu/command_buffer/service/shared_image_representation.h"
-#include "gpu/command_buffer/service/test_shared_image_backing.h"
-#include "gpu/command_buffer/service/texture_manager.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkPromiseImageTexture.h"
-#include "third_party/skia/include/gpu/GrBackendSurface.h"
-
-namespace gpu {
-
-class SharedImageRepresentationTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    tracker_ = std::make_unique<MemoryTypeTracker>(nullptr);
-    mailbox_ = Mailbox::GenerateForSharedImage();
-    auto format = viz::ResourceFormat::RGBA_8888;
-    gfx::Size size(256, 256);
-    auto color_space = gfx::ColorSpace::CreateSRGB();
-    uint32_t usage = SHARED_IMAGE_USAGE_GLES2;
-
-    auto backing = std::make_unique<TestSharedImageBacking>(
-        mailbox_, format, size, color_space, usage, 0 /* estimated_size */);
-    factory_ref_ = manager_.Register(std::move(backing), tracker_.get());
-  }
-
- protected:
-  gpu::Mailbox mailbox_;
-  SharedImageManager manager_;
-  std::unique_ptr<MemoryTypeTracker> tracker_;
-  std::unique_ptr<SharedImageRepresentationFactoryRef> factory_ref_;
-};
-
-TEST_F(SharedImageRepresentationTest, GLTextureClearing) {
-  auto representation = manager_.ProduceGLTexture(mailbox_, tracker_.get());
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin access when |allow_uncleared| is false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Begin/End access should not modify clear status on its own.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Clearing underlying GL texture should clear the SharedImage.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
-    ASSERT_TRUE(scoped_access);
-    representation->GetTexture()->SetLevelCleared(GL_TEXTURE_2D, 0,
-                                                  true /* cleared */);
-  }
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can now begin accdess with |allow_uncleared| == false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_TRUE(scoped_access);
-  }
-}
-
-TEST_F(SharedImageRepresentationTest, GLTexturePassthroughClearing) {
-  auto representation =
-      manager_.ProduceGLTexturePassthrough(mailbox_, tracker_.get());
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin access when |allow_uncleared| is false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Begin/End access will not clear the representation on its own.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Clear the SharedImage.
-  representation->SetCleared();
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can now begin accdess with |allow_uncleared| == false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_TRUE(scoped_access);
-  }
-}
-
-TEST_F(SharedImageRepresentationTest, SkiaClearing) {
-  auto representation = manager_.ProduceSkia(mailbox_, tracker_.get(), nullptr);
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin read access.
-  {
-    auto scoped_access =
-        representation->BeginScopedReadAccess(nullptr, nullptr);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin write access when |allow_uncleared| is
-  // false.
-  {
-    auto scoped_access = representation->BeginScopedWriteAccess(
-        nullptr, nullptr, SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We can begin write access when |allow_uncleared| is true.
-  {
-    auto scoped_access = representation->BeginScopedWriteAccess(
-        nullptr, nullptr,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Clear the SharedImage.
-  representation->SetCleared();
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can now begin read access.
-  {
-    auto scoped_access =
-        representation->BeginScopedReadAccess(nullptr, nullptr);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can also begin write access with |allow_uncleared| == false.
-  {
-    auto scoped_access = representation->BeginScopedWriteAccess(
-        nullptr, nullptr, SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_TRUE(representation->IsCleared());
-}
-
-TEST_F(SharedImageRepresentationTest, DawnClearing) {
-  auto representation =
-      manager_.ProduceDawn(mailbox_, tracker_.get(), nullptr /* device */);
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin access with |allow_uncleared| == false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        WGPUTextureUsage_None,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We can begin access when |allow_uncleared| is true.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        WGPUTextureUsage_None,
-        SharedImageRepresentation::AllowUnclearedAccess::kYes);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Clear the SharedImage.
-  representation->SetCleared();
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can also begin access with |allow_uncleared| == false.
-  {
-    auto scoped_access = representation->BeginScopedAccess(
-        WGPUTextureUsage_None,
-        SharedImageRepresentation::AllowUnclearedAccess::kNo);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_TRUE(representation->IsCleared());
-}
-
-TEST_F(SharedImageRepresentationTest, OverlayClearing) {
-  auto representation = manager_.ProduceOverlay(mailbox_, tracker_.get());
-  EXPECT_FALSE(representation->IsCleared());
-
-  // We should not be able to begin read ccess.
-  {
-    auto scoped_access =
-        representation->BeginScopedReadAccess(false /* needs_gl_image */);
-    EXPECT_FALSE(scoped_access);
-  }
-  EXPECT_FALSE(representation->IsCleared());
-
-  // Clear the SharedImage.
-  representation->SetCleared();
-  EXPECT_TRUE(representation->IsCleared());
-
-  // We can now begin read access.
-  {
-    auto scoped_access =
-        representation->BeginScopedReadAccess(false /* needs_gl_image */);
-    EXPECT_TRUE(scoped_access);
-  }
-  EXPECT_TRUE(representation->IsCleared());
-}
-
-}  // namespace gpu
diff --git a/gpu/command_buffer/service/test_shared_image_backing.cc b/gpu/command_buffer/service/test_shared_image_backing.cc
index 3427f341a..62fac229 100644
--- a/gpu/command_buffer/service/test_shared_image_backing.cc
+++ b/gpu/command_buffer/service/test_shared_image_backing.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "gpu/command_buffer/service/test_shared_image_backing.h"
-#include "build/build_config.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
@@ -56,75 +55,6 @@
   const scoped_refptr<gles2::TexturePassthrough> texture_;
 };
 
-class TestSharedImageRepresentationSkia : public SharedImageRepresentationSkia {
- public:
-  TestSharedImageRepresentationSkia(SharedImageManager* manager,
-                                    SharedImageBacking* backing,
-                                    MemoryTypeTracker* tracker)
-      : SharedImageRepresentationSkia(manager, backing, tracker) {}
-
- protected:
-  sk_sp<SkSurface> BeginWriteAccess(
-      int final_msaa_count,
-      const SkSurfaceProps& surface_props,
-      std::vector<GrBackendSemaphore>* begin_semaphores,
-      std::vector<GrBackendSemaphore>* end_semaphores) override {
-    if (!static_cast<TestSharedImageBacking*>(backing())->can_access()) {
-      return nullptr;
-    }
-    return SkSurface::MakeRasterN32Premul(size().width(), size().height());
-  }
-  void EndWriteAccess(sk_sp<SkSurface> surface) override {}
-  sk_sp<SkPromiseImageTexture> BeginReadAccess(
-      std::vector<GrBackendSemaphore>* begin_semaphores,
-      std::vector<GrBackendSemaphore>* end_semaphores) override {
-    if (!static_cast<TestSharedImageBacking*>(backing())->can_access()) {
-      return nullptr;
-    }
-    GrBackendTexture backend_tex(size().width(), size().height(),
-                                 GrMipMapped::kNo, GrMockTextureInfo());
-    return SkPromiseImageTexture::Make(backend_tex);
-  }
-  void EndReadAccess() override {}
-};
-
-class TestSharedImageRepresentationDawn : public SharedImageRepresentationDawn {
- public:
-  TestSharedImageRepresentationDawn(SharedImageManager* manager,
-                                    SharedImageBacking* backing,
-                                    MemoryTypeTracker* tracker)
-      : SharedImageRepresentationDawn(manager, backing, tracker) {}
-
-  WGPUTexture BeginAccess(WGPUTextureUsage usage) override {
-    if (!static_cast<TestSharedImageBacking*>(backing())->can_access()) {
-      return nullptr;
-    }
-
-    // Return a dummy value.
-    return reinterpret_cast<WGPUTexture>(203);
-  }
-
-  void EndAccess() override {}
-};
-
-class TestSharedImageRepresentationOverlay
-    : public SharedImageRepresentationOverlay {
- public:
-  TestSharedImageRepresentationOverlay(SharedImageManager* manager,
-                                       SharedImageBacking* backing,
-                                       MemoryTypeTracker* tracker)
-      : SharedImageRepresentationOverlay(manager, backing, tracker) {}
-
-  void BeginReadAccess() override {}
-  void EndReadAccess() override {}
-  gl::GLImage* GetGLImage() override { return nullptr; }
-
-#if defined(OS_ANDROID)
-  void NotifyOverlayPromotion(bool promotion,
-                              const gfx::Rect& bounds) override {}
-#endif
-};
-
 }  // namespace
 
 TestSharedImageBacking::TestSharedImageBacking(
@@ -216,28 +146,4 @@
       manager, this, tracker, texture_passthrough_);
 }
 
-std::unique_ptr<SharedImageRepresentationSkia>
-TestSharedImageBacking::ProduceSkia(
-    SharedImageManager* manager,
-    MemoryTypeTracker* tracker,
-    scoped_refptr<SharedContextState> context_state) {
-  return std::make_unique<TestSharedImageRepresentationSkia>(manager, this,
-                                                             tracker);
-}
-
-std::unique_ptr<SharedImageRepresentationDawn>
-TestSharedImageBacking::ProduceDawn(SharedImageManager* manager,
-                                    MemoryTypeTracker* tracker,
-                                    WGPUDevice device) {
-  return std::make_unique<TestSharedImageRepresentationDawn>(manager, this,
-                                                             tracker);
-}
-
-std::unique_ptr<SharedImageRepresentationOverlay>
-TestSharedImageBacking::ProduceOverlay(SharedImageManager* manager,
-                                       MemoryTypeTracker* tracker) {
-  return std::make_unique<TestSharedImageRepresentationOverlay>(manager, this,
-                                                                tracker);
-}
-
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/test_shared_image_backing.h b/gpu/command_buffer/service/test_shared_image_backing.h
index 14d3654..93540b8 100644
--- a/gpu/command_buffer/service/test_shared_image_backing.h
+++ b/gpu/command_buffer/service/test_shared_image_backing.h
@@ -52,20 +52,6 @@
   ProduceGLTexturePassthrough(SharedImageManager* manager,
                               MemoryTypeTracker* tracker) override;
 
-  // ProduceSkia/Dawn/Overlay all create dummy representations that
-  // don't link up to a real texture.
-  std::unique_ptr<SharedImageRepresentationSkia> ProduceSkia(
-      SharedImageManager* manager,
-      MemoryTypeTracker* tracker,
-      scoped_refptr<SharedContextState> context_state) override;
-  std::unique_ptr<SharedImageRepresentationDawn> ProduceDawn(
-      SharedImageManager* manager,
-      MemoryTypeTracker* tracker,
-      WGPUDevice device) override;
-  std::unique_ptr<SharedImageRepresentationOverlay> ProduceOverlay(
-      SharedImageManager* manager,
-      MemoryTypeTracker* tracker) override;
-
  private:
   const GLuint service_id_ = 0;
   gles2::Texture* texture_ = nullptr;
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index b889041..4ca4a0a 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -2106,27 +2106,15 @@
 }
 
 bool TextureRef::BeginAccessSharedImage(GLenum mode) {
-  // When accessing through TextureManager, we are using legacy GL logic which
-  // tracks clearning internally. Always allow access to uncleared
-  // SharedImages.
-  shared_image_scoped_access_ = shared_image_->BeginScopedAccess(
-      mode, SharedImageRepresentation::AllowUnclearedAccess::kYes);
+  shared_image_scoped_access_ = shared_image_->BeginScopedAccess(mode);
   if (!shared_image_scoped_access_) {
     return false;
   }
-  // After beginning access, the returned gles2::Texture's cleared status
-  // should match the SharedImage's.
-  DCHECK_EQ(shared_image_->ClearedRect(),
-            texture_->GetLevelClearedRect(texture_->target(), 0));
   return true;
 }
 
 void TextureRef::EndAccessSharedImage() {
   shared_image_scoped_access_.reset();
-  // After ending access, the SharedImages cleared rect should be synchronized
-  // with |texture_|'s.
-  DCHECK_EQ(shared_image_->ClearedRect(),
-            texture_->GetLevelClearedRect(texture_->target(), 0));
 }
 
 void TextureRef::ForceContextLost() {
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 343088a3..adb00ed1 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -836,12 +836,8 @@
     return error::kInvalidArguments;
   }
 
-  // TODO(cwallez@chromium.org): Handle texture clearing. We should either
-  // pre-clear textures, or implement a way to detect whether DAWN has cleared
-  // a texture. crbug.com/1036080
   std::unique_ptr<SharedImageRepresentationDawn::ScopedAccess>
-      shared_image_access = shared_image->BeginScopedAccess(
-          wgpu_usage, SharedImageRepresentation::AllowUnclearedAccess::kYes);
+      shared_image_access = shared_image->BeginScopedAccess(wgpu_usage);
   if (!shared_image_access) {
     DLOG(ERROR) << "AssociateMailbox: Couldn't begin shared image access";
     return error::kInvalidArguments;
diff --git a/gpu/command_buffer/service/wrapped_sk_image.cc b/gpu/command_buffer/service/wrapped_sk_image.cc
index d8c46b23f..528b8f9 100644
--- a/gpu/command_buffer/service/wrapped_sk_image.cc
+++ b/gpu/command_buffer/service/wrapped_sk_image.cc
@@ -157,7 +157,6 @@
       if (!image_)
         return false;
 
-      SetCleared();
       OnWriteSucceeded();
     } else {
       // Initializing to bright green makes it obvious if the pixels are not
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
index 5485f1e..4c088b7 100644
--- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
+++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -86,8 +86,8 @@
 }
 
 GURL IOSChromeSyncedTabDelegate::GetVirtualURLAtIndex(int i) const {
-  DCHECK_GE(i, 0);
   if (GetSessionStorageIfNeeded()) {
+    DCHECK_GE(i, 0);
     NSArray* item_storages = session_storage_.itemStorages;
     DCHECK_LT(i, static_cast<int>(item_storages.count));
     CRWNavigationItemStorage* item = item_storages[i];
@@ -98,8 +98,8 @@
 }
 
 GURL IOSChromeSyncedTabDelegate::GetFaviconURLAtIndex(int i) const {
-  DCHECK_GE(i, 0);
   if (GetSessionStorageIfNeeded()) {
+    DCHECK_GE(i, 0);
     return GURL();
   }
   NavigationItem* item = GetPossiblyPendingItemAtIndex(web_state_, i);
@@ -108,8 +108,8 @@
 
 ui::PageTransition IOSChromeSyncedTabDelegate::GetTransitionAtIndex(
     int i) const {
-  DCHECK_GE(i, 0);
   if (GetSessionStorageIfNeeded()) {
+    DCHECK_GE(i, 0);
     return ui::PAGE_TRANSITION_LINK;
   }
   NavigationItem* item = GetPossiblyPendingItemAtIndex(web_state_, i);
@@ -223,21 +223,21 @@
   // is displayed. Before restoration, the session storage must be used.
   bool should_use_storage =
       web_state_->GetNavigationManager()->IsRestoreSessionInProgress();
-  bool storage_has_tabs = false;
+  bool storage_has_navigation_items = false;
   if (should_use_storage) {
     if (!session_storage_) {
       session_storage_ = web_state_->BuildSessionStorage();
     }
-    storage_has_tabs = session_storage_.itemStorages.count;
+    storage_has_navigation_items = session_storage_.itemStorages.count;
 #if DCHECK_IS_ON()
-    if (storage_has_tabs) {
+    if (storage_has_navigation_items) {
       DCHECK_GE(session_storage_.lastCommittedItemIndex, 0);
       DCHECK_LT(session_storage_.lastCommittedItemIndex,
                 static_cast<int>(session_storage_.itemStorages.count));
     }
 #endif
   }
-  return should_use_storage && storage_has_tabs;
+  return should_use_storage && storage_has_navigation_items;
 }
 
 WEB_STATE_USER_DATA_KEY_IMPL(IOSChromeSyncedTabDelegate)
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 aae101d..a6cec0e 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -91,6 +91,7 @@
 #import "ios/chrome/browser/ui/download/download_manager_coordinator.h"
 #import "ios/chrome/browser/ui/elements/activity_overlay_coordinator.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_view_controller.h"
 #import "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_animator.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
@@ -115,6 +116,7 @@
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
 #import "ios/chrome/browser/ui/payments/payment_request_manager.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.h"
+#include "ios/chrome/browser/ui/presenters/contained_presenter_delegate.h"
 #import "ios/chrome/browser/ui/presenters/vertical_animation_container.h"
 #import "ios/chrome/browser/ui/sad_tab/sad_tab_coordinator.h"
 #import "ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator.h"
@@ -341,6 +343,7 @@
 @interface BrowserViewController () <ActivityServicePresentation,
                                      BubblePresenterDelegate,
                                      CaptivePortalDetectorTabHelperDelegate,
+                                     ContainedPresenterDelegate,
                                      CRWWebStateDelegate,
                                      CRWWebStateObserver,
                                      DialogPresenterDelegate,
@@ -671,11 +674,9 @@
 - (void)updateFindBar:(BOOL)initialUpdate shouldFocus:(BOOL)shouldFocus;
 // Hide find bar.
 - (void)hideFindBarWithAnimation:(BOOL)animate;
-// Shows find bar. If |selectText| is YES, all text inside the Find Bar
-// textfield will be selected. If |shouldFocus| is set to YES, the textfield is
-// set to be first responder.
+// Shows find bar. All text inside the Find Bar textfield will be selected. If
+// |shouldFocus| is set to YES, the textfield is set to be first responder.
 - (void)showFindBarWithAnimation:(BOOL)animate
-                      selectText:(BOOL)selectText
                      shouldFocus:(BOOL)shouldFocus;
 
 // Alerts
@@ -2464,7 +2465,6 @@
   auto* findHelper = FindTabHelper::FromWebState(webState);
   if (findHelper && findHelper->IsFindUIActive()) {
     [self showFindBarWithAnimation:NO
-                        selectText:YES
                        shouldFocus:[self.findBarController isFocused]];
   }
 
@@ -2514,12 +2514,12 @@
 - (CGRect)ntpFrameForWebState:(web::WebState*)webState {
   NewTabPageTabHelper* NTPHelper = NewTabPageTabHelper::FromWebState(webState);
   DCHECK(NTPHelper && NTPHelper->IsActive());
-  if (!IsRegularXRegularSizeClass())
-    return self.contentArea.bounds;
-  // NTP expects to be laid out behind the bottom toolbar.  It uses
-  // |contentInset| to push content above the toolbar.
+  // NTP expects to be laid out behind the bottom toolbar.
   UIEdgeInsets viewportInsets = [self viewportInsetsForView:self.contentArea];
-  viewportInsets.bottom = 0.0;
+  if (IsRegularXRegularSizeClass())
+    viewportInsets.bottom = 0.0;
+  if (IsSplitToolbarMode(self))
+    viewportInsets.top = 0;
   return UIEdgeInsetsInsetRect(self.contentArea.bounds, viewportInsets);
 }
 
@@ -2573,36 +2573,23 @@
 
 - (void)hideFindBarWithAnimation:(BOOL)animate {
   [self.findBarController findBarViewWillHide];
-  [self.toolbarAccessoryPresenter
-      hideToolbarAccessoryViewAnimated:animate
-                            completion:^() {
-                              [self.findBarController findBarViewDidHide];
-                            }];
+  [self.toolbarAccessoryPresenter dismissAnimated:animate];
 }
 
 - (void)showFindBarWithAnimation:(BOOL)animate
-                      selectText:(BOOL)selectText
                      shouldFocus:(BOOL)shouldFocus {
   DCHECK(self.findBarController);
   if (!self.toolbarAccessoryPresenter) {
-    self.toolbarAccessoryPresenter = [[ToolbarAccessoryPresenter alloc]
-        initWithBaseViewController:self
-                       isIncognito:_isOffTheRecord];
+    self.toolbarAccessoryPresenter =
+        [[ToolbarAccessoryPresenter alloc] initWithIsIncognito:_isOffTheRecord];
+    self.toolbarAccessoryPresenter.delegate = self;
+    self.toolbarAccessoryPresenter.baseViewController = self;
   }
 
-  UIView* findBarView = [self.findBarController
-      createFindBarViewWithDarkAppearance:_isOffTheRecord];
-  __weak __typeof(self) weakSelf = self;
-  [self.toolbarAccessoryPresenter
-      addToolbarAccessoryView:findBarView
-                     animated:animate
-                   completion:^() {
-                     __strong __typeof(self) strongSelf = weakSelf;
-                     if (selectText) {
-                       [strongSelf.findBarController selectAllText];
-                     }
-                   }];
-
+  self.toolbarAccessoryPresenter.presentedViewController =
+      self.findBarController.findBarViewController;
+  [self.toolbarAccessoryPresenter prepareForPresentation];
+  [self.toolbarAccessoryPresenter presentAnimated:animate];
   [self updateFindBar:YES shouldFocus:shouldFocus];
 }
 
@@ -3017,6 +3004,16 @@
   [self.dispatcher showSavedPasswordsSettingsFromViewController:self];
 }
 
+#pragma mark - ContainedPresenterDelegate methods.
+
+- (void)containedPresenterDidPresent:(id<ContainedPresenter>)presenter {
+  [self.findBarController selectAllText];
+}
+
+- (void)containedPresenterDidDismiss:(id<ContainedPresenter>)presenter {
+  [self.findBarController findBarViewDidHide];
+}
+
 #pragma mark - CRWWebStateDelegate methods.
 
 - (web::WebState*)webState:(web::WebState*)webState
@@ -3753,14 +3750,6 @@
   // toolbar.
   [self.infobarContainerCoordinator updateInfobarContainer];
 
-  // Resize the NTP's contentInset.bottom to be above the secondary toolbar.
-  if (self.isNTPActiveForCurrentWebState) {
-    NewTabPageCoordinator* coordinator =
-        _ntpCoordinatorsForWebStates[self.currentWebState];
-    UIEdgeInsets contentInset = coordinator.contentInset;
-    contentInset.bottom = height;
-    coordinator.contentInset = contentInset;
-  }
 }
 
 // Updates the browser container view such that its viewport is the space
@@ -4137,7 +4126,7 @@
   DCHECK(!helper->IsFindUIActive());
   helper->SetResponseDelegate(self);
   helper->SetFindUIActive(true);
-  [self showFindBarWithAnimation:YES selectText:YES shouldFocus:YES];
+  [self showFindBarWithAnimation:YES shouldFocus:YES];
 }
 
 - (void)closeFindInPage {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index e7ad24f9..53911098 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -315,6 +315,12 @@
 
 - (void)viewSafeAreaInsetsDidChange {
   [super viewSafeAreaInsetsDidChange];
+
+  // Only get the bottom safe area inset.
+  UIEdgeInsets insets = UIEdgeInsetsZero;
+  insets.bottom = self.view.safeAreaInsets.bottom;
+  self.collectionView.contentInset = insets;
+
   [self.headerSynchronizer
       updateFakeOmniboxOnNewWidth:self.collectionView.bounds.size.width];
   [self.headerSynchronizer updateConstraints];
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index d0df523..7f50c40 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -326,9 +326,6 @@
       [ContentSuggestionsAppInterface collectionView].bounds.size.width;
   GREYAssertNotEqual(collectionWidth, collectionWidthAfterRotation,
                      @"The collection width has not changed.");
-
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
-      assertWithMatcher:grey_not(grey_sufficientlyVisible())];
 }
 
 // Tests that the app doesn't crash when opening multiple tabs.
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn
index 6d54351..0ed8c75 100644
--- a/ios/chrome/browser/ui/find_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -9,6 +9,8 @@
     "find_bar_controller_ios.mm",
     "find_bar_view.h",
     "find_bar_view.mm",
+    "find_bar_view_controller.h",
+    "find_bar_view_controller.mm",
   ]
   deps = [
     ":constants",
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h
index 35716e60..9c248b85 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h
+++ b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h
@@ -8,12 +8,17 @@
 #import <UIKit/UIKit.h>
 
 @protocol BrowserCommands;
+@class FindBarViewController;
 @class FindInPageModel;
 
 @interface FindBarControllerIOS : NSObject
 
 // The dispatcher for sending browser commands.
 @property(nonatomic, weak) id<BrowserCommands> dispatcher;
+// The view controller containing all the buttons and textfields that is common
+// between iPhone and iPad.
+@property(nonatomic, strong, readonly)
+    FindBarViewController* findBarViewController;
 
 // Init with incognito style.
 - (instancetype)initWithIncognito:(BOOL)isIncognito;
@@ -29,8 +34,6 @@
 // Updates the results count in Find Bar.
 - (void)updateResultsCount:(FindInPageModel*)model;
 
-// Creates and stores a find bar view to be presented later.
-- (UIView*)createFindBarViewWithDarkAppearance:(BOOL)darkAppearance;
 // Alerts the controller that its find bar will hide.
 - (void)findBarViewWillHide;
 // Alerts the controller that its find bar did hide.
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
index 04f6473..5ebb92bc 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
+++ b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_constants.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_view.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_view_controller.h"
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
@@ -51,9 +52,10 @@
 // will read "Select All" instead of a11y label.
 - (void)selectAllText;
 
-// The view containing all the buttons and textfields that is common between
-// iPhone and iPad.
-@property(nonatomic, strong) FindBarView* findBarView;
+// Redefined to be readwrite
+@property(nonatomic, strong, readwrite)
+    FindBarViewController* findBarViewController;
+
 // Typing delay timer.
 @property(nonatomic, strong) NSTimer* delayTimer;
 // Yes if incognito.
@@ -74,57 +76,62 @@
 
 #pragma mark - Public
 
-- (UIView*)createFindBarViewWithDarkAppearance:(BOOL)darkAppearance {
-  if (self.findBarView) {
-    return self.findBarView;
+- (FindBarViewController*)findBarViewController {
+  if (_findBarViewController) {
+    return _findBarViewController;
   }
-  self.findBarView =
-      [[FindBarView alloc] initWithDarkAppearance:darkAppearance];
-  self.findBarView.translatesAutoresizingMaskIntoConstraints = NO;
+  _findBarViewController =
+      [[FindBarViewController alloc] initWithDarkAppearance:self.isIncognito];
 
-  self.findBarView.inputField.delegate = self;
-  [self.findBarView.inputField addTarget:self
-                                  action:@selector(editingChanged)
-                        forControlEvents:UIControlEventEditingChanged];
-  [self.findBarView.nextButton addTarget:self.dispatcher
-                                  action:@selector(findNextStringInPage)
-                        forControlEvents:UIControlEventTouchUpInside];
-  [self.findBarView.nextButton addTarget:self
-                                  action:@selector(hideKeyboard:)
-                        forControlEvents:UIControlEventTouchUpInside];
-  [self.findBarView.previousButton addTarget:self.dispatcher
-                                      action:@selector(findPreviousStringInPage)
-                            forControlEvents:UIControlEventTouchUpInside];
-  [self.findBarView.previousButton addTarget:self
-                                      action:@selector(hideKeyboard:)
-                            forControlEvents:UIControlEventTouchUpInside];
-  [self.findBarView.closeButton addTarget:self.dispatcher
-                                   action:@selector(closeFindInPage)
-                         forControlEvents:UIControlEventTouchUpInside];
+  _findBarViewController.findBarView.inputField.delegate = self;
+  [_findBarViewController.findBarView.inputField
+             addTarget:self
+                action:@selector(editingChanged)
+      forControlEvents:UIControlEventEditingChanged];
+  [_findBarViewController.findBarView.nextButton
+             addTarget:self.dispatcher
+                action:@selector(findNextStringInPage)
+      forControlEvents:UIControlEventTouchUpInside];
+  [_findBarViewController.findBarView.nextButton
+             addTarget:self
+                action:@selector(hideKeyboard:)
+      forControlEvents:UIControlEventTouchUpInside];
+  [_findBarViewController.findBarView.previousButton
+             addTarget:self.dispatcher
+                action:@selector(findPreviousStringInPage)
+      forControlEvents:UIControlEventTouchUpInside];
+  [_findBarViewController.findBarView.previousButton
+             addTarget:self
+                action:@selector(hideKeyboard:)
+      forControlEvents:UIControlEventTouchUpInside];
+  [_findBarViewController.findBarView.closeButton
+             addTarget:self.dispatcher
+                action:@selector(closeFindInPage)
+      forControlEvents:UIControlEventTouchUpInside];
 
-  return self.findBarView;
+  return _findBarViewController;
 }
 
 - (void)findBarViewWillHide {
-  self.findBarView.inputField.selectedTextRange = nil;
+  self.findBarViewController.findBarView.inputField.selectedTextRange = nil;
   [self.delayTimer invalidate];
   self.delayTimer = nil;
 }
 
 - (void)findBarViewDidHide {
-  self.findBarView = nil;
+  self.findBarViewController = nil;
 }
 
 - (NSString*)searchTerm {
-  return [self.findBarView.inputField text];
+  return [self.findBarViewController.findBarView.inputField text];
 }
 
 - (BOOL)isFindInPageShown {
-  return self.findBarView != nil;
+  return self.findBarViewController.findBarView != nil;
 }
 
 - (BOOL)isFocused {
-  return [self.findBarView.inputField isFirstResponder];
+  return [self.findBarViewController.findBarView.inputField isFirstResponder];
 }
 
 - (void)updateResultsCount:(FindInPageModel*)model {
@@ -141,15 +148,15 @@
 
   if (initialUpdate) {
     // Set initial text and first search.
-    [self.findBarView.inputField setText:model.text];
+    [self.findBarViewController.findBarView.inputField setText:model.text];
     [self editingChanged];
   }
 
   // Focus input field if necessary.
   if (focusTextfield) {
-    [self.findBarView.inputField becomeFirstResponder];
+    [self.findBarViewController.findBarView.inputField becomeFirstResponder];
   } else {
-    [self.findBarView.inputField resignFirstResponder];
+    [self.findBarViewController.findBarView.inputField resignFirstResponder];
   }
 
   [self updateWithMatchNumber:model.currentIndex
@@ -168,22 +175,26 @@
                                    base::SysNSStringToUTF16(indexStr),
                                    base::SysNSStringToUTF16(matchesStr));
   }
-  [self.findBarView updateResultsLabelWithText:text];
+  [self.findBarViewController.findBarView updateResultsLabelWithText:text];
 
   BOOL enabled = matchCount != 0;
-  self.findBarView.nextButton.enabled = enabled;
-  self.findBarView.previousButton.enabled = enabled;
+  self.findBarViewController.findBarView.nextButton.enabled = enabled;
+  self.findBarViewController.findBarView.previousButton.enabled = enabled;
 }
 
 - (void)hideKeyboard:(id)sender {
-  [self.findBarView endEditing:YES];
+  [self.findBarViewController.findBarView endEditing:YES];
 }
 
 - (void)selectAllText {
-  UITextRange* wholeTextRange = [self.findBarView.inputField
-      textRangeFromPosition:self.findBarView.inputField.beginningOfDocument
-                 toPosition:self.findBarView.inputField.endOfDocument];
-  self.findBarView.inputField.selectedTextRange = wholeTextRange;
+  UITextRange* wholeTextRange =
+      [self.findBarViewController.findBarView.inputField
+          textRangeFromPosition:self.findBarViewController.findBarView
+                                    .inputField.beginningOfDocument
+                     toPosition:self.findBarViewController.findBarView
+                                    .inputField.endOfDocument];
+  self.findBarViewController.findBarView.inputField.selectedTextRange =
+      wholeTextRange;
 }
 
 #pragma mark - Internal
@@ -212,7 +223,7 @@
 #pragma mark - UITextFieldDelegate
 
 - (BOOL)textFieldShouldBeginEditing:(UITextField*)textField {
-  DCHECK(textField == self.findBarView.inputField);
+  DCHECK(textField == self.findBarViewController.findBarView.inputField);
   [[NSNotificationCenter defaultCenter]
       postNotificationName:kFindBarTextFieldWillBecomeFirstResponderNotification
                     object:self];
@@ -220,15 +231,15 @@
 }
 
 - (void)textFieldDidEndEditing:(UITextField*)textField {
-  DCHECK(textField == self.findBarView.inputField);
+  DCHECK(textField == self.findBarViewController.findBarView.inputField);
   [[NSNotificationCenter defaultCenter]
       postNotificationName:kFindBarTextFieldDidResignFirstResponderNotification
                     object:self];
 }
 
 - (BOOL)textFieldShouldReturn:(UITextField*)textField {
-  DCHECK(textField == self.findBarView.inputField);
-  [self.findBarView.inputField resignFirstResponder];
+  DCHECK(textField == self.findBarViewController.findBarView.inputField);
+  [self.findBarViewController.findBarView.inputField resignFirstResponder];
   return YES;
 }
 
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_view_controller.h b/ios/chrome/browser/ui/find_bar/find_bar_view_controller.h
new file mode 100644
index 0000000..933311b4
--- /dev/null
+++ b/ios/chrome/browser/ui/find_bar/find_bar_view_controller.h
@@ -0,0 +1,27 @@
+// 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 IOS_CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@class FindBarView;
+
+@interface FindBarViewController : UIViewController
+
+- (instancetype)initWithDarkAppearance:(BOOL)darkAppearance
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)initWithNibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
+
+// The FindBarView managed by this view controller. This is the same as the
+// |view| property.
+@property(nonatomic, strong, readonly) FindBarView* findBarView;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_FIND_BAR_FIND_BAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_view_controller.mm b/ios/chrome/browser/ui/find_bar/find_bar_view_controller.mm
new file mode 100644
index 0000000..99f4738
--- /dev/null
+++ b/ios/chrome/browser/ui/find_bar/find_bar_view_controller.mm
@@ -0,0 +1,42 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/find_bar/find_bar_view_controller.h"
+
+#include "base/mac/foundation_util.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_view.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface FindBarViewController ()
+
+@property(nonatomic, assign) BOOL darkAppearance;
+
+@end
+
+@implementation FindBarViewController
+
+- (instancetype)initWithDarkAppearance:(BOOL)darkAppearance {
+  if (self = [super initWithNibName:nil bundle:nil]) {
+    _darkAppearance = darkAppearance;
+  }
+  return self;
+}
+
+#pragma mark - UIView
+
+- (void)loadView {
+  self.view = [[FindBarView alloc] initWithDarkAppearance:self.darkAppearance];
+  self.view.translatesAutoresizingMaskIntoConstraints = NO;
+}
+
+#pragma mark - Property Getters
+
+- (FindBarView*)findBarView {
+  return base::mac::ObjCCastStrict<FindBarView>(self.view);
+}
+
+@end
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h
index db3ee126..b784160 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.h
@@ -59,7 +59,7 @@
 
 // Exposes content inset of contentSuggestions collectionView to ensure all of
 // content is visible under the bottom toolbar.
-@property(nonatomic) UIEdgeInsets contentInset;
+@property(nonatomic, readonly) UIEdgeInsets contentInset;
 
 // Animates the NTP fakebox to the focused position and focuses the real
 // omnibox.
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
index 9bc71c6..dff6bb71 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -106,18 +106,6 @@
   [self.contentSuggestionsCoordinator willUpdateSnapshot];
 }
 
-- (void)setContentInset:(UIEdgeInsets)contentInset {
-  // UIKit will adjust the contentOffset sometimes when changing the
-  // contentInset.bottom.  We don't want the NTP to scroll, so store and re-set
-  // the contentOffset after setting the contentInset.
-  CGPoint contentOffset = self.contentSuggestionsCoordinator.viewController
-                              .collectionView.contentOffset;
-  self.contentSuggestionsCoordinator.viewController.collectionView
-      .contentInset = contentInset;
-  self.contentSuggestionsCoordinator.viewController.collectionView
-      .contentOffset = contentOffset;
-}
-
 - (void)focusFakebox {
   [self.contentSuggestionsCoordinator.headerController focusFakebox];
 }
diff --git a/ios/chrome/browser/ui/settings/language/BUILD.gn b/ios/chrome/browser/ui/settings/language/BUILD.gn
index 3983aeb..0073dee 100644
--- a/ios/chrome/browser/ui/settings/language/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/language/BUILD.gn
@@ -40,8 +40,6 @@
     "language_settings_histograms.mm",
     "language_settings_table_view_controller.h",
     "language_settings_table_view_controller.mm",
-    "language_settings_ui_constants.h",
-    "language_settings_ui_constants.mm",
   ]
   deps = [
     "//ios/chrome/app/strings:ios_strings_grit",
@@ -59,6 +57,17 @@
     "//ios/chrome/common/ui_util",
     "//ui/base",
   ]
+  public_deps = [
+    ":language_ui_constants",
+  ]
+}
+
+source_set("language_ui_constants") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "language_settings_ui_constants.h",
+    "language_settings_ui_constants.mm",
+  ]
 }
 
 source_set("unit_tests") {
@@ -85,23 +94,97 @@
   ]
 }
 
+source_set("eg_test_support") {
+  defines = [ "CHROME_EARL_GREY_1" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "language_settings_app_interface.h",
+    "language_settings_app_interface.mm",
+  ]
+  deps = [
+    "//components/language/core/browser",
+    "//components/translate/core/browser",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/translate",
+    "//ios/chrome/test/app:test_support",
+  ]
+}
+
+source_set("eg_app_support+eg2") {
+  defines = [ "CHROME_EARL_GREY_2" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "language_settings_app_interface.h",
+    "language_settings_app_interface.mm",
+  ]
+  deps = [
+    "//components/language/core/browser",
+    "//components/translate/core/browser",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/translate",
+    "//ios/chrome/test/app:test_support",
+  ]
+}
+
+source_set("eg_test_support+eg2") {
+  defines = [ "CHROME_EARL_GREY_2" ]
+  configs += [
+    "//build/config/compiler:enable_arc",
+    "//build/config/ios:xctest_config",
+  ]
+  testonly = true
+  sources = [
+    "language_settings_app_interface.h",
+    "language_settings_app_interface_stub.mm",
+  ]
+  deps = [
+    "//ios/testing/earl_grey:eg_test_support+eg2",
+    "//ios/third_party/earl_grey2:test_lib",
+  ]
+}
+
+source_set("eg2_tests") {
+  defines = [ "CHROME_EARL_GREY_2" ]
+  configs += [
+    "//build/config/compiler:enable_arc",
+    "//build/config/ios:xctest_config",
+  ]
+  testonly = true
+  sources = [
+    "language_settings_egtest.mm",
+  ]
+  deps = [
+    ":language_ui_constants",
+    "//base/test:test_support",
+    "//components/translate/core/browser:translate_pref_names",
+    "//ios/chrome/app/strings:ios_strings_grit",
+    "//ios/chrome/browser/ui:feature_flags",
+    "//ios/chrome/browser/ui/settings/language:eg_test_support+eg2",
+    "//ios/chrome/test/earl_grey:eg_test_support+eg2",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
+    "//ios/third_party/earl_grey2:test_lib",
+    "//ui/strings:ui_strings_grit",
+  ]
+  libs = [ "UIKit.framework" ]
+}
+
 source_set("eg_tests") {
+  defines = [ "CHROME_EARL_GREY_1" ]
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
     "language_settings_egtest.mm",
   ]
   deps = [
-    ":language_ui",
-    "//components/language/core/browser",
-    "//components/translate/core/browser",
+    ":eg_test_support",
+    ":language_ui_constants",
+    "//components/translate/core/browser:translate_pref_names",
     "//ios/chrome/app/strings:ios_strings_grit",
-    "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/translate",
-    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
-    "//net:test_support",
+    "//ios/testing/earl_grey:earl_grey_support",
     "//ui/strings:ui_strings_grit",
   ]
 }
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_app_interface.h b/ios/chrome/browser/ui/settings/language/language_settings_app_interface.h
new file mode 100644
index 0000000..914a88db
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/language/language_settings_app_interface.h
@@ -0,0 +1,35 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_APP_INTERFACE_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_APP_INTERFACE_H_
+
+#import <Foundation/Foundation.h>
+
+// Test specific helpers for language_settings_egtest.mm.
+@interface LanguageSettingsAppInterface : NSObject
+
+// Removes all languages from "accept lang" list.
++ (void)removeAllLanguages;
+
+// Returns comma separated "accept lang" list (f.e. @"en,fr").
++ (NSString*)languages;
+
+// Adds language to "accept lang" list.
++ (void)addLanguage:(NSString*)language;
+
+// Returns YES if "offer translate" setting is enabled.
++ (BOOL)offersTranslation;
+
+// YES if user has set a preference to block the translation of |language|
+// ("Never Translate This Language" option).
++ (BOOL)isBlockedLanguage:(NSString*)language;
+
+// Simulates the last-observed translate target language. Used to determine
+// which target language to offer in future.
++ (void)setRecentTargetLanguage:(NSString*)language;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_LANGUAGE_SETTINGS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_app_interface.mm b/ios/chrome/browser/ui/settings/language/language_settings_app_interface.mm
new file mode 100644
index 0000000..4225936
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/language/language_settings_app_interface.mm
@@ -0,0 +1,62 @@
+// 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 "ios/chrome/browser/ui/settings/language/language_settings_app_interface.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "components/language/core/browser/pref_names.h"
+#include "components/translate/core/browser/translate_pref_names.h"
+#include "components/translate/core/browser/translate_prefs.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/translate/chrome_ios_translate_client.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+std::unique_ptr<translate::TranslatePrefs> CreateTranslatePrefs() {
+  return ChromeIOSTranslateClient::CreateTranslatePrefs(
+      chrome_test_util::GetOriginalBrowserState()->GetPrefs());
+}
+}  // namespace
+
+@implementation LanguageSettingsAppInterface : NSObject
+
++ (void)removeAllLanguages {
+  auto translatePrefs = CreateTranslatePrefs();
+  std::vector<std::string> languages;
+  translatePrefs->GetLanguageList(&languages);
+  for (const auto& language : languages) {
+    translatePrefs->RemoveFromLanguageList(language);
+  }
+}
+
++ (NSString*)languages {
+  return base::SysUTF8ToNSString(
+      chrome_test_util::GetOriginalBrowserState()->GetPrefs()->GetString(
+          language::prefs::kAcceptLanguages));
+}
+
++ (void)addLanguage:(NSString*)language {
+  CreateTranslatePrefs()->AddToLanguageList(base::SysNSStringToUTF8(language),
+                                            /*force_blocked=*/false);
+}
+
++ (BOOL)offersTranslation {
+  return CreateTranslatePrefs()->IsOfferTranslateEnabled();
+}
+
++ (BOOL)isBlockedLanguage:(NSString*)language {
+  return CreateTranslatePrefs()->IsBlockedLanguage(
+      base::SysNSStringToUTF8(language));
+}
+
++ (void)setRecentTargetLanguage:(NSString*)language {
+  return CreateTranslatePrefs()->SetRecentTargetLanguage(
+      base::SysNSStringToUTF8(language));
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_app_interface_stub.mm b/ios/chrome/browser/ui/settings/language/language_settings_app_interface_stub.mm
new file mode 100644
index 0000000..c58b4772
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/language/language_settings_app_interface_stub.mm
@@ -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.
+
+#import "ios/chrome/browser/ui/settings/language/language_settings_app_interface.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#if defined(CHROME_EARL_GREY_2)
+// TODO(crbug.com/1015113): The EG2 macro is breaking indexing for some reason
+// without the trailing semicolon.  For now, disable the extra semi warning
+// so Xcode indexing works for the egtest.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++98-compat-extra-semi"
+GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(LanguageSettingsAppInterface);
+#pragma clang diagnostic pop
+#endif  // defined(CHROME_EARL_GREY_2)
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm b/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm
index a6310e4..40aff9e 100644
--- a/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/language/language_settings_egtest.mm
@@ -2,25 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <EarlGrey/EarlGrey.h>
 #import <XCTest/XCTest.h>
 
 #include <memory>
 
-#include "components/language/core/browser/pref_names.h"
 #include "components/translate/core/browser/translate_pref_names.h"
-#include "components/translate/core/browser/translate_prefs.h"
-#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/chrome/browser/translate/chrome_ios_translate_client.h"
+#import "ios/chrome/browser/ui/settings/language/language_settings_app_interface.h"
 #import "ios/chrome/browser/ui/settings/language/language_settings_ui_constants.h"
-#include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/grit/ios_strings.h"
-#import "ios/chrome/test/app/chrome_test_util.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
 #include "ui/strings/grit/ui_strings.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -29,14 +25,10 @@
 
 using chrome_test_util::ButtonWithAccessibilityLabel;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
-using chrome_test_util::GetOriginalBrowserState;
 using chrome_test_util::NavigationBarDoneButton;
-using chrome_test_util::SetBooleanUserPref;
 using chrome_test_util::SettingsMenuBackButton;
 using chrome_test_util::SettingsSwitchCell;
 using chrome_test_util::TurnSettingsSwitchOn;
-using chrome_test_util::VerifyAccessibilityForCurrentScreen;
-using language::prefs::kAcceptLanguages;
 
 namespace {
 
@@ -61,10 +53,12 @@
   return grey_accessibilityID(kAddLanguageTableViewAccessibilityIdentifier);
 }
 
+#ifndef CHROME_EARL_GREY_2
 // Matcher for the Language Settings's Language Details page table view.
 id<GREYMatcher> LanguageDetailsTableView() {
   return grey_accessibilityID(kLanguageDetailsTableViewAccessibilityIdentifier);
 }
+#endif
 
 // Matcher for the Language Settings's general Settings menu entry.
 id<GREYMatcher> LanguageSettingsButton() {
@@ -151,49 +145,18 @@
 @interface LanguageSettingsTestCase : ChromeTestCase
 @end
 
-@implementation LanguageSettingsTestCase {
-  std::unique_ptr<translate::TranslatePrefs> _translatePrefs;
-}
+@implementation LanguageSettingsTestCase
 
 - (void)setUp {
   [super setUp];
 
-  // Create TranslatePrefs.
-  ios::ChromeBrowserState* browserState = GetOriginalBrowserState();
-  _translatePrefs =
-      ChromeIOSTranslateClient::CreateTranslatePrefs(browserState->GetPrefs());
-
-  // Make sure Translate is enabled.
-  SetBooleanUserPref(browserState, prefs::kOfferTranslateEnabled, YES);
-
-  // Make sure "en" is the only accept language.
-  std::vector<std::string> languages;
-  _translatePrefs->GetLanguageList(&languages);
-  for (const auto& language : languages) {
-    _translatePrefs->RemoveFromLanguageList(language);
-  }
-  _translatePrefs->AddToLanguageList("en", /*force_blocked=*/false);
+  [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kOfferTranslateEnabled];
+  [LanguageSettingsAppInterface removeAllLanguages];
+  [LanguageSettingsAppInterface addLanguage:@"en"];
 }
 
 - (void)tearDown {
-  // Keep navigating back while a Language Settings subpage is displaying.
-  NSError* error = nil;
-  [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()]
-      assertWithMatcher:grey_notNil()
-                  error:&error];
-  while (!error) {
-    [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()]
-        performAction:grey_tap()];
-
-    error = nil;
-    [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()]
-        assertWithMatcher:grey_notNil()
-                    error:&error];
-  }
-
-  // Close the general Settings menu.
-  [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
-      performAction:grey_tap()];
+  [ChromeEarlGrey dismissSettings];
 
   [super tearDown];
 }
@@ -208,15 +171,18 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
   [[EarlGrey selectElementWithMatcher:LanguageSettingsTableView()]
       assertWithMatcher:grey_notNil()];
-  VerifyAccessibilityForCurrentScreen();
+  [ChromeEarlGrey verifyAccessibilityForCurrentScreen];
 
   // Test accessibility on the Add Language page.
   [[EarlGrey selectElementWithMatcher:AddLanguageButton()]
       performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:AddLanguageTableView()]
       assertWithMatcher:grey_notNil()];
-  VerifyAccessibilityForCurrentScreen();
+  [ChromeEarlGrey verifyAccessibilityForCurrentScreen];
 
+// TODO(crbug.com/1036578): Enable the second part of the test when back button
+// matcher is fixed in EG2.
+#ifndef CHROME_EARL_GREY_2
   // Navigate back.
   [[EarlGrey selectElementWithMatcher:SettingsMenuBackButton()]
       performAction:grey_tap()];
@@ -229,12 +195,13 @@
       performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:LanguageDetailsTableView()]
       assertWithMatcher:grey_notNil()];
-  VerifyAccessibilityForCurrentScreen();
+  [ChromeEarlGrey verifyAccessibilityForCurrentScreen];
+#endif
 }
 
 // Tests that the Translate Switch enables/disables Translate and the UI gets
 // updated accordingly.
-- (void)testTransalteSwitch {
+- (void)testTranslateSwitch {
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Go to the Language Settings page.
@@ -248,7 +215,7 @@
       performAction:TurnSettingsSwitchOn(NO)];
 
   // Verify the prefs are up-to-date.
-  GREYAssertFalse(_translatePrefs->IsOfferTranslateEnabled(),
+  GREYAssertFalse([LanguageSettingsAppInterface offersTranslation],
                   @"Translate is expected to be disabled.");
 
   // Verify that "English (United States)" does not feature a label indicating
@@ -268,7 +235,7 @@
       performAction:TurnSettingsSwitchOn(YES)];
 
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsOfferTranslateEnabled(),
+  GREYAssertTrue([LanguageSettingsAppInterface offersTranslation],
                  @"Translate is expected to be enabled.");
 
   // Verify that "English (United States)" features a label indicating it is
@@ -351,10 +318,8 @@
       assertWithMatcher:grey_notNil()];
 
   // Verify the prefs are up-to-date.
-  ios::ChromeBrowserState* browserState = GetOriginalBrowserState();
-  GREYAssertEqual("en,tr",
-                  browserState->GetPrefs()->GetString(kAcceptLanguages),
-                  @"Unexpected value for kAcceptLanguages pref");
+  GREYAssertEqualObjects([LanguageSettingsAppInterface languages], @"en,tr",
+                         @"Unexpected value for accept lang pref");
 }
 
 // Tests that the Language Details page allows blocking/unblocking languages.
@@ -362,9 +327,9 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Add "Turkish" to the list of accept languages.
-  _translatePrefs->AddToLanguageList("tr", /*force_blocked=*/false);
+  [LanguageSettingsAppInterface addLanguage:@"tr"];
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsBlockedLanguage("tr"),
+  GREYAssertTrue([LanguageSettingsAppInterface isBlockedLanguage:@"tr"],
                  @"Turkish is expected to be Translate-blocked");
 
   // Go to the Language Settings page.
@@ -401,7 +366,7 @@
       assertWithMatcher:grey_notNil()];
 
   // Verify the prefs are up-to-date.
-  GREYAssertFalse(_translatePrefs->IsBlockedLanguage("tr"),
+  GREYAssertFalse([LanguageSettingsAppInterface isBlockedLanguage:@"tr"],
                   @"Turkish should not be Translate-blocked");
 
   // Go to the "Turkish" Language Details page.
@@ -432,7 +397,7 @@
       assertWithMatcher:grey_notNil()];
 
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsBlockedLanguage("tr"),
+  GREYAssertTrue([LanguageSettingsAppInterface isBlockedLanguage:@"tr"],
                  @"Turkish is expected to be Translate-blocked");
 }
 
@@ -441,13 +406,13 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Add "Turkish" to the list of accept languages.
-  _translatePrefs->AddToLanguageList("tr", /*force_blocked=*/false);
+  [LanguageSettingsAppInterface addLanguage:@"tr"];
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsBlockedLanguage("tr"),
+  GREYAssertTrue([LanguageSettingsAppInterface isBlockedLanguage:@"tr"],
                  @"Turkish is expected to be Translate-blocked");
 
   // Make "Turkish" the target language.
-  _translatePrefs->SetRecentTargetLanguage("tr");
+  [LanguageSettingsAppInterface setRecentTargetLanguage:@"tr"];
 
   // Go to the Language Settings page.
   [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
@@ -474,7 +439,7 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Make sure "Turkish" is the target language and not "en".
-  _translatePrefs->SetRecentTargetLanguage("tr");
+  [LanguageSettingsAppInterface setRecentTargetLanguage:@"tr"];
 
   // Go to the Language Settings page.
   [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
@@ -501,9 +466,10 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Add "Aragonese" to the list of accept languages.
-  _translatePrefs->AddToLanguageList("an", /*force_blocked=*/false);
+  [LanguageSettingsAppInterface addLanguage:@"tr"];
+  [LanguageSettingsAppInterface addLanguage:@"an"];
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsBlockedLanguage("an"),
+  GREYAssertTrue([LanguageSettingsAppInterface isBlockedLanguage:@"an"],
                  @"Aragonese is expected to be Translate-blocked");
 
   // Go to the Language Settings page.
@@ -555,9 +521,9 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Add "Turkish" to the list of accept languages.
-  _translatePrefs->AddToLanguageList("tr", /*force_blocked=*/false);
+  [LanguageSettingsAppInterface addLanguage:@"tr"];
   // Verify the prefs are up-to-date.
-  GREYAssertTrue(_translatePrefs->IsBlockedLanguage("tr"),
+  GREYAssertTrue([LanguageSettingsAppInterface isBlockedLanguage:@"tr"],
                  @"Turkish is expected to be Translate-blocked");
 
   // Go to the Language Settings page.
@@ -596,9 +562,8 @@
       assertWithMatcher:grey_nil()];
 
   // Verify the prefs are up-to-date.
-  ios::ChromeBrowserState* browserState = GetOriginalBrowserState();
-  GREYAssertEqual("en", browserState->GetPrefs()->GetString(kAcceptLanguages),
-                  @"Unexpected value for kAcceptLanguages pref");
+  GREYAssertEqualObjects([LanguageSettingsAppInterface languages], @"en",
+                         @"Unexpected value for accept lang pref");
 
   // Swipe left on the "English" language entry.
   [[EarlGrey selectElementWithMatcher:LanguageEntry(englishLanguageEntryLabel)]
diff --git a/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn b/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
index bfb71ff..342b957 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
@@ -13,6 +13,7 @@
     "//base",
     "//base:i18n",
     "//ios/chrome/browser/ui/image_util",
+    "//ios/chrome/browser/ui/presenters",
     "//ios/chrome/browser/ui/toolbar/public:constants",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common/colors",
diff --git a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h
index 204cd640..2912872d 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h
+++ b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h
@@ -7,34 +7,20 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/ui/presenters/contained_presenter.h"
+
 // Presenter that displays accessories over or next to the toolbar. Note that
 // there are different presentations styles for iPhone (Compact Toolbar) vs.
 // iPad. This is used by Find in Page.
-@interface ToolbarAccessoryPresenter : NSObject
+@interface ToolbarAccessoryPresenter : NSObject <ContainedPresenter>
 
-// When presenting views, this presenter will add them into the
-// |baseViewController|.
-- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController
-                               isIncognito:(BOOL)isIncognito
-    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithIsIncognito:(BOOL)isIncognito NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
 
 // The main presented view.
 @property(nonatomic, strong, readonly) UIView* backgroundView;
 
-// Adds the provided |toolbarAccessoryView| as an accessory. Calls the provided
-// |completion| after adding the view. There can only be one toolbar view
-// presented at a time. If there is a view already presented, this is a no-op.
-- (void)addToolbarAccessoryView:(UIView*)toolbarAccessoryView
-                       animated:(BOOL)animated
-                     completion:(void (^)())completion;
-
-// Hides an already-presented view. This must be done before presenting a
-// different view.
-- (void)hideToolbarAccessoryViewAnimated:(BOOL)animated
-                              completion:(void (^)())completion;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ACCESSORY_TOOLBAR_ACCESSORY_PRESENTER_H_
diff --git a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
index 4400922..dc377c72 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
+++ b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
@@ -7,6 +7,7 @@
 #include "base/i18n/rtl.h"
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/image_util/image_util.h"
+#import "ios/chrome/browser/ui/presenters/contained_presenter_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_constants.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/layout_guide_names.h"
@@ -35,15 +36,15 @@
 
 @interface ToolbarAccessoryPresenter ()
 
-// The view controller to present views into.
-@property(nonatomic, weak, readonly) UIViewController* baseViewController;
-
 // The view that acts as the background for |presentedView|, redefined as
-// readonly. This is especially important on iPhone, as this view that holds
+// readwrite. This is especially important on iPhone, as this view that holds
 // everything around the safe area.
 @property(nonatomic, strong, readwrite) UIView* backgroundView;
-// The input view being presented, stored as a weak reference.
-@property(nonatomic, weak) UIView* presentedView;
+
+// A constraint that constrains any views to their pre-animation positions.
+// It should be deactiviated during the presentation animation and replaced with
+// a constraint that sets the views to their final position.
+@property(nonatomic, strong) NSLayoutConstraint* animationConstraint;
 
 @property(nonatomic, assign) BOOL isIncognito;
 
@@ -51,43 +52,65 @@
 
 @implementation ToolbarAccessoryPresenter
 
+@synthesize baseViewController = _baseViewController;
+@synthesize presentedViewController = _presentedViewController;
+@synthesize delegate = _delegate;
+
 #pragma mark - Public
 
-- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController
-                               isIncognito:(BOOL)isIncognito {
+- (instancetype)initWithIsIncognito:(BOOL)isIncognito {
   if (self = [super init]) {
-    _baseViewController = baseViewController;
     _isIncognito = isIncognito;
   }
   return self;
 }
 
-- (void)addToolbarAccessoryView:(UIView*)toolbarAccessoryView
-                       animated:(BOOL)animated
-                     completion:(void (^)())completion {
-  if (self.backgroundView) {
-    DCHECK(toolbarAccessoryView == self.presentedView);
-    return;
-  }
+- (void)prepareForPresentation {
+  self.backgroundView = [self createBackgroundView];
+  [self.baseViewController addChildViewController:self.presentedViewController];
+  [self.baseViewController.view addSubview:self.backgroundView];
 
   if (ShouldShowCompactToolbar()) {
-    [self showIPhoneToolbarAccessoryView:toolbarAccessoryView
-                                animated:animated
-                              completion:completion];
+    [self prepareForPresentationOnIPhone];
   } else {
-    [self showIPadToolbarAccessoryView:toolbarAccessoryView
-                              animated:animated
-                            completion:completion];
+    [self prepareForPresentationOnIPad];
   }
+
+  // Force initial layout before the animation.
+  [self.baseViewController.view layoutIfNeeded];
 }
 
-- (void)hideToolbarAccessoryViewAnimated:(BOOL)animated
-                              completion:(void (^)())completion {
-  // If view is nil, nothing to hide.
-  if (!self.backgroundView) {
-    return;
+- (void)presentAnimated:(BOOL)animated {
+  if (ShouldShowCompactToolbar()) {
+    [self setupFinalConstraintsOnIPhone];
+  } else {
+    [self setupFinalConstraintsOnIPad];
   }
 
+  CGFloat duration = animated ? kAnimationDuration : 0;
+  __weak __typeof(self) weakSelf = self;
+  [UIView animateWithDuration:duration
+      animations:^() {
+        [self.backgroundView layoutIfNeeded];
+      }
+      completion:^(BOOL finished) {
+        [weakSelf.presentedViewController
+            didMoveToParentViewController:weakSelf.baseViewController];
+        [weakSelf.delegate containedPresenterDidPresent:weakSelf];
+      }];
+}
+
+- (void)dismissAnimated:(BOOL)animated {
+  [self.presentedViewController willMoveToParentViewController:nil];
+
+  __weak __typeof(self) weakSelf = self;
+  auto completion = ^void(BOOL) {
+    [weakSelf.presentedViewController.view removeFromSuperview];
+    [weakSelf.presentedViewController removeFromParentViewController];
+    [weakSelf.backgroundView removeFromSuperview];
+    [weakSelf.delegate containedPresenterDidDismiss:weakSelf];
+    weakSelf.backgroundView = nil;
+  };
   if (animated) {
     void (^animation)();
     if (ShouldShowCompactToolbar()) {
@@ -107,33 +130,41 @@
     }
     [UIView animateWithDuration:kAnimationDuration
                      animations:animation
-                     completion:^(BOOL finished) {
-                       [self teardownView];
-                       if (completion) {
-                         completion();
-                       }
-                     }];
+                     completion:completion];
   } else {
-    [self teardownView];
-    if (completion) {
-      completion();
-    }
+    completion(YES);
   }
 }
 
 #pragma mark - Private Helpers
 
-// Animates accessory to iPad positioning: A small view in the top right, just
-// below the toolbar.
-- (void)showIPadToolbarAccessoryView:(UIView*)toolbarAccessoryView
-                            animated:(BOOL)animated
-                          completion:(void (^)())completion {
-  DCHECK(IsIPadIdiom());
-  self.backgroundView =
-      [self createBackgroundViewForToolbarAccessoryView:toolbarAccessoryView];
+// Positions the view into its initial, pre-animation position on iPhone.
+// Specifically, the final position will be on top of the toolbar. The
+// pre-animation position is that, but slid upwards so the view is offscreen.
+- (void)prepareForPresentationOnIPhone {
+  self.animationConstraint = [self.backgroundView.bottomAnchor
+      constraintEqualToAnchor:self.baseViewController.view.topAnchor];
+
+  [NSLayoutConstraint activateConstraints:@[
+    [self.backgroundView.leadingAnchor
+        constraintEqualToAnchor:self.baseViewController.view.leadingAnchor],
+    [self.backgroundView.trailingAnchor
+        constraintEqualToAnchor:self.baseViewController.view.trailingAnchor],
+    [self.presentedViewController.view.topAnchor
+        constraintGreaterThanOrEqualToAnchor:self.backgroundView
+                                                 .safeAreaLayoutGuide
+                                                 .topAnchor],
+    self.animationConstraint,
+  ]];
+}
+
+// Positions the view into its initial, pre-animation position on iPad.
+// Specifically, the final position will be a small accessory just below the
+// toolbar on the upper right. The pre-animation position is that, but slid
+// offscreen to the right.
+- (void)prepareForPresentationOnIPad {
   self.backgroundView.layer.cornerRadius =
       kToolbarAccessoryCornerRadiusRegularRegular;
-  [self.baseViewController.view addSubview:self.backgroundView];
 
   UIImageView* shadow =
       [[UIImageView alloc] initWithImage:StretchableImageNamed(@"menu_shadow")];
@@ -148,9 +179,7 @@
       constraintEqualToConstant:kToolbarAccessoryWidthRegularRegular];
   widthConstraint.priority = UILayoutPriorityRequired - 1;
 
-  // This constraint sets the view in the pre-animation state. It will be
-  // removed and replaced during the animation process.
-  NSLayoutConstraint* animationConstraint = [self.backgroundView.leadingAnchor
+  self.animationConstraint = [self.backgroundView.leadingAnchor
       constraintEqualToAnchor:self.baseViewController.view.trailingAnchor];
 
   UILayoutGuide* toolbarLayoutGuide =
@@ -158,10 +187,10 @@
                            view:self.baseViewController.view];
 
   [NSLayoutConstraint activateConstraints:@[
-    // Anchors accessory below the |toolbarView|.
+    // Anchors accessory below the the toolbar.
     [self.backgroundView.topAnchor
         constraintEqualToAnchor:toolbarLayoutGuide.bottomAnchor],
-    animationConstraint,
+    self.animationConstraint,
     widthConstraint,
     [self.backgroundView.widthAnchor
         constraintLessThanOrEqualToAnchor:self.baseViewController.view
@@ -176,78 +205,30 @@
       LayoutSides::kTop | LayoutSides::kLeading | LayoutSides::kBottom |
           LayoutSides::kTrailing,
       {-kShadowMargin, -kShadowMargin, -kShadowMargin, -kShadowMargin});
+}
 
-  // Force everything to layout in the pre-animation state.
-  [self.baseViewController.view layoutIfNeeded];
+// Sets up the constraints on iPhone such that the view is ready to be animated
+// to its final position.
+- (void)setupFinalConstraintsOnIPhone {
+  self.animationConstraint.active = NO;
+  [self.backgroundView.topAnchor
+      constraintEqualToAnchor:self.baseViewController.view.topAnchor]
+      .active = YES;
+}
 
-  // Set up the post-animation positioning constraints.
-  animationConstraint.active = NO;
+// Sets up the constraints on iPhone such that the view is ready to be animated
+// to its final position.
+- (void)setupFinalConstraintsOnIPad {
+  self.animationConstraint.active = NO;
   [self.backgroundView.trailingAnchor
       constraintEqualToAnchor:self.baseViewController.view.trailingAnchor
                      constant:-kRegularRegularHorizontalMargin]
       .active = YES;
-
-  CGFloat duration = animated ? kAnimationDuration : 0;
-  [UIView animateWithDuration:duration
-      animations:^() {
-        [self.backgroundView layoutIfNeeded];
-      }
-      completion:^(BOOL finished) {
-        if (completion) {
-          completion();
-        }
-      }];
 }
 
-// Animates accessory to iPhone positioning: covering the whole toolbar.
-- (void)showIPhoneToolbarAccessoryView:(UIView*)toolbarAccessoryView
-                              animated:(BOOL)animated
-                            completion:(nullable void (^)())completion {
-  self.backgroundView =
-      [self createBackgroundViewForToolbarAccessoryView:toolbarAccessoryView];
-  [self.baseViewController.view addSubview:self.backgroundView];
-
-  // This constraint sets up the view to where it should be before the animation
-  // starts. It will later be replaced with another constraint for its final
-  // position.
-  NSLayoutConstraint* animationConstraint = [self.backgroundView.bottomAnchor
-      constraintEqualToAnchor:self.baseViewController.view.topAnchor];
-
-  [NSLayoutConstraint activateConstraints:@[
-    [self.backgroundView.leadingAnchor
-        constraintEqualToAnchor:self.baseViewController.view.leadingAnchor],
-    [self.backgroundView.trailingAnchor
-        constraintEqualToAnchor:self.baseViewController.view.trailingAnchor],
-    [self.presentedView.topAnchor
-        constraintGreaterThanOrEqualToAnchor:self.backgroundView
-                                                 .safeAreaLayoutGuide
-                                                 .topAnchor],
-    animationConstraint,
-  ]];
-
-  // Force initial layout before the animation.
-  [self.baseViewController.view layoutIfNeeded];
-
-  animationConstraint.active = NO;
-  [self.backgroundView.topAnchor
-      constraintEqualToAnchor:self.baseViewController.view.topAnchor]
-      .active = YES;
-
-  CGFloat duration = animated ? kAnimationDuration : 0;
-  [UIView animateWithDuration:duration
-      animations:^() {
-        [self.backgroundView layoutIfNeeded];
-      }
-      completion:^(BOOL finished) {
-        if (completion) {
-          completion();
-        }
-      }];
-}
-
-// Creates the background view and adds the |toolbarAccessoryView| to it.
-- (UIView*)createBackgroundViewForToolbarAccessoryView:
-    (UIView*)toolbarAccessoryView {
+// Creates the background view and adds |self.presentedViewController.view| to
+// it
+- (UIView*)createBackgroundView {
   UIView* backgroundView = [[UIView alloc] init];
   backgroundView.translatesAutoresizingMaskIntoConstraints = NO;
   backgroundView.accessibilityIdentifier = kToolbarAccessoryContainerViewID;
@@ -262,29 +243,21 @@
   backgroundView.backgroundColor = color::DarkModeDynamicColor(
       [UIColor colorNamed:kBackgroundColor], self.isIncognito,
       [UIColor colorNamed:kBackgroundDarkColor]);
-  self.presentedView = toolbarAccessoryView;
 
-  [backgroundView addSubview:self.presentedView];
+  [backgroundView addSubview:self.presentedViewController.view];
 
   [NSLayoutConstraint activateConstraints:@[
-    [self.presentedView.trailingAnchor
+    [self.presentedViewController.view.trailingAnchor
         constraintEqualToAnchor:backgroundView.trailingAnchor],
-    [self.presentedView.leadingAnchor
+    [self.presentedViewController.view.leadingAnchor
         constraintEqualToAnchor:backgroundView.leadingAnchor],
-    [self.presentedView.heightAnchor
+    [self.presentedViewController.view.heightAnchor
         constraintEqualToConstant:kAdaptiveToolbarHeight],
-    [self.presentedView.bottomAnchor
+    [self.presentedViewController.view.bottomAnchor
         constraintEqualToAnchor:backgroundView.bottomAnchor],
   ]];
 
   return backgroundView;
 }
 
-// Removes the background view from the view hierarchy and performs any
-// necessary cleanup.
-- (void)teardownView {
-  [self.backgroundView removeFromSuperview];
-  self.backgroundView = nil;
-}
-
 @end
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index eae1ec7..6226852 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -246,6 +246,7 @@
     "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui",
     "//ios/chrome/browser/ui/bookmarks:bookmarks_ui",
     "//ios/chrome/browser/ui/collection_view/cells",
+    "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/commands:commands",
     "//ios/chrome/browser/ui/content_suggestions:constants",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
@@ -388,6 +389,7 @@
     "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui",
     "//ios/chrome/browser/ui/bookmarks:bookmarks_ui",
     "//ios/chrome/browser/ui/bookmarks:eg_app_support+eg2",
+    "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions:constants",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui",
@@ -421,6 +423,7 @@
     "//ios/chrome/browser/ui/settings/credit_card_scanner",
     "//ios/chrome/browser/ui/settings/google_services:constants",
     "//ios/chrome/browser/ui/settings/google_services:eg_app_support+eg2",
+    "//ios/chrome/browser/ui/settings/language:eg_app_support+eg2",
     "//ios/chrome/browser/ui/settings/password:eg_app_support+eg2",
     "//ios/chrome/browser/ui/settings/password:password_constants",
     "//ios/chrome/browser/ui/settings/sync",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 03940a6..1bd2950a 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -136,6 +136,9 @@
 // Loads |URL| as if it was opened from an external application.
 - (void)openURLFromExternalApp:(const GURL&)URL;
 
+// Programmatically dismisses settings screen.
+- (void)dismissSettings;
+
 #pragma mark - Settings Utilities (EG2)
 
 // Sets value for content setting.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index f927545..93e2060 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -188,6 +188,10 @@
   [ChromeEarlGreyAppInterface openURLFromExternalApp:spec];
 }
 
+- (void)dismissSettings {
+  [ChromeEarlGreyAppInterface dismissSettings];
+}
+
 #pragma mark - Tab Utilities (EG2)
 
 - (void)selectTabAtIndex:(NSUInteger)index {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index b52d84785..5362c489 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -53,6 +53,9 @@
 // Loads |URL| as if it was opened from an external application.
 + (void)openURLFromExternalApp:(NSString*)URL;
 
+// Programmatically dismisses settings screen.
++ (void)dismissSettings;
+
 #pragma mark - Tab Utilities (EG2)
 
 // Selects tab with given index in current mode (incognito or main
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index 67a57df..529cb09 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -18,6 +18,7 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h"
 #import "ios/chrome/browser/ntp/features.h"
+#import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/settings/autofill/features.h"
 #import "ios/chrome/browser/ui/table_view/feature_flags.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
@@ -116,6 +117,11 @@
       GURL(base::SysNSStringToUTF8(URL)));
 }
 
++ (void)dismissSettings {
+  [chrome_test_util::DispatcherForActiveBrowserViewController()
+      closeSettingsUI];
+}
+
 #pragma mark - Tab Utilities (EG2)
 
 + (void)selectTabAtIndex:(NSUInteger)index {
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn
index 6ae6829..12db963 100644
--- a/ios/chrome/test/earl_grey2/BUILD.gn
+++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -75,6 +75,7 @@
     "//ios/chrome/browser/ui/settings:eg2_tests",
     "//ios/chrome/browser/ui/settings/autofill:eg2_tests",
     "//ios/chrome/browser/ui/settings/clear_browsing_data:eg2_tests",
+    "//ios/chrome/browser/ui/settings/language:eg2_tests",
     "//ios/chrome/browser/ui/settings/password:eg2_tests",
   ]
 }
diff --git a/media/capture/video/chromeos/camera_app_device_impl.cc b/media/capture/video/chromeos/camera_app_device_impl.cc
index d1cc785..3120a85 100644
--- a/media/capture/video/chromeos/camera_app_device_impl.cc
+++ b/media/capture/video/chromeos/camera_app_device_impl.cc
@@ -57,6 +57,9 @@
   still_capture_task.effect = cros::mojom::Effect::NO_EFFECT;
   still_capture_task.callback =
       base::BindOnce(&OnStillCaptureDone, std::move(take_photo_callback));
+  // Explicitly disable edge enhancement and noise reduction for YUV -> JPG
+  // conversion.
+  DisableEeNr(&still_capture_task);
   result_task_queue.push(std::move(still_capture_task));
   return result_task_queue;
 }
@@ -90,6 +93,9 @@
   still_capture_task.effect = cros::mojom::Effect::NO_EFFECT;
   still_capture_task.callback =
       base::BindOnce(&OnStillCaptureDone, std::move(take_photo_callback));
+  // Explicitly disable edge enhancement and noise reduction for YUV -> JPG
+  // conversion.
+  DisableEeNr(&still_capture_task);
   result_task_queue.push(std::move(still_capture_task));
 
   base::AutoLock lock(reprocess_tasks_lock_);
@@ -276,4 +282,16 @@
   std::move(callback).Run(is_success);
 }
 
+// static
+void CameraAppDeviceImpl::DisableEeNr(ReprocessTask* task) {
+  auto ee_entry =
+      BuildMetadataEntry(cros::mojom::CameraMetadataTag::ANDROID_EDGE_MODE,
+                         cros::mojom::AndroidEdgeMode::ANDROID_EDGE_MODE_OFF);
+  auto nr_entry = BuildMetadataEntry(
+      cros::mojom::CameraMetadataTag::ANDROID_NOISE_REDUCTION_MODE,
+      cros::mojom::AndroidNoiseReductionMode::ANDROID_NOISE_REDUCTION_MODE_OFF);
+  task->extra_metadata.push_back(std::move(ee_entry));
+  task->extra_metadata.push_back(std::move(nr_entry));
+}
+
 }  // namespace media
diff --git a/media/capture/video/chromeos/camera_app_device_impl.h b/media/capture/video/chromeos/camera_app_device_impl.h
index c21e849..2f4ae3a 100644
--- a/media/capture/video/chromeos/camera_app_device_impl.h
+++ b/media/capture/video/chromeos/camera_app_device_impl.h
@@ -116,6 +116,8 @@
       RemoveCameraEventObserverCallback callback) override;
 
  private:
+  static void DisableEeNr(ReprocessTask* task);
+
   std::string device_id_;
 
   mojo::ReceiverSet<cros::mojom::CameraAppDevice> receivers_;
diff --git a/media/capture/video/chromeos/camera_hal_delegate.cc b/media/capture/video/chromeos/camera_hal_delegate.cc
index 67c84c8c..adf4955 100644
--- a/media/capture/video/chromeos/camera_hal_delegate.cc
+++ b/media/capture/video/chromeos/camera_hal_delegate.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/containers/flat_set.h"
 #include "base/posix/safe_strerror.h"
 #include "base/process/launch.h"
 #include "base/strings/strcat.h"
@@ -86,9 +87,9 @@
   }
 }
 
-std::vector<int32_t> GetPossibleConstantFramerates(
+base::flat_set<int32_t> GetAvailableFramerates(
     const cros::mojom::CameraInfoPtr& camera_info) {
-  std::vector<int32_t> candidates;
+  base::flat_set<int32_t> candidates;
   auto available_fps_ranges = GetMetadataEntryAsSpan<int32_t>(
       camera_info->static_camera_characteristics,
       cros::mojom::CameraMetadataTag::
@@ -98,21 +99,16 @@
     // default fps as candidate.
     LOG(WARNING) << "No available fps ranges in metadata. Set default fps as "
                     "candidate.";
-    candidates.push_back(kDefaultFps);
+    candidates.insert(kDefaultFps);
     return candidates;
   }
 
   // The available target fps ranges are stored as pairs int32s: (min, max) x n.
-  const size_t kRangeMinOffset = 0;
   const size_t kRangeMaxOffset = 1;
   const size_t kRangeSize = 2;
 
   for (size_t i = 0; i < available_fps_ranges.size(); i += kRangeSize) {
-    int32_t range_min = available_fps_ranges[i + kRangeMinOffset];
-    int32_t range_max = available_fps_ranges[i + kRangeMaxOffset];
-    if (range_min == range_max) {
-      candidates.push_back(range_min);
-    }
+    candidates.insert(available_fps_ranges[i + kRangeMaxOffset]);
   }
   return candidates;
 }
@@ -212,8 +208,8 @@
   }
   const cros::mojom::CameraInfoPtr& camera_info = camera_info_[camera_id];
 
-  std::vector<int32_t> candidate_fps_set =
-      GetPossibleConstantFramerates(camera_info);
+  base::flat_set<int32_t> candidate_fps_set =
+      GetAvailableFramerates(camera_info);
 
   const cros::mojom::CameraMetadataEntryPtr* min_frame_durations =
       GetMetadataEntry(camera_info->static_camera_characteristics,
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 5d9a913..795386a 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -600,7 +600,9 @@
     results_ = std::move(results);
   }
 
-  void set_error_info(int error) { error_info_ = ResolveErrorInfo(error); }
+  void set_error_info(int error, bool is_secure_network_error) {
+    error_info_ = ResolveErrorInfo(error, is_secure_network_error);
+  }
 
   void set_stale_info(HostCache::EntryStaleness stale_info) {
     // Should only be called at most once and before request is marked
@@ -634,9 +636,10 @@
   }
 
   // Cleans up Job assignment, marks request completed, and calls the completion
-  // callback.
-  void OnJobCompleted(Job* job, int error) {
-    set_error_info(error);
+  // callback. |is_secure_network_error| indicates whether |error| came from a
+  // secure DNS lookup.
+  void OnJobCompleted(Job* job, int error, bool is_secure_network_error) {
+    set_error_info(error, is_secure_network_error);
 
     DCHECK_EQ(job_, job);
     job_ = nullptr;
@@ -2591,7 +2594,9 @@
         req->set_results(
             results.CopyWithDefaultPort(req->request_host().port()));
       }
-      req->OnJobCompleted(this, results.error());
+      req->OnJobCompleted(
+          this, results.error(),
+          secure && results.error() != OK /* is_secure_network_error */);
 
       // Check if the resolver was destroyed as a result of running the
       // callback. If it was, we could continue, but we choose to bail.
@@ -2985,7 +2990,8 @@
       request->set_stale_info(std::move(stale_info).value());
     RecordTotalTime(request->parameters().is_speculative, true /* from_cache */,
                     effective_secure_dns_mode, base::TimeDelta());
-    request->set_error_info(results.error());
+    request->set_error_info(results.error(),
+                            false /* is_secure_network_error */);
     return results.error();
   }
 
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc
index 7d465e2..73a6844 100644
--- a/net/dns/host_resolver_manager_unittest.cc
+++ b/net/dns/host_resolver_manager_unittest.cc
@@ -5300,6 +5300,8 @@
       HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
       base::nullopt, request_context_.get(), host_cache_.get()));
   ASSERT_THAT(response_secure.result_error(), IsOk());
+  EXPECT_FALSE(
+      response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
   EXPECT_THAT(
       response_secure.request()->GetAddressResults().value().endpoints(),
       testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
@@ -5318,6 +5320,9 @@
       NetLogWithSource(), base::nullopt, request_context_.get(),
       host_cache_.get()));
   ASSERT_THAT(response_insecure.result_error(), IsOk());
+  EXPECT_FALSE(response_insecure.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(
       response_insecure.request()->GetAddressResults().value().endpoints(),
       testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
@@ -5360,6 +5365,9 @@
       NetLogWithSource(), base::nullopt, request_context_.get(),
       host_cache_.get()));
   EXPECT_THAT(response_secure_cached.result_error(), IsOk());
+  EXPECT_FALSE(response_secure_cached.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(
       response_secure_cached.request()->GetAddressResults().value().endpoints(),
       testing::ElementsAre(kExpectedSecureIP));
@@ -5387,6 +5395,9 @@
       NetLogWithSource(), base::nullopt, request_context_.get(),
       host_cache_.get()));
   EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
+  EXPECT_FALSE(response_insecure_cached.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(response_insecure_cached.request()
                   ->GetAddressResults()
                   .value()
@@ -5473,6 +5484,9 @@
       HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
       base::nullopt, request_context_.get(), host_cache_.get()));
   ASSERT_THAT(response_automatic.result_error(), IsOk());
+  EXPECT_FALSE(response_automatic.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(
       response_automatic.request()->GetAddressResults().value().endpoints(),
       testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
@@ -5505,6 +5519,8 @@
       HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
       base::nullopt, request_context_.get(), host_cache_.get()));
   ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
+  EXPECT_FALSE(
+      response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
 
   HostCache::Key secure_key = HostCache::Key(
       "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
@@ -5546,6 +5562,8 @@
       NetLogWithSource(), stale_allowed_parameters, request_context_.get(),
       host_cache_.get()));
   EXPECT_THAT(response_stale.result_error(), IsOk());
+  EXPECT_FALSE(
+      response_stale.request()->GetResolveErrorInfo().is_secure_network_error);
   EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
               testing::ElementsAre(kExpectedStaleIP));
   EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
@@ -5652,6 +5670,9 @@
       host_cache_.get()));
   proc_->SignalMultiple(1u);
   ASSERT_THAT(response_insecure.result_error(), IsOk());
+  EXPECT_FALSE(response_insecure.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(
       response_insecure.request()->GetAddressResults().value().endpoints(),
       testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
@@ -5675,6 +5696,9 @@
       NetLogWithSource(), base::nullopt, request_context_.get(),
       host_cache_.get()));
   EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
+  EXPECT_FALSE(response_insecure_cached.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_THAT(response_insecure_cached.request()
                   ->GetAddressResults()
                   .value()
@@ -5696,6 +5720,8 @@
       HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
       base::nullopt, request_context_.get(), host_cache_.get()));
   ASSERT_THAT(response_secure.result_error(), IsOk());
+  EXPECT_FALSE(
+      response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
   HostCache::Key secure_key = HostCache::Key(
       "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
       HostResolverSource::ANY, NetworkIsolationKey());
@@ -5707,6 +5733,9 @@
       HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
       base::nullopt, request_context_.get(), host_cache_.get()));
   ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
+  EXPECT_TRUE(response_insecure.request()
+                  ->GetResolveErrorInfo()
+                  .is_secure_network_error);
   HostCache::Key insecure_key = HostCache::Key(
       "ok", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
       HostResolverSource::ANY, NetworkIsolationKey());
@@ -5719,6 +5748,8 @@
       base::nullopt, request_context_.get(), host_cache_.get()));
   proc_->SignalMultiple(1u);
   EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
+  EXPECT_TRUE(
+      response_proc.request()->GetResolveErrorInfo().is_secure_network_error);
 }
 
 TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
@@ -5768,6 +5799,9 @@
       source_none_parameters, request_context_.get(), host_cache_.get()));
   EXPECT_TRUE(cache_miss_request.complete());
   EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
+  EXPECT_FALSE(cache_miss_request.request()
+                   ->GetResolveErrorInfo()
+                   .is_secure_network_error);
   EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
   EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
 }
@@ -5796,6 +5830,8 @@
       base::nullopt, request_context_.get(), host_cache_.get()));
   EXPECT_TRUE(response_cached.complete());
   EXPECT_THAT(response_cached.result_error(), IsOk());
+  EXPECT_FALSE(
+      response_cached.request()->GetResolveErrorInfo().is_secure_network_error);
   EXPECT_THAT(
       response_cached.request()->GetAddressResults().value().endpoints(),
       testing::ElementsAre(kExpectedSecureIP));
diff --git a/net/dns/public/resolve_error_info.cc b/net/dns/public/resolve_error_info.cc
index 9a1b499..f61c3a4 100644
--- a/net/dns/public/resolve_error_info.cc
+++ b/net/dns/public/resolve_error_info.cc
@@ -8,8 +8,10 @@
 
 ResolveErrorInfo::ResolveErrorInfo() {}
 
-ResolveErrorInfo::ResolveErrorInfo(int resolve_error) {
-  error = resolve_error;
+ResolveErrorInfo::ResolveErrorInfo(int resolve_error,
+                                   bool is_secure_network_error)
+    : error(resolve_error), is_secure_network_error(is_secure_network_error) {
+  DCHECK(!(is_secure_network_error && resolve_error == net::OK));
 }
 
 ResolveErrorInfo::ResolveErrorInfo(const ResolveErrorInfo& resolve_error_info) =
@@ -24,7 +26,8 @@
     default;
 
 bool ResolveErrorInfo::operator==(const ResolveErrorInfo& other) const {
-  return error == other.error;
+  return error == other.error &&
+         is_secure_network_error == other.is_secure_network_error;
 }
 
 bool ResolveErrorInfo::operator!=(const ResolveErrorInfo& other) const {
diff --git a/net/dns/public/resolve_error_info.h b/net/dns/public/resolve_error_info.h
index b108fa79..07274f67 100644
--- a/net/dns/public/resolve_error_info.h
+++ b/net/dns/public/resolve_error_info.h
@@ -13,7 +13,7 @@
 // Host resolution error info.
 struct NET_EXPORT ResolveErrorInfo {
   ResolveErrorInfo();
-  ResolveErrorInfo(int resolve_error);
+  ResolveErrorInfo(int resolve_error, bool is_secure_network_error = false);
   ResolveErrorInfo(const ResolveErrorInfo& resolve_error_info);
   ResolveErrorInfo(ResolveErrorInfo&& other);
 
@@ -24,6 +24,12 @@
   bool operator!=(const ResolveErrorInfo& other) const;
 
   int error = net::OK;
+  // Whether |error| resulted from a DNS-over-HTTPS lookup. If an answer was
+  // obtained from the cache this field will be false, regardless of whether the
+  // answer was originally obtained securely, because this field is intended to
+  // identify secure DNS *network* failures. This field will also always be
+  // false if |error| is net::OK.
+  bool is_secure_network_error = false;
 };
 
 }  // namespace net
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index bcbc8d9..81a2ad8 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1857,8 +1857,6 @@
     { "name": "spreed.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "studienportal.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tc-bonito.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "thomasgriffin.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "thyngster.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tid.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tonywebster.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tucuxi.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2026,7 +2024,6 @@
     { "name": "xuntier.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yanovich.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yaporn.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "7183.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "8ack.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "9point6.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andere-gedanken.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2470,7 +2467,6 @@
     { "name": "lookyman.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lore.azurewebsites.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "medovea.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "novacoast.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ohnemusik.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "patriksimek.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pcel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4010,7 +4006,6 @@
     { "name": "npmcdn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nutritionculture.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oasis.mobi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "offshoot.rentals", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "opsbears.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "otchecker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "penfold.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7650,7 +7645,6 @@
     { "name": "mhertel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mhict.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "michel-wein.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mikeybot.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miku.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mmonit.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mobal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15507,7 +15501,6 @@
     { "name": "wod-stavby.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "youtubedownloader.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "www.sb", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wpinfos.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "variag-group.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yestees.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zanthra.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16992,7 +16985,6 @@
     { "name": "aschaefer.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aluminium-scaffolding.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "asafilm.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "andreaseracleous.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aparaatti.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ariacreations.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "assurancesmons.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17851,7 +17843,6 @@
     { "name": "ingesol.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isitdoneyet.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "infinity-freedom.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jaco.by", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ithakama.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ipv4.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "infinity-lifestyle.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19298,7 +19289,6 @@
     { "name": "acmexyz123.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "artimpact.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "baselang.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "arquitetura.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "app-at.work", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bbw-wrestling.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "autoeet.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22370,7 +22360,6 @@
     { "name": "senmonsyoku.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "seoagentur2go.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sergije-stanic.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "servgate.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sexgarage.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sexmobil.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sfashion.si", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24396,7 +24385,6 @@
     { "name": "lariscus.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lasalle.wa.edu.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lasertechsolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lasse-it.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lateliercantaldeco.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lathen-wahn.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lauchundei.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25758,7 +25746,6 @@
     { "name": "tianxingvpn.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tier-1-entrepreneur.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "till.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "timdeneau.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timeserver0.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timeserver1.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timeserver2.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27399,7 +27386,6 @@
     { "name": "gst.priv.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "groentefruitzeep.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hackerone-ext-content.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "grantdb.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gwrtech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "grayclub.co.il", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gruwa.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28313,7 +28299,6 @@
     { "name": "owennelson.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "paizinhovirgula.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "owapi.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "p3.marketing", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "one-s.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "otako.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "p4chivtac.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30665,7 +30650,6 @@
     { "name": "monodukuri.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "monochrometoys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mokum-organics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mkd.mk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mmstick.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mrliu.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mtirc.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30691,7 +30675,6 @@
     { "name": "mzlog.win", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "myfloridadeferredcomp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "missjoias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mwtdev.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "machikka.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mr-nachhilfe.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mr-labo.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31362,7 +31345,6 @@
     { "name": "unblocked.bid", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "teeplelaw.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "toschool.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "toppik.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "totalbike.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trixy.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "urology.wiki", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -36822,7 +36804,6 @@
     { "name": "equippers.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "erectiepillenwinkel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "escapetalk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "espenandersen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eternit.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "etoto.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "euexia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38026,7 +38007,6 @@
     { "name": "grandjunctionbrewing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grattan.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grayowlworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grendel.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grinnellplans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grootinadvies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "groupe-neurologique-nord.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38923,7 +38903,6 @@
     { "name": "eyona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "f2h.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "f3nws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "facekungfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "factcool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faerb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fanboi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40084,7 +40063,6 @@
     { "name": "analogist.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreagourmet.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreoliveira.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "andrewtchin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angristan.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aniforprez.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aniwhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40239,7 +40217,6 @@
     { "name": "datapure.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "david-reess.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidbuckell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "davidlane.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidpescarolo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dekoh-shouyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "delorenzi.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41964,7 +41941,6 @@
     { "name": "experienceoutdoors.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eztvtorrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fabrica360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "facebydrh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facucosta.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "failoverplan.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fairssl.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42839,7 +42815,6 @@
     { "name": "albanboye.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alco-united.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aldred.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alerbon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allontanamentovolatili.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allstakesupply.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphaetomega3d.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44771,7 +44746,6 @@
     { "name": "hydro17.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hydrographicsocietybenelux.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i-telligence.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "iap.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ice.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ifibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "illegalpornography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45400,7 +45374,6 @@
     { "name": "envoyez.moi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eru.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "escuelabiblica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "euteamo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eutotal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eventplace.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "everydaygary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45979,7 +45952,6 @@
     { "name": "annafiore.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anorak.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anteprima.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "antoga.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antonin.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anunayk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aotearoa.maori.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51201,7 +51173,6 @@
     { "name": "zbut.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdrave-konzultace.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdravekonzultace.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zeparadox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zephyretcoraline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhenyan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhi.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53408,7 +53379,6 @@
     { "name": "chengxindong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chesapeakebaychristmas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chesscoders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "christopherstocks.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudcrux.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "club-climate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cnlau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53701,7 +53671,6 @@
     { "name": "lg-waps.go.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lg-waps.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lgbt-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lhamaths.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lhgavarain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lidtkemotors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lierrmm.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54937,7 +54906,6 @@
     { "name": "onlineprofecional.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinetextil.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onyxcts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oshershalom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oveweddings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palary.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palestra.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56838,7 +56806,6 @@
     { "name": "hoteles4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hps.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hpsdigital.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hqhh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrltech.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huangjia71.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huangjia72.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57904,7 +57871,6 @@
     { "name": "dontbeevil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "draadloze-noodstop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drhoseyni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dstat.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dstvinstalledenvale.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dstvinstallkemptonpark.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dstvsandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60126,7 +60092,6 @@
     { "name": "silicanetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silvershadow.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silvester-mitterschida.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "simonpayne.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sinsastudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "site.pictures", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sklep-majster.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61194,7 +61159,6 @@
     { "name": "dpsg-hohenlinden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drros.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dubstep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eallion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eblog.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educacionvirtual.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educateyourskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62621,7 +62585,6 @@
     { "name": "withsunglasses.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woodwormtreatment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workathomenoscams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wxw.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yanwei.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youlikehookups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youliketwinks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63280,7 +63243,6 @@
     { "name": "makropa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mara-martinez.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marcobicca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mauracher.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcjackk77.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdtorelli.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meidens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64689,13 +64651,11 @@
     { "name": "am-39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "am6118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "am8213.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "am9d104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amaranthinewanderlust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amateurpornhours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amazetimberfurniture.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amianto.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amok8.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amvip9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreasjanker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animeclub.in.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anonoriviera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65689,7 +65649,6 @@
     { "name": "vignaud.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vinodoc.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vinoshipper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vipam8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipfitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "virtualcitehuallaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visibleone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65921,7 +65880,6 @@
     { "name": "geekstreet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gellis12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gestionrocamar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gobytedesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldsteinlawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hapimiennam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69516,7 +69474,6 @@
     { "name": "adamlee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag-2.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag-3.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ag-33.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag-55.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag-777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag6262g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69526,14 +69483,11 @@
     { "name": "ag8850.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag8856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag88777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ag88777.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag88798.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag888818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag88910.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agaa35.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agh6p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aglucky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agm4545.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agslot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agslot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agslot777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70363,9 +70317,7 @@
     { "name": "visualproyectos.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vonkuenheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w3punkt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w66918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w66938.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w6969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wasgigant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watchmetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wattnow.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71677,7 +71629,6 @@
     { "name": "yuzulia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zalaxx.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerocash.msk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zl2020.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "022kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0d111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100up.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71801,7 +71752,6 @@
     { "name": "8102d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "91milk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "9k589.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a2os.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acapadena.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "accadia.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72015,7 +71965,6 @@
     { "name": "loheprobado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "long8097.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loteamentoabertocapivari.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ludovic-frank.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lx-blog.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72183,7 +72132,6 @@
     { "name": "volvoconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w0185.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w4040w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w5050w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w661616.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallisch.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wearefrantic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72764,49 +72712,11 @@
     { "name": "yourkrabivilla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yporti.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yuzu-tee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z8182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z8851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zaffke.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zakonu.net.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd203.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd205.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd206.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd207.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd208.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd209.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd232.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd235.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd236.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd237.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd239.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd253.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd258.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd259.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd262.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd265.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd267.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd270.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd275.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd276.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zd279.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd280.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd283.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd287.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd290.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd293.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd295.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd297.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd307.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zd4848.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhuktrans.msk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72830,7 +72740,6 @@
     { "name": "000b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "000x2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "000x3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0022bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "00b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "01234048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "012345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72879,9 +72788,7 @@
     { "name": "10n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "111b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1120344.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1188bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1190america.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1199bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "11b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1220323.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "12344048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72931,7 +72838,6 @@
     { "name": "20n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "222b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "228668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "2288bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "22b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "23454048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "246773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73065,7 +72971,6 @@
     { "name": "365888dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365888ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365888dddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3659801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3659867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3659980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73123,28 +73028,8 @@
     { "name": "38irkutsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3957z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "396301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "396302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "396303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73180,25 +73065,6 @@
     { "name": "4025367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4025368.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4025369.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4025y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "40481234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "40482345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "40484567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73250,7 +73116,6 @@
     { "name": "436773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "438663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "444b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4455bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "44b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "451365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "45674048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73438,7 +73303,6 @@
     { "name": "6671365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6672365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6673365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "6677bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "677314.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "677340.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73599,7 +73463,6 @@
     { "name": "aflebedevo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "africalebanon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag66321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ag878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agarioforum.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agenux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agiosthomas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73718,7 +73581,6 @@
     { "name": "azerinews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azora.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b-honey.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b0000.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b0305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b0306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b0307.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73727,7 +73589,6 @@
     { "name": "b03aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b03bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b03cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b1111.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b3333.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b36512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73782,11 +73643,6 @@
     { "name": "bestofbooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besttrade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestwebcams.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet01vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet02vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet03vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet04vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet05vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet062.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet064.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet06vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73794,7 +73650,6 @@
     { "name": "bet07vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet08vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet09vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bet10vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet290.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet3639.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet365bc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75067,7 +74922,6 @@
     { "name": "r30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raballder.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "racaliz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "radioh.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radionrg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radiopharereims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radiorainbow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75604,16 +75458,6 @@
     { "name": "vlcentre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vmf365.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vneftekamske.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vns377j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vns5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vnsr112233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voetbalclubinfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75831,7 +75675,6 @@
     { "name": "65131o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "65131w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "65131x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "65131z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6638s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6639s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75839,9 +75682,7 @@
     { "name": "6830521.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "690918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "700wns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "7g31.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "800139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8win.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "900823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "91d75.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "91d76.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76241,7 +76082,6 @@
     { "name": "ebooks-pdf.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eclipseforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ed-studios.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edify.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edrosd.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eduart.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edyhenry.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76564,7 +76404,6 @@
     { "name": "livejh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livetopknigi.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livfcshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ll8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lldy88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "localtownhouses.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logicdream.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76642,7 +76481,6 @@
     { "name": "masqueradecostumes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matejstrnad.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matematikkulubu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mathe.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matrimonio.com.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mattaki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maxiservak.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77494,7 +77332,6 @@
     { "name": "ybvip789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeti.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yinduyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ym063.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourloan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yura.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zaimdengi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78523,7 +78360,6 @@
     { "name": "secondmileservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "securewebcomputing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sellmyphone.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "seyrederiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sh68.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shelfplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shopmacher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78730,7 +78566,6 @@
     { "name": "cou.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creamyfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ctes.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8814.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daily-exps.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daimafengzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "danielkanchev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78899,7 +78734,6 @@
     { "name": "nxtgenbroadband.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nylasercenter.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "obu4alka.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oceanspraymiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oe2018.gov.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oe2019.gov.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinekocunuz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78917,7 +78751,6 @@
     { "name": "pousadaestreladapraia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "precedencemedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "premiumhosting.com.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pricena.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pro-co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "promocodius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "propiteer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79026,7 +78859,6 @@
     { "name": "z81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zombmage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zoohaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "111plus.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "168fff.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3dlab.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3pestki.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79772,40 +79604,12 @@
     { "name": "zhan.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhina.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zowedo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "07d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "09d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "106jamz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "17xrk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1fc0.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2000.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2255motion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2monkeysandme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "46d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "47d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "48d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "64d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "70d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "74d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "75d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8186d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8189d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8190d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "81d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8206d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8239d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8890d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8891d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8892d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8895d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8900d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8906d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8907d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8908d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8919d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8920d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8921d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8925d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8926d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "967you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acicj.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acs-nettoyage-entretien-immeuble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79862,17 +79666,7 @@
     { "name": "coralreef.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creafitchile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyanhexagon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8824.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8834.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8841.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8842.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8843.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8845.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8847.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8859.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8874.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8897.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dayswithnostabbings.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deckenplatten.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "defis-franciliens.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80144,11 +79938,6 @@
     { "name": "wingchunboxtribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "womenshealthadvocate.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xaver.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb052.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb056.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb057.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xb058.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xdown.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xhcmnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xiaoxia.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80161,70 +79950,23 @@
     { "name": "yzh8.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzh8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8171.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8908.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8917.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zl8282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "znn.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0x15.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "111z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "112z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "113z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "116z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "117z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "118z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "119z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "122kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "131ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "158z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "162229.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "168z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "16z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "188z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "22i.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "266z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "26z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "277z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "27is.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "288z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "31du.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3369p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3389p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3666ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "366z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "388z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "566z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "61z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "688z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "699z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "76z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8028d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8065d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8128d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8129d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8202d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8208d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "866z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "86z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "885z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8862d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8869ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8871d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8872d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8876d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8879d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88djl.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9118inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "91z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "96z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aanwp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abraxasteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "academie-musique-nice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80253,7 +79995,6 @@
     { "name": "audiohub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "audiohub.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bananacloud.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bdpestsolutionsstlouis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beatrice-raws.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bhglamour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80295,10 +80036,6 @@
     { "name": "crys.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crys.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crys.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8778.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darlenejacques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dechetor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dejongonline.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80414,13 +80151,11 @@
     { "name": "mangabank.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mansora.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marijuanajobscannabiscareers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maroquineriepirlot.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martindoe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masterplumber.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcs-kutc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcukhost.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediafamous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "melania-voyance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "middletonshoppingcentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mjjlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mjs-domy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80566,108 +80301,14 @@
     { "name": "yukonlip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yukontec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ywyz.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6278.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6323.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6359.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6371.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6372.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6375.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6523.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6527.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6529.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6537.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6539.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6579.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6581.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6587.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6591.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6616.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6751.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6753.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6757.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6759.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6798.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6827.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6871.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6897.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6925.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8871.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd625.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd627.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd659.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd693.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd723.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd725.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd726.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd729.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd732.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zd739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd752.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd763.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd795.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd796.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd802.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd806.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd827.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zone-de-confiance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zorgenvoorandrea.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zoubaa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0cd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "115z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "123666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "14erc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "14ercooper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "16z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "222tips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "234666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "235u.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80681,17 +80322,9 @@
     { "name": "4wrd.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "588z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "654666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "668z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "765666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8156d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8238d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "868z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "881z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8875d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "92owl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "a04gameapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a04webapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aberon.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "actingcxo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80903,7 +80536,6 @@
     { "name": "libwebsockets.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lifetoolscdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lintelliftusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "load.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "love-spells-tarot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luisfernandoosorio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumacurve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81089,32 +80721,7 @@
     { "name": "ys633.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ysuna.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z33d.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6192.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6281.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6381.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6571.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6592.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z6912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8870.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zanjirzanane-shanbeghazan.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd697.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd753.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd759.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd762.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd825.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd826.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zd829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0311z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0376z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0517z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81241,7 +80848,6 @@
     { "name": "cupclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d36594.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dark.fail", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dayman.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ddepot.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diamondrose.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalcoffeepodcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81555,7 +81161,6 @@
     { "name": "syswiki.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t36594.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "the-forgotten.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "the-medium-dolphore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thouqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tickettailor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timawesomeness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81901,7 +81506,6 @@
     { "name": "avtosept.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "az11018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b131000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b2222.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b62101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b62102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b62103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81931,11 +81535,9 @@
     { "name": "b67804.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b67805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b70882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70884.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b789.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baanpingchan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babblenotes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "balsamaiso.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82699,7 +82301,6 @@
     { "name": "flatfix.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "foreignxchange.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freddieleeman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freelancebest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freevst.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frsra.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fryergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83020,7 +82621,6 @@
     { "name": "yeswecan.co.bw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ygm.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yl8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yugodi.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yvb.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zalure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdenekpasek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83040,8 +82640,6 @@
     { "name": "2033009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2033010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2033011.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "22245j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "22256j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "24hourelectricalservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "347552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3651143.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83086,28 +82684,13 @@
     { "name": "427552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "457552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "487552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "60062b.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "60062h.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "60062i.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6666365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "66689j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7777365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "77zxdy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7878365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8225.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8881234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "888234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8883456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "888345j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8884567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "888456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "888567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8886789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8888365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "889vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "99123j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "99456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "99789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9999365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a36533.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aaainfosystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83314,8 +82897,6 @@
     { "name": "l36533.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "langleyporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laurajeandesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ld66999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ld6999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leathersofacleaning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lelux.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lewiatan.opole.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83562,7 +83143,6 @@
     { "name": "0cp8778.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "115lc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "116lc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "182k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2002712.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "219k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "22lc8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83839,8 +83419,6 @@
     { "name": "ilc999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iloft.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imaginelab.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imkerei-contento.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imkereicontento.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impulsocristiano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infocus.company", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ingenias.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83909,7 +83487,6 @@
     { "name": "k87137.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k87138.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k873.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "k873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k8736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k875.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k8804.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83953,7 +83530,6 @@
     { "name": "kf8383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf8801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf8812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kf8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf8865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf88666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf8867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83987,7 +83563,6 @@
     { "name": "lc245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc2500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc3729.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lc3736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc3738.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc3739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc3744.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84053,7 +83628,6 @@
     { "name": "lc68692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc68693.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc6880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lc7575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc7979.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc7979g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc8.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84345,7 +83919,6 @@
     { "name": "9499737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9499757.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9499835.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "9499dc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9499good.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9499jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9499l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84586,7 +84159,6 @@
     { "name": "kalex.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kalisch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kantoportraits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kf6262.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf8181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kimsnagelstudio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kkutu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84685,7 +84257,6 @@
     { "name": "pmcc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "podxappa.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polybius.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "polychainlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portalaltadefinicao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "post.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "probazen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84898,7 +84469,6 @@
     { "name": "astifan.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astucewebmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atelieracbaby.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aufro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "auksnest.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "austerevisuals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avonvets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86074,7 +85644,6 @@
     { "name": "00440044.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "00550055.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "00770077.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "06am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "07am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0q0.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "10160365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86133,7 +85702,6 @@
     { "name": "8e8z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9696178.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9696178.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "988am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "988wh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9bingo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aarwer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87837,8 +87405,6 @@
     { "name": "zof.kh.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zz074.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1234365t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1voz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2dua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "36536555.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88222,7 +87788,6 @@
     { "name": "makelinks.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "makepro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariasandoli.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "marshallpeak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mattcronin.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mau.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mau.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88347,7 +87912,6 @@
     { "name": "sindominio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skydiverecuador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skypefr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "slalix.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smmpanelweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smoqerhome.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soaringdownsouth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88415,20 +87979,8 @@
     { "name": "uninutri.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "universeit.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v55565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55580.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66557.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66615.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v81365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v82365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v88511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v88522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valutienda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vectordtg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vegner.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88587,7 +88139,6 @@
     { "name": "beccaanne.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beerians.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belug.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bergenson.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berghuus.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestinsider.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestvideoeffects.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90274,6 +89825,385 @@
     { "name": "zoisfinefood.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zombie.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ztickerz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "077969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11223837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11333837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11443837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11553837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11663837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11773837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11883837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "11993837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1939365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "23456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "247naijabuzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "36533i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837app3837app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3837app3837app3837app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4351365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4551365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4562030.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4562040.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4562050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4vio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "7th-heaven.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "80630.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8yabo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918kissinw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99billionaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a1towgrant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abctowinghelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abundanteconomy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accademiaditruccoblog.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acmegamer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adultforum.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advst.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agk.co.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesreservation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akaal.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alteralife.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "am156.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "am8.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "am85168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "am8811.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amm6e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amorgosrentandgo.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ankitha.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arbavere.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archeryaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archival-services.gov.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archive.gov.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arno-klein.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arnoklein.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asaphomeinspect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ashley.net.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assuredspc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ateliercoquelicot.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aunto.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoankauf.berlin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babeprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bacterias.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bagasian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ballinw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bangzhu88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankapply.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "base-n.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bbmagnagrecia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berakad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet567111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet567222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet567333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet567444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet567555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bett1.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bett1.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bett1.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bett1.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betteressay.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bimbole.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitrefill.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjfuli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bkulup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogsked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bogurl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bolico.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "britishacademy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bthub.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burzcast.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "car-forums.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cathy.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cathy.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cathy.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cavernadigital.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanuwah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoxi.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoxi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoxi.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "childrenschoicepearland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinefrancophonie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citykohviteek.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudboard.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudzentechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compufreaks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creacioneslri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryptool.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csvplot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "culturelivresque.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cutieland.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberhazard.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "czzs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d88988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danhotels.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daridarkom.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deathorglory.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demoserv.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denverbph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disa.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "divelement.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djfantum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmmedya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmf.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e9582.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekogroszekpieklo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "empowersimcoe.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ergowish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "espirituracer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "estudioaguiar.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eva42.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "extremebros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exxelmedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fb-lab.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "florian-knorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futurestyletiling.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g0158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gestionadministrativevirtuelle.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gestionadministrativevirtuelle.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gestionadministrativevirtuelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getyourdata.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glovementor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go-girlonly.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gomasy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gonumbers.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "googlehits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gplvilla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groundspan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gtagames.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guogetv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harshee.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hayden.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heijmans.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heijmans.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heng555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herkel.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herkelmedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hlz.mn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horti-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hp-lexicon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hqsmartpanel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hstudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "http3.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huai123.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i0day.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ibex-lb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iikd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikud-seminare.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikud.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "in2-comms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internet-meesters.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internewscast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ionutnica.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ippo-juku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isis.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iswapgh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "janey.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanrail.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jonasherkel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaligrafievreni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kartina.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kathy.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keilycosmetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kernel.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8949.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8953.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8955.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8956.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kf8958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kiesmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kiwee.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klacki.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krimikiosk.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksradio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakeview.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lamdav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "larcotravel.com.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lastcraft.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leapday.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lenczu6.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "librespeed.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linafernandez.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liuqiao.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liuqiao.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liuqiao.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loader.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locallhost.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locus-dashboard.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lpmkonji.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lukersallamericanstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luzi-type.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m-foda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magicskillet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mankier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marulaweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mdpparish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mega-loteria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "michaelklos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijnnaamdag.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikeprocopio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milfhubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mixedreality.football", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mm88game.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moa.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "msieursvp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musings.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-amigo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-ccleaner.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-photo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myweatherbuzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mzitu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nafoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nal.av.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newaygotowing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsound.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niklasstinkt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ninkt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nouveauhosting.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nuclea.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obzoroff.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odyssey44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ogfarms.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "operationkiwi.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opskiwi.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otakurumi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pano.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pasquinelli-truebag.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pbdigital.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penguindrum.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pethood.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planetravel.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "platypiduses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ponpon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prayercentric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "procabinetrefinishers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "project-novis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "protonpix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pubg-tournament.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qaz.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qqq67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qualyven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quieoltre.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quinterorealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raghuspeaks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rainbowsky.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raynoonanwindows.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rddjapan.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reliablemaids.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revivemoment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rheijmans.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richardinesrolltop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richie.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richieheijmans.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richieheijmans.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richieheijmans.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockfordtow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockfordtowing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roircop.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rootsskininstitute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rottie.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roystowingrockford.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safehero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samuraiskye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sans-hotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sc019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sfpebblesstones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenpei.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sickplanet.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplyml.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skoloffwolfe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skpracta.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skpracta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartpanelsmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartstep.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smh.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spartatowing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speciale.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportingpontenova.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ss09.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ss9188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ss9288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stacyscbdoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stadlwirt.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starinc.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startw.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steffi-knorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studentfintech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suayslim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swagfuli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sweetdata.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swissj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swynwyr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sympletrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syuez.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68300.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68700.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t68900.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tableres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tapchiphaidep.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tawasulav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teachersasap.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techraptor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tecnimas.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teodorpravicky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "the-busbys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thekuwayama.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thomaskoscheck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timeget.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toirereform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tough.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "triggeredpaintz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trosinenko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turismonochile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "u51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ufob.edu.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ulrichs.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultspo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usability.com.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vaccinestats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vestberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vibgyorrise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtualbrands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitanyi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "votra.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walruscode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangzhe100.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watertorenstraat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wdmcheng.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weatherbuzzmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winancreekbarn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wk99.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "www.edu.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xh7qqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingganfuli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--ionunica-29c.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--u9j920h4sbt5ex10f.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj090.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xpj90.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanjicg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaprefy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhainanyouhuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zolotoy-standart.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc
index d1ff9f8..12fe95c0 100644
--- a/net/url_request/http_with_dns_over_https_unittest.cc
+++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -68,6 +68,7 @@
         request_context_(true),
         doh_server_(EmbeddedTestServer::Type::TYPE_HTTPS),
         test_server_(EmbeddedTestServer::Type::TYPE_HTTPS),
+        fail_doh_requests_(false),
         doh_queries_served_(0),
         test_https_requests_served_(0) {
     doh_server_.RegisterRequestHandler(
@@ -111,8 +112,14 @@
 
   std::unique_ptr<test_server::HttpResponse> HandleDefaultConnect(
       const test_server::HttpRequest& request) {
+    std::unique_ptr<test_server::BasicHttpResponse> http_response(
+        new test_server::BasicHttpResponse);
     if (request.relative_url.compare("/dns_query") == 0) {
       doh_queries_served_++;
+      if (fail_doh_requests_) {
+        http_response->set_code(HTTP_NOT_FOUND);
+        return std::move(http_response);
+      }
 
       // Parse request content as a DnsQuery to access the question.
       auto request_buffer =
@@ -140,9 +147,6 @@
                                   0x00, 0x04,  // - RDLENGTH = 4 bytes
                                   0x7f, 0x00,  // - RDDATA, IP is 127.0.0.1
                                   0x00, 0x01};
-
-      std::unique_ptr<test_server::BasicHttpResponse> http_response(
-          new test_server::BasicHttpResponse);
       http_response->set_content(
           std::string(header_data, sizeof(header_data)) +
           query.question().as_string() +
@@ -151,8 +155,6 @@
       return std::move(http_response);
     } else {
       test_https_requests_served_++;
-      std::unique_ptr<test_server::BasicHttpResponse> http_response(
-          new test_server::BasicHttpResponse);
       http_response->set_content(kTestBody);
       http_response->set_content_type("text/html");
       return std::move(http_response);
@@ -160,12 +162,17 @@
   }
 
  protected:
+  void set_fail_doh_requests(bool fail_doh_requests) {
+    fail_doh_requests_ = fail_doh_requests;
+  }
+
   std::unique_ptr<ContextHostResolver> resolver_;
   scoped_refptr<net::TestHostResolverProc> host_resolver_proc_;
   std::unique_ptr<MockCertVerifier> cert_verifier_;
   TestURLRequestContext request_context_;
   EmbeddedTestServer doh_server_;
   EmbeddedTestServer test_server_;
+  bool fail_doh_requests_;
   uint32_t doh_queries_served_;
   uint32_t test_https_requests_served_;
 };
@@ -287,5 +294,31 @@
   EXPECT_EQ(d.data_received(), kTestBody);
 }
 
+TEST_F(HttpWithDnsOverHttpsTest, EndToEndFail) {
+  // Fail all DoH requests.
+  set_fail_doh_requests(true);
+
+  // Make a request that will trigger a DoH query.
+  TestDelegate d;
+  GURL main_url = test_server_.GetURL("fail.example.com", "/test");
+  std::unique_ptr<URLRequest> req(context()->CreateRequest(
+      main_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
+  req->Start();
+  base::RunLoop().Run();
+  EXPECT_TRUE(test_server_.ShutdownAndWaitUntilComplete());
+  EXPECT_TRUE(doh_server_.ShutdownAndWaitUntilComplete());
+
+  // No HTTPS connection to the test server will be attempted due to the
+  // host resolution error.
+  EXPECT_EQ(test_https_requests_served_, 0u);
+
+  EXPECT_TRUE(d.response_completed());
+  EXPECT_EQ(d.request_status(), net::ERR_DNS_MALFORMED_RESPONSE);
+
+  const auto& resolve_error_info = req->response_info().resolve_error_info;
+  EXPECT_TRUE(resolve_error_info.is_secure_network_error);
+  EXPECT_EQ(resolve_error_info.error, net::ERR_DNS_MALFORMED_RESPONSE);
+}
+
 }  // namespace
 }  // namespace net
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index cdc89cc..9c3c5396 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -1009,10 +1009,6 @@
 
   viewport_info.zoom = zoom_;
   viewport_info.scale = device_scale_;
-  viewport_info.total_scrollable_size = {GetTotalScrollableWidth(),
-                                         GetTotalScrollableHeight()};
-  viewport_info.current_scroll_position = {GetHorizontalScrollPosition(),
-                                           GetVerticalScrollPosition()};
 
   engine_->GetSelection(&viewport_info.selection_start_page_index,
                         &viewport_info.selection_start_char_index,
@@ -1295,25 +1291,6 @@
       ceil(document_size_.height() * zoom_ * device_scale_));
 }
 
-int OutOfProcessInstance::GetTotalScrollableWidth() const {
-  return std::max(GetDocumentPixelWidth() - plugin_size_.width(), 0);
-}
-
-int OutOfProcessInstance::GetTotalScrollableHeight() const {
-  return std::max(static_cast<int>(GetDocumentPixelHeight() +
-                                   GetToolbarHeightInScreenCoords() -
-                                   plugin_size_.height()),
-                  0);
-}
-
-int OutOfProcessInstance::GetHorizontalScrollPosition() const {
-  return static_cast<int>(scroll_offset_.x() * device_scale_);
-}
-
-int OutOfProcessInstance::GetVerticalScrollPosition() const {
-  return static_cast<int>(scroll_offset_.y() * device_scale_);
-}
-
 void OutOfProcessInstance::FillRect(const pp::Rect& rect, uint32_t color) {
   DCHECK(!image_data_.is_null() || rect.IsEmpty());
   uint32_t* buffer_start = static_cast<uint32_t*>(image_data_.data());
@@ -2005,7 +1982,7 @@
   pp::PDF::SetPluginCanSave(this, ShouldSaveEdits());
 }
 
-float OutOfProcessInstance::GetToolbarHeightInScreenCoords() const {
+float OutOfProcessInstance::GetToolbarHeightInScreenCoords() {
   return top_toolbar_height_in_viewport_coords_ * device_scale_;
 }
 
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h
index 4ed34bd8..de8ab5fc 100644
--- a/pdf/out_of_process_instance.h
+++ b/pdf/out_of_process_instance.h
@@ -149,7 +149,7 @@
   void IsSelectingChanged(bool is_selecting) override;
   void SelectionChanged(const pp::Rect& left, const pp::Rect& right) override;
   void IsEditModeChanged(bool is_edit_mode) override;
-  float GetToolbarHeightInScreenCoords() const override;
+  float GetToolbarHeightInScreenCoords() override;
 
   // PreviewModeClient::Client implementation.
   void PreviewDocumentLoadComplete() override;
@@ -179,14 +179,6 @@
   int GetDocumentPixelWidth() const;
   int GetDocumentPixelHeight() const;
 
-  // Computes total scrollable Width and Height of the document.
-  int GetTotalScrollableWidth() const;
-  int GetTotalScrollableHeight() const;
-
-  // Computes current horizontal and scroll position of the document.
-  int GetHorizontalScrollPosition() const;
-  int GetVerticalScrollPosition() const;
-
   // Draws a rectangle with the specified dimensions and color in our buffer.
   void FillRect(const pp::Rect& rect, uint32_t color);
 
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h
index 566f40b..48b22de 100644
--- a/pdf/pdf_engine.h
+++ b/pdf/pdf_engine.h
@@ -281,7 +281,7 @@
 
     // Gets the height of the top toolbar in screen coordinates. This is
     // independent of whether it is hidden or not at the moment.
-    virtual float GetToolbarHeightInScreenCoords() const = 0;
+    virtual float GetToolbarHeightInScreenCoords() = 0;
   };
 
   struct AccessibilityLinkInfo {
diff --git a/pdf/preview_mode_client.cc b/pdf/preview_mode_client.cc
index ee73d2cd..141b9eb 100644
--- a/pdf/preview_mode_client.cc
+++ b/pdf/preview_mode_client.cc
@@ -150,7 +150,7 @@
   return false;
 }
 
-float PreviewModeClient::GetToolbarHeightInScreenCoords() const {
+float PreviewModeClient::GetToolbarHeightInScreenCoords() {
   return 0.0f;
 }
 
diff --git a/pdf/preview_mode_client.h b/pdf/preview_mode_client.h
index 3df2019..e7b2e28 100644
--- a/pdf/preview_mode_client.h
+++ b/pdf/preview_mode_client.h
@@ -67,7 +67,7 @@
   void DocumentHasUnsupportedFeature(const std::string& feature) override;
   void FormTextFieldFocusChange(bool in_focus) override;
   bool IsPrintPreview() override;
-  float GetToolbarHeightInScreenCoords() const override;
+  float GetToolbarHeightInScreenCoords() override;
   uint32_t GetBackgroundColor() override;
 
  private:
diff --git a/pdf/test/test_client.cc b/pdf/test/test_client.cc
index 4b979d56..7fab6611 100644
--- a/pdf/test/test_client.cc
+++ b/pdf/test/test_client.cc
@@ -56,7 +56,7 @@
   return 0;
 }
 
-float TestClient::GetToolbarHeightInScreenCoords() const {
+float TestClient::GetToolbarHeightInScreenCoords() {
   return 0;
 }
 
diff --git a/pdf/test/test_client.h b/pdf/test/test_client.h
index 0abea0b..4eaf930 100644
--- a/pdf/test/test_client.h
+++ b/pdf/test/test_client.h
@@ -37,7 +37,7 @@
   pp::Instance* GetPluginInstance() override;
   bool IsPrintPreview() override;
   uint32_t GetBackgroundColor() override;
-  float GetToolbarHeightInScreenCoords() const override;
+  float GetToolbarHeightInScreenCoords() override;
 
  private:
   // Not owned. Expected to dangle briefly, as the engine usually is destroyed
diff --git a/ppapi/c/private/ppb_pdf.h b/ppapi/c/private/ppb_pdf.h
index c209670..cfa0ef1 100644
--- a/ppapi/c/private/ppb_pdf.h
+++ b/ppapi/c/private/ppb_pdf.h
@@ -36,10 +36,6 @@
 struct PP_PrivateAccessibilityViewportInfo {
   double zoom;
   double scale;
-  // |total_scrollable_size| and |current_scroll_position| are relative
-  // to plugin embed and in screen coordinates.
-  struct PP_Size total_scrollable_size;
-  struct PP_Point current_scroll_position;
   struct PP_Point scroll;
   struct PP_Point offset;
   uint32_t selection_start_page_index;
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index a80fd2d..88911ac 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -268,8 +268,6 @@
 IPC_STRUCT_TRAITS_BEGIN(PP_PrivateAccessibilityViewportInfo)
   IPC_STRUCT_TRAITS_MEMBER(zoom)
   IPC_STRUCT_TRAITS_MEMBER(scale)
-  IPC_STRUCT_TRAITS_MEMBER(total_scrollable_size)
-  IPC_STRUCT_TRAITS_MEMBER(current_scroll_position)
   IPC_STRUCT_TRAITS_MEMBER(scroll)
   IPC_STRUCT_TRAITS_MEMBER(offset)
   IPC_STRUCT_TRAITS_MEMBER(selection_start_page_index)
diff --git a/services/device/geolocation/BUILD.gn b/services/device/geolocation/BUILD.gn
index 8594bb9..6e275d07 100644
--- a/services/device/geolocation/BUILD.gn
+++ b/services/device/geolocation/BUILD.gn
@@ -149,7 +149,6 @@
     ]
 
     deps = [
-      ":geolocation",
       ":geolocation_jni_headers",
       "$google_play_services_package:google_play_services_base_java",
       "$google_play_services_package:google_play_services_basement_java",
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.cc b/services/network/public/cpp/host_resolver_mojom_traits.cc
index 6211ddc..f5303393 100644
--- a/services/network/public/cpp/host_resolver_mojom_traits.cc
+++ b/services/network/public/cpp/host_resolver_mojom_traits.cc
@@ -422,11 +422,16 @@
   return false;
 }
 
+// static
 bool StructTraits<
     network::mojom::ResolveErrorInfoDataView,
     net::ResolveErrorInfo>::Read(network::mojom::ResolveErrorInfoDataView data,
                                  net::ResolveErrorInfo* out) {
-  *out = net::ResolveErrorInfo(data.error());
+  // There should not be a secure network error if the error code indicates no
+  // error.
+  if (data.error() == net::OK && data.is_secure_network_error())
+    return false;
+  *out = net::ResolveErrorInfo(data.error(), data.is_secure_network_error());
   return true;
 }
 
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.h b/services/network/public/cpp/host_resolver_mojom_traits.h
index 80e1267..084ca52 100644
--- a/services/network/public/cpp/host_resolver_mojom_traits.h
+++ b/services/network/public/cpp/host_resolver_mojom_traits.h
@@ -131,6 +131,11 @@
     return resolve_error_info.error;
   }
 
+  static bool is_secure_network_error(
+      net::ResolveErrorInfo resolve_error_info) {
+    return resolve_error_info.is_secure_network_error;
+  }
+
   static bool Read(network::mojom::ResolveErrorInfoDataView data,
                    net::ResolveErrorInfo* out);
 };
diff --git a/services/network/public/cpp/net_ipc_param_traits.cc b/services/network/public/cpp/net_ipc_param_traits.cc
index edd0c305..8e794695 100644
--- a/services/network/public/cpp/net_ipc_param_traits.cc
+++ b/services/network/public/cpp/net_ipc_param_traits.cc
@@ -317,11 +317,13 @@
 void ParamTraits<net::ResolveErrorInfo>::Write(base::Pickle* m,
                                                const param_type& p) {
   WriteParam(m, p.error);
+  WriteParam(m, p.is_secure_network_error);
 }
 bool ParamTraits<net::ResolveErrorInfo>::Read(const base::Pickle* m,
                                               base::PickleIterator* iter,
                                               param_type* r) {
-  return ReadParam(m, iter, &r->error);
+  return ReadParam(m, iter, &r->error) &&
+         ReadParam(m, iter, &r->is_secure_network_error);
 }
 void ParamTraits<net::ResolveErrorInfo>::Log(const param_type& p,
                                              std::string* l) {
diff --git a/services/network/public/mojom/host_resolver.mojom b/services/network/public/mojom/host_resolver.mojom
index 04fa980..2648dda 100644
--- a/services/network/public/mojom/host_resolver.mojom
+++ b/services/network/public/mojom/host_resolver.mojom
@@ -117,6 +117,11 @@
   // Underlying network error code. See net/base/net_error_list.h for error
   // descriptions.
   int32 error;
+
+  // Whether |error| came from a DNS-over-HTTPS lookup. This will be false if
+  // the answer was obtained from the cache or if |error| is net::OK since this
+  // field is intended to identify secure DNS *network* failures.
+  bool is_secure_network_error = false;
 };
 
 // Control handle used to control outstanding NetworkContext::ResolveHost
diff --git a/services/network/resource_scheduler/resource_scheduler.cc b/services/network/resource_scheduler/resource_scheduler.cc
index 2012ac5..f2cccbd 100644
--- a/services/network/resource_scheduler/resource_scheduler.cc
+++ b/services/network/resource_scheduler/resource_scheduler.cc
@@ -312,7 +312,11 @@
   net::URLRequest* url_request() { return request_; }
   const net::URLRequest* url_request() const { return request_; }
   bool is_async() const { return is_async_; }
-  uint32_t fifo_ordering() const { return fifo_ordering_; }
+  uint32_t fifo_ordering() const {
+    // Ensure that |fifo_ordering_| has been set before it's used.
+    DCHECK_LT(0u, fifo_ordering_);
+    return fifo_ordering_;
+  }
   void set_fifo_ordering(uint32_t fifo_ordering) {
     fifo_ordering_ = fifo_ordering;
   }
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index f78d704..081e5dc 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -144,200 +144,6 @@
     "isolated_scripts": [
       {
         "args": [
-          "--gtest-benchmark-name",
-          "angle_perftests"
-        ],
-        "isolate_name": "angle_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "angle_perftests",
-        "override_compile_targets": [
-          "angle_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3-23.21.13.8792",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R220 [01] (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "load_library_perf_tests"
-        ],
-        "isolate_name": "load_library_perf_tests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "load_library_perf_tests",
-        "override_compile_targets": [
-          "load_library_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3-23.21.13.8792",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R220 [01] (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "media_perftests"
-        ],
-        "isolate_name": "media_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "media_perftests",
-        "override_compile_targets": [
-          "media_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3-23.21.13.8792",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R220 [01] (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "passthrough_command_buffer_perftests",
-          "--use-cmd-decoder=passthrough",
-          "--use-angle=gl-null"
-        ],
-        "isolate_name": "command_buffer_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "passthrough_command_buffer_perftests",
-        "override_compile_targets": [
-          "command_buffer_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3-23.21.13.8792",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R220 [01] (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "validating_command_buffer_perftests",
-          "--use-cmd-decoder=validating",
-          "--use-stub"
-        ],
-        "isolate_name": "command_buffer_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "validating_command_buffer_perftests",
-        "override_compile_targets": [
-          "command_buffer_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3-23.21.13.8792",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R220 [01] (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
           "-v",
           "--browser=release_x64",
           "--upload-results",
@@ -367,7 +173,7 @@
           "hard_timeout": 19800,
           "ignore_task_failure": false,
           "io_timeout": 19800,
-          "shards": 5
+          "shards": 4
         },
         "trigger_script": {
           "args": [
@@ -384,120 +190,6 @@
     "isolated_scripts": [
       {
         "args": [
-          "--gtest-benchmark-name",
-          "components_perftests"
-        ],
-        "isolate_name": "components_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "components_perftests",
-        "override_compile_targets": [
-          "components_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532-6.1.7600.16385",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R210 II (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "load_library_perf_tests"
-        ],
-        "isolate_name": "load_library_perf_tests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "load_library_perf_tests",
-        "override_compile_targets": [
-          "load_library_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532-6.1.7600.16385",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R210 II (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "media_perftests"
-        ],
-        "isolate_name": "media_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "media_perftests",
-        "override_compile_targets": [
-          "media_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532-6.1.7600.16385",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "PowerEdge R210 II (Dell Inc.)"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
           "-v",
           "--browser=release",
           "--upload-results",
@@ -526,7 +218,7 @@
           "hard_timeout": 19800,
           "ignore_task_failure": false,
           "io_timeout": 19800,
-          "shards": 5
+          "shards": 4
         },
         "trigger_script": {
           "args": [
@@ -745,7 +437,7 @@
       {
         "args": [
           "-v",
-          "--browser=android-chrome",
+          "--browser=android-chrome-bundle",
           "--upload-results",
           "--test-shard-map-filename=android-go-perf_map.json",
           "--run-ref-build"
@@ -1118,7 +810,7 @@
       {
         "args": [
           "-v",
-          "--browser=android-chrome",
+          "--browser=android-chrome-bundle",
           "--upload-results",
           "--test-shard-map-filename=android-pixel2-perf_map.json",
           "--run-ref-build"
@@ -1831,196 +1523,6 @@
     "isolated_scripts": [
       {
         "args": [
-          "--gtest-benchmark-name",
-          "base_perftests"
-        ],
-        "isolate_name": "base_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "base_perftests",
-        "override_compile_targets": [
-          "base_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821-4.0.20-3.2.8",
-              "os": "Mac-10.13.3",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "MacBookPro11,5_x86-64-i7-4870HQ_AMD Radeon R8 M370X 4.0.20 [3.2.8]_Intel Haswell Iris Pro Graphics 5200 4.0.20 [3.2.8]_16384_APPLE SSD SM0512G"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "media_perftests"
-        ],
-        "isolate_name": "media_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "media_perftests",
-        "override_compile_targets": [
-          "media_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821-4.0.20-3.2.8",
-              "os": "Mac-10.13.3",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "MacBookPro11,5_x86-64-i7-4870HQ_AMD Radeon R8 M370X 4.0.20 [3.2.8]_Intel Haswell Iris Pro Graphics 5200 4.0.20 [3.2.8]_16384_APPLE SSD SM0512G"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "net_perftests"
-        ],
-        "isolate_name": "net_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "net_perftests",
-        "override_compile_targets": [
-          "net_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821-4.0.20-3.2.8",
-              "os": "Mac-10.13.3",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "MacBookPro11,5_x86-64-i7-4870HQ_AMD Radeon R8 M370X 4.0.20 [3.2.8]_Intel Haswell Iris Pro Graphics 5200 4.0.20 [3.2.8]_16384_APPLE SSD SM0512G"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "performance_browser_tests"
-        ],
-        "isolate_name": "performance_browser_tests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_browser_tests",
-        "override_compile_targets": [
-          "performance_browser_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821-4.0.20-3.2.8",
-              "os": "Mac-10.13.3",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "MacBookPro11,5_x86-64-i7-4870HQ_AMD Radeon R8 M370X 4.0.20 [3.2.8]_Intel Haswell Iris Pro Graphics 5200 4.0.20 [3.2.8]_16384_APPLE SSD SM0512G"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "views_perftests"
-        ],
-        "isolate_name": "views_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "views_perftests",
-        "override_compile_targets": [
-          "views_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821-4.0.20-3.2.8",
-              "os": "Mac-10.13.3",
-              "pool": "chrome.tests.perf",
-              "synthetic_product_name": "MacBookPro11,5_x86-64-i7-4870HQ_AMD Radeon R8 M370X 4.0.20 [3.2.8]_Intel Haswell Iris Pro Graphics 5200 4.0.20 [3.2.8]_16384_APPLE SSD SM0512G"
-            }
-          ],
-          "expiration": 7200,
-          "hard_timeout": 19800,
-          "ignore_task_failure": false,
-          "io_timeout": 19800,
-          "shards": 1
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "requires_simultaneous_shard_dispatch": true,
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
           "-v",
           "--browser=release",
           "--upload-results",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 9b8f148..994dd8d 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -771,6 +771,27 @@
             ]
         }
     ],
+    "AutofillCompany": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "RejectBirthyearAsCompany",
+                    "enable_features": [
+                        "AutofillEnableCompanyName",
+                        "AutofillRejectCompanyBirthyear"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillDynamicForms": [
         {
             "platforms": [
@@ -791,26 +812,6 @@
             ]
         }
     ],
-    "AutofillEnableCompanyName": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Disabled",
-                    "disable_features": [
-                        "AutofillEnableCompanyName"
-                    ]
-                }
-            ]
-        }
-    ],
     "AutofillEnableLocalCardMigrationForNonSyncUser": [
         {
             "platforms": [
@@ -1018,7 +1019,7 @@
             ]
         }
     ],
-    "AutofillRejectCompanyBirthyear": [
+    "AutofillServerBehaviors": [
         {
             "platforms": [
                 "android",
@@ -1030,9 +1031,13 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled",
+                    "name": "API_Enabled",
+                    "params": {
+                        "autofill-server-url": "https://content-autofill.googleapis.com/"
+                    },
                     "enable_features": [
-                        "AutofillRejectCompanyBirthyear"
+                        "AutofillServerCommunication",
+                        "AutofillUseApi"
                     ]
                 }
             ]
@@ -6938,6 +6943,28 @@
             ]
         }
     ],
+    "UnidoDeviceExpiration": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_24",
+                    "params": {
+                        "SharingDeviceExpirationHours": "24"
+                    },
+                    "enable_features": [
+                        "SharingDeviceExpiration"
+                    ]
+                }
+            ]
+        }
+    ],
     "UnidoOnSignIn": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 51fcd3f3..961e8ab 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -48,10 +48,6 @@
 const base::Feature kFreezeUserAgent{"FreezeUserAgent",
                                      base::FEATURE_DISABLED_BY_DEFAULT};
 
-// When enabled, the compositing of trivial 3D transforms is disabled.
-const base::Feature kDoNotCompositeTrivial3D{"DoNotCompositeTrivial3D",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
-
 // When enabled, enter assumed-overlap mode in compositing overlap testing
 // anytime a fixed or sticky position element is encountered.
 const base::Feature kAssumeOverlapAfterFixedOrStickyPosition{
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index a8159c1..2f4d338 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -28,7 +28,6 @@
 BLINK_COMMON_EXPORT extern const base::Feature kImplicitRootScroller;
 BLINK_COMMON_EXPORT extern const base::Feature kCSSOMViewScrollCoordinates;
 BLINK_COMMON_EXPORT extern const base::Feature kDisplayLocking;
-BLINK_COMMON_EXPORT extern const base::Feature kDoNotCompositeTrivial3D;
 BLINK_COMMON_EXPORT extern const base::Feature
     kAssumeOverlapAfterFixedOrStickyPosition;
 BLINK_COMMON_EXPORT extern const base::Feature kFastBorderRadius;
diff --git a/third_party/blink/public/common/input/web_mouse_wheel_event.h b/third_party/blink/public/common/input/web_mouse_wheel_event.h
index b7dc7e91..605740b8 100644
--- a/third_party/blink/public/common/input/web_mouse_wheel_event.h
+++ b/third_party/blink/public/common/input/web_mouse_wheel_event.h
@@ -124,16 +124,6 @@
   bool IsCancelable() const { return dispatch_type == kBlocking; }
 };
 
-inline bool operator==(const WebMouseWheelEvent& a,
-                       const WebMouseWheelEvent& b) {
-  return memcmp(&a, &b, a.size()) == 0;
-}
-
-inline bool operator!=(const WebMouseWheelEvent& a,
-                       const WebMouseWheelEvent& b) {
-  return !(a == b);
-}
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_INPUT_WEB_MOUSE_WHEEL_EVENT_H_
diff --git a/third_party/blink/public/mojom/speech/speech_recognizer.mojom b/third_party/blink/public/mojom/speech/speech_recognizer.mojom
index e9fdbe6..18392fa 100644
--- a/third_party/blink/public/mojom/speech/speech_recognizer.mojom
+++ b/third_party/blink/public/mojom/speech/speech_recognizer.mojom
@@ -7,7 +7,6 @@
 import "third_party/blink/public/mojom/speech/speech_recognition_grammar.mojom";
 import "third_party/blink/public/mojom/speech/speech_recognition_result.mojom";
 import "third_party/blink/public/mojom/speech/speech_recognition_error.mojom";
-import "url/mojom/origin.mojom";
 
 // Created by the renderer and sent to the browser to start a speech recognition
 // session.
@@ -26,9 +25,6 @@
   // Speech grammars to use.
   array<SpeechRecognitionGrammar> grammars;
 
-  // URL of the page (or iframe if applicable).
-  url.mojom.Origin origin;
-
   // Maximum number of hypotheses allowed for each results.
   uint32 max_hypotheses;
 
diff --git a/third_party/blink/public/platform/web_gesture_curve.h b/third_party/blink/public/platform/web_gesture_curve.h
index b4ba1bf..b1af885b5 100644
--- a/third_party/blink/public/platform/web_gesture_curve.h
+++ b/third_party/blink/public/platform/web_gesture_curve.h
@@ -25,7 +25,6 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_GESTURE_CURVE_H_
 #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_GESTURE_CURVE_H_
 
-#include "third_party/blink/public/platform/web_float_size.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 
 namespace blink {
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index c6141238d..3d6beec0 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -111,7 +111,6 @@
   BLINK_PLATFORM_EXPORT static void EnableFileSystem(bool);
   BLINK_PLATFORM_EXPORT static void EnableForceSynchronousHTMLParsing(bool);
   BLINK_PLATFORM_EXPORT static void EnableForceTallerSelectPopup(bool);
-  BLINK_PLATFORM_EXPORT static void EnableFormControlsRefresh(bool);
   BLINK_PLATFORM_EXPORT static void EnableGenericSensorExtraClasses(bool);
   BLINK_PLATFORM_EXPORT static void EnableImplicitRootScroller(bool);
   BLINK_PLATFORM_EXPORT static void EnableCSSOMViewScrollCoordinates(bool);
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index c08e621..d4aa837 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -39,7 +39,6 @@
 #include "cc/trees/layer_tree_host_client.h"
 #include "third_party/blink/public/common/input/web_menu_source_type.h"
 #include "third_party/blink/public/platform/web_common.h"
-#include "third_party/blink/public/platform/web_float_size.h"
 #include "third_party/blink/public/platform/web_input_event_result.h"
 #include "third_party/blink/public/platform/web_point.h"
 #include "third_party/blink/public/platform/web_rect.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
index 7308bc6..f95c979 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
@@ -1481,8 +1481,10 @@
   // Preserving behavior, filesystem URL is not preserved across cloning.
   V8TestingScope scope;
   KURL url("filesystem:http://example.com/isolated/hash/non-native-file");
+  FileMetadata metadata;
+  metadata.length = 0;
   File* file =
-      File::CreateForFileSystemFile(url, FileMetadata(), File::kIsUserVisible);
+      File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible);
   v8::Local<v8::Value> wrapper = ToV8(file, scope.GetScriptState());
   v8::Local<v8::Value> result = RoundTrip(wrapper, scope);
   ASSERT_TRUE(V8File::HasInstance(result, scope.GetIsolate()));
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl
index 9134acd3..e25a788 100644
--- a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl
+++ b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl
@@ -42,7 +42,13 @@
 
 CSSPropertyID cssPropertyID(const String& string)
 {
-    return resolveCSSPropertyID(unresolvedCSSPropertyID(string));
+    // TODO(rodneyding): remove temporary stopgap
+    return resolveCSSPropertyID(unresolvedCSSPropertyID(nullptr, string));
+}
+
+CSSPropertyID cssPropertyID(const ExecutionContext* execution_context, const String& string)
+{
+    return resolveCSSPropertyID(unresolvedCSSPropertyID(execution_context, string));
 }
 
 mojom::blink::CSSSampleId GetCSSSampleId(CSSPropertyID id) {
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl
index a6995d6..8dcf239 100644
--- a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl
@@ -17,6 +17,8 @@
 
 namespace blink {
 
+class ExecutionContext;
+
 enum class CSSPropertyID {
     kInvalid = 0,
     kVariable = 1,
@@ -66,9 +68,10 @@
 
 inline bool isPropertyAlias(CSSPropertyID id) { return static_cast<int>(id) & {{alias_offset}}; }
 
-CSSPropertyID CORE_EXPORT unresolvedCSSPropertyID(const WTF::String&);
+CSSPropertyID CORE_EXPORT unresolvedCSSPropertyID(const ExecutionContext*, const WTF::String&);
 
 CSSPropertyID CORE_EXPORT cssPropertyID(const WTF::String&);
+CSSPropertyID CORE_EXPORT cssPropertyID(const ExecutionContext*, const WTF::String&);
 
 class CSSPropertyIDList {
   STACK_ALLOCATED();
diff --git a/third_party/blink/renderer/core/clipboard/data_object_test.cc b/third_party/blink/renderer/core/clipboard/data_object_test.cc
index f1a313a1..455adfa 100644
--- a/third_party/blink/renderer/core/clipboard/data_object_test.cc
+++ b/third_party/blink/renderer/core/clipboard/data_object_test.cc
@@ -128,8 +128,10 @@
 
   data_object_->AddFilename(file_path, String(), String());
   data_object_->AddFilename(file_path, String(), "fileSystemIdForFilename");
+  FileMetadata metadata;
+  metadata.length = 0;
   data_object_->Add(
-      File::CreateForFileSystemFile(url, FileMetadata(), File::kIsUserVisible),
+      File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible),
       "fileSystemIdForFileSystemFile");
 
   ASSERT_EQ(3U, data_object_->length());
diff --git a/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.cc b/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.cc
index 71b74cf..dbd9993 100644
--- a/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.cc
+++ b/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.cc
@@ -122,7 +122,8 @@
     const String& value,
     const String& priority,
     ExceptionState& exception_state) {
-  CSSPropertyID property_id = unresolvedCSSPropertyID(property_name);
+  CSSPropertyID property_id =
+      unresolvedCSSPropertyID(execution_context, property_name);
   if (!isValidCSSPropertyID(property_id))
     return;
 
diff --git a/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.h b/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.h
index e6e7d68..223cabe5 100644
--- a/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.h
+++ b/third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.h
@@ -42,6 +42,8 @@
  public:
   virtual Element* ParentElement() const { return nullptr; }
   StyleSheetContents* ContextStyleSheet() const;
+  AbstractPropertySetCSSStyleDeclaration(ExecutionContext* context)
+      : CSSStyleDeclaration(context) {}
 
   void Trace(blink::Visitor*) override;
 
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 587fff4..a41986a 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
@@ -226,11 +226,13 @@
 }  // namespace
 
 const Vector<const CSSProperty*>&
-CSSComputedStyleDeclaration::ComputableProperties() {
+CSSComputedStyleDeclaration::ComputableProperties(
+    const ExecutionContext* execution_context) {
   DEFINE_STATIC_LOCAL(Vector<const CSSProperty*>, properties, ());
   if (properties.IsEmpty()) {
     CSSProperty::FilterWebExposedCSSPropertiesIntoVector(
-        kComputedPropertyArray, base::size(kComputedPropertyArray), properties);
+        execution_context, kComputedPropertyArray,
+        base::size(kComputedPropertyArray), properties);
   }
   return properties;
 }
@@ -239,7 +241,8 @@
     Node* n,
     bool allow_visited_style,
     const String& pseudo_element_name)
-    : node_(n),
+    : CSSStyleDeclaration(n ? &n->GetDocument() : nullptr),
+      node_(n),
       pseudo_element_specifier_(
           CSSSelector::ParsePseudoId(pseudo_element_name)),
       allow_visited_style_(allow_visited_style) {}
@@ -248,7 +251,8 @@
 
 String CSSComputedStyleDeclaration::cssText() const {
   StringBuilder result;
-  static const Vector<const CSSProperty*>& properties = ComputableProperties();
+  static const Vector<const CSSProperty*>& properties =
+      ComputableProperties(GetExecutionContext());
 
   for (unsigned i = 0; i < properties.size(); i++) {
     if (i)
@@ -442,14 +446,15 @@
 unsigned CSSComputedStyleDeclaration::length() const {
   if (!node_ || !node_->InActiveDocument())
     return 0;
-  return ComputableProperties().size();
+  return ComputableProperties(GetExecutionContext()).size();
 }
 
 String CSSComputedStyleDeclaration::item(unsigned i) const {
   if (i >= length())
     return "";
 
-  return ComputableProperties()[i]->GetPropertyNameString();
+  return ComputableProperties(GetExecutionContext())[i]
+      ->GetPropertyNameString();
 }
 
 bool CSSComputedStyleDeclaration::CssPropertyMatches(
@@ -476,7 +481,7 @@
 
 MutableCSSPropertyValueSet* CSSComputedStyleDeclaration::CopyProperties()
     const {
-  return CopyPropertiesInSet(ComputableProperties());
+  return CopyPropertiesInSet(ComputableProperties(GetExecutionContext()));
 }
 
 MutableCSSPropertyValueSet* CSSComputedStyleDeclaration::CopyPropertiesInSet(
diff --git a/third_party/blink/renderer/core/css/css_computed_style_declaration.h b/third_party/blink/renderer/core/css/css_computed_style_declaration.h
index 0b699ed9..6d3d65a 100644
--- a/third_party/blink/renderer/core/css/css_computed_style_declaration.h
+++ b/third_party/blink/renderer/core/css/css_computed_style_declaration.h
@@ -34,6 +34,7 @@
 namespace blink {
 
 class ExceptionState;
+class ExecutionContext;
 class LayoutObject;
 class MutableCSSPropertyValueSet;
 class Node;
@@ -42,7 +43,8 @@
 class CORE_EXPORT CSSComputedStyleDeclaration final
     : public CSSStyleDeclaration {
  public:
-  static const Vector<const CSSProperty*>& ComputableProperties();
+  static const Vector<const CSSProperty*>& ComputableProperties(
+      const ExecutionContext*);
 
   CSSComputedStyleDeclaration(Node*,
                               bool allow_visited_style = false,
diff --git a/third_party/blink/renderer/core/css/css_style_declaration.cc b/third_party/blink/renderer/core/css/css_style_declaration.cc
index 697a1b6..b7a0cb78 100644
--- a/third_party/blink/renderer/core/css/css_style_declaration.cc
+++ b/third_party/blink/renderer/core/css/css_style_declaration.cc
@@ -78,7 +78,8 @@
   return false;
 }
 
-CSSPropertyID ParseCSSPropertyID(const AtomicString& property_name) {
+CSSPropertyID ParseCSSPropertyID(const ExecutionContext* execution_context,
+                                 const AtomicString& property_name) {
   unsigned length = property_name.length();
   if (!length)
     return CSSPropertyID::kInvalid;
@@ -117,7 +118,7 @@
     return CSSPropertyID::kInvalid;
 
   String prop_name = builder.ToString();
-  return unresolvedCSSPropertyID(prop_name);
+  return unresolvedCSSPropertyID(execution_context, prop_name);
 }
 
 // When getting properties on CSSStyleDeclarations, the name used from
@@ -129,28 +130,36 @@
 // Example: 'backgroundPositionY' -> 'background-position-y'
 //
 // Also, certain prefixes such as 'css-' are stripped.
-CSSPropertyID CssPropertyInfo(const AtomicString& name) {
+CSSPropertyID CssPropertyInfo(const ExecutionContext* execution_context,
+                              const AtomicString& name) {
   typedef HashMap<String, CSSPropertyID> CSSPropertyIDMap;
   DEFINE_STATIC_LOCAL(CSSPropertyIDMap, map, ());
   CSSPropertyIDMap::iterator iter = map.find(name);
   if (iter != map.end())
     return iter->value;
 
-  CSSPropertyID unresolved_property = ParseCSSPropertyID(name);
+  CSSPropertyID unresolved_property =
+      ParseCSSPropertyID(execution_context, name);
   if (unresolved_property == CSSPropertyID::kVariable)
     unresolved_property = CSSPropertyID::kInvalid;
   map.insert(name, unresolved_property);
   DCHECK(!isValidCSSPropertyID(unresolved_property) ||
          CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
-             .IsWebExposed());
+             .IsWebExposed(execution_context));
   return unresolved_property;
 }
 
 }  // namespace
 
+void CSSStyleDeclaration::Trace(Visitor* visitor) {
+  visitor->Trace(execution_context_);
+  ScriptWrappable::Trace(visitor);
+}
+
 String CSSStyleDeclaration::AnonymousNamedGetter(const AtomicString& name) {
   // Search the style declaration.
-  CSSPropertyID unresolved_property = CssPropertyInfo(name);
+  CSSPropertyID unresolved_property =
+      CssPropertyInfo(GetExecutionContext(), name);
 
   // Do not handle non-property names.
   if (!isValidCSSPropertyID(unresolved_property))
@@ -166,7 +175,7 @@
       ExecutionContext::From(script_state);
   if (!execution_context)
     return false;
-  CSSPropertyID unresolved_property = CssPropertyInfo(name);
+  CSSPropertyID unresolved_property = CssPropertyInfo(execution_context, name);
   if (!isValidCSSPropertyID(unresolved_property))
     return false;
   // We create the ExceptionState manually due to performance issues: adding
@@ -191,17 +200,19 @@
   typedef Vector<String, numCSSProperties - 1> PreAllocatedPropertyVector;
   DEFINE_STATIC_LOCAL(PreAllocatedPropertyVector, property_names, ());
 
+  const ExecutionContext* execution_context = GetExecutionContext();
+
   if (property_names.IsEmpty()) {
     for (CSSPropertyID property_id : CSSPropertyIDList()) {
       const CSSProperty& property_class =
           CSSProperty::Get(resolveCSSPropertyID(property_id));
-      if (property_class.IsWebExposed())
+      if (property_class.IsWebExposed(execution_context))
         property_names.push_back(property_class.GetJSPropertyName());
     }
     for (CSSPropertyID property_id : kCSSPropertyAliasList) {
       const CSSUnresolvedProperty* property_class =
           CSSUnresolvedProperty::GetAliasProperty(property_id);
-      if (property_class->IsWebExposed())
+      if (property_class->IsWebExposed(execution_context))
         property_names.push_back(property_class->GetJSPropertyName());
     }
     std::sort(property_names.begin(), property_names.end(),
@@ -212,7 +223,13 @@
 
 bool CSSStyleDeclaration::NamedPropertyQuery(const AtomicString& name,
                                              ExceptionState&) {
-  return isValidCSSPropertyID(CssPropertyInfo(name));
+  return isValidCSSPropertyID(CssPropertyInfo(GetExecutionContext(), name));
+}
+
+ExecutionContext* CSSStyleDeclaration::GetExecutionContext() const {
+  return execution_context_ && !execution_context_->IsContextDestroyed()
+             ? execution_context_.Get()
+             : nullptr;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_style_declaration.h b/third_party/blink/renderer/core/css/css_style_declaration.h
index 8292a45e..aa4a7fa 100644
--- a/third_party/blink/renderer/core/css/css_style_declaration.h
+++ b/third_party/blink/renderer/core/css/css_style_declaration.h
@@ -43,6 +43,8 @@
  public:
   ~CSSStyleDeclaration() override = default;
 
+  void Trace(Visitor* visitor) override;
+
   virtual CSSRule* parentRule() const = 0;
   String cssFloat() { return GetPropertyValueInternal(CSSPropertyID::kFloat); }
   void setCSSFloat(const ExecutionContext* execution_context,
@@ -100,9 +102,12 @@
   bool NamedPropertyQuery(const AtomicString&, ExceptionState&);
 
  protected:
-  CSSStyleDeclaration() = default;
+  CSSStyleDeclaration(ExecutionContext* context)
+      : execution_context_(context) {}
+  ExecutionContext* GetExecutionContext() const;
 
  private:
+  WeakMember<ExecutionContext> execution_context_;
   DISALLOW_COPY_AND_ASSIGN(CSSStyleDeclaration);
 };
 
diff --git a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
index 8ae6921e..6787613 100644
--- a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
+++ b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
@@ -177,9 +177,10 @@
     return 0;
 
   DCHECK(StyledNode());
-  return CSSComputedStyleDeclaration::ComputableProperties().size() +
+  const Document& document = StyledNode()->GetDocument();
+  return CSSComputedStyleDeclaration::ComputableProperties(&document).size() +
          ComputedStyleCSSValueMapping::GetVariables(
-             *style, StyledNode()->GetDocument().GetPropertyRegistry())
+             *style, document.GetPropertyRegistry())
              .size();
 }
 
@@ -265,11 +266,13 @@
   if (!style)
     return;
 
+  DCHECK(StyledNode());
+  const Document& document = StyledNode()->GetDocument();
   // Have to sort by all properties by code point, so we have to store
   // them in a buffer first.
   HeapVector<std::pair<CSSPropertyName, Member<const CSSValue>>> values;
   for (const CSSProperty* property :
-       CSSComputedStyleDeclaration::ComputableProperties()) {
+       CSSComputedStyleDeclaration::ComputableProperties(&document)) {
     DCHECK(property);
     DCHECK(!property->IDEquals(CSSPropertyID::kVariable));
     const CSSValue* value = property->CSSValueFromComputedStyle(
@@ -278,8 +281,7 @@
       values.emplace_back(CSSPropertyName(property->PropertyID()), value);
   }
 
-  PropertyRegistry* registry =
-      StyledNode()->GetDocument().GetPropertyRegistry();
+  const PropertyRegistry* registry = document.GetPropertyRegistry();
 
   for (const auto& name_value :
        ComputedStyleCSSValueMapping::GetVariables(*style, registry)) {
diff --git a/third_party/blink/renderer/core/css/dom_window_css.cc b/third_party/blink/renderer/core/css/dom_window_css.cc
index 1f83329c0..d3133ca 100644
--- a/third_party/blink/renderer/core/css/dom_window_css.cc
+++ b/third_party/blink/renderer/core/css/dom_window_css.cc
@@ -43,7 +43,8 @@
 bool DOMWindowCSS::supports(const ExecutionContext* execution_context,
                             const String& property,
                             const String& value) {
-  CSSPropertyID unresolved_property = unresolvedCSSPropertyID(property);
+  CSSPropertyID unresolved_property =
+      unresolvedCSSPropertyID(execution_context, property);
   if (unresolved_property == CSSPropertyID::kInvalid)
     return false;
   if (unresolved_property == CSSPropertyID::kVariable) {
@@ -59,7 +60,7 @@
 
 #if DCHECK_IS_ON()
   DCHECK(CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
-             .IsWebExposed());
+             .IsWebExposed(execution_context));
 #endif
 
   // This will return false when !important is present
diff --git a/third_party/blink/renderer/core/css/inline_css_style_declaration.h b/third_party/blink/renderer/core/css/inline_css_style_declaration.h
index 127c9d89..2003ccd7 100644
--- a/third_party/blink/renderer/core/css/inline_css_style_declaration.h
+++ b/third_party/blink/renderer/core/css/inline_css_style_declaration.h
@@ -27,16 +27,18 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_INLINE_CSS_STYLE_DECLARATION_H_
 
 #include "third_party/blink/renderer/core/css/abstract_property_set_css_style_declaration.h"
+#include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/element.h"
 
 namespace blink {
 
-class Element;
-
 class InlineCSSStyleDeclaration final
     : public AbstractPropertySetCSSStyleDeclaration {
  public:
   explicit InlineCSSStyleDeclaration(Element* parent_element)
-      : parent_element_(parent_element) {}
+      : AbstractPropertySetCSSStyleDeclaration(
+            parent_element ? &parent_element->GetDocument() : nullptr),
+        parent_element_(parent_element) {}
 
   void Trace(blink::Visitor*) override;
 
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.cc b/third_party/blink/renderer/core/css/parser/css_parser_context.cc
index b99070e..cac0609f 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_context.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_context.cc
@@ -245,6 +245,10 @@
   return document_.Get() == other;
 }
 
+const Document* CSSParserContext::GetDocument() const {
+  return document_.Get();
+}
+
 void CSSParserContext::ReportLayoutAnimationsViolationIfNeeded(
     const StyleRuleKeyframe& rule) const {
   if (!document_)
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.h b/third_party/blink/renderer/core/css/parser/css_parser_context.h
index 28a2da4..e9ee5e8 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_context.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_context.h
@@ -119,6 +119,7 @@
   void CountDeprecation(WebFeature) const;
   bool IsUseCounterRecordingEnabled() const { return document_; }
   bool IsDocumentHandleEqual(const Document* other) const;
+  const Document* GetDocument() const;
 
   ContentSecurityPolicyDisposition ShouldCheckContentSecurityPolicy() const {
     return should_check_content_security_policy_;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index a998c01c..22ae697 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -1003,7 +1003,8 @@
     AtRuleDescriptorParser::ParseAtRule(atrule_id, range, *context_,
                                         parsed_properties_);
   } else {
-    unresolved_property = lhs.ParseAsUnresolvedCSSPropertyID(context_->Mode());
+    unresolved_property = lhs.ParseAsUnresolvedCSSPropertyID(
+        context_->GetDocument(), context_->Mode());
   }
 
   // @rules other than FontFace still handled with legacy code.
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token.cc b/third_party/blink/renderer/core/css/parser/css_parser_token.cc
index 39a17b8..6f85bf2 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_token.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_token.cc
@@ -87,9 +87,10 @@
 }
 
 CSSPropertyID CSSParserToken::ParseAsUnresolvedCSSPropertyID(
+    const ExecutionContext* execution_context,
     CSSParserMode mode) const {
   DCHECK_EQ(type_, static_cast<unsigned>(kIdentToken));
-  return UnresolvedCSSPropertyID(Value(), mode);
+  return UnresolvedCSSPropertyID(execution_context, Value(), mode);
 }
 
 AtRuleDescriptorID CSSParserToken::ParseAsAtRuleDescriptorID() const {
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token.h b/third_party/blink/renderer/core/css/parser/css_parser_token.h
index a626f903..c094ae05 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_token.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_token.h
@@ -14,6 +14,7 @@
 
 namespace blink {
 
+class ExecutionContext;
 enum class CSSValueID;
 
 enum CSSParserTokenType {
@@ -149,6 +150,7 @@
   bool HasStringBacking() const;
 
   CSSPropertyID ParseAsUnresolvedCSSPropertyID(
+      const ExecutionContext* execution_context,
       CSSParserMode mode = kHTMLStandardMode) const;
   AtRuleDescriptorID ParseAsAtRuleDescriptorID() const;
 
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser.cc b/third_party/blink/renderer/core/css/parser/css_property_parser.cc
index 949dbf7..7e01efd 100644
--- a/third_party/blink/renderer/core/css/parser/css_property_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_property_parser.cc
@@ -171,16 +171,19 @@
   return false;
 }
 
-static inline bool IsExposedInMode(const CSSProperty& property,
+static inline bool IsExposedInMode(const ExecutionContext* execution_context,
+                                   const CSSProperty& property,
                                    CSSParserMode mode) {
-  return mode == kUASheetMode ? property.IsUAExposed()
-                              : property.IsWebExposed();
+  return mode == kUASheetMode ? property.IsUAExposed(execution_context)
+                              : property.IsWebExposed(execution_context);
 }
 
 template <typename CharacterType>
-static CSSPropertyID UnresolvedCSSPropertyID(const CharacterType* property_name,
-                                             unsigned length,
-                                             CSSParserMode mode) {
+static CSSPropertyID UnresolvedCSSPropertyID(
+    const ExecutionContext* execution_context,
+    const CharacterType* property_name,
+    unsigned length,
+    CSSParserMode mode) {
   if (length == 0)
     return CSSPropertyID::kInvalid;
   if (length >= 2 && property_name[0] == '-' && property_name[1] == '-')
@@ -205,23 +208,30 @@
   CSSPropertyID property_id = static_cast<CSSPropertyID>(hash_table_entry->id);
   const CSSProperty& property =
       CSSProperty::Get(resolveCSSPropertyID(property_id));
-  bool exposed = IsExposedInMode(property, mode);
+  bool exposed = IsExposedInMode(execution_context, property, mode);
   return exposed ? property_id : CSSPropertyID::kInvalid;
 }
 
-CSSPropertyID unresolvedCSSPropertyID(const String& string) {
+CSSPropertyID unresolvedCSSPropertyID(const ExecutionContext* execution_context,
+                                      const String& string) {
   unsigned length = string.length();
   CSSParserMode mode = kHTMLStandardMode;
   return string.Is8Bit()
-             ? UnresolvedCSSPropertyID(string.Characters8(), length, mode)
-             : UnresolvedCSSPropertyID(string.Characters16(), length, mode);
+             ? UnresolvedCSSPropertyID(execution_context, string.Characters8(),
+                                       length, mode)
+             : UnresolvedCSSPropertyID(execution_context, string.Characters16(),
+                                       length, mode);
 }
 
-CSSPropertyID UnresolvedCSSPropertyID(StringView string, CSSParserMode mode) {
+CSSPropertyID UnresolvedCSSPropertyID(const ExecutionContext* execution_context,
+                                      StringView string,
+                                      CSSParserMode mode) {
   unsigned length = string.length();
   return string.Is8Bit()
-             ? UnresolvedCSSPropertyID(string.Characters8(), length, mode)
-             : UnresolvedCSSPropertyID(string.Characters16(), length, mode);
+             ? UnresolvedCSSPropertyID(execution_context, string.Characters8(),
+                                       length, mode)
+             : UnresolvedCSSPropertyID(execution_context, string.Characters16(),
+                                       length, mode);
 }
 
 template <typename CharacterType>
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser.h b/third_party/blink/renderer/core/css/parser/css_property_parser.h
index d4989ede..0e2d624 100644
--- a/third_party/blink/renderer/core/css/parser/css_property_parser.h
+++ b/third_party/blink/renderer/core/css/parser/css_property_parser.h
@@ -36,6 +36,7 @@
 
 class CSSPropertyValue;
 class CSSValue;
+class ExecutionContext;
 
 // Inputs: PropertyID, isImportant bool, CSSParserTokenRange.
 // Outputs: Vector of CSSProperties
@@ -77,7 +78,8 @@
   DISALLOW_COPY_AND_ASSIGN(CSSPropertyParser);
 };
 
-CSSPropertyID UnresolvedCSSPropertyID(StringView,
+CSSPropertyID UnresolvedCSSPropertyID(const ExecutionContext*,
+                                      StringView,
                                       CSSParserMode mode = kHTMLStandardMode);
 CSSValueID CssValueKeywordID(StringView);
 
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index 2785cee6..4310450 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -42,6 +42,7 @@
 #include "third_party/blink/renderer/core/css/properties/css_property.h"
 #include "third_party/blink/renderer/core/css/properties/longhand.h"
 #include "third_party/blink/renderer/core/css_value_keywords.h"
+#include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/style_property_shorthand.h"
 #include "third_party/blink/renderer/core/svg/svg_parsing_error.h"
@@ -2594,12 +2595,14 @@
     return nullptr;
   if (token.Id() == CSSValueID::kNone)
     return css_property_parser_helpers::ConsumeIdent(range);
-  CSSPropertyID unresolved_property = token.ParseAsUnresolvedCSSPropertyID();
+  const Document* document = context.GetDocument();
+  CSSPropertyID unresolved_property =
+      token.ParseAsUnresolvedCSSPropertyID(document);
   if (unresolved_property != CSSPropertyID::kInvalid &&
       unresolved_property != CSSPropertyID::kVariable) {
 #if DCHECK_IS_ON()
     DCHECK(CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
-               .IsWebExposed());
+               .IsWebExposed(document));
 #endif
     range.ConsumeIncludingWhitespace();
     return MakeGarbageCollected<CSSCustomIdentValue>(unresolved_property);
diff --git a/third_party/blink/renderer/core/css/properties/css_property.cc b/third_party/blink/renderer/core/css/properties/css_property.cc
index 0c0540f..af17d6cc 100644
--- a/third_party/blink/renderer/core/css/properties/css_property.cc
+++ b/third_party/blink/renderer/core/css/properties/css_property.cc
@@ -53,12 +53,13 @@
 }
 
 void CSSProperty::FilterWebExposedCSSPropertiesIntoVector(
+    const ExecutionContext* execution_context,
     const CSSPropertyID* properties,
     size_t propertyCount,
     Vector<const CSSProperty*>& outVector) {
   for (unsigned i = 0; i < propertyCount; i++) {
     const CSSProperty& property = Get(properties[i]);
-    if (property.IsWebExposed())
+    if (property.IsWebExposed(execution_context))
       outVector.push_back(&property);
   }
 }
diff --git a/third_party/blink/renderer/core/css/properties/css_property.h b/third_party/blink/renderer/core/css/properties/css_property.h
index c91d2ee..e1248d5 100644
--- a/third_party/blink/renderer/core/css/properties/css_property.h
+++ b/third_party/blink/renderer/core/css/properties/css_property.h
@@ -19,6 +19,7 @@
 
 class ComputedStyle;
 class CrossThreadStyleValue;
+class ExecutionContext;
 class LayoutObject;
 class SVGComputedStyle;
 
@@ -89,6 +90,7 @@
   virtual const CSSProperty* GetUAProperty() const { return nullptr; }
 
   static void FilterWebExposedCSSPropertiesIntoVector(
+      const ExecutionContext*,
       const CSSPropertyID*,
       size_t length,
       Vector<const CSSProperty*>&);
diff --git a/third_party/blink/renderer/core/css/properties/css_property_ref.cc b/third_party/blink/renderer/core/css/properties/css_property_ref.cc
index bd83e45f..1fba3f2 100644
--- a/third_party/blink/renderer/core/css/properties/css_property_ref.cc
+++ b/third_party/blink/renderer/core/css/properties/css_property_ref.cc
@@ -9,7 +9,7 @@
 namespace blink {
 
 CSSPropertyRef::CSSPropertyRef(const String& name, const Document& document)
-    : property_id_(unresolvedCSSPropertyID(name)) {
+    : property_id_(unresolvedCSSPropertyID(&document, name)) {
   if (property_id_ == CSSPropertyID::kVariable)
     custom_property_ = CustomProperty(AtomicString(name), document);
 }
diff --git a/third_party/blink/renderer/core/css/properties/css_property_test.cc b/third_party/blink/renderer/core/css/properties/css_property_test.cc
index a281633..d7f1da4 100644
--- a/third_party/blink/renderer/core/css/properties/css_property_test.cc
+++ b/third_party/blink/renderer/core/css/properties/css_property_test.cc
@@ -18,7 +18,8 @@
 TEST_F(CSSPropertyTest, VisitedPropertiesAreNotWebExposed) {
   for (CSSPropertyID property_id : CSSPropertyIDList()) {
     const CSSProperty& property = CSSProperty::Get(property_id);
-    EXPECT_TRUE(!property.IsVisited() || !property.IsWebExposed());
+    EXPECT_TRUE(!property.IsVisited() ||
+                !property.IsWebExposed(&GetDocument()));
   }
 }
 
@@ -40,7 +41,7 @@
 
 TEST_F(CSSPropertyTest, InternalEffectiveZoomNotWebExposed) {
   const CSSProperty& property = GetCSSPropertyInternalEffectiveZoom();
-  EXPECT_FALSE(property.IsWebExposed());
+  EXPECT_FALSE(property.IsWebExposed(&GetDocument()));
 }
 
 TEST_F(CSSPropertyTest, InternalEffectiveZoomCanBeParsed) {
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 85ee083..882b5adf 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
@@ -7882,12 +7882,12 @@
     if (range.Peek().GetType() != kIdentToken)
       return nullptr;
     CSSPropertyID unresolved_property =
-        UnresolvedCSSPropertyID(range.Peek().Value());
+        UnresolvedCSSPropertyID(context.GetDocument(), range.Peek().Value());
     if (unresolved_property != CSSPropertyID::kInvalid &&
         unresolved_property != CSSPropertyID::kVariable) {
 #if DCHECK_IS_ON()
       DCHECK(CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
-                 .IsWebExposed());
+                 .IsWebExposed(context.GetDocument()));
 #endif
       // Now "all" is used by both CSSValue and CSSPropertyValue.
       // Need to return nullptr when currentValue is CSSPropertyID::kAll.
diff --git a/third_party/blink/renderer/core/css/property_set_css_style_declaration.h b/third_party/blink/renderer/core/css/property_set_css_style_declaration.h
index 0c1e52f2..22a4496 100644
--- a/third_party/blink/renderer/core/css/property_set_css_style_declaration.h
+++ b/third_party/blink/renderer/core/css/property_set_css_style_declaration.h
@@ -36,8 +36,10 @@
 class PropertySetCSSStyleDeclaration
     : public AbstractPropertySetCSSStyleDeclaration {
  public:
+  // TODO(rodneyding): plumb actual context here to replace nullptr
   PropertySetCSSStyleDeclaration(MutableCSSPropertyValueSet& property_set)
-      : property_set_(&property_set) {}
+      : AbstractPropertySetCSSStyleDeclaration(nullptr),
+        property_set_(&property_set) {}
 
   void Trace(blink::Visitor*) override;
 
diff --git a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
index 8367b78..f1c8d75 100644
--- a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
@@ -216,7 +216,8 @@
   switch (property_level_) {
     case kPropertyDefault: {
       // Apply the block-centric properties of the style.
-      EditingStyle* block_style = style_->ExtractAndRemoveBlockProperties();
+      EditingStyle* block_style =
+          style_->ExtractAndRemoveBlockProperties(&GetDocument());
       if (!block_style->IsEmpty()) {
         ApplyBlockStyle(block_style, editing_state);
         if (editing_state->IsAborted())
diff --git a/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc b/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
index a826be4..3cfab79e 100644
--- a/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/composite_edit_command.cc
@@ -1518,7 +1518,7 @@
         start_of_paragraph_to_move.DeepEquivalent());
     style_in_empty_paragraph->MergeTypingStyle(&GetDocument());
     // The moved paragraph should assume the block style of the destination.
-    style_in_empty_paragraph->RemoveBlockProperties();
+    style_in_empty_paragraph->RemoveBlockProperties(&GetDocument());
   }
 
   // FIXME (5098931): We should add a new insert action
diff --git a/third_party/blink/renderer/core/editing/commands/insert_text_command.cc b/third_party/blink/renderer/core/editing/commands/insert_text_command.cc
index b7bd0ea..17dc51e 100644
--- a/third_party/blink/renderer/core/editing/commands/insert_text_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/insert_text_command.cc
@@ -174,7 +174,7 @@
     if (end_of_selection_was_at_start_of_block) {
       if (EditingStyle* typing_style =
               GetDocument().GetFrame()->GetEditor().TypingStyle())
-        typing_style->RemoveBlockProperties();
+        typing_style->RemoveBlockProperties(&GetDocument());
     }
   } else if (GetDocument().GetFrame()->GetEditor().IsOverwriteModeEnabled()) {
     if (PerformOverwrite(text_))
diff --git a/third_party/blink/renderer/core/editing/editing_style.cc b/third_party/blink/renderer/core/editing/editing_style.cc
index 645205a..2a49fa2 100644
--- a/third_party/blink/renderer/core/editing/editing_style.cc
+++ b/third_party/blink/renderer/core/editing/editing_style.cc
@@ -96,12 +96,13 @@
   kAllEditingProperties
 };
 
-static const Vector<const CSSProperty*>& AllEditingProperties() {
+static const Vector<const CSSProperty*>& AllEditingProperties(
+    const ExecutionContext* execution_context) {
   DEFINE_STATIC_LOCAL(Vector<const CSSProperty*>, properties, ());
   if (properties.IsEmpty()) {
     CSSProperty::FilterWebExposedCSSPropertiesIntoVector(
-        kStaticEditingProperties, base::size(kStaticEditingProperties),
-        properties);
+        execution_context, kStaticEditingProperties,
+        base::size(kStaticEditingProperties), properties);
     for (wtf_size_t index = 0; index < properties.size(); index++) {
       if (properties[index]->IDEquals(CSSPropertyID::kTextDecoration)) {
         properties.EraseAt(index);
@@ -112,12 +113,13 @@
   return properties;
 }
 
-static const Vector<const CSSProperty*>& InheritableEditingProperties() {
+static const Vector<const CSSProperty*>& InheritableEditingProperties(
+    const ExecutionContext* execution_context) {
   DEFINE_STATIC_LOCAL(Vector<const CSSProperty*>, properties, ());
   if (properties.IsEmpty()) {
     CSSProperty::FilterWebExposedCSSPropertiesIntoVector(
-        kStaticEditingProperties, base::size(kStaticEditingProperties),
-        properties);
+        execution_context, kStaticEditingProperties,
+        base::size(kStaticEditingProperties), properties);
     for (wtf_size_t index = 0; index < properties.size();) {
       if (!properties[index]->IsInherited()) {
         properties.EraseAt(index);
@@ -131,15 +133,19 @@
 
 template <class StyleDeclarationType>
 static MutableCSSPropertyValueSet* CopyEditingProperties(
+    const ExecutionContext* execution_context,
     StyleDeclarationType* style,
     EditingPropertiesType type = kOnlyInheritableEditingProperties) {
   if (type == kAllEditingProperties)
-    return style->CopyPropertiesInSet(AllEditingProperties());
-  return style->CopyPropertiesInSet(InheritableEditingProperties());
+    return style->CopyPropertiesInSet(AllEditingProperties(execution_context));
+  return style->CopyPropertiesInSet(
+      InheritableEditingProperties(execution_context));
 }
 
-static inline bool IsEditingProperty(CSSPropertyID id) {
-  static const Vector<const CSSProperty*>& properties = AllEditingProperties();
+static inline bool IsEditingProperty(ExecutionContext* execution_context,
+                                     CSSPropertyID id) {
+  static const Vector<const CSSProperty*>& properties =
+      AllEditingProperties(execution_context);
   for (wtf_size_t index = 0; index < properties.size(); index++) {
     if (properties[index]->IDEquals(id))
       return true;
@@ -504,7 +510,8 @@
   mutable_style_ =
       properties_to_include == kAllProperties && computed_style_at_position
           ? computed_style_at_position->CopyProperties()
-          : CopyEditingProperties(computed_style_at_position);
+          : CopyEditingProperties(&node->GetDocument(),
+                                  computed_style_at_position);
 
   if (properties_to_include == kEditingPropertiesInEffect) {
     if (const CSSValue* value =
@@ -700,23 +707,26 @@
     CSSPropertyID::kTextAlignLast, CSSPropertyID::kTextIndent,
     CSSPropertyID::kTextJustify, CSSPropertyID::kWidows};
 
-static const Vector<const CSSProperty*>& BlockPropertiesVector() {
+static const Vector<const CSSProperty*>& BlockPropertiesVector(
+    const ExecutionContext* execution_context) {
   DEFINE_STATIC_LOCAL(Vector<const CSSProperty*>, properties, ());
   if (properties.IsEmpty()) {
     CSSProperty::FilterWebExposedCSSPropertiesIntoVector(
-        kStaticBlockProperties, base::size(kStaticBlockProperties), properties);
+        execution_context, kStaticBlockProperties,
+        base::size(kStaticBlockProperties), properties);
   }
   return properties;
 }
 
-EditingStyle* EditingStyle::ExtractAndRemoveBlockProperties() {
+EditingStyle* EditingStyle::ExtractAndRemoveBlockProperties(
+    const ExecutionContext* execution_context) {
   EditingStyle* block_properties = MakeGarbageCollected<EditingStyle>();
   if (!mutable_style_)
     return block_properties;
 
-  block_properties->mutable_style_ =
-      mutable_style_->CopyPropertiesInSet(BlockPropertiesVector());
-  RemoveBlockProperties();
+  block_properties->mutable_style_ = mutable_style_->CopyPropertiesInSet(
+      BlockPropertiesVector(execution_context));
+  RemoveBlockProperties(execution_context);
 
   return block_properties;
 }
@@ -742,21 +752,25 @@
   return text_direction;
 }
 
-void EditingStyle::RemoveBlockProperties() {
+void EditingStyle::RemoveBlockProperties(
+    const ExecutionContext* execution_context) {
   if (!mutable_style_)
     return;
 
-  mutable_style_->RemovePropertiesInSet(BlockPropertiesVector().data(),
-                                        BlockPropertiesVector().size());
+  mutable_style_->RemovePropertiesInSet(
+      BlockPropertiesVector(execution_context).data(),
+      BlockPropertiesVector(execution_context).size());
 }
 
 void EditingStyle::RemoveStyleAddedByElement(Element* element) {
   if (!element || !element->parentNode())
     return;
   MutableCSSPropertyValueSet* parent_style = CopyEditingProperties(
+      &element->parentNode()->GetDocument(),
       MakeGarbageCollected<CSSComputedStyleDeclaration>(element->parentNode()),
       kAllEditingProperties);
   MutableCSSPropertyValueSet* node_style = CopyEditingProperties(
+      &element->GetDocument(),
       MakeGarbageCollected<CSSComputedStyleDeclaration>(element),
       kAllEditingProperties);
   node_style->RemoveEquivalentProperties(parent_style);
@@ -768,9 +782,11 @@
     return;
 
   MutableCSSPropertyValueSet* parent_style = CopyEditingProperties(
+      &element->parentNode()->GetDocument(),
       MakeGarbageCollected<CSSComputedStyleDeclaration>(element->parentNode()),
       kAllEditingProperties);
   MutableCSSPropertyValueSet* node_style = CopyEditingProperties(
+      &element->GetDocument(),
       MakeGarbageCollected<CSSComputedStyleDeclaration>(element),
       kAllEditingProperties);
   node_style->RemoveEquivalentProperties(parent_style);
@@ -1179,7 +1195,8 @@
     if (const CSSPropertyValueSet* style = element->InlineStyle()) {
       unsigned property_count = style->PropertyCount();
       for (unsigned i = 0; i < property_count; ++i) {
-        if (!IsEditingProperty(style->PropertyAt(i).Id()))
+        if (!IsEditingProperty(&element->GetDocument(),
+                               style->PropertyAt(i).Id()))
           return false;
       }
     }
@@ -1265,13 +1282,15 @@
       MergeStyle(element->InlineStyle(), mode);
       return;
     case kOnlyEditingInheritableProperties:
-      MergeStyle(CopyEditingProperties(element->InlineStyle(),
-                                       kOnlyInheritableEditingProperties),
-                 mode);
+      MergeStyle(
+          CopyEditingProperties(&element->GetDocument(), element->InlineStyle(),
+                                kOnlyInheritableEditingProperties),
+          mode);
       return;
     case kEditingPropertiesInEffect:
       MergeStyle(
-          CopyEditingProperties(element->InlineStyle(), kAllEditingProperties),
+          CopyEditingProperties(&element->GetDocument(), element->InlineStyle(),
+                                kAllEditingProperties),
           mode);
       return;
   }
@@ -1290,6 +1309,7 @@
 }
 
 static MutableCSSPropertyValueSet* ExtractEditingProperties(
+    const ExecutionContext* execution_context,
     const CSSPropertyValueSet* style,
     EditingStyle::PropertiesToInclude properties_to_include) {
   if (!style)
@@ -1298,9 +1318,11 @@
   switch (properties_to_include) {
     case EditingStyle::kAllProperties:
     case EditingStyle::kEditingPropertiesInEffect:
-      return CopyEditingProperties(style, kAllEditingProperties);
+      return CopyEditingProperties(execution_context, style,
+                                   kAllEditingProperties);
     case EditingStyle::kOnlyEditingInheritableProperties:
-      return CopyEditingProperties(style, kOnlyInheritableEditingProperties);
+      return CopyEditingProperties(execution_context, style,
+                                   kOnlyInheritableEditingProperties);
   }
 
   NOTREACHED();
@@ -1319,7 +1341,8 @@
         element->InlineStyle());
 
   style_from_rules->mutable_style_ = ExtractEditingProperties(
-      style_from_rules->mutable_style_.Get(), properties_to_include);
+      &element->GetDocument(), style_from_rules->mutable_style_.Get(),
+      properties_to_include);
   MergeStyle(style_from_rules->mutable_style_.Get(), mode);
 
   const HeapVector<Member<HTMLElementEquivalent>>& element_equivalents =
diff --git a/third_party/blink/renderer/core/editing/editing_style.h b/third_party/blink/renderer/core/editing/editing_style.h
index 9700794..e2cddf7 100644
--- a/third_party/blink/renderer/core/editing/editing_style.h
+++ b/third_party/blink/renderer/core/editing/editing_style.h
@@ -48,6 +48,7 @@
 class ContainerNode;
 class Document;
 class Element;
+class ExecutionContext;
 class HTMLElement;
 class LocalFrame;
 class MutableCSSPropertyValueSet;
@@ -90,9 +91,9 @@
   void OverrideWithStyle(const CSSPropertyValueSet*);
   void Clear();
   EditingStyle* Copy() const;
-  EditingStyle* ExtractAndRemoveBlockProperties();
+  EditingStyle* ExtractAndRemoveBlockProperties(const ExecutionContext*);
   EditingStyle* ExtractAndRemoveTextDirection(SecureContextMode);
-  void RemoveBlockProperties();
+  void RemoveBlockProperties(const ExecutionContext*);
   void RemoveStyleAddedByElement(Element*);
   void RemoveStyleConflictingWithStyleOfElement(Element*);
   void CollapseTextDecorationProperties(SecureContextMode);
diff --git a/third_party/blink/renderer/core/editing/editor.cc b/third_party/blink/renderer/core/editing/editor.cc
index 5d656f3..b0f6636e7 100644
--- a/third_party/blink/renderer/core/editing/editor.cc
+++ b/third_party/blink/renderer/core/editing/editor.cc
@@ -725,7 +725,8 @@
       EditingStyle::kPreserveWritingDirection);
 
   // Handle block styles, substracting these from the typing style.
-  EditingStyle* block_style = typing_style_->ExtractAndRemoveBlockProperties();
+  EditingStyle* block_style =
+      typing_style_->ExtractAndRemoveBlockProperties(GetFrame().GetDocument());
   if (!block_style->IsEmpty()) {
     DCHECK(GetFrame().GetDocument());
     MakeGarbageCollected<ApplyStyleCommand>(*GetFrame().GetDocument(),
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index 898b8c7..e5e6d1e 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -182,10 +182,6 @@
 
 namespace blink {
 
-::std::ostream& operator<<(::std::ostream& os, const WebFloatSize& size) {
-  return os << "WebFloatSize: [" << size.width << ", " << size.height << "]";
-}
-
 namespace {
 
 template <typename Function>
@@ -10167,8 +10163,8 @@
   // being run in a WebView without a size. This test should be fixed along with
   // the bug, crbug.com/589320.
   // Page scrolls vertically, but over-scrolls horizontally.
-  // EXPECT_CALL(client, didOverscroll(WebFloatSize(-100, 0), WebFloatSize(-100,
-  // 0), gfx::PointF(100, 100), WebFloatSize()));
+  // EXPECT_CALL(client, didOverscroll(gfx::Vector2dF(-100, 0),
+  // gfx::Vector2dF(-100, 0), gfx::PointF(100, 100), gfx::Vector2dF()));
   // ScrollUpdate(&webViewHelper, 100, 50);
   // Mock::VerifyAndClearExpectations(&client);
 
@@ -10178,8 +10174,8 @@
   // Mock::VerifyAndClearExpectations(&client);
 
   // Page scrolls horizontally, but over-scrolls vertically.
-  // EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 100), WebFloatSize(0,
-  // 100), gfx::PointF(100, 100), WebFloatSize()));
+  // EXPECT_CALL(client, didOverscroll(gfx::Vector2dF(0, 100), gfx::Vector2dF(0,
+  // 100), gfx::PointF(100, 100), gfx::Vector2dF()));
   // ScrollUpdate(&webViewHelper, -100, -100);
   // Mock::VerifyAndClearExpectations(&client);
 }
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 14caf14..140401cd 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -38,7 +38,6 @@
 #include "third_party/blink/public/common/input/web_gesture_event.h"
 #include "third_party/blink/public/common/input/web_input_event.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
-#include "third_party/blink/public/platform/web_float_size.h"
 #include "third_party/blink/public/platform/web_input_event_result.h"
 #include "third_party/blink/public/platform/web_point.h"
 #include "third_party/blink/public/platform/web_rect.h"
diff --git a/third_party/blink/renderer/core/fileapi/file.cc b/third_party/blink/renderer/core/fileapi/file.cc
index 925b20c..f1ce58a 100644
--- a/third_party/blink/renderer/core/fileapi/file.cc
+++ b/third_party/blink/renderer/core/fileapi/file.cc
@@ -271,9 +271,9 @@
       name_(DecodeURLEscapeSequences(file_system_url.LastPathComponent(),
                                      DecodeURLMode::kUTF8OrIsomorphic)),
       file_system_url_(file_system_url),
+      snapshot_size_(metadata.length),
       snapshot_modification_time_(metadata.modification_time) {
-  if (metadata.length >= 0)
-    snapshot_size_ = metadata.length;
+  DCHECK_GE(metadata.length, 0);
 }
 
 File::File(const File& other)
diff --git a/third_party/blink/renderer/core/fileapi/file_list_test.cc b/third_party/blink/renderer/core/fileapi/file_list_test.cc
index 6190cc6..74b34381 100644
--- a/third_party/blink/renderer/core/fileapi/file_list_test.cc
+++ b/third_party/blink/renderer/core/fileapi/file_list_test.cc
@@ -42,8 +42,10 @@
   {
     KURL url(
         "filesystem:http://example.com/isolated/hash/visible-non-native-file");
-    file_list->Append(File::CreateForFileSystemFile(url, FileMetadata(),
-                                                    File::kIsUserVisible));
+    FileMetadata metadata;
+    metadata.length = 0;
+    file_list->Append(
+        File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible));
   }
 
   // Not user visible file system URL file.
@@ -51,8 +53,10 @@
     KURL url(
         "filesystem:http://example.com/isolated/hash/"
         "not-visible-non-native-file");
-    file_list->Append(File::CreateForFileSystemFile(url, FileMetadata(),
-                                                    File::kIsNotUserVisible));
+    FileMetadata metadata;
+    metadata.length = 0;
+    file_list->Append(
+        File::CreateForFileSystemFile(url, metadata, File::kIsNotUserVisible));
   }
 
   Vector<base::FilePath> paths = file_list->PathsForUserVisibleFiles();
diff --git a/third_party/blink/renderer/core/fileapi/file_test.cc b/third_party/blink/renderer/core/fileapi/file_test.cc
index 3390e81..3959c353 100644
--- a/third_party/blink/renderer/core/fileapi/file_test.cc
+++ b/third_party/blink/renderer/core/fileapi/file_test.cc
@@ -214,6 +214,7 @@
 TEST(FileTest, fileSystemFileWithoutNativeSnapshot) {
   KURL url("filesystem:http://example.com/isolated/hash/non-native-file");
   FileMetadata metadata;
+  metadata.length = 0;
   File* const file =
       File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible);
   EXPECT_FALSE(file->HasBackingFile());
@@ -239,6 +240,7 @@
   KURL url_a("filesystem:http://example.com/isolated/hash/non-native-file-A");
   KURL url_b("filesystem:http://example.com/isolated/hash/non-native-file-B");
   FileMetadata metadata;
+  metadata.length = 0;
   File* const file_system_file_a1 =
       File::CreateForFileSystemFile(url_a, metadata, File::kIsUserVisible);
   File* const file_system_file_a2 =
diff --git a/third_party/blink/renderer/core/html/DEPS b/third_party/blink/renderer/core/html/DEPS
new file mode 100644
index 0000000..08c9d32
--- /dev/null
+++ b/third_party/blink/renderer/core/html/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  "html_meter_element.cc": [
+    "+ui/base/ui_base_features.h",
+  ],
+}
diff --git a/third_party/blink/renderer/core/html/forms/DEPS b/third_party/blink/renderer/core/html/forms/DEPS
index 4a90b3a..0d29535 100644
--- a/third_party/blink/renderer/core/html/forms/DEPS
+++ b/third_party/blink/renderer/core/html/forms/DEPS
@@ -1,5 +1,8 @@
 specific_include_rules = {
   "file_input_type_test.cc": [
     "+base/run_loop.h",
-  ]
+  ],
+  "(color_chooser_popup_ui_controller|date_time_chooser_impl|multiple_fields_temporal_input_type_view|picker_indicator_element|slider_thumb_element)\.cc": [
+    "+ui/base/ui_base_features.h",
+  ],
 }
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
index 4d48b28..d27648c 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
@@ -34,6 +34,7 @@
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page_popup.h"
 #include "third_party/blink/renderer/platform/geometry/int_rect.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -68,7 +69,7 @@
 
 void ColorChooserPopupUIController::OpenUI() {
   if (client_->ShouldShowSuggestions() ||
-      RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+      features::IsFormControlsRefreshEnabled())
     OpenPopup();
   else
     OpenColorChooser();
@@ -93,7 +94,7 @@
 
 void ColorChooserPopupUIController::WriteColorPickerDocument(
     SharedBuffer* data) {
-  DCHECK(RuntimeEnabledFeatures::FormControlsRefreshEnabled());
+  DCHECK(features::IsFormControlsRefreshEnabled());
 
   IntRect anchor_rect_in_screen = chrome_client_->ViewportToScreen(
       client_->ElementRectRelativeToViewport(), frame_->View());
@@ -134,7 +135,7 @@
       "<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data);
   data->Append(ChooserResourceLoader::GetPickerCommonStyleSheet());
   data->Append(ChooserResourceLoader::GetColorSuggestionPickerStyleSheet());
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (features::IsFormControlsRefreshEnabled())
     data->Append(ChooserResourceLoader::GetColorPickerStyleSheet());
 
   PagePopupClient::AddString(
@@ -146,7 +147,7 @@
   PagePopupClient::AddProperty(
       "otherColorLabel", GetLocale().QueryString(IDS_FORM_OTHER_COLOR_LABEL),
       data);
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     PagePopupClient::AddProperty("selectedColor",
                                  client_->CurrentColor().Serialized(), data);
   }
@@ -154,11 +155,11 @@
   AddProperty("zoomFactor", ScaledZoomFactor(), data);
   AddProperty("shouldShowColorSuggestionPicker", true, data);
   AddProperty("isFormControlsRefreshEnabled",
-              RuntimeEnabledFeatures::FormControlsRefreshEnabled(), data);
+              features::IsFormControlsRefreshEnabled(), data);
   PagePopupClient::AddString("};\n", data);
   data->Append(ChooserResourceLoader::GetPickerCommonJS());
   data->Append(ChooserResourceLoader::GetColorSuggestionPickerJS());
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (features::IsFormControlsRefreshEnabled())
     data->Append(ChooserResourceLoader::GetColorPickerJS());
   data->Append(ChooserResourceLoader::GetColorPickerCommonJS());
   PagePopupClient::AddString("</script></body>\n", data);
@@ -176,7 +177,7 @@
   if (num_value == kColorPickerPopupActionSetValue)
     SetValue(string_value);
   if (num_value == kColorPickerPopupActionChooseOtherColor) {
-    DCHECK(!RuntimeEnabledFeatures::FormControlsRefreshEnabled());
+    DCHECK(!features::IsFormControlsRefreshEnabled());
     OpenColorChooser();
   }
   CancelPopup();
diff --git a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
index ab96006..424aa01 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/platform/language.h"
 #include "third_party/blink/renderer/platform/text/date_components.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -124,11 +125,11 @@
   AddString("<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data);
 
   data->Append(ChooserResourceLoader::GetPickerCommonStyleSheet());
-  if (!RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (!features::IsFormControlsRefreshEnabled())
     data->Append(ChooserResourceLoader::GetPickerButtonStyleSheet());
   data->Append(ChooserResourceLoader::GetSuggestionPickerStyleSheet());
   data->Append(ChooserResourceLoader::GetCalendarPickerStyleSheet());
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     data->Append(ChooserResourceLoader::GetCalendarPickerRefreshStyleSheet());
     if (parameters_->type == input_type_names::kTime ||
         parameters_->type == input_type_names::kDatetimeLocal) {
@@ -175,7 +176,7 @@
   AddProperty("isLocaleRTL", locale_->IsRTL(), data);
   AddProperty("isRTL", parameters_->is_anchor_element_rtl, data);
   AddProperty("isFormControlsRefreshEnabled",
-              RuntimeEnabledFeatures::FormControlsRefreshEnabled(), data);
+              features::IsFormControlsRefreshEnabled(), data);
   AddProperty("mode", parameters_->type.GetString(), data);
   AddProperty("isAMPMFirst", parameters_->is_ampm_first, data);
   AddProperty("hasAMPM", parameters_->has_ampm, data);
@@ -224,7 +225,7 @@
 
   data->Append(ChooserResourceLoader::GetPickerCommonJS());
   data->Append(ChooserResourceLoader::GetSuggestionPickerJS());
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     data->Append(ChooserResourceLoader::GetMonthPickerJS());
     if (parameters_->type == input_type_names::kTime) {
       data->Append(ChooserResourceLoader::GetTimePickerJS());
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
index 665de49..ed68326 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -56,6 +56,7 @@
 #include "third_party/blink/renderer/platform/text/date_time_format.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 #include "third_party/blink/renderer/platform/wtf/date_math.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -388,7 +389,7 @@
       MakeGarbageCollected<DateTimeEditElement, Document&,
                            DateTimeEditElement::EditControlOwner&>(document,
                                                                    *this));
-  if (!RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (!features::IsFormControlsRefreshEnabled()) {
     GetElement().UpdateView();
     container->AppendChild(
         MakeGarbageCollected<ClearButtonElement, Document&,
@@ -488,7 +489,7 @@
       ((event.key() == "ArrowDown" && event.getModifierState("Alt")) ||
        (LayoutTheme::GetTheme().ShouldOpenPickerWithF4Key() &&
         event.key() == "F4") ||
-       (RuntimeEnabledFeatures::FormControlsRefreshEnabled() &&
+       (features::IsFormControlsRefreshEnabled() &&
         (event.key() == "Enter" || event.key() == " ")))) {
     if (PickerIndicatorElement* element = GetPickerIndicatorElement())
       element->OpenPopup();
diff --git a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
index 544b8a6b..2164db8 100644
--- a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
+++ b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
@@ -40,6 +40,7 @@
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -59,7 +60,7 @@
 LayoutObject* PickerIndicatorElement::CreateLayoutObject(
     const ComputedStyle& style,
     LegacyLayout legacy) {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (features::IsFormControlsRefreshEnabled())
     return HTMLDivElement::CreateLayoutObject(style, legacy);
 
   return new LayoutDetailsMarker(this);
diff --git a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
index a1cd688..2346756 100644
--- a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
+++ b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
@@ -47,6 +47,7 @@
 #include "third_party/blink/renderer/core/layout/layout_object_factory.h"
 #include "third_party/blink/renderer/core/layout/layout_slider_container.h"
 #include "third_party/blink/renderer/core/layout/layout_theme.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -67,7 +68,7 @@
   if (GetLayoutObject()) {
     GetLayoutObject()->SetNeedsLayoutAndFullPaintInvalidation(
         layout_invalidation_reason::kSliderValueChanged);
-    if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    if (features::IsFormControlsRefreshEnabled()) {
       HTMLInputElement* input(HostInput());
       if (input && input->GetLayoutObject()) {
         // the slider track selected value needs to be updated.
diff --git a/third_party/blink/renderer/core/html/html_meter_element.cc b/third_party/blink/renderer/core/html/html_meter_element.cc
index ed6f1c9e..863c800 100644
--- a/third_party/blink/renderer/core/html/html_meter_element.cc
+++ b/third_party/blink/renderer/core/html/html_meter_element.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -184,7 +185,7 @@
   value_ = MakeGarbageCollected<HTMLDivElement>(GetDocument());
   UpdateValueAppearance(0);
 
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     auto* clip = MakeGarbageCollected<HTMLDivElement>(GetDocument());
     clip->SetShadowPseudoId(AtomicString("-internal-meter-clip"));
     bar->AppendChild(clip);
diff --git a/third_party/blink/renderer/core/html/html_slot_element.cc b/third_party/blink/renderer/core/html/html_slot_element.cc
index f88a1f59..34242c5 100644
--- a/third_party/blink/renderer/core/html/html_slot_element.cc
+++ b/third_party/blink/renderer/core/html/html_slot_element.cc
@@ -273,8 +273,10 @@
 void HTMLSlotElement::DetachLayoutTree(bool performing_reattach) {
   if (SupportsAssignment()) {
     const HeapVector<Member<Node>>& flat_tree_children = assigned_nodes_;
-    for (auto& node : flat_tree_children)
-      node->DetachLayoutTree(performing_reattach);
+    for (auto& node : flat_tree_children) {
+      if (node->GetDocument() == GetDocument())
+        node->DetachLayoutTree(performing_reattach);
+    }
   }
   HTMLElement::DetachLayoutTree(performing_reattach);
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
index ed6a79c11..ffb66f0 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -1138,8 +1138,8 @@
   for (CSSPropertyID property_id : CSSPropertyIDList()) {
     const CSSProperty& property_class =
         CSSProperty::Get(resolveCSSPropertyID(property_id));
-    if (!property_class.IsWebExposed() || property_class.IsShorthand() ||
-        !property_class.IsProperty())
+    if (!property_class.IsWebExposed(&node->GetDocument()) ||
+        property_class.IsShorthand() || !property_class.IsProperty())
       continue;
     (*style)->emplace_back(
         protocol::CSS::CSSComputedStyleProperty::create()
diff --git a/third_party/blink/renderer/core/layout/DEPS b/third_party/blink/renderer/core/layout/DEPS
index 3b34fd02..15ab88fc 100644
--- a/third_party/blink/renderer/core/layout/DEPS
+++ b/third_party/blink/renderer/core/layout/DEPS
@@ -2,4 +2,10 @@
   "layout_theme\.cc": [
     "+ui/native_theme/native_theme.h",
   ],
+  "(layout_theme|layout_theme_default)\.cc": [
+    "+ui/base/ui_base_features.h",
+  ],
+  "layout_theme_mac.mm": [
+    "+ui/base/ui_base_features.h",
+  ],
 }
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 434e080..7b9cef8e 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2784,6 +2784,10 @@
       StyleRef().HasVisualOverflowingEffect())
     return false;
 
+  // Hit tests rects are painted and depend on the size.
+  if (HasEffectiveAllowedTouchAction())
+    return false;
+
   // Both mask and clip-path generates drawing display items that depends on
   // the size of the box.
   if (HasMask() || HasClipPath())
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index c3f78f7..0c5a57ad 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -238,11 +238,10 @@
     case EDisplay::kBlock:
     case EDisplay::kFlowRoot:
     case EDisplay::kInlineBlock:
+    case EDisplay::kListItem:
     case EDisplay::kMath:
     case EDisplay::kInlineMath:
       return LayoutObjectFactory::CreateBlockFlow(*element, style, legacy);
-    case EDisplay::kListItem:
-      return LayoutObjectFactory::CreateListItem(*element, style, legacy);
     case EDisplay::kTable:
     case EDisplay::kInlineTable:
       return new LayoutTable(element);
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.cc b/third_party/blink/renderer/core/layout/layout_object_factory.cc
index 0f7f13b..7e3cb04 100644
--- a/third_party/blink/renderer/core/layout/layout_object_factory.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_factory.cc
@@ -75,6 +75,13 @@
     Node& node,
     const ComputedStyle& style,
     LegacyLayout legacy) {
+  if (style.Display() == EDisplay::kListItem) {
+    // Create a LayoutBlockFlow with a list marker
+    return CreateObject<LayoutBlockFlow, LayoutNGListItem, LayoutListItem>(
+        node, style, legacy);
+  }
+
+  // Create a plain LayoutBlockFlow
   return CreateObject<LayoutBlockFlow, LayoutNGBlockFlow>(node, style, legacy);
 }
 
@@ -86,13 +93,6 @@
       node, style, legacy, disable_ng_for_type);
 }
 
-LayoutBlockFlow* LayoutObjectFactory::CreateListItem(Node& node,
-                                                     const ComputedStyle& style,
-                                                     LegacyLayout legacy) {
-  return CreateObject<LayoutBlockFlow, LayoutNGListItem, LayoutListItem>(
-      node, style, legacy);
-}
-
 LayoutObject* LayoutObjectFactory::CreateListMarker(Node& node,
                                                     const ComputedStyle& style,
                                                     LegacyLayout legacy) {
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.h b/third_party/blink/renderer/core/layout/layout_object_factory.h
index 4fc7ac0f..d5c6361 100644
--- a/third_party/blink/renderer/core/layout/layout_object_factory.h
+++ b/third_party/blink/renderer/core/layout/layout_object_factory.h
@@ -41,9 +41,6 @@
   static LayoutBlock* CreateFlexibleBox(Node&,
                                         const ComputedStyle&,
                                         LegacyLayout);
-  static LayoutBlockFlow* CreateListItem(Node&,
-                                         const ComputedStyle&,
-                                         LegacyLayout);
   static LayoutObject* CreateListMarker(Node&,
                                         const ComputedStyle&,
                                         LegacyLayout);
diff --git a/third_party/blink/renderer/core/layout/layout_theme.cc b/third_party/blink/renderer/core/layout/layout_theme.cc
index cd465a3..f30ab22 100644
--- a/third_party/blink/renderer/core/layout/layout_theme.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme.cc
@@ -61,6 +61,7 @@
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/native_theme/native_theme.h"
 
 // The methods in this file are shared by all themes on every platform.
@@ -884,7 +885,7 @@
 
 bool LayoutTheme::SupportsCalendarPicker(const AtomicString& type) const {
   DCHECK(RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled());
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled() &&
+  if (features::IsFormControlsRefreshEnabled() &&
       type == input_type_names::kTime)
     return true;
 
diff --git a/third_party/blink/renderer/core/layout/layout_theme_default.cc b/third_party/blink/renderer/core/layout/layout_theme_default.cc
index 8c38b30..eae1671 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_default.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_default.cc
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/platform/data_resource_helper.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -94,7 +95,7 @@
   String windows_style_sheet =
       UncompressResourceAsASCIIString(IDR_UASTYLE_THEME_WIN_CSS);
   String controls_refresh_style_sheet =
-      RuntimeEnabledFeatures::FormControlsRefreshEnabled()
+      features::IsFormControlsRefreshEnabled()
           ? UncompressResourceAsASCIIString(
                 IDR_UASTYLE_THEME_CONTROLS_REFRESH_CSS)
           : String();
@@ -154,14 +155,14 @@
 }
 
 IntSize LayoutThemeDefault::SliderTickSize() const {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (features::IsFormControlsRefreshEnabled())
     return IntSize(1, 4);
   else
     return IntSize(1, 6);
 }
 
 int LayoutThemeDefault::SliderTickOffsetFromTrackCenter() const {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+  if (features::IsFormControlsRefreshEnabled())
     return 7;
   else
     return -16;
diff --git a/third_party/blink/renderer/core/layout/layout_theme_mac.mm b/third_party/blink/renderer/core/layout/layout_theme_mac.mm
index 0a37082..f91b971 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_mac.mm
+++ b/third_party/blink/renderer/core/layout/layout_theme_mac.mm
@@ -46,6 +46,7 @@
 #import "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #import "third_party/blink/renderer/platform/text/platform_locale.h"
 #import "third_party/blink/renderer/platform/web_test_support.h"
+#include "ui/base/ui_base_features.h"
 
 // This is a view whose sole purpose is to tell AppKit that it's flipped.
 @interface BlinkFlippedControl : NSControl
@@ -1069,7 +1070,7 @@
 }
 
 LayoutTheme& LayoutTheme::NativeTheme() {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     DEFINE_STATIC_REF(LayoutTheme, layout_theme,
                       (LayoutThemeMacRefresh::Create()));
     return *layout_theme;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.cc
index dddadee..152b8baf 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.cc
@@ -17,6 +17,21 @@
 LayoutNGFlexibleBox::LayoutNGFlexibleBox(Element* element)
     : LayoutNGMixin<LayoutBlock>(element) {}
 
+bool LayoutNGFlexibleBox::HasTopOverflow() const {
+  if (IsHorizontalWritingMode())
+    return StyleRef().ResolvedIsColumnReverseFlexDirection();
+  return StyleRef().IsLeftToRightDirection() ==
+         StyleRef().ResolvedIsRowReverseFlexDirection();
+}
+
+bool LayoutNGFlexibleBox::HasLeftOverflow() const {
+  if (IsHorizontalWritingMode()) {
+    return StyleRef().IsLeftToRightDirection() ==
+           StyleRef().ResolvedIsRowReverseFlexDirection();
+  }
+  return StyleRef().ResolvedIsColumnReverseFlexDirection();
+}
+
 void LayoutNGFlexibleBox::UpdateBlockLayout(bool relayout_children) {
   LayoutAnalyzer::BlockScope analyzer(*this);
 
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h b/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h
index c4c0fcf..332506c6 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h
@@ -15,6 +15,9 @@
  public:
   explicit LayoutNGFlexibleBox(Element*);
 
+  bool HasTopOverflow() const override;
+  bool HasLeftOverflow() const override;
+
   void UpdateBlockLayout(bool relayout_children) override;
 
   bool IsFlexibleBoxIncludingDeprecatedAndNG() const final { return true; }
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_row_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_row_layout_algorithm.cc
index ac5ce47..a3b179b3 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_row_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_row_layout_algorithm.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_block_break_token.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h"
 #include "third_party/blink/renderer/core/mathml/mathml_element.h"
 
 namespace blink {
@@ -47,8 +48,15 @@
   LayoutUnit inline_offset, max_row_ascent, max_row_descent;
   for (NGLayoutInputNode child = Node().FirstChild(); child;
        child = child.NextSibling()) {
-    if (child.IsOutOfFlowPositioned())
+    if (child.IsOutOfFlowPositioned()) {
+      // TODO(rbuis): OOF should be "where child would have been if not
+      // absolutely positioned".
+      // Issue: https://github.com/mathml-refresh/mathml/issues/16
+      container_builder_.AddOutOfFlowChildCandidate(
+          To<NGBlockNode>(child), {border_scrollbar_padding_.inline_start,
+                                   border_scrollbar_padding_.block_start});
       continue;
+    }
     const ComputedStyle& child_style = child.Style();
     NGConstraintSpace child_space = CreateConstraintSpaceForMathChild(
         Node(), child_available_size_, ConstraintSpace(), child);
@@ -96,8 +104,6 @@
   child_available_size_ =
       ShrinkAvailableSize(border_box_size, border_scrollbar_padding_);
 
-  // TODO(rbuis): add OOF elements.
-
   NGContainerFragmentBuilder::ChildrenVector children;
   LayoutRowItems(&children, &max_row_block_baseline, &max_row_size);
 
@@ -122,7 +128,11 @@
       max_row_size.block_size + border_scrollbar_padding_.BlockSum());
   container_builder_.SetBlockSize(block_size);
 
-  // TODO(rbuis): handle OOF layout part.
+  NGOutOfFlowLayoutPart(
+      Node(), ConstraintSpace(),
+      container_builder_.Borders() + container_builder_.Scrollbar(),
+      &container_builder_)
+      .Run();
 
   return container_builder_.ToBoxFragment();
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 878135b..92bb41a6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -345,18 +345,22 @@
         is_horizontal_flow_ ? physical_border_scrollbar_padding.HorizontalSum()
                             : physical_border_scrollbar_padding.VerticalSum();
 
+    // TODO(dgrogan): Don't layout every time, just when you need to.
+    // Use ChildHasIntrinsicMainAxisSize as a guide.
+    scoped_refptr<const NGLayoutResult> layout_result =
+        child.Layout(child_space, /* break_token */ nullptr);
+    NGFragment fragment_in_child_writing_mode(
+        child_style.GetWritingMode(), layout_result->PhysicalFragment());
+
     // We want the child's min/max size in its writing mode, not ours. We'll
     // only ever use it if the child's inline axis is our main axis.
+    //
+    // Always calculate the min/max sizes after a layout in order to corrrectly
+    // account for any scrollbars.
     MinMaxSizeInput input(
         /* percentage_resolution_block_size */ content_box_size_.block_size);
     MinMaxSize intrinsic_sizes_border_box = child.ComputeMinMaxSize(
         child_style.GetWritingMode(), input, &child_space);
-    // TODO(dgrogan): Don't layout every time, just when you need to.
-    // Use ChildHasIntrinsicMainAxisSize as a guide.
-    scoped_refptr<const NGLayoutResult> layout_result =
-        child.Layout(child_space, nullptr /*break token*/);
-    NGFragment fragment_in_child_writing_mode(
-        child_style.GetWritingMode(), layout_result->PhysicalFragment());
 
     LayoutUnit flex_base_border_box;
     const Length& specified_length_in_main_axis =
diff --git a/third_party/blink/renderer/core/paint/DEPS b/third_party/blink/renderer/core/paint/DEPS
index 25664f0..9850ce0 100644
--- a/third_party/blink/renderer/core/paint/DEPS
+++ b/third_party/blink/renderer/core/paint/DEPS
@@ -13,5 +13,8 @@
   ],
   ".*test\.cc": [
     "+base/test/trace_event_analyzer.h",
-  ]
+  ],
+  "(paint_layer_scrollable_area|theme_painter|theme_painter_default)\.cc": [
+    "+ui/base/ui_base_features.h",
+  ],
 }
diff --git a/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc b/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
index 714a377..e8bbad1 100644
--- a/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
+++ b/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
@@ -222,4 +222,25 @@
   ExpectFullPaintInvalidationOnGeometryChange("With clip-path");
 }
 
+TEST_P(BoxPaintInvalidatorTest, InvalidateHitTestOnCompositingStyleChange) {
+  ScopedPaintUnderInvalidationCheckingForTest under_invalidation_checking(true);
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      #target {
+        width: 400px;
+        height: 300px;
+        overflow: hidden;
+        touch-action: none;
+      }
+    </style>
+    <div id="target" style="will-change: transform;"></div>
+  )HTML");
+
+  UpdateAllLifecyclePhasesForTest();
+  auto& target = *GetDocument().getElementById("target");
+  target.setAttribute(html_names::kStyleAttr, "");
+  UpdateAllLifecyclePhasesForTest();
+  // This test passes if no underinvalidation occurs.
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
index 65440c1..ec55304 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.h"
 
+#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
 #include "third_party/blink/renderer/core/layout/layout_block.h"
@@ -48,6 +49,13 @@
   UpdateType update_type = kDoNotForceUpdate;
   PaintLayer* layer =
       compositing_inputs_root_ ? compositing_inputs_root_ : root_layer_;
+
+  if (DisplayLockUtilities::NearestLockedExclusiveAncestor(
+          layer->GetLayoutObject())) {
+    compositing_inputs_root_ = nullptr;
+    return;
+  }
+
   CompositingReasons initial_compositing_reasons =
       layer->DirectCompositingReasons();
   ApplyAncestorInfoToSelfAndAncestorsRecursively(layer, update_type, info);
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
index 0ee97e1..797ee9c 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
@@ -4,8 +4,6 @@
 
 #include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h"
 
-#include "base/feature_list.h"
-#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/core/css/css_property_names.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/node.h"
@@ -165,10 +163,8 @@
     return false;
 
   // Don't composite "trivial" 3D transforms such as translateZ(0).
-  if (Platform::Current()->IsLowEndDevice() ||
-      base::FeatureList::IsEnabled(blink::features::kDoNotCompositeTrivial3D)) {
+  if (Platform::Current()->IsLowEndDevice())
     return layout_object.StyleRef().HasNonTrivial3DTransformOperation();
-  }
 
   return layout_object.StyleRef().Has3DTransformOperation();
 }
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc
index 9b626b6..5f9c538 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc
@@ -40,42 +40,7 @@
                CompositingReason::kComboAllStyleDeterminedReasons);
 }
 
-class CompositingReasonFinderTestWithDoNotCompositeTrivial3D
-    : public CompositingReasonFinderTest {
- public:
-  CompositingReasonFinderTestWithDoNotCompositeTrivial3D() {
-    scoped_feature_list_.InitAndEnableFeature(
-        blink::features::kDoNotCompositeTrivial3D);
-  }
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_F(CompositingReasonFinderTestWithDoNotCompositeTrivial3D,
-       DontPromoteTrivial3D) {
-  SetBodyInnerHTML(R"HTML(
-    <div id='target'
-      style='width: 100px; height: 100px; transform: translateZ(0)'></div>
-  )HTML");
-
-  Element* target = GetDocument().getElementById("target");
-  PaintLayer* paint_layer =
-      ToLayoutBoxModelObject(target->GetLayoutObject())->Layer();
-  EXPECT_EQ(kNotComposited, paint_layer->GetCompositingState());
-}
-
-class CompositingReasonFinderTestWithCompositeTrivial3D
-    : public CompositingReasonFinderTest {
- public:
-  CompositingReasonFinderTestWithCompositeTrivial3D() {
-    scoped_feature_list_.InitAndDisableFeature(
-        blink::features::kDoNotCompositeTrivial3D);
-  }
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_F(CompositingReasonFinderTestWithCompositeTrivial3D, PromoteTrivial3D) {
+TEST_F(CompositingReasonFinderTest, PromoteTrivial3D) {
   SetBodyInnerHTML(R"HTML(
     <div id='target'
       style='width: 100px; height: 100px; transform: translateZ(0)'></div>
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
index 8100621f..15bb8e48 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
@@ -4,13 +4,12 @@
 
 #include "third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.h"
 
-#include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
+#include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 
 namespace blink {
 
@@ -128,19 +127,7 @@
   EXPECT_EQ(IntRect(0, 0, 100, 100), tracking->Invalidations()[0].rect);
 }
 
-class CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D
-    : public CompositingRequirementsUpdaterTest {
- public:
-  CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D() {
-    scoped_feature_list_.InitAndEnableFeature(
-        blink::features::kDoNotCompositeTrivial3D);
-  }
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_F(CompositingRequirementsUpdaterTestWithDoNotCompositeTrivial3D,
-       NonTrivial3DTransforms) {
+TEST_F(CompositingRequirementsUpdaterTest, NonTrivial3DTransforms) {
   ScopedCSSIndependentTransformPropertiesForTest feature_scope(true);
 
   SetBodyInnerHTML(R"HTML(
@@ -169,7 +156,7 @@
               ToLayoutBox(transform_3d)->Layer()->GetCompositingReasons());
   const auto* transform_2d = GetLayoutObjectByElementId("2d-transform");
   EXPECT_FALSE(transform_2d->StyleRef().HasNonTrivial3DTransformOperation());
-  EXPECT_FALSE(ToLayoutBox(transform_2d)->Layer()->GetCompositingReasons());
+  EXPECT_TRUE(ToLayoutBox(transform_2d)->Layer()->GetCompositingReasons());
 
   const auto* transform_3d_translate_z =
       GetLayoutObjectByElementId("3d-transform-translate-z");
@@ -182,7 +169,7 @@
       GetLayoutObjectByElementId("2d-transform-translate-z");
   EXPECT_FALSE(
       transform_2d_translate_z->StyleRef().HasNonTrivial3DTransformOperation());
-  EXPECT_FALSE(
+  EXPECT_TRUE(
       ToLayoutBox(transform_2d_translate_z)->Layer()->GetCompositingReasons());
   const auto* transform_2d_translate_x =
       GetLayoutObjectByElementId("2d-transform-translate-x");
@@ -197,7 +184,7 @@
               ToLayoutBox(xform_rot_x_3d)->Layer()->GetCompositingReasons());
   const auto* xform_rot_x_2d = GetLayoutObjectByElementId("2d-transform-rot-x");
   EXPECT_FALSE(xform_rot_x_2d->StyleRef().HasNonTrivial3DTransformOperation());
-  EXPECT_FALSE(ToLayoutBox(xform_rot_x_2d)->Layer()->GetCompositingReasons());
+  EXPECT_TRUE(ToLayoutBox(xform_rot_x_2d)->Layer()->GetCompositingReasons());
   const auto* xform_rot_z_2d = GetLayoutObjectByElementId("2d-transform-rot-z");
   EXPECT_FALSE(xform_rot_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
   EXPECT_FALSE(ToLayoutBox(xform_rot_z_2d)->Layer()->GetCompositingReasons());
@@ -208,7 +195,7 @@
               ToLayoutBox(rotation_y_3d)->Layer()->GetCompositingReasons());
   const auto* rotation_y_2d = GetLayoutObjectByElementId("2d-rotation-y");
   EXPECT_FALSE(rotation_y_2d->StyleRef().HasNonTrivial3DTransformOperation());
-  EXPECT_FALSE(ToLayoutBox(rotation_y_2d)->Layer()->GetCompositingReasons());
+  EXPECT_TRUE(ToLayoutBox(rotation_y_2d)->Layer()->GetCompositingReasons());
   const auto* rotation_z_2d = GetLayoutObjectByElementId("2d-rotation-z");
   EXPECT_FALSE(rotation_z_2d->StyleRef().HasNonTrivial3DTransformOperation());
   EXPECT_FALSE(ToLayoutBox(rotation_z_2d)->Layer()->GetCompositingReasons());
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index 83e9b863..9a07b12 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1368,6 +1368,9 @@
     if (Compositor()) {
       if (!old_child_style.IsStacked())
         Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree);
+
+      if (Compositor()->GetCompositingInputsRoot() == old_child)
+        Compositor()->ClearCompositingInputsRoot();
     }
     // Dirty the z-order list in which we are contained.
     old_child->DirtyStackingContextZOrderLists();
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index bd2094b..08e4687 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -100,6 +100,7 @@
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -2603,7 +2604,7 @@
           style_source.StyleRef().EffectiveAppearance());
     }
     Element* style_source_element = nullptr;
-    if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    if (::features::IsFormControlsRefreshEnabled()) {
       style_source_element = DynamicTo<Element>(style_source.GetNode());
     }
     scrollbar = MakeGarbageCollected<Scrollbar>(
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
index 1fc80d1..b0fdf285 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -1362,28 +1362,40 @@
   EXPECT_EQ(ScrollOffset(0, 50), scrollable_area->GetScrollOffset());
 }
 
-class PaintLayerScrollableAreaCompositingTest
-    : public PaintLayerScrollableAreaTest {
- public:
-  PaintLayerScrollableAreaCompositingTest() {
-    if (GetParam() & kDoNotCompositeTrivial3D) {
-      scoped_feature_list_.InitAndEnableFeature(
-          blink::features::kDoNotCompositeTrivial3D);
-    } else {
-      scoped_feature_list_.InitAndDisableFeature(
-          blink::features::kDoNotCompositeTrivial3D);
-    }
-  }
+// Test that a trivial 3D transform results in composited scrolling.
+TEST_P(PaintLayerScrollableAreaTest, CompositeWithTrivial3D) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      #scroller {
+        width: 100px;
+        height: 100px;
+        overflow: scroll;
+        transform: translateZ(0);
+      }
+      #scrolled {
+        width: 200px;
+        height: 200px;
+      }
+    </style>
+    <div id="scroller">
+      <div id="scrolled"></div>
+    </div>
+  )HTML");
 
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
+  EXPECT_TRUE(UsesCompositedScrolling(GetLayoutObjectByElementId("scroller")));
+}
+
+class PaintLayerScrollableAreaTestLowEndPlatform
+    : public TestingPlatformSupport {
+ public:
+  bool IsLowEndDevice() override { return true; }
 };
 
-INSTANTIATE_DO_NOT_COMPOSITE_TRIVIAL_3D_P(
-    PaintLayerScrollableAreaCompositingTest);
-
-// Test that a trivial 3D transform results in composited scrolling.
-TEST_P(PaintLayerScrollableAreaCompositingTest, CompositeWithTrivial3D) {
+// Test that a trivial 3D transform results in composited scrolling even on
+// low-end devices that may not composite trivial 3D transforms.
+TEST_P(PaintLayerScrollableAreaTest, LowEndCompositeWithTrivial3D) {
+  ScopedTestingPlatformSupport<PaintLayerScrollableAreaTestLowEndPlatform>
+      platform;
   SetBodyInnerHTML(R"HTML(
     <style>
       #scroller {
diff --git a/third_party/blink/renderer/core/paint/theme_painter.cc b/third_party/blink/renderer/core/paint/theme_painter.cc
index ad3d89b..a6162bc 100644
--- a/third_party/blink/renderer/core/paint/theme_painter.cc
+++ b/third_party/blink/renderer/core/paint/theme_painter.cc
@@ -44,6 +44,7 @@
 #include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/native_theme/native_theme.h"
 
 // The methods in this file are shared by all themes on every platform.
@@ -286,13 +287,13 @@
     case kMenulistButtonPart:
       return true;
     case kTextFieldPart:
-      if (!RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+      if (!features::IsFormControlsRefreshEnabled()) {
         return true;
       }
       CountAppearanceTextFieldPart(node);
       return PaintTextField(node, style, paint_info, r);
     case kTextAreaPart:
-      if (!RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+      if (!features::IsFormControlsRefreshEnabled()) {
         return true;
       }
       if (node) {
@@ -350,13 +351,13 @@
   // Call the appropriate paint method based off the appearance value.
   switch (style.EffectiveAppearance()) {
     case kTextFieldPart:
-      if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+      if (features::IsFormControlsRefreshEnabled()) {
         return false;
       }
       CountAppearanceTextFieldPart(node);
       return PaintTextField(node, style, paint_info, r);
     case kTextAreaPart:
-      if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+      if (features::IsFormControlsRefreshEnabled()) {
         return false;
       }
       if (node) {
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.cc b/third_party/blink/renderer/core/paint/theme_painter_default.cc
index cc25ef54..d5723c2 100644
--- a/third_party/blink/renderer/core/paint/theme_painter_default.cc
+++ b/third_party/blink/renderer/core/paint/theme_painter_default.cc
@@ -38,6 +38,7 @@
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -151,8 +152,7 @@
   extra_params.button.zoom = zoom_level;
   GraphicsContextStateSaver state_saver(paint_info.context, false);
   IntRect unzoomed_rect = rect;
-  if (zoom_level != 1 &&
-      !RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (zoom_level != 1 && !features::IsFormControlsRefreshEnabled()) {
     state_saver.Save();
     unzoomed_rect.SetWidth(unzoomed_rect.Width() / zoom_level);
     unzoomed_rect.SetHeight(unzoomed_rect.Height() / zoom_level);
@@ -307,9 +307,8 @@
       theme_.ClampedMenuListArrowPaddingSize(document.GetFrame(), style);
   float arrow_scale_factor = arrow_box_width / theme_.MenuListArrowWidthInDIP();
   // TODO(tkent): This should be 7.0 to match scroll bar buttons.
-  float arrow_size =
-      (RuntimeEnabledFeatures::FormControlsRefreshEnabled() ? 8.0 : 6.0) *
-      arrow_scale_factor;
+  float arrow_size = (features::IsFormControlsRefreshEnabled() ? 8.0 : 6.0) *
+                     arrow_scale_factor;
   // Put the arrow at the center of paddingForArrow area.
   // |arrowX| is the left position for Aura theme engine.
   extra_params.menu_list.arrow_x =
@@ -336,8 +335,7 @@
   extra_params.slider.zoom = zoom_level;
   GraphicsContextStateSaver state_saver(i.context, false);
   IntRect unzoomed_rect = rect;
-  if (zoom_level != 1 &&
-      !RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (zoom_level != 1 && !features::IsFormControlsRefreshEnabled()) {
     state_saver.Save();
     unzoomed_rect.SetWidth(unzoomed_rect.Width() / zoom_level);
     unzoomed_rect.SetHeight(unzoomed_rect.Height() / zoom_level);
@@ -357,7 +355,7 @@
     LayoutBox* thumb = thumb_element ? thumb_element->GetLayoutBox() : nullptr;
     if (thumb) {
       IntRect thumb_rect = PixelSnappedIntRect(thumb->FrameRect());
-      if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+      if (features::IsFormControlsRefreshEnabled()) {
         extra_params.slider.thumb_x = thumb_rect.X();
         extra_params.slider.thumb_y = thumb_rect.Y();
       } else {
@@ -387,8 +385,7 @@
   extra_params.slider.zoom = zoom_level;
   GraphicsContextStateSaver state_saver(paint_info.context, false);
   IntRect unzoomed_rect = rect;
-  if (zoom_level != 1 &&
-      !RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (zoom_level != 1 && !features::IsFormControlsRefreshEnabled()) {
     state_saver.Save();
     unzoomed_rect.SetWidth(unzoomed_rect.Width() / zoom_level);
     unzoomed_rect.SetHeight(unzoomed_rect.Height() / zoom_level);
diff --git a/third_party/blink/renderer/core/scroll/DEPS b/third_party/blink/renderer/core/scroll/DEPS
new file mode 100644
index 0000000..7ef186be
--- /dev/null
+++ b/third_party/blink/renderer/core/scroll/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  "scrollbar.cc": [
+    "+ui/base/ui_base_features.h",
+  ],
+}
diff --git a/third_party/blink/renderer/core/scroll/scrollbar.cc b/third_party/blink/renderer/core/scroll/scrollbar.cc
index 499b45d..6401813 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h"
 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
 #include "third_party/blink/renderer/platform/text/text_direction.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -770,7 +771,7 @@
 }
 
 float Scrollbar::EffectiveZoom() const {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled() && style_source_ &&
+  if (::features::IsFormControlsRefreshEnabled() && style_source_ &&
       style_source_->GetLayoutObject()) {
     return style_source_->GetLayoutObject()->Style()->EffectiveZoom();
   }
@@ -778,7 +779,7 @@
 }
 
 bool Scrollbar::ContainerIsRightToLeft() const {
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled() && style_source_ &&
+  if (::features::IsFormControlsRefreshEnabled() && style_source_ &&
       style_source_->GetLayoutObject()) {
     TextDirection dir = style_source_->GetLayoutObject()->Style()->Direction();
     return IsRtl(dir);
diff --git a/third_party/blink/renderer/core/testing/DEPS b/third_party/blink/renderer/core/testing/DEPS
index a8194e3..efe470a 100644
--- a/third_party/blink/renderer/core/testing/DEPS
+++ b/third_party/blink/renderer/core/testing/DEPS
@@ -16,4 +16,7 @@
     'internals\.cc' : [
         "+third_party/blink/renderer/core/exported/web_view_impl.h",
     ],
+    "internals.cc": [
+        "+ui/base/ui_base_features.h",
+    ],
 }
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 75bc1372..d3cb1c4c 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -182,6 +182,7 @@
 #include "third_party/blink/renderer/platform/wtf/dtoa.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h"
+#include "ui/base/ui_base_features.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -334,6 +335,10 @@
   return WorkerThread::WorkerThreadCount();
 }
 
+bool Internals::isFormControlsRefreshEnabled() const {
+  return ::features::IsFormControlsRefreshEnabled();
+}
+
 GCObservation* Internals::observeGC(ScriptValue script_value) {
   v8::Local<v8::Value> observed_value = script_value.V8Value();
   DCHECK(!observed_value.IsEmpty());
@@ -3196,13 +3201,14 @@
 
 bool Internals::isCSSPropertyUseCounted(Document* document,
                                         const String& property_name) {
-  return document->IsPropertyCounted(unresolvedCSSPropertyID(property_name));
+  return document->IsPropertyCounted(
+      unresolvedCSSPropertyID(document, property_name));
 }
 
 bool Internals::isAnimatedCSSPropertyUseCounted(Document* document,
                                                 const String& property_name) {
   return document->IsAnimatedPropertyCounted(
-      unresolvedCSSPropertyID(property_name));
+      unresolvedCSSPropertyID(document, property_name));
 }
 
 void Internals::clearUseCounter(Document* document, uint32_t feature) {
diff --git a/third_party/blink/renderer/core/testing/internals.h b/third_party/blink/renderer/core/testing/internals.h
index ccd5b2bb..fe4ccfe 100644
--- a/third_party/blink/renderer/core/testing/internals.h
+++ b/third_party/blink/renderer/core/testing/internals.h
@@ -328,6 +328,8 @@
   InternalRuntimeFlags* runtimeFlags() const;
   unsigned workerThreadCount() const;
 
+  bool isFormControlsRefreshEnabled() const;
+
   String resolveModuleSpecifier(const String& specifier,
                                 const String& base_url_string,
                                 Document*,
diff --git a/third_party/blink/renderer/core/testing/internals.idl b/third_party/blink/renderer/core/testing/internals.idl
index 6961b399..fa12b72a 100644
--- a/third_party/blink/renderer/core/testing/internals.idl
+++ b/third_party/blink/renderer/core/testing/internals.idl
@@ -189,6 +189,7 @@
     readonly attribute InternalSettings settings;
     readonly attribute InternalRuntimeFlags runtimeFlags;
     readonly attribute unsigned long workerThreadCount;
+    readonly attribute boolean isFormControlsRefreshEnabled;
 
     // Flag for layerTreeAsText.
     // The value must be kept in sync with the value of LayerTreeFlags in layers_as_json.h.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
index ac8dd50..2239a3f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/core/fileapi/blob.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h"
+#include "third_party/blink/renderer/modules/peerconnection/rtc_error_event.h"
 #include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_peer_connection_handler_platform.h"
@@ -509,6 +510,10 @@
       ScheduleDispatchEvent(Event::Create(event_type_names::kOpen));
       break;
     case webrtc::DataChannelInterface::kClosed:
+      if (!channel()->error().ok()) {
+        ScheduleDispatchEvent(MakeGarbageCollected<RTCErrorEvent>(
+            event_type_names::kError, channel()->error()));
+      }
       ScheduleDispatchEvent(Event::Create(event_type_names::kClose));
       break;
     default:
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_error.cc b/third_party/blink/renderer/modules/peerconnection/rtc_error.cc
index 932fd05..77d77b60 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_error.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_error.cc
@@ -14,7 +14,7 @@
 }
 
 RTCError::RTCError(const RTCErrorInit* init, String message)
-    : DOMException(0u, "RTCError", std::move(message), String()),
+    : DOMException(DOMExceptionCode::kOperationError, std::move(message)),
       error_detail_(init->errorDetail()),
       sdp_line_number_(init->hasSdpLineNumber()
                            ? base::Optional<int32_t>(init->sdpLineNumber())
@@ -33,6 +33,13 @@
                       ? base::Optional<uint32_t>(init->sentAlert())
                       : base::nullopt) {}
 
+RTCError::RTCError(webrtc::RTCError err)
+    : DOMException(DOMExceptionCode::kOperationError, err.message()),
+      error_detail_(webrtc::ToString(err.error_detail())),
+      sctp_cause_code_(err.sctp_cause_code()
+                           ? base::Optional<int32_t>(*err.sctp_cause_code())
+                           : base::nullopt) {}
+
 const String& RTCError::errorDetail() const {
   return error_detail_;
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_error.h b/third_party/blink/renderer/modules/peerconnection/rtc_error.h
index 9182e58..f29f021 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_error.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_error.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/modules/peerconnection/rtc_error_init.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/webrtc/api/rtc_error.h"
 
 namespace blink {
 
@@ -18,7 +19,9 @@
 
  public:
   static RTCError* Create(const RTCErrorInit* init, String message);
+  static RTCError* Create(webrtc::RTCError);
   RTCError(const RTCErrorInit* init, String message);
+  RTCError(webrtc::RTCError);
 
   const String& errorDetail() const;
   int32_t sdpLineNumber(bool& is_null) const;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_error_event.cc b/third_party/blink/renderer/modules/peerconnection/rtc_error_event.cc
index ba5e9950..50a14fe 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_error_event.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_error_event.cc
@@ -20,6 +20,10 @@
   DCHECK(event_init_dict);
 }
 
+RTCErrorEvent::RTCErrorEvent(const AtomicString& type, webrtc::RTCError error)
+    : Event(type, Bubbles::kNo, Cancelable::kNo),
+      error_(MakeGarbageCollected<RTCError>(error)) {}
+
 RTCError* RTCErrorEvent::error() const {
   return error_;
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_error_event.h b/third_party/blink/renderer/modules/peerconnection/rtc_error_event.h
index e768586..509fa17a 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_error_event.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_error_event.h
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
+#include "third_party/webrtc/api/rtc_error.h"
 
 namespace blink {
 
@@ -25,6 +26,8 @@
   RTCErrorEvent(const AtomicString& type,
                 const RTCErrorEventInit* event_init_dict);
 
+  RTCErrorEvent(const AtomicString& type, webrtc::RTCError error);
+
   RTCError* error() const;
 
   void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index 8ecf1a6..96f015e 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -3101,6 +3101,9 @@
   if (signaling_state_ !=
       webrtc::PeerConnectionInterface::SignalingState::kClosed) {
     signaling_state_ = signaling_state;
+    if (closed_) {
+      return;
+    }
     Event* event = Event::Create(event_type_names::kSignalingstatechange);
     if (dispatch_event_immediately)
       DispatchEvent(*event);
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc b/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
index e2dc3d9..8c917b5 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
+++ b/third_party/blink/renderer/modules/speech/speech_recognition_controller.cc
@@ -66,7 +66,6 @@
   msg_params->max_hypotheses = max_alternatives;
   msg_params->continuous = continuous;
   msg_params->interim_results = interim_results;
-  msg_params->origin = GetSupplementable()->GetDocument()->GetSecurityOrigin();
   msg_params->client = std::move(session_client);
   msg_params->session_receiver = std::move(session_receiver);
 
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index ab062a3..d7d140a 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -1528,8 +1528,12 @@
   if (!CanReportPoses())
     return base::nullopt;
 
-  if (!mojo_from_viewer_)
+  if (!mojo_from_viewer_) {
+    if (sensorless_session_)
+      return TransformationMatrix();
+
     return base::nullopt;
+  }
 
   return *mojo_from_viewer_.get();
 }
diff --git a/third_party/blink/renderer/platform/blob/blob_data.cc b/third_party/blink/renderer/platform/blob/blob_data.cc
index a5779ae3..246335e 100644
--- a/third_party/blink/renderer/platform/blob/blob_data.cc
+++ b/third_party/blink/renderer/platform/blob/blob_data.cc
@@ -103,7 +103,7 @@
 BlobData::BlobData(FileCompositionStatus composition)
     : file_composition_(composition) {}
 
-BlobData::~BlobData() {}
+BlobData::~BlobData() = default;
 
 Vector<mojom::blink::DataElementPtr> BlobData::ReleaseElements() {
   return std::move(elements_);
@@ -173,6 +173,7 @@
          "create a blob with a single file with unknown size, use "
          "BlobData::createForFileWithUnknownSize. Otherwise please provide the "
          "file size.";
+  DCHECK_GE(length, 0);
   // Skip zero-byte items, as they don't matter for the contents of the blob.
   if (length == 0)
     return;
@@ -201,6 +202,7 @@
     const base::Optional<base::Time>& expected_modification_time) {
   DCHECK_EQ(file_composition_, FileCompositionStatus::NO_UNKNOWN_SIZE_FILES)
       << "Blobs with a unknown-size file cannot have other items.";
+  DCHECK_GE(length, 0);
   // Skip zero-byte items, as they don't matter for the contents of the blob.
   if (length == 0)
     return;
@@ -359,8 +361,7 @@
   DCHECK(blob_remote_.is_valid());
 }
 
-BlobDataHandle::~BlobDataHandle() {
-}
+BlobDataHandle::~BlobDataHandle() = default;
 
 mojo::PendingRemote<mojom::blink::Blob> BlobDataHandle::CloneBlobRemote() {
   MutexLocker locker(blob_remote_mutex_);
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 57a9102..4079c8e5 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -219,10 +219,6 @@
   RuntimeEnabledFeatures::SetForceTallerSelectPopupEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableFormControlsRefresh(bool enable) {
-  RuntimeEnabledFeatures::SetFormControlsRefreshEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableGenericSensorExtraClasses(bool enable) {
   RuntimeEnabledFeatures::SetSensorExtraClassesEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/heap/concurrent_marking_test.cc b/third_party/blink/renderer/platform/heap/concurrent_marking_test.cc
index b885e86..a8828af 100644
--- a/third_party/blink/renderer/platform/heap/concurrent_marking_test.cc
+++ b/third_party/blink/renderer/platform/heap/concurrent_marking_test.cc
@@ -31,238 +31,216 @@
 };
 
 // =============================================================================
-// Tests that expose data races when modifying collections ================
+// Tests that expose data races when modifying collections =====================
 // =============================================================================
 
-TEST_F(ConcurrentMarkingTest, AddToHashMap) {
+template <typename C>
+void AddToCollection() {
+  constexpr int kIterations = 100;
   IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Map = HeapHashMap<Member<IntegerObject>, Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Map>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Map>>();
-  Map* map = persistent->GetCollection();
+  Persistent<CollectionWrapper<C>> persistent =
+      MakeGarbageCollected<CollectionWrapper<C>>();
+  C* collection = persistent->GetCollection();
   driver.Start();
-  for (int i = 0; i < 100; ++i) {
+  for (int i = 0; i < kIterations; ++i) {
     driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      int num = 100 * i + j;
-      map->insert(MakeGarbageCollected<IntegerObject>(num),
-                  MakeGarbageCollected<IntegerObject>(num));
+    for (int j = 0; j < kIterations; ++j) {
+      int num = kIterations * i + j;
+      collection->insert(MakeGarbageCollected<IntegerObject>(num));
     }
   }
   driver.FinishSteps();
   driver.FinishGC();
 }
 
+template <typename C>
+void RemoveFromCollection() {
+  constexpr int kIterations = 100;
+  IncrementalMarkingTestDriver driver(ThreadState::Current());
+  Persistent<CollectionWrapper<C>> persistent =
+      MakeGarbageCollected<CollectionWrapper<C>>();
+  C* collection = persistent->GetCollection();
+  for (int i = 0; i < (kIterations * kIterations); ++i) {
+    collection->insert(MakeGarbageCollected<IntegerObject>(i));
+  }
+  driver.Start();
+  for (int i = 0; i < kIterations; ++i) {
+    driver.SingleConcurrentStep();
+    for (int j = 0; j < kIterations; ++j) {
+      collection->erase(collection->begin());
+    }
+  }
+  driver.FinishSteps();
+  driver.FinishGC();
+}
+
+template <typename C>
+void SwapCollections() {
+  constexpr int kIterations = 10;
+  IncrementalMarkingTestDriver driver(ThreadState::Current());
+  Persistent<CollectionWrapper<C>> persistent =
+      MakeGarbageCollected<CollectionWrapper<C>>();
+  C* collection = persistent->GetCollection();
+  driver.Start();
+  for (int i = 0; i < (kIterations * kIterations); ++i) {
+    C* new_collection = MakeGarbageCollected<C>();
+    for (int j = 0; j < kIterations * i; ++j) {
+      new_collection->insert(MakeGarbageCollected<IntegerObject>(j));
+    }
+    driver.SingleConcurrentStep();
+    collection->swap(*new_collection);
+  }
+  driver.FinishSteps();
+  driver.FinishGC();
+}
+
+// HeapHashMap
+
+template <typename T>
+class HeapHashMapAdapter : public HeapHashMap<T, T> {
+ public:
+  template <typename U>
+  ALWAYS_INLINE void insert(U* u) {
+    HeapHashMap<T, T>::insert(u, u);
+  }
+};
+
+TEST_F(ConcurrentMarkingTest, AddToHashMap) {
+  AddToCollection<HeapHashMapAdapter<Member<IntegerObject>>>();
+}
+
 TEST_F(ConcurrentMarkingTest, RemoveFromHashMap) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Map = HeapHashMap<Member<IntegerObject>, Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Map>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Map>>();
-  Map* map = persistent->GetCollection();
-  for (int i = 0; i < 10000; ++i) {
-    map->insert(MakeGarbageCollected<IntegerObject>(i),
-                MakeGarbageCollected<IntegerObject>(i));
-  }
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      map->erase(map->begin());
-    }
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  RemoveFromCollection<HeapHashMapAdapter<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, SwapHashMaps) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Map = HeapHashMap<Member<IntegerObject>, Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Map>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Map>>();
-  Map* map = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    Map new_map;
-    for (int j = 0; j < 10 * i; ++j) {
-      new_map.insert(MakeGarbageCollected<IntegerObject>(j),
-                     MakeGarbageCollected<IntegerObject>(j));
-    }
-    driver.SingleConcurrentStep();
-    map->swap(new_map);
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  SwapCollections<HeapHashMapAdapter<Member<IntegerObject>>>();
 }
 
+// HeapHashSet
+
 TEST_F(ConcurrentMarkingTest, AddToHashSet) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Set = HeapHashSet<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Set>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Set>>();
-  Set* set = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      int num = 100 * i + j;
-      set->insert(MakeGarbageCollected<IntegerObject>(num));
-    }
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  AddToCollection<HeapHashSet<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, RemoveFromHashSet) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Set = HeapHashSet<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Set>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Set>>();
-  Set* set = persistent->GetCollection();
-  for (int i = 0; i < 10000; ++i) {
-    set->insert(MakeGarbageCollected<IntegerObject>(i));
-  }
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      set->erase(set->begin());
-    }
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  RemoveFromCollection<HeapHashSet<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, SwapHashSets) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using Set = HeapHashSet<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<Set>> persistent =
-      MakeGarbageCollected<CollectionWrapper<Set>>();
-  Set* set = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    Set new_set;
-    for (int j = 0; j < 10 * i; ++j) {
-      new_set.insert(MakeGarbageCollected<IntegerObject>(j));
-    }
-    driver.SingleConcurrentStep();
-    set->swap(new_set);
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  SwapCollections<HeapHashSet<Member<IntegerObject>>>();
 }
 
-TEST_F(ConcurrentMarkingTest, AddToVector) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using V = HeapVector<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<V>> persistent =
-      MakeGarbageCollected<CollectionWrapper<V>>();
-  V* vector = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      int num = 100 * i + j;
-      vector->push_back(MakeGarbageCollected<IntegerObject>(num));
-    }
+// HeapLinkedHashSet
+template <typename T>
+class HeapLinkedHashSetAdapter : public HeapLinkedHashSet<T> {
+ public:
+  ALWAYS_INLINE void swap(HeapLinkedHashSetAdapter<T>& other) {
+    HeapLinkedHashSet<T>::Swap(other);
   }
-  driver.FinishSteps();
-  driver.FinishGC();
+};
+
+TEST_F(ConcurrentMarkingTest, AddToLinkedHashSet) {
+  AddToCollection<HeapLinkedHashSetAdapter<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, RemoveFromLinkedHashSet) {
+  RemoveFromCollection<HeapLinkedHashSetAdapter<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, SwapLinkedHashSets) {
+  SwapCollections<HeapLinkedHashSetAdapter<Member<IntegerObject>>>();
+}
+
+// HeapListHashSet
+
+template <typename T>
+class HeapListHashSetAdapter : public HeapListHashSet<T> {
+ public:
+  ALWAYS_INLINE void swap(HeapListHashSetAdapter<T>& other) {
+    HeapListHashSet<T>::Swap(other);
+  }
+};
+
+TEST_F(ConcurrentMarkingTest, AddToListHashSet) {
+  AddToCollection<HeapListHashSetAdapter<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, RemoveFromListHashSet) {
+  RemoveFromCollection<HeapListHashSetAdapter<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, SwapListHashSets) {
+  SwapCollections<HeapListHashSetAdapter<Member<IntegerObject>>>();
+}
+
+// HeapHashCountedSet
+
+TEST_F(ConcurrentMarkingTest, AddToHashCountedSet) {
+  AddToCollection<HeapHashCountedSet<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, RemoveFromHashCountedSet) {
+  RemoveFromCollection<HeapHashCountedSet<Member<IntegerObject>>>();
+}
+
+TEST_F(ConcurrentMarkingTest, SwapHashCountedSets) {
+  SwapCollections<HeapHashCountedSet<Member<IntegerObject>>>();
+}
+
+// HeapVector
+
+template <typename T>
+class HeapVectorAdapter : public HeapVector<T> {
+ public:
+  template <typename U>
+  ALWAYS_INLINE void insert(U* u) {
+    HeapVector<T>::push_back(u);
+  }
+  ALWAYS_INLINE void erase(typename HeapVector<T>::iterator) {
+    HeapVector<T>::pop_back();
+  }
+};
+
+TEST_F(ConcurrentMarkingTest, AddToVector) {
+  AddToCollection<HeapVectorAdapter<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, RemoveFromVector) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using V = HeapVector<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<V>> persistent =
-      MakeGarbageCollected<CollectionWrapper<V>>();
-  V* vector = persistent->GetCollection();
-  for (int i = 0; i < 10000; ++i) {
-    vector->push_back(MakeGarbageCollected<IntegerObject>(i));
-  }
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      vector->pop_back();
-    }
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  RemoveFromCollection<HeapVectorAdapter<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, SwapVectors) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using V = HeapVector<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<V>> persistent =
-      MakeGarbageCollected<CollectionWrapper<V>>();
-  V* vector = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    V new_vector;
-    for (int j = 0; j < 10 * i; ++j) {
-      new_vector.push_back(MakeGarbageCollected<IntegerObject>(j));
-    }
-    driver.SingleConcurrentStep();
-    vector->swap(new_vector);
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  SwapCollections<HeapVectorAdapter<Member<IntegerObject>>>();
 }
 
-TEST_F(ConcurrentMarkingTest, AddToDeque) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using D = HeapDeque<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<D>> persistent =
-      MakeGarbageCollected<CollectionWrapper<D>>();
-  D* deque = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      int num = 100 * i + j;
-      deque->push_back(MakeGarbageCollected<IntegerObject>(num));
-    }
+// HeapDeque
+
+template <typename T>
+class HeapDequeAdapter : public HeapDeque<T> {
+ public:
+  template <typename U>
+  ALWAYS_INLINE void insert(U* u) {
+    HeapDeque<T>::push_back(u);
   }
-  driver.FinishSteps();
-  driver.FinishGC();
+  ALWAYS_INLINE void erase(typename HeapDeque<T>::iterator) {
+    HeapDeque<T>::pop_back();
+  }
+  ALWAYS_INLINE void swap(HeapDequeAdapter<T>& other) {
+    HeapDeque<T>::Swap(other);
+  }
+};
+
+TEST_F(ConcurrentMarkingTest, AddToDeque) {
+  AddToCollection<HeapDequeAdapter<Member<IntegerObject>>>();
 }
 
 TEST_F(ConcurrentMarkingTest, RemoveFromDeque) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using D = HeapDeque<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<D>> persistent =
-      MakeGarbageCollected<CollectionWrapper<D>>();
-  D* deque = persistent->GetCollection();
-  for (int i = 0; i < 10000; ++i) {
-    deque->push_back(MakeGarbageCollected<IntegerObject>(i));
-  }
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    driver.SingleConcurrentStep();
-    for (int j = 0; j < 100; ++j) {
-      deque->pop_back();
-    }
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+  RemoveFromCollection<HeapDequeAdapter<Member<IntegerObject>>>();
 }
 
-TEST_F(ConcurrentMarkingTest, SwapDeque) {
-  IncrementalMarkingTestDriver driver(ThreadState::Current());
-  using D = HeapDeque<Member<IntegerObject>>;
-  Persistent<CollectionWrapper<D>> persistent =
-      MakeGarbageCollected<CollectionWrapper<D>>();
-  D* deque = persistent->GetCollection();
-  driver.Start();
-  for (int i = 0; i < 100; ++i) {
-    D new_deque;
-    for (int j = 0; j < 10 * i; ++j) {
-      new_deque.push_back(MakeGarbageCollected<IntegerObject>(j));
-    }
-    driver.SingleConcurrentStep();
-    deque->Swap(new_deque);
-  }
-  driver.FinishSteps();
-  driver.FinishGC();
+TEST_F(ConcurrentMarkingTest, SwapDeques) {
+  SwapCollections<HeapDequeAdapter<Member<IntegerObject>>>();
 }
 
 }  // namespace concurrent_marking_test
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 870fc43..896e6ac 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -776,11 +776,6 @@
       name: "ForceTallerSelectPopup",
       status: {"ChromeOS": "stable"},
     },
-    // This is to communicate features::FormControlsRefresh from ui (and can be
-    // removed when the feature launches).
-    {
-      name: "FormControlsRefresh",
-    },
     {
       name: "FractionalMouseEvent",
     },
@@ -808,7 +803,7 @@
       name: "HrefTranslate",
       depends_on: ["TranslateService"],
       origin_trial_feature_name: "HrefTranslate",
-      status: "experimental",
+      status: "stable",
     },
     // TODO(937746): Web Components v0 is disabled by default, and will be
     // removed after M87.
@@ -1267,7 +1262,6 @@
     // This is to add an option to enable the Reveal button on password inputs while waiting ::reveal gets standardized.
     {
       name: "PasswordReveal",
-      depends_on: ["FormControlsRefresh"],
     },
     {
       name: "PaymentApp",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index 8e0af30..8932b97 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -1787,6 +1787,9 @@
   virtual_time_control_task_queue_ = nullptr;
   ApplyVirtualTimePolicy();
 
+  main_thread_only().initial_virtual_time = base::Time();
+  main_thread_only().initial_virtual_time_ticks = base::TimeTicks();
+
   // Reset the MetricsHelper because it gets confused by time going backwards.
   base::TimeTicks now = tick_clock()->NowTicks();
   main_thread_only().metrics_helper.ResetForTest(now);
diff --git a/third_party/blink/renderer/platform/testing/paint_test_configurations.h b/third_party/blink/renderer/platform/testing/paint_test_configurations.h
index 00b0da0..09780dc 100644
--- a/third_party/blink/renderer/platform/testing/paint_test_configurations.h
+++ b/third_party/blink/renderer/platform/testing/paint_test_configurations.h
@@ -14,8 +14,7 @@
 enum {
   kCompositeAfterPaint = 1 << 0,
   kUnderInvalidationChecking = 1 << 1,
-  kFastBorderRadius = 1 << 2,
-  kDoNotCompositeTrivial3D = 1 << 3,
+  kFastBorderRadius = 1 << 2
 };
 
 class PaintTestConfigurations
@@ -52,12 +51,6 @@
   INSTANTIATE_TEST_SUITE_P(All, test_class,             \
                            ::testing::Values(0, kCompositeAfterPaint))
 
-#define INSTANTIATE_DO_NOT_COMPOSITE_TRIVIAL_3D_P(test_class)              \
-  INSTANTIATE_TEST_SUITE_P(                                                \
-      All, test_class,                                                     \
-      ::testing::Values(0, kCompositeAfterPaint, kDoNotCompositeTrivial3D, \
-                        kCompositeAfterPaint | kDoNotCompositeTrivial3D))
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_PAINT_TEST_CONFIGURATIONS_H_
diff --git a/third_party/blink/renderer/platform/text/DEPS b/third_party/blink/renderer/platform/text/DEPS
index e6709d4f..4bbfe8d3 100644
--- a/third_party/blink/renderer/platform/text/DEPS
+++ b/third_party/blink/renderer/platform/text/DEPS
@@ -17,3 +17,9 @@
     "+third_party/blink/renderer/platform/weborigin",
     "+third_party/blink/renderer/platform/wtf",
 ]
+
+specific_include_rules = {
+  "(locale_mac\.mm|locale_icu\.cc|locale_win\.cc)": [
+    "+ui/base/ui_base_features.h",
+  ],
+}
diff --git a/third_party/blink/renderer/platform/text/locale_icu.cc b/third_party/blink/renderer/platform/text/locale_icu.cc
index 514931f..92fb99e0 100644
--- a/third_party/blink/renderer/platform/text/locale_icu.cc
+++ b/third_party/blink/renderer/platform/text/locale_icu.cc
@@ -42,6 +42,7 @@
 #include "third_party/blink/renderer/platform/wtf/date_math.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -249,7 +250,7 @@
                                          UCAL_FIRST_DAY_OF_WEEK) -
                        UCAL_SUNDAY;
 
-  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+  if (features::IsFormControlsRefreshEnabled()) {
     week_day_short_labels_ = CreateLabelVector(
         short_date_format_, UDAT_NARROW_WEEKDAYS, UCAL_SUNDAY, 7);
   } else {
diff --git a/third_party/blink/renderer/platform/text/locale_mac.mm b/third_party/blink/renderer/platform/text/locale_mac.mm
index 5f721423..c72f103f 100644
--- a/third_party/blink/renderer/platform/text/locale_mac.mm
+++ b/third_party/blink/renderer/platform/text/locale_mac.mm
@@ -41,6 +41,7 @@
 #include "third_party/blink/renderer/platform/web_test_support.h"
 #include "third_party/blink/renderer/platform/wtf/date_math.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -136,7 +137,7 @@
   if (!week_day_short_labels_.IsEmpty())
     return week_day_short_labels_;
   week_day_short_labels_.ReserveCapacity(7);
-  NSArray* array = RuntimeEnabledFeatures::FormControlsRefreshEnabled()
+  NSArray* array = features::IsFormControlsRefreshEnabled()
                        ? [ShortDateFormatter() veryShortWeekdaySymbols]
                        : [ShortDateFormatter() shortWeekdaySymbols];
   if ([array count] == 7) {
diff --git a/third_party/blink/renderer/platform/text/locale_win.cc b/third_party/blink/renderer/platform/text/locale_win.cc
index 2464478..3c86b593 100644
--- a/third_party/blink/renderer/platform/text/locale_win.cc
+++ b/third_party/blink/renderer/platform/text/locale_win.cc
@@ -45,6 +45,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "ui/base/ui_base_features.h"
 
 namespace blink {
 
@@ -304,7 +305,7 @@
       LOCALE_SSHORTESTDAYNAME6};
   week_day_short_labels_.ReserveCapacity(base::size(kTypes));
   for (unsigned i = 0; i < base::size(kTypes); ++i) {
-    if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    if (features::IsFormControlsRefreshEnabled()) {
       week_day_short_labels_.push_back(GetLocaleInfoString(kTypesRefresh[i]));
     } else {
       week_day_short_labels_.push_back(GetLocaleInfoString(kTypes[i]));
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
index 9c12afc..22202c3 100644
--- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
@@ -316,9 +316,10 @@
     impl_.Trace(visitor);
     // Should the underlying table be moved by GC, register a callback
     // that fixes up the interior pointers that the (Heap)LinkedHashSet keeps.
-    if (impl_.table_) {
+    auto* table = AsAtomicPtr(&impl_.table_)->load(std::memory_order_relaxed);
+    if (table) {
       Allocator::RegisterBackingStoreCallback(
-          visitor, impl_.table_,
+          visitor, table,
           NodeHashTraits::template MoveBackingCallback<ImplType>);
     }
   }
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index f4eef959..5f1d4ac 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -78,6 +78,7 @@
 crbug.com/457718 external/wpt/css/css-pseudo/marker-content-012.html [ Failure ]
 crbug.com/457718 external/wpt/css/css-pseudo/marker-content-015.html [ Failure ]
 crbug.com/457718 external/wpt/css/css-pseudo/marker-content-016.html [ Failure ]
+crbug.com/457718 external/wpt/css/css-pseudo/marker-content-017.html [ Failure ]
 crbug.com/1012289 external/wpt/css/css-pseudo/marker-unicode-bidi-default.html [ Failure ]
 crbug.com/1012289 external/wpt/css/css-pseudo/marker-unicode-bidi-normal.html [ Failure ]
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 93e9a21..4801c4cc 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1308,7 +1308,6 @@
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flex-align.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline-margins.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-overflow-auto.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/minimum-size-image.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/multiline-reverse-wrap-baseline.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/negative-overflow.html [ Failure ]
@@ -1340,8 +1339,6 @@
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-007.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-quirks-node.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/quirks-auto-block-size-with-percentage-item.html [ Pass Failure ]
-crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/scrollbars-auto.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/scrollbars.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/table-as-item-auto-min-width.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/hittest-overlapping-margin.html [ Failure ]
@@ -6079,8 +6076,8 @@
 crbug.com/1029489 http/tests/devtools/elements/elements-linkify-attributes.js [ Pass Failure ]
 crbug.com/1029826 http/tests/devtools/copy-network-request.js [ Pass Failure ]
 crbug.com/1029521 virtual/threaded/external/wpt/web-animations/timing-model/animations/updating-the-finished-state.html [ Pass Failure Timeout ]
-crbug.com/1030258 http/tests/devtools/components/cookie-parser.js [ Pass Failure ]
 crbug.com/1030258 http/tests/devtools/network/network-cookies-pane.js [ Pass Failure ]
+crbug.com/1019723 http/tests/devtools/network/waterfall-header-height-updates.js [ Pass Failure ]
 
 # Enable scroll-snap tests on impl thread
 # These are currently failing on Mac which needs more investigation, snap-scrolls-visual-viewport seems flaky
@@ -6150,3 +6147,7 @@
 # Sheriff 2019-12-30
 crbug.com/1037798 [ Mac ] virtual/gpu-rasterization/images/exif-orientation-image-document.html [ Pass Failure ]
 crbug.com/1038354 fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Pass Failure ]
+
+# Sheriff 2020-01-02
+crbug.com/1038656 [ Mac ] http/tests/devtools/coverage/coverage-view-unused.js [ Pass Failure ]
+crbug.com/1038656 [ Win ] http/tests/devtools/coverage/coverage-view-unused.js [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index a17e7aec..7f03997 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -117349,6 +117349,18 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [
+    [
+     "html/semantics/document-metadata/the-link-element/link-type-attribute.html",
+     [
+      [
+       "/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [
     [
      "html/semantics/document-metadata/the-link-element/stylesheet-change-href.html",
@@ -163719,6 +163731,9 @@
    "html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt": [
     []
    ],
+   "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [
+    []
+   ],
    "html/semantics/document-metadata/the-link-element/resources/bad.css": [
     []
    ],
@@ -219109,6 +219124,12 @@
      {}
     ]
    ],
+   "css/css-shadow-parts/style-sharing.html": [
+    [
+     "css/css-shadow-parts/style-sharing.html",
+     {}
+    ]
+   ],
    "css/css-shapes/animation/shape-image-threshold-interpolation.html": [
     [
      "css/css-shapes/animation/shape-image-threshold-interpolation.html",
@@ -321507,6 +321528,12 @@
      {}
     ]
    ],
+   "webrtc/RTCPeerConnection-close.html": [
+    [
+     "webrtc/RTCPeerConnection-close.html",
+     {}
+    ]
+   ],
    "webrtc/RTCPeerConnection-connectionState.https.html": [
     [
      "webrtc/RTCPeerConnection-connectionState.https.html",
@@ -401221,7 +401248,7 @@
    "reftest"
   ],
   "css/css-pseudo/marker-font-variant-numeric-default-ref.html": [
-   "3d10621121931859c15ec7552172c7a02fc1cceb",
+   "be932213b0f1657524df67788130c09f3602cf80",
    "reftest_node"
   ],
   "css/css-pseudo/marker-font-variant-numeric-default.html": [
@@ -401229,7 +401256,7 @@
    "reftest"
   ],
   "css/css-pseudo/marker-font-variant-numeric-normal-ref.html": [
-   "45ab55d14b86c7f4dc1fc510b1e213cc51bcc0c9",
+   "b730a24e55a46d307afc0fe41d4517d65e44046f",
    "reftest_node"
   ],
   "css/css-pseudo/marker-font-variant-numeric-normal.html": [
@@ -402468,6 +402495,10 @@
    "a7f17d9670b137995b0dfc6f43221e16b988376d",
    "testharness"
   ],
+  "css/css-shadow-parts/style-sharing.html": [
+   "4af1260b5e992af7816cdbe96056495a9ad7e216",
+   "testharness"
+  ],
   "css/css-shadow-parts/support/shadow-helper.js": [
    "94accd6b1f9b095fda0079f7b86b866d88ffee01",
    "support"
@@ -462841,7 +462872,7 @@
    "testharness"
   ],
   "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html": [
-   "5b155c1047da85d2bd8301effaa3ef9d9096b0ad",
+   "3000032978082356086930b2b5bee96b73947dc8",
    "testharness"
   ],
   "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-dim-ref.html": [
@@ -463324,6 +463355,14 @@
    "ae2efa415ee51e4b2b54df2f3f90965746b43ed3",
    "testharness"
   ],
+  "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [
+   "f32472105d543a456e1a5ea469f932b8d643c06d",
+   "support"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [
+   "80acb9f3dcc2d312fd8a8051b92e6e70ca343bb3",
+   "reftest"
+  ],
   "html/semantics/document-metadata/the-link-element/resources/bad.css": [
    "4e1fe36165c52792e3a3816962c36e6090f04f67",
    "support"
@@ -474681,23 +474720,23 @@
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini": [
-   "d97432ed39c5f161c4e6feeac5b954e63f17e73d",
+   "c7b3482c786fc4532488f388b802930ccea8dc0e",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini": [
-   "3adcbe6885645fbf3b8cb08e0133de836a3357f0",
+   "68ccafcec2a1dd55184d234071c809ce1fcc73d8",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini": [
-   "d01525b3cfa16083b00a07060935fe93450028fa",
+   "5d714dd77733edd0199535f0f1cb20a46237d6dd",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini": [
-   "a87d9f936fdbf5a9d1ac97352ee1417a06bc678a",
+   "40626b8193ecc99e3e5ec5fe181f5553bfd8473a",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini": [
-   "fe1bf469f4f07575469878ccfb9bedcad32fdca8",
+   "4f1939a431ae272024f62a4169bf8431efc2c5bb",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/pause.html.ini": [
@@ -519977,7 +520016,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/testloader.py": [
-   "f16cc14ceada70f781a2aaabb1c2f547cb9d61d1",
+   "8fcf66d64ed9cec5979ae2ef3b02320d5782b818",
    "support"
   ],
   "tools/wptrunner/wptrunner/testrunner.py": [
@@ -520121,7 +520160,7 @@
    "support"
   ],
   "tools/wptserve/wptserve/handlers.py": [
-   "ca5118009cfc9c4763f99e2a6296d784a6539216",
+   "efc1a16a93225d033574a22f7ba81e7d3d50bfd9",
    "support"
   ],
   "tools/wptserve/wptserve/logger.py": [
@@ -520129,7 +520168,7 @@
    "support"
   ],
   "tools/wptserve/wptserve/pipes.py": [
-   "ceb34cc3f4f994ed049915c7784f7c69c712abca",
+   "e5d6e1c96db9c18020ed2b8aee23d41dd503509a",
    "support"
   ],
   "tools/wptserve/wptserve/ranges.py": [
@@ -529172,6 +529211,10 @@
    "09ad67751a73a6482415a6ff6c2dac70e049c82c",
    "testharness"
   ],
+  "webrtc/RTCPeerConnection-close.html": [
+   "74f816bf3fc0c8970582216e82e9eedc3227def1",
+   "testharness"
+  ],
   "webrtc/RTCPeerConnection-connectionState.https.html": [
    "9ed5808727a6a293eedc705f40abdc7dc62f8eb4",
    "testharness"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017-ref.html
new file mode 100644
index 0000000..9628123
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<style>
+img {
+  display: list-item;
+  list-style-type: "[marker]";
+}
+img.inside {
+  list-style-position: inside;
+}
+</style>
+<ol>
+  <img src="about:invalid" alt="alt" class="inside" />
+  <img src="about:invalid" alt="alt" />
+  <li value="3">item</li>
+</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017.html
new file mode 100644
index 0000000..267e519f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-content-017.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="match" href="marker-content-017-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<link rel="help" href="https://drafts.csswg.org/css-lists/#declaring-a-list-item">
+<meta name="assert" content="Checks that ::marker can be created inside a non-replaced <img>.">
+<style>
+img {
+  display: list-item;
+}
+img.inside {
+  list-style-position: inside;
+}
+img::marker {
+  content: '[marker]';
+}
+</style>
+<ol>
+  <img src="about:invalid" alt="alt" class="inside" />
+  <img src="about:invalid" alt="alt" />
+  <li>item</li>
+</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-default-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-default-ref.html
index 3d10621..be932213 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-default-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-default-ref.html
@@ -3,6 +3,7 @@
 <title>CSS Reftest Reference</title>
 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
 <link rel="mismatch" href="marker-font-variant-numeric-normal-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 @font-face {
   /* This font looks different with 'font-variant-numeric: tabular-nums' */
@@ -17,19 +18,13 @@
   list-style-position: inside;
   font-family: "Exo 2";
 }
-span {
-  display: inline-block;
-  vertical-align: top;
-}
-li:first-child::before {
-  content: '\200B'; /* zero-width space */
-}
 li:first-child::after {
-  content: '';
-  position: absolute;
-  height: 225px;
+  content: 'X X X X X X X X X';
+  display: inline-block;
+  font: 25px/1 Ahem;
+  vertical-align: top;
+  height: 0;
   width: 25px;
-  background: black;
 }
 </style>
 <ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-normal-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
index 45ab55d..b730a24 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
@@ -3,6 +3,7 @@
 <title>CSS Reftest Reference</title>
 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
 <link rel="mismatch" href="marker-font-variant-numeric-default-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 @font-face {
   /* This font looks different with 'font-variant-numeric: tabular-nums' */
@@ -19,10 +20,10 @@
 }
 span {
   display: inline-block;
+  font: 25px/1 Ahem;
   vertical-align: top;
   width: 25px;
   height: 25px;
-  background: black;
 }
 </style>
 <ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/style-sharing.html b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/style-sharing.html
new file mode 100644
index 0000000..4af1260b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/style-sharing.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<title>CSS Shadow Parts test: Parts don't incorrectly share style with other elements</title>
+<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org/" title="Mozilla">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>::part(part1) { color: green; }</style>
+<div id="host"></div>
+<script>
+"use strict";
+test(function() {
+  host.attachShadow({ mode: "open" }).innerHTML = `
+    <div></div>
+    <div part="part1"></div>
+  `;
+  assert_equals(
+    getComputedStyle(host.shadowRoot.querySelector("[part]")).color,
+    "rgb(0, 128, 0)",
+    "Part should be green",
+  );
+}, "Part in selected host does not incorrectly share style with non-part");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html b/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html
new file mode 100644
index 0000000..98de2b68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>DOM Test Reference</title>
+<p>You should see the word PASS below.</p>
+<div>PASS</div>
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html b/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html
new file mode 100644
index 0000000..612aed6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html class="reftest-wait">
+  <head>
+    <title>Adopting a shadow host child into an iframe</title>
+    <link rel="help" href="https://dom.spec.whatwg.org/#concept-node-adopt">
+    <link rel="match" href="remove-from-shadow-host-and-adopt-into-iframe-ref.html">
+    <style>
+      iframe { border: 0; }
+    </style>
+    <script src="/common/reftest-wait.js"></script>
+    <script>
+      onload = () => {
+        const root = host.attachShadow({mode:"open"});
+        root.innerHTML = "<slot>";
+        // force a layout
+        host.offsetTop;
+        iframe.contentWindow.document.body.style.margin = 0;
+        iframe.contentWindow.document.body.appendChild(adopted);
+        host.remove();
+        takeScreenshot();
+      }
+    </script>
+  </head>
+  <body>
+    <p>You should see the word PASS below.</p>
+    <iframe id="iframe"></iframe>
+    <div id="host"><span id="adopted">PASS</span></div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html b/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
index 5b155c1..3000032 100644
--- a/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
@@ -12,6 +12,8 @@
 <img src="/images/green.png">
 <img src="/images/green.png" width=100 height=125>
 <img src="" width=100 height=125>
+<img src="error.png" width=100 height=125>
+<img src="error.png">
 <script>
 let t = async_test("Image width and height attributes are used to infer aspect-ratio");
 function assert_ratio(img, expected) {
@@ -47,9 +49,10 @@
 
 onload = t.step_func_done(function() {
   let images = document.querySelectorAll("img");
-  assert_ratio(images[3], 1.266); // 1.266 is the original aspect ratio of blue.png
-  assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src.
-  assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png
   assert_ratio(images[0], 2.0); // Loaded image's aspect ratio, at least by default, overrides width / height ratio.
+  assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png
+  assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src.
+  assert_equals(getComputedStyle(images[3]).height, getComputedStyle(images[4]).height); // aspect-ratio doesn't override intrinsic size of error images.
+  assert_ratio(images[5], 1.266); // 1.266 is the original aspect ratio of blue.png
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html
new file mode 100644
index 0000000..f3247210
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<p>You should see a green rectangle below</p>
+<div style="width:100px;height:100px;background-color:green"></div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute.html b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute.html
new file mode 100644
index 0000000..80acb9f3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-link-element/link-type-attribute.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel=match href=link-type-attribute-ref.html>
+<link rel="stylesheet" type="application/javascript" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="ABCtext/css" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="text/cssDEF" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="text/invalid" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="invalid" href="data:text/css,div { background-color: red !important; }">
+<p>You should see a green rectangle below</p>
+<div style="width:100px;height:100px;background-color:green"></div>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
index d97432e..c7b3482 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
@@ -1,5 +1,3 @@
 [multiTouchPoints.html]
-  disabled:
-    if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838
   expected:
     if product == "firefox" or product == "safari" or product == "epiphany" or product == "webkit": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
index 3adcbe68..68ccafc 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
@@ -1,5 +1,3 @@
 [multiTouchPointsReleaseFirstPoint.html]
-  disabled:
-    if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
   expected:
     if product == "firefox" or product == "safari": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
index d01525b3c..5d714dd7 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
@@ -1,5 +1,3 @@
 [multiTouchPointsReleaseSecondPoint.html]
-  disabled:
-    if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
   expected:
     if product == "firefox" or product == "safari": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
index a87d9f9..40626b819 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
@@ -1,5 +1,3 @@
 [multiTouchPointsTwoTouchStarts.html]
-  disabled:
-    if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838
-  expected:
-    if product == "firefox" or product == "safari": ERROR
+   expected:
+     if product == "firefox" or product == "safari": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
index fe1bf46..4f1939a4 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
@@ -1,5 +1,3 @@
 [multiTouchPointsWithPause.html]
-  disabled:
-    if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
   expected:
     if product == "firefox" or product == "safari": ERROR
diff --git a/third_party/blink/web_tests/external/wpt/portals/predecessor-fires-unload.html b/third_party/blink/web_tests/external/wpt/portals/predecessor-fires-unload.html
new file mode 100644
index 0000000..6512195
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/portals/predecessor-fires-unload.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/open-blank-host.js"></script>
+<script>
+function nextEvent(target, type) {
+  return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true}));
+}
+
+function timePasses(delay) {
+  return new Promise((resolve, reject) => step_timeout(() => resolve(), delay));
+}
+
+promise_test(async () => {
+  const w = await openBlankPortalHost();
+  try {
+    const portal = w.document.createElement('portal');
+    portal.src = new URL('resources/simple-portal.html', location.href);
+    w.document.body.appendChild(portal);
+    const pagehideFired = nextEvent(w, 'pagehide');
+    const unloadFired = nextEvent(w, 'unload');
+    await portal.activate();
+    assert_true((await pagehideFired) instanceof w.PageTransitionEvent);
+    assert_true((await unloadFired) instanceof w.Event);
+  } finally {
+    w.close();
+  }
+}, "pagehide and unload should fire if the predecessor is not adopted");
+
+promise_test(async () => {
+  localStorage.setItem('predecessor-fires-unload-events', '');
+  window.open('resources/predecessor-fires-unload-watch-unload.html', '_blank', 'noopener');
+  while (localStorage.getItem('predecessor-fires-unload-events') != 'pagehide unload') {
+    await timePasses(50);
+  }
+}, "pagehide and unload should fire if the predecessor is not adopted, even without a window/opener association");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/portals/resources/predecessor-fires-unload-watch-unload.html b/third_party/blink/web_tests/external/wpt/portals/resources/predecessor-fires-unload-watch-unload.html
new file mode 100644
index 0000000..ada5a64
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/portals/resources/predecessor-fires-unload-watch-unload.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<body>
+<script>
+function nextEvent(target, type) {
+  return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true}));
+}
+
+onload = function() {
+  const portal = document.createElement('portal');
+  portal.src = new URL('simple-portal.html', location.href);
+  document.body.appendChild(portal);
+
+  let firedEvents = [];
+  for (let type of ['pagehide', 'unload']) {
+    nextEvent(window, type).then(() => {
+      firedEvents.push(type);
+      localStorage.setItem('predecessor-fires-unload-events', firedEvents.join(' '));
+    });
+  }
+
+  portal.activate();
+}
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
index f16cc14..8fcf66d6 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
@@ -5,7 +5,7 @@
 from six.moves.queue import Empty
 from collections import defaultdict, deque
 from multiprocessing import Queue
-from six import iteritems
+from six import ensure_binary, iteritems
 from six.moves import xrange
 
 from . import manifestinclude
@@ -51,7 +51,7 @@
     def __call__(self, manifest):
         chunk_index = self.chunk_number - 1
         for test_type, test_path, tests in manifest:
-            h = int(hashlib.md5(test_path).hexdigest(), 16)
+            h = int(hashlib.md5(ensure_binary(test_path)).hexdigest(), 16)
             if h % self.total_chunks == chunk_index:
                 yield test_type, test_path, tests
 
@@ -65,7 +65,7 @@
     def __call__(self, manifest):
         chunk_index = self.chunk_number - 1
         for test_type, test_path, tests in manifest:
-            h = int(hashlib.md5(os.path.dirname(test_path)).hexdigest(), 16)
+            h = int(hashlib.md5(ensure_binary(os.path.dirname(test_path))).hexdigest(), 16)
             if h % self.total_chunks == chunk_index:
                 yield test_type, test_path, tests
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/handlers.py b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/handlers.py
index ca511800..efc1a16a 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/handlers.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/handlers.py
@@ -1,4 +1,7 @@
-import cgi
+try:
+    import html
+except ImportError:
+    import cgi as html
 import json
 import os
 import sys
@@ -76,7 +79,7 @@
 <ul>
 %(items)s
 </ul>
-""" % {"path": cgi.escape(url_path),
+""" % {"path": html.escape(url_path),
        "items": "\n".join(self.list_items(url_path, path))}  # noqa: E122
 
     def list_items(self, base_path, path):
@@ -93,14 +96,14 @@
             yield ("""<li class="dir"><a href="%(link)s">%(name)s</a></li>""" %
                    {"link": link, "name": ".."})
         for item in sorted(os.listdir(path)):
-            link = cgi.escape(quote(item))
+            link = html.escape(quote(item))
             if os.path.isdir(os.path.join(path, item)):
                 link += "/"
                 class_ = "dir"
             else:
                 class_ = "file"
             yield ("""<li class="%(class)s"><a href="%(link)s">%(name)s</a></li>""" %
-                   {"link": link, "name": cgi.escape(item), "class": class_})
+                   {"link": link, "name": html.escape(item), "class": class_})
 
 
 def wrap_pipeline(path, request, response):
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/pipes.py b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/pipes.py
index ceb34cc..e5d6e1c 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/pipes.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/pipes.py
@@ -1,4 +1,7 @@
-from cgi import escape
+try:
+    from html import escape
+except ImportError:
+    from cgi import escape
 from collections import deque
 import base64
 import gzip as gzip_module
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-close.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-close.html
index 13215d7..9f43dc93 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-close.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-close.html
@@ -42,13 +42,34 @@
   let pc1 = new RTCPeerConnection();
   t.add_cleanup(() => pc1.close());
   let [channel1, channel2] = await createDataChannelPair(pc1);
+  let events = [];
+  let error = null;
   let close_handler = new Promise(resolve => {
     channel2.addEventListener('close', event => {
+      events.push('close');
+      resolve();
+    });
+  });
+  let error_handler = new Promise((resolve, reject) => {
+    channel2.addEventListener('error', event => {
+      events.push('error');
+      try {
+        assert_true(event instanceof RTCErrorEvent);
+        error = event.error;
+      } catch (e) {
+        // Prevent test from hanging when an assert in the error handler fails.
+        reject('Error event wrong: ' + e);
+      }
       resolve();
     });
   });
   pc1.close();
+  await error_handler;
   await close_handler;
-}, 'Close peerconnection causes close event to be called');
+  // Error should fire before close.
+  assert_array_equals(['error', 'close'], events);
+  assert_true(error instanceof RTCError);
+  assert_equals(error.name, 'OperationError');
+}, 'Close peerconnection causes close event and error to be called');
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCError.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCError.html
index 4d07260..9c722752 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCError.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCError.html
@@ -35,8 +35,8 @@
 
 test(() => {
   const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
-  assert_equals(error.name, 'RTCError');
-}, 'RTCError.name is \'RTCError\'');
+  assert_equals(error.name, 'OperationError');
+}, 'RTCError.name is \'OperationError\'');
 
 test(() => {
   const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-close.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-close.html
new file mode 100644
index 0000000..74f816bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-close.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.close</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+  promise_test(async t => {
+    const pc = new RTCPeerConnection();
+    t.add_cleanup(() => pc.close());
+
+    pc.onsignalingstatechange = t.unreached_func();
+    pc.close();
+    assert_true(pc.signalingState === 'closed');
+    await new Promise(r => t.step_timeout(r, 100));
+  }, 'RTCPeerConnection.close() does not fire signalingstatechange event.');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html
index 9ed5808..a054a1e8 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-connectionState.https.html
@@ -270,4 +270,22 @@
 
     assert_array_equals(states, ['connecting', 'connected']);
   }, 'connectionState transitions to connected via connecting');
+
+  promise_test(async t => {
+    const pc1 = new RTCPeerConnection();
+    t.add_cleanup(() => pc1.close());
+    const pc2 = new RTCPeerConnection();
+    const stream = await getNoiseStream({ audio: true });
+    t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+
+    stream.getTracks().forEach(track => pc1.addTrack(track, stream));
+    exchangeIceCandidates(pc1, pc2);
+    doSignalingHandshake(pc1, pc2);
+    await listenToIceConnected(pc2);
+
+    pc2.onconnectionstatechange = t.unreached_func();
+    pc2.close();
+    assert_true(pc2.connectionState === 'closed');
+    await new Promise(r => t.step_timeout(r, 100));
+  }, 'Closing a PeerConnection should not fire connectionstatechange event');
 </script>
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events-expected.txt b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events-expected.txt
deleted file mode 100644
index 68c29ba..0000000
--- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Tests that RTCPeerConnection event callbacks are async so that for example close can be called safely. The order of the messages is very important.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-PASS gotStream was called.
-PASS gotStream done.
-PASS onNegotiationNeeded was called.
-PASS onNegotiationNeeded done.
-PASS onStateChange was called.
-PASS pc.signalingState is 'closed'
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events.html b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events.html
deleted file mode 100644
index 554681ed..0000000
--- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-events.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src="../../resources/js-test.js"></script>
-</head>
-<body>
-<script>
-description("Tests that RTCPeerConnection event callbacks are async so that for example close can be called safely. The order of the messages is very important.");
-
-var stream = null;
-var pc = null;
-
-function error() {
-    testFailed('Stream generation failed.');
-    finishJSTest();
-}
-
-function getUserMedia(dictionary, callback) {
-    try {
-        navigator.webkitGetUserMedia(dictionary, callback, error);
-    } catch (e) {
-        testFailed('webkitGetUserMedia threw exception :' + e);
-        finishJSTest();
-    }
-}
-
-function onStateChange(event) {
-    testPassed('onStateChange was called.');
-    shouldBe("pc.signalingState", "'closed'");
-    finishJSTest();
-}
-
-function onNegotiationNeeded(event) {
-    testPassed('onNegotiationNeeded was called.');
-    pc.onsignalingstatechange = onStateChange;
-    pc.onnegotiationneeded = onNegotiationNeededAgain;
-    pc.close();
-    testPassed('onNegotiationNeeded done.')
-}
-
-function onNegotiationNeededAgain(event) {
-    testFailed('onNegotiationNeededAgain should never be called.');
-}
-
-function gotStream(s) {
-    testPassed('gotStream was called.');
-    stream = s;
-
-    pc = new RTCPeerConnection();
-    pc.onnegotiationneeded = onNegotiationNeeded;
-
-    pc.addStream(stream);
-    testPassed('gotStream done.');
-}
-
-getUserMedia({audio:true, video:true}, gotStream);
-
-window.jsTestIsAsync = true;
-window.successfullyParsed = true;
-
-
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-state.html b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-state.html
deleted file mode 100644
index 5f5d7d8..0000000
--- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-state.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>RTCPeerConnection signalingState</title>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-</head>
-<body>
-<script>
-
-async_test(function(test) {
-  var pc = new RTCPeerConnection();
-  assert_equals(pc.signalingState, 'stable');
-  pc.onsignalingstatechange = test.step_func(() => {
-    assert_equals(pc.signalingState, 'closed');
-    test.done();
-  });
-  pc.close();
-}, 'Tests the RTCPeerConnection "stable" and "closed" signalingState strings.');
-
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test-expected.txt
new file mode 100644
index 0000000..355cade
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test-expected.txt
@@ -0,0 +1,4 @@
+Tests accessibility of WebSQL console in application panel.
+aXe violations: []
+
+
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test.js
new file mode 100644
index 0000000..0827dc5e
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/application-panel/websql-console-a11y-test.js
@@ -0,0 +1,36 @@
+// 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 of WebSQL console in application panel.`);
+  await TestRunner.loadModule('axe_core_test_runner');
+  await TestRunner.loadModule('application_test_runner');
+  // Note: every test that uses a storage API must manually clean-up state from previous tests.
+  await ApplicationTestRunner.resetState();
+
+  await TestRunner.showPanel('resources');
+
+  async function setPromptText(text) {
+    queryView._prompt.setText(text);
+    await queryView._enterKeyPressed(new KeyboardEvent('keydown'));
+  }
+
+  UI.viewManager.showView('resources');
+  await TestRunner.evaluateInPagePromise(
+    'openDatabase("inspector-test-db", "1.0", "Database for inspector test", 1024*1024)');
+
+  const parent = UI.panels.resources._sidebar._sidebarTree.rootElement();
+  const databaseElement = ApplicationTestRunner.findTreeElement(parent, ['Storage', 'Web SQL', 'inspector-test-db']);
+  databaseElement.select();
+
+  const queryView = UI.panels.resources.visibleView;
+
+  await setPromptText('CREATE TABLE table1 (id INTEGER PRIMARY KEY ASC, text_field TEXT)');
+  await setPromptText('INSERT INTO table1 (id, text_field) VALUES (1, "foobar")');
+  await setPromptText('SELECT * FROM table1');
+  await setPromptText('invalid input');
+
+  await AxeCoreTestRunner.runValidation(queryView.element);
+  TestRunner.completeTest();
+})();
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test-expected.txt
deleted file mode 100644
index 635e0514..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-Tests accessibility in the Search drawer devtool using the axe-core linter.
-
-Running: testSearchNoResults
-Testing search tool with no results.
-aXe violations: []
-
-
-Running: testSearchMultipleResults
-Testing search tool with multiple results.
-aXe violations: []
-
-
-Running: testSearchShowMoreResults
-Testing search tool with many results (generates "Show more" button).
-aXe violations: []
-
-
-Running: testSearchMultipleHighlightedResults
-Testing search tool with multiple highlighted results.
-aXe violations: []
-
-
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test.js
deleted file mode 100644
index 4c89905..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/search/search-a11y-test.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.cd
-// 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 the Search drawer devtool using the axe-core linter.');
-  await TestRunner.loadModule('axe_core_test_runner');
-  await TestRunner.showPanel('sources');
-  const view = 'sources.search-sources-tab';
-  await UI.viewManager.showView(view);
-  const searchView = await UI.viewManager.view(view).widget();
-
-  const tests = [
-    testSearchNoResults,
-    testSearchMultipleResults,
-    testSearchShowMoreResults,
-    testSearchMultipleHighlightedResults
-  ];
-
-  async function testSearchNoResults() {
-    TestRunner.addResult('Testing search tool with no results.');
-    searchView._nothingFound();
-    await AxeCoreTestRunner.runValidation(searchView.element);
-  }
-
-  async function testSearchMultipleResults() {
-    TestRunner.addResult('Testing search tool with multiple results.');
-    const searchMatches = [
-      new Common.ContentProvider.SearchMatch(1, 'elle'),
-      new Common.ContentProvider.SearchMatch(2, 'letter'),
-      new Common.ContentProvider.SearchMatch(3, 'couple'),
-      new Common.ContentProvider.SearchMatch(4, 'mole'),
-      new Common.ContentProvider.SearchMatch(5, 'tolerate'),
-      new Common.ContentProvider.SearchMatch(6, 'personable')
-    ];
-    await runTestValidation(searchMatches, 'le');
-  }
-
-  async function testSearchShowMoreResults() {
-    TestRunner.addResult('Testing search tool with many results (generates "Show more" button).');
-    const searchMatches = [
-      new Common.ContentProvider.SearchMatch(1, 'jump'),
-      new Common.ContentProvider.SearchMatch(2, 'maze'),
-      new Common.ContentProvider.SearchMatch(3, 'zoom'),
-      new Common.ContentProvider.SearchMatch(4, 'minx'),
-      new Common.ContentProvider.SearchMatch(5, 'mux'),
-      new Common.ContentProvider.SearchMatch(6, 'comics'),
-      new Common.ContentProvider.SearchMatch(7, 'jimmy'),
-      new Common.ContentProvider.SearchMatch(8, 'jumps'),
-      new Common.ContentProvider.SearchMatch(9, 'bumpy'),
-      new Common.ContentProvider.SearchMatch(10, 'major'),
-      new Common.ContentProvider.SearchMatch(11, 'menace'),
-      new Common.ContentProvider.SearchMatch(12, 'mom'),
-      new Common.ContentProvider.SearchMatch(13, 'animal'),
-      new Common.ContentProvider.SearchMatch(14, 'ham'),
-      new Common.ContentProvider.SearchMatch(15, 'tame'),
-      new Common.ContentProvider.SearchMatch(16, 'pygmy'),
-      new Common.ContentProvider.SearchMatch(17, 'blimp'),
-      new Common.ContentProvider.SearchMatch(18, 'dummy'),
-      new Common.ContentProvider.SearchMatch(19, 'mumsy'),
-      new Common.ContentProvider.SearchMatch(20, 'milch'),
-      new Common.ContentProvider.SearchMatch(21, 'femme'),
-      new Common.ContentProvider.SearchMatch(22, 'grump'),
-      new Common.ContentProvider.SearchMatch(23, 'cramp'),
-      new Common.ContentProvider.SearchMatch(24, 'lumps'),
-      new Common.ContentProvider.SearchMatch(25, 'mumus'),
-      new Common.ContentProvider.SearchMatch(26, 'skelm')
-    ];
-    await runTestValidation(searchMatches, 'm');
-  }
-
-  async function testSearchMultipleHighlightedResults() {
-    TestRunner.addResult('Testing search tool with multiple highlighted results.');
-    const searchMatches = [
-      new Common.ContentProvider.SearchMatch(1, 'test      test'),
-      new Common.ContentProvider.SearchMatch(2, 'testaaaaaaaaaaaaatest'),
-      new Common.ContentProvider.SearchMatch(3, 'test      test'),
-      new Common.ContentProvider.SearchMatch(4, 'g test'),
-    ];
-    await runTestValidation(searchMatches, 'test');
-  }
-
-  async function runTestValidation(searchMatches, queryText) {
-    const uiSourceCode = new Workspace.UISourceCode(/* project */ null, 'test', /* contentType */ null);
-    uiSourceCode.fullDisplayName = function() {return 'test';};
-    const searchResult = new Sources.FileBasedSearchResult(uiSourceCode, searchMatches);
-    const searchConfig = new Search.SearchConfig(queryText, /* ignoreCase */ true, /* isRegex */ false);
-    const searchResultsPane = new Search.SearchResultsPane(searchConfig);
-    searchResultsPane.addSearchResult(searchResult);
-    searchView._showPane(searchResultsPane);
-    await AxeCoreTestRunner.runValidation(searchView.element);
-  }
-
-  TestRunner.runAsyncTestSuite(tests);
-})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
index 3e2750a..67799797 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
@@ -29,16 +29,6 @@
     dump(UI.panels.resources._sidebar._sidebarTree.rootElement(), '');
   }
 
-  function findTreeElement(parent, path) {
-    if (path.length === 0)
-      return parent;
-    var child = parent.children().find(child => child.title === path[0]);
-    if (!child)
-      return null;
-    child.expand();
-    return findTreeElement(child, path.slice(1));
-  }
-
   async function createTable(queryView) {
     queryView._prompt.setText('CREATE TABLE table1 (id INTEGER PRIMARY KEY ASC, text_field TEXT)');
     queryView._enterKeyPressed(new KeyboardEvent('keydown'));
@@ -52,7 +42,7 @@
       'openDatabase("inspector-test-db", "1.0", "Database for inspector test", 1024*1024)');
 
   var parent = UI.panels.resources._sidebar._sidebarTree.rootElement();
-  var databaseElement = findTreeElement(parent, ['Storage', 'Web SQL', 'inspector-test-db']);
+  var databaseElement = ApplicationTestRunner.findTreeElement(parent, ['Storage', 'Web SQL', 'inspector-test-db']);
 
   TestRunner.addResult('Found: ' + !!databaseElement);
 
@@ -69,7 +59,7 @@
   }
 
   await createTable(queryView);
-  while (!findTreeElement(databaseElement, ['table1'])) {
+  while (!ApplicationTestRunner.findTreeElement(databaseElement, ['table1'])) {
     databaseElement.expand();
     await new Promise(resolve => setTimeout(resolve));
   }
diff --git a/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser-expected.txt b/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser-expected.txt
index 87f0c46..4a4f538 100644
--- a/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser-expected.txt
@@ -1,159 +1,63 @@
 Tests inspector cookie parser
 
 source: cookie=value
-name: cookie, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 12
-{
-}
+name: cookie, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 12, priority: Medium
 source: $version=1; a=b,c  =   d, e=f
-name: a, value: b,c  =   d, e=f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 17
-{
-}
+name: a, value: b,c  =   d, e=f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 17, priority: Medium
 source: $version=1; a=b;c  =   d; e =f
-name: a, value: b, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 4
-{
-}
-name: c, value: d, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 10
-{
-}
-name: e, value: f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 4
-{
-}
+name: a, value: b, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 4, priority: Medium
+name: c, value: d, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 10, priority: Medium
+name: e, value: f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 4, priority: Medium
 source: cooke1 = value1; another cookie = another value
-name: cooke1, value: value1, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 25
-{
-}
-name: cookie, value: another value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 22
-{
-}
+name: cooke1, value: value1, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 25, priority: Medium
+name: cookie, value: another value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 22, priority: Medium
 source: cooke1 = value; $Path=/; $Domain=.example.com;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 46
-{
-    domain : ".example.com"
-    path : "/"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 46, priority: Medium
 source: cooke1 = value; $Path=/; $Domain=.example.com ; Cookie2 = value2; $Path = /foo; $DOMAIN = foo.example.com;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 48
-{
-    domain : ".example.com"
-    path : "/"
-}
-name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 58
-{
-    domain : "foo.example.com"
-    path : "/foo"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 48, priority: Medium
+name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 58, priority: Medium
 source: cooke1 = value; $Path=/; $Domain=.example.com
 Cookie2 = value2; $Path = /foo; $DOMAIN = foo.example.com; 
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 46
-{
-    domain : ".example.com"
-    path : "/"
-}
-name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 59
-{
-    domain : "foo.example.com"
-    path : "/foo"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 46, priority: Medium
+name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 59, priority: Medium
 source: $version =1; cooke1 = value; $Path=/; $Domain   =.example.com;  
  Cookie2 = value2; $Path = /foo; $DOMAIN = foo.example.com;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 53
-{
-    domain : ".example.com"
-    path : "/"
-}
-name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 58
-{
-    domain : "foo.example.com"
-    path : "/foo"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 53, priority: Medium
+name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 58, priority: Medium
 source: cookie=value
-name: cookie, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 12
-{
-}
+name: cookie, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 12, priority: Medium
 source: a=b
  c=d
  f
-name: a, value: b, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 5
-{
-}
-name: c, value: d, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 5
-{
-}
-name: , value: f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 1
-{
-}
+name: a, value: b, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 5, priority: Medium
+name: c, value: d, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 5, priority: Medium
+name: , value: f, httpOnly: false, sameSite: undefined, secure: false, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 1, priority: Medium
 source: cooke1 = value; Path=/; Domain=.example.com;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 44
-{
-    domain : ".example.com"
-    path : "/"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 44, priority: Medium
 source: cooke1 = value; Path=/; Domain=  .example.com 
 Cookie2 = value2; Path = /foo; Domain = foo.example.com
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 47
-{
-    domain : ".example.com"
-    path : "/"
-}
-name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 55
-{
-    domain : "foo.example.com"
-    path : "/foo"
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 47, priority: Medium
+name: Cookie2, value: value2, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 55, priority: Medium
 source: cooke1 = value; expires = Mon, Oct 18 2010 17:00 GMT+0000; Domain   =.example.com
 Cookie2 = value2; Path = /foo; DOMAIN = foo.example.com; HttpOnly; Secure; Discard;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: false, path: undefined, domain: .example.com, port: undefined, expires: 1287421200000, size: 82
-{
-    domain : ".example.com"
-    expires : "Mon, Oct 18 2010 17:00 GMT+0000"
-}
-name: Cookie2, value: value2, httpOnly: true, sameSite: undefined, secure: true, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 83
-{
-    discard : undefined
-    domain : "foo.example.com"
-    httponly : undefined
-    path : "/foo"
-    secure : undefined
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: false, path: undefined, domain: .example.com, port: undefined, expires: 1287421200000, size: 82, priority: Medium
+name: Cookie2, value: value2, httpOnly: true, sameSite: undefined, secure: true, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 83, priority: Medium
 source: cooke1 = value; max-age= 1440; Domain   =.example.com
  Cookie2 = value2; Path = /foo; DOMAIN = foo.example.com; HttpOnly; Secure; Discard;
-name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: false, path: undefined, domain: .example.com, port: undefined, expires: 1287422640000, size: 55
-{
-    domain : ".example.com"
-    max-age : "1440"
-}
-name: Cookie2, value: value2, httpOnly: true, sameSite: undefined, secure: true, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 83
-{
-    discard : undefined
-    domain : "foo.example.com"
-    httponly : undefined
-    path : "/foo"
-    secure : undefined
-}
+name: cooke1, value: value, httpOnly: false, sameSite: undefined, secure: false, session: false, path: undefined, domain: .example.com, port: undefined, expires: 1287422640000, size: 55, priority: Medium
+name: Cookie2, value: value2, httpOnly: true, sameSite: undefined, secure: true, session: true, path: /foo, domain: foo.example.com, port: undefined, expires: n/a, size: 83, priority: Medium
 source: cooke1 = value; HttpOnly; Secure; SameSite=Lax;
-name: cooke1, value: value, httpOnly: true, sameSite: Lax, secure: true, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 47
-{
-    httponly : undefined
-    samesite : "Lax"
-    secure : undefined
-}
+name: cooke1, value: value, httpOnly: true, sameSite: Lax, secure: true, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 47, priority: Medium
 source: cooke1 = value; HttpOnly; Secure; SameSite=Secure;
-name: cooke1, value: value, httpOnly: true, sameSite: Secure, secure: true, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 50
-{
-    httponly : undefined
-    samesite : "Secure"
-    secure : undefined
-}
+name: cooke1, value: value, httpOnly: true, sameSite: Secure, secure: true, session: true, path: undefined, domain: undefined, port: undefined, expires: n/a, size: 50, priority: Medium
 source: cooke1; Path=/; Domain=.example.com;
-name: , value: cooke1, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 36
-{
-    domain : ".example.com"
-    path : "/"
-}
+name: , value: cooke1, httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 36, priority: Medium
 source: cooke1=; Path=/; Domain=.example.com;
-name: cooke1, value: , httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 37
-{
-    domain : ".example.com"
-    path : "/"
-}
+name: cooke1, value: , httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 37, priority: Medium
+source: cooke1=; Path=/; Domain=.example.com; Priority=High
+name: cooke1, value: , httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 51, priority: High
+source: cooke1=; Path=/; Domain=.example.com; Priority=Low
+name: cooke1, value: , httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 50, priority: Low
+source: cooke1=; Path=/; Domain=.example.com; Priority=Medium
+name: cooke1, value: , httpOnly: false, sameSite: undefined, secure: false, session: true, path: /, domain: .example.com, port: undefined, expires: n/a, size: 53, priority: Medium
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser.js b/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser.js
index 2102329..aa26c73 100644
--- a/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser.js
+++ b/third_party/blink/web_tests/http/tests/devtools/components/cookie-parser.js
@@ -13,10 +13,9 @@
     var output = 'name: ' + cookie.name() + ', value: ' + cookie.value() + ', httpOnly: ' + cookie.httpOnly() +
         ', sameSite: ' + cookie.sameSite() + ', secure: ' + cookie.secure() + ', session: ' + cookie.session() +
         ', path: ' + cookie.path() + ', domain: ' + cookie.domain() + ', port: ' + cookie.port() +
-        ', expires: ' + (expires ? expires.getTime() : 'n/a') + ', size: ' + cookie.size();
+        ', expires: ' + (expires ? expires.getTime() : 'n/a') + ', size: ' + cookie.size() + ', priority: ' + cookie.priority();
 
     TestRunner.addResult(output);
-    TestRunner.addObject(cookie.attributes());
   };
 
   TestRunner.dumpCookies = function(cookies) {
@@ -61,5 +60,8 @@
   TestRunner.parseAndDumpSetCookie('cooke1 = value; HttpOnly; Secure; SameSite=Secure;');
   TestRunner.parseAndDumpSetCookie('cooke1; Path=/; Domain=.example.com;');
   TestRunner.parseAndDumpSetCookie('cooke1=; Path=/; Domain=.example.com;');
+  TestRunner.parseAndDumpSetCookie('cooke1=; Path=/; Domain=.example.com; Priority=High');
+  TestRunner.parseAndDumpSetCookie('cooke1=; Path=/; Domain=.example.com; Priority=Low');
+  TestRunner.parseAndDumpSetCookie('cooke1=; Path=/; Domain=.example.com; Priority=Medium');
   TestRunner.completeTest();
 })();
diff --git a/third_party/blink/web_tests/http/tests/forms/date-picker-keyboard-cross-domain.html b/third_party/blink/web_tests/http/tests/forms/date-picker-keyboard-cross-domain.html
index 9b07a148..311b66c 100644
--- a/third_party/blink/web_tests/http/tests/forms/date-picker-keyboard-cross-domain.html
+++ b/third_party/blink/web_tests/http/tests/forms/date-picker-keyboard-cross-domain.html
@@ -30,4 +30,4 @@
     document.body.appendChild(iframe);
   </script>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/blink/web_tests/http/tests/forms/resources/date-picker-keyboard-cross-domain-iframe.html b/third_party/blink/web_tests/http/tests/forms/resources/date-picker-keyboard-cross-domain-iframe.html
index e85ccf3..5893605 100644
--- a/third_party/blink/web_tests/http/tests/forms/resources/date-picker-keyboard-cross-domain-iframe.html
+++ b/third_party/blink/web_tests/http/tests/forms/resources/date-picker-keyboard-cross-domain-iframe.html
@@ -6,7 +6,7 @@
 
       input_date.focus();
 
-      if (internals.runtimeFlags.formControlsRefreshEnabled) {
+      if (internals.isFormControlsRefreshEnabled) {
          eventSender.keyDown("Enter");
       } else {
          // Old picker needs Alt+Enter
@@ -25,4 +25,4 @@
 
      window.top.postMessage(`Date result: ${input_date.value}`, "*");
   </script>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
index b1ca6b9b1..b910ce4be 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -266,6 +266,7 @@
     property host
     property hostname
     property href
+    property hrefTranslate
     property hreflang
     property name
     property origin
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 1eae08b2..03d1803d 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1987,6 +1987,7 @@
     getter host
     getter hostname
     getter href
+    getter hrefTranslate
     getter hreflang
     getter name
     getter origin
@@ -2014,6 +2015,7 @@
     setter host
     setter hostname
     setter href
+    setter hrefTranslate
     setter hreflang
     setter name
     setter password
diff --git a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-connectionState.https-expected.txt b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-connectionState.https-expected.txt
index 9595466..437deb5 100644
--- a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-connectionState.https-expected.txt
+++ b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-connectionState.https-expected.txt
@@ -5,5 +5,6 @@
 FAIL connection with one data channel should eventually have transports in connected state Cannot read property 'transport' of null
 PASS connectionState remains new when not adding remote ice candidates
 PASS connectionState transitions to connected via connecting
+PASS Closing a PeerConnection should not fire connectionstatechange event
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html
new file mode 100644
index 0000000..b1fbc6c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html
@@ -0,0 +1,28 @@
+<!doctype HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="parent">
+    <div id="invisible"></div>
+</div>
+<audio id="audioEl" controls="controls">
+</audio>
+<script>
+let t = async_test('Does not crash');
+let audioEl = document.querySelector('#audioEl');
+function boom1() {
+  audioEl.setAttribute("rendersubtree", "invisible");
+  audioEl.src = "x";
+}
+
+function boom2() {
+  invisible.setAttribute("rendersubtree", "invisible");
+  document.caretRangeFromPoint(1, 2);
+  document.body.appendChild(audioEl);
+  t.done();
+}
+
+onload = () => {
+  parent.addEventListener("DOMSubtreeModified", boom1);
+  setTimeout(boom2, 200);
+};
+</script>
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 01d4f56..38f1ae7 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-88-g7e1b39f6c
-Revision: 7e1b39f6cd1f8e14d45592c9b192ade643d8d9de
+Version: VER-2-10-1-93-g10d8de754
+Revision: 10d8de7541ab1f26f6f04b2118d13a92a7119102
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
 License File: src/docs/FTL.TXT
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index c318dacf..4c5fef6a 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -15120,7 +15120,7 @@
 </histogram>
 
 <histogram name="BackgroundSync.Registration.OneShot"
-    enum="BackgroundSyncStatus" expires_after="M81">
+    enum="BackgroundSyncStatus" expires_after="2020-11-30">
   <owner>nator@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
   <summary>
@@ -51552,8 +51552,9 @@
 </histogram>
 
 <histogram name="Extensions.WebUi.DocumentLoadedInMainFrameTime" units="ms"
-    expires_after="M81">
-  <owner>rdevlin.cronin@chromium.org</owner>
+    expires_after="2020-12-01">
+  <owner>dpapad@chromium.org</owner>
+  <owner>dbeam@chromium.org</owner>
   <summary>
     The amount of time between starting the provisional load and fully loading
     the document in the main frame of the chrome://extensions page. This
@@ -51562,8 +51563,9 @@
 </histogram>
 
 <histogram name="Extensions.WebUi.LoadCompletedInMainFrame" units="ms"
-    expires_after="M81">
-  <owner>rdevlin.cronin@chromium.org</owner>
+    expires_after="2020-12-01">
+  <owner>dpapad@chromium.org</owner>
+  <owner>dbeam@chromium.org</owner>
   <summary>
     The amount of time between starting the provisional load and having
     completed the onload handler in the main frame of the chrome://extensions
@@ -80960,7 +80962,7 @@
 </histogram>
 
 <histogram name="Net.Cors.AccessCheckError" enum="CorsAccessCheckError"
-    expires_after="M81">
+    expires_after="M82">
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -80971,7 +80973,7 @@
 </histogram>
 
 <histogram name="Net.Cors.AccessCheckResult" enum="CorsAccessCheckResult"
-    expires_after="M81">
+    expires_after="M82">
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -81097,7 +81099,7 @@
 </histogram>
 
 <histogram name="Net.Cors.PreflightCheckError" enum="CorsAccessCheckError"
-    expires_after="M81">
+    expires_after="M82">
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -142538,8 +142540,9 @@
 </histogram>
 
 <histogram name="Signin.SSOWKWebView.GetAllCookies.CookieCount" units="cookies"
-    expires_after="M81">
+    expires_after="2020-11-01">
   <owner>jlebel@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
   <summary>
     Counts the number of cookies returned by -[WKHTTPCookieStore
     getAllCookies:]. This histogram is to help to understand how many callbacks
@@ -142549,8 +142552,9 @@
 </histogram>
 
 <histogram name="Signin.SSOWKWebView.GetAllCookies.Duration" units="ms"
-    expires_after="M81">
+    expires_after="2020-11-01">
   <owner>jlebel@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
   <summary>
     Tracks the time it takes for -[WKHTTPCookieStore getAllCookies:] to finish
     and call its callback. Note that nothing is logged is -[WKHTTPCookieStore
@@ -142562,8 +142566,9 @@
 </histogram>
 
 <histogram name="Signin.SSOWKWebView.GetAllCookies.Request"
-    enum="SigninSSOWKWebViewGetAllCookiesRequest">
+    enum="SigninSSOWKWebViewGetAllCookiesRequest" expires_after="2020-11-01">
   <owner>jlebel@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
   <summary>
     Counts the number of times -[WKHTTPCookieStore getAllCookies:] is called and
     the number of times it calls its callback. This histogram is to help to
@@ -164453,8 +164458,9 @@
 </histogram>
 
 <histogram name="Web.CurrentOriginEqualsLastCommittedOrigin"
-    enum="BooleanEqual" expires_after="M81">
+    enum="BooleanEqual" expires_after="2020-12-31">
   <owner>eugenebut@chromium.org</owner>
+  <owner>gambard@chromium.org</owner>
   <summary>
     [iOS] Reports URL matches between the return value from the WebState's
     GetLastCommittedURL and GetCurrentURL methods. It is expected the origins
diff --git a/tools/perf/benchmark_schedules.csv b/tools/perf/benchmark_schedules.csv
index 219c821f3..f36d47a 100644
--- a/tools/perf/benchmark_schedules.csv
+++ b/tools/perf/benchmark_schedules.csv
@@ -5,51 +5,56 @@
 system_health.common_mobile,13.54,8,1,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf",android-pixel2_weblayer-perf
 v8.browsing_mobile,10.81,8,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf",
 system_health.memory_mobile,10.25,7,2,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go-perf, android-go_webview-perf, android-pixel2-perf, android-pixel2_webview-perf","android-nexus5x-perf, android-pixel2_weblayer-perf"
-rendering.desktop,7.20,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.runtime_stats.top_25,6.45,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-system_health.common_desktop,4.74,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.layout,4.47,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-system_health.memory_desktop,3.89,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-loading.desktop,3.13,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-rasterize_and_record_micro.top_25,2.73,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+rendering.desktop,7.34,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.runtime_stats.top_25,6.54,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+system_health.common_desktop,4.70,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.layout,4.48,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+system_health.memory_desktop,3.94,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+loading.desktop,2.98,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.browsing_desktop,2.63,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 loading.mobile,2.62,6,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf",
-v8.browsing_desktop,2.60,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-v8.browsing_desktop-future,2.58,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+v8.browsing_desktop-future,2.61,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+rasterize_and_record_micro.top_25,2.55,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.bindings,2.40,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 startup.mobile,1.98,5,0,"Android Nexus5 Perf, android-go-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_weblayer-perf",
 blink_perf.parser,1.69,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.canvas,1.43,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-power.desktop,1.15,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.css,1.08,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-webrtc,0.99,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+webrtc,1.00,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+power.desktop,0.99,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.shadow_dom,0.92,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.image_decoder,0.86,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-media.desktop,0.80,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer2-future,0.74,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.paint,0.66,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer2-future,0.69,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.paint,0.67,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+media.desktop,0.67,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.dom,0.65,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 dromaeo,0.57,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+angle_perftests,0.55,1,0,Win 7 Nvidia GPU Perf,
 blink_perf.svg,0.54,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.events,0.53,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer2,0.51,15,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer2,0.49,14,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 tracing.tracing_with_background_memory_infra,0.46,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 media.mobile,0.45,3,0,"Android Nexus5 Perf, android-nexus5x-perf, android-pixel2-perf",
-memory.desktop,0.38,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 jetstream,0.37,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 jetstream2,0.35,5,0,"android-pixel2-perf, linux-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+memory.desktop,0.32,6,0,"Win 7 Nvidia GPU Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 blink_perf.display_locking,0.30,2,0,"android-nexus5x-perf, mac-10_12_laptop_low_end-perf",
 blink_perf.owp_storage,0.29,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer,0.29,15,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer,0.27,14,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-go-perf, android-go_webview-perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 kraken,0.22,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-octane,0.22,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-blink_perf.accessibility,0.17,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-speedometer-future,0.16,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf",
-rasterize_and_record_micro.partial_invalidation,0.06,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+octane,0.21,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+blink_perf.accessibility,0.18,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
+speedometer-future,0.13,11,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf",
+components_perftests,0.06,2,0,"Android Nexus5 Perf, Win 7 Perf",
+rasterize_and_record_micro.partial_invalidation,0.05,12,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 dummy_benchmark.stable_benchmark_1,0.03,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
 dummy_benchmark.noisy_benchmark_1,0.03,13,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, Win 7 Nvidia GPU Perf, Win 7 Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
-components_perftests,0.03,1,0,Android Nexus5 Perf,
 system_health.webview_startup,0.03,4,0,"Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-go_webview-perf, android-pixel2_webview-perf",
 gpu_perftests,0.02,1,0,Android Nexus5 Perf,
 tracing_perftests,0.01,1,0,Android Nexus5 Perf,
+media_perftests,0.01,2,0,"Win 7 Nvidia GPU Perf, Win 7 Perf",
+passthrough_command_buffer_perftests,0.01,1,0,Win 7 Nvidia GPU Perf,
+validating_command_buffer_perftests,0.01,1,0,Win 7 Nvidia GPU Perf,
+load_library_perf_tests,0.00,2,0,"Win 7 Nvidia GPU Perf, Win 7 Perf",
 v8.browsing_mobile-future,0.00,6,0,"Android Nexus5 Perf, Android Nexus5X WebView Perf, Android Nexus6 WebView Perf, android-nexus5x-perf, android-pixel2-perf, android-pixel2_webview-perf",
 tab_switching.typical_25,0.00,7,0,"Win 7 Nvidia GPU Perf, Win 7 Perf, linux-perf, mac-10_12_laptop_low_end-perf, mac-10_13_laptop_high_end-perf, win-10-perf, win-10_laptop_low_end-perf",
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index 5e7cd37..a1bca3c3 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -51,6 +51,7 @@
   'system_health.memory_mobile/browse:media:imgur'
   'system_health.memory_mobile/browse:tech:discourse_infinite_scroll',
   'system_health.memory_mobile/browse:shopping:amazon',
+  'system_health.memory_mobile/browse:social:facebook',
   'system_health.memory_mobile/browse:social:facebook_infinite_scroll',
   'system_health.memory_mobile/browse:social:pinterest_infinite_scroll',
   'system_health.memory_mobile/browse:media:facebook_photos',
diff --git a/tools/perf/chrome_telemetry_build/BUILD.gn b/tools/perf/chrome_telemetry_build/BUILD.gn
index c11d68e..280de1a 100644
--- a/tools/perf/chrome_telemetry_build/BUILD.gn
+++ b/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -34,6 +34,7 @@
         "//android_webview:system_webview_apk",
         "//android_webview/tools/system_webview_shell:system_webview_shell_apk",
         "//chrome/android:monochrome_public_apk",
+        "//chrome/android:monochrome_public_bundle",
       ]
     }
   } else {
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index 74f94c8..60c9084 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -218,9 +218,38 @@
         ['blink_perf.display_locking', 'jetstream2'])
 
 _TRACING_PERFTESTS = ExecutableConfig('tracing_perftests', estimated_runtime=50)
-_COMPONENTS_PERFTESTS = ExecutableConfig('components_perftests',
-                                         estimated_runtime=110)
+_COMPONENTS_PERFTESTS = ExecutableConfig(
+    'components_perftests', flags=[
+        '--xvfb',
+    ], estimated_runtime=110,)
 _GPU_PERFTESTS = ExecutableConfig('gpu_perftests', estimated_runtime=60)
+_LOAD_LIBRARY_PERF_TESTS = ExecutableConfig(
+    'load_library_perf_tests', estimated_runtime=3)
+_MEDIA_PERFTESTS = ExecutableConfig(
+    'media_perftests', flags=[
+        '--single-process-tests', '--test-launcher-retry-limit=0',
+        '--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::'
+        '*unoptimized_aligned',
+    ], estimated_runtime=16)
+_ANGLE_PERFTESTS = ExecutableConfig(
+    'angle_perftests', flags=[
+        '--test-launcher-retry-limit=0',
+        '--test-launcher-jobs=1',
+    ], estimated_runtime=1988)
+_PASSTHROUGH_COMMAND_BUFFER_PERFTESTS = ExecutableConfig(
+    'passthrough_command_buffer_perftests',
+    path='command_buffer_perftests',
+    flags=[
+        '--use-cmd-decoder=passthrough',
+        '--use-angle=gl-null',
+    ], estimated_runtime=30)
+_VALIDATING_COMMAND_BUFFER_PERFTESTS = ExecutableConfig(
+    'validating_command_buffer_perftests',
+    path='command_buffer_perftests',
+    flags=[
+        '--use-cmd-decoder=validating',
+        '--use-stub',
+    ], estimated_runtime=23)
 
 _LINUX_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING
 _MAC_HIGH_END_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING
@@ -231,7 +260,13 @@
     [_GetBenchmarkConfig('v8.browsing_desktop')])
 _WIN_7_BENCHMARK_CONFIGS = PerfSuite(
     _OFFICIAL_EXCEPT_DISPLAY_LOCKING_JETSTREAM2).Remove(['rendering.desktop'])
+_WIN_7_EXECUTABLE_CONFIGS = frozenset([
+    _LOAD_LIBRARY_PERF_TESTS, _COMPONENTS_PERFTESTS, _MEDIA_PERFTESTS])
 _WIN_7_GPU_BENCHMARK_CONFIGS = _OFFICIAL_EXCEPT_DISPLAY_LOCKING_JETSTREAM2
+_WIN_7_GPU_EXECUTABLE_CONFIGS = frozenset([
+    _LOAD_LIBRARY_PERF_TESTS, _ANGLE_PERFTESTS, _MEDIA_PERFTESTS,
+    _PASSTHROUGH_COMMAND_BUFFER_PERFTESTS,
+    _VALIDATING_COMMAND_BUFFER_PERFTESTS])
 _ANDROID_GO_BENCHMARK_CONFIGS = PerfSuite([
     _GetBenchmarkConfig('system_health.memory_mobile'),
     _GetBenchmarkConfig('system_health.common_mobile'),
@@ -309,10 +344,10 @@
     26, 'win')
 WIN_7 = PerfPlatform(
     'Win 7 Perf', 'N/A', _WIN_7_BENCHMARK_CONFIGS,
-    5, 'win')
+    4, 'win', executables=_WIN_7_EXECUTABLE_CONFIGS)
 WIN_7_GPU = PerfPlatform(
     'Win 7 Nvidia GPU Perf', 'N/A', _WIN_7_GPU_BENCHMARK_CONFIGS,
-    5, 'win')
+    4, 'win', executables=_WIN_7_GPU_EXECUTABLE_CONFIGS)
 
 # Android
 ANDROID_GO = PerfPlatform(
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 4f2afc80..80412cb34 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -339,7 +339,7 @@
         'isolate': 'performance_test_suite',
       }
     ],
-    'platform': 'android-chrome',
+    'platform': 'android-chrome-bundle',
     'dimension': {
       'device_os': 'OMB1.180119.001',
       'device_type': 'gobo',
@@ -504,7 +504,7 @@
         'isolate': 'performance_test_suite',
       }
     ],
-    'platform': 'android-chrome',
+    'platform': 'android-chrome-bundle',
     'dimension': {
       'pool': 'chrome.tests.perf',
       'os': 'Android',
@@ -600,21 +600,6 @@
       {
         'isolate': 'performance_test_suite',
       },
-      {
-        'isolate': 'load_library_perf_tests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'components_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'media_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      }
     ],
     'platform': 'win',
     'target_bits': 32,
@@ -633,41 +618,6 @@
             '--assert-gpu-compositing',
         ],
       },
-      {
-        'isolate': 'load_library_perf_tests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'angle_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'media_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'name': 'passthrough_command_buffer_perftests',
-        'isolate': 'command_buffer_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-        'extra_args': [
-            '--use-cmd-decoder=passthrough',
-            '--use-angle=gl-null',
-        ],
-      },
-      {
-        'name': 'validating_command_buffer_perftests',
-        'isolate': 'command_buffer_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-        'extra_args': [
-            '--use-cmd-decoder=validating',
-            '--use-stub',
-        ],
-      },
     ],
     'platform': 'win',
     'target_bits': 64,
@@ -761,31 +711,6 @@
           '--assert-gpu-compositing',
         ],
       },
-      {
-        'isolate': 'performance_browser_tests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'net_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'views_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'media_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
-      {
-        'isolate': 'base_perftests',
-        'num_shards': 1,
-        'type': TEST_TYPES.GTEST,
-      },
     ],
     'platform': 'mac',
     'dimension': {
@@ -971,6 +896,10 @@
                     'performance_weblayer_test_suite'):
       test_names.add(name)
 
+  for platform in bot_platforms.ALL_PLATFORMS:
+    for executable in platform.executables:
+      test_names.add(executable.name)
+
   return test_names
 
 
diff --git a/tools/perf/core/perf_data_generator_unittest.py b/tools/perf/core/perf_data_generator_unittest.py
index 4bc1b21..1326af3c 100644
--- a/tools/perf/core/perf_data_generator_unittest.py
+++ b/tools/perf/core/perf_data_generator_unittest.py
@@ -45,10 +45,12 @@
     try:
       with open(fake_perf_waterfall_file, 'w') as f:
         json.dump(data, f)
-      self.assertEquals(
-          perf_data_generator.get_scheduled_non_telemetry_benchmarks(
-              fake_perf_waterfall_file),
-          {'ninja_test', 'gun_slinger', 'test_dancing', 'test_singing'})
+      benchmarks = perf_data_generator.get_scheduled_non_telemetry_benchmarks(
+          fake_perf_waterfall_file)
+      self.assertIn('ninja_test', benchmarks)
+      self.assertIn('gun_slinger', benchmarks)
+      self.assertIn('test_dancing', benchmarks)
+      self.assertIn('test_singing', benchmarks)
     finally:
       os.remove(fake_perf_waterfall_file)
 
@@ -83,8 +85,8 @@
     valid = perf_data_generator.is_perf_benchmarks_scheduling_valid(
         'dummy', self.test_stream)
 
-    self.assertEquals(valid, True)
     self.assertEquals(self.test_stream.getvalue(), '')
+    self.assertEquals(valid, True)
 
   def test_UnscheduledCppBenchmarks(self):
     self.get_non_telemetry_benchmarks.return_value = {'honda'}
diff --git a/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json b/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
index 1c3bc40..f8ccdd4 100644
--- a/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win_7_nvidia_gpu_perf_timing.json
@@ -1,10 +1,10 @@
 [
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
@@ -16,7 +16,7 @@
         "name": "blink_perf.bindings/create-element.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/document-implementation.html"
     },
     {
@@ -24,7 +24,7 @@
         "name": "blink_perf.bindings/dom-attribute-on-prototoype.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/first-child.html"
     },
     {
@@ -40,7 +40,7 @@
         "name": "blink_perf.bindings/gc-tree.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/get-attribute-rare.html"
     },
     {
@@ -92,7 +92,7 @@
         "name": "blink_perf.bindings/sequence-conversion-array.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
@@ -164,7 +164,7 @@
         "name": "blink_perf.bindings/undefined-id-getter.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
@@ -224,19 +224,19 @@
         "name": "blink_perf.canvas/docs-paper.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.canvas/docs-paper_RAF.html?RAF"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.canvas/docs-resume.html"
     },
     {
-        "duration": "13.0",
+        "duration": "11.0",
         "name": "blink_perf.canvas/docs-resume_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/docs-table.html"
     },
     {
@@ -244,19 +244,19 @@
         "name": "blink_perf.canvas/docs-table_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "10.0",
+        "duration": "8.0",
         "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -280,7 +280,7 @@
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "41.0",
+        "duration": "40.0",
         "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -288,7 +288,7 @@
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d_RAF.html?RAF"
     },
     {
@@ -364,11 +364,11 @@
         "name": "blink_perf.canvas/toBlob_duration_jpeg_RAF.html?RAF"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "blink_perf.canvas/transferFromImageBitmap.html"
     },
     {
-        "duration": "53.0",
+        "duration": "51.0",
         "name": "blink_perf.canvas/transferFromImageBitmap_RAF.html?RAF"
     },
     {
@@ -392,7 +392,7 @@
         "name": "blink_perf.canvas/upload-video-to-texture.html"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "blink_perf.canvas/upload-video-to-texture_RAF.html?RAF"
     },
     {
@@ -404,7 +404,7 @@
         "name": "blink_perf.canvas/upload-webgl-to-texture_RAF.html?RAF"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
@@ -416,19 +416,19 @@
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
@@ -436,7 +436,7 @@
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
@@ -444,7 +444,7 @@
         "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html"
     },
     {
@@ -456,7 +456,7 @@
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
@@ -464,7 +464,7 @@
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
@@ -472,7 +472,7 @@
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
@@ -480,7 +480,7 @@
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "9.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
@@ -520,11 +520,11 @@
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "11.0",
+        "duration": "10.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
@@ -552,7 +552,7 @@
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.dom/modify-element-classname.html"
     },
     {
@@ -568,7 +568,7 @@
         "name": "blink_perf.dom/select-multiple-add.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.dom/select-single-add.html"
     },
     {
@@ -616,7 +616,7 @@
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
@@ -636,19 +636,19 @@
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "15.0",
+        "duration": "14.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
@@ -680,11 +680,11 @@
         "name": "blink_perf.layout/auto-grid-lots-of-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/auto-grid-lots-of-spanning-data.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/change-text-css-contain.html"
     },
     {
@@ -704,7 +704,7 @@
         "name": "blink_perf.layout/chapter-reflow-twice.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
@@ -716,7 +716,7 @@
         "name": "blink_perf.layout/contain-content-style-change.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/editing_append.html"
     },
     {
@@ -744,7 +744,7 @@
         "name": "blink_perf.layout/fit-content-change-available-size-text.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/fixed-grid-lots-of-data.html"
     },
     {
@@ -752,7 +752,7 @@
         "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/flexbox-column-nowrap.html"
     },
     {
@@ -768,7 +768,7 @@
         "name": "blink_perf.layout/flexbox-lots-of-data.html"
     },
     {
-        "duration": "8.0",
+        "duration": "7.0",
         "name": "blink_perf.layout/flexbox-row-nowrap.html"
     },
     {
@@ -776,23 +776,23 @@
         "name": "blink_perf.layout/flexbox-row-stretch-height-definite.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.layout/flexbox_with_list_item.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_100_100.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/floats_100_100_nested.html"
     },
     {
@@ -804,7 +804,7 @@
         "name": "blink_perf.layout/floats_20_100.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/floats_20_100_nested.html"
     },
     {
@@ -844,7 +844,7 @@
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html"
     },
     {
@@ -856,7 +856,7 @@
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
@@ -916,7 +916,7 @@
         "name": "blink_perf.layout/multicol/balance-forced-breaks.html"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "blink_perf.layout/multicol/deeply-nested-tables.html"
     },
     {
@@ -972,7 +972,7 @@
         "name": "blink_perf.layout/subtree-detaching.html"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
@@ -988,11 +988,11 @@
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
@@ -1004,15 +1004,15 @@
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
@@ -1020,27 +1020,27 @@
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "12.0",
+        "duration": "10.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "10.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
@@ -1052,15 +1052,15 @@
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
@@ -1068,11 +1068,11 @@
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
@@ -1096,7 +1096,7 @@
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "18.0",
+        "duration": "8.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
@@ -1148,7 +1148,7 @@
         "name": "blink_perf.parser/query-selector-all-id-first.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.parser/query-selector-all-id-last.html"
     },
     {
@@ -1180,11 +1180,11 @@
         "name": "blink_perf.parser/simple-url.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
@@ -1220,7 +1220,7 @@
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary-large.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/imperative-api-custom-detail-summary.html"
     },
     {
@@ -1248,7 +1248,7 @@
         "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
@@ -1276,11 +1276,11 @@
         "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-content-reprojection.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html"
     },
     {
@@ -1356,7 +1356,7 @@
         "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/v1-slot-append.html"
     },
     {
@@ -1368,7 +1368,7 @@
         "name": "blink_perf.shadow_dom/v1-small-deep-layout.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html"
     },
     {
@@ -1380,7 +1380,7 @@
         "name": "blink_perf.svg/AzLizardBenjiPark.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
@@ -1396,7 +1396,7 @@
         "name": "blink_perf.svg/Cowboy_transform.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.svg/CrawFishGanson.html"
     },
     {
@@ -1404,7 +1404,7 @@
         "name": "blink_perf.svg/Debian.html"
     },
     {
-        "duration": "3.0",
+        "duration": "2.0",
         "name": "blink_perf.svg/DropsOnABlade.html"
     },
     {
@@ -1424,15 +1424,15 @@
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.svg/HarveyRayner.html"
     },
     {
-        "duration": "2.0",
+        "duration": "3.0",
         "name": "blink_perf.svg/HereGear.html"
     },
     {
@@ -1472,7 +1472,7 @@
         "name": "blink_perf.svg/Worldcup.html"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "dromaeo/http://dromaeo.com?dom-attr"
     },
     {
@@ -1480,7 +1480,7 @@
         "name": "dromaeo/http://dromaeo.com?dom-modify"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
@@ -1508,39 +1508,39 @@
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "loading.desktop/AirBnB_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "loading.desktop/AirBnB_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/AllRecipes_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "loading.desktop/AllRecipes_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "loading.desktop/ArsTechnica_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "loading.desktop/ArsTechnica_warm"
     },
     {
@@ -1548,23 +1548,23 @@
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Chosun_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/Chosun_warm"
     },
     {
@@ -1572,19 +1572,19 @@
         "name": "loading.desktop/Colorado.edu_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Colorado.edu_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Danawa_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Danawa_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
@@ -1592,7 +1592,7 @@
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Donga_cold"
     },
     {
@@ -1600,59 +1600,59 @@
         "name": "loading.desktop/Donga_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/Economist_cold"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "loading.desktop/Economist_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/FIFA_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "loading.desktop/FIFA_warm"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Flickr_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.desktop/Flickr_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
@@ -1660,15 +1660,15 @@
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "loading.desktop/HTML5Rocks_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/HTML5Rocks_warm"
     },
     {
@@ -1676,31 +1676,31 @@
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/IGN_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/IGN_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/IMDB_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.desktop/IMDB_warm"
     },
     {
@@ -1708,79 +1708,79 @@
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Pantip_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Pantip_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/PremierLeague_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/PremierLeague_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/REI_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "loading.desktop/REI_warm"
     },
     {
@@ -1788,79 +1788,79 @@
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/TheOnion_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/TheOnion_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/TheVerge_cold"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "loading.desktop/TheVerge_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/TicketMaster_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "loading.desktop/TicketMaster_warm"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Walgreens_cold"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "loading.desktop/Walgreens_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
@@ -1868,51 +1868,51 @@
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "16.0",
         "name": "loading.desktop/money.cnn_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "loading.desktop/money.cnn_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "16.0",
+        "duration": "12.0",
         "name": "media.desktop/mse.html?media=aac_audio.mp4"
     },
     {
@@ -1920,11 +1920,11 @@
         "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "media.desktop/mse.html?media=h264_video.mp4"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
     },
     {
@@ -1932,11 +1932,11 @@
         "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "media.desktop/video.html?src=crowd1080.mp4"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "media.desktop/video.html?src=crowd1080.webm"
     },
     {
@@ -1944,7 +1944,7 @@
         "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
     },
     {
@@ -1952,23 +1952,23 @@
         "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
     },
     {
@@ -1976,15 +1976,15 @@
         "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "media.desktop/video.html?src=tulip2.mp4"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
     },
     {
@@ -1992,51 +1992,51 @@
         "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
     },
     {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "memory.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "40.0",
+        "duration": "41.0",
         "name": "memory.desktop/WebWorker"
     },
     {
@@ -2044,63 +2044,63 @@
         "name": "octane/Octane"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "power.desktop/TrivialAnimationPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "power.desktop/TrivialCanvasPageSharedPageState"
     },
     {
-        "duration": "37.0",
+        "duration": "39.0",
         "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "37.0",
         "name": "power.desktop/TrivialGifPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "power.desktop/TrivialScrollingPageSharedPageState"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "power.desktop/TrivialWebGLPageSharedPageState"
     },
     {
-        "duration": "10.0",
+        "duration": "4.0",
         "name": "power.desktop/abcnews"
     },
     {
-        "duration": "37.0",
+        "duration": "40.0",
         "name": "power.desktop/indiatimes"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "power.desktop/instagram"
     },
     {
-        "duration": "37.0",
+        "duration": "39.0",
         "name": "power.desktop/microsoft"
     },
     {
-        "duration": "39.0",
+        "duration": "40.0",
         "name": "power.desktop/sina"
     },
     {
-        "duration": "39.0",
+        "duration": "41.0",
         "name": "power.desktop/slideshare"
     },
     {
-        "duration": "39.0",
+        "duration": "41.0",
         "name": "power.desktop/uol"
     },
     {
@@ -2156,7 +2156,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
     },
     {
-        "duration": "25.0",
+        "duration": "24.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
     },
     {
@@ -2164,11 +2164,11 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
     },
     {
@@ -2176,7 +2176,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
     },
     {
@@ -2184,7 +2184,7 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
     },
     {
@@ -2192,15 +2192,15 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
     },
     {
-        "duration": "31.0",
+        "duration": "30.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
     },
     {
-        "duration": "174.0",
+        "duration": "178.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
     },
     {
-        "duration": "138.0",
+        "duration": "141.0",
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
     },
     {
@@ -2208,95 +2208,95 @@
         "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.desktop/accu_weather_2018"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "rendering.desktop/accu_weather_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/amazon_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/amazon_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/analog_clock_svg"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/animometer_webgl"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.desktop/animometer_webgl_attrib_arrays"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.desktop/animometer_webgl_multi_draw"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "rendering.desktop/aquarium"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "rendering.desktop/aquarium_20k"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/background_color_animation"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/background_color_animation_with_gradient"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_css_key_frame_animations"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_css_transition_2_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_css_transition_40_properties"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_css_transition_all_properties"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_javascript_canvas"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/balls_javascript_css"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/balls_svg_animations"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/blob"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/blogspot_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/blogspot_pinch_2018"
     },
     {
@@ -2304,319 +2304,319 @@
         "name": "rendering.desktop/blur_rotating_background"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/booking.com_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/booking_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/bouncing_balls_15"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/bouncing_balls_shadow"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/bouncing_clipped_rectangles"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/bouncing_gradient_circles"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "rendering.desktop/bouncing_png_images"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "rendering.desktop/bouncing_svg_images"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.desktop/camera_to_webgl"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/canvas_05000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/canvas_10000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/canvas_20000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "rendering.desktop/canvas_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/canvas_60000_pixels_per_second"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "rendering.desktop/canvas_75000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/canvas_90000_pixels_per_second"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/canvas_animation_no_clear"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_arcs"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_font_cycler"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/canvas_lines"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/canvas_to_blob"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "rendering.desktop/cats_unscaled"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "rendering.desktop/cats_viewport_width"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.desktop/cc_poster_circle"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/cc_scroll_text_only"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/chip_tune"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "rendering.desktop/cnn_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/cnn_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/compositor_heavy_animation"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/crafty_mind"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_animations_many_keyframes"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_animations_simultaneous_inline_style"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_animations_simultaneous_new_element"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_animations_simultaneous_style_element"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_animations_simultaneous_updating_class"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_animations_staggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_animations_staggered_new_element"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_animations_staggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_animations_staggered_updating_class"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_animations_triggered_inline_style"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_animations_triggered_new_element"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_animations_triggered_style_element"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_animations_triggered_updating_class"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.desktop/css_opacity_plus_n_layers_99"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_inline_style"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_new_element"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_staggered_inline_style"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_staggered_new_element"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_staggered_style_element"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_staggered_updating_class"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_style_element"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_triggered_inline_style"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_triggered_new_element"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_triggered_style_element"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_transitions_triggered_updating_class"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_transitions_updating_class"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_value_type_color"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/css_value_type_filter"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_value_type_length"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_value_type_length_complex"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_value_type_length_simple"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_value_type_path"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_value_type_shadow"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/css_value_type_transform_complex"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/css_value_type_transform_simple"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/dynamic_cube_map"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/earth"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/ebay_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/ebay_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/effect_games"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "rendering.desktop/espn_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/espn_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/extra_large_texture_uploads"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "rendering.desktop/facebook_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/facebook_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/fill_shapes"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/filter_terrain_svg"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/geo_apis"
     },
     {
@@ -2624,379 +2624,391 @@
         "name": "rendering.desktop/gmail_2018"
     },
     {
-        "duration": "31.0",
+        "duration": "38.0",
         "name": "rendering.desktop/gmail_move_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.desktop/gmail_pinch_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/google_calendar_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/google_calendar_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/google_docs_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/google_image_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/google_image_search_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/google_plus_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/google_search_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/google_web_search_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/guimark_vector_chart"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/hakim"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "rendering.desktop/ie_chalkboard"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/ie_pirate_mark"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.desktop/infinite_scroll_element_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/infinite_scroll_root_fixed_n_layers_99"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/infinite_scroll_root_n_layers_99"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.desktop/jarro_doverson"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/jpeg_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/jpeg_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "rendering.desktop/js_full_screen_invalidation"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.desktop/js_opacity_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.desktop/js_paint_plus_n_layers_99"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "rendering.desktop/js_poster_circle"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "rendering.desktop/js_scroll_text_only"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/kevs_3d"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/keyframed_animations"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/large_texture_uploads"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/linkedin_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/linkedin_pinch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/main_0fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
+        "name": "rendering.desktop/main_0fps_with_jank_impl_0fps"
+    },
+    {
+        "duration": "17.0",
         "name": "rendering.desktop/main_15fps_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
+        "name": "rendering.desktop/main_15fps_with_jank_impl_0fps"
+    },
+    {
+        "duration": "17.0",
         "name": "rendering.desktop/main_30fps_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/main_30fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/main_60fps_impl_0fps"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/main_60fps_impl_60fps"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
+        "name": "rendering.desktop/main_60fps_with_jank_impl_0fps"
+    },
+    {
+        "duration": "18.0",
         "name": "rendering.desktop/man_in_blue"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/many_images"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/many_planets_deep"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/maps_move_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/maps_perf_test"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/medium_texture_uploads"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/megi_dish"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/microsoft_asteroid_belt"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/microsoft_fireflies"
     },
     {
-        "duration": "16.0",
+        "duration": "20.0",
         "name": "rendering.desktop/microsoft_fish_ie_tank"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/microsoft_performance"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/microsoft_snow"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/microsoft_speed_reading"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/microsoft_tweet_map"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/microsoft_video_city"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "rendering.desktop/microsoft_worker_fountains"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/mix_10k"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/mix_blend_mode_animation_difference"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/mix_blend_mode_animation_hue"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/mix_blend_mode_animation_screen"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/motion_mark_canvas_fill_shapes"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/motion_mark_canvas_stroke_shapes"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "rendering.desktop/new_tilings"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/nvidia_vertex_buffer_object"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "rendering.desktop/overlay_background_color_css_transitions_page"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/particles"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "rendering.desktop/pinterest_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/put_get_image_data"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/raf"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/raf_animation"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/raf_canvas"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/raf_touch_animation"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "rendering.desktop/repaint_amazon_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/repaint_cnn_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/repaint_facebook_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/repaint_google_search_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/repaint_instagram_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/repaint_reddit_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/repaint_theverge_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/repaint_twitter_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "rendering.desktop/repaint_wikipedia_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/repaint_yahoo_homepage_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "rendering.desktop/runway_2019"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "rendering.desktop/san_angeles"
     },
     {
-        "duration": "9.0",
+        "duration": "15.0",
         "name": "rendering.desktop/second_batch_js_heavy"
     },
     {
-        "duration": "10.0",
+        "duration": "14.0",
         "name": "rendering.desktop/second_batch_js_light"
     },
     {
-        "duration": "10.0",
+        "duration": "13.0",
         "name": "rendering.desktop/second_batch_js_medium"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/simple_text_page"
     },
     {
-        "duration": "10.0",
+        "duration": "15.0",
         "name": "rendering.desktop/simple_touch_drag"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/small_texture_uploads"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "rendering.desktop/smash_cat"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/spielzeugz"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/stroke_shapes"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "rendering.desktop/sync_scroll_offset"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "rendering.desktop/techcrunch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_10000_pixels_per_second"
     },
     {
@@ -3004,15 +3016,15 @@
         "name": "rendering.desktop/text_20000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_40000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_60000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_75000_pixels_per_second"
     },
     {
@@ -3020,15 +3032,15 @@
         "name": "rendering.desktop/text_90000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "15.0",
         "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second"
     },
     {
-        "duration": "10.0",
+        "duration": "12.0",
         "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second"
     },
     {
@@ -3036,39 +3048,39 @@
         "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second"
     },
     {
-        "duration": "8.0",
+        "duration": "12.0",
         "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "11.0",
         "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.desktop/text_hover_05000_pixels_per_second"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_hover_10000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_hover_20000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "rendering.desktop/text_hover_40000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/text_hover_60000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "rendering.desktop/text_hover_75000_pixels_per_second"
     },
     {
@@ -3076,123 +3088,123 @@
         "name": "rendering.desktop/text_hover_90000_pixels_per_second"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/touch_handler_scrolling"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/transform_transitions"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/transform_transitions_js_block"
     },
     {
-        "duration": "11.0",
+        "duration": "15.0",
         "name": "rendering.desktop/twitch_2018"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "rendering.desktop/twitch_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/twitter_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "rendering.desktop/twitter_pinch_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.desktop/web_animation_value_type_color"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_length_3d"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_length_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_length_simple"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_path"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_shadow"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_transform_complex"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animation_value_type_transform_simple"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "rendering.desktop/web_animations_many_keyframes"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animations_set_current_time"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animations_simultaneous"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "rendering.desktop/web_animations_staggered_chaining"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "rendering.desktop/web_animations_staggered_infinite_iterations"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "rendering.desktop/web_animations_staggered_triggering_page"
     },
     {
-        "duration": "11.0",
+        "duration": "14.0",
         "name": "rendering.desktop/webp_decoding_rgb_and_gpu_rasterization"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "rendering.desktop/webp_decoding_yuv_and_gpu_rasterization"
     },
     {
-        "duration": "13.0",
+        "duration": "17.0",
         "name": "rendering.desktop/wikipedia_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "rendering.desktop/wordpress_2018"
     },
     {
-        "duration": "12.0",
+        "duration": "16.0",
         "name": "rendering.desktop/yahoo_answers_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "16.0",
         "name": "rendering.desktop/yahoo_news_2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "rendering.desktop/yahoo_news_pinch_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/yahoo_sports_2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "rendering.desktop/yahoo_sports_pinch_2018"
     },
     {
@@ -3204,39 +3216,39 @@
         "name": "rendering.desktop/youtube_pinch_2018"
     },
     {
-        "duration": "38.0",
+        "duration": "0.0",
         "name": "speedometer-future/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "speedometer/http://browserbench.org/Speedometer/"
     },
     {
-        "duration": "81.0",
+        "duration": "85.0",
         "name": "speedometer2-future/Speedometer2"
     },
     {
-        "duration": "63.0",
+        "duration": "64.0",
         "name": "speedometer2/Speedometer2"
     },
     {
-        "duration": "60.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "39.0",
+        "duration": "42.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "74.0",
+        "duration": "78.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "85.0",
+        "duration": "88.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "55.0",
+        "duration": "59.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
@@ -3248,11 +3260,11 @@
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "41.0",
+        "duration": "45.0",
         "name": "system_health.common_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "50.0",
         "name": "system_health.common_desktop/browse:news:flipboard:2018"
     },
     {
@@ -3260,27 +3272,27 @@
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "69.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "55.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "48.0",
         "name": "system_health.common_desktop/browse:search:google"
     },
     {
-        "duration": "43.0",
+        "duration": "47.0",
         "name": "system_health.common_desktop/browse:search:google:2018"
     },
     {
-        "duration": "30.0",
+        "duration": "34.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "69.0",
+        "duration": "73.0",
         "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
@@ -3288,27 +3300,27 @@
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "64.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "59.0",
         "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "61.0",
         "name": "system_health.common_desktop/browse:tools:earth"
     },
     {
-        "duration": "48.0",
+        "duration": "51.0",
         "name": "system_health.common_desktop/browse:tools:maps"
     },
     {
-        "duration": "67.0",
+        "duration": "71.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
@@ -3320,207 +3332,207 @@
         "name": "system_health.common_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "25.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "system_health.common_desktop/load:chrome:blank"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:games:bubbles"
     },
     {
-        "duration": "14.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "18.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:media:dailymotion"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:news:qq"
     },
     {
-        "duration": "17.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:social:pinterest"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "14.0",
+        "duration": "17.0",
         "name": "system_health.common_desktop/load:social:vk"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "24.0",
         "name": "system_health.common_desktop/load:tools:docs"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:tools:drive"
     },
     {
-        "duration": "16.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:tools:dropbox"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:tools:gmail"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:tools:weather"
     },
     {
-        "duration": "16.0",
+        "duration": "19.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "18.0",
         "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "117.0",
+        "duration": "120.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
@@ -3536,11 +3548,11 @@
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "40.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "40.0",
+        "duration": "44.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3548,15 +3560,15 @@
         "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "64.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "82.0",
+        "duration": "83.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
@@ -3568,23 +3580,23 @@
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "58.0",
+        "duration": "59.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
@@ -3592,19 +3604,19 @@
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "43.0",
         "name": "system_health.memory_desktop/browse:search:google"
     },
     {
-        "duration": "40.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "62.0",
+        "duration": "64.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
@@ -3612,27 +3624,27 @@
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "53.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "system_health.memory_desktop/browse:tools:earth"
     },
     {
-        "duration": "43.0",
+        "duration": "45.0",
         "name": "system_health.memory_desktop/browse:tools:maps"
     },
     {
-        "duration": "62.0",
+        "duration": "64.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
@@ -3644,11 +3656,11 @@
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
@@ -3656,7 +3668,7 @@
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:games:bubbles"
     },
     {
@@ -3680,7 +3692,7 @@
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:media:dailymotion"
     },
     {
@@ -3688,27 +3700,27 @@
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
@@ -3736,11 +3748,11 @@
         "name": "system_health.memory_desktop/load:news:qq"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
@@ -3748,31 +3760,31 @@
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
@@ -3780,7 +3792,7 @@
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
@@ -3788,7 +3800,7 @@
         "name": "system_health.memory_desktop/load:social:pinterest"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
@@ -3800,7 +3812,7 @@
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "system_health.memory_desktop/load:tools:docs"
     },
     {
@@ -3808,7 +3820,7 @@
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "system_health.memory_desktop/load:tools:drive"
     },
     {
@@ -3816,31 +3828,31 @@
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:tools:dropbox"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:tools:gmail"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:tools:weather"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
@@ -3848,7 +3860,7 @@
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "128.0",
+        "duration": "125.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
@@ -3864,7 +3876,7 @@
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "38.0",
+        "duration": "39.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -3872,11 +3884,11 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
@@ -3884,239 +3896,239 @@
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "70.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "48.0",
+        "duration": "51.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "8.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "95.0",
+        "duration": "97.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "68.0",
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "69.0",
+        "duration": "72.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "56.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "58.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "78.0",
+        "duration": "82.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "64.0",
+        "duration": "68.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:search:google"
     },
     {
-        "duration": "52.0",
+        "duration": "55.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "37.0",
+        "duration": "41.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
-        "duration": "85.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "51.0",
+        "duration": "54.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "72.0",
+        "duration": "75.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "68.0",
+        "duration": "71.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "71.0",
         "name": "v8.browsing_desktop-future/browse:tools:earth"
     },
     {
-        "duration": "57.0",
+        "duration": "60.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps"
     },
     {
-        "duration": "81.0",
+        "duration": "83.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "71.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "48.0",
+        "duration": "51.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "8.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "95.0",
+        "duration": "97.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "69.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "90.0",
+        "duration": "99.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "53.0",
+        "duration": "56.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "59.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "79.0",
+        "duration": "82.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "68.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "70.0",
         "name": "v8.browsing_desktop/browse:search:google"
     },
     {
-        "duration": "52.0",
+        "duration": "55.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "38.0",
+        "duration": "41.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "85.0",
+        "duration": "88.0",
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "52.0",
+        "duration": "54.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "72.0",
+        "duration": "76.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "68.0",
+        "duration": "71.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "67.0",
+        "duration": "70.0",
         "name": "v8.browsing_desktop/browse:tools:earth"
     },
     {
-        "duration": "58.0",
+        "duration": "60.0",
         "name": "v8.browsing_desktop/browse:tools:maps"
     },
     {
-        "duration": "81.0",
+        "duration": "84.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "45.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "43.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "45.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot"
     },
     {
@@ -4124,11 +4136,11 @@
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot"
     },
     {
@@ -4136,23 +4148,23 @@
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "45.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot"
     },
     {
-        "duration": "38.0",
+        "duration": "37.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot"
     },
     {
@@ -4160,19 +4172,19 @@
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold"
     },
     {
@@ -4180,11 +4192,11 @@
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot"
     },
     {
-        "duration": "41.0",
+        "duration": "43.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold"
     },
     {
@@ -4192,15 +4204,15 @@
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm"
     },
     {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold"
     },
     {
-        "duration": "73.0",
+        "duration": "76.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot"
     },
     {
@@ -4208,19 +4220,19 @@
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "29.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold"
     },
     {
-        "duration": "37.0",
+        "duration": "39.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold"
     },
     {
@@ -4228,23 +4240,23 @@
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold"
     },
     {
@@ -4252,11 +4264,11 @@
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold"
     },
     {
@@ -4268,7 +4280,7 @@
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold"
     },
     {
@@ -4276,11 +4288,11 @@
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold"
     },
     {
@@ -4288,71 +4300,71 @@
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold"
     },
     {
@@ -4360,11 +4372,11 @@
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold"
     },
     {
@@ -4376,7 +4388,7 @@
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold"
     },
     {
@@ -4384,63 +4396,63 @@
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold"
     },
     {
-        "duration": "44.0",
+        "duration": "47.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot"
     },
     {
-        "duration": "42.0",
+        "duration": "41.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "37.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot"
     },
     {
@@ -4452,19 +4464,19 @@
         "name": "v8.runtime_stats.top_25/http://www.qq.com_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_hot"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot"
     },
     {
@@ -4472,11 +4484,11 @@
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot"
     },
     {
@@ -4484,35 +4496,35 @@
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot"
     },
     {
@@ -4520,11 +4532,11 @@
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm"
     },
     {
-        "duration": "40.0",
+        "duration": "41.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold"
     },
     {
-        "duration": "47.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot"
     },
     {
@@ -4532,23 +4544,23 @@
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot"
     },
     {
-        "duration": "32.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "29.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold"
     },
     {
-        "duration": "38.0",
+        "duration": "39.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot"
     },
     {
@@ -4556,31 +4568,31 @@
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold"
     },
     {
-        "duration": "34.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "34.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold"
     },
     {
@@ -4588,63 +4600,83 @@
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot"
     },
     {
-        "duration": "33.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm"
     },
     {
-        "duration": "26.0",
+        "duration": "27.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot"
     },
     {
-        "duration": "34.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold"
     },
     {
-        "duration": "35.0",
+        "duration": "38.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot"
     },
     {
-        "duration": "35.0",
+        "duration": "36.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "33.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "34.0",
+        "duration": "39.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "37.0",
+        "duration": "41.0",
         "name": "webrtc/pause_play_peerconnections"
+    },
+    {
+        "duration": "30.0",
+        "name": "passthrough_command_buffer_perftests/_gtest_"
+    },
+    {
+        "duration": "1988.0",
+        "name": "angle_perftests/_gtest_"
+    },
+    {
+        "duration": "16.0",
+        "name": "media_perftests/_gtest_"
+    },
+    {
+        "duration": "3.0",
+        "name": "load_library_perf_tests/_gtest_"
+    },
+    {
+        "duration": "23.0",
+        "name": "validating_command_buffer_perftests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json b/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
index acdaff4..cb23a51 100644
--- a/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
+++ b/tools/perf/core/shard_maps/timing_data/win_7_perf_timing.json
@@ -1,10 +1,10 @@
 [
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "blink_perf.accessibility/line-breaks.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.accessibility/textarea-append.html"
     },
     {
@@ -48,7 +48,7 @@
         "name": "blink_perf.bindings/get-attribute.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/get-element-by-id.html"
     },
     {
@@ -56,7 +56,7 @@
         "name": "blink_perf.bindings/get-elements-by-tag-name.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/id-getter.html"
     },
     {
@@ -84,7 +84,7 @@
         "name": "blink_perf.bindings/node-type.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/post-message.html"
     },
     {
@@ -96,7 +96,7 @@
         "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.bindings/serialize-array.html"
     },
     {
@@ -112,11 +112,11 @@
         "name": "blink_perf.bindings/serialize-nested-array.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/set-attribute-rare.html"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/set-attribute.html"
     },
     {
@@ -136,7 +136,7 @@
         "name": "blink_perf.bindings/structured-clone-long-string-serialize.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/typed-array-construct-from-array.html"
     },
     {
@@ -168,15 +168,15 @@
         "name": "blink_perf.bindings/worker-structured-clone-different-payloads.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-from-worker.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-roundtrip.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.bindings/worker-structured-clone-json-to-worker.html"
     },
     {
@@ -188,7 +188,7 @@
         "name": "blink_perf.bindings/worker-structured-clone-workerDOM-Map-from-worker.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-from-worker.html"
     },
     {
@@ -196,7 +196,7 @@
         "name": "blink_perf.bindings/worker-text-encoded-transferable-roundtrip.html"
     },
     {
-        "duration": "9.0",
+        "duration": "8.0",
         "name": "blink_perf.bindings/worker-text-encoded-transferable-to-worker.html"
     },
     {
@@ -408,7 +408,7 @@
         "name": "blink_perf.css/AttributeDescendantSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CSSPropertySetterGetter.html"
     },
     {
@@ -416,7 +416,7 @@
         "name": "blink_perf.css/CSSPropertySetterGetterMethods.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/CSSPropertyUpdateValue.html"
     },
     {
@@ -424,7 +424,7 @@
         "name": "blink_perf.css/ChangeStyleChildClassSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleChildElementSelectors.html"
     },
     {
@@ -432,11 +432,11 @@
         "name": "blink_perf.css/ChangeStyleElementSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "11.0",
         "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html"
     },
     {
@@ -452,15 +452,15 @@
         "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html"
     },
     {
@@ -468,7 +468,7 @@
         "name": "blink_perf.css/ChangeStyleShallowTree.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleSingleClassSelector.html"
     },
     {
@@ -476,71 +476,71 @@
         "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "14.0",
         "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.css/ChangeStyleUniversalSelector.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/ClassDescendantSelector.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/ClassInvalidation.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/CustomPropertiesCascade.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/CustomPropertiesRootInheritance.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/CustomPropertiesVarAlias.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/FocusUpdate.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.css/LoadBootstrapBlog.html"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "blink_perf.css/LoadMaterializeStarterPage.html"
     },
     {
-        "duration": "13.0",
+        "duration": "12.0",
         "name": "blink_perf.css/LoadSemanticPageExample.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/PseudoClassSelectors.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.css/SelectorCountScaling.html"
     },
     {
-        "duration": "23.0",
+        "duration": "24.0",
         "name": "blink_perf.dom/custom-element-default-style-with-shadow.html"
     },
     {
@@ -548,7 +548,7 @@
         "name": "blink_perf.dom/custom-element-default-style.html"
     },
     {
-        "duration": "11.0",
+        "duration": "12.0",
         "name": "blink_perf.dom/long-sibling-list.html"
     },
     {
@@ -584,7 +584,7 @@
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV0ShadowTrees.html"
     },
     {
-        "duration": "9.0",
+        "duration": "10.0",
         "name": "blink_perf.events/EventsDispatchingInDeeplyNestedV1ShadowTrees.html"
     },
     {
@@ -608,27 +608,27 @@
         "name": "blink_perf.events/is-input-pending-default-events.html"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "blink_perf.image_decoder/decode-gif.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v1.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h1v2.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v1.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-jpeg-h2v2.html"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "blink_perf.image_decoder/decode-lossless-webp.html"
     },
     {
@@ -636,15 +636,15 @@
         "name": "blink_perf.image_decoder/decode-lossy-webp.html"
     },
     {
-        "duration": "17.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-png-palette-opaque.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.image_decoder/decode-png-palette.html"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "blink_perf.image_decoder/decode-png.html"
     },
     {
@@ -652,7 +652,7 @@
         "name": "blink_perf.layout/ArabicLineLayout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/Shapes/MultipleShapes.html"
     },
     {
@@ -708,7 +708,7 @@
         "name": "blink_perf.layout/chapter-reflow.html"
     },
     {
-        "duration": "7.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/character_fallback.html"
     },
     {
@@ -780,7 +780,7 @@
         "name": "blink_perf.layout/flexbox-row-wrap.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/flexbox-with-stretch-layout.html"
     },
     {
@@ -852,11 +852,11 @@
         "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/latin-ebook-resize.html"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "blink_perf.layout/latin-ebook.html"
     },
     {
@@ -864,7 +864,7 @@
         "name": "blink_perf.layout/layers_overlap_2d.html"
     },
     {
-        "duration": "4.0",
+        "duration": "5.0",
         "name": "blink_perf.layout/layers_overlap_3d.html"
     },
     {
@@ -944,7 +944,7 @@
         "name": "blink_perf.layout/multicol/lots-of-text-balanced.html"
     },
     {
-        "duration": "25.0",
+        "duration": "26.0",
         "name": "blink_perf.layout/multicol/nested-forced-breaks.html"
     },
     {
@@ -964,7 +964,7 @@
         "name": "blink_perf.layout/nested-grid.html"
     },
     {
-        "duration": "8.0",
+        "duration": "9.0",
         "name": "blink_perf.layout/nested-percent-height-tables.html"
     },
     {
@@ -976,7 +976,7 @@
         "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.layout/word-break-break-all.html"
     },
     {
@@ -988,63 +988,63 @@
         "name": "blink_perf.layout/word-wrap-break-word.html"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "blink_perf.owp_storage/blob-perf-files.html"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "blink_perf.owp_storage/blob-perf-ipc.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.owp_storage/blob-perf-shm.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.owp_storage/blob-perf-tiny.html"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "blink_perf.owp_storage/idb-load-docs.html"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/appending-text.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/color-changes.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/complex-content-slow-scroll.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/complex-iframe-filtered.html"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "blink_perf.paint/contain-update-layer-tree.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/containment-resize.html"
     },
     {
-        "duration": "14.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/fixed-and-many-layers-scroll.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html"
     },
     {
@@ -1052,15 +1052,15 @@
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/large-table-collapsed-border-change.html"
     },
     {
-        "duration": "15.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/large-table-repaint.html"
     },
     {
@@ -1068,15 +1068,15 @@
         "name": "blink_perf.paint/move-text-with-mask.html"
     },
     {
-        "duration": "13.0",
+        "duration": "14.0",
         "name": "blink_perf.paint/paint-offset-changes.html"
     },
     {
-        "duration": "13.0",
+        "duration": "15.0",
         "name": "blink_perf.paint/select-all-words.html"
     },
     {
-        "duration": "14.0",
+        "duration": "16.0",
         "name": "blink_perf.paint/transform-changes.html"
     },
     {
@@ -1096,7 +1096,7 @@
         "name": "blink_perf.parser/html5-full-render.html"
     },
     {
-        "duration": "18.0",
+        "duration": "9.0",
         "name": "blink_perf.parser/iframe-append-remove.html"
     },
     {
@@ -1184,7 +1184,7 @@
         "name": "blink_perf.parser/textarea-parsing.html"
     },
     {
-        "duration": "10.0",
+        "duration": "11.0",
         "name": "blink_perf.parser/tiny-innerHTML.html"
     },
     {
@@ -1252,11 +1252,11 @@
         "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/shadow-style-share.html"
     },
     {
-        "duration": "4.0",
+        "duration": "3.0",
         "name": "blink_perf.shadow_dom/style-sheet-insert.html"
     },
     {
@@ -1292,7 +1292,7 @@
         "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html"
     },
     {
@@ -1316,11 +1316,11 @@
         "name": "blink_perf.shadow_dom/v1-large-deep-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-append-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html"
     },
     {
@@ -1332,7 +1332,7 @@
         "name": "blink_perf.shadow_dom/v1-large-shallow-prepend-layout.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html"
     },
     {
@@ -1384,7 +1384,7 @@
         "name": "blink_perf.svg/Bamboo.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/Cactus.html"
     },
     {
@@ -1424,7 +1424,7 @@
         "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html"
     },
     {
-        "duration": "3.0",
+        "duration": "4.0",
         "name": "blink_perf.svg/GearFlowers.html"
     },
     {
@@ -1484,7 +1484,7 @@
         "name": "dromaeo/http://dromaeo.com?dom-query"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "dromaeo/http://dromaeo.com?dom-traverse"
     },
     {
@@ -1504,743 +1504,259 @@
         "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/24h_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/24h_warm"
     },
     {
-        "duration": "19.0",
-        "name": "loading.desktop/AirBnB_cold"
-    },
-    {
-        "duration": "29.0",
-        "name": "loading.desktop/AirBnB_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Aljayyash_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Aljayyash_warm"
     },
     {
-        "duration": "7.0",
-        "name": "loading.desktop/AllRecipes_cold"
-    },
-    {
-        "duration": "24.0",
-        "name": "loading.desktop/AllRecipes_warm"
-    },
-    {
         "duration": "20.0",
-        "name": "loading.desktop/ArsTechnica_cold"
-    },
-    {
-        "duration": "31.0",
-        "name": "loading.desktop/ArsTechnica_warm"
-    },
-    {
-        "duration": "18.0",
         "name": "loading.desktop/Baidu_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Baidu_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/Bhaskar_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Bhaskar_warm"
     },
     {
-        "duration": "19.0",
-        "name": "loading.desktop/Chosun_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Chosun_warm"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/Colorado.edu_cold"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/Colorado.edu_warm"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/Danawa_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Danawa_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Daum_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "loading.desktop/Daum_warm"
     },
     {
-        "duration": "29.0",
-        "name": "loading.desktop/Donga_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Donga_warm"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Economist_cold"
-    },
-    {
-        "duration": "26.0",
-        "name": "loading.desktop/Economist_warm"
-    },
-    {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Elmundo_cold"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "loading.desktop/Elmundo_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "loading.desktop/FC2Blog_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/FC2Blog_warm"
     },
     {
-        "duration": "18.0",
-        "name": "loading.desktop/FIFA_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/FIFA_warm"
-    },
-    {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "loading.desktop/FarsNews_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "loading.desktop/FarsNews_warm"
     },
     {
-        "duration": "18.0",
-        "name": "loading.desktop/Flickr_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Flickr_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/FlipKart_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/FlipKart_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Free.fr_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Free.fr_warm"
     },
     {
-        "duration": "18.0",
-        "name": "loading.desktop/HTML5Rocks_cold"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/HTML5Rocks_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Haraj_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Haraj_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/HatenaBookmark_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/HatenaBookmark_warm"
     },
     {
-        "duration": "19.0",
-        "name": "loading.desktop/IGN_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/IGN_warm"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/IMDB_cold"
-    },
-    {
         "duration": "20.0",
-        "name": "loading.desktop/IMDB_warm"
-    },
-    {
-        "duration": "18.0",
         "name": "loading.desktop/IndiaTimes_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/IndiaTimes_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/Kakaku_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/Kakaku_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Kenh14_cold"
     },
     {
-        "duration": "36.0",
+        "duration": "30.0",
         "name": "loading.desktop/Kenh14_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "loading.desktop/Mercadolivre_cold"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "loading.desktop/Mercadolivre_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Naver_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Naver_warm"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "loading.desktop/Orange_cold"
     },
     {
-        "duration": "7.0",
+        "duration": "8.0",
         "name": "loading.desktop/Orange_warm"
     },
     {
-        "duration": "18.0",
-        "name": "loading.desktop/Pantip_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/Pantip_warm"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/PremierLeague_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/PremierLeague_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "21.0",
         "name": "loading.desktop/QQ_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/QQ_warm"
     },
     {
-        "duration": "18.0",
-        "name": "loading.desktop/REI_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/REI_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Ruten_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Ruten_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/Sina_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "loading.desktop/Sina_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Taobao_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "loading.desktop/Taobao_warm"
     },
     {
-        "duration": "19.0",
-        "name": "loading.desktop/TheOnion_cold"
-    },
-    {
-        "duration": "7.0",
-        "name": "loading.desktop/TheOnion_warm"
-    },
-    {
-        "duration": "18.0",
-        "name": "loading.desktop/TheVerge_cold"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/TheVerge_warm"
-    },
-    {
-        "duration": "19.0",
-        "name": "loading.desktop/TicketMaster_cold"
-    },
-    {
-        "duration": "21.0",
-        "name": "loading.desktop/TicketMaster_warm"
-    },
-    {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Vietnamnet_cold"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "loading.desktop/Vietnamnet_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/Vnexpress_cold"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/Vnexpress_warm"
     },
     {
-        "duration": "7.0",
-        "name": "loading.desktop/Walgreens_cold"
-    },
-    {
-        "duration": "7.0",
-        "name": "loading.desktop/Walgreens_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Yandex_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/Yandex_warm"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "loading.desktop/amazon.co.jp_cold"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "loading.desktop/amazon.co.jp_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/ja.wikipedia_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/ja.wikipedia_warm"
     },
     {
-        "duration": "19.0",
-        "name": "loading.desktop/money.cnn_cold"
-    },
-    {
-        "duration": "25.0",
-        "name": "loading.desktop/money.cnn_warm"
-    },
-    {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/ru.wikipedia_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/ru.wikipedia_warm"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "loading.desktop/uol.com.br_cold"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "loading.desktop/uol.com.br_warm"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/yahoo.co.jp_cold"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "loading.desktop/yahoo.co.jp_warm"
     },
     {
-        "duration": "17.0",
-        "name": "media.desktop/mse.html?media=aac_audio.mp4"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/mse.html?media=h264_video.mp4"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/mse.html?media=tulip0.av1.mp4"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/mse.html?media=tulip2.vp9.webm"
-    },
-    {
-        "duration": "20.0",
-        "name": "media.desktop/video.html?src=crowd1080.mp4"
-    },
-    {
-        "duration": "20.0",
-        "name": "media.desktop/video.html?src=crowd1080.webm"
-    },
-    {
-        "duration": "19.0",
-        "name": "media.desktop/video.html?src=crowd1080_vp9.webm"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/video.html?src=garden2_10s.mp4&seek"
-    },
-    {
-        "duration": "17.0",
-        "name": "media.desktop/video.html?src=garden2_10s.webm&seek"
-    },
-    {
-        "duration": "18.0",
-        "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek"
-    },
-    {
-        "duration": "20.0",
-        "name": "media.desktop/video.html?src=tulip0.av1.mp4"
-    },
-    {
-        "duration": "17.0",
-        "name": "media.desktop/video.html?src=tulip0.av1.mp4&seek"
-    },
-    {
-        "duration": "26.0",
-        "name": "media.desktop/video.html?src=tulip2.m4a&type=audio"
-    },
-    {
-        "duration": "26.0",
-        "name": "media.desktop/video.html?src=tulip2.mp3&type=audio"
-    },
-    {
-        "duration": "17.0",
-        "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek"
-    },
-    {
-        "duration": "26.0",
-        "name": "media.desktop/video.html?src=tulip2.mp4"
-    },
-    {
-        "duration": "27.0",
-        "name": "media.desktop/video.html?src=tulip2.mp4&busyjs"
-    },
-    {
-        "duration": "26.0",
-        "name": "media.desktop/video.html?src=tulip2.ogg&type=audio"
-    },
-    {
-        "duration": "17.0",
-        "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek"
-    },
-    {
-        "duration": "26.0",
-        "name": "media.desktop/video.html?src=tulip2.vp9.webm"
-    },
-    {
-        "duration": "20.0",
-        "name": "media.desktop/video.html?src=tulip2.vp9.webm&background"
-    },
-    {
-        "duration": "27.0",
-        "name": "media.desktop/video.html?src=tulip2.vp9.webm_WiFi"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialAnimationPageSharedPageState"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialCanvasPageSharedPageState"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState"
-    },
-    {
-        "duration": "25.0",
-        "name": "memory.desktop/TrivialGifPageSharedPageState"
-    },
-    {
-        "duration": "26.0",
-        "name": "memory.desktop/TrivialScrollingPageSharedPageState"
-    },
-    {
-        "duration": "26.0",
-        "name": "memory.desktop/TrivialWebGLPageSharedPageState"
-    },
-    {
-        "duration": "48.0",
-        "name": "memory.desktop/WebWorker"
-    },
-    {
-        "duration": "42.0",
-        "name": "octane/Octane"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/TrivialAnimationPageSharedPageState"
-    },
-    {
-        "duration": "39.0",
-        "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState"
-    },
-    {
-        "duration": "39.0",
-        "name": "power.desktop/TrivialBlurAnimationPageSharedPageState"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/TrivialCanvasPageSharedPageState"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState"
-    },
-    {
-        "duration": "39.0",
-        "name": "power.desktop/TrivialGifPageSharedPageState"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/TrivialScrollingPageSharedPageState"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/TrivialWebGLPageSharedPageState"
-    },
-    {
-        "duration": "18.0",
-        "name": "power.desktop/abcnews"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/indiatimes"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/instagram"
-    },
-    {
-        "duration": "40.0",
-        "name": "power.desktop/microsoft"
-    },
-    {
-        "duration": "43.0",
-        "name": "power.desktop/sina"
-    },
-    {
-        "duration": "42.0",
-        "name": "power.desktop/slideshare"
-    },
-    {
-        "duration": "44.0",
-        "name": "power.desktop/uol"
-    },
-    {
-        "duration": "8.0",
-        "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html"
-    },
-    {
-        "duration": "20.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html"
-    },
-    {
-        "duration": "15.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html"
-    },
-    {
-        "duration": "23.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html"
-    },
-    {
-        "duration": "10.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html"
-    },
-    {
-        "duration": "11.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html"
-    },
-    {
-        "duration": "9.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html"
-    },
-    {
-        "duration": "13.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html"
-    },
-    {
-        "duration": "28.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html"
-    },
-    {
-        "duration": "13.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html"
-    },
-    {
-        "duration": "18.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html"
-    },
-    {
-        "duration": "19.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html"
-    },
-    {
-        "duration": "13.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html"
-    },
-    {
-        "duration": "1.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html"
-    },
-    {
-        "duration": "18.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html"
-    },
-    {
-        "duration": "12.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html"
-    },
-    {
-        "duration": "32.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html"
-    },
-    {
-        "duration": "176.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html"
-    },
-    {
-        "duration": "148.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html"
-    },
-    {
-        "duration": "21.0",
-        "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html"
-    },
-    {
-        "duration": "48.0",
-        "name": "speedometer-future/http://browserbench.org/Speedometer/"
-    },
-    {
         "duration": "46.0",
-        "name": "speedometer/http://browserbench.org/Speedometer/"
-    },
-    {
-        "duration": "172.0",
-        "name": "speedometer2-future/Speedometer2"
-    },
-    {
-        "duration": "97.0",
-        "name": "speedometer2/Speedometer2"
-    },
-    {
-        "duration": "68.0",
-        "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll"
-    },
-    {
-        "duration": "44.0",
         "name": "system_health.common_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "85.0",
         "name": "system_health.common_desktop/browse:media:imgur"
     },
     {
-        "duration": "91.0",
+        "duration": "93.0",
         "name": "system_health.common_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "63.0",
+        "duration": "65.0",
         "name": "system_health.common_desktop/browse:media:tumblr:2018"
     },
     {
@@ -2252,67 +1768,43 @@
         "name": "system_health.common_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "47.0",
-        "name": "system_health.common_desktop/browse:news:cnn:2018"
-    },
-    {
-        "duration": "47.0",
-        "name": "system_health.common_desktop/browse:news:flipboard:2018"
-    },
-    {
         "duration": "7.0",
         "name": "system_health.common_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "45.0",
+        "duration": "47.0",
         "name": "system_health.common_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "51.0",
-        "name": "system_health.common_desktop/browse:search:google"
-    },
-    {
-        "duration": "51.0",
-        "name": "system_health.common_desktop/browse:search:google:2018"
-    },
-    {
-        "duration": "36.0",
+        "duration": "38.0",
         "name": "system_health.common_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "74.0",
-        "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll:2018"
-    },
-    {
         "duration": "7.0",
         "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "49.0",
         "name": "system_health.common_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "66.0",
+        "duration": "68.0",
         "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "63.0",
-        "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll:2018"
-    },
-    {
-        "duration": "24.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/browse:tools:earth"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/browse:tools:maps"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/browse:tools:maps:2019"
     },
     {
@@ -2320,167 +1812,155 @@
         "name": "system_health.common_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "8.0",
-        "name": "system_health.common_desktop/browse_accessibility:media:youtube"
-    },
-    {
-        "duration": "32.0",
-        "name": "system_health.common_desktop/browse_accessibility:tech:codesearch:2018"
-    },
-    {
-        "duration": "20.0",
-        "name": "system_health.common_desktop/load:chrome:blank"
-    },
-    {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:games:bubbles"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.common_desktop/load:games:lazors"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "24.0",
+        "duration": "26.0",
         "name": "system_health.common_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/load:media:9gag"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:media:dailymotion"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "system_health.common_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "system_health.common_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:news:flipboard"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/load:news:qq"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:news:qq:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:search:google:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "34.0",
+        "duration": "37.0",
         "name": "system_health.common_desktop/load:social:pinterest"
     },
     {
-        "duration": "22.0",
+        "duration": "24.0",
         "name": "system_health.common_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.common_desktop/load:social:vk"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:social:vk:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "system_health.common_desktop/load:tools:docs"
     },
     {
@@ -2488,43 +1968,35 @@
         "name": "system_health.common_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "23.0",
+        "duration": "25.0",
         "name": "system_health.common_desktop/load:tools:drive"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:tools:dropbox"
     },
     {
-        "duration": "21.0",
+        "duration": "23.0",
         "name": "system_health.common_desktop/load:tools:gmail"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:tools:weather"
     },
     {
-        "duration": "21.0",
+        "duration": "22.0",
         "name": "system_health.common_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "21.0",
-        "name": "system_health.common_desktop/load_accessibility:media:wikipedia:2018"
-    },
-    {
-        "duration": "21.0",
-        "name": "system_health.common_desktop/load_accessibility:shopping:amazon:2018"
-    },
-    {
-        "duration": "122.0",
+        "duration": "124.0",
         "name": "system_health.common_desktop/long_running:tools:gmail-background"
     },
     {
@@ -2540,335 +2012,335 @@
         "name": "system_health.common_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "44.0",
+        "duration": "46.0",
         "name": "system_health.common_desktop/play:media:google_play_music"
     },
     {
-        "duration": "45.0",
+        "duration": "47.0",
         "name": "system_health.common_desktop/play:media:soundcloud:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "40.0",
+        "duration": "41.0",
         "name": "system_health.memory_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "68.0",
+        "duration": "69.0",
         "name": "system_health.memory_desktop/browse:media:imgur"
     },
     {
-        "duration": "86.0",
+        "duration": "87.0",
         "name": "system_health.memory_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "58.0",
+        "duration": "59.0",
         "name": "system_health.memory_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "61.0",
+        "duration": "63.0",
         "name": "system_health.memory_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "38.0",
+        "duration": "40.0",
         "name": "system_health.memory_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "43.0",
         "name": "system_health.memory_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "47.0",
+        "duration": "48.0",
         "name": "system_health.memory_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "41.0",
+        "duration": "42.0",
         "name": "system_health.memory_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "46.0",
+        "duration": "47.0",
         "name": "system_health.memory_desktop/browse:search:google"
     },
     {
-        "duration": "45.0",
+        "duration": "47.0",
         "name": "system_health.memory_desktop/browse:search:google:2018"
     },
     {
-        "duration": "32.0",
+        "duration": "33.0",
         "name": "system_health.memory_desktop/browse:search:google_india:2018"
     },
     {
-        "duration": "65.0",
+        "duration": "66.0",
         "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "43.0",
+        "duration": "44.0",
         "name": "system_health.memory_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "61.0",
+        "duration": "62.0",
         "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "58.0",
         "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "22.0",
+        "duration": "23.0",
         "name": "system_health.memory_desktop/browse:tools:earth"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "system_health.memory_desktop/browse:tools:maps"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/browse_accessibility:media:youtube"
     },
     {
-        "duration": "27.0",
+        "duration": "28.0",
         "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch:2018"
     },
     {
-        "duration": "16.0",
+        "duration": "17.0",
         "name": "system_health.memory_desktop/load:chrome:blank"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:games:alphabetty:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:games:bubbles"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:games:bubbles:2019"
     },
     {
-        "duration": "16.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:games:lazors"
     },
     {
-        "duration": "19.0",
+        "duration": "21.0",
         "name": "system_health.memory_desktop/load:games:miniclip:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "22.0",
         "name": "system_health.memory_desktop/load:games:spychase:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:media:9gag"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:media:dailymotion"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:media:dailymotion:2019"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:media:facebook_photos:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:media:flickr:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:media:google_images:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:media:imgur:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:media:soundcloud:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:media:youtube:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:news:bbc:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:news:cnn:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:news:flipboard"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:news:hackernews:2018"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.memory_desktop/load:news:nytimes:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:news:qq"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:news:qq:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:news:reddit:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:news:wikipedia:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:search:amazon:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:search:baidu:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:search:ebay:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:search:flipkart:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:search:google:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:search:taobao:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:search:yahoo:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:search:yandex:2018"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:social:instagram:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:social:pinterest"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:social:pinterest:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:social:vk"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load:social:vk:2018"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:tools:docs"
     },
     {
-        "duration": "20.0",
+        "duration": "21.0",
         "name": "system_health.memory_desktop/load:tools:docs:2019"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:tools:drive"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:tools:drive:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:tools:dropbox"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:tools:gmail"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:tools:stackoverflow:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "system_health.memory_desktop/load:tools:weather"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load:tools:weather:2019"
     },
     {
-        "duration": "17.0",
+        "duration": "18.0",
         "name": "system_health.memory_desktop/load_accessibility:media:wikipedia:2018"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "system_health.memory_desktop/load_accessibility:shopping:amazon:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-background"
     },
     {
-        "duration": "135.0",
+        "duration": "132.0",
         "name": "system_health.memory_desktop/long_running:tools:gmail-foreground"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/multitab:misc:typical24:2018"
     },
     {
-        "duration": "5.0",
+        "duration": "6.0",
         "name": "system_health.memory_desktop/play:media:google_play_music"
     },
     {
-        "duration": "41.0",
+        "duration": "43.0",
         "name": "system_health.memory_desktop/play:media:soundcloud:2018"
     },
     {
@@ -2876,55 +2348,55 @@
         "name": "tab_switching.typical_25/multitab:misc:typical24"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/Facebook"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "tracing.tracing_with_background_memory_infra/Wikipedia"
     },
     {
-        "duration": "17.0",
+        "duration": "19.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/"
     },
     {
-        "duration": "17.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/"
     },
     {
-        "duration": "18.0",
+        "duration": "19.0",
         "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com"
     },
     {
-        "duration": "19.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama"
     },
     {
-        "duration": "18.0",
+        "duration": "20.0",
         "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/"
     },
     {
-        "duration": "79.0",
+        "duration": "80.0",
         "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "53.0",
+        "duration": "55.0",
         "name": "v8.browsing_desktop-future/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop-future/browse:media:imgur"
     },
     {
-        "duration": "104.0",
+        "duration": "106.0",
         "name": "v8.browsing_desktop-future/browse:media:pinterest:2018"
     },
     {
@@ -2932,43 +2404,43 @@
         "name": "v8.browsing_desktop-future/browse:media:tumblr:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "v8.browsing_desktop-future/browse:media:youtube:2019"
     },
     {
-        "duration": "78.0",
+        "duration": "81.0",
         "name": "v8.browsing_desktop-future/browse:media:youtubetv:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "58.0",
         "name": "v8.browsing_desktop-future/browse:news:cnn:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "58.0",
         "name": "v8.browsing_desktop-future/browse:news:flipboard:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop-future/browse:news:hackernews:2018"
     },
     {
-        "duration": "82.0",
+        "duration": "85.0",
         "name": "v8.browsing_desktop-future/browse:news:nytimes:2018"
     },
     {
-        "duration": "56.0",
+        "duration": "59.0",
         "name": "v8.browsing_desktop-future/browse:news:reddit:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop-future/browse:search:google"
     },
     {
-        "duration": "57.0",
+        "duration": "60.0",
         "name": "v8.browsing_desktop-future/browse:search:google:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "45.0",
         "name": "v8.browsing_desktop-future/browse:search:google_india:2018"
     },
     {
@@ -2976,95 +2448,95 @@
         "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "15.0",
+        "duration": "17.0",
         "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "57.0",
+        "duration": "61.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter:2018"
     },
     {
-        "duration": "83.0",
+        "duration": "85.0",
         "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "77.0",
+        "duration": "76.0",
         "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "30.0",
         "name": "v8.browsing_desktop-future/browse:tools:earth"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "v8.browsing_desktop-future/browse:tools:maps:2019"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop-future/browse:tools:sheets:2019"
     },
     {
-        "duration": "79.0",
+        "duration": "80.0",
         "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll"
     },
     {
-        "duration": "53.0",
+        "duration": "55.0",
         "name": "v8.browsing_desktop/browse:media:googleplaystore:2018"
     },
     {
-        "duration": "11.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop/browse:media:imgur"
     },
     {
-        "duration": "101.0",
+        "duration": "102.0",
         "name": "v8.browsing_desktop/browse:media:pinterest:2018"
     },
     {
-        "duration": "80.0",
+        "duration": "79.0",
         "name": "v8.browsing_desktop/browse:media:tumblr:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop/browse:media:youtube:2019"
     },
     {
-        "duration": "75.0",
+        "duration": "77.0",
         "name": "v8.browsing_desktop/browse:media:youtubetv:2019"
     },
     {
-        "duration": "56.0",
+        "duration": "58.0",
         "name": "v8.browsing_desktop/browse:news:cnn:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "56.0",
         "name": "v8.browsing_desktop/browse:news:flipboard:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop/browse:news:hackernews:2018"
     },
     {
-        "duration": "79.0",
+        "duration": "81.0",
         "name": "v8.browsing_desktop/browse:news:nytimes:2018"
     },
     {
-        "duration": "53.0",
+        "duration": "55.0",
         "name": "v8.browsing_desktop/browse:news:reddit:2018"
     },
     {
-        "duration": "70.0",
+        "duration": "74.0",
         "name": "v8.browsing_desktop/browse:search:google"
     },
     {
-        "duration": "57.0",
+        "duration": "60.0",
         "name": "v8.browsing_desktop/browse:search:google:2018"
     },
     {
-        "duration": "42.0",
+        "duration": "45.0",
         "name": "v8.browsing_desktop/browse:search:google_india:2018"
     },
     {
@@ -3072,327 +2544,327 @@
         "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll:2018"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018"
     },
     {
-        "duration": "54.0",
+        "duration": "57.0",
         "name": "v8.browsing_desktop/browse:social:twitter:2018"
     },
     {
-        "duration": "80.0",
+        "duration": "81.0",
         "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll:2018"
     },
     {
-        "duration": "74.0",
+        "duration": "76.0",
         "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll:2018"
     },
     {
-        "duration": "27.0",
+        "duration": "31.0",
         "name": "v8.browsing_desktop/browse:tools:earth"
     },
     {
-        "duration": "22.0",
+        "duration": "25.0",
         "name": "v8.browsing_desktop/browse:tools:maps"
     },
     {
-        "duration": "22.0",
+        "duration": "26.0",
         "name": "v8.browsing_desktop/browse:tools:maps:2019"
     },
     {
-        "duration": "12.0",
+        "duration": "13.0",
         "name": "v8.browsing_desktop/browse:tools:sheets:2019"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsAMPAds_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "52.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm"
     },
     {
-        "duration": "35.0",
+        "duration": "37.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold"
     },
     {
-        "duration": "64.0",
+        "duration": "65.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot"
     },
     {
-        "duration": "56.0",
+        "duration": "58.0",
         "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold"
     },
     {
-        "duration": "52.0",
+        "duration": "54.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot"
     },
     {
-        "duration": "51.0",
+        "duration": "53.0",
         "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://weibo.com_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold"
     },
     {
@@ -3400,55 +2872,55 @@
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm"
     },
     {
-        "duration": "31.0",
+        "duration": "32.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold"
     },
     {
-        "duration": "52.0",
+        "duration": "54.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot"
     },
     {
-        "duration": "52.0",
+        "duration": "53.0",
         "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "52.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot"
     },
     {
-        "duration": "50.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm"
     },
     {
@@ -3456,75 +2928,75 @@
         "name": "v8.runtime_stats.top_25/http://www.qq.com_cold"
     },
     {
-        "duration": "60.0",
+        "duration": "62.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_hot"
     },
     {
-        "duration": "63.0",
+        "duration": "61.0",
         "name": "v8.runtime_stats.top_25/http://www.qq.com_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "53.0",
         "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm"
     },
     {
-        "duration": "43.0",
+        "duration": "40.0",
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold"
     },
     {
@@ -3536,119 +3008,131 @@
         "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm"
     },
     {
-        "duration": "28.0",
+        "duration": "30.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "49.0",
         "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm"
     },
     {
-        "duration": "31.0",
+        "duration": "33.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold"
     },
     {
-        "duration": "54.0",
+        "duration": "56.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot"
     },
     {
-        "duration": "51.0",
+        "duration": "53.0",
         "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm"
     },
     {
-        "duration": "33.0",
+        "duration": "35.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot"
     },
     {
-        "duration": "48.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "51.0",
         "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm"
     },
     {
-        "duration": "29.0",
+        "duration": "31.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot"
     },
     {
-        "duration": "49.0",
+        "duration": "50.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm"
     },
     {
-        "duration": "30.0",
+        "duration": "32.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold"
     },
     {
-        "duration": "50.0",
+        "duration": "52.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot"
     },
     {
-        "duration": "50.0",
+        "duration": "52.0",
         "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm"
     },
     {
-        "duration": "33.0",
+        "duration": "38.0",
         "name": "webrtc/10s_datachannel_transfer"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "webrtc/canvas_capture_peer_connection"
     },
     {
-        "duration": "31.0",
+        "duration": "34.0",
         "name": "webrtc/codec_constraints_h264"
     },
     {
-        "duration": "31.0",
+        "duration": "34.0",
         "name": "webrtc/codec_constraints_vp8"
     },
     {
-        "duration": "31.0",
+        "duration": "34.0",
         "name": "webrtc/codec_constraints_vp9"
     },
     {
-        "duration": "21.0",
+        "duration": "24.0",
         "name": "webrtc/hd_local_stream_10s"
     },
     {
-        "duration": "40.0",
+        "duration": "42.0",
         "name": "webrtc/multiple_peerconnections"
     },
     {
-        "duration": "43.0",
+        "duration": "45.0",
         "name": "webrtc/pause_play_peerconnections"
+    },
+    {
+        "duration": "110.0",
+        "name": "components_perftests/_gtest_"
+    },
+    {
+        "duration": "16.0",
+        "name": "media_perftests/_gtest_"
+    },
+    {
+        "duration": "3.0",
+        "name": "load_library_perf_tests/_gtest_"
     }
 ]
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json b/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json
index ac0fb8ad..946160f2 100644
--- a/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json
+++ b/tools/perf/core/shard_maps/win_7_nvidia_gpu_perf_map.json
@@ -56,15 +56,27 @@
                 "abridged": false
             },
             "loading.desktop": {
-                "end": 87,
+                "end": 86,
                 "abridged": false
             }
+        },
+        "executables": {
+            "angle_perftests": {
+                "path": "angle_perftests",
+                "arguments": [
+                    "--test-launcher-retry-limit=0",
+                    "--test-launcher-jobs=1"
+                ]
+            },
+            "load_library_perf_tests": {
+                "path": "load_library_perf_tests"
+            }
         }
     },
     "1": {
         "benchmarks": {
             "loading.desktop": {
-                "begin": 87,
+                "begin": 86,
                 "abridged": false
             },
             "media.desktop": {
@@ -86,15 +98,6 @@
                 "abridged": false
             },
             "rendering.desktop": {
-                "end": 197,
-                "abridged": false
-            }
-        }
-    },
-    "2": {
-        "benchmarks": {
-            "rendering.desktop": {
-                "begin": 197,
                 "abridged": false
             },
             "speedometer": {
@@ -110,10 +113,36 @@
                 "abridged": false
             },
             "system_health.common_desktop": {
+                "end": 5,
+                "abridged": false
+            }
+        },
+        "executables": {
+            "media_perftests": {
+                "path": "media_perftests",
+                "arguments": [
+                    "--single-process-tests",
+                    "--test-launcher-retry-limit=0",
+                    "--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::*unoptimized_aligned"
+                ]
+            },
+            "passthrough_command_buffer_perftests": {
+                "path": "command_buffer_perftests",
+                "arguments": [
+                    "--use-cmd-decoder=passthrough",
+                    "--use-angle=gl-null"
+                ]
+            }
+        }
+    },
+    "2": {
+        "benchmarks": {
+            "system_health.common_desktop": {
+                "begin": 5,
                 "abridged": false
             },
             "system_health.memory_desktop": {
-                "end": 21,
+                "end": 78,
                 "abridged": false
             }
         }
@@ -121,7 +150,7 @@
     "3": {
         "benchmarks": {
             "system_health.memory_desktop": {
-                "begin": 21,
+                "begin": 78,
                 "abridged": false
             },
             "tab_switching.typical_25": {
@@ -131,15 +160,6 @@
                 "abridged": false
             },
             "v8.browsing_desktop": {
-                "end": 23,
-                "abridged": false
-            }
-        }
-    },
-    "4": {
-        "benchmarks": {
-            "v8.browsing_desktop": {
-                "begin": 23,
                 "abridged": false
             },
             "v8.browsing_desktop-future": {
@@ -151,18 +171,26 @@
             "webrtc": {
                 "abridged": false
             }
+        },
+        "executables": {
+            "validating_command_buffer_perftests": {
+                "path": "command_buffer_perftests",
+                "arguments": [
+                    "--use-cmd-decoder=validating",
+                    "--use-stub"
+                ]
+            }
         }
     },
     "extra_infos": {
-        "num_stories": 1148,
-        "predicted_min_shard_time": 9648.0,
-        "predicted_min_shard_index": 0,
-        "predicted_max_shard_time": 9692.0,
+        "num_stories": 1170,
+        "predicted_min_shard_time": 15618.0,
+        "predicted_min_shard_index": 1,
+        "predicted_max_shard_time": 15708.0,
         "predicted_max_shard_index": 2,
-        "shard #0": 9648.0,
-        "shard #1": 9686.0,
-        "shard #2": 9692.0,
-        "shard #3": 9670.0,
-        "shard #4": 9652.0
+        "shard #0": 15668.0,
+        "shard #1": 15618.0,
+        "shard #2": 15708.0,
+        "shard #3": 15638.0
     }
 }
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/win_7_perf_map.json b/tools/perf/core/shard_maps/win_7_perf_map.json
index 242658f..60231568 100644
--- a/tools/perf/core/shard_maps/win_7_perf_map.json
+++ b/tools/perf/core/shard_maps/win_7_perf_map.json
@@ -56,15 +56,26 @@
                 "abridged": false
             },
             "loading.desktop": {
-                "end": 60,
+                "end": 77,
                 "abridged": false
             }
+        },
+        "executables": {
+            "components_perftests": {
+                "path": "components_perftests",
+                "arguments": [
+                    "--xvfb"
+                ]
+            },
+            "load_library_perf_tests": {
+                "path": "load_library_perf_tests"
+            }
         }
     },
     "1": {
         "benchmarks": {
             "loading.desktop": {
-                "begin": 60,
+                "begin": 77,
                 "abridged": false
             },
             "media.desktop": {
@@ -98,27 +109,28 @@
                 "abridged": false
             },
             "system_health.common_desktop": {
-                "end": 12,
                 "abridged": false
+            },
+            "system_health.memory_desktop": {
+                "end": 39,
+                "abridged": false
+            }
+        },
+        "executables": {
+            "media_perftests": {
+                "path": "media_perftests",
+                "arguments": [
+                    "--single-process-tests",
+                    "--test-launcher-retry-limit=0",
+                    "--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::*unoptimized_aligned"
+                ]
             }
         }
     },
     "2": {
         "benchmarks": {
-            "system_health.common_desktop": {
-                "begin": 12,
-                "abridged": false
-            },
             "system_health.memory_desktop": {
-                "end": 45,
-                "abridged": false
-            }
-        }
-    },
-    "3": {
-        "benchmarks": {
-            "system_health.memory_desktop": {
-                "begin": 45,
+                "begin": 39,
                 "abridged": false
             },
             "tab_switching.typical_25": {
@@ -131,15 +143,15 @@
                 "abridged": false
             },
             "v8.browsing_desktop-future": {
-                "end": 15,
+                "end": 23,
                 "abridged": false
             }
         }
     },
-    "4": {
+    "3": {
         "benchmarks": {
             "v8.browsing_desktop-future": {
-                "begin": 15,
+                "begin": 23,
                 "abridged": false
             },
             "v8.runtime_stats.top_25": {
@@ -151,15 +163,14 @@
         }
     },
     "extra_infos": {
-        "num_stories": 902,
-        "predicted_min_shard_time": 8348.0,
+        "num_stories": 916,
+        "predicted_min_shard_time": 12204.0,
         "predicted_min_shard_index": 2,
-        "predicted_max_shard_time": 8462.0,
-        "predicted_max_shard_index": 1,
-        "shard #0": 8426.0,
-        "shard #1": 8462.0,
-        "shard #2": 8348.0,
-        "shard #3": 8454.0,
-        "shard #4": 8450.0
+        "predicted_max_shard_time": 12310.0,
+        "predicted_max_shard_index": 3,
+        "shard #0": 12258.0,
+        "shard #1": 12236.0,
+        "shard #2": 12204.0,
+        "shard #3": 12310.0
     }
 }
\ No newline at end of file
diff --git a/tools/perf/cycletime_contributions.csv b/tools/perf/cycletime_contributions.csv
index 30fad4c..b38a280 100644
--- a/tools/perf/cycletime_contributions.csv
+++ b/tools/perf/cycletime_contributions.csv
@@ -1,57 +1,62 @@
 AUTOGENERATED FILE DO NOT EDIT
 View a prettier version of this at,https://docs.google.com/spreadsheets/d/15pJY4cxtM2NVNFKQDgDnoT5PLo0Nm5Td-Ov-5PZefAw
 platform,Android Nexus5 Perf,Android Nexus5X WebView Perf,Android Nexus6 WebView Perf,Win 7 Nvidia GPU Perf,Win 7 Perf,android-go-perf,android-go_webview-perf,android-nexus5x-perf,android-pixel2-perf,android-pixel2_weblayer-perf,android-pixel2_webview-perf,linux-perf,mac-10_12_laptop_low_end-perf,mac-10_13_laptop_high_end-perf,win-10-perf,win-10_laptop_low_end-perf
-shards,16,16,12,5,5,19,13,10,35,4,21,26,26,26,26,26
-idealized cycle time (hours),2.24,0.56,0.76,2.39,2.27,0.70,0.26,1.37,0.65,0.15,0.34,0.39,0.43,0.33,0.47,0.70
-blink_perf.accessibility,0.003,0.001,0.001,0.004,0.005,0.000,0.000,0.003,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
-blink_perf.bindings,0.052,0.014,0.029,0.041,0.048,0.000,0.000,0.050,0.013,0.000,0.009,0.006,0.009,0.007,0.008,0.011
-blink_perf.canvas,0.036,0.000,0.012,0.054,0.016,0.000,0.000,0.000,0.010,0.000,0.005,0.006,0.010,0.008,0.008,0.010
-blink_perf.css,0.019,0.004,0.007,0.031,0.037,0.000,0.000,0.021,0.006,0.000,0.003,0.004,0.006,0.003,0.006,0.008
+shards,16,16,12,4,4,19,13,10,35,4,21,26,26,26,26,26
+idealized cycle time (hours),2.24,0.56,0.76,3.45,2.45,0.70,0.26,1.37,0.65,0.15,0.34,0.39,0.43,0.33,0.47,0.70
+angle_perftests,0.000,0.000,0.000,0.276,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+blink_perf.accessibility,0.003,0.001,0.001,0.005,0.006,0.000,0.000,0.003,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
+blink_perf.bindings,0.052,0.014,0.029,0.052,0.061,0.000,0.000,0.050,0.013,0.000,0.009,0.006,0.009,0.007,0.008,0.011
+blink_perf.canvas,0.036,0.000,0.012,0.067,0.020,0.000,0.000,0.000,0.010,0.000,0.005,0.006,0.010,0.008,0.008,0.010
+blink_perf.css,0.019,0.004,0.007,0.040,0.047,0.000,0.000,0.021,0.006,0.000,0.003,0.004,0.006,0.003,0.006,0.008
 blink_perf.display_locking,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.050,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.000
-blink_perf.dom,0.016,0.006,0.007,0.009,0.010,0.000,0.000,0.015,0.003,0.000,0.002,0.001,0.002,0.002,0.002,0.003
-blink_perf.events,0.014,0.002,0.006,0.010,0.010,0.000,0.000,0.013,0.003,0.000,0.002,0.001,0.002,0.001,0.002,0.002
-blink_perf.image_decoder,0.017,0.005,0.007,0.015,0.018,0.000,0.000,0.020,0.006,0.000,0.004,0.002,0.003,0.002,0.003,0.005
-blink_perf.layout,0.111,0.027,0.053,0.068,0.082,0.000,0.000,0.110,0.024,0.000,0.015,0.009,0.015,0.012,0.014,0.016
-blink_perf.owp_storage,0.006,0.001,0.002,0.007,0.009,0.000,0.000,0.007,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.002
-blink_perf.paint,0.000,0.000,0.000,0.024,0.030,0.000,0.000,0.000,0.006,0.000,0.005,0.003,0.005,0.004,0.004,0.008
-blink_perf.parser,0.042,0.011,0.017,0.028,0.032,0.000,0.000,0.043,0.008,0.000,0.006,0.004,0.006,0.005,0.006,0.006
-blink_perf.shadow_dom,0.037,0.000,0.011,0.016,0.019,0.000,0.000,0.000,0.008,0.000,0.004,0.001,0.003,0.002,0.004,0.004
-blink_perf.svg,0.016,0.002,0.006,0.008,0.010,0.000,0.000,0.011,0.004,0.000,0.002,0.001,0.001,0.001,0.002,0.002
-components_perftests,0.004,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-dromaeo,0.007,0.003,0.004,0.016,0.016,0.000,0.000,0.010,0.003,0.000,0.002,0.002,0.003,0.003,0.003,0.003
-dummy_benchmark.noisy_benchmark_1,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-dummy_benchmark.stable_benchmark_1,0.001,0.001,0.000,0.000,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+blink_perf.dom,0.016,0.006,0.007,0.011,0.013,0.000,0.000,0.015,0.003,0.000,0.002,0.001,0.002,0.002,0.002,0.003
+blink_perf.events,0.014,0.002,0.006,0.012,0.013,0.000,0.000,0.013,0.003,0.000,0.002,0.001,0.002,0.001,0.002,0.002
+blink_perf.image_decoder,0.017,0.005,0.007,0.020,0.024,0.000,0.000,0.020,0.006,0.000,0.004,0.002,0.003,0.002,0.003,0.005
+blink_perf.layout,0.111,0.027,0.053,0.087,0.103,0.000,0.000,0.110,0.024,0.000,0.015,0.009,0.015,0.012,0.014,0.016
+blink_perf.owp_storage,0.006,0.001,0.002,0.010,0.012,0.000,0.000,0.007,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.002
+blink_perf.paint,0.000,0.000,0.000,0.032,0.040,0.000,0.000,0.000,0.006,0.000,0.005,0.003,0.005,0.004,0.004,0.008
+blink_perf.parser,0.042,0.011,0.017,0.034,0.039,0.000,0.000,0.043,0.008,0.000,0.006,0.004,0.006,0.005,0.006,0.006
+blink_perf.shadow_dom,0.037,0.000,0.011,0.020,0.024,0.000,0.000,0.000,0.008,0.000,0.004,0.001,0.003,0.002,0.004,0.004
+blink_perf.svg,0.016,0.002,0.006,0.010,0.012,0.000,0.000,0.011,0.004,0.000,0.002,0.001,0.001,0.001,0.002,0.002
+components_perftests,0.004,0.000,0.000,0.000,0.015,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+dromaeo,0.007,0.003,0.004,0.020,0.020,0.000,0.000,0.010,0.003,0.000,0.002,0.002,0.003,0.003,0.003,0.003
+dummy_benchmark.noisy_benchmark_1,0.001,0.000,0.000,0.000,0.001,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+dummy_benchmark.stable_benchmark_1,0.001,0.001,0.000,0.000,0.001,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
 gpu_perftests,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-jetstream,0.000,0.000,0.000,0.019,0.021,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.004,0.004,0.004,0.005
+jetstream,0.000,0.000,0.000,0.024,0.027,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.004,0.004,0.004,0.005
 jetstream2,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.008,0.000,0.000,0.003,0.000,0.004,0.003,0.007
-kraken,0.006,0.002,0.002,0.002,0.003,0.000,0.000,0.006,0.001,0.000,0.001,0.000,0.001,0.001,0.001,0.001
-loading.desktop,0.000,0.000,0.000,0.160,0.214,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.037,0.023,0.032,0.056
+kraken,0.006,0.002,0.002,0.003,0.004,0.000,0.000,0.006,0.001,0.000,0.001,0.000,0.001,0.001,0.001,0.001
+load_library_perf_tests,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+loading.desktop,0.000,0.000,0.000,0.218,0.172,0.000,0.000,0.000,0.000,0.000,0.000,0.022,0.037,0.023,0.032,0.056
 loading.mobile,0.094,0.021,0.029,0.000,0.000,0.000,0.000,0.085,0.025,0.000,0.014,0.000,0.000,0.000,0.000,0.000
-media.desktop,0.000,0.000,0.000,0.043,0.053,0.000,0.000,0.000,0.000,0.000,0.000,0.007,0.009,0.007,0.008,0.012
+media.desktop,0.000,0.000,0.000,0.055,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.007,0.009,0.007,0.008,0.012
 media.mobile,0.025,0.000,0.000,0.000,0.000,0.000,0.000,0.027,0.006,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-memory.desktop,0.000,0.000,0.000,0.024,0.028,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.004,0.003,0.005,0.005
-octane,0.005,0.001,0.002,0.004,0.005,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
-power.desktop,0.000,0.000,0.000,0.058,0.065,0.000,0.000,0.000,0.000,0.000,0.000,0.012,0.013,0.011,0.012,0.016
-rasterize_and_record_micro.partial_invalidation,0.001,0.000,0.001,0.001,0.001,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-rasterize_and_record_micro.top_25,0.049,0.016,0.025,0.066,0.074,0.000,0.000,0.056,0.013,0.000,0.010,0.008,0.009,0.009,0.013,0.017
-rendering.desktop,0.000,0.000,0.000,0.418,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.069,0.102,0.070,0.083,0.149
+media_perftests,0.000,0.000,0.000,0.002,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+memory.desktop,0.000,0.000,0.000,0.031,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.003,0.004,0.003,0.005,0.005
+octane,0.005,0.001,0.002,0.005,0.000,0.000,0.000,0.005,0.001,0.000,0.001,0.001,0.001,0.001,0.001,0.001
+passthrough_command_buffer_perftests,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+power.desktop,0.000,0.000,0.000,0.076,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.012,0.013,0.011,0.012,0.016
+rasterize_and_record_micro.partial_invalidation,0.001,0.000,0.001,0.001,0.000,0.000,0.000,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+rasterize_and_record_micro.top_25,0.049,0.016,0.025,0.083,0.000,0.000,0.000,0.056,0.013,0.000,0.010,0.008,0.009,0.009,0.013,0.017
+rendering.desktop,0.000,0.000,0.000,0.593,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.069,0.102,0.070,0.083,0.149
 rendering.mobile,0.707,0.205,0.235,0.000,0.000,0.000,0.000,0.019,0.178,0.000,0.107,0.000,0.000,0.000,0.000,0.000
-speedometer,0.005,0.001,0.002,0.004,0.005,0.004,0.003,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.002
-speedometer-future,0.000,0.001,0.002,0.004,0.005,0.000,0.000,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.000
-speedometer2,0.008,0.002,0.003,0.007,0.011,0.008,0.006,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.003
-speedometer2-future,0.021,0.003,0.006,0.009,0.019,0.000,0.000,0.013,0.002,0.000,0.001,0.003,0.004,0.003,0.003,0.007
+speedometer,0.005,0.001,0.002,0.005,0.000,0.004,0.003,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.002
+speedometer-future,0.000,0.001,0.002,0.000,0.000,0.000,0.000,0.004,0.001,0.000,0.000,0.001,0.001,0.001,0.001,0.000
+speedometer2,0.008,0.002,0.003,0.009,0.000,0.008,0.006,0.007,0.001,0.000,0.001,0.001,0.002,0.002,0.001,0.003
+speedometer2-future,0.021,0.003,0.006,0.012,0.000,0.000,0.000,0.013,0.002,0.000,0.001,0.003,0.004,0.003,0.003,0.007
 startup.mobile,0.025,0.000,0.000,0.000,0.000,0.030,0.000,0.027,0.073,0.018,0.000,0.000,0.000,0.000,0.000,0.000
-system_health.common_desktop,0.000,0.000,0.000,0.231,0.261,0.000,0.000,0.000,0.000,0.000,0.000,0.048,0.054,0.045,0.050,0.073
+system_health.common_desktop,0.000,0.000,0.000,0.322,0.272,0.000,0.000,0.000,0.000,0.000,0.000,0.048,0.054,0.045,0.050,0.073
 system_health.common_mobile,0.325,0.085,0.109,0.000,0.000,0.233,0.143,0.337,0.070,0.063,0.050,0.000,0.000,0.000,0.000,0.000
-system_health.memory_desktop,0.000,0.000,0.000,0.215,0.229,0.000,0.000,0.000,0.000,0.000,0.000,0.032,0.045,0.037,0.043,0.058
+system_health.memory_desktop,0.000,0.000,0.000,0.277,0.299,0.000,0.000,0.000,0.000,0.000,0.000,0.032,0.045,0.037,0.043,0.058
 system_health.memory_mobile,0.216,0.063,0.092,0.000,0.000,0.170,0.104,0.063,0.109,0.064,0.045,0.000,0.000,0.000,0.000,0.000
 system_health.webview_startup,0.000,0.000,0.001,0.000,0.000,0.000,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
 tab_switching.typical_25,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-tracing.tracing_with_background_memory_infra,0.010,0.002,0.002,0.012,0.018,0.000,0.000,0.008,0.002,0.000,0.001,0.001,0.002,0.002,0.002,0.003
+tracing.tracing_with_background_memory_infra,0.010,0.002,0.002,0.017,0.025,0.000,0.000,0.008,0.002,0.000,0.001,0.001,0.002,0.002,0.002,0.003
 tracing_perftests,0.002,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-v8.browsing_desktop,0.000,0.000,0.000,0.145,0.137,0.000,0.000,0.000,0.000,0.000,0.000,0.023,0.030,0.024,0.027,0.042
-v8.browsing_desktop-future,0.000,0.000,0.000,0.136,0.135,0.000,0.000,0.000,0.000,0.000,0.000,0.025,0.030,0.024,0.026,0.040
+v8.browsing_desktop,0.000,0.000,0.000,0.191,0.177,0.000,0.000,0.000,0.000,0.000,0.000,0.023,0.030,0.024,0.027,0.042
+v8.browsing_desktop-future,0.000,0.000,0.000,0.178,0.175,0.000,0.000,0.000,0.000,0.000,0.000,0.025,0.030,0.024,0.026,0.040
 v8.browsing_mobile,0.338,0.072,0.079,0.000,0.000,0.255,0.000,0.339,0.059,0.000,0.041,0.000,0.000,0.000,0.000,0.000
 v8.browsing_mobile-future,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
-v8.runtime_stats.top_25,0.000,0.000,0.000,0.474,0.622,0.000,0.000,0.000,0.000,0.000,0.000,0.079,0.000,0.000,0.089,0.116
-webrtc,0.017,0.004,0.006,0.024,0.028,0.000,0.000,0.016,0.004,0.000,0.003,0.004,0.005,0.004,0.005,0.010
+v8.runtime_stats.top_25,0.000,0.000,0.000,0.613,0.805,0.000,0.000,0.000,0.000,0.000,0.000,0.079,0.000,0.000,0.089,0.116
+validating_command_buffer_perftests,0.000,0.000,0.000,0.003,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000
+webrtc,0.017,0.004,0.006,0.034,0.038,0.000,0.000,0.016,0.004,0.000,0.003,0.004,0.005,0.004,0.005,0.010
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 037a064..4d3b9b5 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -337,8 +337,6 @@
 crbug.com/1002640 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:omnibox [ Skip ]
 crbug.com/1014655 [ android-webview ] system_health.common_mobile/browse:social:instagram:2019 [ Skip ]
-crbug.com/1029465 [ android-nexus-6 android-webview ] system_health.common_mobile/browse:news:nytimes:2019 [ Skip ]
-crbug.com/1029465 [ android-go ] system_health.common_mobile/browse:news:nytimes:2019 [ Skip ]
 crbug.com/1036141 [ android-webview ] system_health.common_mobile/browse:shopping:lazada:2019 [ Skip ]
 crbug.com/1036143 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:omnibox:2019 [ Skip ]
 crbug.com/1037687 [ android ] system_health.common_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
@@ -419,8 +417,6 @@
 crbug.com/1017661 [ android-nexus-5x ] system_health.memory_mobile/browse:media:flickr_infinite_scroll [ Skip ]
 crbug.com/1017661 [ android-nexus-5x ] system_health.memory_mobile/browse:social:facebook_infinite_scroll:2018 [ Skip ]
 crbug.com/1017661 [ android-nexus-5x ] system_health.memory_mobile/browse:tech:discourse_infinite_scroll:2018 [ Skip ]
-crbug.com/1029465 [ android-nexus-6 android-webview ] system_health.memory_mobile/browse:news:nytimes:2019 [ Skip ]
-crbug.com/1029465 [ android-go ] system_health.memory_mobile/browse:news:nytimes:2019 [ Skip ]
 crbug.com/1036143 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:omnibox:2019 [ Skip ]
 crbug.com/1037687 [ android ] system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
 
@@ -473,10 +469,6 @@
 crbug.com/1002640 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:omnibox [ Skip ]
 crbug.com/1014655 [ android-webview ] v8.browsing_mobile/browse:social:instagram:2019 [ Skip ]
-crbug.com/1029465 [ android-nexus-5 ] v8.browsing_mobile/browse:news:nytimes:2019 [ Skip ]
-crbug.com/1029465 [ android-go ] v8.browsing_mobile/browse:news:nytimes:2019 [ Skip ]
-crbug.com/1029465 [ android-nexus-6 android-webview ] v8.browsing_mobile/browse:news:nytimes:2019 [ Skip ]
-crbug.com/1029465 [ android-nexus-6 android-webview ] v8.browsing_mobile/browse:social:facebook_infinite_scroll [ Skip ]
 crbug.com/1036141 [ android-webview ] v8.browsing_mobile/browse:shopping:lazada:2019 [ Skip ]
 crbug.com/1036143 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:omnibox:2019 [ Skip ]
 crbug.com/1037687 [ android ] v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
diff --git a/tools/perf/page_sets/data/credentials.json.sha1 b/tools/perf/page_sets/data/credentials.json.sha1
index 978de0f..101bbb68 100644
--- a/tools/perf/page_sets/data/credentials.json.sha1
+++ b/tools/perf/page_sets/data/credentials.json.sha1
@@ -1 +1 @@
-6840cad1ab0a693cc418aadd60718c195eb48445
\ No newline at end of file
+180cf6cb3acbf869cb4e5ba6c071b1e6ba9f9d11
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/system_health_mobile.json b/tools/perf/page_sets/data/system_health_mobile.json
index d33a65e..69eadc04 100644
--- a/tools/perf/page_sets/data/system_health_mobile.json
+++ b/tools/perf/page_sets/data/system_health_mobile.json
@@ -150,6 +150,9 @@
         "browse:social:facebook": {
             "DEFAULT": "system_health_mobile_028.wprgo"
         },
+        "browse:social:facebook:2019": {
+            "DEFAULT": "system_health_mobile_77b7808065.wprgo"
+        },
         "browse:social:facebook_infinite_scroll": {
             "DEFAULT": "system_health_mobile_062.wprgo"
         },
diff --git a/tools/perf/page_sets/data/system_health_mobile_77b7808065.wprgo.sha1 b/tools/perf/page_sets/data/system_health_mobile_77b7808065.wprgo.sha1
new file mode 100644
index 0000000..2502b63
--- /dev/null
+++ b/tools/perf/page_sets/data/system_health_mobile_77b7808065.wprgo.sha1
@@ -0,0 +1 @@
+77b7808065f53e5aa2dfe7e8a742d6f4af769c15
\ No newline at end of file
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py
index e8248e9f..dba9b7c 100644
--- a/tools/perf/page_sets/system_health/browsing_stories.py
+++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -83,8 +83,14 @@
   # Some devices take long to load news webpages crbug.com/713036. Set to None
   # because we cannot access DEFAULT_WEB_CONTENTS_TIMEOUT from this file.
   COMPLETE_STATE_WAIT_TIMEOUT = None
+  # On some pages (for ex: facebook) articles appear only after we start
+  # scrolling. This specifies if we need scroll main page.
+  SCROLL_BEFORE_BROWSE = False
 
   def _DidLoadDocument(self, action_runner):
+    # Scroll main page if needed before we start browsing articles.
+    if self.SCROLL_BEFORE_BROWSE:
+      self._ScrollMainPage(action_runner)
     for i in xrange(self.ITEMS_TO_VISIT):
       self._NavigateToItem(action_runner, i)
       self._ReadNextArticle(action_runner)
@@ -134,6 +140,34 @@
   TAGS = [story_tags.EMERGING_MARKET, story_tags.YEAR_2016]
 
 
+class FacebookMobileStory2019(_ArticleBrowsingStory):
+  NAME = 'browse:social:facebook:2019'
+  URL = 'https://www.facebook.com/rihanna'
+  ITEM_SELECTOR = '._5msj'
+  MAIN_PAGE_SCROLL_REPEAT = 1
+  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+  IS_SINGLE_PAGE_APP = True
+  SCROLL_BEFORE_BROWSE = True
+
+  TAGS = [story_tags.EMERGING_MARKET, story_tags.YEAR_2019]
+
+  def _Login(self, action_runner):
+    facebook_login.LoginWithMobileSite(action_runner, 'facebook4')
+
+  def _ScrollMainPage(self, action_runner):
+    action_runner.tab.WaitForDocumentReadyStateToBeComplete()
+    # Facebook loads content dynamically. So keep trying to scroll till we find
+    # the elements. Retry 5 times waiting a bit each time.
+    for _ in xrange(5):
+      action_runner.RepeatableBrowserDrivenScroll(
+          repeat_count=self.MAIN_PAGE_SCROLL_REPEAT)
+      result = action_runner.EvaluateJavaScript(
+          'document.querySelectorAll("._5msj").length')
+      if result:
+        break
+      action_runner.Wait(1)
+
+
 class FacebookDesktopStory(_ArticleBrowsingStory):
   NAME = 'browse:social:facebook'
   URL = 'https://www.facebook.com/rihanna'
diff --git a/tools/perf/system_health_stories.csv b/tools/perf/system_health_stories.csv
index 424121f..aa5c238 100644
--- a/tools/perf/system_health_stories.csv
+++ b/tools/perf/system_health_stories.csv
@@ -58,6 +58,7 @@
 browse:shopping:lazada,,mobile,"2016,emerging_market"
 browse:shopping:lazada:2019,,mobile,"2019,emerging_market"
 browse:social:facebook,,mobile,"2016,emerging_market"
+browse:social:facebook:2019,,mobile,"2019,emerging_market"
 browse:social:facebook_infinite_scroll,,mobile,2016
 browse:social:facebook_infinite_scroll:2018,,"desktop,mobile","2018,infinite_scroll"
 browse:social:instagram,,mobile,"2016,emerging_market"
diff --git a/ui/compositor/recyclable_compositor_mac.cc b/ui/compositor/recyclable_compositor_mac.cc
index 9aed2f2..74e7df8 100644
--- a/ui/compositor/recyclable_compositor_mac.cc
+++ b/ui/compositor/recyclable_compositor_mac.cc
@@ -67,8 +67,10 @@
   compositor_suspended_lock_ = nullptr;
 }
 
-void RecyclableCompositorMac::UpdateSurface(const gfx::Size& size_pixels,
-                                            float scale_factor) {
+void RecyclableCompositorMac::UpdateSurface(
+    const gfx::Size& size_pixels,
+    float scale_factor,
+    const gfx::ColorSpace& color_space) {
   if (size_pixels != size_pixels_ || scale_factor != scale_factor_) {
     size_pixels_ = size_pixels;
     scale_factor_ = scale_factor;
@@ -78,15 +80,21 @@
     compositor()->SetScaleAndSize(scale_factor_, size_pixels_,
                                   local_surface_id_allocation);
   }
+  if (color_space != color_space_) {
+    color_space_ = color_space;
+    compositor()->SetDisplayColorSpace(color_space_);
+  }
 }
 
 void RecyclableCompositorMac::InvalidateSurface() {
   size_pixels_ = gfx::Size();
   scale_factor_ = 1.f;
   local_surface_id_allocator_.Invalidate();
+  color_space_ = gfx::ColorSpace();
   compositor()->SetScaleAndSize(
       scale_factor_, size_pixels_,
       local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation());
+  compositor()->SetDisplayColorSpace(color_space_);
 }
 
 void RecyclableCompositorMac::OnCompositingDidCommit(
diff --git a/ui/compositor/recyclable_compositor_mac.h b/ui/compositor/recyclable_compositor_mac.h
index d9991af..3aa8763 100644
--- a/ui/compositor/recyclable_compositor_mac.h
+++ b/ui/compositor/recyclable_compositor_mac.h
@@ -41,22 +41,25 @@
   void Unsuspend();
 
   // Update the compositor's surface information, if needed.
-  void UpdateSurface(const gfx::Size& size_pixels, float scale_factor);
+  void UpdateSurface(const gfx::Size& size_pixels,
+                     float scale_factor,
+                     const gfx::ColorSpace& color_space);
   // Invalidate the compositor's surface information.
   void InvalidateSurface();
 
-  // The viz::ParentLocalSurfaceIdAllocator for the ui::Compositor dispenses
-  // viz::LocalSurfaceIds that are renderered into by the ui::Compositor.
-  viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
-  gfx::Size size_pixels_;
-  float scale_factor_ = 1.f;
-
  private:
   friend class RecyclableCompositorMacFactory;
 
   // ui::CompositorObserver implementation:
   void OnCompositingDidCommit(ui::Compositor* compositor) override;
 
+  // The viz::ParentLocalSurfaceIdAllocator for the ui::Compositor dispenses
+  // viz::LocalSurfaceIds that are renderered into by the ui::Compositor.
+  viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
+  gfx::Size size_pixels_;
+  float scale_factor_ = 1.f;
+  gfx::ColorSpace color_space_;
+
   std::unique_ptr<ui::AcceleratedWidgetMac> accelerated_widget_mac_;
   ui::Compositor compositor_;
   std::unique_ptr<ui::CompositorLock> compositor_suspended_lock_;
diff --git a/ui/events/blink/input_handler_proxy.cc b/ui/events/blink/input_handler_proxy.cc
index 0cb60fe7..44408325 100644
--- a/ui/events/blink/input_handler_proxy.cc
+++ b/ui/events/blink/input_handler_proxy.cc
@@ -912,28 +912,19 @@
   if (ShouldAnimate(gesture_event.SourceDevice(),
                     gesture_event.data.scroll_update.delta_units !=
                         ui::input_types::ScrollGranularity::kScrollByPixel)) {
-    DCHECK(!scroll_state.is_in_inertial_phase());
-    base::TimeTicks event_time = gesture_event.TimeStamp();
-    base::TimeDelta delay = base::TimeTicks::Now() - event_time;
-    switch (input_handler_
-                ->ScrollAnimated(gfx::ToFlooredPoint(scroll_point),
-                                 scroll_delta, delay)
-                .thread) {
-      case cc::InputHandler::SCROLL_ON_IMPL_THREAD:
-        return DID_HANDLE;
-      case cc::InputHandler::SCROLL_IGNORED:
-        TRACE_EVENT_INSTANT0("input", "Scroll Ignored",
-                             TRACE_EVENT_SCOPE_THREAD);
-        return DROP_EVENT;
-      case cc::InputHandler::SCROLL_ON_MAIN_THREAD:
-      case cc::InputHandler::SCROLL_UNKNOWN:
-        if (input_handler_->ScrollingShouldSwitchtoMainThread()) {
-          TRACE_EVENT_INSTANT0("input", "Move Scroll To Main Thread",
-                               TRACE_EVENT_SCOPE_THREAD);
-          gesture_scroll_on_impl_thread_ = false;
-          client_->GenerateScrollBeginAndSendToMainThread(gesture_event);
-        }
-        return DID_NOT_HANDLE;
+    if (input_handler_->ScrollingShouldSwitchtoMainThread()) {
+      TRACE_EVENT_INSTANT0("input", "Move Scroll To Main Thread",
+                           TRACE_EVENT_SCOPE_THREAD);
+      gesture_scroll_on_impl_thread_ = false;
+      client_->GenerateScrollBeginAndSendToMainThread(gesture_event);
+      return DID_NOT_HANDLE;
+    } else {
+      DCHECK(!scroll_state.is_in_inertial_phase());
+      base::TimeTicks event_time = gesture_event.TimeStamp();
+      base::TimeDelta delay = base::TimeTicks::Now() - event_time;
+      input_handler_->ScrollAnimated(gfx::ToFlooredPoint(scroll_point),
+                                     scroll_delta, delay);
+      return DID_HANDLE;
     }
   }
 
diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc
index 5172f43..cf89aaa4 100644
--- a/ui/events/blink/input_handler_proxy_unittest.cc
+++ b/ui/events/blink/input_handler_proxy_unittest.cc
@@ -117,9 +117,9 @@
                             cc::InputHandler::ScrollInputType type));
   MOCK_METHOD1(ScrollAnimatedBegin, ScrollStatus(cc::ScrollState*));
   MOCK_METHOD3(ScrollAnimated,
-               ScrollStatus(const gfx::Point& viewport_point,
-                            const gfx::Vector2dF& scroll_delta,
-                            base::TimeDelta));
+               void(const gfx::Point& viewport_point,
+                    const gfx::Vector2dF& scroll_delta,
+                    base::TimeDelta));
   MOCK_METHOD1(ScrollBy, cc::InputHandlerScrollResult(cc::ScrollState*));
   MOCK_METHOD1(ScrollEnd, void(bool));
   MOCK_METHOD0(ScrollingShouldSwitchtoMainThread, bool());
@@ -749,8 +749,9 @@
 
   // Test setup for a kGestureScrollUpdate.
   gesture_.SetType(WebInputEvent::kGestureScrollUpdate);
-  EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _))
-      .WillOnce(testing::Return(kImplThreadScrollState));
+  EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _));
+  EXPECT_CALL(mock_input_handler_, ScrollingShouldSwitchtoMainThread())
+      .WillOnce(testing::Return(false));
   EXPECT_EQ(expected_disposition_,
             input_handler_->RouteToTypeSpecificHandler(gesture_));
   EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing());
@@ -837,6 +838,8 @@
       ui::input_types::ScrollGranularity::kScrollByPixel;
   EXPECT_CALL(mock_input_handler_, ScrollAnimatedBegin(_))
       .WillOnce(testing::Return(kImplThreadScrollState));
+  EXPECT_CALL(mock_input_handler_, ScrollingShouldSwitchtoMainThread())
+      .WillOnce(testing::Return(false));
   EXPECT_EQ(expected_disposition_,
             input_handler_->RouteToTypeSpecificHandler(gesture_));
 
@@ -844,8 +847,7 @@
   gesture_.data.scroll_update.delta_units =
       ui::input_types::ScrollGranularity::kScrollByPixel;
 
-  EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _))
-      .WillOnce(testing::Return(kImplThreadScrollState));
+  EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _));
   EXPECT_EQ(expected_disposition_,
             input_handler_->RouteToTypeSpecificHandler(gesture_));
 
diff --git a/ui/events/gestures/blink/DEPS b/ui/events/gestures/blink/DEPS
index ce47c72..4aaae6fc 100644
--- a/ui/events/gestures/blink/DEPS
+++ b/ui/events/gestures/blink/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+third_party/blink/public/platform/web_float_size.h",
   "+third_party/blink/public/platform/web_gesture_curve.h",
   "+third_party/blink/public/common/input/web_gesture_device.h",
   "+ui/base/ui_base_features.h",
diff --git a/ui/events/gestures/blink/web_gesture_curve_impl.cc b/ui/events/gestures/blink/web_gesture_curve_impl.cc
index 7d61301b..a02f80b 100644
--- a/ui/events/gestures/blink/web_gesture_curve_impl.cc
+++ b/ui/events/gestures/blink/web_gesture_curve_impl.cc
@@ -11,7 +11,6 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "build/build_config.h"
-#include "third_party/blink/public/platform/web_float_size.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/events/gestures/fixed_velocity_curve.h"
 #include "ui/events/gestures/fling_curve.h"
diff --git a/ui/events/gestures/blink/web_gesture_curve_impl.h b/ui/events/gestures/blink/web_gesture_curve_impl.h
index 0d4294d..5d97c047 100644
--- a/ui/events/gestures/blink/web_gesture_curve_impl.h
+++ b/ui/events/gestures/blink/web_gesture_curve_impl.h
@@ -14,6 +14,7 @@
 #include "third_party/blink/public/common/input/web_gesture_device.h"
 #include "third_party/blink/public/platform/web_gesture_curve.h"
 #include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 
 namespace ui {
diff --git a/ui/events/gestures/blink/web_gesture_curve_impl_unittest.cc b/ui/events/gestures/blink/web_gesture_curve_impl_unittest.cc
index 385870f..057a15c6 100644
--- a/ui/events/gestures/blink/web_gesture_curve_impl_unittest.cc
+++ b/ui/events/gestures/blink/web_gesture_curve_impl_unittest.cc
@@ -7,11 +7,9 @@
 #include <memory>
 
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/web_float_size.h"
 #include "third_party/blink/public/platform/web_gesture_curve.h"
 #include "ui/events/gestures/fling_curve.h"
 
-using blink::WebFloatSize;
 using blink::WebGestureCurve;
 
 namespace ui {
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
index b7f4f06d7..d4209f1 100644
--- a/ui/views/cocoa/native_widget_mac_ns_window_host.mm
+++ b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -529,7 +529,7 @@
   layer()->SetBounds(gfx::Rect(surface_size_in_dip));
   compositor_->UpdateSurface(
       ConvertSizeToPixel(display_.device_scale_factor(), surface_size_in_dip),
-      display_.device_scale_factor());
+      display_.device_scale_factor(), display_.color_space());
 }
 
 void NativeWidgetMacNSWindowHost::DestroyCompositor() {
@@ -989,7 +989,7 @@
     compositor_->UpdateSurface(
         ConvertSizeToPixel(display_.device_scale_factor(),
                            content_bounds_in_screen_.size()),
-        display_.device_scale_factor());
+        display_.device_scale_factor(), display_.color_space());
   }
   if (display_id_changed) {
     display_link_ = ui::DisplayLinkMac::GetForDisplay(display_.id());
diff --git a/ui/views/layout/animating_layout_manager.cc b/ui/views/layout/animating_layout_manager.cc
index ad16c98..32efce8 100644
--- a/ui/views/layout/animating_layout_manager.cc
+++ b/ui/views/layout/animating_layout_manager.cc
@@ -32,12 +32,48 @@
   return true;
 }
 
+// Returns the ChildLayout data for the child view in the proposed layout, or
+// nullptr if not found.
+const ChildLayout* FindChildViewInLayout(const ProposedLayout& layout,
+                                         const View* view) {
+  if (!view)
+    return nullptr;
+
+  // The number of children should be small enough that this is more efficient
+  // than caching a lookup set.
+  for (auto& child_layout : layout.child_layouts) {
+    if (child_layout.child_view == view)
+      return &child_layout;
+  }
+  return nullptr;
+}
+
+// Describes the type of fade, used by LayoutFadeInfo (see below).
+enum LayoutFadeType {
+  // This view is fading in as part of the current animation.
+  kFadingIn,
+  // This view is fading out as part of the current animation.
+  kFadingOut,
+  // This view was fading as part of a previous animation that was interrupted
+  // and redirected. No child views in the current animation should base their
+  // position off of it.
+  kContinuingFade
+};
+
+// Non-const version of above.
+ChildLayout* FindChildViewInLayout(ProposedLayout& layout, const View* view) {
+  // This const_cast is safe because we know we were passed in a non-const
+  // layout (also we don't want to duplicate the logic).
+  return const_cast<ChildLayout*>(
+      FindChildViewInLayout(const_cast<const ProposedLayout&>(layout), view));
+}
+
 }  // namespace
 
 // Holds data about a view that is fading in or out as part of an animation.
 struct AnimatingLayoutManager::LayoutFadeInfo {
-  // Whether the view is fading in or out.
-  bool fading_in = false;
+  // How the child view is fading.
+  LayoutFadeType fade_type;
   // The child view which is fading.
   View* child_view = nullptr;
   // The view previous (leading side) to the fading view which is in both the
@@ -432,6 +468,7 @@
 void AnimatingLayoutManager::OnAnimationEnded() {
   DCHECK(is_animating_);
   is_animating_ = false;
+  fade_infos_.clear();
   PostDelayedActions();
   NotifyIsAnimatingChanged();
 }
@@ -546,81 +583,80 @@
   current_layout_ =
       ProposedLayoutBetween(percent, starting_layout_, target_layout_);
 
-  if (fade_infos_.empty())
-    return;
-
-  std::map<const View*, size_t> view_indices;
-  for (size_t i = 0; i < current_layout_.child_layouts.size(); ++i)
-    view_indices.emplace(current_layout_.child_layouts[i].child_view, i);
-
   for (const LayoutFadeInfo& fade_info : fade_infos_) {
     // This shouldn't happen but we should ensure that with a check.
     DCHECK_NE(-1, host_view()->GetIndexOf(fade_info.child_view));
 
+    // Views that were previously fading are animated as normal, so nothing to
+    // do here.
+    if (fade_info.fade_type == LayoutFadeType::kContinuingFade)
+      continue;
+
     ChildLayout child_layout;
 
     if (percent == 1.0) {
       // At the end of the animation snap to the final state of the child view.
       child_layout.child_view = fade_info.child_view;
-      if (fade_info.fading_in) {
-        child_layout.visible = true;
-        child_layout.bounds =
-            Denormalize(orientation(), fade_info.reference_bounds);
-      } else {
-        child_layout.visible = false;
+      switch (fade_info.fade_type) {
+        case LayoutFadeType::kFadingIn:
+          child_layout.visible = true;
+          child_layout.bounds =
+              Denormalize(orientation(), fade_info.reference_bounds);
+          break;
+        case LayoutFadeType::kFadingOut:
+          child_layout.visible = false;
+          break;
+        case LayoutFadeType::kContinuingFade:
+          NOTREACHED();
+          continue;
       }
     } else if (default_fade_mode_ == FadeInOutMode::kHide) {
       child_layout.child_view = fade_info.child_view;
       child_layout.visible = false;
     } else {
       const double scale_percent =
-          fade_info.fading_in ? percent : 1.0 - percent;
-
-      const base::Optional<size_t> prev_index =
-          fade_info.prev_view
-              ? base::make_optional(view_indices[fade_info.prev_view])
-              : base::nullopt;
-      const base::Optional<size_t> next_index =
-          fade_info.next_view
-              ? base::make_optional(view_indices[fade_info.next_view])
-              : base::nullopt;
+          fade_info.fade_type == LayoutFadeType::kFadingIn ? percent
+                                                           : 1.0 - percent;
 
       switch (default_fade_mode_) {
         case FadeInOutMode::kHide:
           NOTREACHED();
           break;
         case FadeInOutMode::kScaleFromMinimum:
-          child_layout = CalculateScaleFade(fade_info, prev_index, next_index,
-                                            scale_percent,
+          child_layout = CalculateScaleFade(fade_info, scale_percent,
                                             /* scale_from_zero */ false);
           break;
         case FadeInOutMode::kScaleFromZero:
-          child_layout = CalculateScaleFade(fade_info, prev_index, next_index,
-                                            scale_percent,
+          child_layout = CalculateScaleFade(fade_info, scale_percent,
                                             /* scale_from_zero */ true);
           break;
         case FadeInOutMode::kSlideFromLeadingEdge:
-          child_layout = CalculateSlideFade(fade_info, prev_index, next_index,
-                                            scale_percent,
-                                            /* scale_from_zero */ true);
+          child_layout = CalculateSlideFade(fade_info, scale_percent,
+                                            /* slide_from_leading */ true);
           break;
         case FadeInOutMode::kSlideFromTrailingEdge:
-          child_layout = CalculateSlideFade(fade_info, prev_index, next_index,
-                                            scale_percent,
-                                            /* scale_from_zero */ false);
+          child_layout = CalculateSlideFade(fade_info, scale_percent,
+                                            /* slide_from_leading */ false);
           break;
       }
     }
 
-    auto it = view_indices.find(fade_info.child_view);
-    if (it == view_indices.end())
-      current_layout_.child_layouts.push_back(child_layout);
+    ChildLayout* const to_overwrite =
+        FindChildViewInLayout(current_layout_, fade_info.child_view);
+    if (to_overwrite)
+      *to_overwrite = child_layout;
     else
-      current_layout_.child_layouts[it->second] = child_layout;
+      current_layout_.child_layouts.push_back(child_layout);
   }
 }
 
 void AnimatingLayoutManager::CalculateFadeInfos() {
+  // Save any views that were previously fading so we don't try to key off of
+  // them when calculating leading/trailing edge.
+  std::set<const View*> previously_fading;
+  for (const auto& fade_info : fade_infos_)
+    previously_fading.insert(fade_info.child_view);
+
   fade_infos_.clear();
 
   struct ChildInfo {
@@ -665,7 +701,8 @@
 
   for (View* child : host_view()->children()) {
     const auto& index = child_to_info[child];
-    if (index.start_visible && index.target_visible) {
+    if (index.start_visible && index.target_visible &&
+        !base::Contains(previously_fading, child)) {
       start_leading_edges.emplace(index.start_bounds.origin_main(), child);
       target_leading_edges.emplace(index.target_bounds.origin_main(), child);
     }
@@ -682,7 +719,7 @@
     const auto& current = child_to_info[child];
     if (current.start_visible && !current.target_visible) {
       LayoutFadeInfo fade_info;
-      fade_info.fading_in = false;
+      fade_info.fade_type = LayoutFadeType::kFadingOut;
       fade_info.child_view = child;
       fade_info.reference_bounds = current.start_bounds;
       auto next =
@@ -710,7 +747,7 @@
       fade_infos_.push_back(fade_info);
     } else if (!current.start_visible && current.target_visible) {
       LayoutFadeInfo fade_info;
-      fade_info.fading_in = true;
+      fade_info.fade_type = LayoutFadeType::kFadingIn;
       fade_info.child_view = child;
       fade_info.reference_bounds = current.target_bounds;
       auto next =
@@ -736,6 +773,16 @@
                                       prev_info.target_bounds.max_main());
       }
       fade_infos_.push_back(fade_info);
+    } else if (base::Contains(previously_fading, child)) {
+      // Capture the fact that this view was fading as part of an animation that
+      // was interrupted. (It is therefore technically still fading.) This
+      // status goes away when the animation ends.
+      LayoutFadeInfo fade_info;
+      fade_info.fade_type = LayoutFadeType::kContinuingFade;
+      fade_info.child_view = child;
+      // No reference bounds or offsets since we'll use the normal animation
+      // pathway for this view.
+      fade_infos_.push_back(fade_info);
     }
   }
 }
@@ -749,7 +796,8 @@
   // animation have run, the relevant view may still be visible.
   for (const LayoutFadeInfo& fade_info : fade_infos_) {
     View* const child = fade_info.child_view;
-    if (!fade_info.fading_in && host_view()->GetIndexOf(child) >= 0 &&
+    if (fade_info.fade_type == LayoutFadeType::kFadingOut &&
+        host_view()->GetIndexOf(child) >= 0 &&
         !IsChildViewIgnoredByLayout(child) && !IsChildIncludedInLayout(child)) {
       SetViewVisibility(child, false);
     }
@@ -758,24 +806,31 @@
 
 ChildLayout AnimatingLayoutManager::CalculateScaleFade(
     const LayoutFadeInfo& fade_info,
-    base::Optional<size_t> prev_index,
-    base::Optional<size_t> next_index,
     double scale_percent,
     bool scale_from_zero) const {
   ChildLayout child_layout;
 
   int leading_reference_point = 0;
-  if (prev_index) {
-    const auto& prev_bounds = current_layout_.child_layouts[*prev_index].bounds;
-    leading_reference_point = Normalize(orientation(), prev_bounds).max_main();
+  if (fade_info.prev_view) {
+    // Since prev/next view is always a view in the start and target layouts, it
+    // should also be in the current layout. Therefore this should never return
+    // null.
+    const ChildLayout* const prev_layout =
+        FindChildViewInLayout(current_layout_, fade_info.prev_view);
+    leading_reference_point =
+        Normalize(orientation(), prev_layout->bounds).max_main();
   }
   leading_reference_point += fade_info.offsets.leading();
 
   int trailing_reference_point;
-  if (next_index) {
-    const auto& next_bounds = current_layout_.child_layouts[*next_index].bounds;
+  if (fade_info.next_view) {
+    // Since prev/next view is always a view in the start and target layouts, it
+    // should also be in the current layout. Therefore this should never return
+    // null.
+    const ChildLayout* const next_layout =
+        FindChildViewInLayout(current_layout_, fade_info.next_view);
     trailing_reference_point =
-        Normalize(orientation(), next_bounds).origin_main();
+        Normalize(orientation(), next_layout->bounds).origin_main();
   } else {
     trailing_reference_point =
         Normalize(orientation(), current_layout_.host_size).main();
@@ -794,10 +849,16 @@
                .main())) {
     child_layout.visible = true;
     NormalizedRect new_bounds = fade_info.reference_bounds;
-    if (fade_info.fading_in) {
-      new_bounds.set_origin_main(leading_reference_point);
-    } else {
-      new_bounds.set_origin_main(trailing_reference_point - new_size);
+    switch (fade_info.fade_type) {
+      case LayoutFadeType::kFadingIn:
+        new_bounds.set_origin_main(leading_reference_point);
+        break;
+      case LayoutFadeType::kFadingOut:
+        new_bounds.set_origin_main(trailing_reference_point - new_size);
+        break;
+      case LayoutFadeType::kContinuingFade:
+        NOTREACHED();
+        break;
     }
     new_bounds.set_size_main(new_size);
     child_layout.bounds = Denormalize(orientation(), new_bounds);
@@ -808,33 +869,43 @@
 
 ChildLayout AnimatingLayoutManager::CalculateSlideFade(
     const LayoutFadeInfo& fade_info,
-    base::Optional<size_t> prev_index,
-    base::Optional<size_t> next_index,
     double scale_percent,
     bool slide_from_leading) const {
   // Fall back to kScaleFromMinimum if there is no edge to slide out from.
-  if (!prev_index.has_value() && !next_index.has_value()) {
-    return CalculateScaleFade(fade_info, prev_index, next_index, scale_percent,
-                              false);
-  }
+  if (!fade_info.prev_view && !fade_info.next_view)
+    return CalculateScaleFade(fade_info, scale_percent, false);
 
   // Slide from the other direction if against the edge of the host view.
-  if (slide_from_leading && !prev_index.has_value())
+  if (slide_from_leading && !fade_info.prev_view)
     slide_from_leading = false;
-  else if (!slide_from_leading && !next_index.has_value())
+  else if (!slide_from_leading && !fade_info.next_view)
     slide_from_leading = true;
 
   NormalizedRect new_bounds = fade_info.reference_bounds;
 
+  // Determine which layout the sliding view will be completely faded in.
+  const ProposedLayout* fully_faded_layout;
+  switch (fade_info.fade_type) {
+    case LayoutFadeType::kFadingIn:
+      fully_faded_layout = &starting_layout_;
+      break;
+    case LayoutFadeType::kFadingOut:
+      fully_faded_layout = &target_layout_;
+      break;
+    case LayoutFadeType::kContinuingFade:
+      NOTREACHED();
+      break;
+  }
+
   if (slide_from_leading) {
+    // Get the layout info for the leading child.
+    const ChildLayout* const leading_child =
+        FindChildViewInLayout(*fully_faded_layout, fade_info.prev_view);
+
     // This is the right side of the leading control that will eclipse the
     // sliding view at the start/end of the animation.
     const int initial_trailing =
-        Normalize(orientation(),
-                  (fade_info.fading_in ? starting_layout_ : target_layout_)
-                      .child_layouts[*prev_index]
-                      .bounds)
-            .max_main();
+        Normalize(orientation(), leading_child->bounds).max_main();
 
     // Interpolate between initial and final trailing edge.
     const int new_trailing = gfx::Tween::IntValueBetween(
@@ -844,14 +915,14 @@
     new_bounds.Offset(new_trailing - new_bounds.max_main(), 0);
 
   } else {
+    // Get the layout info for the trailing child.
+    const ChildLayout* const trailing_child =
+        FindChildViewInLayout(*fully_faded_layout, fade_info.next_view);
+
     // This is the left side of the trailing control that will eclipse the
     // sliding view at the start/end of the animation.
     const int initial_leading =
-        Normalize(orientation(),
-                  (fade_info.fading_in ? starting_layout_ : target_layout_)
-                      .child_layouts[*next_index]
-                      .bounds)
-            .origin_main();
+        Normalize(orientation(), trailing_child->bounds).origin_main();
 
     // Interpolate between initial and final leading edge.
     const int new_leading = gfx::Tween::IntValueBetween(
diff --git a/ui/views/layout/animating_layout_manager.h b/ui/views/layout/animating_layout_manager.h
index 5a176544..d9da14c 100644
--- a/ui/views/layout/animating_layout_manager.h
+++ b/ui/views/layout/animating_layout_manager.h
@@ -235,16 +235,12 @@
   // Calculates a kScaleFrom[Minimum|Zero] fade and returns the resulting child
   // layout info.
   ChildLayout CalculateScaleFade(const LayoutFadeInfo& fade_info,
-                                 base::Optional<size_t> prev_index,
-                                 base::Optional<size_t> next_index,
                                  double scale_percent,
                                  bool scale_from_zero) const;
 
   // Calculates a kSlideFrom[Leading|Trailing]Edge fade and returns the
   // resulting child layout info.
   ChildLayout CalculateSlideFade(const LayoutFadeInfo& fade_info,
-                                 base::Optional<size_t> prev_index,
-                                 base::Optional<size_t> next_index,
                                  double scale_percent,
                                  bool slide_from_leading) const;
 
diff --git a/ui/views/layout/animating_layout_manager_unittest.cc b/ui/views/layout/animating_layout_manager_unittest.cc
index 0680b199..1654c6c 100644
--- a/ui/views/layout/animating_layout_manager_unittest.cc
+++ b/ui/views/layout/animating_layout_manager_unittest.cc
@@ -1498,7 +1498,7 @@
   EXPECT_FALSE(layout()->is_animating());
 }
 
-// Regression test for crbug.com/1037947
+// Regression test for crbug.com/1037947 (1/2)
 TEST_F(AnimatingLayoutManagerTest, FlexLayout_DoubleSlide) {
   layout()->SetShouldAnimateBounds(true);
   layout()->SetOrientation(LayoutOrientation::kHorizontal);
@@ -1564,6 +1564,75 @@
   EnsureLayout(expected_start, "after second slide");
 }
 
+// Regression test for crbug.com/1037947 (2/2) - Tests a case during sliding
+// where if an animation is reversed after a fading-in and fading-out views have
+// exchanged relative positions in the layout, the new fading-out view will
+// slide behind the wrong view.
+//
+// Incorrect behavior (C slides behind B):
+// [A]    [B]
+// [A]C] [B]
+// [A][C]B]
+// [A][B[C]   <--- animation is reversed here
+// [A] [B]C]
+// [A]    [B]
+//
+// Correct behavior (C slides behind A):
+// [A]    [B]
+// [A]C] [B]
+// [A][C]B]
+// [A][B[C]   <--- animation is reversed here
+// [A][C[B]
+// [A]C] [B]
+// [A]    [B]
+//
+TEST_F(AnimatingLayoutManagerTest, FlexLayout_RedirectAfterExchangePlaces) {
+  layout()->SetShouldAnimateBounds(true);
+  layout()->SetOrientation(LayoutOrientation::kHorizontal);
+  layout()->SetDefaultFadeMode(
+      AnimatingLayoutManager::FadeInOutMode::kSlideFromLeadingEdge);
+  child(2)->SetVisible(false);
+  auto* const flex_layout =
+      layout()->SetTargetLayoutManager(std::make_unique<FlexLayout>());
+  flex_layout->SetOrientation(LayoutOrientation::kHorizontal);
+  flex_layout->SetCrossAxisAlignment(LayoutAlignment::kStart);
+  flex_layout->SetDefault(kMarginsKey, gfx::Insets(50));
+
+  layout()->ResetLayout();
+  SizeAndLayout();
+
+  // Initial layout change: show 2, hide 1.
+  layout()->FadeOut(child(1));
+  layout()->FadeIn(child(2));
+
+  // Advance the layout most of the way.
+  animation_api()->IncrementTime(base::TimeDelta::FromMilliseconds(750));
+  view()->Layout();
+
+  // Verify that the two views are visible and that they have passed each other.
+  EXPECT_TRUE(child(1)->GetVisible());
+  EXPECT_TRUE(child(2)->GetVisible());
+  EXPECT_GT(child(2)->bounds().x(), child(1)->bounds().right());
+
+  // Save the bounds of both views to verify that child(1) moves right while
+  // child(2) moves left.
+  const gfx::Rect old_child1_bounds = child(1)->bounds();
+  const gfx::Rect old_child2_bounds = child(2)->bounds();
+
+  // Reverse the layout direction.
+  layout()->FadeIn(child(1));
+  layout()->FadeOut(child(2));
+
+  // Advance the layout most of the way.
+  animation_api()->IncrementTime(base::TimeDelta::FromMilliseconds(150));
+  view()->Layout();
+
+  EXPECT_TRUE(child(1)->GetVisible());
+  EXPECT_TRUE(child(2)->GetVisible());
+  EXPECT_GT(child(1)->x(), old_child1_bounds.x());
+  EXPECT_LT(child(2)->x(), old_child2_bounds.x());
+}
+
 TEST_F(AnimatingLayoutManagerTest, FlexLayout_FadeInOnAdded) {
   constexpr gfx::Insets kChildMargins(5);
   layout()->SetShouldAnimateBounds(false);
diff --git a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
index ad6db6e..7f23fc8 100644
--- a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
+++ b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
@@ -79,8 +79,7 @@
   ~SafeBrowsingBrowserTest() override = default;
 
   // WebLayerBrowserTest:
-  void PreRunTestOnMainThread() override {
-    WebLayerBrowserTest::PreRunTestOnMainThread();
+  void SetUpOnMainThread() override {
     NavigateAndWaitForCompletion(GURL("about:blank"), shell());
     safe_browsing::SafeBrowsingApiHandler::SetInstance(fake_handler_.get());
     ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/weblayer/browser/ssl_browsertest.cc b/weblayer/browser/ssl_browsertest.cc
index 6b006c5..d3be75bc 100644
--- a/weblayer/browser/ssl_browsertest.cc
+++ b/weblayer/browser/ssl_browsertest.cc
@@ -24,9 +24,7 @@
   ~SSLBrowserTest() override = default;
 
   // WebLayerBrowserTest:
-  void PreRunTestOnMainThread() override {
-    WebLayerBrowserTest::PreRunTestOnMainThread();
-
+  void SetUpOnMainThread() override {
     https_server_ = std::make_unique<net::EmbeddedTestServer>(
         net::EmbeddedTestServer::TYPE_HTTPS);
     https_server_->AddDefaultHandlers(
diff --git a/weblayer/shell/android/browsertests_apk/src/org/chromium/weblayer_browsertests_apk/WebLayerBrowserTestsActivity.java b/weblayer/shell/android/browsertests_apk/src/org/chromium/weblayer_browsertests_apk/WebLayerBrowserTestsActivity.java
index c0d3e5e..12747a5 100644
--- a/weblayer/shell/android/browsertests_apk/src/org/chromium/weblayer_browsertests_apk/WebLayerBrowserTestsActivity.java
+++ b/weblayer/shell/android/browsertests_apk/src/org/chromium/weblayer_browsertests_apk/WebLayerBrowserTestsActivity.java
@@ -77,7 +77,7 @@
                 new RelativeLayout.LayoutParams(
                         LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
 
-        Fragment fragment = WebLayer.createBrowserFragment(null);
+        Fragment fragment = WebLayer.createBrowserFragment("BrowserTestProfile");
 
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
         transaction.add(viewId, fragment);